diff --git a/Android.mk b/Android.mk index d667c157c87b..bb2745823680 100644 --- a/Android.mk +++ b/Android.mk @@ -204,6 +204,7 @@ LOCAL_SRC_FILES += \ core/java/android/net/IIpConnectivityMetrics.aidl \ core/java/android/net/IEthernetManager.aidl \ core/java/android/net/IEthernetServiceListener.aidl \ + core/java/android/net/INetdEventCallback.aidl \ core/java/android/net/INetworkManagementEventObserver.aidl \ core/java/android/net/INetworkPolicyListener.aidl \ core/java/android/net/INetworkPolicyManager.aidl \ @@ -577,6 +578,9 @@ aidl_files := \ frameworks/base/graphics/java/android/graphics/drawable/Icon.aidl \ frameworks/base/core/java/android/accounts/AuthenticatorDescription.aidl \ frameworks/base/core/java/android/accounts/Account.aidl \ + frameworks/base/core/java/android/app/admin/ConnectEvent.aidl \ + frameworks/base/core/java/android/app/admin/DnsEvent.aidl \ + frameworks/base/core/java/android/app/admin/NetworkEvent.aidl \ frameworks/base/core/java/android/app/admin/SystemUpdatePolicy.aidl \ frameworks/base/core/java/android/print/PrintDocumentInfo.aidl \ frameworks/base/core/java/android/print/PageRange.aidl \ diff --git a/api/test-current.txt b/api/test-current.txt index d74526b72150..fcbd1b519268 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -9790,6 +9790,7 @@ package android.content.pm { method public abstract android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo); method public abstract boolean hasSystemFeature(java.lang.String); method public abstract boolean hasSystemFeature(java.lang.String, int); + method public abstract boolean isPermissionReviewModeEnabled(); method public abstract boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String); method public abstract boolean isSafeMode(); method public abstract java.util.List queryBroadcastReceivers(android.content.Intent, int); @@ -38217,6 +38218,7 @@ package android.test.mock { method public android.content.res.XmlResourceParser getXml(java.lang.String, int, android.content.pm.ApplicationInfo); method public boolean hasSystemFeature(java.lang.String); method public boolean hasSystemFeature(java.lang.String, int); + method public boolean isPermissionReviewModeEnabled(); method public boolean isPermissionRevokedByPolicy(java.lang.String, java.lang.String); method public boolean isSafeMode(); method public java.util.List queryBroadcastReceivers(android.content.Intent, int); diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index d6c00589e7c2..618a7ed34708 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -48,7 +48,9 @@ import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; +import android.content.res.AssetManager; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Rect; import android.os.Binder; import android.os.Build; @@ -64,6 +66,7 @@ import android.text.TextUtils; import android.util.AndroidException; import android.util.ArrayMap; +import android.util.DisplayMetrics; import android.view.IWindowManager; import com.android.internal.os.BaseCommand; @@ -145,7 +148,7 @@ public void onShowUsage(PrintStream out) { " am clear-debug-app\n" + " am set-watch-heap \n" + " am clear-watch-heap\n" + - " am bug-report [--progress]\n" + + " am bug-report [--progress | --telephony]\n" + " am monitor [--gdb ]\n" + " am hang [--allow-restart]\n" + " am restart\n" + @@ -271,6 +274,7 @@ public void onShowUsage(PrintStream out) { "am bug-report: request bug report generation; will launch a notification\n" + " when done to select where it should be delivered. Options are: \n" + " --progress: will launch a notification right away to show its progress.\n" + + " --telephony: will dump only telephony sections.\n" + "\n" + "am monitor: start monitoring for crashes or ANRs.\n" + " --gdb: start gdbserv on the given port at crash/ANR\n" + @@ -361,6 +365,8 @@ public void onShowUsage(PrintStream out) { "am send-trim-memory: send a memory trim event to a .\n" + "\n" + "am get-current-user: returns id of the current foreground user.\n" + + "\n" + + "am supports-multiwindow: returns true if the device supports multiwindow.\n" + "\n" ); Intent.printIntentArgsHelp(pw, ""); @@ -458,6 +464,8 @@ public void onRun() throws Exception { runSendTrimMemory(); } else if (op.equals("get-current-user")) { runGetCurrentUser(); + } else if (op.equals("supports-multiwindow")) { + runSupportsMultiwindow(); } else { showError("Error: unknown command '" + op + "'"); } @@ -1144,6 +1152,8 @@ private void runBugReport() throws Exception { while ((opt=nextOption()) != null) { if (opt.equals("--progress")) { bugreportType = ActivityManager.BUGREPORT_OPTION_INTERACTIVE; + } else if (opt.equals("--telephony")) { + bugreportType = ActivityManager.BUGREPORT_OPTION_TELEPHONY; } else { System.err.println("Error: Unknown option: " + opt); return; @@ -2534,6 +2544,21 @@ private void runGetCurrentUser() throws Exception { System.out.println(currentUser.id); } + private void runSupportsMultiwindow() throws Exception { + // system resources does not contain all the device configuration, construct it manually. + Configuration config = mAm.getConfiguration(); + if (config == null) { + throw new AndroidException("Activity manager has no configuration"); + } + + final DisplayMetrics metrics = new DisplayMetrics(); + metrics.setToDefaults(); + + Resources res = new Resources(AssetManager.getSystem(), metrics, config); + + System.out.println(res.getBoolean(com.android.internal.R.bool.config_supportsMultiWindow)); + } + /** * Open the given file for sending into the system process. This verifies * with SELinux that the system will have access to the file. diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 892b75adea29..791a40e374a8 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -70,15 +70,26 @@ static const char THEME_BOOTANIMATION_FILE[] = "/data/system/theme/bootanimation static const char SYSTEM_DATA_DIR_PATH[] = "/data/system"; static const char SYSTEM_TIME_DIR_NAME[] = "time"; static const char SYSTEM_TIME_DIR_PATH[] = "/data/system/time"; +static const char CLOCK_FONT_ASSET[] = "images/clock_font.png"; +static const char CLOCK_FONT_ZIP_NAME[] = "clock_font.png"; 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 = ' '; +static constexpr char FONT_END_CHAR = '~' + 1; +static constexpr size_t FONT_NUM_CHARS = FONT_END_CHAR - FONT_BEGIN_CHAR + 1; +static constexpr size_t FONT_NUM_COLS = 16; +static constexpr size_t FONT_NUM_ROWS = FONT_NUM_CHARS / FONT_NUM_COLS; +static const int TEXT_CENTER_VALUE = INT_MAX; +static const int TEXT_MISSING_VALUE = INT_MIN; static const char EXIT_PROP_NAME[] = "service.bootanim.exit"; static const char PLAY_SOUND_PROP_NAME[] = "persist.sys.bootanim.play_sound"; static const int ANIM_ENTRY_NAME_MAX = 256; +static constexpr size_t TEXT_POS_LEN_MAX = 16; static const char BOOT_COMPLETED_PROP_NAME[] = "sys.boot_completed"; static const char BOOTREASON_PROP_NAME[] = "ro.boot.bootreason"; // bootreasons list in "system/core/bootstat/bootstat.cpp". @@ -147,7 +158,7 @@ static unsigned long getFreeMemory(void) } 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. @@ -233,6 +244,7 @@ status_t BootAnimation::initTexture(Texture* texture, AssetManager& assets, glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + return NO_ERROR; } @@ -311,6 +323,66 @@ status_t BootAnimation::initTexture(SkBitmap *bitmap) bitmap->unlockPixels(); delete bitmap; + + return NO_ERROR; +} + +status_t BootAnimation::initTexture(FileMap* map, int* width, int* height) +{ + SkBitmap bitmap; + SkMemoryStream stream(map->getDataPtr(), map->getDataLength()); + SkImageDecoder* codec = SkImageDecoder::Factory(&stream); + if (codec != NULL) { + codec->setDitherImage(false); + codec->decode(&stream, &bitmap, + kN32_SkColorType, + SkImageDecoder::kDecodePixels_Mode); + delete codec; + } + // FileMap memory is never released until application exit. + // Release it now as the texture is already loaded and the memory used for + // the packed resource can be released. + delete map; + // ensure we can call getPixels(). No need to call unlock, since the + // bitmap will go out of scope when we return from this method. + bitmap.lockPixels(); + const int w = bitmap.width(); + const int h = bitmap.height(); + const void* p = bitmap.getPixels(); + GLint crop[4] = { 0, h, w, -h }; + int tw = 1 << (31 - __builtin_clz(w)); + int th = 1 << (31 - __builtin_clz(h)); + if (tw < w) tw <<= 1; + if (th < h) th <<= 1; + switch (bitmap.colorType()) { + case kN32_SkColorType: + if (!mUseNpotTextures && (tw != w || th != h)) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tw, th, 0, GL_RGBA, + GL_UNSIGNED_BYTE, 0); + glTexSubImage2D(GL_TEXTURE_2D, 0, + 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, p); + } else { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, + GL_UNSIGNED_BYTE, p); + } + break; + case kRGB_565_SkColorType: + if (!mUseNpotTextures && (tw != w || th != h)) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_RGB, + GL_UNSIGNED_SHORT_5_6_5, 0); + glTexSubImage2D(GL_TEXTURE_2D, 0, + 0, 0, w, h, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, p); + } else { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, + GL_UNSIGNED_SHORT_5_6_5, p); + } + break; + default: + break; + } + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); + *width = w; + *height = h; return NO_ERROR; } @@ -503,7 +575,6 @@ bool BootAnimation::android() return false; } - void BootAnimation::checkExit() { // Allow surface flinger to gracefully request shutdown char value[PROPERTY_VALUE_MAX]; @@ -514,6 +585,47 @@ void BootAnimation::checkExit() { } } +bool BootAnimation::validClock(const Animation::Part& part) { + return part.clockPosX != TEXT_MISSING_VALUE && part.clockPosY != TEXT_MISSING_VALUE; +} + +bool parseTextCoord(const char* str, int* dest) { + if (strcmp("c", str) == 0) { + *dest = TEXT_CENTER_VALUE; + return true; + } + + char* end; + int val = (int) strtol(str, &end, 0); + if (end == str || *end != '\0' || val == INT_MAX || val == INT_MIN) { + return false; + } + *dest = val; + return true; +} + +// Parse two position coordinates. If only string is non-empty, treat it as the y value. +void parsePosition(const char* str1, const char* str2, int* x, int* y) { + bool success = false; + if (strlen(str1) == 0) { // No values were specified + // success = false + } else if (strlen(str2) == 0) { // we have only one value + if (parseTextCoord(str1, y)) { + *x = TEXT_CENTER_VALUE; + success = true; + } + } else { + if (parseTextCoord(str1, x) && parseTextCoord(str2, y)) { + success = true; + } + } + + if (!success) { + *x = TEXT_MISSING_VALUE; + *y = TEXT_MISSING_VALUE; + } +} + // Parse a color represented as an HTML-style 'RRGGBB' string: each pair of // characters in str is a hex number in [0, 255], which are converted to // floating point values in the range [0.0, 1.0] and placed in the @@ -560,69 +672,108 @@ static bool readFile(ZipFileRO* zip, const char* name, String8& outString) return true; } -// The time glyphs are stored in a single image of height 64 pixels. Each digit is 40 pixels wide, -// and the colon character is half that at 20 pixels. The glyph order is '0123456789:'. -// We render 24 hour time. -void BootAnimation::drawTime(const Texture& clockTex, const int yPos) { - static constexpr char TIME_FORMAT[] = "%H:%M"; - static constexpr int TIME_LENGTH = sizeof(TIME_FORMAT); +// The font image should be a 96x2 array of character images. The +// columns are the printable ASCII characters 0x20 - 0x7f. The +// top row is regular text; the bottom row is bold. +status_t BootAnimation::initFont(Font* font, const char* fallback) { + status_t status = NO_ERROR; - static constexpr int DIGIT_HEIGHT = 64; - static constexpr int DIGIT_WIDTH = 40; - static constexpr int COLON_WIDTH = DIGIT_WIDTH / 2; - static constexpr int TIME_WIDTH = (DIGIT_WIDTH * 4) + COLON_WIDTH; + if (font->map != nullptr) { + glGenTextures(1, &font->texture.name); + glBindTexture(GL_TEXTURE_2D, font->texture.name); - if (clockTex.h < DIGIT_HEIGHT || clockTex.w < (10 * DIGIT_WIDTH + COLON_WIDTH)) { - ALOGE("Clock texture is too small; abandoning boot animation clock"); - mClockEnabled = false; - return; + status = initTexture(font->map, &font->texture.w, &font->texture.h); + + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + } else if (fallback != nullptr) { + status = initTexture(&font->texture, mAssets, fallback); + } else { + return NO_INIT; } - time_t rawtime; - time(&rawtime); - struct tm* timeInfo = localtime(&rawtime); + if (status == NO_ERROR) { + font->char_width = font->texture.w / FONT_NUM_COLS; + font->char_height = font->texture.h / FONT_NUM_ROWS / 2; // There are bold and regular rows + } - char timeBuff[TIME_LENGTH]; - size_t length = strftime(timeBuff, TIME_LENGTH, TIME_FORMAT, timeInfo); + return status; +} - if (length != TIME_LENGTH - 1) { - ALOGE("Couldn't format time; abandoning boot animation clock"); - mClockEnabled = false; - return; +void BootAnimation::drawText(const char* str, const Font& font, bool bold, int* x, int* y) { + glEnable(GL_BLEND); // Allow us to draw on top of the animation + glBindTexture(GL_TEXTURE_2D, font.texture.name); + + const int len = strlen(str); + const int strWidth = font.char_width * len; + + if (*x == TEXT_CENTER_VALUE) { + *x = (mWidth - strWidth) / 2; + } else if (*x < 0) { + *x = mWidth + *x - strWidth; + } + if (*y == TEXT_CENTER_VALUE) { + *y = (mHeight - font.char_height) / 2; + } else if (*y < 0) { + *y = mHeight + *y - font.char_height; } - glEnable(GL_BLEND); // Allow us to draw on top of the animation - glBindTexture(GL_TEXTURE_2D, clockTex.name); + int cropRect[4] = { 0, 0, font.char_width, -font.char_height }; - int xPos = (mWidth - TIME_WIDTH) / 2; - int cropRect[4] = { 0, DIGIT_HEIGHT, DIGIT_WIDTH, -DIGIT_HEIGHT }; + for (int i = 0; i < len; i++) { + char c = str[i]; - for (int i = 0; i < TIME_LENGTH - 1; i++) { - char c = timeBuff[i]; - int width = DIGIT_WIDTH; - int pos = c - '0'; // Position in the character list - if (pos < 0 || pos > 10) { - continue; - } - if (c == ':') { - width = COLON_WIDTH; + if (c < FONT_BEGIN_CHAR || c > FONT_END_CHAR) { + c = '?'; } // Crop the texture to only the pixels in the current glyph - int left = pos * DIGIT_WIDTH; - cropRect[0] = left; - cropRect[2] = width; + const int charPos = (c - FONT_BEGIN_CHAR); // Position in the list of valid characters + const int row = charPos / FONT_NUM_COLS; + const int col = charPos % FONT_NUM_COLS; + cropRect[0] = col * font.char_width; // Left of column + cropRect[1] = row * font.char_height * 2; // Top of row + // Move down to bottom of regular (one char_heigh) or bold (two char_heigh) line + cropRect[1] += bold ? 2 * font.char_height : font.char_height; glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, cropRect); - glDrawTexiOES(xPos, yPos, 0, width, DIGIT_HEIGHT); + glDrawTexiOES(*x, *y, 0, font.char_width, font.char_height); - xPos += width; + *x += font.char_width; } glDisable(GL_BLEND); // Return to the animation's default behaviour glBindTexture(GL_TEXTURE_2D, 0); } +// We render 12 or 24 hour time. +void BootAnimation::drawClock(const Font& font, const int xPos, const int yPos) { + 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; + time(&rawtime); + struct tm* timeInfo = localtime(&rawtime); + + char timeBuff[TIME_LENGTH]; + 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"); + mClockEnabled = false; + return; + } + + char* out = timeBuff[0] == ' ' ? &timeBuff[1] : &timeBuff[0]; + int x = xPos; + int y = yPos; + drawText(out, font, false, &x, &y); +} + bool BootAnimation::parseAnimationDesc(Animation& animation) { String8 desString; @@ -643,9 +794,10 @@ bool BootAnimation::parseAnimationDesc(Animation& animation) int height = 0; int count = 0; int pause = 0; - int clockPosY = -1; char path[ANIM_ENTRY_NAME_MAX]; char color[7] = "000000"; // default to black if unspecified + char clockPos1[TEXT_POS_LEN_MAX + 1] = ""; + char clockPos2[TEXT_POS_LEN_MAX + 1] = ""; char pathType; if (sscanf(l, "%d %d %d", &width, &height, &fps) == 3) { @@ -653,15 +805,15 @@ bool BootAnimation::parseAnimationDesc(Animation& animation) animation.width = width; animation.height = height; animation.fps = fps; - } else if (sscanf(l, " %c %d %d %s #%6s %d", - &pathType, &count, &pause, path, color, &clockPosY) >= 4) { - // ALOGD("> type=%c, count=%d, pause=%d, path=%s, color=%s, clockPosY=%d", pathType, count, pause, path, color, clockPosY); + } else if (sscanf(l, " %c %d %d %s #%6s %16s %16s", + &pathType, &count, &pause, path, color, clockPos1, clockPos2) >= 4) { + //ALOGD("> type=%c, count=%d, pause=%d, path=%s, color=%s, clockPos1=%s, clockPos2=%s", + // pathType, count, pause, path, color, clockPos1, clockPos2); Animation::Part part; part.playUntilComplete = pathType == 'c'; part.count = count; part.pause = pause; part.path = path; - part.clockPosY = clockPosY; part.audioData = NULL; part.animation = NULL; if (!parseColor(color, part.backgroundColor)) { @@ -670,6 +822,7 @@ bool BootAnimation::parseAnimationDesc(Animation& animation) part.backgroundColor[1] = 0.0f; part.backgroundColor[2] = 0.0f; } + parsePosition(clockPos1, clockPos2, &part.clockPosX, &part.clockPosY); animation.parts.add(part); } else if (strcmp(l, "$SYSTEM") == 0) { @@ -713,6 +866,14 @@ bool BootAnimation::preloadZip(Animation& animation) const String8 path(entryName.getPathDir()); const String8 leaf(entryName.getPathLeaf()); if (leaf.size() > 0) { + if (entryName == CLOCK_FONT_ZIP_NAME) { + FileMap* map = zip->createEntryFileMap(entry); + if (map) { + animation.clockFont.map = map; + } + continue; + } + for (size_t j = 0; j < pcount; j++) { if (path == animation.parts[j].path) { uint16_t method; @@ -797,7 +958,7 @@ bool BootAnimation::movie() bool anyPartHasClock = false; for (size_t i=0; i < animation->parts.size(); i++) { - if(animation->parts[i].clockPosY >= 0) { + if(validClock(animation->parts[i])) { anyPartHasClock = true; break; } @@ -835,10 +996,11 @@ bool BootAnimation::movie() glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - bool clockTextureInitialized = false; + bool clockFontInitialized = false; if (mClockEnabled) { - clockTextureInitialized = (initTexture(&mClock, mAssets, "images/clock64.png") == NO_ERROR); - mClockEnabled = clockTextureInitialized; + clockFontInitialized = + (initFont(&animation->clockFont, CLOCK_FONT_ASSET) == NO_ERROR); + mClockEnabled = clockFontInitialized; } if (mClockEnabled && !updateIsTimeAccurate()) { @@ -855,8 +1017,8 @@ bool BootAnimation::movie() releaseAnimation(animation); - if (clockTextureInitialized) { - glDeleteTextures(1, &mClock.name); + if (clockFontInitialized) { + glDeleteTextures(1, &animation->clockFont.texture.name); } return false; @@ -972,8 +1134,8 @@ bool BootAnimation::playAnimation(const Animation& animation) // which is equivalent to mHeight - (yc + frame.trimHeight) glDrawTexiOES(xc, mHeight - (yc + frame.trimHeight), 0, frame.trimWidth, frame.trimHeight); - if (mClockEnabled && mTimeIsAccurate && part.clockPosY >= 0) { - drawTime(mClock, part.clockPosY); + if (mClockEnabled && mTimeIsAccurate && validClock(part)) { + drawClock(animation.clockFont, part.clockPosX, part.clockPosY); } eglSwapBuffers(mDisplay, mSurface); @@ -1061,6 +1223,7 @@ BootAnimation::Animation* BootAnimation::loadAnimation(const String8& fn) Animation *animation = new Animation; animation->fileName = fn; animation->zip = zip; + animation->clockFont.map = nullptr; mLoadedFiles.add(animation->fileName); parseAnimationDesc(*animation); @@ -1217,6 +1380,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 eede889e10d6..44a0fcc39106 100644 --- a/cmds/bootanimation/BootAnimation.h +++ b/cmds/bootanimation/BootAnimation.h @@ -82,6 +82,13 @@ class BootAnimation : public Thread, public IBinder::DeathRecipient GLuint name; }; + struct Font { + FileMap* map; + Texture texture; + int char_width; + int char_height; + }; + struct Animation { struct Frame { String8 name; @@ -98,8 +105,12 @@ class BootAnimation : public Thread, public IBinder::DeathRecipient struct Part { int count; // The number of times this part should repeat, 0 for infinite int pause; // The number of frames to pause for at the end of this part - int clockPosY; // The y position of the clock, in pixels, from the bottom of the - // display (the clock is centred horizontally). -1 to disable the clock + int clockPosX; // The x position of the clock, in pixels. Positive values offset from + // the left of the screen, negative values offset from the right. + int clockPosY; // The y position of the clock, in pixels. Positive values offset from + // the bottom of the screen, negative values offset from the top. + // If either of the above are INT_MIN the clock is disabled, if INT_MAX + // the clock is centred on that axis. String8 path; String8 trimData; SortedVector frames; @@ -116,14 +127,19 @@ class BootAnimation : public Thread, public IBinder::DeathRecipient String8 audioConf; String8 fileName; ZipFileRO* zip; + Font clockFont; }; status_t initTexture(Texture* texture, AssetManager& asset, const char* name); status_t initTexture(const Animation::Frame& frame); status_t initTexture(SkBitmap *bitmap); + status_t initTexture(FileMap* map, int* width, int* height); + status_t initFont(Font* font, const char* fallback); bool android(); bool movie(); - void drawTime(const Texture& clockTex, const int yPos); + void drawText(const char* str, const Font& font, bool bold, int* x, int* y); + void drawClock(const Font& font, const int xPos, const int yPos); + bool validClock(const Animation::Part& part); Animation* loadAnimation(const String8&); bool playAnimation(const Animation&); void releaseAnimation(Animation*) const; @@ -138,7 +154,6 @@ class BootAnimation : public Thread, public IBinder::DeathRecipient sp mSession; AssetManager mAssets; Texture mAndroid[2]; - Texture mClock; int mWidth; int mHeight; bool mUseNpotTextures = false; @@ -149,6 +164,7 @@ class BootAnimation : public Thread, public IBinder::DeathRecipient sp mFlingerSurface; bool mClockEnabled; bool mTimeIsAccurate; + bool mTimeFormat12Hour; bool mSystemBoot; String8 mZipFileName; SortedVector mLoadedFiles; diff --git a/cmds/svc/src/com/android/commands/svc/NfcCommand.java b/cmds/svc/src/com/android/commands/svc/NfcCommand.java index 8e9791f8b731..02a92b9c19ff 100644 --- a/cmds/svc/src/com/android/commands/svc/NfcCommand.java +++ b/cmds/svc/src/com/android/commands/svc/NfcCommand.java @@ -58,7 +58,8 @@ public void run(String[] args) { IPackageManager pm = IPackageManager.Stub.asInterface( ServiceManager.getService("package")); try { - if (pm.hasSystemFeature(PackageManager.FEATURE_NFC, 0)) { + if (pm.hasSystemFeature(PackageManager.FEATURE_NFC, 0) || + pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION, 0)) { INfcAdapter nfc = INfcAdapter.Stub .asInterface(ServiceManager.getService(Context.NFC_SERVICE)); try { diff --git a/cmds/svc/src/com/android/commands/svc/UsbCommand.java b/cmds/svc/src/com/android/commands/svc/UsbCommand.java index a6ef25fc4479..4dcb05e4f85d 100644 --- a/cmds/svc/src/com/android/commands/svc/UsbCommand.java +++ b/cmds/svc/src/com/android/commands/svc/UsbCommand.java @@ -50,7 +50,7 @@ public void run(String[] args) { IUsbManager usbMgr = IUsbManager.Stub.asInterface(ServiceManager.getService( Context.USB_SERVICE)); try { - usbMgr.setCurrentFunction((args.length >=3 ? args[2] : null)); + usbMgr.setCurrentFunction((args.length >=3 ? args[2] : null), false); } catch (RemoteException e) { System.err.println("Error communicating with UsbManager: " + e); } diff --git a/cmds/svc/src/com/android/commands/svc/WifiCommand.java b/cmds/svc/src/com/android/commands/svc/WifiCommand.java index 94214ff9694f..633dd9787cb1 100644 --- a/cmds/svc/src/com/android/commands/svc/WifiCommand.java +++ b/cmds/svc/src/com/android/commands/svc/WifiCommand.java @@ -52,7 +52,7 @@ public void run(String[] args) { IWifiManager wifiMgr = IWifiManager.Stub.asInterface(ServiceManager.getService(Context.WIFI_SERVICE)); try { - wifiMgr.setWifiEnabled(flag); + wifiMgr.setWifiEnabled("com.android.shell", flag); } catch (RemoteException e) { System.err.println("Wi-Fi operation failed: " + e); diff --git a/cmds/uiautomator/library/core-src/com/android/uiautomator/core/UiObject.java b/cmds/uiautomator/library/core-src/com/android/uiautomator/core/UiObject.java index 751bbe825bca..ef6d55ffb483 100644 --- a/cmds/uiautomator/library/core-src/com/android/uiautomator/core/UiObject.java +++ b/cmds/uiautomator/library/core-src/com/android/uiautomator/core/UiObject.java @@ -808,7 +808,7 @@ public String getPackageName() throws UiObjectNotFoundException { * * @return Rect * @throws UiObjectNotFoundException - * @see {@link #getBounds()} + * @see #getBounds() * @since API Level 17 */ public Rect getVisibleBounds() throws UiObjectNotFoundException { diff --git a/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java b/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java index ddeb8e786271..19aa11a3b1aa 100644 --- a/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java +++ b/cmds/uiautomator/library/testrunner-src/com/android/uiautomator/core/UiAutomationShellWrapper.java @@ -41,7 +41,7 @@ public void connect() { * actions such as dialing 911 or posting messages to public forums, etc. * * @param isSet True to set as monkey test. False to set as regular functional test (default). - * @see {@link ActivityManager#isUserAMonkey()} + * @see ActivityManager#isUserAMonkey() */ public void setRunAsMonkey(boolean isSet) { IActivityManager am = ActivityManagerNative.getDefault(); 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/accounts/AbstractAccountAuthenticator.java b/core/java/android/accounts/AbstractAccountAuthenticator.java index 4dca8e24d435..a291ef5cbb1e 100644 --- a/core/java/android/accounts/AbstractAccountAuthenticator.java +++ b/core/java/android/accounts/AbstractAccountAuthenticator.java @@ -707,7 +707,7 @@ public Bundle getAccountRemovalAllowed(AccountAuthenticatorResponse response, * @param account the account to clone, will never be null * @return a Bundle result or null if the result is to be returned via the response. * @throws NetworkErrorException - * @see {@link #addAccountFromCredentials(AccountAuthenticatorResponse, Account, Bundle)} + * @see #addAccountFromCredentials(AccountAuthenticatorResponse, Account, Bundle) */ public Bundle getAccountCredentialsForCloning(final AccountAuthenticatorResponse response, final Account account) throws NetworkErrorException { @@ -732,7 +732,7 @@ public void run() { * provided by {@link #getAccountCredentialsForCloning(AccountAuthenticatorResponse, Account)}. * @return a Bundle result or null if the result is to be returned via the response. * @throws NetworkErrorException - * @see {@link #getAccountCredentialsForCloning(AccountAuthenticatorResponse, Account)} + * @see #getAccountCredentialsForCloning(AccountAuthenticatorResponse, Account) */ public Bundle addAccountFromCredentials(final AccountAuthenticatorResponse response, Account account, diff --git a/core/java/android/animation/ObjectAnimator.java b/core/java/android/animation/ObjectAnimator.java index 0c21c4ff55e7..4707bed3ee14 100644 --- a/core/java/android/animation/ObjectAnimator.java +++ b/core/java/android/animation/ObjectAnimator.java @@ -38,8 +38,8 @@ * * {@sample development/samples/ApiDemos/res/anim/object_animator.xml ObjectAnimatorResources} * - *

When using resource files, it is possible to use {@link PropertyValuesHolder} and - * {@link Keyframe} to create more complex animations. Using PropertyValuesHolders + *

Starting from API 23, it is possible to use {@link PropertyValuesHolder} and + * {@link Keyframe} in resource files to create more complex animations. Using PropertyValuesHolders * allows animators to animate several properties in parallel, as shown in this sample:

* * {@sample development/samples/ApiDemos/res/anim/object_animator_pvh.xml diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java index 7e16e3ece549..d472c37cd64d 100644 --- a/core/java/android/animation/ValueAnimator.java +++ b/core/java/android/animation/ValueAnimator.java @@ -49,8 +49,8 @@ * * {@sample development/samples/ApiDemos/res/anim/animator.xml ValueAnimatorResources} * - *

It is also possible to use a combination of {@link PropertyValuesHolder} and - * {@link Keyframe} resource tags to create a multi-step animation. + *

Starting from API 23, it is also possible to use a combination of {@link PropertyValuesHolder} + * and {@link Keyframe} resource tags to create a multi-step animation. * Note that you can specify explicit fractional values (from 0 to 1) for * each keyframe to determine when, in the overall duration, the animation should arrive at that * value. Alternatively, you can leave the fractions off and the keyframes will be equally diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index e4880b0f6a43..3cb3b0b96eae 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2946,8 +2946,11 @@ public boolean hasWindowFocus() { * @hide */ @Override - public void onWindowDismissed(boolean finishTask) { + public void onWindowDismissed(boolean finishTask, boolean suppressWindowTransition) { finish(finishTask ? FINISH_TASK_WITH_ACTIVITY : DONT_FINISH_TASK_WITH_ACTIVITY); + if (suppressWindowTransition) { + overridePendingTransition(0, 0); + } } @@ -4210,7 +4213,7 @@ public void startActivityForResult(@RequiresPermission Intent intent, int reques * @param requestCode If >= 0, this code will be returned in * onActivityResult() when the activity exits. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException @@ -4419,7 +4422,7 @@ public void startIntentSenderForResult(IntentSender intent, int requestCode, * flagsMask * @param extraFlags Always set to 0. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. If options * have also been supplied by the IntentSender, options given here will * override any that conflict with those given by the IntentSender. @@ -4504,7 +4507,7 @@ public void startActivity(Intent intent) { * * @param intent The intent to start. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException @@ -4553,7 +4556,7 @@ public void startActivities(Intent[] intents) { * * @param intents The intents to start. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException @@ -4602,7 +4605,7 @@ public void startIntentSender(IntentSender intent, * flagsMask * @param extraFlags Always set to 0. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. If options * have also been supplied by the IntentSender, options given here will * override any that conflict with those given by the IntentSender. @@ -4662,7 +4665,7 @@ public boolean startActivityIfNeeded(@RequiresPermission @NonNull Intent intent, * onActivityResult() when the activity exits, as described in * {@link #startActivityForResult}. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @return If a new activity was launched then true is returned; otherwise @@ -4739,7 +4742,7 @@ public boolean startNextMatchingActivity(@RequiresPermission @NonNull Intent int * your own activity; the only changes you can make are to the extras * inside of it. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @return Returns a boolean indicating whether there was another Activity @@ -4794,7 +4797,7 @@ public void startActivityFromChild(@NonNull Activity child, @RequiresPermission * @param intent The intent to start. * @param requestCode Reply request code. < 0 if reply is not requested. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException @@ -4847,7 +4850,7 @@ public void startActivityFromFragment(@NonNull Fragment fragment, * @param intent The intent to start. * @param requestCode Reply request code. < 0 if reply is not requested. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @throws android.content.ActivityNotFoundException diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index b0e6dadbcb96..32599a8ec2d8 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -75,7 +75,39 @@ import java.util.List; /** - * Interact with the overall activities running in the system. + *

+ * This class gives information about, and interacts + * with, activities, services, and the containing + * process. + *

+ * + *

+ * A number of the methods in this class are for + * debugging or informational purposes and they should + * not be used to affect any runtime behavior of + * your app. These methods are called out as such in + * the method level documentation. + *

+ * + *

+ * Most application developers should not have the need to + * use this class, most of whose methods are for specialized + * use cases. However, a few methods are more broadly applicable. + * For instance, {@link android.app.ActivityManager#isLowRamDevice() isLowRamDevice()} + * enables your app to detect whether it is running on a low-memory device, + * and behave accordingly. + * {@link android.app.ActivityManager#clearApplicationUserData() clearApplicationUserData()} + * is for apps with reset-data functionality. + *

+ * + *

+ * In some special use cases, where an app interacts with + * its Task stack, the app may use the + * {@link android.app.ActivityManager.AppTask} and + * {@link android.app.ActivityManager.RecentTaskInfo} inner + * classes. However, in general, the methods in this class should + * be used for testing and debugging purposes only. + *

*/ public class ActivityManager { private static String TAG = "ActivityManager"; @@ -94,7 +126,8 @@ public class ActivityManager { BUGREPORT_OPTION_FULL, BUGREPORT_OPTION_INTERACTIVE, BUGREPORT_OPTION_REMOTE, - BUGREPORT_OPTION_WEAR + BUGREPORT_OPTION_WEAR, + BUGREPORT_OPTION_TELEPHONY }) public @interface BugreportMode {} /** @@ -121,6 +154,13 @@ public class ActivityManager { */ public static final int BUGREPORT_OPTION_WEAR = 3; + /** + * Takes a lightweight version of bugreport that only includes a few, urgent sections + * used to report telephony bugs. + * @hide + */ + public static final int BUGREPORT_OPTION_TELEPHONY = 4; + /** * {@code * } name for a 'home' Activity that declares a package that is to be @@ -2152,13 +2192,13 @@ public static class RunningServiceInfo implements Parcelable { public static final int FLAG_FOREGROUND = 1<<1; /** - * Bit for {@link #flags): set if the service is running in a + * Bit for {@link #flags}: set if the service is running in a * core system process. */ public static final int FLAG_SYSTEM_PROCESS = 1<<2; /** - * Bit for {@link #flags): set if the service is running in a + * Bit for {@link #flags}: set if the service is running in a * persistent process. */ public static final int FLAG_PERSISTENT_PROCESS = 1<<3; diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index d4f80a01ea53..28f84771e10c 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -60,6 +60,13 @@ public abstract class ActivityManagerInternal { */ public static final int APP_TRANSITION_TIMEOUT = 3; + /** + * Grant Uri permissions from one app to another. This method only extends + * permission grants if {@code callingUid} has permission to them. + */ + public abstract void grantUriPermissionFromIntent(int callingUid, String targetPkg, + Intent intent, int targetUserId); + /** * Verify that calling app has access to the given provider. */ diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 680293a5d78a..0d583bfb48c9 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -63,6 +63,7 @@ import android.os.Debug; import android.os.DropBoxManager; import android.os.Environment; +import android.os.GraphicsEnvironment; import android.os.Handler; import android.os.IBinder; import android.os.LocaleList; @@ -5062,7 +5063,7 @@ final void handleTrimMemory(int level) { WindowManagerGlobal.getInstance().trimMemory(level); } - private void setupGraphicsSupport(LoadedApk info, File cacheDir) { + private void setupGraphicsSupport(Context context, File cacheDir) { if (Process.isIsolated()) { // Isolated processes aren't going to do UI. return; @@ -5075,6 +5076,7 @@ private void setupGraphicsSupport(LoadedApk info, File cacheDir) { if (packages != null) { ThreadedRenderer.setupDiskCache(cacheDir); RenderScriptCacheDir.setupDiskCache(cacheDir); + GraphicsEnvironment.setupGraphicsEnvironment(context); } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -5362,7 +5364,7 @@ private void handleBindApplication(AppBindData data) { final Context deviceContext = appContext.createDeviceProtectedStorageContext(); final File codeCacheDir = deviceContext.getCodeCacheDir(); if (codeCacheDir != null) { - setupGraphicsSupport(data.info, codeCacheDir); + setupGraphicsSupport(appContext, codeCacheDir); } else { Log.e(TAG, "Unable to setupGraphicsSupport due to missing code-cache directory"); } diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 3f17f26a1155..9efcec4e2c30 100755 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -413,8 +413,8 @@ public class AppOpsManager { OP_WRITE_SMS, OP_RECEIVE_SMS, OP_RECEIVE_SMS, - OP_RECEIVE_SMS, - OP_RECEIVE_SMS, + OP_RECEIVE_MMS, + OP_RECEIVE_WAP_PUSH, OP_SEND_SMS, OP_READ_SMS, OP_WRITE_SMS, diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java index 9fa8a5d2faee..eb5613a05fb8 100644 --- a/core/java/android/app/ApplicationErrorReport.java +++ b/core/java/android/app/ApplicationErrorReport.java @@ -378,6 +378,11 @@ public CrashInfo(Throwable tr) { exceptionMessage = sanitizeString(exceptionMessage); } + /** {@hide} */ + public void appendStackTrace(String tr) { + stackTrace = sanitizeString(stackTrace + tr); + } + /** * Ensure that the string is of reasonable size, truncating from the middle if needed. */ diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 37faa2e23dbf..c44cdb290de6 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -291,6 +291,12 @@ public List queryPermissionsByGroup(String group, int flags) throw new NameNotFoundException(group); } + @Override + public boolean isPermissionReviewModeEnabled() { + return mContext.getResources().getBoolean( + com.android.internal.R.bool.config_permissionReviewRequired); + } + @Override public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) throws NameNotFoundException { diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index 6e2c464e9a37..72ccf72d2d05 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -185,6 +185,11 @@ public Dialog(@NonNull Context context, @StyleRes int themeResId) { mWindow = w; w.setCallback(this); w.setOnWindowDismissedCallback(this); + w.setOnWindowSwipeDismissedCallback(() -> { + if (mCancelable) { + cancel(); + } + }); w.setWindowManager(mWindowManager, null, null); w.setGravity(Gravity.CENTER); @@ -200,6 +205,7 @@ protected Dialog(@NonNull Context context, boolean cancelable, @Nullable Message cancelCallback) { this(context); mCancelable = cancelable; + updateWindowForCancelable(); mCancelMessage = cancelCallback; } @@ -207,6 +213,7 @@ protected Dialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) { this(context); mCancelable = cancelable; + updateWindowForCancelable(); setOnCancelListener(cancelListener); } @@ -742,7 +749,7 @@ public void onDetachedFromWindow() { /** @hide */ @Override - public void onWindowDismissed(boolean finishTask) { + public void onWindowDismissed(boolean finishTask, boolean suppressWindowTransition) { dismiss(); } @@ -1187,6 +1194,7 @@ public final void setFeatureDrawableAlpha(int featureId, int alpha) { */ public void setCancelable(boolean flag) { mCancelable = flag; + updateWindowForCancelable(); } /** @@ -1200,6 +1208,7 @@ public void setCancelable(boolean flag) { public void setCanceledOnTouchOutside(boolean cancel) { if (cancel && !mCancelable) { mCancelable = true; + updateWindowForCancelable(); } mWindow.setCloseOnTouchOutside(cancel); @@ -1351,4 +1360,8 @@ public void handleMessage(Message msg) { } } } + + private void updateWindowForCancelable() { + mWindow.setCloseOnSwipeEnabled(mCancelable); + } } diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index 5dead2850942..6b2838626ded 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -1115,7 +1115,7 @@ public void startActivity(Intent intent) { * * @param intent The intent to start. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. */ public void startActivity(Intent intent, Bundle options) { diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java index 391065787683..1850cebf4f07 100644 --- a/core/java/android/app/KeyguardManager.java +++ b/core/java/android/app/KeyguardManager.java @@ -21,18 +21,20 @@ import android.app.trust.ITrustManager; import android.content.Context; import android.content.Intent; -import android.content.pm.UserInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.os.Binder; -import android.os.RemoteException; import android.os.IBinder; import android.os.IUserManager; +import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; -import android.os.UserManager; -import android.view.IWindowManager; import android.view.IOnKeyguardExitResult; +import android.view.IWindowManager; import android.view.WindowManagerGlobal; +import java.util.List; + /** * Class that can be used to lock and unlock the keyboard. Get an instance of this * class by calling {@link android.content.Context#getSystemService(java.lang.String)} @@ -44,6 +46,7 @@ public class KeyguardManager { private IWindowManager mWM; private ITrustManager mTrustManager; private IUserManager mUserManager; + private Context mContext; /** * Intent used to prompt user for device credentials. @@ -86,8 +89,9 @@ public Intent createConfirmDeviceCredentialIntent(CharSequence title, CharSequen Intent intent = new Intent(ACTION_CONFIRM_DEVICE_CREDENTIAL); intent.putExtra(EXTRA_TITLE, title); intent.putExtra(EXTRA_DESCRIPTION, description); - // For security reasons, only allow this to come from system settings. - intent.setPackage("com.android.settings"); + + // explicitly set the package for security + intent.setPackage(getSettingsPackageForIntent(intent)); return intent; } @@ -108,11 +112,23 @@ public Intent createConfirmDeviceCredentialIntent( intent.putExtra(EXTRA_TITLE, title); intent.putExtra(EXTRA_DESCRIPTION, description); intent.putExtra(Intent.EXTRA_USER_ID, userId); - // For security reasons, only allow this to come from system settings. - intent.setPackage("com.android.settings"); + + // explicitly set the package for security + intent.setPackage(getSettingsPackageForIntent(intent)); + return intent; } + private String getSettingsPackageForIntent(Intent intent) { + List resolveInfos = mContext.getPackageManager() + .queryIntentActivities(intent, PackageManager.MATCH_SYSTEM_ONLY); + for (int i = 0; i < resolveInfos.size(); i++) { + return resolveInfos.get(i).activityInfo.packageName; + } + + return "com.android.settings"; + } + /** * @deprecated Use {@link android.view.WindowManager.LayoutParams#FLAG_DISMISS_KEYGUARD} * and/or {@link android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED} @@ -191,7 +207,8 @@ public interface OnKeyguardExitResult { } - KeyguardManager() { + KeyguardManager(Context context) { + mContext = context; mWM = WindowManagerGlobal.getWindowManagerService(); mTrustManager = ITrustManager.Stub.asInterface( ServiceManager.getService(Context.TRUST_SERVICE)); diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 55744b935f51..4c9b9778d7b5 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -320,10 +320,10 @@ public TextServicesManager createService() { }}); registerService(Context.KEYGUARD_SERVICE, KeyguardManager.class, - new StaticServiceFetcher() { + new CachedServiceFetcher() { @Override - public KeyguardManager createService() { - return new KeyguardManager(); + public KeyguardManager createService(ContextImpl ctx) { + return new KeyguardManager(ctx); }}); registerService(Context.LAYOUT_INFLATER_SERVICE, LayoutInflater.class, diff --git a/core/java/android/app/TaskStackBuilder.java b/core/java/android/app/TaskStackBuilder.java index 0077db1eb317..bab993f855e9 100644 --- a/core/java/android/app/TaskStackBuilder.java +++ b/core/java/android/app/TaskStackBuilder.java @@ -226,7 +226,7 @@ public void startActivities(Bundle options, UserHandle userHandle) { * Start the task stack constructed by this builder. * * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. */ public void startActivities(Bundle options) { @@ -259,7 +259,7 @@ public PendingIntent getPendingIntent(int requestCode, @PendingIntent.Flags int * {@link Intent#fillIn(Intent, int)} to control which unspecified parts of the * intent that can be supplied when the actual send happens. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @return The obtained PendingIntent diff --git a/core/java/android/app/admin/ConnectEvent.aidl b/core/java/android/app/admin/ConnectEvent.aidl new file mode 100644 index 000000000000..bab40f5add38 --- /dev/null +++ b/core/java/android/app/admin/ConnectEvent.aidl @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.admin; + +/** {@hide} */ +parcelable ConnectEvent; + diff --git a/core/java/android/app/admin/ConnectEvent.java b/core/java/android/app/admin/ConnectEvent.java new file mode 100644 index 000000000000..b6b14f24a096 --- /dev/null +++ b/core/java/android/app/admin/ConnectEvent.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.admin; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * A class that represents a connect library call event. + * @hide + */ +public final class ConnectEvent extends NetworkEvent implements Parcelable { + + /** The destination IP address. */ + private final String ipAddress; + + /** The destination port number. */ + private final int port; + + /** @hide */ + public ConnectEvent(String ipAddress, int port, String packageName, long timestamp) { + super(packageName, timestamp); + this.ipAddress = ipAddress; + this.port = port; + } + + private ConnectEvent(Parcel in) { + this.ipAddress = in.readString(); + this.port = in.readInt(); + this.packageName = in.readString(); + this.timestamp = in.readLong(); + } + + public String getIpAddress() { + return ipAddress; + } + + public int getPort() { + return port; + } + + @Override + public String toString() { + return String.format("ConnectEvent(%s, %d, %d, %s)", ipAddress, port, timestamp, + packageName); + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + @Override + public ConnectEvent createFromParcel(Parcel in) { + if (in.readInt() != PARCEL_TOKEN_CONNECT_EVENT) { + return null; + } + return new ConnectEvent(in); + } + + @Override + public ConnectEvent[] newArray(int size) { + return new ConnectEvent[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + // write parcel token first + out.writeInt(PARCEL_TOKEN_CONNECT_EVENT); + out.writeString(ipAddress); + out.writeInt(port); + out.writeString(packageName); + out.writeLong(timestamp); + } +} + diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java index dd70b5dfd1f0..cbd5a6d54832 100644 --- a/core/java/android/app/admin/DeviceAdminReceiver.java +++ b/core/java/android/app/admin/DeviceAdminReceiver.java @@ -275,6 +275,36 @@ public class DeviceAdminReceiver extends BroadcastReceiver { public static final String ACTION_SECURITY_LOGS_AVAILABLE = "android.app.action.SECURITY_LOGS_AVAILABLE"; + /** + * Broadcast action: notify that a new batch of network logs is ready to be collected. + * @see DeviceAdminReceiver#onNetworkLogsAvailable + * @hide + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_NETWORK_LOGS_AVAILABLE + = "android.app.action.NETWORK_LOGS_AVAILABLE"; + + /** + * A {@code long} containing a token of the current batch of network logs, that has to be used + * to retrieve the batch of logs by the device owner. + * + * @see #ACTION_NETWORK_LOGS_AVAILABLE + * @see DevicePolicyManager#retrieveNetworkLogs + * @hide + */ + public static final String EXTRA_NETWORK_LOGS_TOKEN = + "android.app.extra.EXTRA_NETWORK_LOGS_TOKEN"; + + /** + * An {@code int} count representing a total count of network logs inside the current batch of + * network logs. + * + * @see #ACTION_NETWORK_LOGS_AVAILABLE + * @hide + */ + public static final String EXTRA_NETWORK_LOGS_COUNT = + "android.app.extra.EXTRA_NETWORK_LOGS_COUNT"; + /** * A string containing the SHA-256 hash of the bugreport file. * @@ -634,6 +664,25 @@ public void onBugreportFailed(Context context, Intent intent, public void onSecurityLogsAvailable(Context context, Intent intent) { } + /** + * Called each time a new batch of network logs can be retrieved. This callback method will only + * ever be called when network logging is enabled. The logs can only be retrieved while network + * logging is enabled. + * + *

This callback is only applicable to device owners. + * + * @param context The running context as per {@link #onReceive}. + * @param intent The received intent as per {@link #onReceive}. + * @param batchToken The token representing the current batch of network logs. + * @param networkLogsCount The total count of events in the current batch of network logs. + * @see DevicePolicyManager#retrieveNetworkLogs(ComponentName) + * + * @hide + */ + public void onNetworkLogsAvailable(Context context, Intent intent, long batchToken, + int networkLogsCount) { + } + /** * Intercept standard device administrator broadcasts. Implementations * should not override this method; it is better to implement the @@ -688,6 +737,10 @@ public void onReceive(Context context, Intent intent) { onBugreportFailed(context, intent, failureCode); } else if (ACTION_SECURITY_LOGS_AVAILABLE.equals(action)) { onSecurityLogsAvailable(context, intent); + } else if (ACTION_NETWORK_LOGS_AVAILABLE.equals(action)) { + long batchToken = intent.getLongExtra(EXTRA_NETWORK_LOGS_TOKEN, -1); + int networkLogsCount = intent.getIntExtra(EXTRA_NETWORK_LOGS_COUNT, 0); + onNetworkLogsAvailable(context, intent, batchToken, networkLogsCount); } } } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index e23f142317ac..2fd7d3c51c43 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -25,6 +25,7 @@ import android.annotation.SystemApi; import android.annotation.UserIdInt; import android.app.Activity; +import android.app.admin.NetworkEvent; import android.app.admin.SecurityLog.SecurityEvent; import android.content.ComponentName; import android.content.Context; @@ -360,7 +361,7 @@ protected int myUserId() { * @hide */ public static final String ACTION_BUGREPORT_SHARING_ACCEPTED = - "com.android.server.action.BUGREPORT_SHARING_ACCEPTED"; + "com.android.server.action.REMOTE_BUGREPORT_SHARING_ACCEPTED"; /** * Action: Bugreport sharing with device owner has been declined by the user. @@ -368,7 +369,7 @@ protected int myUserId() { * @hide */ public static final String ACTION_BUGREPORT_SHARING_DECLINED = - "com.android.server.action.BUGREPORT_SHARING_DECLINED"; + "com.android.server.action.REMOTE_BUGREPORT_SHARING_DECLINED"; /** * Action: Bugreport has been collected and is dispatched to {@link DevicePolicyManagerService}. @@ -948,6 +949,15 @@ protected int myUserId() { public static final String ACTION_SET_NEW_PARENT_PROFILE_PASSWORD = "android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD"; + /** + * Broadcast action: Tell the status bar to open the device monitoring dialog, e.g. when + * Network logging was enabled and the user tapped the notification. + *

This is a protected intent that can only be sent by the system.

+ * @hide + */ + public static final String ACTION_SHOW_DEVICE_MONITORING_DIALOG + = "android.app.action.SHOW_DEVICE_MONITORING_DIALOG"; + /** * Flag used by {@link #addCrossProfileIntentFilter} to allow activities in * the parent profile to access intents sent from the managed profile. @@ -6624,4 +6634,81 @@ public boolean isBackupServiceEnabled(@NonNull ComponentName admin) { throw re.rethrowFromSystemServer(); } } + + /** + * Called by a device owner to control the network logging feature. Logging can only be + * enabled on single user devices where the sole user is managed by the device owner. If a new + * user is added on the device, logging is disabled. + * + *

Network logs contain DNS lookup and connect() library call events. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param enabled whether network logging should be enabled or not. + * @throws {@link SecurityException} if {@code admin} is not a device owner. + * @see #retrieveNetworkLogs + * + * @hide + */ + public void setNetworkLoggingEnabled(@NonNull ComponentName admin, boolean enabled) { + throwIfParentInstance("setNetworkLoggingEnabled"); + try { + mService.setNetworkLoggingEnabled(admin, enabled); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** + * Return whether network logging is enabled by a device owner. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. Can only + * be {@code null} if the caller has MANAGE_USERS permission. + * @return {@code true} if network logging is enabled by device owner, {@code false} otherwise. + * @throws {@link SecurityException} if {@code admin} is not a device owner and caller has + * no MANAGE_USERS permission + * + * @hide + */ + public boolean isNetworkLoggingEnabled(@Nullable ComponentName admin) { + throwIfParentInstance("isNetworkLoggingEnabled"); + try { + return mService.isNetworkLoggingEnabled(admin); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** + * Called by device owner to retrieve the most recent batch of network logging events. + * A device owner has to provide a batchToken provided as part of + * {@link DeviceAdminReceiver#onNetworkLogsAvailable} callback. If the token doesn't match the + * token of the most recent available batch of logs, {@code null} will be returned. + * + *

{@link NetworkEvent} can be one of {@link DnsEvent} or {@link ConnectEvent}. + * + *

The list of network events is sorted chronologically, and contains at most 1200 events. + * + *

Access to the logs is rate limited and this method will only return a new batch of logs + * after the device device owner has been notified via + * {@link DeviceAdminReceiver#onNetworkLogsAvailable}. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param batchToken A token of the batch to retrieve + * @return A new batch of network logs which is a list of {@link NetworkEvent}. Returns + * {@code null} if the batch represented by batchToken is no longer available or if + * logging is disabled. + * @throws {@link SecurityException} if {@code admin} is not a device owner. + * @see DeviceAdminReceiver#onNetworkLogsAvailable + * + * @hide + */ + public @Nullable List retrieveNetworkLogs(@NonNull ComponentName admin, + long batchToken) { + throwIfParentInstance("retrieveNetworkLogs"); + try { + return mService.retrieveNetworkLogs(admin, batchToken); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/app/admin/DnsEvent.aidl b/core/java/android/app/admin/DnsEvent.aidl new file mode 100644 index 000000000000..6da962a0a828 --- /dev/null +++ b/core/java/android/app/admin/DnsEvent.aidl @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.admin; + +/** {@hide} */ +parcelable DnsEvent; + diff --git a/core/java/android/app/admin/DnsEvent.java b/core/java/android/app/admin/DnsEvent.java new file mode 100644 index 000000000000..4ff8e1cba531 --- /dev/null +++ b/core/java/android/app/admin/DnsEvent.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.admin; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * A class that represents a DNS lookup event. + * @hide + */ +public final class DnsEvent extends NetworkEvent implements Parcelable { + + /** The hostname that was looked up. */ + private final String hostname; + + /** Contains (possibly a subset of) the IP addresses returned. */ + private final String[] ipAddresses; + + /** + * The number of IP addresses returned from the DNS lookup event. May be different from the + * length of ipAddresses if there were too many addresses to log. + */ + private final int ipAddressesCount; + + /** @hide */ + public DnsEvent(String hostname, String[] ipAddresses, int ipAddressesCount, + String packageName, long timestamp) { + super(packageName, timestamp); + this.hostname = hostname; + this.ipAddresses = ipAddresses; + this.ipAddressesCount = ipAddressesCount; + } + + private DnsEvent(Parcel in) { + this.hostname = in.readString(); + this.ipAddresses = in.createStringArray(); + this.ipAddressesCount = in.readInt(); + this.packageName = in.readString(); + this.timestamp = in.readLong(); + } + + /** Returns the hostname that was looked up. */ + public String getHostname() { + return hostname; + } + + /** Returns (possibly a subset of) the IP addresses returned. */ + public String[] getIpAddresses() { + return ipAddresses; + } + + /** + * Returns the number of IP addresses returned from the DNS lookup event. May be different from + * the length of ipAddresses if there were too many addresses to log. + */ + public int getIpAddressesCount() { + return ipAddressesCount; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if (ipAddresses != null) { + for (int i = 0; i < ipAddresses.length; i++) { + sb.append(ipAddresses[i]); + if (i < ipAddresses.length - 1) { + sb.append(" "); + } + } + } else { + sb.append("NONE"); + } + return String.format("DnsEvent(%s, %s, %d, %d, %s)", hostname, sb.toString(), + ipAddressesCount, timestamp, packageName); + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + @Override + public DnsEvent createFromParcel(Parcel in) { + if (in.readInt() != PARCEL_TOKEN_DNS_EVENT) { + return null; + } + return new DnsEvent(in); + } + + @Override + public DnsEvent[] newArray(int size) { + return new DnsEvent[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + // write parcel token first + out.writeInt(PARCEL_TOKEN_DNS_EVENT); + out.writeString(hostname); + out.writeStringArray(ipAddresses); + out.writeInt(ipAddressesCount); + out.writeString(packageName); + out.writeLong(timestamp); + } +} + diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 90632a19a09b..b98927d1a148 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -17,6 +17,7 @@ package android.app.admin; +import android.app.admin.NetworkEvent; import android.app.admin.SystemUpdatePolicy; import android.content.ComponentName; import android.content.Intent; @@ -312,4 +313,8 @@ interface IDevicePolicyManager { void setBackupServiceEnabled(in ComponentName admin, boolean enabled); boolean isBackupServiceEnabled(in ComponentName admin); + + void setNetworkLoggingEnabled(in ComponentName admin, boolean enabled); + boolean isNetworkLoggingEnabled(in ComponentName admin); + List retrieveNetworkLogs(in ComponentName admin, long batchToken); } diff --git a/core/java/android/app/admin/NetworkEvent.aidl b/core/java/android/app/admin/NetworkEvent.aidl new file mode 100644 index 000000000000..5fa5dbfabb5f --- /dev/null +++ b/core/java/android/app/admin/NetworkEvent.aidl @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.admin; + +/** {@hide} */ +parcelable NetworkEvent; + diff --git a/core/java/android/app/admin/NetworkEvent.java b/core/java/android/app/admin/NetworkEvent.java new file mode 100644 index 000000000000..0de2665f90a8 --- /dev/null +++ b/core/java/android/app/admin/NetworkEvent.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.admin; + +import android.content.pm.PackageManager; +import android.os.Parcel; +import android.os.Parcelable; +import android.os.ParcelFormatException; + +/** + * An abstract class that represents a network event. + * @hide + */ +public abstract class NetworkEvent implements Parcelable { + + static final int PARCEL_TOKEN_DNS_EVENT = 1; + static final int PARCEL_TOKEN_CONNECT_EVENT = 2; + + /** The package name of the UID that performed the query. */ + String packageName; + + /** The timestamp of the event being reported in milliseconds. */ + long timestamp; + + /** @hide */ + NetworkEvent() { + //empty constructor + } + + /** @hide */ + NetworkEvent(String packageName, long timestamp) { + this.packageName = packageName; + this.timestamp = timestamp; + } + + /** + * Returns the package name of the UID that performed the query, as returned by + * {@link PackageManager#getNameForUid}. + */ + public String getPackageName() { + return packageName; + } + + /** + * Returns the timestamp of the event being reported in milliseconds, the difference between + * the time the event was reported and midnight, January 1, 1970 UTC. + */ + public long getTimestamp() { + return timestamp; + } + + @Override + public int describeContents() { + return 0; + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public NetworkEvent createFromParcel(Parcel in) { + final int initialPosition = in.dataPosition(); + final int parcelToken = in.readInt(); + // we need to move back to the position from before we read parcelToken + in.setDataPosition(initialPosition); + switch (parcelToken) { + case PARCEL_TOKEN_DNS_EVENT: + return DnsEvent.CREATOR.createFromParcel(in); + case PARCEL_TOKEN_CONNECT_EVENT: + return ConnectEvent.CREATOR.createFromParcel(in); + default: + throw new ParcelFormatException("Unexpected NetworkEvent token in parcel: " + + parcelToken); + } + } + + public NetworkEvent[] newArray(int size) { + return new NetworkEvent[size]; + } + }; + + @Override + public abstract void writeToParcel(Parcel out, int flags); +} + diff --git a/core/java/android/app/admin/SecurityLog.java b/core/java/android/app/admin/SecurityLog.java index 2858991fbdf4..91b87d74694d 100644 --- a/core/java/android/app/admin/SecurityLog.java +++ b/core/java/android/app/admin/SecurityLog.java @@ -144,8 +144,7 @@ public long getTimeNanos() { } /** - * Returns the payload contained in this log. Each call to this method will - * retrieve the next payload item. If no more payload exists, it returns {@code null}. + * Returns the payload contained in this log entry or {@code null} if there is no payload. */ public Object getData() { return mEvent.getData(); diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java index a793d0c12ee9..d3a14853cf1e 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -493,7 +493,7 @@ private void applyXmlFiltersAndDoFullBackupForDomain(String packageName, String *

Attempting to back up files in directories that are ignored by * the backup system will have no effect. For example, if the app calls this method * with a file inside the {@link #getNoBackupFilesDir()} directory, it will be ignored. - * See {@link #onFullBackup(FullBackupDataOutput) for details on what directories + * See {@link #onFullBackup(FullBackupDataOutput)} for details on what directories * are excluded from backups. * * @param file The file to be backed up. The file must exist and be readable by diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index bb5f7a1d606e..5d99ada9a024 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -347,8 +347,9 @@ public LayoutParams generateLayoutParams(AttributeSet attrs) { } /** - * Sets an executor which can be used for asynchronously inflating and applying the remoteviews. - * @see {@link RemoteViews#applyAsync(Context, ViewGroup, RemoteViews.OnViewAppliedListener, Executor)} + * Sets an executor which can be used for asynchronously inflating. CPU intensive tasks like + * view inflation or loading images will be performed on the executor. The updates will still + * be applied on the UI thread. * * @param executor the executor to use or null. * @hide diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index c5f07e320a87..6f8374c3ea95 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -23,6 +23,7 @@ import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; +import android.app.ActivityThread; import android.bluetooth.le.BluetoothLeAdvertiser; import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.ScanCallback; @@ -199,6 +200,23 @@ public final class BluetoothAdapter { */ public static final int STATE_BLE_TURNING_OFF = 16; + /** + * Human-readable string helper for AdapterState + * @hide + */ + public static String nameForState(@AdapterState int state) { + switch(state) { + case STATE_OFF: return "OFF"; + case STATE_TURNING_ON: return "TURNING_ON"; + case STATE_ON: return "ON"; + case STATE_TURNING_OFF: return "TURNING_OFF"; + case STATE_BLE_TURNING_ON: return "BLE_TURNING_ON"; + case STATE_BLE_ON: return "BLE_ON"; + case STATE_BLE_TURNING_OFF: return "BLE_TURNING_OFF"; + default: return "?!?!? (" + state + ")"; + } + } + /** * Activity Action: Show a system activity that requests discoverable mode. * This activity will also request the user to turn on Bluetooth if it @@ -254,6 +272,29 @@ public final class BluetoothAdapter { public static final String ACTION_REQUEST_ENABLE = "android.bluetooth.adapter.action.REQUEST_ENABLE"; + /** + * Activity Action: Show a system activity that allows the user to turn off + * Bluetooth. This is used only if permission review is enabled which is for + * apps targeting API less than 23 require a permission review before any of + * the app's components can run. + *

This system activity will return once Bluetooth has completed turning + * off, or the user has decided not to turn Bluetooth off. + *

Notification of the result of this activity is posted using the + * {@link android.app.Activity#onActivityResult} callback. The + * resultCode + * will be {@link android.app.Activity#RESULT_OK} if Bluetooth has been + * turned off or {@link android.app.Activity#RESULT_CANCELED} if the user + * has rejected the request or an error has occurred. + *

Applications can also listen for {@link #ACTION_STATE_CHANGED} + * for global notification whenever Bluetooth is turned on or off. + *

Requires {@link android.Manifest.permission#BLUETOOTH} + * + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_REQUEST_DISABLE = + "android.bluetooth.adapter.action.REQUEST_DISABLE"; + /** * Activity Action: Show a system activity that allows user to enable BLE scans even when * Bluetooth is turned off.

@@ -640,42 +681,12 @@ public boolean isEnabled() { @SystemApi public boolean isLeEnabled() { final int state = getLeState(); - if (state == BluetoothAdapter.STATE_ON) { - if (DBG) Log.d (TAG, "STATE_ON"); - } else if (state == BluetoothAdapter.STATE_BLE_ON) { - if (DBG) Log.d (TAG, "STATE_BLE_ON"); - } else { - if (DBG) Log.d (TAG, "STATE_OFF"); - return false; - } - return true; - } - - /** - * Performs action based on user action to turn BT ON - * or OFF if BT is in BLE_ON state - */ - private void notifyUserAction(boolean enable) { - try { - mServiceLock.readLock().lock(); - if (mService == null) { - Log.e(TAG, "mService is null"); - return; - } - if (enable) { - mService.onLeServiceUp(); //NA:TODO implementation pending - } else { - mService.onBrEdrDown(); //NA:TODO implementation pending - } - } catch (RemoteException e) { - Log.e(TAG, "", e); - } finally { - mServiceLock.readLock().unlock(); - } + if (DBG) Log.d(TAG, "isLeEnabled(): " + BluetoothAdapter.nameForState(state)); + return (state == BluetoothAdapter.STATE_ON || state == BluetoothAdapter.STATE_BLE_ON); } /** - * Turns off Bluetooth LE which was earlier turned on by calling EnableBLE(). + * Turns off Bluetooth LE which was earlier turned on by calling enableBLE(). * *

If the internal Adapter state is STATE_BLE_ON, this would trigger the transition * to STATE_OFF and completely shut-down Bluetooth @@ -705,61 +716,50 @@ public boolean disableBLE() { if (!isBleScanAlwaysAvailable()) return false; int state = getLeState(); - if (state == BluetoothAdapter.STATE_ON) { - if (DBG) Log.d (TAG, "STATE_ON: shouldn't disable"); + if (state == BluetoothAdapter.STATE_ON || state == BluetoothAdapter.STATE_BLE_ON) { + String packageName = ActivityThread.currentPackageName(); + if (DBG) Log.d (TAG, "disableBLE(): de-registering " + packageName); try { - mManagerService.updateBleAppCount(mToken, false); + mManagerService.updateBleAppCount(mToken, false, packageName); } catch (RemoteException e) { Log.e(TAG, "", e); } return true; - - } else if (state == BluetoothAdapter.STATE_BLE_ON) { - if (DBG) Log.d (TAG, "STATE_BLE_ON"); - int bleAppCnt = 0; - try { - bleAppCnt = mManagerService.updateBleAppCount(mToken, false); - } catch (RemoteException e) { - Log.e(TAG, "", e); - } - if (bleAppCnt == 0) { - // Disable only if there are no other clients - notifyUserAction(false); - } - return true; } - if (DBG) Log.d (TAG, "STATE_OFF: Already disabled"); + if (DBG) Log.d (TAG, "disableBLE(): Already disabled"); return false; } /** - * Special Applications who want to only turn on Bluetooth Low Energy (BLE) would - * EnableBLE, EnableBLE brings-up Bluetooth so that application can access - * only LE related feature (Bluetooth GATT layers interfaces using the respective class) - * EnableBLE in turn registers the existance of a special App which wants to - * turn on Bluetooth Low enrgy part without making it visible at the settings UI - * as Bluetooth ON. - *

Invoking EnableBLE when Bluetooth is already in ON state, would just registers - * the existance of special Application and doesn't do anything to current BT state. - * when user turn OFF Bluetooth from UI, if there is an existance of special app, Bluetooth - * would stay in BLE_ON state so that LE features are still acessible to the special - * Applications. + * Applications who want to only use Bluetooth Low Energy (BLE) can call enableBLE. * - *

This is an asynchronous call: it will return immediately, and + * enableBLE registers the existence of an app using only LE functions. + * + * enableBLE may enable Bluetooth to an LE only mode so that an app can use + * LE related features (BluetoothGatt or BluetoothGattServer classes) + * + * If the user disables Bluetooth while an app is registered to use LE only features, + * Bluetooth will remain on in LE only mode for the app. + * + * When Bluetooth is in LE only mode, it is not shown as ON to the UI. + * + *

This is an asynchronous call: it returns immediately, and * clients should listen for {@link #ACTION_BLE_STATE_CHANGED} - * to be notified of subsequent adapter state changes. If this call returns - * true, then the adapter state will immediately transition from {@link - * #STATE_OFF} to {@link #STATE_BLE_TURNING_ON}, and some time - * later transition to either {@link #STATE_OFF} or {@link - * #STATE_BLE_ON}. If this call returns false then there was an - * immediate problem that will prevent the adapter from being turned on - - * such as Airplane mode, or the adapter is already turned on. - * (@link #ACTION_BLE_STATE_CHANGED) returns the Bluetooth Adapter's various + * to be notified of adapter state changes. + * + * If this call returns * true, then the adapter state is either in a mode where + * LE is available, or will transition from {@link #STATE_OFF} to {@link #STATE_BLE_TURNING_ON}, + * and some time later transition to either {@link #STATE_OFF} or {@link #STATE_BLE_ON}. + * + * If this call returns false then there was an immediate problem that prevents the + * adapter from being turned on - such as Airplane mode. + * + * {@link #ACTION_BLE_STATE_CHANGED} returns the Bluetooth Adapter's various * states, It includes all the classic Bluetooth Adapter states along with * internal BLE only states * - * @return true to indicate Bluetooth LE start-up has begun, or false on + * @return true to indicate Bluetooth LE will be available, or false on * immediate error * @hide */ @@ -768,13 +768,14 @@ public boolean enableBLE() { if (!isBleScanAlwaysAvailable()) return false; try { - mManagerService.updateBleAppCount(mToken, true); + String packageName = ActivityThread.currentPackageName(); + mManagerService.updateBleAppCount(mToken, true, packageName); if (isLeEnabled()) { if (DBG) Log.d(TAG, "enableBLE(): Bluetooth already enabled"); return true; } if (DBG) Log.d(TAG, "enableBLE(): Calling enable"); - return mManagerService.enable(); + return mManagerService.enable(packageName); } catch (RemoteException e) { Log.e(TAG, "", e); } @@ -814,10 +815,10 @@ public int getState() { if (state == BluetoothAdapter.STATE_BLE_ON || state == BluetoothAdapter.STATE_BLE_TURNING_ON || state == BluetoothAdapter.STATE_BLE_TURNING_OFF) { - if (VDBG) Log.d(TAG, "Consider internal state as OFF"); + if (VDBG) Log.d(TAG, "Consider " + BluetoothAdapter.nameForState(state) + " state as OFF"); state = BluetoothAdapter.STATE_OFF; } - if (VDBG) Log.d(TAG, "" + hashCode() + ": getState(). Returning " + state); + if (VDBG) Log.d(TAG, "" + hashCode() + ": getState(). Returning " + BluetoothAdapter.nameForState(state)); return state; } @@ -854,12 +855,12 @@ public int getLeState() { mServiceLock.readLock().unlock(); } - if (VDBG) Log.d(TAG,"getLeState() returning " + state); + if (VDBG) Log.d(TAG,"getLeState() returning " + BluetoothAdapter.nameForState(state)); return state; } boolean getLeAccess() { - if(getLeState() == STATE_ON) + if (getLeState() == STATE_ON) return true; else if (getLeState() == STATE_BLE_ON) @@ -898,12 +899,12 @@ else if (getLeState() == STATE_BLE_ON) @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN) public boolean enable() { android.util.SeempLog.record(56); - if (isEnabled() == true) { - if (DBG) Log.d(TAG, "enable(): BT is already enabled..!"); + if (isEnabled()) { + if (DBG) Log.d(TAG, "enable(): BT already enabled!"); return true; } try { - return mManagerService.enable(); + return mManagerService.enable(ActivityThread.currentPackageName()); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } @@ -936,7 +937,7 @@ public boolean enable() { public boolean disable() { android.util.SeempLog.record(57); try { - return mManagerService.disable(true); + return mManagerService.disable(ActivityThread.currentPackageName(), true); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } @@ -955,7 +956,7 @@ public boolean disable(boolean persist) { android.util.SeempLog.record(57); try { - return mManagerService.disable(persist); + return mManagerService.disable(ActivityThread.currentPackageName(), persist); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } @@ -1499,6 +1500,37 @@ public Set getBondedDevices() { return null; } + /** + * Gets the currently supported profiles by the adapter. + * + *

This can be used to check whether a profile is supported before attempting + * to connect to its respective proxy. + * + * @return a list of integers indicating the ids of supported profiles as defined in + * {@link BluetoothProfile}. + * @hide + */ + public List getSupportedProfiles() { + final ArrayList supportedProfiles = new ArrayList(); + + try { + synchronized (mManagerCallback) { + if (mService != null) { + final long supportedProfilesBitMask = mService.getSupportedProfiles(); + + for (int i = 0; i <= BluetoothProfile.MAX_PROFILE_ID; i++) { + if ((supportedProfilesBitMask & (1 << i)) != 0) { + supportedProfiles.add(i); + } + } + } + } + } catch (RemoteException e) { + Log.e(TAG, "getSupportedProfiles:", e); + } + return supportedProfiles; + } + /** * Get the current connection state of the local Bluetooth adapter. * This can be used to check whether the local Bluetooth adapter is connected @@ -1877,34 +1909,6 @@ public BluetoothServerSocket listenUsingInsecureL2capOn(int port) throws IOExcep * @hide */ public Pair readOutOfBandData() { - if (getState() != STATE_ON) return null; - //TODO(BT - /* - try { - byte[] hash; - byte[] randomizer; - - byte[] ret = null; - mServiceLock.readLock().lock(); - if (mService != null) mService.readOutOfBandData(); - - if (ret == null || ret.length != 32) return null; - - hash = Arrays.copyOfRange(ret, 0, 16); - randomizer = Arrays.copyOfRange(ret, 16, 32); - - if (DBG) { - Log.d(TAG, "readOutOfBandData:" + Arrays.toString(hash) + - ":" + Arrays.toString(randomizer)); - } - return new Pair(hash, randomizer); - - } catch (RemoteException e) { - Log.e(TAG, "", e); - } finally { - mServiceLock.readLock().unlock(); - } - */ return null; } @@ -2058,7 +2062,7 @@ public void onBluetoothServiceUp(IBluetooth bluetoothService) { if (cb != null) { cb.onBluetoothServiceUp(bluetoothService); } else { - Log.d(TAG, "onBluetoothServiceUp: cb is null!!!"); + Log.d(TAG, "onBluetoothServiceUp: cb is null!"); } } catch (Exception e) { Log.e(TAG,"",e); @@ -2088,7 +2092,7 @@ public void onBluetoothServiceDown() { if (cb != null) { cb.onBluetoothServiceDown(); } else { - Log.d(TAG, "onBluetoothServiceDown: cb is null!!!"); + Log.d(TAG, "onBluetoothServiceDown: cb is null!"); } } catch (Exception e) { Log.e(TAG,"",e);} } @@ -2097,7 +2101,7 @@ public void onBluetoothServiceDown() { } public void onBrEdrDown() { - if (DBG) Log.i(TAG, "onBrEdrDown:"); + if (VDBG) Log.i(TAG, "onBrEdrDown: " + mService); } }; @@ -2108,11 +2112,11 @@ public void onBrEdrDown() { */ public boolean enableNoAutoConnect() { if (isEnabled() == true){ - if (DBG) Log.d(TAG, "enableNoAutoConnect(): BT is already enabled..!"); + if (DBG) Log.d(TAG, "enableNoAutoConnect(): BT already enabled!"); return true; } try { - return mManagerService.enableNoAutoConnect(); + return mManagerService.enableNoAutoConnect(ActivityThread.currentPackageName()); } catch (RemoteException e) {Log.e(TAG, "", e);} return false; } @@ -2148,22 +2152,6 @@ public boolean enableNoAutoConnect() { */ public boolean changeApplicationBluetoothState(boolean on, BluetoothStateChangeCallback callback) { - if (callback == null) return false; - - //TODO(BT) - /* - try { - mServiceLock.readLock().lock(); - if (mService != null) { - return mService.changeApplicationBluetoothState(on, new - StateChangeCallbackWrapper(callback), new Binder()); - } - } catch (RemoteException e) { - Log.e(TAG, "changeBluetoothState", e); - } finally { - mServiceLock.readLock().unlock(); - } - */ return false; } diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index 552c8d3b0143..0eca4d670d3d 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -44,14 +44,18 @@ public final class BluetoothGatt implements BluetoothProfile { private IBluetoothGatt mService; private BluetoothGattCallback mCallback; private int mClientIf; - private boolean mAuthRetry = false; private BluetoothDevice mDevice; private boolean mAutoConnect; + private int mAuthRetryState; private int mConnState; private final Object mStateLock = new Object(); private Boolean mDeviceBusy = false; private int mTransport; + private static final int AUTH_RETRY_STATE_IDLE = 0; + private static final int AUTH_RETRY_STATE_NO_MITM = 1; + private static final int AUTH_RETRY_STATE_MITM = 2; + private static final int CONN_STATE_IDLE = 0; private static final int CONN_STATE_CONNECTING = 1; private static final int CONN_STATE_CONNECTED = 2; @@ -262,17 +266,19 @@ public void onCharacteristicRead(String address, int status, int handle, byte[] if ((status == GATT_INSUFFICIENT_AUTHENTICATION || status == GATT_INSUFFICIENT_ENCRYPTION) - && mAuthRetry == false) { + && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) { try { - mAuthRetry = true; - mService.readCharacteristic(mClientIf, address, handle, AUTHENTICATION_MITM); + final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ? + AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM; + mService.readCharacteristic(mClientIf, address, handle, authReq); + mAuthRetryState++; return; } catch (RemoteException e) { Log.e(TAG,"",e); } } - mAuthRetry = false; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; BluetoothGattCharacteristic characteristic = getCharacteristicById(mDevice, handle); if (characteristic == null) { @@ -311,19 +317,20 @@ public void onCharacteristicWrite(String address, int status, int handle) { if ((status == GATT_INSUFFICIENT_AUTHENTICATION || status == GATT_INSUFFICIENT_ENCRYPTION) - && mAuthRetry == false) { + && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) { try { - mAuthRetry = true; + final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ? + AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM; mService.writeCharacteristic(mClientIf, address, handle, - characteristic.getWriteType(), AUTHENTICATION_MITM, - characteristic.getValue()); + characteristic.getWriteType(), authReq, characteristic.getValue()); + mAuthRetryState++; return; } catch (RemoteException e) { Log.e(TAG,"",e); } } - mAuthRetry = false; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; try { mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic, status); @@ -378,17 +385,19 @@ public void onDescriptorRead(String address, int status, int handle, byte[] valu if ((status == GATT_INSUFFICIENT_AUTHENTICATION || status == GATT_INSUFFICIENT_ENCRYPTION) - && mAuthRetry == false) { + && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) { try { - mAuthRetry = true; - mService.readDescriptor(mClientIf, address, handle, AUTHENTICATION_MITM); + final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ? + AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM; + mService.readDescriptor(mClientIf, address, handle, authReq); + mAuthRetryState++; return; } catch (RemoteException e) { Log.e(TAG,"",e); } } - mAuthRetry = true; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; try { mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status); @@ -417,19 +426,21 @@ public void onDescriptorWrite(String address, int status, int handle) { if ((status == GATT_INSUFFICIENT_AUTHENTICATION || status == GATT_INSUFFICIENT_ENCRYPTION) - && mAuthRetry == false) { + && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) { try { - mAuthRetry = true; + final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ? + AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM; mService.writeDescriptor(mClientIf, address, handle, BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT, - AUTHENTICATION_MITM, descriptor.getValue()); + authReq, descriptor.getValue()); + mAuthRetryState++; return; } catch (RemoteException e) { Log.e(TAG,"",e); } } - mAuthRetry = false; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; try { mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status); @@ -503,6 +514,7 @@ public void onConfigureMTU(String address, int mtu, int status) { mServices = new ArrayList(); mConnState = CONN_STATE_IDLE; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; } /** @@ -516,6 +528,7 @@ public void close() { unregisterApp(); mConnState = CONN_STATE_CLOSED; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; } /** diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java index da79b586cf66..c76d10eaa659 100644 --- a/core/java/android/bluetooth/BluetoothProfile.java +++ b/core/java/android/bluetooth/BluetoothProfile.java @@ -142,6 +142,13 @@ public interface BluetoothProfile { */ public static final int DUN = 21; + /** + * Max profile ID. This value should be updated whenever a new profile is added to match + * the largest value assigned to a profile. + * @hide + */ + public static final int MAX_PROFILE_ID = 17; + /** * Default priority for devices that we try to auto-connect to and * and allow incoming connections for the profile diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl index 3049255f81ac..54c68d368e85 100644 --- a/core/java/android/bluetooth/IBluetooth.aidl +++ b/core/java/android/bluetooth/IBluetooth.aidl @@ -62,6 +62,7 @@ interface IBluetooth boolean cancelBondProcess(in BluetoothDevice device); boolean removeBond(in BluetoothDevice device); int getBondState(in BluetoothDevice device); + long getSupportedProfiles(); int getConnectionState(in BluetoothDevice device); String getRemoteName(in BluetoothDevice device); diff --git a/core/java/android/bluetooth/IBluetoothManager.aidl b/core/java/android/bluetooth/IBluetoothManager.aidl index 2b853a373b52..5afd77418222 100644 --- a/core/java/android/bluetooth/IBluetoothManager.aidl +++ b/core/java/android/bluetooth/IBluetoothManager.aidl @@ -34,9 +34,9 @@ interface IBluetoothManager void registerStateChangeCallback(in IBluetoothStateChangeCallback callback); void unregisterStateChangeCallback(in IBluetoothStateChangeCallback callback); boolean isEnabled(); - boolean enable(); - boolean enableNoAutoConnect(); - boolean disable(boolean persist); + boolean enable(String packageName); + boolean enableNoAutoConnect(String packageName); + boolean disable(String packageName, boolean persist); int getState(); IBluetoothGatt getBluetoothGatt(); @@ -47,6 +47,6 @@ interface IBluetoothManager String getName(); boolean isBleScanAlwaysAvailable(); - int updateBleAppCount(IBinder b, boolean enable); + int updateBleAppCount(IBinder b, boolean enable, String packageName); boolean isBleAppPresent(); } diff --git a/core/java/android/bluetooth/OobData.java b/core/java/android/bluetooth/OobData.java index 8e659e04d705..9e87230c686e 100644 --- a/core/java/android/bluetooth/OobData.java +++ b/core/java/android/bluetooth/OobData.java @@ -30,7 +30,23 @@ * @hide */ public class OobData implements Parcelable { + private byte[] leBluetoothDeviceAddress; private byte[] securityManagerTk; + private byte[] leSecureConnectionsConfirmation; + private byte[] leSecureConnectionsRandom; + + public byte[] getLeBluetoothDeviceAddress() { + return leBluetoothDeviceAddress; + } + + /** + * Sets the LE Bluetooth Device Address value to be used during LE pairing. + * The value shall be 7 bytes. Please see Bluetooth CSSv6, Part A 1.16 for + * a detailed description. + */ + public void setLeBluetoothDeviceAddress(byte[] leBluetoothDeviceAddress) { + this.leBluetoothDeviceAddress = leBluetoothDeviceAddress; + } public byte[] getSecurityManagerTk() { return securityManagerTk; @@ -45,10 +61,29 @@ public void setSecurityManagerTk(byte[] securityManagerTk) { this.securityManagerTk = securityManagerTk; } + public byte[] getLeSecureConnectionsConfirmation() { + return leSecureConnectionsConfirmation; + } + + public void setLeSecureConnectionsConfirmation(byte[] leSecureConnectionsConfirmation) { + this.leSecureConnectionsConfirmation = leSecureConnectionsConfirmation; + } + + public byte[] getLeSecureConnectionsRandom() { + return leSecureConnectionsRandom; + } + + public void setLeSecureConnectionsRandom(byte[] leSecureConnectionsRandom) { + this.leSecureConnectionsRandom = leSecureConnectionsRandom; + } + public OobData() { } private OobData(Parcel in) { + leBluetoothDeviceAddress = in.createByteArray(); securityManagerTk = in.createByteArray(); + leSecureConnectionsConfirmation = in.createByteArray(); + leSecureConnectionsRandom = in.createByteArray(); } public int describeContents() { @@ -57,7 +92,10 @@ public int describeContents() { @Override public void writeToParcel(Parcel out, int flags) { + out.writeByteArray(leBluetoothDeviceAddress); out.writeByteArray(securityManagerTk); + out.writeByteArray(leSecureConnectionsConfirmation); + out.writeByteArray(leSecureConnectionsRandom); } public static final Parcelable.Creator CREATOR diff --git a/core/java/android/content/BroadcastReceiver.java b/core/java/android/content/BroadcastReceiver.java index 10e6fb233249..a7a86158edee 100644 --- a/core/java/android/content/BroadcastReceiver.java +++ b/core/java/android/content/BroadcastReceiver.java @@ -27,189 +27,25 @@ import android.util.Slog; /** - * Base class for code that will receive intents sent by sendBroadcast(). - * - *

If you don't need to send broadcasts across applications, consider using - * this class with {@link android.support.v4.content.LocalBroadcastManager} instead - * of the more general facilities described below. This will give you a much - * more efficient implementation (no cross-process communication needed) and allow - * you to avoid thinking about any security issues related to other applications - * being able to receive or send your broadcasts. + * Base class for code that receives and handles broadcast intents sent by + * {@link android.content.Context#sendBroadcast(Intent)}. * *

You can either dynamically register an instance of this class with * {@link Context#registerReceiver Context.registerReceiver()} - * or statically publish an implementation through the + * or statically declare an implementation with the * {@link android.R.styleable#AndroidManifestReceiver <receiver>} * tag in your AndroidManifest.xml. - * - *

Note: - *    If registering a receiver in your - * {@link android.app.Activity#onResume() Activity.onResume()} - * implementation, you should unregister it in - * {@link android.app.Activity#onPause() Activity.onPause()}. - * (You won't receive intents when paused, - * and this will cut down on unnecessary system overhead). Do not unregister in - * {@link android.app.Activity#onSaveInstanceState(android.os.Bundle) Activity.onSaveInstanceState()}, - * because this won't be called if the user moves back in the history - * stack. - * - *

There are two major classes of broadcasts that can be received:

- *
    - *
  • Normal broadcasts (sent with {@link Context#sendBroadcast(Intent) - * Context.sendBroadcast}) are completely asynchronous. All receivers of the - * broadcast are run in an undefined order, often at the same time. This is - * more efficient, but means that receivers cannot use the result or abort - * APIs included here. - *
  • Ordered broadcasts (sent with {@link Context#sendOrderedBroadcast(Intent, String) - * Context.sendOrderedBroadcast}) are delivered to one receiver at a time. - * As each receiver executes in turn, it can propagate a result to the next - * receiver, or it can completely abort the broadcast so that it won't be passed - * to other receivers. The order receivers run in can be controlled with the - * {@link android.R.styleable#AndroidManifestIntentFilter_priority - * android:priority} attribute of the matching intent-filter; receivers with - * the same priority will be run in an arbitrary order. - *
- * - *

Even in the case of normal broadcasts, the system may in some - * situations revert to delivering the broadcast one receiver at a time. In - * particular, for receivers that may require the creation of a process, only - * one will be run at a time to avoid overloading the system with new processes. - * In this situation, however, the non-ordered semantics hold: these receivers still - * cannot return results or abort their broadcast.

- * - *

Note that, although the Intent class is used for sending and receiving - * these broadcasts, the Intent broadcast mechanism here is completely separate - * from Intents that are used to start Activities with - * {@link Context#startActivity Context.startActivity()}. - * There is no way for a BroadcastReceiver - * to see or capture Intents used with startActivity(); likewise, when - * you broadcast an Intent, you will never find or start an Activity. - * These two operations are semantically very different: starting an - * Activity with an Intent is a foreground operation that modifies what the - * user is currently interacting with; broadcasting an Intent is a background - * operation that the user is not normally aware of. - * - *

The BroadcastReceiver class (when launched as a component through - * a manifest's {@link android.R.styleable#AndroidManifestReceiver <receiver>} - * tag) is an important part of an - * application's overall lifecycle.

- * - *

Topics covered here: - *

    - *
  1. Security - *
  2. Receiver Lifecycle - *
  3. Process Lifecycle - *
* *
*

Developer Guides

- *

For information about how to use this class to receive and resolve intents, read the - * Intents and Intent Filters - * developer guide.

- *
- * - * - *

Security

- * - *

Receivers used with the {@link Context} APIs are by their nature a - * cross-application facility, so you must consider how other applications - * may be able to abuse your use of them. Some things to consider are: - * - *

    - *
  • The Intent namespace is global. Make sure that Intent action names and - * other strings are written in a namespace you own, or else you may inadvertently - * conflict with other applications. - *

  • When you use {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)}, - * any application may send broadcasts to that registered receiver. You can - * control who can send broadcasts to it through permissions described below. - *

  • When you publish a receiver in your application's manifest and specify - * intent-filters for it, any other application can send broadcasts to it regardless - * of the filters you specify. To prevent others from sending to it, make it - * unavailable to them with android:exported="false". - *

  • When you use {@link Context#sendBroadcast(Intent)} or related methods, - * normally any other application can receive these broadcasts. You can control who - * can receive such broadcasts through permissions described below. Alternatively, - * starting with {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, you - * can also safely restrict the broadcast to a single application with - * {@link Intent#setPackage(String) Intent.setPackage} - *

+ *

For more information about using BroadcastReceiver, read the + * Broadcasts developer guide.

* - *

None of these issues exist when using - * {@link android.support.v4.content.LocalBroadcastManager}, since intents - * broadcast it never go outside of the current process. - * - *

Access permissions can be enforced by either the sender or receiver - * of a broadcast. - * - *

To enforce a permission when sending, you supply a non-null - * permission argument to - * {@link Context#sendBroadcast(Intent, String)} or - * {@link Context#sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)}. - * Only receivers who have been granted this permission - * (by requesting it with the - * {@link android.R.styleable#AndroidManifestUsesPermission <uses-permission>} - * tag in their AndroidManifest.xml) will be able to receive - * the broadcast. - * - *

To enforce a permission when receiving, you supply a non-null - * permission when registering your receiver -- either when calling - * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)} - * or in the static - * {@link android.R.styleable#AndroidManifestReceiver <receiver>} - * tag in your AndroidManifest.xml. Only broadcasters who have - * been granted this permission (by requesting it with the - * {@link android.R.styleable#AndroidManifestUsesPermission <uses-permission>} - * tag in their AndroidManifest.xml) will be able to send an - * Intent to the receiver. - * - *

See the Security and Permissions - * document for more information on permissions and security in general. - * - * - *

Receiver Lifecycle

- * - *

A BroadcastReceiver object is only valid for the duration of the call - * to {@link #onReceive}. Once your code returns from this function, - * the system considers the object to be finished and no longer active. - * - *

This has important repercussions to what you can do in an - * {@link #onReceive} implementation: anything that requires asynchronous - * operation is not available, because you will need to return from the - * function to handle the asynchronous operation, but at that point the - * BroadcastReceiver is no longer active and thus the system is free to kill - * its process before the asynchronous operation completes. - * - *

In particular, you may not show a dialog or bind to a service from - * within a BroadcastReceiver. For the former, you should instead use the - * {@link android.app.NotificationManager} API. For the latter, you can - * use {@link android.content.Context#startService Context.startService()} to - * send a command to the service. - * - * - *

Process Lifecycle

- * - *

A process that is currently executing a BroadcastReceiver (that is, - * currently running the code in its {@link #onReceive} method) is - * considered to be a foreground process and will be kept running by the - * system except under cases of extreme memory pressure. - * - *

Once you return from onReceive(), the BroadcastReceiver is no longer - * active, and its hosting process is only as important as any other application - * components that are running in it. This is especially important because if - * that process was only hosting the BroadcastReceiver (a common case for - * applications that the user has never or not recently interacted with), then - * upon returning from onReceive() the system will consider its process - * to be empty and aggressively kill it so that resources are available for other - * more important processes. - * - *

This means that for longer-running operations you will often use - * a {@link android.app.Service} in conjunction with a BroadcastReceiver to keep - * the containing process active for the entire time of your operation. */ public abstract class BroadcastReceiver { private PendingResult mPendingResult; private boolean mDebugUnregister; - + /** * State for a result that is pending for a broadcast receiver. Returned * by {@link BroadcastReceiver#goAsync() goAsync()} @@ -218,7 +54,7 @@ public abstract class BroadcastReceiver { * terminate; you must call {@link #finish()} once you are done with the * broadcast. This allows you to process the broadcast off of the main * thread of your app. - * + * *

Note on threading: the state inside of this class is not itself * thread-safe, however you can use it from any thread if you properly * sure that you do not have races. Typically this means you will hand @@ -232,14 +68,14 @@ public static class PendingResult { public static final int TYPE_REGISTERED = 1; /** @hide */ public static final int TYPE_UNREGISTERED = 2; - + final int mType; final boolean mOrderedHint; final boolean mInitialStickyHint; final IBinder mToken; final int mSendingUser; final int mFlags; - + int mResultCode; String mResultData; Bundle mResultExtras; @@ -259,7 +95,7 @@ public PendingResult(int resultCode, String resultData, Bundle resultExtras, int mSendingUser = userId; mFlags = flags; } - + /** * Version of {@link BroadcastReceiver#setResultCode(int) * BroadcastReceiver.setResultCode(int)} for @@ -331,7 +167,7 @@ public final void setResult(int code, String data, Bundle extras) { mResultData = data; mResultExtras = extras; } - + /** * Version of {@link BroadcastReceiver#getAbortBroadcast() * BroadcastReceiver.getAbortBroadcast()} for @@ -350,7 +186,7 @@ public final void abortBroadcast() { checkSynchronousHint(); mAbortBroadcast = true; } - + /** * Version of {@link BroadcastReceiver#clearAbortBroadcast() * BroadcastReceiver.clearAbortBroadcast()} for @@ -359,7 +195,7 @@ public final void abortBroadcast() { public final void clearAbortBroadcast() { mAbortBroadcast = false; } - + /** * Finish the broadcast. The current result will be sent and the * next broadcast will proceed. @@ -397,14 +233,14 @@ public final void finish() { sendFinished(mgr); } } - + /** @hide */ public void setExtrasClassLoader(ClassLoader cl) { if (mResultExtras != null) { mResultExtras.setClassLoader(cl); } } - + /** @hide */ public void sendFinished(IActivityManager am) { synchronized (this) { @@ -412,7 +248,7 @@ public void sendFinished(IActivityManager am) { throw new IllegalStateException("Broadcast already finished"); } mFinished = true; - + try { if (mResultExtras != null) { mResultExtras.setAllowFds(false); @@ -448,7 +284,7 @@ void checkSynchronousHint() { Log.e("BroadcastReceiver", e.getMessage(), e); } } - + public BroadcastReceiver() { } @@ -468,14 +304,15 @@ public BroadcastReceiver() { * *

If this BroadcastReceiver was launched through a <receiver> tag, * then the object is no longer alive after returning from this - * function. This means you should not perform any operations that - * return a result to you asynchronously -- in particular, for interacting - * with services, you should use - * {@link Context#startService(Intent)} instead of - * {@link Context#bindService(Intent, ServiceConnection, int)}. If you wish - * to interact with a service that is already running, you can use - * {@link #peekService}. - * + * function. This means you should not perform any operations that + * return a result to you asynchronously. If you need to perform any follow up + * background work, schedule a {@link android.app.job.JobService} with + * {@link android.app.job.JobScheduler}. + * + * If you wish to interact with a service that is already running and previously + * bound using {@link android.content.Context#bindService(Intent, ServiceConnection, int) bindService()}, + * you can use {@link #peekService}. + * *

The Intent filters used in {@link android.content.Context#registerReceiver} * and in application manifests are not guaranteed to be exclusive. They * are hints to the operating system about how to find suitable recipients. It is @@ -483,7 +320,7 @@ public BroadcastReceiver() { * resolution. For this reason, {@link #onReceive(Context, Intent) onReceive()} * implementations should respond only to known actions, ignoring any unexpected * Intents that they may receive. - * + * * @param context The Context in which the receiver is running. * @param intent The Intent being received. */ @@ -496,7 +333,7 @@ public BroadcastReceiver() { * responsive to the broadcast (finishing it within 10s), but does allow * the implementation to move work related to it over to another thread * to avoid glitching the main UI thread due to disk IO. - * + * * @return Returns a {@link PendingResult} representing the result of * the active broadcast. The BroadcastRecord itself is no longer active; * all data and other interaction must go through {@link PendingResult} @@ -508,15 +345,20 @@ public final PendingResult goAsync() { mPendingResult = null; return res; } - + /** - * Provide a binder to an already-running service. This method is synchronous + * Provide a binder to an already-bound service. This method is synchronous * and will not start the target service if it is not present, so it is safe * to call from {@link #onReceive}. - * + * + * For peekService() to return a non null {@link android.os.IBinder} interface + * the service must have published it before. In other words some component + * must have called {@link android.content.Context#bindService(Intent, ServiceConnection, int)} on it. + * * @param myContext The Context that had been passed to {@link #onReceive(Context, Intent)} - * @param service The Intent indicating the service you wish to use. See {@link - * Context#startService(Intent)} for more information. + * @param service Identifies the already-bound service you wish to use. See + * {@link android.content.Context#bindService(Intent, ServiceConnection, int)} + * for more information. */ public IBinder peekService(Context myContext, Intent service) { IActivityManager am = ActivityManagerNative.getDefault(); @@ -538,13 +380,13 @@ public IBinder peekService(Context myContext, Intent service) { * Activity {@link android.app.Activity#RESULT_CANCELED} and * {@link android.app.Activity#RESULT_OK} constants, though the * actual meaning of this value is ultimately up to the broadcaster. - * + * *

This method does not work with non-ordered broadcasts such * as those sent with {@link Context#sendBroadcast(Intent) * Context.sendBroadcast}

- * + * * @param code The new result code. - * + * * @see #setResult(int, String, Bundle) */ public final void setResultCode(int code) { @@ -554,7 +396,7 @@ public final void setResultCode(int code) { /** * Retrieve the current result code, as set by the previous receiver. - * + * * @return int The current result code. */ public final int getResultCode() { @@ -567,13 +409,13 @@ public final int getResultCode() { * {@link Context#sendOrderedBroadcast(Intent, String) * Context.sendOrderedBroadcast}. This is an arbitrary * string whose interpretation is up to the broadcaster. - * + * *

This method does not work with non-ordered broadcasts such * as those sent with {@link Context#sendBroadcast(Intent) * Context.sendBroadcast}

- * + * * @param data The new result data; may be null. - * + * * @see #setResult(int, String, Bundle) */ public final void setResultData(String data) { @@ -584,7 +426,7 @@ public final void setResultData(String data) { /** * Retrieve the current result data, as set by the previous receiver. * Often this is null. - * + * * @return String The current result data; may be null. */ public final String getResultData() { @@ -599,13 +441,13 @@ public final String getResultData() { * holding arbitrary data, whose interpretation is up to the * broadcaster. Can be set to null. Calling this method completely * replaces the current map (if any). - * + * *

This method does not work with non-ordered broadcasts such * as those sent with {@link Context#sendBroadcast(Intent) * Context.sendBroadcast}

- * + * * @param extras The new extra data map; may be null. - * + * * @see #setResult(int, String, Bundle) */ public final void setResultExtras(Bundle extras) { @@ -617,11 +459,11 @@ public final void setResultExtras(Bundle extras) { * Retrieve the current result extra data, as set by the previous receiver. * Any changes you make to the returned Map will be propagated to the next * receiver. - * + * * @param makeMap If true then a new empty Map will be made for you if the * current Map is null; if false you should be prepared to * receive a null Map. - * + * * @return Map The current extras map. */ public final Bundle getResultExtras(boolean makeMap) { @@ -640,11 +482,11 @@ public final Bundle getResultExtras(boolean makeMap) { * {@link Context#sendOrderedBroadcast(Intent, String) * Context.sendOrderedBroadcast}. All current result data is replaced * by the value given to this method. - * + * *

This method does not work with non-ordered broadcasts such * as those sent with {@link Context#sendBroadcast(Intent) * Context.sendBroadcast}

- * + * * @param code The new result code. Often uses the * Activity {@link android.app.Activity#RESULT_CANCELED} and * {@link android.app.Activity#RESULT_OK} constants, though the @@ -662,11 +504,11 @@ public final void setResult(int code, String data, Bundle extras) { mPendingResult.mResultData = data; mPendingResult.mResultExtras = extras; } - + /** * Returns the flag indicating whether or not this receiver should * abort the current broadcast. - * + * * @return True if the broadcast should be aborted. */ public final boolean getAbortBroadcast() { @@ -679,10 +521,10 @@ public final boolean getAbortBroadcast() { * {@link Context#sendOrderedBroadcast(Intent, String) * Context.sendOrderedBroadcast}. This will prevent * any other broadcast receivers from receiving the broadcast. It will still - * call {@link #onReceive} of the BroadcastReceiver that the caller of + * call {@link #onReceive} of the BroadcastReceiver that the caller of * {@link Context#sendOrderedBroadcast(Intent, String) * Context.sendOrderedBroadcast} passed in. - * + * *

This method does not work with non-ordered broadcasts such * as those sent with {@link Context#sendBroadcast(Intent) * Context.sendBroadcast}

@@ -691,7 +533,7 @@ public final void abortBroadcast() { checkSynchronousHint(); mPendingResult.mAbortBroadcast = true; } - + /** * Clears the flag indicating that this receiver should abort the current * broadcast. @@ -701,7 +543,7 @@ public final void clearAbortBroadcast() { mPendingResult.mAbortBroadcast = false; } } - + /** * Returns true if the receiver is currently processing an ordered * broadcast. @@ -709,7 +551,7 @@ public final void clearAbortBroadcast() { public final boolean isOrderedBroadcast() { return mPendingResult != null ? mPendingResult.mOrderedHint : false; } - + /** * Returns true if the receiver is currently processing the initial * value of a sticky broadcast -- that is, the value that was last @@ -719,7 +561,7 @@ public final boolean isOrderedBroadcast() { public final boolean isInitialStickyBroadcast() { return mPendingResult != null ? mPendingResult.mInitialStickyHint : false; } - + /** * For internal use, sets the hint about whether this BroadcastReceiver is * running in ordered mode. @@ -727,21 +569,21 @@ public final boolean isInitialStickyBroadcast() { public final void setOrderedHint(boolean isOrdered) { // Accidentally left in the SDK. } - + /** * For internal use to set the result data that is active. @hide */ public final void setPendingResult(PendingResult result) { mPendingResult = result; } - + /** * For internal use to set the result data that is active. @hide */ public final PendingResult getPendingResult() { return mPendingResult; } - + /** @hide */ public int getSendingUserId() { return mPendingResult.mSendingUser; @@ -761,19 +603,19 @@ public int getSendingUserId() { public final void setDebugUnregister(boolean debug) { mDebugUnregister = debug; } - + /** * Return the last value given to {@link #setDebugUnregister}. */ public final boolean getDebugUnregister() { return mDebugUnregister; } - + void checkSynchronousHint() { if (mPendingResult == null) { throw new IllegalStateException("Call while result is not pending"); } - + // Note that we don't assert when receiving the initial sticky value, // since that may have come from an ordered broadcast. We'll catch // them later when the real broadcast happens again. diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 1ca44e0f6339..dea1d5a60df9 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1668,7 +1668,7 @@ public boolean canStartActivityForResult() { * * @param intents An array of Intents to be started. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @throws ActivityNotFoundException   @@ -1696,7 +1696,7 @@ public boolean canStartActivityForResult() { * @param intents An array of Intents to be started. * @param options Additional options for how the Activity should be started. * @param userHandle The user for whom to launch the activities - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. * * @throws ActivityNotFoundException   @@ -1745,7 +1745,7 @@ public abstract void startIntentSender(IntentSender intent, * flagsMask * @param extraFlags Always set to 0. * @param options Additional options for how the Activity should be started. - * See {@link android.content.Context#startActivity(Intent, Bundle) + * See {@link android.content.Context#startActivity(Intent, Bundle)} * Context.startActivity(Intent, Bundle)} for more details. If options * have also been supplied by the IntentSender, options given here will * override any that conflict with those given by the IntentSender. @@ -2474,9 +2474,8 @@ public abstract Intent registerReceiverAsUser(BroadcastReceiver receiver, * for high frequency calls. *

* - * @param service Identifies the service to be started. The Intent must be either - * fully explicit (supplying a component name) or specify a specific package - * name it is targetted to. Additional values + * @param service Identifies the service to be started. The Intent must be + * fully explicit (supplying a component name). Additional values * may be included in the Intent extras to supply arguments along with * this specific start call. * @@ -2554,10 +2553,8 @@ public abstract Intent registerReceiverAsUser(BroadcastReceiver receiver, * {@link #registerReceiver}, since the lifetime of this BroadcastReceiver * is tied to another object (the one that registered it).

* - * @param service Identifies the service to connect to. The Intent may - * specify either an explicit component name, or a logical - * description (action, category, etc) to match an - * {@link IntentFilter} published by a service. + * @param service Identifies the service to connect to. The Intent must + * specify an explicit component name. * @param conn Receives information as the service is started and stopped. * This must be a valid ServiceConnection object; it must not be null. * @param flags Operation options for the binding. May be 0, diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 1d74ee90ef93..580bb6ffc94d 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -8163,7 +8163,7 @@ public void setSourceBounds(Rect r) { * @return Returns a bit mask of {@link #FILL_IN_ACTION}, * {@link #FILL_IN_DATA}, {@link #FILL_IN_CATEGORIES}, {@link #FILL_IN_PACKAGE}, * {@link #FILL_IN_COMPONENT}, {@link #FILL_IN_SOURCE_BOUNDS}, - * {@link #FILL_IN_SELECTOR} and {@link #FILL_IN_CLIP_DATA indicating which fields were + * {@link #FILL_IN_SELECTOR} and {@link #FILL_IN_CLIP_DATA} indicating which fields were * changed. */ @FillInFlags diff --git a/core/java/android/content/SyncRequest.java b/core/java/android/content/SyncRequest.java index 541ebbd32f11..74d2f114aae5 100644 --- a/core/java/android/content/SyncRequest.java +++ b/core/java/android/content/SyncRequest.java @@ -175,7 +175,7 @@ protected SyncRequest(SyncRequest.Builder b) { } /** - * Builder class for a @link SyncRequest. As you build your SyncRequest this class will also + * Builder class for a {@link SyncRequest}. As you build your SyncRequest this class will also * perform validation. */ public static class Builder { @@ -351,7 +351,7 @@ public Builder setDisallowMetered(boolean disallow) { * @param requiresCharging true if sync requires the phone to be plugged in. Default false. */ public Builder setRequiresCharging(boolean requiresCharging) { - mRequiresCharging = true; + mRequiresCharging = requiresCharging; return this; } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index a75f11167721..349684397557 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2825,6 +2825,14 @@ public abstract PermissionInfo getPermissionInfo(String name, @PermissionInfoFla public abstract List queryPermissionsByGroup(String group, @PermissionInfoFlags int flags) throws NameNotFoundException; + /** + * Returns true if Permission Review Mode is enabled, false otherwise. + * + * @hide + */ + @TestApi + public abstract boolean isPermissionReviewModeEnabled(); + /** * Retrieve all of the information we know about a particular group of * permissions. @@ -3291,7 +3299,8 @@ public abstract boolean isPermissionRevokedByPolicy(@NonNull String permName, * Grant a runtime permission to an application which the application does not * already have. The permission must have been requested by the application. * If the application is not allowed to hold the permission, a {@link - * java.lang.SecurityException} is thrown. + * java.lang.SecurityException} is thrown. If the package or permission is + * invalid, a {@link java.lang.IllegalArgumentException} is thrown. *

* Note: Using this API requires holding * android.permission.GRANT_REVOKE_PERMISSIONS and if the user id is @@ -3316,7 +3325,8 @@ public abstract void grantRuntimePermission(@NonNull String packageName, * #grantRuntimePermission(String, String, android.os.UserHandle)}. The * permission must have been requested by and granted to the application. * If the application is not allowed to hold the permission, a {@link - * java.lang.SecurityException} is thrown. + * java.lang.SecurityException} is thrown. If the package or permission is + * invalid, a {@link java.lang.IllegalArgumentException} is thrown. *

* Note: Using this API requires holding * android.permission.GRANT_REVOKE_PERMISSIONS and if the user id is diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index bdbdd1ebcf91..2133c2156359 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -192,4 +192,17 @@ public abstract void setDeviceAndProfileOwnerPackages( * which to load the paths, or null if no overlays should be used. */ public abstract void setResourceDirs(int userId, String packageName, String[] resourceDirs); + + /** + * Retrieve the official name associated with a user id. This name is + * guaranteed to never change, though it is possible for the underlying + * user id to be changed. That is, if you are storing information about + * user ids in persistent storage, you should use the string returned + * by this function instead of the raw user-id. + * + * @param uid The user id for which you would like to retrieve a name. + * @return Returns a unique name for the given user id, or null if the + * user id is not currently assigned. + */ + public abstract String getNameForUid(int uid); } 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 @@ * The following list includes descriptions for the different attributes within a static shortcut: *

*
{@code android:shortcutId}
- *
Mandatory shortcut ID
+ *
Mandatory shortcut ID. + *

+ * This must be a string literal. + * A resource string, such as @string/foo, cannot be used. + *

* *
{@code android:enabled}
*
Default is {@code true}. Can be set to {@code false} in order @@ -206,15 +210,24 @@ * *
{@code android:shortcutShortLabel}
*
Mandatory shortcut short label. - * See {@link ShortcutInfo.Builder#setShortLabel(CharSequence)}.
+ * See {@link ShortcutInfo.Builder#setShortLabel(CharSequence)}. + *

+ * This must be a resource string, such as @string/shortcut_label. + * * *

{@code android:shortcutLongLabel}
*
Shortcut long label. - * See {@link ShortcutInfo.Builder#setLongLabel(CharSequence)}.
+ * See {@link ShortcutInfo.Builder#setLongLabel(CharSequence)}. + *

+ * This must be a resource string, such as @string/shortcut_long_label. + * * *

{@code android:shortcutDisabledMessage}
*
When {@code android:enabled} is set to - * {@code false}, this attribute is used to display a custom disabled message.
+ * {@code false}, this attribute is used to display a custom disabled message. + *

+ * This must be a resource string, such as @string/shortcut_disabled_message. + * * *

{@code intent}
*
Intent to launch when the user selects the shortcut. diff --git a/core/java/android/hardware/display/DisplayManagerInternal.java b/core/java/android/hardware/display/DisplayManagerInternal.java index 13ba6cc37d22..c915b18b8a80 100644 --- a/core/java/android/hardware/display/DisplayManagerInternal.java +++ b/core/java/android/hardware/display/DisplayManagerInternal.java @@ -167,6 +167,8 @@ public static final class DisplayPowerRequest { public static final int POLICY_DIM = 2; // Policy: Make the screen bright as usual. public static final int POLICY_BRIGHT = 3; + // Policy: Keep the screen and display optimized for VR mode. + public static final int POLICY_VR = 4; // The basic overall policy to apply: off, doze, dim or bright. public int policy; @@ -211,9 +213,6 @@ public static final class DisplayPowerRequest { public int dozeScreenBrightness; public int dozeScreenState; - // If true, use twilight to affect the brightness. - public boolean useTwilight; - public DisplayPowerRequest() { policy = POLICY_BRIGHT; useProximitySensor = false; @@ -233,6 +232,10 @@ public boolean isBrightOrDim() { return policy == POLICY_BRIGHT || policy == POLICY_DIM; } + public boolean isVr() { + return policy == POLICY_VR; + } + public void copyFrom(DisplayPowerRequest other) { policy = other.policy; useProximitySensor = other.useProximitySensor; @@ -245,7 +248,6 @@ public void copyFrom(DisplayPowerRequest other) { boostScreenBrightness = other.boostScreenBrightness; dozeScreenBrightness = other.dozeScreenBrightness; dozeScreenState = other.dozeScreenState; - useTwilight = other.useTwilight; } @Override @@ -266,8 +268,7 @@ public boolean equals(DisplayPowerRequest other) { && lowPowerMode == other.lowPowerMode && boostScreenBrightness == other.boostScreenBrightness && dozeScreenBrightness == other.dozeScreenBrightness - && dozeScreenState == other.dozeScreenState - && useTwilight == other.useTwilight; + && dozeScreenState == other.dozeScreenState; } @Override @@ -287,8 +288,7 @@ public String toString() { + ", lowPowerMode=" + lowPowerMode + ", boostScreenBrightness=" + boostScreenBrightness + ", dozeScreenBrightness=" + dozeScreenBrightness - + ", dozeScreenState=" + Display.stateToString(dozeScreenState) - + ", useTwilight=" + useTwilight; + + ", dozeScreenState=" + Display.stateToString(dozeScreenState); } public static String policyToString(int policy) { @@ -301,6 +301,8 @@ public static String policyToString(int policy) { return "DIM"; case POLICY_BRIGHT: return "BRIGHT"; + case POLICY_VR: + return "VR"; default: return Integer.toString(policy); } diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index f17fd55bd22a..c5ae1f54aed6 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -710,7 +710,7 @@ public boolean isHardwareDetected() { /** * Retrieves the authenticator token for binding keys to the lifecycle - * of the current set of fingerprints. Used only by internal clients. + * of the calling user's fingerprints. Used only by internal clients. * * @hide */ diff --git a/core/java/android/hardware/usb/IUsbManager.aidl b/core/java/android/hardware/usb/IUsbManager.aidl index 6e4c9de1c8ef..00b0bffdd1f5 100644 --- a/core/java/android/hardware/usb/IUsbManager.aidl +++ b/core/java/android/hardware/usb/IUsbManager.aidl @@ -87,15 +87,13 @@ interface IUsbManager /* Returns true if the specified USB function is enabled. */ boolean isFunctionEnabled(String function); - /* Sets the current USB function. */ - void setCurrentFunction(String function); - - /* Sets whether USB data (for example, MTP exposed pictures) should be made - * available on the USB connection. Unlocking data should only be done with - * user involvement, since exposing pictures or other data could leak sensitive - * user information. + /* Sets the current USB function as well as whether USB data + * (for example, MTP exposed pictures) should be made available + * on the USB connection. Unlocking data should only be done with + * user involvement, since exposing pictures or other data could + * leak sensitive user information. */ - void setUsbDataUnlocked(boolean unlock); + void setCurrentFunction(String function, boolean usbDataUnlocked); /* Allow USB debugging from the attached host. If alwaysAllow is true, add the * the public key to list of host keys that the user has approved. diff --git a/core/java/android/hardware/usb/UsbEndpoint.java b/core/java/android/hardware/usb/UsbEndpoint.java index 708d651a58ae..c346700a979f 100644 --- a/core/java/android/hardware/usb/UsbEndpoint.java +++ b/core/java/android/hardware/usb/UsbEndpoint.java @@ -75,8 +75,8 @@ public int getEndpointNumber() { * if the direction is host to device, and * {@link UsbConstants#USB_DIR_IN} if the * direction is device to host. - * @see {@link UsbConstants#USB_DIR_IN} - * @see {@link UsbConstants#USB_DIR_OUT} + * @see UsbConstants#USB_DIR_IN + * @see UsbConstants#USB_DIR_OUT * * @return the endpoint's direction */ diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index e23eb7423d52..ed09994eb5a3 100755 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -538,33 +538,23 @@ public boolean isFunctionEnabled(String function) { * {@link #USB_FUNCTION_MIDI}, {@link #USB_FUNCTION_MTP}, {@link #USB_FUNCTION_PTP}, * or {@link #USB_FUNCTION_RNDIS}. *

+ * Also sets whether USB data (for example, MTP exposed pictures) should be made available + * on the USB connection when in device mode. Unlocking usb data should only be done with + * user involvement, since exposing pictures or other data could leak sensitive + * user information. + *

* Note: This function is asynchronous and may fail silently without applying * the requested changes. *

* * @param function name of the USB function, or null to restore the default function + * @param usbDataUnlocked whether user data is accessible * * {@hide} */ - public void setCurrentFunction(String function) { - try { - mService.setCurrentFunction(function); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - - /** - * Sets whether USB data (for example, MTP exposed pictures) should be made available - * on the USB connection when in device mode. Unlocking usb data should only be done with - * user involvement, since exposing pictures or other data could leak sensitive - * user information. - * - * {@hide} - */ - public void setUsbDataUnlocked(boolean unlocked) { + public void setCurrentFunction(String function, boolean usbDataUnlocked) { try { - mService.setUsbDataUnlocked(unlocked); + mService.setCurrentFunction(function, usbDataUnlocked); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index fede77d9bb1d..9a6f804272b8 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -2370,16 +2370,16 @@ public boolean onExtractTextContextMenuItem(int id) { } return true; } - + /** * Return text that can be used as a button label for the given * {@link EditorInfo#imeOptions EditorInfo.imeOptions}. Returns null * if there is no action requested. Note that there is no guarantee that * the returned text will be relatively short, so you probably do not * want to use it as text on a soft keyboard key label. - * - * @param imeOptions The value from @link EditorInfo#imeOptions EditorInfo.imeOptions}. - * + * + * @param imeOptions The value from {@link EditorInfo#imeOptions EditorInfo.imeOptions}. + * * @return Returns a label to use, or null if there is no action. */ public CharSequence getTextForImeAction(int imeOptions) { diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 0afb546aa4e4..2b5afa725de6 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -87,6 +87,13 @@ public class ConnectivityManager { * sent as an extra; it should be consulted to see what kind of * connectivity event occurred. *

+ * Apps targeting Android 7.0 (API level 24) and higher do not receive this + * broadcast if they declare the broadcast receiver in their manifest. Apps + * will still receive broadcasts if they register their + * {@link android.content.BroadcastReceiver} with + * {@link android.content.Context#registerReceiver Context.registerReceiver()} + * and that context is still valid. + *

* If this is a connection that was the result of failing over from a * disconnected network, then the FAILOVER_CONNECTION boolean extra is * set to true. @@ -222,6 +229,13 @@ public class ConnectivityManager { */ public static final String EXTRA_CAPTIVE_PORTAL_URL = "android.net.extra.CAPTIVE_PORTAL_URL"; + /** + * Key for passing a user agent string to the captive portal login activity. + * {@hide} + */ + public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = + "android.net.extra.CAPTIVE_PORTAL_USER_AGENT"; + /** * Broadcast action to indicate the change of data activity status * (idle or active) on a network in a recent period. diff --git a/core/java/android/net/IIpConnectivityMetrics.aidl b/core/java/android/net/IIpConnectivityMetrics.aidl index 8f634bbf0cc9..6f07b3153833 100644 --- a/core/java/android/net/IIpConnectivityMetrics.aidl +++ b/core/java/android/net/IIpConnectivityMetrics.aidl @@ -18,12 +18,23 @@ package android.net; import android.os.Parcelable; import android.net.ConnectivityMetricsEvent; +import android.net.INetdEventCallback; /** {@hide} */ interface IIpConnectivityMetrics { /** - * @return number of remaining available slots in buffer. + * @return the number of remaining available slots in buffer, + * or -1 if the event was dropped due to rate limiting. */ int logEvent(in ConnectivityMetricsEvent event); + + /** + * At most one callback can be registered (by DevicePolicyManager). + * @return status {@code true} if registering/unregistering of the callback was successful, + * {@code false} otherwise (might happen if IIpConnectivityMetrics is not available, + * if it happens make sure you call it when the service is up in the caller) + */ + boolean registerNetdEventCallback(in INetdEventCallback callback); + boolean unregisterNetdEventCallback(); } diff --git a/core/java/android/net/INetdEventCallback.aidl b/core/java/android/net/INetdEventCallback.aidl new file mode 100644 index 000000000000..49436beadc51 --- /dev/null +++ b/core/java/android/net/INetdEventCallback.aidl @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net; + +/** {@hide} */ +oneway interface INetdEventCallback { + + /** + * Reports a single DNS lookup function call. + * This method must not block or perform long-running operations. + * + * @param hostname the name that was looked up. + * @param ipAddresses (possibly a subset of) the IP addresses returned. + * At most {@link #DNS_REPORTED_IP_ADDRESSES_LIMIT} addresses are logged. + * @param ipAddressesCount the number of IP addresses returned. May be different from the length + * of ipAddresses if there were too many addresses to log. + * @param timestamp the timestamp at which the query was reported by netd. + * @param uid the UID of the application that performed the query. + */ + void onDnsEvent(String hostname, in String[] ipAddresses, int ipAddressesCount, long timestamp, + int uid); + + /** + * Reports a single connect library call. + * This method must not block or perform long-running operations. + * + * @param ipAddr destination IP address. + * @param port destination port number. + * @param timestamp the timestamp at which the call was reported by netd. + * @param uid the UID of the application that performed the connection. + */ + void onConnectEvent(String ipAddr, int port, long timestamp, int uid); +} diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java index 35e3065b078f..a677d7342dad 100644 --- a/core/java/android/net/NetworkUtils.java +++ b/core/java/android/net/NetworkUtils.java @@ -51,6 +51,17 @@ public class NetworkUtils { */ public native static void attachRaFilter(FileDescriptor fd, int packetType) throws SocketException; + /** + * Attaches a socket filter that accepts L2-L4 signaling traffic required for IP connectivity. + * + * This includes: all ARP, ICMPv6 RS/RA/NS/NA messages, and DHCPv4 exchanges. + * + * @param fd the socket's {@link FileDescriptor}. + * @param packetType the hardware address type, one of ARPHRD_*. + */ + public native static void attachControlPacketFilter(FileDescriptor fd, int packetType) + throws SocketException; + /** * Configures a socket for receiving ICMPv6 router solicitations and sending advertisements. * @param fd the socket's {@link FileDescriptor}. diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java index 4fb189e85c18..3fd40428efbe 100644 --- a/core/java/android/net/Uri.java +++ b/core/java/android/net/Uri.java @@ -1746,8 +1746,8 @@ public boolean getBooleanQueryParameter(String key, boolean defaultValue) { * begin with and a scheme component cannot be found. * * @return normalized Uri (never null) - * @see {@link android.content.Intent#setData} - * @see {@link android.content.Intent#setDataAndNormalize} + * @see android.content.Intent#setData + * @see android.content.Intent#setDataAndNormalize */ public Uri normalizeScheme() { String scheme = getScheme(); diff --git a/core/java/android/net/metrics/DnsEvent.java b/core/java/android/net/metrics/DnsEvent.java index 4fc6b7aaf842..6176b2c58deb 100644 --- a/core/java/android/net/metrics/DnsEvent.java +++ b/core/java/android/net/metrics/DnsEvent.java @@ -21,7 +21,7 @@ import android.os.Parcelable; /** - * An event recorded by DnsEventListenerService. + * A DNS event recorded by NetdEventListenerService. * {@hide} */ @SystemApi 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 String toString() { final static class Decoder { static final SparseArray 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/net/metrics/NetworkEvent.java b/core/java/android/net/metrics/NetworkEvent.java index 3b3fa6976fc9..06674950a044 100644 --- a/core/java/android/net/metrics/NetworkEvent.java +++ b/core/java/android/net/metrics/NetworkEvent.java @@ -41,6 +41,15 @@ public final class NetworkEvent implements Parcelable { public static final int NETWORK_UNLINGER = 6; public static final int NETWORK_DISCONNECTED = 7; + /** {@hide} */ + public static final int NETWORK_FIRST_VALIDATION_SUCCESS = 8; + /** {@hide} */ + public static final int NETWORK_REVALIDATION_SUCCESS = 9; + /** {@hide} */ + public static final int NETWORK_FIRST_VALIDATION_PORTAL_FOUND = 10; + /** {@hide} */ + public static final int NETWORK_REVALIDATION_PORTAL_FOUND = 11; + /** {@hide} */ @IntDef(value = { NETWORK_CONNECTED, @@ -50,6 +59,10 @@ public final class NetworkEvent implements Parcelable { NETWORK_LINGER, NETWORK_UNLINGER, NETWORK_DISCONNECTED, + NETWORK_FIRST_VALIDATION_SUCCESS, + NETWORK_REVALIDATION_SUCCESS, + NETWORK_FIRST_VALIDATION_PORTAL_FOUND, + NETWORK_REVALIDATION_PORTAL_FOUND, }) @Retention(RetentionPolicy.SOURCE) public @interface EventType {} diff --git a/core/java/android/net/metrics/ValidationProbeEvent.java b/core/java/android/net/metrics/ValidationProbeEvent.java index 1a31b56f1ffb..a724ec12ed32 100644 --- a/core/java/android/net/metrics/ValidationProbeEvent.java +++ b/core/java/android/net/metrics/ValidationProbeEvent.java @@ -44,10 +44,8 @@ public final class ValidationProbeEvent implements Parcelable { public static final int DNS_FAILURE = 0; public static final int DNS_SUCCESS = 1; - /** {@hide} */ - @IntDef(value = {PROBE_DNS, PROBE_HTTP, PROBE_HTTPS, PROBE_PAC}) - @Retention(RetentionPolicy.SOURCE) - public @interface ProbeType {} + private static final int FIRST_VALIDATION = 1 << 8; + private static final int REVALIDATION = 2 << 8; /** {@hide} */ @IntDef(value = {DNS_FAILURE, DNS_SUCCESS}) @@ -56,12 +54,17 @@ public final class ValidationProbeEvent implements Parcelable { public final int netId; public final long durationMs; - public final @ProbeType int probeType; + // probeType byte format (MSB to LSB): + // byte 0: unused + // byte 1: unused + // byte 2: 0 = UNKNOWN, 1 = FIRST_VALIDATION, 2 = REVALIDATION + // byte 3: PROBE_* constant + public final int probeType; public final @ReturnCode int returnCode; /** {@hide} */ public ValidationProbeEvent( - int netId, long durationMs, @ProbeType int probeType, @ReturnCode int returnCode) { + int netId, long durationMs, int probeType, @ReturnCode int returnCode) { this.netId = netId; this.durationMs = durationMs; this.probeType = probeType; @@ -99,9 +102,19 @@ public ValidationProbeEvent[] newArray(int size) { } }; + /** @hide */ + public static int makeProbeType(int probeType, boolean firstValidation) { + return (probeType & 0xff) | (firstValidation ? FIRST_VALIDATION : REVALIDATION); + } + /** @hide */ public static String getProbeName(int probeType) { - return Decoder.constants.get(probeType, "PROBE_???"); + return Decoder.constants.get(probeType & 0xff, "PROBE_???"); + } + + /** @hide */ + public static String getValidationStage(int probeType) { + return Decoder.constants.get(probeType & 0xff00, "UNKNOWN"); } public static void logEvent(int netId, long durationMs, int probeType, int returnCode) { @@ -109,12 +122,13 @@ public static void logEvent(int netId, long durationMs, int probeType, int retur @Override public String toString() { - return String.format("ValidationProbeEvent(%d, %s:%d, %dms)", - netId, getProbeName(probeType), returnCode, durationMs); + return String.format("ValidationProbeEvent(%d, %s:%d %s, %dms)", netId, + getProbeName(probeType), returnCode, getValidationStage(probeType), durationMs); } final static class Decoder { static final SparseArray constants = MessageUtils.findMessageNames( - new Class[]{ValidationProbeEvent.class}, new String[]{"PROBE_"}); + new Class[]{ValidationProbeEvent.class}, + new String[]{"PROBE_", "FIRST_", "REVALIDATION"}); } } diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index a0c2efd407ba..0bb05b5a22a2 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -182,7 +182,7 @@ public abstract class BatteryStats implements Parcelable { * New in version 19: * - Wakelock data (wl) gets current and max times. */ - static final String CHECKIN_VERSION = "19"; + static final String CHECKIN_VERSION = "20"; /** * Old version, we hit 9 and ran out of room, need to remove. diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java new file mode 100644 index 000000000000..e4cdbce09796 --- /dev/null +++ b/core/java/android/os/GraphicsEnvironment.java @@ -0,0 +1,112 @@ +/* + * Copyright 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.os; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.opengl.EGL14; +import android.os.SystemProperties; +import android.util.Log; + +import dalvik.system.VMRuntime; + +import java.io.File; + +/** @hide */ +public final class GraphicsEnvironment { + + private static final boolean DEBUG = false; + private static final String TAG = "GraphicsEnvironment"; + private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; + + public static void setupGraphicsEnvironment(Context context) { + chooseDriver(context); + + // Now that we've figured out which driver to use for this process, load and initialize it. + // This can take multiple frame periods, and it would otherwise happen as part of the first + // frame, increasing first-frame latency. Starting it here, as a low-priority background + // thread, means that it's usually done long before we start drawing the first frame, + // without significantly disrupting other activity launch work. + Thread eglInitThread = new Thread( + () -> { + EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); + }, + "EGL Init"); + eglInitThread.start(); + } + + private static void chooseDriver(Context context) { + String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); + if (driverPackageName == null || driverPackageName.isEmpty()) { + return; + } + // To minimize risk of driver updates crippling the device beyond user repair, never use an + // updated driver for privileged or non-updated system apps. Presumably pre-installed apps + // were tested thoroughly with the pre-installed driver. + ApplicationInfo ai = context.getApplicationInfo(); + if (ai.isPrivilegedApp() || (ai.isSystemApp() && !ai.isUpdatedSystemApp())) { + if (DEBUG) Log.v(TAG, "ignoring driver package for privileged/non-updated system app"); + return; + } + ApplicationInfo driverInfo; + try { + driverInfo = context.getPackageManager().getApplicationInfo(driverPackageName, + PackageManager.MATCH_SYSTEM_ONLY); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "driver package '" + driverPackageName + "' not installed"); + return; + } + String abi = chooseAbi(driverInfo); + if (abi == null) { + if (DEBUG) { + // This is the normal case for the pre-installed empty driver package, don't spam + if (driverInfo.isUpdatedSystemApp()) { + Log.w(TAG, "updated driver package has no compatible native libraries"); + } + } + return; + } + + StringBuilder sb = new StringBuilder(); + sb.append(driverInfo.nativeLibraryDir) + .append(File.pathSeparator); + sb.append(driverInfo.sourceDir) + .append("!/lib/") + .append(abi); + String paths = sb.toString(); + + if (DEBUG) Log.v(TAG, "gfx driver package libs: " + paths); + setDriverPath(paths); + } + + private static String chooseAbi(ApplicationInfo ai) { + String isa = VMRuntime.getCurrentInstructionSet(); + if (ai.primaryCpuAbi != null && + isa.equals(VMRuntime.getInstructionSet(ai.primaryCpuAbi))) { + return ai.primaryCpuAbi; + } + if (ai.secondaryCpuAbi != null && + isa.equals(VMRuntime.getInstructionSet(ai.secondaryCpuAbi))) { + return ai.secondaryCpuAbi; + } + return null; + } + + private static native void setDriverPath(String path); + +} diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index eeb641d33c20..394866941d43 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -82,4 +82,7 @@ interface IUserManager { boolean someUserHasSeedAccount(in String accountName, in String accountType); boolean isManagedProfile(int userId); boolean isDemoUser(int userId); + boolean isUserUnlocked(int userId); + boolean isUserUnlockingOrUnlocked(int userId); + boolean isUserRunning(int userId); } diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index e71c816be39a..5405e2199c9a 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -49,23 +49,23 @@ * These levels are mutually exclusive - you may only specify one of them. * * - * + * * * * - * + * * - * + * * - * + * * * * - * + * * - * + * * - * + * * *
Flag Value
Flag ValueCPU Screen Keyboard
{@link #PARTIAL_WAKE_LOCK}On* Off OffOn* Off Off
{@link #SCREEN_DIM_WAKE_LOCK}On Dim OffOn Dim Off
{@link #SCREEN_BRIGHT_WAKE_LOCK}On Bright OffOn Bright Off
{@link #FULL_WAKE_LOCK}On Bright BrightOn Bright Bright
*

@@ -85,13 +85,13 @@ * the illumination to remain on once it turns on (e.g. from user activity). This flag * will force the screen and/or keyboard to turn on immediately, when the WakeLock is * acquired. A typical use would be for notifications which are important for the user to - * see immediately. + * see immediately. * - * + * * {@link #ON_AFTER_RELEASE} * If this flag is set, the user activity timer will be reset when the WakeLock is - * released, causing the illumination to remain on a bit longer. This can be used to - * reduce flicker if you are cycling between wake lock conditions. + * released, causing the illumination to remain on a bit longer. This can be used to + * reduce flicker if you are cycling between wake lock conditions. * * *

@@ -473,12 +473,32 @@ public int getDefaultScreenBrightnessSetting() { } /** - * Returns true if the twilight service should be used to adjust screen brightness - * policy. This setting is experimental and disabled by default. + * Gets the minimum supported screen brightness setting for VR Mode. + * @hide + */ + public int getMinimumScreenBrightnessForVrSetting() { + return mContext.getResources().getInteger( + com.android.internal.R.integer.config_screenBrightnessForVrSettingMinimum); + } + + /** + * Gets the maximum supported screen brightness setting for VR Mode. + * The screen may be allowed to become dimmer than this value but + * this is the maximum value that can be set by the user. * @hide */ - public static boolean useTwilightAdjustmentFeature() { - return SystemProperties.getBoolean("persist.power.usetwilightadj", false); + public int getMaximumScreenBrightnessForVrSetting() { + return mContext.getResources().getInteger( + com.android.internal.R.integer.config_screenBrightnessForVrSettingMaximum); + } + + /** + * Gets the default screen brightness for VR setting. + * @hide + */ + public int getDefaultScreenBrightnessForVrSetting() { + return mContext.getResources().getInteger( + com.android.internal.R.integer.config_screenBrightnessForVrSettingDefault); } /** diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index c36b48886f37..287092320921 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -1432,9 +1432,6 @@ void handleViolation(final ViolationInfo info) { if (violations == null) { violations = new ArrayList(1); gatheredViolations.set(violations); - } else if (violations.size() >= 5) { - // Too many. In a loop or something? Don't gather them all. - return; } for (ViolationInfo previous : violations) { if (info.crashInfo.stackTrace.equals(previous.crashInfo.stackTrace)) { @@ -1931,18 +1928,14 @@ public static void onVmPolicyViolation(String message, Throwable originStack, if (violations == null) { p.writeInt(0); } else { - p.writeInt(violations.size()); - for (int i = 0; i < violations.size(); ++i) { - int start = p.dataPosition(); - violations.get(i).writeToParcel(p, 0 /* unused flags? */); - int size = p.dataPosition()-start; - if (size > 10*1024) { - Slog.d(TAG, "Wrote violation #" + i + " of " + violations.size() + ": " - + (p.dataPosition()-start) + " bytes"); - } + // To avoid taking up too much transaction space, only include + // details for the first 3 violations. Deep inside, CrashInfo + // will truncate each stack trace to ~20kB. + final int size = Math.min(violations.size(), 3); + p.writeInt(size); + for (int i = 0; i < size; i++) { + violations.get(i).writeToParcel(p, 0); } - if (LOG_V) Log.d(TAG, "wrote violations to response parcel; num=" + violations.size()); - violations.clear(); // somewhat redundant, as we're about to null the threadlocal } gatheredViolations.set(null); } @@ -1956,40 +1949,19 @@ private static class LogStackTrace extends Exception {} /* package */ static void readAndHandleBinderCallViolations(Parcel p) { // Our own stack trace to append StringWriter sw = new StringWriter(); + sw.append("# via Binder call with stack:\n"); PrintWriter pw = new FastPrintWriter(sw, false, 256); new LogStackTrace().printStackTrace(pw); pw.flush(); String ourStack = sw.toString(); - int policyMask = getThreadPolicyMask(); - boolean currentlyGathering = (policyMask & PENALTY_GATHER) != 0; - - int numViolations = p.readInt(); - for (int i = 0; i < numViolations; ++i) { - if (LOG_V) Log.d(TAG, "strict mode violation stacks read from binder call. i=" + i); - ViolationInfo info = new ViolationInfo(p, !currentlyGathering); - if (info.crashInfo.stackTrace != null && info.crashInfo.stackTrace.length() > 30000) { - String front = info.crashInfo.stackTrace.substring(0, 256); - // 30000 characters is way too large for this to be any sane kind of - // strict mode collection of stacks. We've had a problem where we leave - // strict mode violations associated with the thread, and it keeps tacking - // more and more stacks on to the violations. Looks like we're in this casse, - // so we'll report it and bail on all of the current strict mode violations - // we currently are maintaining for this thread. - // First, drain the remaining violations from the parcel. - i++; // Skip the current entry. - for (; i < numViolations; i++) { - info = new ViolationInfo(p, !currentlyGathering); - } - // Next clear out all gathered violations. - clearGatheredViolations(); - // Now report the problem. - Slog.wtfStack(TAG, "Stack is too large: numViolations=" + numViolations - + " policy=#" + Integer.toHexString(policyMask) - + " front=" + front); - return; - } - info.crashInfo.stackTrace += "# via Binder call with stack:\n" + ourStack; + final int policyMask = getThreadPolicyMask(); + final boolean currentlyGathering = (policyMask & PENALTY_GATHER) != 0; + + final int size = p.readInt(); + for (int i = 0; i < size; i++) { + final ViolationInfo info = new ViolationInfo(p, !currentlyGathering); + info.crashInfo.appendStackTrace(ourStack); BlockGuard.Policy policy = BlockGuard.getThreadPolicy(); if (policy instanceof AndroidBlockGuardPolicy) { ((AndroidBlockGuardPolicy) policy).handleViolationWithTimingAttempt(info); @@ -2320,7 +2292,7 @@ public static void decrementExpectedActivityCount(Class klass) { * @hide */ public static class ViolationInfo { - public String message; + public final String message; /** * Stack and other stuff info. @@ -2379,6 +2351,7 @@ public static class ViolationInfo { * Create an uninitialized instance of ViolationInfo */ public ViolationInfo() { + message = null; crashInfo = null; policy = 0; } @@ -2425,7 +2398,9 @@ public ViolationInfo(String message, Throwable tr, int policy) { @Override public int hashCode() { int result = 17; - result = 37 * result + crashInfo.stackTrace.hashCode(); + if (crashInfo != null) { + result = 37 * result + crashInfo.stackTrace.hashCode(); + } if (numAnimationsRunning != 0) { result *= 37; } @@ -2455,7 +2430,11 @@ public ViolationInfo(Parcel in) { */ public ViolationInfo(Parcel in, boolean unsetGatheringBit) { message = in.readString(); - crashInfo = new ApplicationErrorReport.CrashInfo(in); + if (in.readInt() != 0) { + crashInfo = new ApplicationErrorReport.CrashInfo(in); + } else { + crashInfo = null; + } int rawPolicy = in.readInt(); if (unsetGatheringBit) { policy = rawPolicy & ~PENALTY_GATHER; @@ -2476,7 +2455,12 @@ public ViolationInfo(Parcel in, boolean unsetGatheringBit) { */ public void writeToParcel(Parcel dest, int flags) { dest.writeString(message); - crashInfo.writeToParcel(dest, flags); + if (crashInfo != null) { + dest.writeInt(1); + crashInfo.writeToParcel(dest, flags); + } else { + dest.writeInt(0); + } int start = dest.dataPosition(); dest.writeInt(policy); dest.writeInt(durationMillis); @@ -2504,7 +2488,9 @@ public void writeToParcel(Parcel dest, int flags) { * Dump a ViolationInfo instance to a Printer. */ public void dump(Printer pw, String prefix) { - crashInfo.dump(pw, prefix); + if (crashInfo != null) { + crashInfo.dump(pw, prefix); + } pw.println(prefix + "policy: " + policy); if (durationMillis != -1) { pw.println(prefix + "durationMillis: " + durationMillis); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 03d3cf2e70f4..85b010a6a8f3 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -960,9 +960,8 @@ public boolean isUserRunning(UserHandle user) { /** {@hide} */ public boolean isUserRunning(int userId) { - // TODO Switch to using UMS internal isUserRunning try { - return ActivityManagerNative.getDefault().isUserRunning(userId, 0); + return mService.isUserRunning(userId); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } @@ -1059,8 +1058,7 @@ public boolean isUserUnlocked(UserHandle user) { /** {@hide} */ public boolean isUserUnlocked(@UserIdInt int userId) { try { - return ActivityManagerNative.getDefault().isUserRunning(userId, - ActivityManager.FLAG_AND_UNLOCKED); + return mService.isUserUnlocked(userId); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } @@ -1073,10 +1071,8 @@ public boolean isUserUnlockingOrUnlocked(UserHandle user) { /** {@hide} */ public boolean isUserUnlockingOrUnlocked(@UserIdInt int userId) { - // TODO Switch to using UMS internal isUserUnlockingOrUnlocked try { - return ActivityManagerNative.getDefault().isUserRunning(userId, - ActivityManager.FLAG_AND_UNLOCKING_OR_UNLOCKED); + return mService.isUserUnlockingOrUnlocked(userId); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } diff --git a/core/java/android/os/UserManagerInternal.java b/core/java/android/os/UserManagerInternal.java index 93afb4376cf2..e42704ca2141 100644 --- a/core/java/android/os/UserManagerInternal.java +++ b/core/java/android/os/UserManagerInternal.java @@ -134,6 +134,12 @@ public abstract void setBaseUserRestrictionsByDpmsForMigration(int userId, */ public abstract boolean isUserUnlockingOrUnlocked(int userId); + /** + * Return whether the given user is running in an + * {@code UserState.STATE_RUNNING_UNLOCKED} state. + */ + public abstract boolean isUserUnlocked(int userId); + /** * Return whether the given user is running */ diff --git a/core/java/android/preference/Preference.java b/core/java/android/preference/Preference.java index b1cad0538d31..ec1e102c9289 100644 --- a/core/java/android/preference/Preference.java +++ b/core/java/android/preference/Preference.java @@ -719,6 +719,9 @@ public void setIcon(@DrawableRes int iconResId) { * @see #setIcon(Drawable) */ public Drawable getIcon() { + if (mIcon == null && mIconResId != 0) { + mIcon = getContext().getDrawable(mIconResId); + } return mIcon; } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 033314b30e7e..2f71b86d1d04 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2758,6 +2758,15 @@ public boolean validate(String value) { private static final Validator SCREEN_BRIGHTNESS_VALIDATOR = new InclusiveIntegerRangeValidator(0, 255); + /** + * The screen backlight brightness between 0 and 255. + * @hide + */ + public static final String SCREEN_BRIGHTNESS_FOR_VR = "screen_brightness_for_vr"; + + private static final Validator SCREEN_BRIGHTNESS_FOR_VR_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 255); + /** * Control whether to enable automatic brightness mode. */ @@ -3774,6 +3783,7 @@ public boolean validate(String value) { VALIDATORS.put(DIM_SCREEN, DIM_SCREEN_VALIDATOR); VALIDATORS.put(SCREEN_OFF_TIMEOUT, SCREEN_OFF_TIMEOUT_VALIDATOR); VALIDATORS.put(SCREEN_BRIGHTNESS, SCREEN_BRIGHTNESS_VALIDATOR); + VALIDATORS.put(SCREEN_BRIGHTNESS_FOR_VR, SCREEN_BRIGHTNESS_FOR_VR_VALIDATOR); VALIDATORS.put(SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_VALIDATOR); VALIDATORS.put(MODE_RINGER_STREAMS_AFFECTED, MODE_RINGER_STREAMS_AFFECTED_VALIDATOR); VALIDATORS.put(MUTE_STREAMS_AFFECTED, MUTE_STREAMS_AFFECTED_VALIDATOR); @@ -5388,6 +5398,13 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val */ public static final String LONG_PRESS_TIMEOUT = "long_press_timeout"; + /** + * The duration in milliseconds between the first tap's up event and the second tap's + * down event for an interaction to be considered part of the same multi-press. + * @hide + */ + public static final String MULTI_PRESS_TIMEOUT = "multi_press_timeout"; + /** * List of the enabled print services. * @@ -5960,6 +5977,36 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val public static final int INCALL_POWER_BUTTON_BEHAVIOR_DEFAULT = INCALL_POWER_BUTTON_BEHAVIOR_SCREEN_OFF; + /** + * What happens when the user presses the Back button while in-call + * and the screen is on.
+ * Values:
+ * 0 - The Back buttons does nothing different.
+ * 1 - The Back button hangs up the current call.
+ * + * @hide + */ + public static final String INCALL_BACK_BUTTON_BEHAVIOR = "incall_back_button_behavior"; + + /** + * INCALL_BACK_BUTTON_BEHAVIOR value for no action. + * @hide + */ + public static final int INCALL_BACK_BUTTON_BEHAVIOR_NONE = 0x0; + + /** + * INCALL_BACK_BUTTON_BEHAVIOR value for "hang up". + * @hide + */ + public static final int INCALL_BACK_BUTTON_BEHAVIOR_HANGUP = 0x1; + + /** + * INCALL_POWER_BUTTON_BEHAVIOR default value. + * @hide + */ + public static final int INCALL_BACK_BUTTON_BEHAVIOR_DEFAULT = + INCALL_BACK_BUTTON_BEHAVIOR_NONE; + /** * Whether the device should wake when the wake gesture sensor detects motion. * @hide @@ -6151,6 +6198,14 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications"; + /** + * This preference stores the last stack active task time for each user, which affects what + * tasks will be visible in Overview. + * @hide + */ + public static final String OVERVIEW_LAST_STACK_ACTIVE_TIME = + "overview_last_stack_active_time"; + /** * List of TV inputs that are currently hidden. This is a string * containing the IDs of all hidden TV inputs. Each ID is encoded by @@ -6257,12 +6312,6 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val */ public static final String NIGHT_DISPLAY_CUSTOM_END_TIME = "night_display_custom_end_time"; - /** - * Whether brightness should automatically adjust based on twilight state. - * @hide - */ - public static final String BRIGHTNESS_USE_TWILIGHT = "brightness_use_twilight"; - /** * Names of the service components that the current user has explicitly allowed to * be a VR mode listener, separated by ':'. @@ -6388,6 +6437,12 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val */ public static final String WEB_ACTION_ENABLED = "web_action_enabled"; + /** + * Has this pairable device been paired or upgraded from a previously paired system. + * @hide + */ + public static final String DEVICE_PAIRED = "device_paired"; + /** * This are the settings to be backed up. * @@ -6472,7 +6527,8 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val QS_TILES, DOZE_ENABLED, DOZE_PULSE_ON_PICK_UP, - DOZE_PULSE_ON_DOUBLE_TAP + DOZE_PULSE_ON_DOUBLE_TAP, + NFC_PAYMENT_DEFAULT_COMPONENT }; /** @@ -6852,6 +6908,12 @@ public static final class Global extends NameValueTable { */ public static final String DOCK_SOUNDS_ENABLED = "dock_sounds_enabled"; + /** + * Whether to play a sound for dock events, only when an accessibility service is on. + * @hide + */ + public static final String DOCK_SOUNDS_ENABLED_WHEN_ACCESSIBILITY = "dock_sounds_enabled_when_accessbility"; + /** * URI for the "device locked" (keyguard shown) sound. * @hide @@ -7146,6 +7208,13 @@ public static final class Global extends NameValueTable { */ public static final String MOBILE_DATA_ALWAYS_ON = "mobile_data_always_on"; + /** + * Size of the event buffer for IP connectivity metrics. + * @hide + */ + public static final String CONNECTIVITY_METRICS_BUFFER_SIZE = + "connectivity_metrics_buffer_size"; + /** {@hide} */ public static final String NETSTATS_ENABLED = "netstats_enabled"; /** {@hide} */ @@ -7571,6 +7640,13 @@ public static final class Global extends NameValueTable { public static final String WIMAX_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wimax_networks_available_notification_on"; + /** + * Whether we support connecting to Carrier Networks. + * @hide + **/ + public static final String WIFI_CONNECT_CARRIER_NETWORKS = + "wifi_connect_carrier_networks"; + /** * Delay (in seconds) before repeating the Wi-Fi networks available notification. * Connecting to a network will reset the timer. @@ -7998,12 +8074,46 @@ public static final class Global extends NameValueTable { */ public static final String PAC_CHANGE_DELAY = "pac_change_delay"; + /** + * Don't attempt to detect captive portals. + * + * @hide + */ + public static final int CAPTIVE_PORTAL_MODE_IGNORE = 0; + + /** + * When detecting a captive portal, display a notification that + * prompts the user to sign in. + * + * @hide + */ + public static final int CAPTIVE_PORTAL_MODE_PROMPT = 1; + + /** + * When detecting a captive portal, immediately disconnect from the + * network and do not reconnect to that network in the future. + * + * @hide + */ + public static final int CAPTIVE_PORTAL_MODE_AVOID = 2; + + /** + * What to do when connecting a network that presents a captive portal. + * Must be one of the CAPTIVE_PORTAL_MODE_* constants above. + * + * The default for this setting is CAPTIVE_PORTAL_MODE_PROMPT. + * @hide + */ + public static final String CAPTIVE_PORTAL_MODE = "captive_portal_mode"; + /** * Setting to turn off captive portal detection. Feature is enabled by * default and the setting needs to be set to 0 to disable it. * + * @deprecated use CAPTIVE_PORTAL_MODE_IGNORE to disable captive portal detection * @hide */ + @Deprecated public static final String CAPTIVE_PORTAL_DETECTION_ENABLED = "captive_portal_detection_enabled"; @@ -9325,6 +9435,24 @@ public static boolean putFloat(ContentResolver cr, String name, float value) { * @hide */ public static final String CELL_ON = "cell_on"; + + /** + * Whether to show the high temperature warning notification. + * @hide + */ + public static final String SHOW_TEMPERATURE_WARNING = "show_temperature_warning"; + + /** + * Temperature at which the high temperature warning notification should be shown. + * @hide + */ + public static final String WARNING_TEMPERATURE = "warning_temperature"; + + /** + * Whether the diskstats logging task is enabled/disabled. + * @hide + */ + public static final String ENABLE_DISKSTATS_LOGGING = "enable_diskstats_logging"; } /** diff --git a/core/java/android/provider/VoicemailContract.java b/core/java/android/provider/VoicemailContract.java index 5099eebf6eb1..1e5416382f8c 100644 --- a/core/java/android/provider/VoicemailContract.java +++ b/core/java/android/provider/VoicemailContract.java @@ -30,6 +30,7 @@ import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telecom.Voicemail; + import java.util.List; /** @@ -317,6 +318,48 @@ private Voicemails() { */ public static final String LAST_MODIFIED = "last_modified"; + /** + * Flag to indicate the voicemail was backed up. The value will be 1 if backed up, 0 if + * not. + * + *

Type: INTEGER (boolean)

+ * + * @hide + */ + public static final String BACKED_UP = "backed_up"; + + /** + * Flag to indicate the voicemail was restored from a backup. The value will be 1 if + * restored, 0 if not. + * + *

Type: INTEGER (boolean)

+ * + * @hide + */ + public static final String RESTORED = "restored"; + + /** + * Flag to indicate the voicemail was marked as archived. Archived voicemail should not be + * deleted even if it no longer exist on the server. The value will be 1 if archived true, 0 + * if not. + * + *

Type: INTEGER (boolean)

+ * + * @hide + */ + public static final String ARCHIVED = "archived"; + + /** + * Flag to indicate the voicemail is a OMTP voicemail handled by the {@link + * android.telephony.VisualVoicemailService}. The UI should only show OMTP voicemails from + * the current visual voicemail package. + * + *

Type: INTEGER (boolean)

+ * + * @hide + */ + public static final String IS_OMTP_VOICEMAIL = "is_omtp_voicemail"; + /** * A convenience method to build voicemail URI specific to a source package by appending * {@link VoicemailContract#PARAM_KEY_SOURCE_PACKAGE} param to the base URI. diff --git a/core/java/android/security/IKeystoreService.aidl b/core/java/android/security/IKeystoreService.aidl index 8689dce3fef5..641e1ada6eaa 100644 --- a/core/java/android/security/IKeystoreService.aidl +++ b/core/java/android/security/IKeystoreService.aidl @@ -76,4 +76,5 @@ interface IKeystoreService { int onUserAdded(int userId, int parentId); int onUserRemoved(int userId); int attestKey(String alias, in KeymasterArguments params, out KeymasterCertificateChain chain); + int onDeviceOffBody(); } diff --git a/core/java/android/service/carrier/CarrierService.java b/core/java/android/service/carrier/CarrierService.java index 455e1b25df18..813acc232289 100644 --- a/core/java/android/service/carrier/CarrierService.java +++ b/core/java/android/service/carrier/CarrierService.java @@ -107,12 +107,12 @@ public CarrierService() { *

* Requires Permission: * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} - * Or the calling app has carrier privileges. - * @see {@link android.telephony.TelephonyManager#hasCarrierPrivileges} + * or the calling app has carrier privileges. * * @param active Whether the carrier network change is or shortly will be * active. Set this value to true to begin showing * alternative UI and false to stop. + * @see android.telephony.TelephonyManager#hasCarrierPrivileges */ public final void notifyCarrierNetworkChange(boolean active) { try { diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 1557a2718b55..5a42b83592c3 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -785,7 +785,7 @@ public void unregisterAsSystemService() throws RemoteException { } /** - * Request that the listener be rebound, after a previous call to (@link requestUnbind). + * Request that the listener be rebound, after a previous call to {@link #requestUnbind}. * *

This method will fail for listeners that have * not been granted the permission by the user. diff --git a/core/java/android/text/Editable.java b/core/java/android/text/Editable.java index b3f2c2a5c447..519ccd2560f6 100644 --- a/core/java/android/text/Editable.java +++ b/core/java/android/text/Editable.java @@ -94,10 +94,10 @@ public interface Editable public Editable append(char text); /** - * Convenience for replace(0, length(), "", 0, 0) - * @see #replace(int, int, CharSequence, int, int) + * Convenience for replace(0, length(), "", 0, 0). * Note that this clears the text, not the spans; * use {@link #clearSpans} if you need that. + * @see #replace(int, int, CharSequence, int, int) */ public void clear(); diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java index dc8e4b93e093..cdf7e8b09221 100644 --- a/core/java/android/text/SpannableStringBuilder.java +++ b/core/java/android/text/SpannableStringBuilder.java @@ -21,6 +21,7 @@ import android.graphics.Paint; import android.util.Log; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.ArrayUtils; import com.android.internal.util.GrowingArrayUtils; @@ -73,8 +74,6 @@ public SpannableStringBuilder(CharSequence text, int start, int end) { mSpanFlags = EmptyArray.INT; mSpanMax = EmptyArray.INT; mSpanOrder = EmptyArray.INT; - mPrioSortBuffer = EmptyArray.INT; - mOrderSortBuffer = EmptyArray.INT; if (text instanceof Spanned) { Spanned sp = (Spanned) text; @@ -856,14 +855,14 @@ public T[] getSpans(int queryStart, int queryEnd, @Nullable Class kind) { * @param queryStart Start index. * @param queryEnd End index. * @param kind Class type to search for. - * @param sort If true the results are sorted by the insertion order. + * @param sortByInsertionOrder If true the results are sorted by the insertion order. * @param * @return Array of the spans. Empty array if no results are found. * * @hide */ public T[] getSpans(int queryStart, int queryEnd, @Nullable Class kind, - boolean sort) { + boolean sortByInsertionOrder) { if (kind == null) return (T[]) ArrayUtils.emptyArray(Object.class); if (mSpanCount == 0) return ArrayUtils.emptyArray(kind); int count = countSpans(queryStart, queryEnd, kind, treeRoot()); @@ -873,13 +872,15 @@ public T[] getSpans(int queryStart, int queryEnd, @Nullable Class kind, // Safe conversion, but requires a suppressWarning T[] ret = (T[]) Array.newInstance(kind, count); - if (sort) { - mPrioSortBuffer = checkSortBuffer(mPrioSortBuffer, count); - mOrderSortBuffer = checkSortBuffer(mOrderSortBuffer, count); + final int[] prioSortBuffer = sortByInsertionOrder ? obtain(count) : EmptyArray.INT; + final int[] orderSortBuffer = sortByInsertionOrder ? obtain(count) : EmptyArray.INT; + getSpansRec(queryStart, queryEnd, kind, treeRoot(), ret, prioSortBuffer, + orderSortBuffer, 0, sortByInsertionOrder); + if (sortByInsertionOrder) { + sort(ret, prioSortBuffer, orderSortBuffer); + recycle(prioSortBuffer); + recycle(orderSortBuffer); } - getSpansRec(queryStart, queryEnd, kind, treeRoot(), ret, mPrioSortBuffer, - mOrderSortBuffer, 0, sort); - if (sort) sort(ret, mPrioSortBuffer, mOrderSortBuffer); return ret; } @@ -991,16 +992,64 @@ private int getSpansRec(int queryStart, int queryEnd, Class kind, return count; } + /** + * Obtain a temporary sort buffer. + * + * @param elementCount the size of the int[] to be returned + * @return an int[] with elementCount length + */ + private static int[] obtain(final int elementCount) { + int[] result = null; + synchronized (sCachedIntBuffer) { + // try finding a tmp buffer with length of at least elementCount + // if not get the first available one + int candidateIndex = -1; + for (int i = sCachedIntBuffer.length - 1; i >= 0; i--) { + if (sCachedIntBuffer[i] != null) { + if (sCachedIntBuffer[i].length >= elementCount) { + candidateIndex = i; + break; + } else if (candidateIndex == -1) { + candidateIndex = i; + } + } + } + + if (candidateIndex != -1) { + result = sCachedIntBuffer[candidateIndex]; + sCachedIntBuffer[candidateIndex] = null; + } + } + result = checkSortBuffer(result, elementCount); + return result; + } + + /** + * Recycle sort buffer. + * + * @param buffer buffer to be recycled + */ + private static void recycle(int[] buffer) { + synchronized (sCachedIntBuffer) { + for (int i = 0; i < sCachedIntBuffer.length; i++) { + if (sCachedIntBuffer[i] == null || buffer.length > sCachedIntBuffer[i].length) { + sCachedIntBuffer[i] = buffer; + break; + } + } + } + } + /** * Check the size of the buffer and grow if required. * - * @param buffer Buffer to be checked. - * @param size Required size. + * @param buffer buffer to be checked. + * @param size required size. * @return Same buffer instance if the current size is greater than required size. Otherwise a * new instance is created and returned. */ - private final int[] checkSortBuffer(int[] buffer, int size) { - if(size > buffer.length) { + private static int[] checkSortBuffer(int[] buffer, int size) { + if (buffer == null || size > buffer.length) { return ArrayUtils.newUnpaddedIntArray(GrowingArrayUtils.growSize(size)); } return buffer; @@ -1025,16 +1074,19 @@ private final void sort(T[] array, int[] priority, int[] insertionOrder) { } for (int i = size - 1; i > 0; i--) { - T v = array[0]; - int prio = priority[0]; - int insertOrder = insertionOrder[0]; + final T tmpSpan = array[0]; array[0] = array[i]; + array[i] = tmpSpan; + + final int tmpPriority = priority[0]; priority[0] = priority[i]; + priority[i] = tmpPriority; + + final int tmpOrder = insertionOrder[0]; insertionOrder[0] = insertionOrder[i]; + insertionOrder[i] = tmpOrder; + siftDown(0, array, i, priority, insertionOrder); - array[i] = v; - priority[i] = prio; - insertionOrder[i] = insertOrder; } } @@ -1050,10 +1102,6 @@ private final void sort(T[] array, int[] priority, int[] insertionOrder) { */ private final void siftDown(int index, T[] array, int size, int[] priority, int[] insertionOrder) { - T v = array[index]; - int prio = priority[index]; - int insertOrder = insertionOrder[index]; - int left = 2 * index + 1; while (left < size) { if (left < size - 1 && compareSpans(left, left + 1, priority, insertionOrder) < 0) { @@ -1062,15 +1110,22 @@ private final void siftDown(int index, T[] array, int size, int[] priority, if (compareSpans(index, left, priority, insertionOrder) >= 0) { break; } + + final T tmpSpan = array[index]; array[index] = array[left]; + array[left] = tmpSpan; + + final int tmpPriority = priority[index]; priority[index] = priority[left]; + priority[left] = tmpPriority; + + final int tmpOrder = insertionOrder[index]; insertionOrder[index] = insertionOrder[left]; + insertionOrder[left] = tmpOrder; + index = left; left = 2 * index + 1; } - array[index] = v; - priority[index] = prio; - insertionOrder[index] = insertOrder; } /** @@ -1702,6 +1757,10 @@ private void invalidateIndex(int i) { } private static final InputFilter[] NO_FILTERS = new InputFilter[0]; + + @GuardedBy("sCachedIntBuffer") + private static final int[][] sCachedIntBuffer = new int[6][0]; + private InputFilter[] mFilters = NO_FILTERS; private char[] mText; @@ -1715,8 +1774,6 @@ private void invalidateIndex(int i) { private int[] mSpanFlags; private int[] mSpanOrder; // store the order of span insertion private int mSpanInsertCount; // counter for the span insertion - private int[] mPrioSortBuffer; // buffer used to sort getSpans result - private int[] mOrderSortBuffer; // buffer used to sort getSpans result private int mSpanCount; private IdentityHashMap mIndexOfSpan; diff --git a/core/java/android/text/style/ImageSpan.java b/core/java/android/text/style/ImageSpan.java index 856dd0bff36e..b0bff680f390 100644 --- a/core/java/android/text/style/ImageSpan.java +++ b/core/java/android/text/style/ImageSpan.java @@ -43,7 +43,7 @@ public ImageSpan(Bitmap b) { } /** - * @deprecated Use {@link #ImageSpan(Context, Bitmap, int) instead. + * @deprecated Use {@link #ImageSpan(Context, Bitmap, int)} instead. */ @Deprecated public ImageSpan(Bitmap b, int verticalAlignment) { diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java index e9153ddba831..29e667f5abc5 100644 --- a/core/java/android/text/style/TtsSpan.java +++ b/core/java/android/text/style/TtsSpan.java @@ -798,7 +798,7 @@ public DecimalBuilder() { /** * Creates a TtsSpan of type {@link #TYPE_DECIMAL} and sets the * {@link #ARG_INTEGER_PART} and {@link #ARG_FRACTIONAL_PART} arguments. - * @see {@link #setArgumentsFromDouble(double, int, int) + * @see #setArgumentsFromDouble(double, int, int) */ public DecimalBuilder(double number, int minimumFractionDigits, @@ -1082,7 +1082,7 @@ public MeasureBuilder setDenominator(String denominator) { * Sets the {@link #ARG_UNIT} argument. * @param unit The unit of the measure. * @return This instance. - * @see {@link TtsSpan.ARG_UNIT} + * @see TtsSpan.ARG_UNIT */ public MeasureBuilder setUnit(String unit) { return setStringArgument(TtsSpan.ARG_UNIT, unit); @@ -1116,7 +1116,7 @@ public TimeBuilder(int hours, int minutes) { * Sets the {@link #ARG_HOURS} argument. * @param hours The value to be set for hours. See {@link #ARG_HOURS}. * @return This instance. - * @see {@link #ARG_HOURS} + * @see #ARG_HOURS */ public TimeBuilder setHours(int hours) { return setIntArgument(TtsSpan.ARG_HOURS, hours); @@ -1127,7 +1127,7 @@ public TimeBuilder setHours(int hours) { * @param minutes The value to be set for minutes. See * {@link #ARG_MINUTES}. * @return This instance. - * @see {@link #ARG_MINUTES} + * @see #ARG_MINUTES */ public TimeBuilder setMinutes(int minutes) { return setIntArgument(TtsSpan.ARG_MINUTES, minutes); @@ -1177,7 +1177,7 @@ public DateBuilder(Integer weekday, * @param weekday The value to be set for weekday. See * {@link #ARG_WEEKDAY}. * @return This instance. - * @see {@link #ARG_WEEKDAY} + * @see #ARG_WEEKDAY */ public DateBuilder setWeekday(int weekday) { return setIntArgument(TtsSpan.ARG_WEEKDAY, weekday); @@ -1187,7 +1187,7 @@ public DateBuilder setWeekday(int weekday) { * Sets the {@link #ARG_DAY} argument. * @param day The value to be set for day. See {@link #ARG_DAY}. * @return This instance. - * @see {@link #ARG_DAY} + * @see #ARG_DAY */ public DateBuilder setDay(int day) { return setIntArgument(TtsSpan.ARG_DAY, day); @@ -1197,7 +1197,7 @@ public DateBuilder setDay(int day) { * Sets the {@link #ARG_MONTH} argument. * @param month The value to be set for month. See {@link #ARG_MONTH}. * @return This instance. - * @see {@link #ARG_MONTH} + * @see #ARG_MONTH */ public DateBuilder setMonth(int month) { return setIntArgument(TtsSpan.ARG_MONTH, month); @@ -1207,7 +1207,7 @@ public DateBuilder setMonth(int month) { * Sets the {@link #ARG_YEAR} argument. * @param year The value to be set for year. See {@link #ARG_YEAR}. * @return This instance. - * @see {@link #ARG_YEAR} + * @see #ARG_YEAR */ public DateBuilder setYear(int year) { return setIntArgument(TtsSpan.ARG_YEAR, year); diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java index 85a4bf9d9e8f..e29155821eaa 100644 --- a/core/java/android/view/Display.java +++ b/core/java/android/view/Display.java @@ -284,6 +284,15 @@ public final class Display { */ public static final int STATE_DOZE_SUSPEND = 4; + /** + * Display state: The display is on and optimized for VR mode. + * + * @see #getState + * @see android.os.PowerManager#isInteractive + * @hide + */ + public static final int STATE_VR = 5; + /* The color mode constants defined below must be kept in sync with the ones in * system/graphics.h */ @@ -868,7 +877,8 @@ public void getRealMetrics(DisplayMetrics outMetrics) { * Gets the state of the display, such as whether it is on or off. * * @return The state of the display: one of {@link #STATE_OFF}, {@link #STATE_ON}, - * {@link #STATE_DOZE}, {@link #STATE_DOZE_SUSPEND}, or {@link #STATE_UNKNOWN}. + * {@link #STATE_DOZE}, {@link #STATE_DOZE_SUSPEND}, or + * {@link #STATE_UNKNOWN}. */ public int getState() { synchronized (this) { @@ -984,6 +994,8 @@ public static String stateToString(int state) { return "DOZE"; case STATE_DOZE_SUSPEND: return "DOZE_SUSPEND"; + case STATE_VR: + return "VR"; default: return Integer.toString(state); } diff --git a/core/java/android/view/FrameMetrics.java b/core/java/android/view/FrameMetrics.java index 2b938d0df7eb..7d1b76b8becb 100644 --- a/core/java/android/view/FrameMetrics.java +++ b/core/java/android/view/FrameMetrics.java @@ -138,7 +138,7 @@ public final class FrameMetrics { /** * Identifiers for metrics available for each frame. * - * {@see {@link #getMetric(int)}} + * {@see #getMetric(int)} * @hide */ @IntDef({ diff --git a/core/java/android/view/KeyCharacterMap.java b/core/java/android/view/KeyCharacterMap.java index 55dd6bb64fe6..a70eb2279cca 100644 --- a/core/java/android/view/KeyCharacterMap.java +++ b/core/java/android/view/KeyCharacterMap.java @@ -673,8 +673,8 @@ public int getKeyboardType() { * * @return The modifier behavior for this keyboard. * - * @see {@link #MODIFIER_BEHAVIOR_CHORDED} - * @see {@link #MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED} + * @see #MODIFIER_BEHAVIOR_CHORDED + * @see #MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED */ public int getModifierBehavior() { switch (getKeyboardType()) { 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/View.java b/core/java/android/view/View.java index 5f40ad520d0c..984078a98208 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -12940,7 +12940,7 @@ public StateListAnimator getStateListAnimator() { * Any previously attached StateListAnimator will be detached. * * @param stateListAnimator The StateListAnimator to update the view - * @see {@link android.animation.StateListAnimator} + * @see android.animation.StateListAnimator */ public void setStateListAnimator(StateListAnimator stateListAnimator) { if (mStateListAnimator == stateListAnimator) { @@ -23914,8 +23914,8 @@ protected void encodeProperties(@NonNull ViewHierarchyEncoder stream) { * Determine if this view is rendered on a round wearable device and is the main view * on the screen. */ - private boolean shouldDrawRoundScrollbar() { - if (!mResources.getConfiguration().isScreenRound()) { + boolean shouldDrawRoundScrollbar() { + if (!mResources.getConfiguration().isScreenRound() || mAttachInfo == null) { return false; } @@ -23931,7 +23931,7 @@ private boolean shouldDrawRoundScrollbar() { return false; } - getLocationOnScreen(mAttachInfo.mTmpLocation); + getLocationInWindow(mAttachInfo.mTmpLocation); return mAttachInfo.mTmpLocation[0] == insets.getStableInsetLeft() && mAttachInfo.mTmpLocation[1] == insets.getStableInsetTop(); } diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index 4d584a3df4fb..8b8525f2f1b5 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -16,6 +16,7 @@ package android.view; +import android.annotation.SystemApi; import android.app.AppGlobals; import android.content.Context; import android.content.res.Configuration; @@ -63,6 +64,12 @@ public class ViewConfiguration { */ private static final int DEFAULT_LONG_PRESS_TIMEOUT = 500; + /** + * Defines the default duration in milliseconds between the first tap's up event and the second + * tap's down event for an interaction to be considered part of the same multi-press. + */ + private static final int DEFAULT_MULTI_PRESS_TIMEOUT = 300; + /** * Defines the time between successive key repeats in milliseconds. */ @@ -212,6 +219,12 @@ public class ViewConfiguration { */ private static final int OVERFLING_DISTANCE = 6; + /** + * Amount to scroll in response to a {@link MotionEvent#ACTION_SCROLL} event, in dips per + * axis value. + */ + private static final int SCROLL_FACTOR = 64; + /** * Default duration to hide an action mode for. */ @@ -240,6 +253,7 @@ public class ViewConfiguration { private final int mOverflingDistance; private final boolean mFadingMarqueeEnabled; private final long mGlobalActionsKeyTimeout; + private final int mScrollFactor; private boolean sHasPermanentMenuKey; private boolean sHasPermanentMenuKeySet; @@ -268,6 +282,7 @@ public ViewConfiguration() { mOverflingDistance = OVERFLING_DISTANCE; mFadingMarqueeEnabled = true; mGlobalActionsKeyTimeout = GLOBAL_ACTIONS_KEY_TIMEOUT; + mScrollFactor = SCROLL_FACTOR; } /** @@ -351,6 +366,8 @@ private ViewConfiguration(Context context) { com.android.internal.R.dimen.config_viewMaxFlingVelocity); mGlobalActionsKeyTimeout = res.getInteger( com.android.internal.R.integer.config_globalActionsKeyTimeout); + mScrollFactor = res.getDimensionPixelSize( + com.android.internal.R.dimen.config_scrollFactor); } /** @@ -440,6 +457,16 @@ public static int getLongPressTimeout() { DEFAULT_LONG_PRESS_TIMEOUT); } + /** + * @return the duration in milliseconds between the first tap's up event and the second tap's + * down event for an interaction to be considered part of the same multi-press. + * @hide + */ + public static int getMultiPressTimeout() { + return AppGlobals.getIntCoreSetting(Settings.Secure.MULTI_PRESS_TIMEOUT, + DEFAULT_MULTI_PRESS_TIMEOUT); + } + /** * @return the time before the first key repeat in milliseconds. */ @@ -652,6 +679,16 @@ public int getScaledMaximumFlingVelocity() { return mMaximumFlingVelocity; } + /** + * @return Amount to scroll in response to a {@link MotionEvent#ACTION_SCROLL} event. Multiply + * this by the event's axis value to obtain the number of pixels to be scrolled. + * @hide + * @SystemApi + */ + public int getScaledScrollFactor() { + return mScrollFactor; + } + /** * The maximum drawing cache size expressed in bytes. * diff --git a/core/java/android/view/ViewOverlay.java b/core/java/android/view/ViewOverlay.java index b770bd50c277..8fa5d70b41c0 100644 --- a/core/java/android/view/ViewOverlay.java +++ b/core/java/android/view/ViewOverlay.java @@ -238,7 +238,19 @@ public void invalidateDrawable(@NonNull Drawable drawable) { @Override protected void dispatchDraw(Canvas canvas) { + /* + * The OverlayViewGroup doesn't draw with a DisplayList, because + * draw(Canvas, View, long) is never called on it. This is fine, since it doesn't need + * RenderNode/DisplayList features, and can just draw into the owner's Canvas. + * + * This means that we need to insert reorder barriers manually though, so that children + * of the OverlayViewGroup can cast shadows and Z reorder with each other. + */ + canvas.insertReorderBarrier(); + super.dispatchDraw(canvas); + + canvas.insertInorderBarrier(); final int numDrawables = (mDrawables == null) ? 0 : mDrawables.size(); for (int i = 0; i < numDrawables; ++i) { mDrawables.get(i).draw(canvas); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index e95fa5e6a2ee..f761b9b4ea14 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -6080,7 +6080,8 @@ public boolean shouldSkipIme() { return true; } return mEvent instanceof MotionEvent - && mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER); + && (mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER) + || mEvent.isFromSource(InputDevice.SOURCE_ROTARY_ENCODER)); } public boolean shouldSendToSynthesizer() { diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 87616408e10d..3ee02771aee3 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -275,6 +275,7 @@ public abstract class Window { private TypedArray mWindowStyle; private Callback mCallback; private OnWindowDismissedCallback mOnWindowDismissedCallback; + private OnWindowSwipeDismissedCallback mOnWindowSwipeDismissedCallback; private WindowControllerCallback mWindowControllerCallback; private OnRestrictedCaptionAreaChangedListener mOnRestrictedCaptionAreaChangedListener; private Rect mRestrictedCaptionAreaRect; @@ -302,6 +303,7 @@ public abstract class Window { private boolean mDestroyed; private boolean mOverlayWithDecorCaptionEnabled = false; + private boolean mCloseOnSwipeEnabled = false; // The current window attributes. private final WindowManager.LayoutParams mWindowAttributes = @@ -580,8 +582,22 @@ public interface OnWindowDismissedCallback { * Called when a window is dismissed. This informs the callback that the * window is gone, and it should finish itself. * @param finishTask True if the task should also be finished. + * @param suppressWindowTransition True if the resulting exit and enter window transition + * animations should be suppressed. */ - void onWindowDismissed(boolean finishTask); + void onWindowDismissed(boolean finishTask, boolean suppressWindowTransition); + } + + /** @hide */ + public interface OnWindowSwipeDismissedCallback { + /** + * Called when a window is swipe dismissed. This informs the callback that the + * window is gone, and it should finish itself. + * @param finishTask True if the task should also be finished. + * @param suppressWindowTransition True if the resulting exit and enter window transition + * animations should be suppressed. + */ + void onWindowSwipeDismissed(); } /** @hide */ @@ -870,9 +886,22 @@ public final void setOnWindowDismissedCallback(OnWindowDismissedCallback dcb) { } /** @hide */ - public final void dispatchOnWindowDismissed(boolean finishTask) { + public final void dispatchOnWindowDismissed( + boolean finishTask, boolean suppressWindowTransition) { if (mOnWindowDismissedCallback != null) { - mOnWindowDismissedCallback.onWindowDismissed(finishTask); + mOnWindowDismissedCallback.onWindowDismissed(finishTask, suppressWindowTransition); + } + } + + /** @hide */ + public final void setOnWindowSwipeDismissedCallback(OnWindowSwipeDismissedCallback sdcb) { + mOnWindowSwipeDismissedCallback = sdcb; + } + + /** @hide */ + public final void dispatchOnWindowSwipeDismissed() { + if (mOnWindowSwipeDismissedCallback != null) { + mOnWindowSwipeDismissedCallback.onWindowSwipeDismissed(); } } @@ -2217,4 +2246,21 @@ public void notifyRestrictedCaptionAreaCallback(int left, int top, int right, in * @hide */ public abstract void reportActivityRelaunched(); + + /** + * Called to set flag to check if the close on swipe is enabled. This will only function if + * FEATURE_SWIPE_TO_DISMISS has been set. + * @hide + */ + public void setCloseOnSwipeEnabled(boolean closeOnSwipeEnabled) { + mCloseOnSwipeEnabled = closeOnSwipeEnabled; + } + + /** + * @return {@code true} if the close on swipe is enabled. + * @hide + */ + public boolean isCloseOnSwipeEnabled() { + return mCloseOnSwipeEnabled; + } } diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index 2dfa8cdd3db9..286f5f7c1bf9 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -353,7 +353,18 @@ public void interrupt() { return; } if (!mIsEnabled) { - throw new IllegalStateException("Accessibility off. Did you forget to check that?"); + Looper myLooper = Looper.myLooper(); + if (myLooper == Looper.getMainLooper()) { + throw new IllegalStateException( + "Accessibility off. Did you forget to check that?"); + } else { + // If we're not running on the thread with the main looper, it's possible for + // the state of accessibility to change between checking isEnabled and + // calling this method. So just log the error rather than throwing the + // exception. + Log.e(LOG_TAG, "Interrupt called with accessibility disabled"); + return; + } } userId = mUserId; } diff --git a/core/java/android/view/animation/LayoutAnimationController.java b/core/java/android/view/animation/LayoutAnimationController.java index df2f18c21735..7fa49c1a6c8f 100644 --- a/core/java/android/view/animation/LayoutAnimationController.java +++ b/core/java/android/view/animation/LayoutAnimationController.java @@ -150,7 +150,7 @@ public LayoutAnimationController(Animation animation, float delay) { * Returns the order used to compute the delay of each child's animation. * * @return one of {@link #ORDER_NORMAL}, {@link #ORDER_REVERSE} or - * {@link #ORDER_RANDOM) + * {@link #ORDER_RANDOM} * * @attr ref android.R.styleable#LayoutAnimation_animationOrder */ diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index f54edf14bbe1..3a8551954266 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -740,9 +740,26 @@ public void savePassword(String host, String username, String password) { } /** - * Stores HTTP authentication credentials for a given host and realm. This - * method is intended to be used with - * {@link WebViewClient#onReceivedHttpAuthRequest}. + * Stores HTTP authentication credentials for a given host and realm to the {@link WebViewDatabase} + * instance. + *

+ * To use HTTP authentication, the embedder application has to implement + * {@link WebViewClient#onReceivedHttpAuthRequest}, and call {@link HttpAuthHandler#proceed} + * with the correct username and password. + *

+ * The embedder app can get the username and password any way it chooses, and does not have to + * use {@link WebViewDatabase}. + *

+ * Notes: + *

  • + * {@link WebViewDatabase} is provided only as a convenience to store and retrieve http + * authentication credentials. WebView does not read from it during HTTP authentication. + *
  • + *
  • + * WebView does not provide a special mechanism to clear HTTP authentication credentials for + * implementing client logout. The client logout mechanism should be implemented by the Web site + * designer (such as server sending a HTTP 401 for invalidating credentials). + *
  • * * @param host the host to which the credentials apply * @param realm the realm to which the credentials apply @@ -759,9 +776,8 @@ public void setHttpAuthUsernamePassword(String host, String realm, } /** - * Retrieves HTTP authentication credentials for a given host and realm. - * This method is intended to be used with - * {@link WebViewClient#onReceivedHttpAuthRequest}. + * Retrieves HTTP authentication credentials for a given host and realm from the {@link + * WebViewDatabase} instance. * * @param host the host to which the credentials apply * @param realm the realm to which the credentials apply diff --git a/core/java/android/webkit/WebViewDatabase.java b/core/java/android/webkit/WebViewDatabase.java index cdff41685b80..cc2c6cc34803 100644 --- a/core/java/android/webkit/WebViewDatabase.java +++ b/core/java/android/webkit/WebViewDatabase.java @@ -44,7 +44,7 @@ public static WebViewDatabase getInstance(Context context) { * * @return true if there are any saved username/password pairs * @see WebView#savePassword - * @see #clearUsernamePassworda + * @see #clearUsernamePassword * @deprecated Saving passwords in WebView will not be supported in future versions. */ @Deprecated @@ -72,7 +72,16 @@ public static WebViewDatabase getInstance(Context context) { public abstract boolean hasHttpAuthUsernamePassword(); /** - * Clears any saved credentials for HTTP authentication. + * Clears any saved credentials for HTTP authentication. This method only clears the username + * and password stored in WebViewDatabase instance. The username and password are not read from + * the {@link WebViewDatabase} during {@link WebViewClient#onReceivedHttpAuthRequest}. It is up + * to the app to do this or not. + *

    + * The username and password used for http authentication might be cached in the network stack + * itself, and are not cleared when this method is called. WebView does not provide a special + * mechanism to clear HTTP authentication for implementing client logout. The client logout + * mechanism should be implemented by the Web site designer (such as server sending a HTTP 401 + * for invalidating credentials). * * @see WebView#getHttpAuthUsernamePassword * @see WebView#setHttpAuthUsernamePassword diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 7b45d8cb05b0..c01348d69f3c 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.content.Context; import android.content.Intent; +import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; @@ -616,6 +617,8 @@ public abstract class AbsListView extends AdapterView implements Te private int mTouchSlop; private float mDensityScale; + private float mScrollFactor; + private InputConnection mDefInputConnection; private InputConnectionWrapper mPublicInputConnection; @@ -857,6 +860,10 @@ public AbsListView(Context context, AttributeSet attrs, int defStyleAttr, int de R.styleable.AbsListView_fastScrollAlwaysVisible, false)); a.recycle(); + + if (context.getResources().getConfiguration().uiMode == Configuration.UI_MODE_TYPE_WATCH) { + setRevealOnFocusHint(false); + } } private void initAbsListView() { @@ -869,6 +876,7 @@ private void initAbsListView() { final ViewConfiguration configuration = ViewConfiguration.get(mContext); mTouchSlop = configuration.getScaledTouchSlop(); + mScrollFactor = configuration.getScaledScrollFactor(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mOverscrollDistance = configuration.getScaledOverscrollDistance(); @@ -2160,7 +2168,6 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { } layoutChildren(); - mInLayout = false; mOverscrollMax = (b - t) / OVERSCROLL_LIMIT_DIVISOR; @@ -2168,6 +2175,7 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { if (mFastScroll != null) { mFastScroll.onItemCountChanged(getChildCount(), mItemCount); } + mInLayout = false; } /** @@ -2697,6 +2705,9 @@ protected void onSizeChanged(int w, int h, int oldw, int oldh) { * fail to relayout them properly to accommodate for new bounds. */ void handleBoundsChange() { + if (mInLayout) { + return; + } final int childCount = getChildCount(); if (childCount > 0) { mDataChanged = true; @@ -4201,21 +4212,26 @@ protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolea @Override public boolean onGenericMotionEvent(MotionEvent event) { - if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { - switch (event.getAction()) { - case MotionEvent.ACTION_SCROLL: - if (mTouchMode == TOUCH_MODE_REST) { - final float vscroll = event.getAxisValue(MotionEvent.AXIS_VSCROLL); - if (vscroll != 0) { - final int delta = (int) (vscroll * getVerticalScrollFactor()); - if (!trackMotionScroll(delta, delta)) { - return true; - } - } - } - break; + switch (event.getAction()) { + case MotionEvent.ACTION_SCROLL: + final float axisValue; + if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { + axisValue = event.getAxisValue(MotionEvent.AXIS_VSCROLL); + } else if (event.isFromSource(InputDevice.SOURCE_ROTARY_ENCODER)) { + axisValue = event.getAxisValue(MotionEvent.AXIS_SCROLL); + } else { + axisValue = 0; + } - case MotionEvent.ACTION_BUTTON_PRESS: + final int delta = Math.round(axisValue * mScrollFactor); + if (delta != 0) { + if (!trackMotionScroll(delta, delta)) { + return true; + } + } + break; + case MotionEvent.ACTION_BUTTON_PRESS: + if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { int actionButton = event.getActionButton(); if ((actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY || actionButton == MotionEvent.BUTTON_SECONDARY) @@ -4225,8 +4241,8 @@ public boolean onGenericMotionEvent(MotionEvent event) { removeCallbacks(mPendingCheckForTap); } } - break; - } + } + break; } return super.onGenericMotionEvent(event); 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 void notifyDataSetChanged() { } /** - * 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/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index 00f368e3abe3..918b6c0d65ff 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -18,6 +18,7 @@ import android.annotation.NonNull; import android.content.Context; +import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; @@ -128,6 +129,8 @@ public class HorizontalScrollView extends FrameLayout { private int mOverscrollDistance; private int mOverflingDistance; + private float mScrollFactor; + /** * ID of the active pointer. This is used to retain consistency during * drags/flings if multiple pointers are used. @@ -165,6 +168,10 @@ public HorizontalScrollView( setFillViewport(a.getBoolean(android.R.styleable.HorizontalScrollView_fillViewport, false)); a.recycle(); + + if (context.getResources().getConfiguration().uiMode == Configuration.UI_MODE_TYPE_WATCH) { + setRevealOnFocusHint(false); + } } @Override @@ -217,6 +224,7 @@ private void initScrollView() { mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mOverscrollDistance = configuration.getScaledOverscrollDistance(); mOverflingDistance = configuration.getScaledOverflingDistance(); + mScrollFactor = configuration.getScaledScrollFactor(); } @Override @@ -719,30 +727,35 @@ private void onSecondaryPointerUp(MotionEvent ev) { @Override public boolean onGenericMotionEvent(MotionEvent event) { - if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { - switch (event.getAction()) { - case MotionEvent.ACTION_SCROLL: { - if (!mIsBeingDragged) { - final float hscroll; + switch (event.getAction()) { + case MotionEvent.ACTION_SCROLL: { + if (!mIsBeingDragged) { + final float axisValue; + if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { if ((event.getMetaState() & KeyEvent.META_SHIFT_ON) != 0) { - hscroll = -event.getAxisValue(MotionEvent.AXIS_VSCROLL); + axisValue = -event.getAxisValue(MotionEvent.AXIS_VSCROLL); } else { - hscroll = event.getAxisValue(MotionEvent.AXIS_HSCROLL); + axisValue = event.getAxisValue(MotionEvent.AXIS_HSCROLL); } - if (hscroll != 0) { - final int delta = (int) (hscroll * getHorizontalScrollFactor()); - final int range = getScrollRange(); - int oldScrollX = mScrollX; - int newScrollX = oldScrollX + delta; - if (newScrollX < 0) { - newScrollX = 0; - } else if (newScrollX > range) { - newScrollX = range; - } - if (newScrollX != oldScrollX) { - super.scrollTo(newScrollX, mScrollY); - return true; - } + } else if (event.isFromSource(InputDevice.SOURCE_ROTARY_ENCODER)) { + axisValue = event.getAxisValue(MotionEvent.AXIS_SCROLL); + } else { + axisValue = 0; + } + + final int delta = Math.round(axisValue * mScrollFactor); + if (delta != 0) { + final int range = getScrollRange(); + int oldScrollX = mScrollX; + int newScrollX = oldScrollX + delta; + if (newScrollX < 0) { + newScrollX = 0; + } else if (newScrollX > range) { + newScrollX = range; + } + if (newScrollX != oldScrollX) { + super.scrollTo(newScrollX, mScrollY); + return true; } } } @@ -1430,11 +1443,13 @@ protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) { @Override public void requestChildFocus(View child, View focused) { - if (!mIsLayoutDirty) { - scrollToChild(focused); - } else { - // The child may not be laid out yet, we can't compute the scroll yet - mChildToScrollTo = focused; + if (focused.getRevealOnFocusHint()) { + if (!mIsLayoutDirty) { + scrollToChild(focused); + } else { + // The child may not be laid out yet, we can't compute the scroll yet + mChildToScrollTo = focused; + } } super.requestChildFocus(child, focused); } diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index 9b89491ce408..473585857d11 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -223,7 +223,7 @@ public void onScrollChanged() { mDecorView.getLayoutParams(); updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff, - p.width, p.height, mAnchoredGravity)); + p.width, p.height, mAnchoredGravity, false)); update(p.x, p.y, -1, -1, true); } } @@ -1227,7 +1227,7 @@ public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) { preparePopup(p); final boolean aboveAnchor = findDropDownPosition(anchor, p, xoff, yoff, - p.width, p.height, gravity); + p.width, p.height, gravity, mAllowScrollingAnchorParent); updateAboveAnchor(aboveAnchor); p.accessibilityIdOfAnchor = (anchor != null) ? anchor.getAccessibilityViewId() : -1; @@ -1519,10 +1519,12 @@ private int computeAnimationResource() { * @param xOffset absolute horizontal offset from the left of the anchor * @param yOffset absolute vertical offset from the top of the anchor * @param gravity horizontal gravity specifying popup alignment + * @param allowScroll whether the anchor view's parent may be scrolled + * when the popup window doesn't fit on screen * @return true if the popup is translated upwards to fit on screen */ private boolean findDropDownPosition(View anchor, WindowManager.LayoutParams outParams, - int xOffset, int yOffset, int width, int height, int gravity) { + int xOffset, int yOffset, int width, int height, int gravity, boolean allowScroll) { final int anchorHeight = anchor.getHeight(); final int anchorWidth = anchor.getWidth(); if (mOverlapAnchor) { @@ -1576,7 +1578,7 @@ private boolean findDropDownPosition(View anchor, WindowManager.LayoutParams out final int scrollY = anchor.getScrollY(); final Rect r = new Rect(scrollX, scrollY, scrollX + width + xOffset, scrollY + height + anchorHeight + yOffset); - if (mAllowScrollingAnchorParent && anchor.requestRectangleOnScreen(r, true)) { + if (allowScroll && anchor.requestRectangleOnScreen(r, true)) { // Reset for the new anchor position. anchor.getLocationInWindow(drawingLocation); outParams.x = drawingLocation[0] + xOffset; @@ -1834,7 +1836,8 @@ public void dismiss() { // can expect the OnAttachStateChangeListener to have been called prior // to executing this method, so we can rely on that instead. final Transition exitTransition = mExitTransition; - if (mIsAnchorRootAttached && exitTransition != null && decorView.isLaidOut()) { + if (exitTransition != null && decorView.isLaidOut() + && (mIsAnchorRootAttached || mAnchorRoot == null)) { // The decor view is non-interactive and non-IME-focusable during exit transitions. final LayoutParams p = (LayoutParams) decorView.getLayoutParams(); p.flags |= LayoutParams.FLAG_NOT_TOUCHABLE; @@ -1842,18 +1845,13 @@ public void dismiss() { p.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM; mWindowManager.updateViewLayout(decorView, p); + final View anchorRoot = mAnchorRoot != null ? mAnchorRoot.get() : null; + final Rect epicenter = getTransitionEpicenter(); + // Once we start dismissing the decor view, all state (including // the anchor root) needs to be moved to the decor view since we // may open another popup while it's busy exiting. - final View anchorRoot = mAnchorRoot != null ? mAnchorRoot.get() : null; - final Rect epicenter = getTransitionEpicenter(); - exitTransition.setEpicenterCallback(new EpicenterCallback() { - @Override - public Rect onGetEpicenter(Transition transition) { - return epicenter; - } - }); - decorView.startExitTransition(exitTransition, anchorRoot, + decorView.startExitTransition(exitTransition, anchorRoot, epicenter, new TransitionListenerAdapter() { @Override public void onTransitionEnd(Transition transition) { @@ -2176,15 +2174,19 @@ private void update(View anchor, boolean updateLocation, int xoff, int yoff, } final boolean aboveAnchor = findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff, - width, height, gravity); + width, height, gravity, mAllowScrollingAnchorParent); updateAboveAnchor(aboveAnchor); final boolean paramsChanged = oldGravity != p.gravity || oldX != p.x || oldY != p.y || oldWidth != p.width || oldHeight != p.height; - // If width and mWidth were both < 0 then we have a MATCH_PARENT/WRAP_CONTENT case. - // findDropDownPosition will have resolved this to absolute values, - // but we don't want to update mWidth/mHeight to these absolute values. - update(p.x, p.y, width < 0 ? width : p.width, height < 0 ? height : p.height, paramsChanged); + + // If width and mWidth were both < 0 then we have a MATCH_PARENT or + // WRAP_CONTENT case. findDropDownPosition will have resolved this to + // absolute values, but we don't want to update mWidth/mHeight to these + // absolute values. + final int newWidth = width < 0 ? width : p.width; + final int newHeight = height < 0 ? height : p.height; + update(p.x, p.y, newWidth, newHeight, paramsChanged); } /** @@ -2348,8 +2350,9 @@ private void startEnterTransition(Transition enterTransition) { * its {@code onTransitionEnd} method called even if the transition * never starts; however, it may be called with a {@code null} argument. */ - public void startExitTransition(Transition transition, final View anchorRoot, - final TransitionListener listener) { + public void startExitTransition(@NonNull Transition transition, + @Nullable final View anchorRoot, @Nullable final Rect epicenter, + @NonNull final TransitionListener listener) { if (transition == null) { return; } @@ -2357,23 +2360,35 @@ public void startExitTransition(Transition transition, final View anchorRoot, // The anchor view's window may go away while we're executing our // transition, in which case we need to end the transition // immediately and execute the listener to remove the popup. - anchorRoot.addOnAttachStateChangeListener(mOnAnchorRootDetachedListener); + if (anchorRoot != null) { + anchorRoot.addOnAttachStateChangeListener(mOnAnchorRootDetachedListener); + } // The exit listener MUST be called for cleanup, even if the // transition never starts or ends. Stash it for later. mPendingExitListener = new TransitionListenerAdapter() { @Override - public void onTransitionEnd(Transition transition) { - anchorRoot.removeOnAttachStateChangeListener(mOnAnchorRootDetachedListener); - listener.onTransitionEnd(transition); + public void onTransitionEnd(Transition t) { + if (anchorRoot != null) { + anchorRoot.removeOnAttachStateChangeListener(mOnAnchorRootDetachedListener); + } + + listener.onTransitionEnd(t); // The listener was called. Our job here is done. mPendingExitListener = null; + t.removeListener(this); } }; final Transition exitTransition = transition.clone(); exitTransition.addListener(mPendingExitListener); + exitTransition.setEpicenterCallback(new EpicenterCallback() { + @Override + public Rect onGetEpicenter(Transition transition) { + return epicenter; + } + }); final int count = getChildCount(); for (int i = 0; i < count; i++) { diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index d0d233ebe975..04ae2627e6df 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -390,6 +390,7 @@ public void mergeRemoteViews(RemoteViews newRv) { // Because pruning can remove the need for bitmaps, we reconstruct the bitmap cache mBitmapCache = new BitmapCache(); setBitmapCache(mBitmapCache); + recalculateMemoryUsage(); } private class SetEmptyView extends Action { @@ -2057,26 +2058,8 @@ public int getMemoryUsage() { return mMemoryUsage; } - @SuppressWarnings("deprecation") public void addBitmapMemory(Bitmap b) { - final Bitmap.Config c = b.getConfig(); - // If we don't know, be pessimistic and assume 4 - int bpp = 4; - if (c != null) { - switch (c) { - case ALPHA_8: - bpp = 1; - break; - case RGB_565: - case ARGB_4444: - bpp = 2; - break; - case ARGB_8888: - bpp = 4; - break; - } - } - increment(b.getWidth() * b.getHeight() * bpp); + increment(b.getAllocationByteCount()); } int mMemoryUsage; @@ -2659,8 +2642,8 @@ public void setProgressBar(int viewId, int max, int progress, * * When setting the on-click action of items within collections (eg. {@link ListView}, * {@link StackView} etc.), this method will not work. Instead, use {@link - * RemoteViews#setPendingIntentTemplate(int, PendingIntent) in conjunction with - * RemoteViews#setOnClickFillInIntent(int, Intent). + * RemoteViews#setPendingIntentTemplate(int, PendingIntent)} in conjunction with + * {@link RemoteViews#setOnClickFillInIntent(int, Intent)}. * * @param viewId The id of the view that will trigger the {@link PendingIntent} when clicked * @param pendingIntent The {@link PendingIntent} to send when user clicks @@ -3245,7 +3228,7 @@ public interface OnViewAppliedListener { * Applies the views asynchronously, moving as much of the task on the background * thread as possible. * - * @see {@link #apply(Context, ViewGroup)} + * @see #apply(Context, ViewGroup) * @param context Default context to use * @param parent Parent that the resulting view hierarchy will be attached to. This method * does not attach the hierarchy. The caller should do so when appropriate. @@ -3400,7 +3383,7 @@ public void reapply(Context context, View v, OnClickHandler handler) { * Applies all the actions to the provided view, moving as much of the task on the background * thread as possible. * - * @see {@link #reapply(Context, View)} + * @see #reapply(Context, View) * @param context Default context to use * @param v The view to apply the actions to. This should be the result of * the {@link #apply(Context,ViewGroup)} call. diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 0555cd403b00..e696ff7229e8 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -17,6 +17,7 @@ package android.widget; import android.annotation.NonNull; +import android.content.res.Configuration; import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Parcel; @@ -134,6 +135,8 @@ public class ScrollView extends FrameLayout { private int mOverscrollDistance; private int mOverflingDistance; + private int mScrollFactor; + /** * ID of the active pointer. This is used to retain consistency during * drags/flings if multiple pointers are used. @@ -186,6 +189,10 @@ public ScrollView(Context context, AttributeSet attrs, int defStyleAttr, int def setFillViewport(a.getBoolean(R.styleable.ScrollView_fillViewport, false)); a.recycle(); + + if (context.getResources().getConfiguration().uiMode == Configuration.UI_MODE_TYPE_WATCH) { + setRevealOnFocusHint(false); + } } @Override @@ -243,6 +250,7 @@ private void initScrollView() { mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mOverscrollDistance = configuration.getScaledOverscrollDistance(); mOverflingDistance = configuration.getScaledOverflingDistance(); + mScrollFactor = configuration.getScaledScrollFactor(); } @Override @@ -777,30 +785,35 @@ private void onSecondaryPointerUp(MotionEvent ev) { @Override public boolean onGenericMotionEvent(MotionEvent event) { - if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { - switch (event.getAction()) { - case MotionEvent.ACTION_SCROLL: { - if (!mIsBeingDragged) { - final float vscroll = event.getAxisValue(MotionEvent.AXIS_VSCROLL); - if (vscroll != 0) { - final int delta = (int) (vscroll * getVerticalScrollFactor()); - final int range = getScrollRange(); - int oldScrollY = mScrollY; - int newScrollY = oldScrollY - delta; - if (newScrollY < 0) { - newScrollY = 0; - } else if (newScrollY > range) { - newScrollY = range; - } - if (newScrollY != oldScrollY) { - super.scrollTo(mScrollX, newScrollY); - return true; - } - } + switch (event.getAction()) { + case MotionEvent.ACTION_SCROLL: + final float axisValue; + if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { + axisValue = event.getAxisValue(MotionEvent.AXIS_VSCROLL); + } else if (event.isFromSource(InputDevice.SOURCE_ROTARY_ENCODER)) { + axisValue = event.getAxisValue(MotionEvent.AXIS_SCROLL); + } else { + axisValue = 0; + } + + final int delta = Math.round(axisValue * mScrollFactor); + if (delta != 0) { + final int range = getScrollRange(); + int oldScrollY = mScrollY; + int newScrollY = oldScrollY - delta; + if (newScrollY < 0) { + newScrollY = 0; + } else if (newScrollY > range) { + newScrollY = range; + } + if (newScrollY != oldScrollY) { + super.scrollTo(mScrollX, newScrollY); + return true; } } - } + break; } + return super.onGenericMotionEvent(event); } @@ -1455,11 +1468,13 @@ protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) { @Override public void requestChildFocus(View child, View focused) { - if (!mIsLayoutDirty) { - scrollToChild(focused); - } else { - // The child may not be laid out yet, we can't compute the scroll yet - mChildToScrollTo = focused; + if (focused.getRevealOnFocusHint()) { + if (!mIsLayoutDirty) { + scrollToChild(focused); + } else { + // The child may not be laid out yet, we can't compute the scroll yet + mChildToScrollTo = focused; + } } super.requestChildFocus(child, focused); } diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java index a585d75e5d7a..49380b745564 100644 --- a/core/java/android/widget/TextClock.java +++ b/core/java/android/widget/TextClock.java @@ -130,7 +130,7 @@ public class TextClock extends TextView { private CharSequence mDescFormat; - private boolean mAttached; + private boolean mRegistered; private Calendar mTime; private String mTimeZone; @@ -250,7 +250,7 @@ private void init() { } createTime(mTimeZone); - // Wait until onAttachedToWindow() to handle the ticker + // Wait until registering for events to handle the ticker chooseFormat(false); } @@ -501,7 +501,7 @@ private void chooseFormat(boolean handleTicker) { boolean hadSeconds = mHasSeconds; mHasSeconds = DateFormat.hasSeconds(mFormat); - if (handleTicker && mAttached && hadSeconds != mHasSeconds) { + if (handleTicker && mRegistered && hadSeconds != mHasSeconds) { if (hadSeconds) getHandler().removeCallbacks(mTicker); else mTicker.run(); } @@ -515,11 +515,9 @@ private static CharSequence abc(CharSequence a, CharSequence b, CharSequence c) } @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - - if (!mAttached) { - mAttached = true; + public void onVisibilityAggregated(boolean isVisible) { + if (!mRegistered && isVisible) { + mRegistered = true; registerReceiver(); registerObserver(); @@ -531,20 +529,13 @@ protected void onAttachedToWindow() { } else { onTimeChanged(); } - } - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - - if (mAttached) { + } else if (mRegistered && !isVisible) { unregisterReceiver(); unregisterObserver(); getHandler().removeCallbacks(mTicker); - mAttached = false; + mRegistered = false; } } @@ -567,7 +558,7 @@ private void registerReceiver() { } private void registerObserver() { - if (isAttachedToWindow()) { + if (mRegistered) { if (mFormatChangeObserver == null) { mFormatChangeObserver = new FormatChangeObserver(getHandler()); } diff --git a/core/java/com/android/internal/app/AlertController.java b/core/java/com/android/internal/app/AlertController.java index cdb706304206..49e2a0377a4f 100644 --- a/core/java/com/android/internal/app/AlertController.java +++ b/core/java/com/android/internal/app/AlertController.java @@ -888,7 +888,8 @@ private void setBackground(TypedArray a, View topPanel, View contentPanel, View final int checkedItem = mCheckedItem; if (checkedItem > -1) { listView.setItemChecked(checkedItem, true); - listView.setSelection(checkedItem); + listView.setSelectionFromTop(checkedItem, + a.getDimensionPixelSize(R.styleable.AlertDialog_selectionScrollOffset, 0)); } } } diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 1e26c92dd764..0010073a2e91 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -124,6 +124,13 @@ public class ResolverActivity extends Activity { bindProfileView(); } } + + @Override + public boolean onPackageChanged(String packageName, int uid, String[] components) { + // We care about all package changes, not just the whole package itself which is + // default behavior. + return true; + } }; /** @@ -1322,6 +1329,14 @@ private void rebuildList() { PackageManager.MATCH_DEFAULT_ONLY | (shouldGetResolvedFilter ? PackageManager.GET_RESOLVED_FILTER : 0) | (shouldGetActivityMetadata ? PackageManager.GET_META_DATA : 0)); + // Remove any activities that are not exported. + int totalSize = infos.size(); + for (int j = totalSize - 1; j >= 0 ; j--) { + ResolveInfo info = infos.get(j); + if (info.activityInfo != null && !info.activityInfo.exported) { + infos.remove(j); + } + } if (infos != null) { if (currentResolveList == null) { currentResolveList = mOrigResolveList = new ArrayList<>(); @@ -1494,7 +1509,15 @@ private boolean isSameResolvedComponent(ResolveInfo a, ResolvedComponentInfo b) } public void onListRebuilt() { - // This space for rent + int count = getUnfilteredCount(); + if (count == 1 && getOtherProfile() == null) { + // Only one target, so we're a candidate to auto-launch! + final TargetInfo target = targetInfoForPosition(0, false); + if (shouldAutoLaunchSingleChoice(target)) { + safelyStartActivity(target); + finish(); + } + } } public boolean shouldGetResolvedFilter() { diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 3b3344e7d934..f28315bdc7f3 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -108,7 +108,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 150 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 151 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; @@ -1593,7 +1593,7 @@ public DurationTimer(Clocks clocks, Uid uid, int type, ArrayList @Override public void writeToParcel(Parcel out, long elapsedRealtimeUs) { super.writeToParcel(out, elapsedRealtimeUs); - out.writeLong(mMaxDurationMs); + out.writeLong(getMaxDurationMsLocked(elapsedRealtimeUs / 1000)); } /** @@ -1606,7 +1606,7 @@ public void writeToParcel(Parcel out, long elapsedRealtimeUs) { @Override public void writeSummaryFromParcelLocked(Parcel out, long elapsedRealtimeUs) { super.writeSummaryFromParcelLocked(out, elapsedRealtimeUs); - out.writeLong(mMaxDurationMs); + out.writeLong(getMaxDurationMsLocked(elapsedRealtimeUs / 1000)); } /** @@ -1630,7 +1630,7 @@ public void readSummaryFromParcelLocked(Parcel in) { public void onTimeStarted(long elapsedRealtimeUs, long baseUptime, long baseRealtime) { super.onTimeStarted(elapsedRealtimeUs, baseUptime, baseRealtime); if (mNesting > 0) { - mStartTimeMs = mTimeBase.getRealtime(mClocks.elapsedRealtime()*1000) / 1000; + mStartTimeMs = baseRealtime / 1000; } } @@ -1640,10 +1640,11 @@ public void onTimeStarted(long elapsedRealtimeUs, long baseUptime, long baseReal * If the timer is running, add the duration into mCurrentDurationMs. */ @Override - public void onTimeStopped(long elapsedRealtimeUs, long baseUptime, long baseRealtime) { - super.onTimeStopped(elapsedRealtimeUs, baseUptime, baseRealtime); + public void onTimeStopped(long elapsedRealtimeUs, long baseUptime, long baseRealtimeUs) { + super.onTimeStopped(elapsedRealtimeUs, baseUptime, baseRealtimeUs); if (mNesting > 0) { - mCurrentDurationMs += (elapsedRealtimeUs / 1000) - mStartTimeMs; + // baseRealtimeUs has already been converted to the timebase's realtime. + mCurrentDurationMs += (baseRealtimeUs / 1000) - mStartTimeMs; } mStartTimeMs = -1; } @@ -1658,7 +1659,7 @@ public void startRunningLocked(long elapsedRealtimeMs) { super.startRunningLocked(elapsedRealtimeMs); if (mNesting == 1 && mTimeBase.isRunning()) { // Just started - mStartTimeMs = mTimeBase.getRealtime(mClocks.elapsedRealtime()*1000) / 1000; + mStartTimeMs = mTimeBase.getRealtime(elapsedRealtimeMs * 1000) / 1000; } } @@ -1670,8 +1671,7 @@ public void startRunningLocked(long elapsedRealtimeMs) { */ @Override public void stopRunningLocked(long elapsedRealtimeMs) { - super.stopRunningLocked(elapsedRealtimeMs); - if (mNesting == 0) { + if (mNesting == 1) { final long durationMs = getCurrentDurationMsLocked(elapsedRealtimeMs); if (durationMs > mMaxDurationMs) { mMaxDurationMs = durationMs; @@ -1679,6 +1679,9 @@ public void stopRunningLocked(long elapsedRealtimeMs) { mStartTimeMs = -1; mCurrentDurationMs = 0; } + // super method decrements mNesting, which getCurrentDurationMsLocked relies on, + // so call super.stopRunningLocked after calling getCurrentDurationMsLocked. + super.stopRunningLocked(elapsedRealtimeMs); } @Override @@ -1720,11 +1723,9 @@ public long getMaxDurationMsLocked(long elapsedRealtimeMs) { @Override public long getCurrentDurationMsLocked(long elapsedRealtimeMs) { long durationMs = mCurrentDurationMs; - if (mNesting > 0) { - if (mTimeBase.isRunning()) { - durationMs += (mTimeBase.getRealtime(elapsedRealtimeMs*1000)/1000) - - mStartTimeMs; - } + if (mNesting > 0 && mTimeBase.isRunning()) { + durationMs += (mTimeBase.getRealtime(elapsedRealtimeMs*1000)/1000) + - mStartTimeMs; } return durationMs; } @@ -2877,8 +2878,22 @@ void addHistoryBufferLocked(long elapsedRealtimeMs, long uptimeMs, HistoryItem c mHistoryLastWritten.setTo(mHistoryLastLastWritten); } + boolean recordResetDueToOverflow = false; final int dataSize = mHistoryBuffer.dataSize(); - if (dataSize >= MAX_HISTORY_BUFFER) { + if (dataSize >= MAX_MAX_HISTORY_BUFFER*3) { + // Clients can't deal with history buffers this large. This only + // really happens when the device is on charger and interacted with + // for long periods of time, like in retail mode. Since the device is + // most likely charged, when unplugged, stats would have reset anyways. + // Reset the stats and mark that we overflowed. + // b/32540341 + resetAllStatsLocked(); + + // Mark that we want to set *OVERFLOW* event and the RESET:START + // events. + recordResetDueToOverflow = true; + + } else if (dataSize >= MAX_HISTORY_BUFFER) { if (!mHistoryOverflow) { mHistoryOverflow = true; addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_UPDATE, cur); @@ -2924,9 +2939,12 @@ void addHistoryBufferLocked(long elapsedRealtimeMs, long uptimeMs, HistoryItem c return; } - if (dataSize == 0) { + if (dataSize == 0 || recordResetDueToOverflow) { // The history is currently empty; we need it to start with a time stamp. cur.currentTime = System.currentTimeMillis(); + if (recordResetDueToOverflow) { + addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_OVERFLOW, cur); + } addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_RESET, cur); } addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_UPDATE, cur); @@ -9594,9 +9612,9 @@ void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime, final bo } doWrite = true; resetAllStatsLocked(); - if (chargeUAh > 0) { + if (chargeUAh > 0 && level > 0) { // Only use the reported coulomb charge value if it is supported and reported. - mEstimatedBatteryCapacity = (int) ((level / 100.0) * (chargeUAh / 1000)); + mEstimatedBatteryCapacity = (int) ((chargeUAh / 1000) / (level / 100.0)); } mDischargeStartLevel = level; reset = true; diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 455849e0c19e..29a79787b6b1 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -80,6 +80,7 @@ public class ZygoteInit { private static final String TAG = "Zygote"; private static final String PROPERTY_DISABLE_OPENGL_PRELOADING = "ro.zygote.disable_gl_preload"; + private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; private static final String PROPERTY_RUNNING_IN_CONTAINER = "ro.boot.container"; private static final String ANDROID_SOCKET_PREFIX = "ANDROID_SOCKET_"; @@ -243,7 +244,9 @@ private static void preloadSharedLibraries() { } private static void preloadOpenGL() { - if (!SystemProperties.getBoolean(PROPERTY_DISABLE_OPENGL_PRELOADING, false)) { + String driverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); + if (!SystemProperties.getBoolean(PROPERTY_DISABLE_OPENGL_PRELOADING, false) || + driverPackageName == null || driverPackageName.isEmpty()) { EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); } } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 92ab3246e354..8dfdc6a815a1 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -96,6 +96,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; +import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; @@ -969,7 +970,7 @@ public WindowInsets onApplyWindowInsets(WindowInsets insets) { mFrameOffsets.set(insets.getSystemWindowInsets()); insets = updateColorViews(insets, true /* animate */); insets = updateStatusGuard(insets); - updateNavigationGuard(insets); + insets = updateNavigationGuard(insets); if (getForeground() != null) { drawableChanged(); } @@ -1329,9 +1330,11 @@ private WindowInsets updateStatusGuard(WindowInsets insets) { return insets; } - private void updateNavigationGuard(WindowInsets insets) { - // IMEs lay out below the nav bar, but the content view must not (for back compat) - if (mWindow.getAttributes().type == WindowManager.LayoutParams.TYPE_INPUT_METHOD) { + private WindowInsets updateNavigationGuard(WindowInsets insets) { + // IME windows lay out below the nav bar, but the content view must not (for back compat) + // Only make this adjustment if the window is not requesting layout in overscan + if (mWindow.getAttributes().type == WindowManager.LayoutParams.TYPE_INPUT_METHOD + && (mWindow.getAttributes().flags & FLAG_LAYOUT_IN_OVERSCAN) == 0) { // prevent the content view from including the nav bar height if (mWindow.mContentParent != null) { if (mWindow.mContentParent.getLayoutParams() instanceof MarginLayoutParams) { @@ -1356,7 +1359,10 @@ private void updateNavigationGuard(WindowInsets insets) { mNavigationGuard.setLayoutParams(lp); } updateNavigationGuardColor(); + insets = insets.consumeSystemWindowInsets( + false, false, false, true /* bottom */); } + return insets; } void updateNavigationGuardColor() { diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 878f3a69a504..3b280ad20d41 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -2495,6 +2495,7 @@ protected ViewGroup generateLayout(DecorView decor) { // System.out.println("Features: 0x" + Integer.toHexString(features)); if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) { layoutResource = R.layout.screen_swipe_dismiss; + setCloseOnSwipeEnabled(true); } else if ((features & ((1 << FEATURE_LEFT_ICON) | (1 << FEATURE_RIGHT_ICON))) != 0) { if (mIsFloating) { TypedValue res = new TypedValue(); @@ -2566,7 +2567,7 @@ protected ViewGroup generateLayout(DecorView decor) { } if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) { - registerSwipeCallbacks(); + registerSwipeCallbacks(contentParent); } // Remaining setup -- of background and title -- that only applies @@ -2980,25 +2981,27 @@ private ImageView getRightIconView() { return (mRightIconView = (ImageView)findViewById(R.id.right_icon)); } - private void registerSwipeCallbacks() { - SwipeDismissLayout swipeDismiss = - (SwipeDismissLayout) findViewById(R.id.content); + private void registerSwipeCallbacks(ViewGroup contentParent) { + if (!(contentParent instanceof SwipeDismissLayout)) { + Log.w(TAG, "contentParent is not a SwipeDismissLayout: " + contentParent); + return; + } + SwipeDismissLayout swipeDismiss = (SwipeDismissLayout) contentParent; swipeDismiss.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() { @Override public void onDismissed(SwipeDismissLayout layout) { - dispatchOnWindowDismissed(false /*finishTask*/); + dispatchOnWindowSwipeDismissed(); + dispatchOnWindowDismissed(false /*finishTask*/, true /*suppressWindowTransition*/); } }); swipeDismiss.setOnSwipeProgressChangedListener( new SwipeDismissLayout.OnSwipeProgressChangedListener() { - private static final float ALPHA_DECREASE = 0.5f; - private boolean mIsTranslucent = false; @Override public void onSwipeProgressChanged( - SwipeDismissLayout layout, float progress, float translate) { + SwipeDismissLayout layout, float alpha, float translate) { WindowManager.LayoutParams newParams = getAttributes(); newParams.x = (int) translate; - newParams.alpha = 1 - (progress * ALPHA_DECREASE); + newParams.alpha = alpha; setAttributes(newParams); int flags = 0; @@ -3013,14 +3016,28 @@ public void onSwipeProgressChanged( @Override public void onSwipeCancelled(SwipeDismissLayout layout) { WindowManager.LayoutParams newParams = getAttributes(); - newParams.x = 0; - newParams.alpha = 1; - setAttributes(newParams); - setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN | FLAG_LAYOUT_NO_LIMITS); + // Swipe changes only affect the x-translation and alpha, check to see if + // those values have changed first before resetting them. + if (newParams.x != 0 || newParams.alpha != 1) { + newParams.x = 0; + newParams.alpha = 1; + setAttributes(newParams); + setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN | FLAG_LAYOUT_NO_LIMITS); + } } }); } + /** @hide */ + @Override + public void setCloseOnSwipeEnabled(boolean closeOnSwipeEnabled) { + if (hasFeature(Window.FEATURE_SWIPE_TO_DISMISS) // swipe-to-dismiss feature is requested + && mContentParent instanceof SwipeDismissLayout) { // check casting mContentParent + ((SwipeDismissLayout) mContentParent).setDismissable(closeOnSwipeEnabled); + } + super.setCloseOnSwipeEnabled(closeOnSwipeEnabled); + } + /** * Helper method for calling the {@link Callback#onPanelClosed(int, Menu)} * callback. This method will grab whatever extra state is needed for the diff --git a/core/java/com/android/internal/util/TokenBucket.java b/core/java/com/android/internal/util/TokenBucket.java new file mode 100644 index 000000000000..a163ceb5f8f8 --- /dev/null +++ b/core/java/com/android/internal/util/TokenBucket.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.util; + +import android.os.SystemClock; + +import static com.android.internal.util.Preconditions.checkArgumentNonnegative; +import static com.android.internal.util.Preconditions.checkArgumentPositive; + +/** + * A class useful for rate-limiting or throttling that stores and distributes tokens. + * + * A TokenBucket starts with a fixed capacity of tokens, an initial amount of tokens, and + * a fixed filling period (in milliseconds). + * + * For every filling period, the bucket gains one token, up to its maximum capacity from + * which point tokens simply overflow and are lost. Tokens can be obtained one by one or n by n. + * + * The available amount of tokens is computed lazily when the bucket state is inspected. + * Therefore it is purely synchronous and does not involve any asynchronous activity. + * It is not synchronized in any way and not a thread-safe object. + * + * {@hide} + */ +public class TokenBucket { + + private final int mFillDelta; // Time in ms it takes to generate one token. + private final int mCapacity; // Maximum number of tokens that can be stored. + private long mLastFill; // Last time in ms the bucket generated tokens. + private int mAvailable; // Current number of available tokens. + + /** + * Create a new TokenBucket. + * @param deltaMs the time in milliseconds it takes to generate a new token. + * Must be strictly positive. + * @param capacity the maximum token capacity. Must be strictly positive. + * @param tokens the starting amount of token. Must be positive or zero. + */ + public TokenBucket(int deltaMs, int capacity, int tokens) { + mFillDelta = checkArgumentPositive(deltaMs, "deltaMs must be strictly positive"); + mCapacity = checkArgumentPositive(capacity, "capacity must be strictly positive"); + mAvailable = Math.min(checkArgumentNonnegative(tokens), mCapacity); + mLastFill = scaledTime(); + } + + /** + * Create a new TokenBucket that starts completely filled. + * @param deltaMs the time in milliseconds it takes to generate a new token. + * Must be strictly positive. + * @param capacity the maximum token capacity. Must be strictly positive. + */ + public TokenBucket(int deltaMs, int capacity) { + this(deltaMs, capacity, capacity); + } + + /** Reset this TokenBucket and set its number of available tokens. */ + public void reset(int tokens) { + checkArgumentNonnegative(tokens); + mAvailable = Math.min(tokens, mCapacity); + mLastFill = scaledTime(); + } + + /** Returns this TokenBucket maximum token capacity. */ + public int capacity() { + return mCapacity; + } + + /** Returns this TokenBucket currently number of available tokens. */ + public int available() { + fill(); + return mAvailable; + } + + /** Returns true if this TokenBucket as one or more tokens available. */ + public boolean has() { + fill(); + return mAvailable > 0; + } + + /** Consumes a token from this TokenBucket and returns true if a token is available. */ + public boolean get() { + return (get(1) == 1); + } + + /** + * Try to consume many tokens from this TokenBucket. + * @param n the number of tokens to consume. + * @return the number of tokens that were actually consumed. + */ + public int get(int n) { + fill(); + if (n <= 0) { + return 0; + } + if (n > mAvailable) { + int got = mAvailable; + mAvailable = 0; + return got; + } + mAvailable -= n; + return n; + } + + private void fill() { + final long now = scaledTime(); + final int diff = (int) (now - mLastFill); + mAvailable = Math.min(mCapacity, mAvailable + diff); + mLastFill = now; + } + + private long scaledTime() { + return SystemClock.elapsedRealtime() / mFillDelta; + } +} diff --git a/core/java/com/android/internal/widget/DecorCaptionView.java b/core/java/com/android/internal/widget/DecorCaptionView.java index fc68b849ed20..04767b00bdff 100644 --- a/core/java/com/android/internal/widget/DecorCaptionView.java +++ b/core/java/com/android/internal/widget/DecorCaptionView.java @@ -416,7 +416,8 @@ public boolean onSingleTapUp(MotionEvent e) { if (mClickTarget == mMaximize) { maximizeWindow(); } else if (mClickTarget == mClose) { - mOwner.dispatchOnWindowDismissed(true /*finishTask*/); + mOwner.dispatchOnWindowDismissed( + true /*finishTask*/, false /*suppressWindowTransition*/); } return true; } diff --git a/core/java/com/android/internal/widget/ImageFloatingTextView.java b/core/java/com/android/internal/widget/ImageFloatingTextView.java index 358be604f847..a5d2bf3b68d3 100644 --- a/core/java/com/android/internal/widget/ImageFloatingTextView.java +++ b/core/java/com/android/internal/widget/ImageFloatingTextView.java @@ -71,10 +71,14 @@ protected Layout makeSingleLayout(int wantWidth, BoringLayout.Metrics boring, in .setTextDirection(getTextDirectionHeuristic()) .setLineSpacing(getLineSpacingExtra(), getLineSpacingMultiplier()) .setIncludePad(getIncludeFontPadding()) - .setEllipsize(shouldEllipsize ? effectiveEllipsize : null) - .setEllipsizedWidth(ellipsisWidth) .setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY) - .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL) + .setMaxLines(getMaxLines() >= 0 ? getMaxLines() : Integer.MAX_VALUE); + if (shouldEllipsize) { + builder.setEllipsize(effectiveEllipsize) + .setEllipsizedWidth(ellipsisWidth); + } + // we set the endmargin on the requested number of lines. int endMargin = getContext().getResources().getDimensionPixelSize( R.dimen.notification_content_picture_margin); diff --git a/core/java/com/android/internal/widget/LockPatternChecker.java b/core/java/com/android/internal/widget/LockPatternChecker.java index df9b0ddc1804..6defd1e8d9f2 100644 --- a/core/java/com/android/internal/widget/LockPatternChecker.java +++ b/core/java/com/android/internal/widget/LockPatternChecker.java @@ -4,6 +4,7 @@ import com.android.internal.widget.LockPatternUtils.RequestThrottledException; +import java.util.ArrayList; import java.util.List; /** @@ -61,11 +62,19 @@ public interface OnVerifyCallback { final OnVerifyCallback callback) { AsyncTask task = new AsyncTask() { private int mThrottleTimeout; + private List patternCopy; + + @Override + protected void onPreExecute() { + // Make a copy of the pattern to prevent race conditions. + // No need to clone the individual cells because they are immutable. + patternCopy = new ArrayList(pattern); + } @Override protected byte[] doInBackground(Void... args) { try { - return utils.verifyPattern(pattern, challenge, userId); + return utils.verifyPattern(patternCopy, challenge, userId); } catch (RequestThrottledException ex) { mThrottleTimeout = ex.getTimeoutMs(); return null; @@ -95,11 +104,19 @@ protected void onPostExecute(byte[] result) { final OnCheckCallback callback) { AsyncTask task = new AsyncTask() { private int mThrottleTimeout; + private List patternCopy; + + @Override + protected void onPreExecute() { + // Make a copy of the pattern to prevent race conditions. + // No need to clone the individual cells because they are immutable. + patternCopy = new ArrayList(pattern); + } @Override protected Boolean doInBackground(Void... args) { try { - return utils.checkPattern(pattern, userId, callback::onEarlyMatched); + return utils.checkPattern(patternCopy, userId, callback::onEarlyMatched); } catch (RequestThrottledException ex) { mThrottleTimeout = ex.getTimeoutMs(); return false; diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java index 96492e283e1f..4ba19f446b13 100644 --- a/core/java/com/android/internal/widget/LockPatternView.java +++ b/core/java/com/android/internal/widget/LockPatternView.java @@ -24,6 +24,7 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.CanvasProperty; +import android.graphics.drawable.Drawable; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; @@ -143,6 +144,10 @@ public class LockPatternView extends View { private PatternExploreByTouchHelper mExploreByTouchHelper; private AudioManager mAudioManager; + private Drawable mSelectedDrawable; + private Drawable mNotSelectedDrawable; + private boolean mUseLockPatternDrawable; + /** * Represents a cell in the 3 X 3 matrix of the unlock pattern view. */ @@ -314,6 +319,12 @@ public LockPatternView(Context context, AttributeSet attrs) { mDotSizeActivated = getResources().getDimensionPixelSize( R.dimen.lock_pattern_dot_size_activated); + mUseLockPatternDrawable = getResources().getBoolean(R.bool.use_lock_pattern_drawable); + if (mUseLockPatternDrawable) { + mSelectedDrawable = getResources().getDrawable(R.drawable.lockscreen_selected); + mNotSelectedDrawable = getResources().getDrawable(R.drawable.lockscreen_notselected); + } + mPaint.setAntiAlias(true); mPaint.setDither(true); @@ -621,6 +632,11 @@ protected void onSizeChanged(int w, int h, int oldw, int oldh) { final int height = h - mPaddingTop - mPaddingBottom; mSquareHeight = height / 3.0f; mExploreByTouchHelper.invalidateRoot(); + + if (mUseLockPatternDrawable) { + mNotSelectedDrawable.setBounds(mPaddingLeft, mPaddingTop, width, height); + mSelectedDrawable.setBounds(mPaddingLeft, mPaddingTop, width, height); + } } private int resolveMeasured(int measureSpec, int desired) @@ -1095,14 +1111,18 @@ protected void onDraw(Canvas canvas) { CellState cellState = mCellStates[i][j]; float centerX = getCenterXForColumn(j); float translationY = cellState.translationY; - if (isHardwareAccelerated() && cellState.hwAnimating) { - DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas; - displayListCanvas.drawCircle(cellState.hwCenterX, cellState.hwCenterY, - cellState.hwRadius, cellState.hwPaint); - } else { - drawCircle(canvas, (int) centerX, (int) centerY + translationY, - cellState.radius, drawLookup[i][j], cellState.alpha); + if (mUseLockPatternDrawable) { + drawCellDrawable(canvas, i, j, cellState.radius, drawLookup[i][j]); + } else { + if (isHardwareAccelerated() && cellState.hwAnimating) { + DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas; + displayListCanvas.drawCircle(cellState.hwCenterX, cellState.hwCenterY, + cellState.hwRadius, cellState.hwPaint); + } else { + drawCircle(canvas, (int) centerX, (int) centerY + translationY, + cellState.radius, drawLookup[i][j], cellState.alpha); + } } } } @@ -1193,6 +1213,30 @@ private void drawCircle(Canvas canvas, float centerX, float centerY, float radiu canvas.drawCircle(centerX, centerY, radius, mPaint); } + /** + * @param partOfPattern Whether this circle is part of the pattern. + */ + private void drawCellDrawable(Canvas canvas, int i, int j, float radius, + boolean partOfPattern) { + Rect dst = new Rect( + (int) (mPaddingLeft + j * mSquareWidth), + (int) (mPaddingTop + i * mSquareHeight), + (int) (mPaddingLeft + (j + 1) * mSquareWidth), + (int) (mPaddingTop + (i + 1) * mSquareHeight)); + float scale = radius / (mDotSize / 2); + + // Only draw on this square with the appropriate scale. + canvas.save(); + canvas.clipRect(dst); + canvas.scale(scale, scale, dst.centerX(), dst.centerY()); + if (!partOfPattern || scale > 1) { + mNotSelectedDrawable.draw(canvas); + } else { + mSelectedDrawable.draw(canvas); + } + canvas.restore(); + } + @Override protected Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); diff --git a/core/java/com/android/internal/widget/MessagingLinearLayout.java b/core/java/com/android/internal/widget/MessagingLinearLayout.java index d2a43b755f18..cb123a13ad1d 100644 --- a/core/java/com/android/internal/widget/MessagingLinearLayout.java +++ b/core/java/com/android/internal/widget/MessagingLinearLayout.java @@ -126,7 +126,8 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Pretend we need the image padding for all views, we don't know which // one will end up needing to do this (might end up not using all the space, // but calculating this exactly would be more expensive). - ((ImageFloatingTextView) child).setNumIndentLines(mIndentLines); + ((ImageFloatingTextView) child).setNumIndentLines( + mIndentLines == 2 ? 3 : mIndentLines); } measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0); @@ -147,6 +148,9 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Now that we know which views to take, fix up the indents and see what width we get. int measuredWidth = mPaddingLeft + mPaddingRight; int imageLines = mIndentLines; + // Need to redo the height because it may change due to changing indents. + totalHeight = mPaddingTop + mPaddingBottom; + first = true; for (int i = 0; i < count; i++) { final View child = getChildAt(i); final LayoutParams lp = (LayoutParams) child.getLayoutParams(); @@ -173,6 +177,9 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { measuredWidth = Math.max(measuredWidth, child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin + mPaddingLeft + mPaddingRight); + totalHeight = Math.max(totalHeight, totalHeight + child.getMeasuredHeight() + + lp.topMargin + lp.bottomMargin + (first ? 0 : mSpacing)); + first = false; } diff --git a/core/java/com/android/internal/widget/SwipeDismissLayout.java b/core/java/com/android/internal/widget/SwipeDismissLayout.java index d88f4797cc1c..6d814bf14bc0 100644 --- a/core/java/com/android/internal/widget/SwipeDismissLayout.java +++ b/core/java/com/android/internal/widget/SwipeDismissLayout.java @@ -16,9 +16,14 @@ package com.android.internal.widget; +import android.animation.Animator; +import android.animation.TimeInterpolator; +import android.animation.ValueAnimator; +import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; +import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; import android.content.res.TypedArray; @@ -29,7 +34,7 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; -import android.view.ViewTreeObserver; +import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; /** @@ -38,8 +43,8 @@ public class SwipeDismissLayout extends FrameLayout { private static final String TAG = "SwipeDismissLayout"; - private static final float DISMISS_MIN_DRAG_WIDTH_RATIO = .33f; - private boolean mUseDynamicTranslucency = true; + private static final float MAX_DIST_THRESHOLD = .33f; + private static final float MIN_DIST_THRESHOLD = .1f; public interface OnDismissedListener { void onDismissed(SwipeDismissLayout layout); @@ -49,16 +54,18 @@ public interface OnSwipeProgressChangedListener { /** * Called when the layout has been swiped and the position of the window should change. * - * @param progress A number in [0, 1] representing how far to the - * right the window has been swiped + * @param alpha A number in [0, 1] representing what the alpha transparency of the window + * should be. * @param translate A number in [0, w], where w is the width of the * layout. This is equivalent to progress * layout.getWidth(). */ - void onSwipeProgressChanged(SwipeDismissLayout layout, float progress, float translate); + void onSwipeProgressChanged(SwipeDismissLayout layout, float alpha, float translate); void onSwipeCancelled(SwipeDismissLayout layout); } + private boolean mIsWindowNativelyTranslucent; + // Cached ViewConfiguration and system-wide constant values private int mSlop; private int mMinFlingVelocity; @@ -67,27 +74,18 @@ public interface OnSwipeProgressChangedListener { private int mActiveTouchId; private float mDownX; private float mDownY; + private float mLastX; private boolean mSwiping; private boolean mDismissed; private boolean mDiscardIntercept; private VelocityTracker mVelocityTracker; - private float mTranslationX; + private boolean mBlockGesture = false; + private boolean mActivityTranslucencyConverted = false; + + private final DismissAnimator mDismissAnimator = new DismissAnimator(); private OnDismissedListener mDismissedListener; private OnSwipeProgressChangedListener mProgressListener; - private ViewTreeObserver.OnEnterAnimationCompleteListener mOnEnterAnimationCompleteListener = - new ViewTreeObserver.OnEnterAnimationCompleteListener() { - @Override - public void onEnterAnimationComplete() { - // SwipeDismissLayout assumes that the host Activity is translucent - // and temporarily disables translucency when it is fully visible. - // As soon as the user starts swiping, we will re-enable - // translucency. - if (mUseDynamicTranslucency && getContext() instanceof Activity) { - ((Activity) getContext()).convertFromTranslucent(); - } - } - }; private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { private Runnable mRunnable = new Runnable() { @Override @@ -108,7 +106,8 @@ public void onReceive(Context context, Intent intent) { }; private IntentFilter mScreenOffFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF); - private float mLastX; + + private boolean mDismissable = true; public SwipeDismissLayout(Context context) { super(context); @@ -131,8 +130,8 @@ private void init(Context context) { mMinFlingVelocity = vc.getScaledMinimumFlingVelocity(); TypedArray a = context.getTheme().obtainStyledAttributes( com.android.internal.R.styleable.Theme); - mUseDynamicTranslucency = !a.hasValue( - com.android.internal.R.styleable.Window_windowIsTranslucent); + mIsWindowNativelyTranslucent = a.getBoolean( + com.android.internal.R.styleable.Window_windowIsTranslucent, false); a.recycle(); } @@ -147,27 +146,29 @@ public void setOnSwipeProgressChangedListener(OnSwipeProgressChangedListener lis @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - if (getContext() instanceof Activity) { - getViewTreeObserver().addOnEnterAnimationCompleteListener( - mOnEnterAnimationCompleteListener); - } getContext().registerReceiver(mScreenOffReceiver, mScreenOffFilter); } @Override protected void onDetachedFromWindow() { getContext().unregisterReceiver(mScreenOffReceiver); - if (getContext() instanceof Activity) { - getViewTreeObserver().removeOnEnterAnimationCompleteListener( - mOnEnterAnimationCompleteListener); - } super.onDetachedFromWindow(); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { - // offset because the view is translated during swipe - ev.offsetLocation(mTranslationX, 0); + checkGesture((ev)); + if (mBlockGesture) { + return true; + } + if (!mDismissable) { + return super.onInterceptTouchEvent(ev); + } + + // Offset because the view is translated during swipe, match X with raw X. Active touch + // coordinates are mostly used by the velocity tracker, so offset it to match the raw + // coordinates which is what is primarily used elsewhere. + ev.offsetLocation(ev.getRawX() - ev.getX(), 0); switch (ev.getActionMasked()) { case MotionEvent.ACTION_DOWN: @@ -175,7 +176,7 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { mDownX = ev.getRawX(); mDownY = ev.getRawY(); mActiveTouchId = ev.getPointerId(0); - mVelocityTracker = VelocityTracker.obtain(); + mVelocityTracker = VelocityTracker.obtain("int1"); mVelocityTracker.addMovement(ev); break; @@ -225,18 +226,29 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { @Override public boolean onTouchEvent(MotionEvent ev) { - if (mVelocityTracker == null) { + checkGesture((ev)); + if (mBlockGesture) { + return true; + } + if (mVelocityTracker == null || !mDismissable) { return super.onTouchEvent(ev); } - // offset because the view is translated during swipe - ev.offsetLocation(mTranslationX, 0); + + // Offset because the view is translated during swipe, match X with raw X. Active touch + // coordinates are mostly used by the velocity tracker, so offset it to match the raw + // coordinates which is what is primarily used elsewhere. + ev.offsetLocation(ev.getRawX() - ev.getX(), 0); + switch (ev.getActionMasked()) { case MotionEvent.ACTION_UP: updateDismiss(ev); if (mDismissed) { - dismiss(); - } else if (mSwiping) { - cancel(); + mDismissAnimator.animateDismissal(ev.getRawX() - mDownX); + } else if (mSwiping + // Only trigger animation if we had a MOVE event that would shift the + // underlying view, otherwise the animation would be janky. + && mLastX != Integer.MIN_VALUE) { + mDismissAnimator.animateRecovery(ev.getRawX() - mDownX); } resetMembers(); break; @@ -251,9 +263,6 @@ public boolean onTouchEvent(MotionEvent ev) { mLastX = ev.getRawX(); updateSwiping(ev); if (mSwiping) { - if (mUseDynamicTranslucency && getContext() instanceof Activity) { - ((Activity) getContext()).convertToTranslucent(null, null); - } setProgress(ev.getRawX() - mDownX); break; } @@ -262,9 +271,9 @@ public boolean onTouchEvent(MotionEvent ev) { } private void setProgress(float deltaX) { - mTranslationX = deltaX; if (mProgressListener != null && deltaX >= 0) { - mProgressListener.onSwipeProgressChanged(this, deltaX / getWidth(), deltaX); + mProgressListener.onSwipeProgressChanged( + this, progressToAlpha(deltaX / getWidth()), deltaX); } } @@ -275,8 +284,12 @@ private void dismiss() { } protected void cancel() { - if (mUseDynamicTranslucency && getContext() instanceof Activity) { - ((Activity) getContext()).convertFromTranslucent(); + if (!mIsWindowNativelyTranslucent) { + Activity activity = findActivity(); + if (activity != null && mActivityTranslucencyConverted) { + activity.convertFromTranslucent(); + mActivityTranslucencyConverted = false; + } } if (mProgressListener != null) { mProgressListener.onSwipeCancelled(this); @@ -291,8 +304,8 @@ private void resetMembers() { mVelocityTracker.recycle(); } mVelocityTracker = null; - mTranslationX = 0; mDownX = 0; + mLastX = Integer.MIN_VALUE; mDownY = 0; mSwiping = false; mDismissed = false; @@ -300,6 +313,7 @@ private void resetMembers() { } private void updateSwiping(MotionEvent ev) { + boolean oldSwiping = mSwiping; if (!mSwiping) { float deltaX = ev.getRawX() - mDownX; float deltaY = ev.getRawY() - mDownY; @@ -309,25 +323,46 @@ private void updateSwiping(MotionEvent ev) { mSwiping = false; } } + + if (mSwiping && !oldSwiping) { + // Swiping has started + if (!mIsWindowNativelyTranslucent) { + Activity activity = findActivity(); + if (activity != null) { + mActivityTranslucencyConverted = activity.convertToTranslucent(null, null); + } + } + } } private void updateDismiss(MotionEvent ev) { float deltaX = ev.getRawX() - mDownX; - mVelocityTracker.addMovement(ev); + // Don't add the motion event as an UP event would clear the velocity tracker mVelocityTracker.computeCurrentVelocity(1000); + float xVelocity = mVelocityTracker.getXVelocity(); + if (mLastX == Integer.MIN_VALUE) { + // If there's no changes to mLastX, we have only one point of data, and therefore no + // velocity. Estimate velocity from just the up and down event in that case. + xVelocity = deltaX / ((ev.getEventTime() - ev.getDownTime()) / 1000); + } if (!mDismissed) { - - if (deltaX > (getWidth() * DISMISS_MIN_DRAG_WIDTH_RATIO) && - ev.getRawX() >= mLastX) { + // Adjust the distance threshold linearly between the min and max threshold based on the + // x-velocity scaled with the the fling threshold speed + float distanceThreshold = getWidth() * Math.max( + Math.min((MIN_DIST_THRESHOLD - MAX_DIST_THRESHOLD) + * xVelocity / mMinFlingVelocity // scale x-velocity with fling velocity + + MAX_DIST_THRESHOLD, // offset to start at max threshold + MAX_DIST_THRESHOLD), // cap at max threshold + MIN_DIST_THRESHOLD); // bottom out at min threshold + if ((deltaX > distanceThreshold && ev.getRawX() >= mLastX) + || xVelocity >= mMinFlingVelocity) { mDismissed = true; } } // Check if the user tried to undo this. if (mDismissed && mSwiping) { - // Check if the user's finger is actually back - if (deltaX < (getWidth() * DISMISS_MIN_DRAG_WIDTH_RATIO) || - // or user is flinging back left - mVelocityTracker.getXVelocity() < -mMinFlingVelocity) { + // Check if the user's finger is actually flinging back to left + if (xVelocity < -mMinFlingVelocity) { mDismissed = false; } } @@ -363,4 +398,111 @@ protected boolean canScroll(View v, boolean checkV, float dx, float x, float y) return checkV && v.canScrollHorizontally((int) -dx); } + + public void setDismissable(boolean dismissable) { + if (!dismissable && mDismissable) { + cancel(); + resetMembers(); + } + + mDismissable = dismissable; + } + + private void checkGesture(MotionEvent ev) { + if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { + mBlockGesture = mDismissAnimator.isAnimating(); + } + } + + private float progressToAlpha(float progress) { + return 1 - progress * progress * progress; + } + + private Activity findActivity() { + Context context = getContext(); + while (context instanceof ContextWrapper) { + if (context instanceof Activity) { + return (Activity) context; + } + context = ((ContextWrapper) context).getBaseContext(); + } + return null; + } + + private class DismissAnimator implements AnimatorUpdateListener, Animator.AnimatorListener { + private final TimeInterpolator DISMISS_INTERPOLATOR = new DecelerateInterpolator(1.5f); + private final long DISMISS_DURATION = 250; + + private final ValueAnimator mDismissAnimator = new ValueAnimator(); + private boolean mWasCanceled = false; + private boolean mDismissOnComplete = false; + + /* package */ DismissAnimator() { + mDismissAnimator.addUpdateListener(this); + mDismissAnimator.addListener(this); + } + + /* package */ void animateDismissal(float currentTranslation) { + animate( + currentTranslation / getWidth(), + 1, + DISMISS_DURATION, + DISMISS_INTERPOLATOR, + true /* dismiss */); + } + + /* package */ void animateRecovery(float currentTranslation) { + animate( + currentTranslation / getWidth(), + 0, + DISMISS_DURATION, + DISMISS_INTERPOLATOR, + false /* don't dismiss */); + } + + /* package */ boolean isAnimating() { + return mDismissAnimator.isStarted(); + } + + private void animate(float from, float to, long duration, TimeInterpolator interpolator, + boolean dismissOnComplete) { + mDismissAnimator.cancel(); + mDismissOnComplete = dismissOnComplete; + mDismissAnimator.setFloatValues(from, to); + mDismissAnimator.setDuration(duration); + mDismissAnimator.setInterpolator(interpolator); + mDismissAnimator.start(); + } + + @Override + public void onAnimationUpdate(ValueAnimator animation) { + float value = (Float) animation.getAnimatedValue(); + setProgress(value * getWidth()); + } + + @Override + public void onAnimationStart(Animator animation) { + mWasCanceled = false; + } + + @Override + public void onAnimationCancel(Animator animation) { + mWasCanceled = true; + } + + @Override + public void onAnimationEnd(Animator animation) { + if (!mWasCanceled) { + if (mDismissOnComplete) { + dismiss(); + } else { + cancel(); + } + } + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + } } diff --git a/core/java/com/android/internal/widget/WatchHeaderListView.java b/core/java/com/android/internal/widget/WatchHeaderListView.java index 3d32d86cd49c..4fd19c37bf47 100644 --- a/core/java/com/android/internal/widget/WatchHeaderListView.java +++ b/core/java/com/android/internal/widget/WatchHeaderListView.java @@ -103,7 +103,8 @@ protected View findViewByPredicateTraversal(Predicate predicate, View chil @Override public int getHeaderViewsCount() { - return mTopPanel == null ? super.getHeaderViewsCount() : super.getHeaderViewsCount() + 1; + return mTopPanel == null ? super.getHeaderViewsCount() + : super.getHeaderViewsCount() + (mTopPanel.getVisibility() == GONE ? 0 : 1); } private void wrapAdapterIfNecessary() { @@ -133,7 +134,7 @@ public void setTopPanel(View v) { } private int getTopPanelCount() { - return mTopPanel == null ? 0 : 1; + return (mTopPanel == null || mTopPanel.getVisibility() == GONE) ? 0 : 1; } @Override @@ -143,33 +144,19 @@ public int getCount() { @Override public boolean areAllItemsEnabled() { - return mTopPanel == null && super.areAllItemsEnabled(); + return getTopPanelCount() == 0 && super.areAllItemsEnabled(); } @Override public boolean isEnabled(int position) { - if (mTopPanel != null) { - if (position == 0) { - return false; - } else { - return super.isEnabled(position - 1); - } - } - - return super.isEnabled(position); + int topPanelCount = getTopPanelCount(); + return position < topPanelCount ? false : super.isEnabled(position - topPanelCount); } @Override public Object getItem(int position) { - if (mTopPanel != null) { - if (position == 0) { - return null; - } else { - return super.getItem(position - 1); - } - } - - return super.getItem(position); + int topPanelCount = getTopPanelCount(); + return position < topPanelCount ? null : super.getItem(position - topPanelCount); } @Override @@ -187,15 +174,9 @@ public long getItemId(int position) { @Override public View getView(int position, View convertView, ViewGroup parent) { - if (mTopPanel != null) { - if (position == 0) { - return mTopPanel; - } else { - return super.getView(position - 1, convertView, parent); - } - } - - return super.getView(position, convertView, parent); + int topPanelCount = getTopPanelCount(); + return position < topPanelCount + ? mTopPanel : super.getView(position - topPanelCount, convertView, parent); } @Override diff --git a/core/java/com/android/internal/widget/WatchListDecorLayout.java b/core/java/com/android/internal/widget/WatchListDecorLayout.java index 538cecaec616..5b49611fa4b0 100644 --- a/core/java/com/android/internal/widget/WatchListDecorLayout.java +++ b/core/java/com/android/internal/widget/WatchListDecorLayout.java @@ -306,8 +306,9 @@ public void onScrollChanged() { if (mListView.getChildCount() > 0) { if (mListView.getLastVisiblePosition() >= mListView.getCount() - 1) { View lastChild = mListView.getChildAt(mListView.getChildCount() - 1); - setScrolling(mBottomPanel, - lastChild.getY() + lastChild.getHeight() - mBottomPanel.getTop()); + setScrolling(mBottomPanel, Math.max( + 0, + lastChild.getY() + lastChild.getHeight() - mBottomPanel.getTop())); } else { // shift to hide the frame, last child is not the last position setScrolling(mBottomPanel, mBottomPanel.getHeight()); diff --git a/core/jni/Android.mk b/core/jni/Android.mk index e665ef38c9a4..206f44e72f23 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -81,6 +81,7 @@ LOCAL_SRC_FILES:= \ android_text_AndroidBidi.cpp \ android_text_StaticLayout.cpp \ android_os_Debug.cpp \ + android_os_GraphicsEnvironment.cpp \ android_os_MemoryFile.cpp \ android_os_MessageQueue.cpp \ android_os_Parcel.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 1fda0b7a09a7..32c90c0329c1 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -157,6 +157,7 @@ extern int register_android_database_SQLiteGlobal(JNIEnv* env); extern int register_android_database_SQLiteDebug(JNIEnv* env); extern int register_android_nio_utils(JNIEnv* env); extern int register_android_os_Debug(JNIEnv* env); +extern int register_android_os_GraphicsEnvironment(JNIEnv* env); extern int register_android_os_MessageQueue(JNIEnv* env); extern int register_android_os_Parcel(JNIEnv* env); extern int register_android_os_SELinux(JNIEnv* env); @@ -1350,6 +1351,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_database_SQLiteDebug), REG_JNI(register_android_os_Debug), REG_JNI(register_android_os_FileObserver), + REG_JNI(register_android_os_GraphicsEnvironment), REG_JNI(register_android_os_MessageQueue), REG_JNI(register_android_os_SELinux), REG_JNI(register_android_os_Trace), diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp index 679e88299992..eb105d292a43 100644 --- a/core/jni/android_net_NetUtils.cpp +++ b/core/jni/android_net_NetUtils.cpp @@ -47,28 +47,33 @@ int ifc_disable(const char *ifname); namespace android { +static const uint32_t kEtherTypeOffset = offsetof(ether_header, ether_type); +static const uint32_t kEtherHeaderLen = sizeof(ether_header); +static const uint32_t kIPv4Protocol = kEtherHeaderLen + offsetof(iphdr, protocol); +static const uint32_t kIPv4FlagsOffset = kEtherHeaderLen + offsetof(iphdr, frag_off); +static const uint32_t kIPv6NextHeader = kEtherHeaderLen + offsetof(ip6_hdr, ip6_nxt); +static const uint32_t kIPv6PayloadStart = kEtherHeaderLen + sizeof(ip6_hdr); +static const uint32_t kICMPv6TypeOffset = kIPv6PayloadStart + offsetof(icmp6_hdr, icmp6_type); +static const uint32_t kUDPSrcPortIndirectOffset = kEtherHeaderLen + offsetof(udphdr, source); +static const uint32_t kUDPDstPortIndirectOffset = kEtherHeaderLen + offsetof(udphdr, dest); static const uint16_t kDhcpClientPort = 68; static void android_net_utils_attachDhcpFilter(JNIEnv *env, jobject clazz, jobject javaFd) { - uint32_t ip_offset = sizeof(ether_header); - uint32_t proto_offset = ip_offset + offsetof(iphdr, protocol); - uint32_t flags_offset = ip_offset + offsetof(iphdr, frag_off); - uint32_t dport_indirect_offset = ip_offset + offsetof(udphdr, dest); struct sock_filter filter_code[] = { // Check the protocol is UDP. - BPF_STMT(BPF_LD | BPF_B | BPF_ABS, proto_offset), + BPF_STMT(BPF_LD | BPF_B | BPF_ABS, kIPv4Protocol), BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, IPPROTO_UDP, 0, 6), // Check this is not a fragment. - BPF_STMT(BPF_LD | BPF_H | BPF_ABS, flags_offset), - BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 4, 0), + BPF_STMT(BPF_LD | BPF_H | BPF_ABS, kIPv4FlagsOffset), + BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, IP_OFFMASK, 4, 0), // Get the IP header length. - BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, ip_offset), + BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, kEtherHeaderLen), // Check the destination port. - BPF_STMT(BPF_LD | BPF_H | BPF_IND, dport_indirect_offset), + BPF_STMT(BPF_LD | BPF_H | BPF_IND, kUDPDstPortIndirectOffset), BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, kDhcpClientPort, 0, 1), // Accept or reject. @@ -96,17 +101,13 @@ static void android_net_utils_attachRaFilter(JNIEnv *env, jobject clazz, jobject return; } - uint32_t ipv6_offset = sizeof(ether_header); - uint32_t ipv6_next_header_offset = ipv6_offset + offsetof(ip6_hdr, ip6_nxt); - uint32_t icmp6_offset = ipv6_offset + sizeof(ip6_hdr); - uint32_t icmp6_type_offset = icmp6_offset + offsetof(icmp6_hdr, icmp6_type); struct sock_filter filter_code[] = { // Check IPv6 Next Header is ICMPv6. - BPF_STMT(BPF_LD | BPF_B | BPF_ABS, ipv6_next_header_offset), + BPF_STMT(BPF_LD | BPF_B | BPF_ABS, kIPv6NextHeader), BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, IPPROTO_ICMPV6, 0, 3), // Check ICMPv6 type is Router Advertisement. - BPF_STMT(BPF_LD | BPF_B | BPF_ABS, icmp6_type_offset), + BPF_STMT(BPF_LD | BPF_B | BPF_ABS, kICMPv6TypeOffset), BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, ND_ROUTER_ADVERT, 0, 1), // Accept or reject. @@ -125,6 +126,81 @@ static void android_net_utils_attachRaFilter(JNIEnv *env, jobject clazz, jobject } } +// TODO: Move all this filter code into libnetutils. +static void android_net_utils_attachControlPacketFilter( + JNIEnv *env, jobject clazz, jobject javaFd, jint hardwareAddressType) { + if (hardwareAddressType != ARPHRD_ETHER) { + jniThrowExceptionFmt(env, "java/net/SocketException", + "attachControlPacketFilter only supports ARPHRD_ETHER"); + return; + } + + // Capture all: + // - ARPs + // - DHCPv4 packets + // - Router Advertisements & Solicitations + // - Neighbor Advertisements & Solicitations + // + // tcpdump: + // arp or + // '(ip and udp port 68)' or + // '(icmp6 and ip6[40] >= 133 and ip6[40] <= 136)' + struct sock_filter filter_code[] = { + // Load the link layer next payload field. + BPF_STMT(BPF_LD | BPF_H | BPF_ABS, kEtherTypeOffset), + + // Accept all ARP. + // TODO: Figure out how to better filter ARPs on noisy networks. + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, ETHERTYPE_ARP, 16, 0), + + // If IPv4: + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, ETHERTYPE_IP, 0, 9), + + // Check the protocol is UDP. + BPF_STMT(BPF_LD | BPF_B | BPF_ABS, kIPv4Protocol), + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, IPPROTO_UDP, 0, 14), + + // Check this is not a fragment. + BPF_STMT(BPF_LD | BPF_H | BPF_ABS, kIPv4FlagsOffset), + BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, IP_OFFMASK, 12, 0), + + // Get the IP header length. + BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, kEtherHeaderLen), + + // Check the source port. + BPF_STMT(BPF_LD | BPF_H | BPF_IND, kUDPSrcPortIndirectOffset), + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, kDhcpClientPort, 8, 0), + + // Check the destination port. + BPF_STMT(BPF_LD | BPF_H | BPF_IND, kUDPDstPortIndirectOffset), + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, kDhcpClientPort, 6, 7), + + // IPv6 ... + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, ETHERTYPE_IPV6, 0, 6), + // ... check IPv6 Next Header is ICMPv6 (ignore fragments), ... + BPF_STMT(BPF_LD | BPF_B | BPF_ABS, kIPv6NextHeader), + BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, IPPROTO_ICMPV6, 0, 4), + // ... and check the ICMPv6 type is one of RS/RA/NS/NA. + BPF_STMT(BPF_LD | BPF_B | BPF_ABS, kICMPv6TypeOffset), + BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, ND_ROUTER_SOLICIT, 0, 2), + BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, ND_NEIGHBOR_ADVERT, 1, 0), + + // Accept or reject. + BPF_STMT(BPF_RET | BPF_K, 0xffff), + BPF_STMT(BPF_RET | BPF_K, 0) + }; + struct sock_fprog filter = { + sizeof(filter_code) / sizeof(filter_code[0]), + filter_code, + }; + + int fd = jniGetFDFromFileDescriptor(env, javaFd); + if (setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter, sizeof(filter)) != 0) { + jniThrowExceptionFmt(env, "java/net/SocketException", + "setsockopt(SO_ATTACH_FILTER): %s", strerror(errno)); + } +} + static void android_net_utils_setupRaSocket(JNIEnv *env, jobject clazz, jobject javaFd, jint ifIndex) { @@ -266,6 +342,7 @@ static const JNINativeMethod gNetworkUtilMethods[] = { { "queryUserAccess", "(II)Z", (void*)android_net_utils_queryUserAccess }, { "attachDhcpFilter", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_attachDhcpFilter }, { "attachRaFilter", "(Ljava/io/FileDescriptor;I)V", (void*) android_net_utils_attachRaFilter }, + { "attachControlPacketFilter", "(Ljava/io/FileDescriptor;I)V", (void*) android_net_utils_attachControlPacketFilter }, { "setupRaSocket", "(Ljava/io/FileDescriptor;I)V", (void*) android_net_utils_setupRaSocket }, }; diff --git a/core/jni/android_os_GraphicsEnvironment.cpp b/core/jni/android_os_GraphicsEnvironment.cpp new file mode 100644 index 000000000000..905a85adc551 --- /dev/null +++ b/core/jni/android_os_GraphicsEnvironment.cpp @@ -0,0 +1,44 @@ +/* + * Copyright 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. + */ + +#define LOG_TAG "GraphicsEnvironment" + +#include +#include +#include "core_jni_helpers.h" + +namespace { + +void setDriverPath(JNIEnv* env, jobject clazz, jstring path) { + ScopedUtfChars pathChars(env, path); + android::GraphicsEnv::getInstance().setDriverPath(pathChars.c_str()); +} + +const JNINativeMethod g_methods[] = { + { "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast(setDriverPath) }, +}; + +const char* const kGraphicsEnvironmentName = "android/os/GraphicsEnvironment"; + +} // anonymous namespace + +namespace android { + +int register_android_os_GraphicsEnvironment(JNIEnv* env) { + return RegisterMethodsOrDie(env, kGraphicsEnvironmentName, g_methods, NELEM(g_methods)); +} + +} // namespace android diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index b734436d6ab1..417edb22905e 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include // for AID_SYSTEM @@ -41,6 +42,7 @@ #include "ScopedUtfChars.h" #include "utils/Log.h" #include "utils/misc.h" +#include "utils/String8.h" extern "C" int capget(cap_user_header_t hdrp, cap_user_data_t datap); extern "C" int capset(cap_user_header_t hdrp, const cap_user_data_t datap); diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp index 6b634dfbef3e..4150636cae12 100644 --- a/core/jni/android_view_PointerIcon.cpp +++ b/core/jni/android_view_PointerIcon.cpp @@ -78,6 +78,9 @@ status_t android_view_PointerIcon_load(JNIEnv* env, jobject pointerIconObj, jobj status_t android_view_PointerIcon_getLoadedIcon(JNIEnv* env, jobject pointerIconObj, PointerIcon* outPointerIcon) { + if (!pointerIconObj) { + return BAD_VALUE; + } outPointerIcon->style = env->GetIntField(pointerIconObj, gPointerIconClassInfo.mType); outPointerIcon->hotSpotX = env->GetFloatField(pointerIconObj, gPointerIconClassInfo.mHotSpotX); outPointerIcon->hotSpotY = env->GetFloatField(pointerIconObj, gPointerIconClassInfo.mHotSpotY); diff --git a/core/jni/fd_utils-inl.h b/core/jni/fd_utils-inl.h index e0512882a043..53bad0a44c5a 100644 --- a/core/jni/fd_utils-inl.h +++ b/core/jni/fd_utils-inl.h @@ -20,6 +20,7 @@ #include #include +#include #include #include #include diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index b375dcd5a6b4..7b1c4b0b14dd 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -105,6 +105,7 @@ + @@ -464,6 +465,7 @@ + @@ -728,6 +730,7 @@ android:priority="400" /> - @@ -3417,10 +3422,13 @@ android:permission="android.permission.BIND_JOB_SERVICE" > - + + + + diff --git a/core/res/assets/images/android-logo-mask.png b/core/res/assets/images/android-logo-mask.png index ad40645e8943..5512c0ad8a83 100644 Binary files a/core/res/assets/images/android-logo-mask.png and b/core/res/assets/images/android-logo-mask.png differ diff --git a/core/res/assets/images/android-logo-shine.png b/core/res/assets/images/android-logo-shine.png index cb65f229eb52..c5d126392eeb 100644 Binary files a/core/res/assets/images/android-logo-shine.png and b/core/res/assets/images/android-logo-shine.png differ diff --git a/core/res/assets/images/clock64.png b/core/res/assets/images/clock64.png deleted file mode 100644 index 493a1ea97717..000000000000 Binary files a/core/res/assets/images/clock64.png and /dev/null differ diff --git a/core/res/assets/images/clock_font.png b/core/res/assets/images/clock_font.png new file mode 100644 index 000000000000..be927ae2612f Binary files /dev/null and b/core/res/assets/images/clock_font.png differ diff --git a/core/res/assets/sounds/bootanim0.raw b/core/res/assets/sounds/bootanim0.raw deleted file mode 100644 index 46b8c0f9a8c4..000000000000 Binary files a/core/res/assets/sounds/bootanim0.raw and /dev/null differ diff --git a/core/res/assets/sounds/bootanim1.raw b/core/res/assets/sounds/bootanim1.raw deleted file mode 100644 index ce69944f69b2..000000000000 Binary files a/core/res/assets/sounds/bootanim1.raw and /dev/null differ diff --git a/core/res/assets/webkit/hyph_en_US.dic b/core/res/assets/webkit/hyph_en_US.dic deleted file mode 100644 index d91204b55418..000000000000 --- a/core/res/assets/webkit/hyph_en_US.dic +++ /dev/null @@ -1,9784 +0,0 @@ -ISO8859-1 -LEFTHYPHENMIN 2 -RIGHTHYPHENMIN 3 -.a2ch4 -.ad4der -.a2d -.ad1d4 -.a2f1t -.a2f -.a4l3t -.am5at -.4a1ma -.an5c -.a2n -.2ang4 -.an1i5m -.an1t4 -.an3te -.anti5s -.ant2i -.a4r5s2 -.2a2r -.ar4t2ie4 -.ar1ti -.ar4ty -.as3c -.as1p -.a2s1s -.aster5 -.a2tom5 -.a1to -.au1d -.av4i -.awn4 -.ba4g -.ba5na -.ba2n -.bas4e -.ber4 -.be5r1a -.be3s1m -.4bes4 -.b4e5s2to -.bri2 -.but4ti -.bu4t3t2 -.cam4pe -.1ca -.ca4m1p -.can5c -.ca2n -.capa5b -.ca1pa -.car5ol -.c2a2r -.ca4t -.ce4la -.2ch4 -.chill5i -.ch4il2 -.chil1l -.1ci2 -.cit5r -.2c1it -.co3e2 -.1co -.co4r -.cor5n1er -.corn2e -.de4moi2 -.d4em -.de1mo -.de3o -.de3r1a -.de3r1i -.de1s4c -.des2 -.dic1t2io5 -.3di2c1t -.do4t -.1do -.du4c -.1du -.du4m1b5 -.earth5 -.ear2t -.e2a2r -.eas3i -.2e1b4 -.eer4 -.eg2 -.e2l5d -.el3em -.enam3 -.e1na -.en3g -.e2n3s2 -.eq5ui5t -.e1q -.equ2 -.eq2ui2 -.er4ri -.er1r4 -.es3 -.4eu3 -.eye5 -.fes3 -.for5mer -.1fo -.fo2r -.for1m -.for2me -.1ga2 -.ge2 -.gen3t4 -.1gen -.ge5o2g -.1geo -.1g2i5a -.gi4b -.go4r -.1go -.hand5i -.ha2n -.h4and -.ha4n5k2 -.he2 -.hero5i2 -.h2ero -.h1es3 -.he4t3 -.hi3b -.hi3er -.h2ie4 -.hon5ey -.ho2n -.hon3o -.hov5 -.id4l -.2id -.idol3 -.i1do -.im3m -.im5p1i2n -.i4m1p -.im2pi -.in1 -.in3ci -.2ine2 -.4i4n2k2 -.2i2n3s2 -.ir5r4 -.4ir -.is4i -.ju3r -.la4cy -.la4m -.lat5er -.l4ath5 -.le2 -.leg5e -.len4 -.lep5 -.lev1 -.l2i4g -.li1g5a -.li2n -.l2i3o -.l1i4t -.ma1g5a5 -.1ma -.mal5o -.ma1n5a -.ma2n -.mar5ti -.m2a2r -.me2 -.mer3c -.me5ter -.me1te -.m2is1 -.mis4t5i -.mon3e -.1mo -.mo2n -.mo3ro -.mo2r -.mu5ta -.1mu -.mu2ta5b -.ni4c -.od2 -.od1d5 -.of5te -.o2ft -.or5a1to -.o1ra -.or3c -.or1d -.or3t -.os3 -.os4tl -.4oth3 -.out3 -.ou2 -.ped5al -.2p2ed -.p2e2d2a -.pe5te -.pe2t -.pe5tit -.p2i4e4 -.pio5n4 -.3p2i1o -.pi2t -.pre3m -.pr2 -.ra4c -.ran4t -.ra2n -.ratio5n1a -.ratio2n4 -.ra1t2io -.ree2 -.re5mit -.res2 -.re5stat -.res2t -.res1ta -.r2i4g -.ri2t5u -.ro4q -.ros5t -.row5d -.ru4d -.3s4c2i3e4 -.s1ci -.5se2l2f5 -.sel1l5 -.se2n -.se5r2ie4 -.ser1i -.s2h2 -.si2 -.s3ing4 -.2s1in -.st4 -.sta5b2l2 -.s1ta -.s2tab -.s4y2 -.1ta4 -.te4 -.3ten5a2n -.te1na -.th2 -.ti2 -.til4 -.ti1m5o5 -.1tim -.ting4 -.2t1in -.t4i4n5k2 -.to1n4a -.1to -.to2n -.to4p -.top5i -.to2u5s -.tou2 -.trib5ut -.tr4ib -.u1n1a -.un3ce -.under5 -.un1de -.u2n1e -.u4n5k2 -.un5o -.un3u4 -.up3 -.ure3 -.us5a2 -.2us -.ven4de -.ve5r1a -.wil5i -.wi2 -.wil2 -.ye4 -4ab. -a5bal -a5ba2n -abe2 -ab5erd -ab2i5a -ab5i2t5ab -abi2t -abi1ta -ab5lat -ab2l2 -ab5o5l1iz -abol2i -4abr -ab5rog -ab3ul -a4c2a2r -a1ca -ac5ard -ac5aro -a5ceou2 -ac1er -a5che4t -a2ch -ache2 -4a2ci -a3c2ie4 -a2c1in -a3c2io -ac5rob -act5if2 -a2c1t -ac3ul -ac4um -a2d -ad4d1in -ad1d4 -ad5er. -2adi -a3d4i3a -ad3i1ca -adi4er -ad2ie4 -a3d2io -a3dit -a5di1u -ad4le -ad3ow -a1do -ad5ra2n -a1dr -ad4su -a2d1s2 -4a1du -a3du2c -ad5um -ae4r -aer2i4e4 -aer1i -a2f -a4f1f4 -a4gab -a1ga -aga4n -ag5el1l -a1ge4o -4ag4eu -ag1i -4ag4l2 -ag1n -a2go -3a3g4o4g -ag3o3ni -ago2n2 -a5guer -a2gue -ag5ul -a4gy -a3ha -a3he -a4h4l4 -a3ho -ai2 -a5i1a -a3ic. -ai5ly -a4i4n -ain5in -a2ini -a2i1n5o -ait5en -a2ite -a1j -ak1en -al5ab -al3a2d -a4l2a2r -4aldi4 -a2ld -2ale -al3end -a4lent2i -a1len1t -a5le5o -al1i -al4ia. -al2i1a -al2i4e4 -al5lev -al1l -al2le -4allic -all2i -4a2lm -a5log. -a4ly. -a1ly -4a2lys4 -5a5lys1t -5alyt -3alyz -4a1ma -a2m5ab -am3ag -ama5ra -am2a2r -am5asc -a4ma3tis -a4m5a1to -am5er1a -am3ic -am5if -am5i1ly -am1in -am2i4no -a2mo -a5mo2n -amor5i -amo2r -amp5en -a4m1p -a2n -an3age -a1na -3ana1ly -a3n2a2r -an3ar3c -anar4i -a3nati -an2at -4and -ande4s2 -an1de -an3dis1 -an1dl -an4dow -an1do -a5nee -a3nen -an5e2st. -a1nes -a2nest -a3n4eu -2ang -ang5ie4 -an1gl2 -a4n1ic -a3nies -an2ie4 -an3i3f -an4ime -an1im -a5nim1i -a5n2ine -an1in -an3i4o -a3n2ip -an3is2h -an3it -a3ni1u -an4kli -a4nk2 -an1k1l -5anniz -a4n1n2 -ano4 -an5ot -an4oth5 -an2sa2 -a2n1s2 -an4s1co -ans4c -an4s1n4 -an2sp -ans3po -an4st -an4su2r -an1su -anta2l4 -an1t -an1ta -an4t2ie4 -ant2i -4an1to -an2tr -an4tw4 -an3u1a -an3ul -a5nur -4ao -ap2a2r4 -a1pa -ap5at -ap5er3o -a3ph4er -4aphi -a4pilla -apil1l -ap5ill2a2r -ap3i2n -ap3i1ta -a3pi2tu -a2p2l2 -apo4c5 -ap5o1la -apor5i -a1p4or -apos3t -a1pos -aps5e4s -a2p1s2 -ap2se -a3pu -aque5 -aqu2 -2a2r -ar3a2c1t -a5rade -ara2d -ar5adis1 -ar2adi -ar3al -a5rame1te -aram3et -ar2an4g -ara2n -ara3p -ar4at -a5ra1t2io -ar5a1t2iv -a5rau -ar5av4 -araw4 -arbal4 -ar1b -ar4cha2n -ar1c -ar3cha -ar2ch -ar5d2ine -ard2i -ard1in4 -ar4dr -ar5eas -a3ree -ar3en1t -a5r2e2ss -ar4fi -ar1f -ar4f4l2 -ar1i -ar5i2al -ar2i3a -ar3i2a2n -a3ri5et -ar2ie4 -ar4im -ar5in2at -ar2i1na -ar3i1o -ar2iz -ar2mi -ar1m -ar5o5d -a5roni -aro2n -a3roo2 -ar2p -ar3q -arre4 -ar1r4 -ar4sa2 -a4rs2 -ar2s2h -4as. -a2s4ab -asa2 -as3an1t -asa2n -ashi4 -as2h -a5sia. -as2i1a -a3si1b -a3sic -5a5si4t -ask3i -ask2 -as4l2 -a4soc -a1so -as5ph -as4s2h -a2ss -as3ten -as1t4r -asu1r5a -a1su -asu2r -a2ta -at3ab2l2 -a2tab -at5ac -at3alo -ata2l -at5ap -ate5c -at5e2ch -at3e1go -ateg4 -at3en. -at3er1a -ater5n -a5ter1na -at3est -at5ev -4ath -ath5em -ath2e -a5the2n -at4ho -ath5om -4ati. -a5t2i1a -a2t5i5b -at1ic -at3if2 -ation5a2r -a1t2io -atio2n -atio1n1a -at3i1tu -a4tog -a1to -a2tom -at5om2iz -a4top -a4tos2 -a1tr -at5rop -at4sk2 -a4t1s2 -at4tag -a4t3t2 -at1ta -at5te -at4th -a2tu -at5u1a -a4t5ue -at3ul -at3u1ra -a2ty -au4b -augh3 -au3gu -au4l2 -aun5d -au3r -au5si1b -a2us -a4ut5en -au1th -a2va -av3ag4 -a5va2n -av4e4no -av3er1a -av5ern -av5ery -av1i -avi4er -av2ie4 -av3ig -av5oc -a1vor -3away -aw3i2 -aw4ly -aws4 -ax4i5c -ax3i -ax4id -ay5al -aye4 -ays4 -azi4er -a2z1i -az2ie4 -az2z5i -a4z1z2 -5ba. -bad5ger -ba2d -ba4ge -bal1a -ban5dag -ba2n -b4and -ban1d2a -ban4e -ban3i -barbi5 -b2a2r -bar1b -bar2i4a -bar1i -bas4si -ba2ss -1bat -ba4z -2b1b -b2be -b3ber -bbi4na -4b1d -4be. -beak4 -bea2t3 -4be2d -b2e3d2a -be3de -b4e3di -be3gi -be5gu -1bel -be1l2i -be3lo -4be5m -be5n2ig -be5nu -4bes4 -be3sp -b2e5st4r -3bet -be1t5iz -be5tr -be3tw4 -be3w -be5y1o4 -2bf -4b3h -bi2b -b2i4d -3b2ie4 -bi5en -bi4er -2b3if -1bil -bi3l2iz -bil1i -bin2a5r4 -bi1na -b4in4d -bi5net -b2ine -bi3o2gr -b2io -bi5ou2 -bi2t -3b2i3t2io -bi1ti -bi3tr -3bit5u1a -bi1tu -b5i4tz -b1j -bk4 -b2l2 -bl4ath5 -b4le. -blen4 -5ble1sp -bles2 -b3lis -b4lo -blun4t -4b1m -4b3n -bne5g -3bod -bod3i -bo4e -bol3ic -bol2i -bom4bi -bo4m1b -bo1n4a -bo2n -bon5at -3boo2 -5bor. -4b1o1ra -bor5d -5bore -5bori -5bos4 -b5o1ta -b4oth5 -bo4to -boun2d3 -bou2 -4bp -4brit -br4oth3 -2b5s2 -bsor4 -b1so -2bt -b2t4l -b4to -b3tr -buf4fer1 -bu4f1f -bu4ga -bu3l2i -bu1mi4 -bu4n -bunt4i -bun1t -bu3re -bus5ie4 -b2us -buss4e -bu2ss -5bust -4bu1ta -3bu1t2io -b4u1t2i -b5u1to -b1v -4b5w -5by. -bys4 -1ca -cab3in -ca1b2l2 -ca2ch4 -ca5den -ca2d -4cag4 -2c5ah -ca3lat -cal4la -cal1l -cal2l5in4 -call2i -4calo -c4an5d -ca2n -can4e -ca4n4ic -can5is -can3iz -can4ty -can1t -cany4 -ca5per -car5om -c2a2r -cast5er -cas5t2ig -cast2i -4cas4y -c4a4th -4ca1t2iv -cav5al -ca2va -c3c -ccha5 -c2ch -c3c2i4a -c1ci -ccom1pa5 -c1co -cco4m1p -cco2n4 -ccou3t -ccou2 -2ce. -4ced. -4ce1den -3cei2 -5cel. -3cel1l -1cen -3cenc -2cen4e -4ceni -3cen1t -3cep -ce5ram -cer1a -4ce1s4a2 -3ces1si -c2e2ss -ces5si5b -ces5t -cet4 -c5e4ta -cew4 -2ch -4ch. -4ch3ab -5cha4n1ic -cha2n -ch5a5nis -che2 -cheap3 -4ch4ed -ch5e5lo -3chemi -ch5ene -che2n -ch3er. -ch3e4r1s2 -4ch1in -5chi2ne. -ch2ine -ch5i5n2e2ss -chi1nes -5ch2ini -5ch2io -3chit -chi2z -3cho2 -ch4ti -1ci -3c2i1a -ci2a5b -ci2a5r -ci5c -4cier -c2ie4 -5c4i2f3ic. -ci1fi -4c4i5i4 -ci4la -3cil1i -2cim -2cin -c4i1na -3cin2at -cin3em -c2ine -c1ing -c5ing. -5c2i1no -cio2n4 -c2io -4cipe4 -c2ip -ci3ph -4cip4ic -cip3i -4cis1ta -4cis1t2i -2c1it -ci1t3iz -ci1ti -5ciz -ck1 -ck3i -1c4l4 -4cl2a2r -c5la5ra1t2io -clar4at -5clare -cle4m -4clic -clim4 -c1ly4 -c5n -1co -co5ag -c4oa -coe2 -2cog -co4gr -coi4 -co3inc -col5i -5colo -col3o4r -com5er -co2me -co1n4a -co2n -c4one -con3g -con5t -co3pa -cop3ic -co4p2l2 -4cor1b -coro3n -cos4e -cov1 -cove4 -cow5a -co2z5e -co5z1i -c1q -cras5t -cr2as -5crat. -5crat1ic -cre3a2t -5c2r2ed -4c3re1ta -cre4v2 -cri2 -cri5f -c4rin -cr2is4 -5cri1ti -cro4p2l2 -crop5o -cros4e -cru4d -4c3s2 -2c1t -c2ta4b -c1ta -ct5ang -cta2n -c5tan1t -c2te -c3ter -c4t4ic1u -ctim3i -c1tim -ctu4r -c1tu -c4tw4 -cud5 -c4uf -c4ui2 -cu5i1ty -5cul2i -cul4tis4 -cul1ti -cu4lt -3c4ul1tu2 -cu2ma -c3ume -cu4mi -3cun -cu3pi -cu5py -cu2r5a4b -cu1ra -cu5r2i3a -1c2us -cus1s4i -cu2ss -3c4ut -cu4t2ie4 -c4u1t2i -4c5u1t2iv -4cutr -1cy -c2ze4 -1d2a -5da. -2d3a4b -da2ch4 -4da2f -2dag -da2m2 -d2an3g -da2n -dard5 -d2a2r -dark5 -4dary -3dat -4da1t2iv -4da1to -5dav4 -dav5e -5day -d1b -d5c -d1d4 -2de. -dea2f5 -de4b5i2t -d2e1b -de4bo2n -deca2n4 -de1ca -de4cil -de1c2i -de5com -de1co -2d1ed -4dee. -de5if -dei2 -del2i4e4 -del2i -de4l5i5q -de5lo -d4em -5dem. -3demic -dem5ic. -de5mil -de4mo2n3s2 -de1mo -demo2n -demo2r5 -1den -de4n2a2r -de1na -d4e3no -denti5f2 -den1t -dent2i -de3nu -de1p -de3pa -depi4 -de2pu -d3e1q -d4er1h4 -5der3m4 -d5ern5iz -de4r5s2 -des2 -d2es. -de1s2c -de2s5o -des3t2i -d2e3st4r -de4su -de1t -de2to -de1v -de2v3i4l -de1vi -4dey -4d1f -d4ga -d3ge4t -dg1i -d2gy -d1h2 -5di. -1d4i3a -dia5b -d4i4cam -di1ca -d4ice -3di2c1t -3d2id -5di3en -d2ie4 -d1if -di3ge -d2ig -di4la1to -di1la -d1in -1di1na -3di2ne. -d2ine -5d2ini -di5niz -1d2io -dio5g -di4p2l2 -d2ip -d4ir2 -di1re -dir1t5i -dis1 -5disi -d4is3t -d2i1ti -1d2i1v -d1j -d5k2 -4d5la -3dle. -3dled -3dles. -dles2 -4d3l2e2ss -2d3lo -4d5lu -2d1ly -d1m -4d1n4 -1do -3do. -do5de -5doe -2d5of -d4og -do4la -dol2i4 -do5lo4r -dom5iz -do3n2at -do2n -do1n1a -doni4 -doo3d -doo2 -do4p4p -d4or -3dos -4d5out -dou2 -do4v -3dox -d1p -1dr -drag5o2n2 -dra2go -4dr2ai2 -dre4 -dre2a5r -5dren -dr4i4b -dril4 -dro4p -4drow -5drupli -dru3p2l2 -4dry -2d1s2 -ds4p -d4sw2 -d4s4y -d2th -1du -d1u1a -du2c -d1u3ca -duc5er -4duct. -du2c1t -4duc4t1s2 -du5el -du4g -d3ul4e -dum4be -du4m1b -du4n -4dup -du4pe -d1v -d1w -d2y -5dyn -dy4s2e -dys5p -e1a4b -e3a2c1t -ea2d1 -ead5ie4 -e2adi -ea4ge -ea5ger -ea4l -eal5er -e2ale -eal3ou2 -eam3er -e5and -ea2n -ear3a -e2a2r -ear4c -ear5es -ear4ic -ear1i -ear4il -ear5k -ear2t -eart3e -ea5sp -e3a2ss -east3 -ea2t -eat5en -eath3i -e4ath -e5at3if2 -e4a3tu -ea2v -eav3en -eav5i -eav5o -2e1b -e4bel. -e1bel -e4be2l1s2 -e4ben -e4bi2t -e3br -e4ca2d -e1ca -ecan5c -eca2n -ec1ca5 -ec3c -e1ce -ec5es1sa2 -ec2e2ss -e1c2i -e4cib -ec5ificat -eci1fi -ecifi1ca -ec5i3f2ie4 -ec5i1fy -e2c3im -e2c1i4t -e5c2ite -e4clam -e1c4l4 -e4cl2us -e2col -e1co -e4com1m -e4compe -eco4m1p -e4con1c -eco2n -e2cor -ec3o1ra -eco5ro -e1cr -e4crem -ec4ta2n -e2c1t -ec1ta -ec4te -e1cu -e4cul -ec3u1la -2e2d2a -4ed3d4 -e4d1er -ede4s2 -4edi -e3d4i3a -ed3ib -ed3i1ca -ed3im -ed1it -edi5z -4e1do -e4dol -edo2n2 -e4dri -e1dr -e4dul -e1du -ed5u1l4o -ee2c -e4ed3i -ee2f -eel3i -ee4ly -ee2m -ee4na -ee4p1 -ee2s4 -eest4 -ee4ty -e5ex -e1f -e4f3ere -efer1 -1e4f1f -e4fic -e1fi -5ef2i1c4i -efil4 -e3f2i2ne -e2fin -ef5i5n2ite -ef2ini -efin2it -3efit -efor5es -e1fo -efo2r -e4fu4se. -e3fu -ef2us -4egal -e1ga -eger4 -eg5ib -eg4ic -eg5ing -e5git5 -eg5n -e4go. -e1go -e4gos -eg1ul -e5gur -5e1gy -e1h4 -eher4 -ei2 -e5ic -e2i5d -e2ig2 -ei5g4l2 -e3i4m1b -e3in3f -e1ing -e5inst -e2i2n1s2 -eir4d -e4ir -e2it3e -e2i3th -e5i1ty -e1j -e4jud -ej5udi -eki4n -ek1i -ek4la -ek1l -e1la -e4la. -e4lac -e3l4an4d -ela2n -e4l5a1t2iv -e4law -elax1a4 -e3le2a -el5ebra -el2e1b -ele3br -5elec -e4led -el3e1ga -e5len -e4l1er -e1les2 -e2l2f -el2i -e3libe4 -e4l5ic. -el3i1ca -e3lier -el2ie4 -el5i3gib -el2ig -el4igi -e5lim -e4l3ing -e3l2io -e2lis -el5is2h -e3l2iv3 -4ella -el1l -el4lab -ell4o4 -e5loc -el5og -el3op. -el2s2h -e2l1s2 -el4ta -e4lt -e5lud -el5ug -e4mac -e1ma -e4mag -e5ma2n -em5a1na -e4m5b -e1me -e2mel -e4met -em3i1ca -em2i4e4 -em5igra -em2ig4 -emi1gr -em1in2 -em5ine -em3i3ni -e4m2is -em5is2h -e5m4i2s1s -em3iz -5emniz -e4m1n -emo4g -e1mo -emo3n2i5o -emo2n -em3pi -e4m1p -e4mul -e1mu -em5u1la -emu3n2 -e3my -en5a2mo -e1na -e4nan1t -en2a2n -ench4er -en2ch -enche2 -en3dic -e5nea -e5nee -en3em -en5ero -en1er -en5e1si -e1nes -e2n5est -en3etr -e3ne4w -en5i4c3s2 -e5n2ie4 -e5nil -e3n2i4o -en3is2h -en3it -e5ni1u -5eniz -4e4n1n2 -4eno -e4no4g -e4nos -en3ov -en4sw2 -e2n1s2 -ent5age -en1t -en1ta -4enth1es -enth2e -en3u1a -en5uf -e3ny. -4e4n3z -e5of -eo2g -e4oi4 -e3ol -eop3a2r -eo2pa -e1or -eo3re -eo5rol -eos4 -e4ot -eo4to -e5out -eou2 -e5ow -e2pa -e3p4ai2 -ep5anc -epa2n -e5pel -e3pen1t -ep5e5t2i1t2io -epe2t -epeti1ti -ephe4 -e4pli -e1p2l2 -e1po -e4prec -epr2 -ep5re1ca -e4p2r2ed -ep3re1h4 -e3pro -e4prob -ep4s4h -e2p1s2 -ep5ti5b -e2p1t -e4pu2t -ep5u1ta -e1q -equi3l -equ2 -eq2ui2 -e4q3ui3s -er1a -e2ra4b -4er4and -era2n -er3a2r -4er4ati. -2er1b -er4b2l2 -er3ch -er1c -er4che2 -2e2re. -e3re1a4l -ere5co -ere3in -erei2 -er5el. -er3e1mo -er5e1na -er5ence -4erene -er3en1t -ere4q -er5e2ss -er3es2t -eret4 -er1h4 -er1i -e1r2i3a4 -5erick1 -e3rien -er2ie4 -eri4er -er3in4e -e1r2i1o -4erit -er4i1u -er2i4v -e4ri1va -er3m4 -er4nis4 -4er3n2it -5erniz -er3no4 -2ero -er5ob -e5r2oc -ero4r -er1ou2 -e4r1s2 -er3set -er2se -ert3er -4er2tl -er3tw4 -4eru -eru4t -5erwau -er1w -e1s4a2 -e4sa2ge. -e4sages -es2c -e2s1ca -es5ca2n -e3scr -es5cu -e1s2e -e2sec -es5e1cr -e4s5enc -e4sert. -e4ser4t1s2 -e4ser1va -4es2h -e3sha -esh5e2n -e1si -e2sic -e2s2id -es5i1den -e4s5ig1n4a -es2ig -e2s5im -e2s4i4n -esis4te -e1sis -e5si4u -e5skin -esk2 -esk1i -es4mi -e2s1m -e2sol -e1so -es3olu -e2so2n -es5o1n1a4 -e1sp -e2s3per -es5pi1ra -esp4ir -es4pre -espr2 -2e2ss -es4si4b -es1si -esta2n4 -es1ta -es3t2ig -est2i -es5tim -4es2to -e3sto2n -2est4r -e5stro -estruc5 -e2su2r -e1su -es5ur1r4 -es4w2 -e2ta4b -e1ta -e3ten4d -e3teo -ethod3 -et1ic -e5tide -et2id -e2t1in4 -et2i4no -e5t4ir -e5t2i1t2io -eti1ti -et5i1t2iv -4e2t1n2 -et5o1n1a -e1to -eto2n -e3tra -e3tre -et3ric -et5rif -et3rog -et5ros -et3u1a -e1tu -et5ym -e1ty -e4t5z -4eu -e5un -e3up -eu3ro -e2us4 -eute4 -euti5l -e4u1t2i -eu5tr -eva2p5 -e1va -e2vas -ev5ast -e5vea -ev3el1l -eve4l3o -e5veng -even4i -ev1er -e5v2er1b -e1vi -ev3id -e2vi4l -e4v1in -e3v2i4v -e5voc -e5vu -e1wa -e4wag -e5wee -e3wh -ewil5 -ewi2 -ew3in4g -e3wit -1ex3p -5ey1c -5eye. -eys4 -1fa -fa3b2l2 -f4ab3r -fa4ce -4fag -fa4i4n4 -fai2 -fal2l5e -fal1l -4f4a4ma -fam5is -5f2a2r -far5th -fa3ta -fa3th2e -f4ath -4fa1to -fau4lt5 -fau4l2 -4f5b -4fd -4fe. -feas4 -fe4ath3 -fea2t -f2e4b -4fe1ca -5fe2c1t -2fed -fe3l2i -fe4mo -fen2d -fen1d5e -fer1 -5fer1r4 -fev4 -4f1f -f4fes -f4f2ie4 -f1fi -f5f2in. -f2fin -f2f5is -f4f2ly5 -ff4l2 -f2fy -4fh -1fi -f2i3a -2f3ic. -4f3ical -fi1ca -f3ica2n -4ficate -f3i1cen -fi3cer -f2i1c4i -5fi3c2i1a -5fic2ie4 -4fi4c3s2 -fi3cu -fi5del -f2id -fight5 -f2ig -fil5i -fil2l5in4 -fil1l -fill2i -4fi1ly -2fin -5fi1na -f4in2d5 -f2i2ne -f1in3g -f2i4n4n2 -fis4t2i -f4l2 -f5l2e2ss -fles2 -flin4 -flo3re -f2ly5 -4fm -4fn -1fo -5fo2n -fon4de -f2ond -fon4t -fo2r -fo5rat -fo1ra -for5ay -fore5t -for4i -for1t5a -fos5 -4f5p -fra4t -f5rea -fres5c -fri2 -fril4 -frol5 -2f3s -2ft -f4to -f2ty -3fu -fu5el -4fug -fu4min -fu1mi -fu5ne -fu3ri -fusi4 -f2us -fu2s4s -4fu1ta -1fy -1ga -ga2f4 -5gal. -3gal1i -ga3lo -2gam -ga5met -g5a2mo -gan5is -ga2n -ga3niz -gani5za1 -4gano4 -gar5n4 -g2a2r -ga2ss4 -g4ath3 -4ga1t2iv -4gaz -g3b -gd4 -2ge. -2ged -geez4 -gel4in -gel2i -ge5lis -ge5l1iz -4ge1ly -1gen -ge4n2at -ge1na -g5e5niz -4g4eno -4geny -1geo -ge3om -g4ery -5ge1si -geth5 -4ge1to -ge4ty -ge4v -4g1g2 -g2ge -g3ger -gglu5 -ggl2 -g1go4 -gh3in -gh5out -ghou2 -gh4to -5gi. -1g2i4a -gi2a5r -g1ic -5gi3c2i1a -g2i1ci -g4i1co -gien5 -g2ie4 -5gies. -gil4 -g3i1men -3g4in. -g4in5ge -5g4i2n1s2 -5g2io -3g4ir -gir4l -g3is1l2 -gi4u -5g2iv -3giz -gl2 -gla4 -gl2ad5i -gla2d -5glas -1gle -gli4b -g3l2ig -3glo -glo3r -g1m -g4my -g1n4a -g4na. -gne4t4t2 -g1ni -g2n1in -g4n2i4o -g1no -g4no4n -1go -3go. -gob5 -5goe -3g4o4g -go3is -goi2 -go2n2 -4g3o3n1a -gon5do5 -g2ond -go3ni -5goo2 -go5riz -gor5ou2 -5gos. -gov1 -g3p -1gr -4gra1d2a -gra2d -g4r2ai2 -gra2n2 -5gra4ph. -g5ra3ph4er -5graph1ic -gr4aphi -4g3ra1phy -4gray -gre4n -4gress. -gr2e2ss -4grit -g4ro -gruf4 -gs2 -g5ste -gth3 -gu4a -3guar2d -gu2a2r -2gue -5gui5t -g2ui2 -3gun -3g2us -4gu4t -g3w -1gy -2g5y3n -gy5ra -h3ab4l2 -ha2ch4 -hae4m -hae4t -h5agu -ha3la -hala3m -ha4m -han4ci -ha2n -han4cy -5hand. -h4and -h2an4g -hang5er -han1g5o -h5a5niz -ha4n4k2 -han4te -han1t -ha2p3l2 -ha2p5t -ha3ra2n -h2a2r -ha5r2as -har2d -hard3e -har4le4 -har1l -harp5en -har2p -har5ter -ha2s5s -haun4 -5haz -haz3a1 -h1b -1hea2d1 -3he2a2r -he4ca2n -he1ca -h5ecat -h4ed -h4e5do5 -he3l4i -hel4lis -hel1l -hell2i -hel4ly -h5elo -he4m4p -he2n -he1na4 -hen5at -he1o5r -hep5 -h4er1a -hera3p -her4ba -h2er1b -here5a -h3ern -h5er1ou2 -h2ero -h3ery -h1es -he2s5p -he4t -he2t4ed -h4eu4 -h1f -h1h -hi5a2n -h2i1a -hi4co -high5 -h2ig -h4il2 -himer4 -h4i1na -hion4e -h2io -hio2n -h2i4p -hir4l -h4ir -hi3ro -hir4p -hir4r4 -his3el -h4ise -h4i2s4s -hith5er -h2ith -hith2e -h2i2v -4hk -4h1l4 -hla2n4 -h2lo -hlo3ri -4h1m -hmet4 -2h1n -h5odiz -h5o2d1s2 -ho4g -ho1ge4 -hol5a2r -ho1la -3hol4e -ho4ma -ho2me3 -ho1n4a -ho2n -ho5ny -3hood -hoo2 -hoo2n4 -hor5at -ho1ra -ho5r2is -hort3e -ho5ru -hos4e -ho5sen -hos1p -1ho2us -hou2 -house3 -hov5el -4h5p -4hr4 -hree5 -hro5niz -hro2n -hro3po -4h1s2 -h4s2h -h4t2a2r -h1ta -ht1en -ht5es -h4ty -hu4g -hu4min -hu1mi -hun5ke -hu4nk2 -hun4t -hus3t4 -h2us -hu4t -h1w -h4war4t -hw2a2r -hy3pe -hy3ph -hy2s -2i1a -i2al -iam4 -iam5e1te -i2a2n -4ianc -ian3i -4ian4t -ia5pe -ia2ss4 -i4a1t2iv -ia4tric -ia1tr -i4a2tu -ibe4 -ib3er1a -ib5ert -ib5i1a -ib3in -ib5it. -ibi2t -ib5ite -i1b2l2 -ib3li -i5bo -i1br -i2b5ri -i5bu4n -4icam -i1ca -5icap -4ic2a2r -i4car. -i4cara -icas5 -i4cay -iccu4 -ic3c -4iceo -4i2ch -2i1ci -i5c2id -ic5i1na -i2cin -i2c2ip -ic3i1pa -i4c1ly4 -i1c4l4 -i2c5oc -i1co -4i1cr -5icra -i4cry -ic4te -i2c1t -ic1tu2 -ic4t3u1a -ic3u1la -ic4um -ic5uo -i3cur -2id -i4dai2 -i1d2a -id5anc -ida2n -id5d4 -ide3a4l -ide4s2 -i2di -id5i2a2n -i1d4i3a -idi4a2r -i5d2ie4 -i1d3io -idi5ou2 -id1it -id5i1u -i3dle -i4dom -i1do -id3ow -i4dr -i2du -id5uo -2ie4 -ied4e -5ie5ga -ie2ld3 -ie1n5a4 -ien4e -i5e4n1n2 -i3ent2i -ien1t -i1er. -i3es2c -i1est -i3et -4if. -if5ero -ifer1 -iff5en -i4f1f -if4fr -4i2f3ic. -i1fi -i3f2ie4 -i3f4l2 -4i2ft -2ig -iga5b -i1ga -ig3er1a -ight3i -4igi -i3gib -ig3il4 -ig3in -ig3it -i4g4l2 -i2go -ig3or -ig5ot -i5gre -i1gr -ig2u5i2 -ig1ur -i3h -4i5i4 -i3j -4ik -i1la -il3a4b -i4l4ade -ila2d -i2l5am -ila5ra -il2a2r -i3leg -il1er -ilev4 -i2l5f -il1i -il3i1a -il2ib -il3io -il4ist -2il1it -il2iz -ill5ab -il1l -4i2l1n2 -il3o1q -il4ty -i4lt -il5ur -il3v -i4mag -i1ma -im3age -ima5ry -im2a2r -iment2a5r -i1men -i3men1t -imen1ta -4imet -im1i -im5i1d4a -im2id -imi5le -i5m2ini -4imit -im4ni -i4m1n -i3mo2n -i1mo -i2mu -im3u1la -2in. -i4n3au -i1na -4inav -incel4 -in3cer -4ind -in5dling -2ine -i3nee -in4er4a2r -in1er -iner1a -i5n2e2ss -i1nes -4in1ga -4inge -in5gen -4ingi -in5gling -ingl2 -4in1go -4in1gu -2ini -i5ni. -i4n4i1a -in3i4o -in1is -i5ni4te. -in2it -in2ite -5i3n2i1t2io -ini1ti -in3i1ty -4i4nk2 -4i4n1l -2i4n1n2 -2i1no -i4no4c -ino4s -i4not -2i2n1s2 -in3se -insu1r5a -in1su -insu2r -2int. -in1t -2in4th -in1u -i5n2us -4iny -2io -4io. -io1ge4 -io2gr -i1ol -io4m -ion3at -io2n -io1n1a -ion4ery -ion1er -ion3i -i2o5ph -ior3i -i4os -i4o5th -i5oti -io4to -i4our -iou2 -2ip -ipe4 -iphr2as4 -ip4hr4 -ip3i -ip4ic -ip4re4 -ipr2 -ip3ul -i3qua -iqu2 -iq5ue1f -iq3u2id -iq2ui2 -iq3ui3t -4ir -i1ra -i2ra4b -i4rac -ird5e -ire4de -i2r2ed -i4re1f -i4rel4 -i4res -ir5gi -irg2 -ir1i -iri5de -ir2id -ir4is -iri3tu -5i5r2iz -ir4min -ir1m -iro4g -5iron. -iro2n -ir5ul -2is. -is5ag -isa2 -is3a2r -isas5 -2is1c -is3ch2 -4ise -is3er -3i4s3f -is5ha2n -is2h -is3ho2n3 -isho4 -ish5op -is3i1b -is2i4d -i5sis -is5i1t2iv -isi1ti -4is4k2 -isla2n4 -is1l2 -4is4m1s2 -i2s1m -i2so -iso5mer -i3som -iso2me -is1p -is2pi -is4py -4i2s1s -is4sal -is1sa2 -issen4 -is4s1e4s -is4ta. -is1ta -is1te -is1t2i -ist4ly -is2tl -4istral -ist4r -is1tra -i2su -is5us -4i3ta. -i1ta -ita4bi -i2tab -i4tag -4ita5m -i3ta2n -i3tat -2ite -it3er1a -i5ter1i -it4es -2ith -i1ti -4i1t2i1a -4i2tic -it3i1ca -5i5tick1 -i2t3ig -it5il1l -i2tim -2i1t2io -4itis -i4ti2s4m -i2t5o5m -i1to -4ito2n -i4tram -i1tra -it5ry -4i4t3t2 -it3u1at -i1tu -itu1a -i5tud2 -it3ul -4itz. -i4tz -i1u -2iv -iv3el1l -iv3en. -i4v3er. -i4vers. -ive4r1s2 -iv5il. -i2vil -iv5io -iv1it -i5vore -iv3o3ro -i4v3ot -4i5w -ix4o -4iy -4iz2a2r2 -iza1 -i2z1i4 -5izon1t -i1zo -izo2n -5ja -jac4q -ja4p -1je -je4r5s2 -4jes4t2ie4 -jest2i -4jes2ty -jew3 -jo4p -5judg -3ka. -k3ab -k5ag -kais4 -kai2 -kal4 -k1b -k2ed -1kee -ke4g -ke5l2i -k3en4d -k1er -kes4 -k3e2st. -ke4ty -k3f -kh4 -k1i -5ki. -5k2ic -k4il1l -kilo5 -k4im -k4in. -kin4de -k4ind -k5i5n2e2ss -k2ine -ki1nes -kin4g -k2i4p -kis4 -k5is2h -kk4 -k1l -4k3ley -4k1ly -k1m -k5nes -1k2no -ko5r -kos2h4 -k3ou2 -kro5n -4k1s2 -k4sc -ks4l2 -k4s4y -k5t -k1w -lab3ic -l4abo -l4a2ci4 -l4ade -la2d -la3d2y -lag4n -la2m3o -3l4and -la2n -lan4dl -lan5et -lan4te -lan1t -lar4g2 -l2a2r -lar3i -las4e -la5ta2n -la2ta -4latel2i4 -4la1t2iv -4lav -la4v4a -2l1b -lbin4 -4l1c2 -lce4 -l3ci -2ld -l2de -ld4ere -ld4er1i -ldi4 -ld5is1 -l3dr -l4dri -le2a -le4bi -l2e1b -le2ft5 -le1f -5leg. -5le4g1g2 -le4mat -le1ma -lem5at1ic -4len. -3lenc -5le2ne. -1len1t -le3ph -le4pr2 -le2ra5b -ler1a -ler4e -3lerg2 -3l4er1i -l4ero -les2 -le5s1co -les2c -5lesq -3l2e2ss -5less. -l3e1va -lev4er. -lev1er -lev4er1a -lev4e4r1s2 -3ley -4leye -2lf -l5fr -4l1g4 -l5ga -lg2a2r3 -l4ges -l1go3 -2l3h -li4ag -l2i1a -li2am4 -liar5iz -li2a2r -liar1i -li4as -li4a1to -li5bi -5lic2io -l2i1ci -li4cor -li1co -4li4c3s2 -4lict. -li2c1t -l4icu -l3i1cy -l3i1d2a -l2id -lid5er -3li2di -lif3er1 -l4i4f1f -li4f4l2 -5ligate -l2ig -li1ga -3ligh -li4gra -li1gr -3l4ik -4l4i4l -lim4b2l2 -li4m1b -lim3i -li4mo -l4i4m4p -l4i1na -1l4ine -lin3ea -l2in3i -link5er -l4i4nk2 -li5og -l2io -4l4iq -lis4p -l1it -l2it. -5lit3i1ca -li1ti -l4i2tic -l5i5ti4c3s2 -liv3er -l2iv -l1iz -4lj -lka3 -l3kal4 -lka4t -l1l -l4law -l2le -l5le2a -l3lec -l3leg -l3lel -l3le4n -l3le4t -ll2i -l2lin4 -l5l4i1na -ll4o -lloq2ui5 -llo1q -lloqu2 -l2l5out -llou2 -l5low -2lm -l5met -lm3ing -l4mo2d1 -l1mo -lmo2n4 -2l1n2 -3lo. -lob5al -lo4ci -4lof -3log1ic -l5o1go -3logu -lom3er -lo2me -5long -lo2n -lon4i -l3o3niz -lood5 -loo2 -5lo4pe. -lop3i -l3o4p1m -lo1ra4 -lo4ra1to -lo5r2ie4 -lor5ou2 -5los. -los5et -5los5o3phiz -lo2so -los4op -los2oph -5los5o1phy -los4t -lo4ta -loun5d -lou2 -2lout -4lov -2lp -lpa5b -l1pa -l3pha -l5phi -lp5ing -lpi2n -l3pit -l4p2l2 -l5pr2 -4l1r -2l1s2 -l4sc -l2se -l4s2ie4 -4lt -lt5ag -l1ta -ltane5 -lta2n -l1te -lten4 -lter1a4 -lth3i -l5ties. -lt2ie4 -ltis4 -l1tr -l1tu2 -ltu1r3a -lu5a -lu3br -lu2ch4 -lu3ci -lu3en -luf4 -lu5id -l2ui2 -lu4ma -5lu1mi -l5umn. -lu4m1n -5lum3n4i1a -lu3o -luo3r -4lup -lu2ss4 -l2us -lus3te -1lut -l5ven -l5vet4 -2l1w -1ly -4lya -4ly1b -ly5me4 -ly3no -2lys4 -l5y3s2e -1ma -2mab -ma2ca -ma5ch2ine -ma2ch -ma4ch1in -ma4c4l4 -mag5in -mag1i -5mag1n -2mah -ma2id5 -mai2 -4ma2ld -ma3l2ig -mal1i -ma5lin -mal4l2i -mal1l -mal4ty -ma4lt -5ma3n4i1a -ma2n -man5is -man3iz -4map -ma5ri2ne. -m2a2r -mar1i -mar2in4e -ma5r2iz -mar4ly -mar1l -mar3v -ma5sce -mas4e -mas1t -5mate -m4ath3 -ma3tis -4mati3za1 -ma1tiz -4m1b -m1ba4t5 -m5bil -m4b3ing -mb2i4v -4m5c -4me. -2med -4med. -5me3d4i3a -m4edi -me3d2ie4 -m5e5d2y -me2g -mel5o2n -me4l4t -me2m -me1m1o3 -1men -me1n4a -men5ac -men4de -4mene -men4i -me2n1s4 -men1su5 -3men1t -men4te -me5o2n -m5er1sa2 -me4r1s2 -2mes -3mest2i -me4ta -met3a2l -me1te -me5thi -m4etr -5met3ric -me5tr2ie4 -me3try -me4v -4m1f -2mh -5mi. -m2i3a -mi1d4a -m2id -mid4g -m2ig4 -3mil3i1a -mil1i -m5i5l2ie4 -m4il1l -mi1n4a -3m4ind -m5i3nee -m2ine -m4ingl2 -min5gli -m5ing1ly -min4t -m4in1u -miot4 -m2io -m2is -mi4s4er. -m4ise -mis3er -mis5l2 -mis4t2i -m5i4stry -mist4r -4m2ith -m2iz -4mk -4m1l -m1m -mma5ry -m1ma -mm2a2r -4m1n -m1n4a -m4n1in -mn4o -1mo -4mocr -5moc5ra1tiz -mo2d1 -mo4go -mois2 -moi2 -mo4i5se -4m2ok -mo5lest -moles2 -mo3me -mon5et -mo2n -mon5ge -mo3n4i3a -mon4i2s1m -mon1is -mon4ist -mo3niz -monol4 -mo3ny. -mo2r -4mo5ra. -mo1ra -mos2 -mo5sey -mo3sp -m4oth3 -m5ouf -mou2 -3mo2us -mo2v -4m1p -mpara5 -m1pa -mp2a2r -mpa5rab -mp4a4r5i -m3pe2t -mphas4 -m2pi -mp2i4a -mp5ies -mp2ie4 -m4p1i2n -m5p4ir -mp5is -mpo3ri -m1p4or -mpos5ite -m1pos -m4po2us -mpou2 -mpov5 -mp4tr -m2p1t -m2py -4m3r -4m1s2 -m4s2h -m5si -4mt -1mu -mul2a5r4 -mu1la -5mu4lt -mul1ti3 -3mum -mun2 -4mup -mu4u -4mw -1na -2n1a2b -n4abu -4nac. -na4ca -n5a2c1t -nag5er. -nak4 -na4l1i -na5l2i1a -4na4lt -na5mit -n2a2n -nan1ci4 -nan4it -na4nk4 -nar3c -n2a2r -4nare -nar3i -nar4l -n5ar1m -n4as -nas4c -nas5t2i -n2at -na3ta2l -na2ta -nat5o5m2iz -na2tom -na1to -n2au -nau3se -na2us -3naut -nav4e -4n1b4 -nc2a2r5 -n1ca -n4ces. -n3cha -n2ch -n5cheo -nche2 -n5ch4il2 -n3chis -n2c1in -n1ci -n2c4it -ncou1r5a -n1co -ncou2 -n1cr -n1cu -n4dai2 -n1d2a -n5da2n -n1de -nd5e2st. -ndes2 -ndi4b -n5d2if -n1dit -n3diz -n5du2c -n1du -ndu4r -nd2we -nd1w -2ne. -n3e2a2r -n2e2b -neb3u -ne2c -5neck1 -2ned -ne4gat -ne1ga -ne4g5a1t2iv -5nege -ne4la -nel5iz -nel2i -ne5mi -ne4mo -1nen -4nene -3neo -ne4po -ne2q -n1er -ne2ra5b -ner1a -n4er3a2r -n2ere -n4er5i -ner4r4 -1nes -2nes. -4ne1sp -2nest -4nes4w2 -3net1ic -ne4v -n5eve -ne4w -n3f -n4gab -n1ga -n3gel -nge4n4e -n1gen -n5gere -n3ger1i -ng5ha -n3gib -ng1in -n5git -n4gla4 -ngl2 -ngov4 -n1go -ng5s2h -ngs2 -n1gu -n4gum -n2gy -4n1h4 -nha4 -nhab3 -nhe4 -3n4i1a -ni3a2n -ni4ap -ni3ba -ni4b2l2 -n2i4d -ni5di -ni4er -n2ie4 -ni2fi -ni5ficat -nifi1ca -n5i1gr -n2ig -n4ik4 -n1im -ni3m2iz -nim1i -n1in -5ni2ne. -n2ine -nin4g -n2i4o -5n2is. -nis4ta -n2it -n4ith -3n2i1t2io -ni1ti -n3itor -ni1to -ni3tr -n1j -4nk2 -n5k2ero -nk1er -n3ket -nk3in -nk1i -n1k1l -4n1l -n5m -nme4 -nmet4 -4n1n2 -nne4 -nni3al -n3n4i1a -nn2i4v -nob4l2 -no3ble -n5o1c4l4 -4n3o2d -3noe -4nog -no1ge4 -nois5i -noi2 -no5l4i -5nol1o1gis -3nomic -n5o5m2iz -no4mo -no3my -no4n -non4ag -no1n1a -non5i -n5oniz -4nop -5nop5o5l2i -no2r5ab -no1ra -no4rary -nor2a2r -4nos2c -nos4e -nos5t -no5ta -1nou2 -3noun -nov3el3 -nowl3 -n1p4 -npi4 -npre4c -npr2 -n1q -n1r -nru4 -2n1s2 -n2s5ab -nsa2 -nsati4 -ns4c -n2se -n4s3e4s -ns2id1 -ns2ig4 -n2s1l2 -n2s3m -n4soc -n1so -ns4pe -n5spi -nsta5b2l2 -ns1ta -ns2tab -n1t -n2ta4b -n1ta -nte4r3s2 -nt2i -n5ti2b -nti4er -nt2ie4 -nti2f2 -n3t2ine -n2t1in -n4t3ing -nt2i4p -ntrol5l2i -ntrol1l -n4t4s2 -ntu3me -n1tu -n3tum -nu1a -nu4d -nu5en -nuf4fe -nu4f1f -n3ui4n -n2ui2 -3nu3it -n4um -nu1me -n5u1mi -3nu4n -n3uo -nu3tr -n1v2 -n1w4 -nym4 -nyp4 -4nz -n3za1 -4oa -oa2d3 -o5a5les2 -o2ale -oard3 -o2a2r -oas4e -oast5e -oat5i -ob3a3b -o5b2a2r -o1be4l -o1bi -o2bin -ob5ing -o3br -ob3ul -o1ce -o2ch4 -o3che4t -oche2 -ocif3 -o1ci -o4cil -o4clam -o1c4l4 -o4cod -o1co -oc3rac -oc5ra1tiz -ocre3 -5ocrit -ocri2 -octo2r5a -o2c1t -oc1to -oc3u1la -o5cure -od5d1ed -od1d4 -od3ic -o1d2i3o -o2do4 -od4or3 -o4d5uct. -o1du -odu2c -odu2c1t -o4d5uc4t1s2 -o4el -o5eng -o3er -oe4ta -o3ev -o2fi -of5ite -of4i4t4t2 -o2g5a5r -o1ga -o4g5a1t2iv -o4ga1to -o1ge -o5gene -o1gen -o5geo -o4ger -o3g2ie4 -1o1gis -og3it -o4gl2 -o5g2ly -3ogniz -og1ni -o4g4ro -o1gr -og2u5i2 -1o1gy -2o2g5y3n -o1h2 -ohab5 -oi2 -oic3es -oi3der -o2id -oi4f1f4 -o2ig4 -oi5let -o3ing -oint5er -oin1t -o5i2s1m -oi5so2n -oi2so -oist5en -ois1te -oi3ter -o2ite -o5j -2ok -o3ken -ok5ie4 -ok1i -o1la -o4la2n -ola2ss4 -o2l2d -ol2d1e -ol3er -o3les2c -oles2 -o3let -ol4fi -o2lf -ol2i -o3l2i1a -o3lice -ol5id. -ol2id -o3li4f -o5l4i4l -ol3ing -o5l2io -o5l2is. -ol3is2h -o5l2ite -ol1it -o5l2i1t2io -oli1ti -o5l2iv -oll2i4e4 -ol1l -oll2i -ol5o3giz -olo4r -ol5p2l2 -o2lp -o4l2t -ol3ub -ol3ume -ol3un -o5l2us -ol2v -o2ly -o2m5ah -o1ma -oma5l -om5a1tiz -om2be -o4m1b -om4b2l2 -o2me -om3e1n4a -o1men -om5er2se -ome4r1s2 -o4met -om5e3try -om4etr -o3m2i3a -om3ic. -om3i1ca -o5m2id -om1in -o5m2ini -5ommend -om1m -om1men -omo4ge -o1mo -o4mo2n -om3pi -o4m1p -ompro5 -ompr2 -o2n -o1n1a -on4ac -o3n2a2n -on1c -3oncil -on1ci -2ond -on5do -o3nen -o2n5est -o1nes -on4gu -on1ic -o3n2i4o -on1is -o5ni1u -on3key -o4nk2 -on4odi -o4n3o2d -on3o3my -o2n3s2 -on5spi4 -onspi1r5a -onsp4ir -on1su4 -onten4 -on1t -on3t4i -onti2f5 -on5um -on1va5 -on1v2 -oo2 -ood5e -ood5i -o2o4k -oop3i -o3ord -oost5 -o2pa -o2p2e5d -op1er -3oper1a -4op4erag -2oph -o5pha2n -o5ph4er -op3ing -opi2n -o3pit -o5po2n -o4posi -o1pos -o1pr2 -op1u -opy5 -o1q -o1ra -o5ra. -o4r3ag -or5al1iz -oral1i -or5an4ge -ora2n -or2ang -ore5a -o5re1a4l -or3ei2 -or4e5s2h -or5e2st. -ores2t -orew4 -or4gu -org2 -4o5r2i3a -or3i1ca -o5ril -or1in -o1r2i1o -or3i1ty -o3ri1u -or2mi -or1m -orn2e -o5rof -or3oug -orou2 -or5pe -or1p -3orrh4 -or1r4 -or4se -o4rs2 -ors5en -orst4 -or3thi -or3thy -or4ty -o5rum -o1ry -os3al -osa2 -os2c -os4ce -o3scop -os1co -4oscopi -o5scr -os4i4e4 -os5i1t2iv -osi1ti -os3i1to -os3i1ty -o5si4u -os4l2 -o2so -o2s4pa -os4po -os2ta -o5stati -os5til -ost2i -os5tit -o4ta2n -o1ta -otele4g -ot3er. -ot5e4r1s2 -o4tes -4oth -oth5e1si -oth2e -oth1es -oth3i4 -ot3ic. -ot5i1ca -o3tice -o3tif2 -o3tis -oto5s2 -o1to -ou2 -ou3b2l2 -ouch5i -ou2ch -ou5et -ou4l -ounc5er -oun2d -ou5v2 -ov4en -over4ne -ove4r3s2 -ov4ert -o3vis -o4vi1ti4 -o5v4ol -ow3der -ow3el -ow5est3 -ow1i2 -own5i -o4wo2 -oy1a -1pa -pa4ca -pa4ce -pa2c4t -p4a2d -5paga4n -pa1ga -p3agat -p4ai2 -pa4i4n4 -p4al -pa1n4a -pa2n -pan3el -pan4ty -pan1t -pa3ny -pa1p -pa4pu -para5b2l2 -p2a2r -pa2rab -par5age -par5d2i -3pare -par5el -p4a4r1i -par4is -pa2te -pa5ter -5pathic -p4ath -pa5thy -pa4tric -pa1tr -pav4 -3pay -4p1b -pd4 -4pe. -3pe4a -pear4l -pe2a2r -pe2c -2p2ed -3pede -3p4edi -pe3d4i3a4 -ped4ic -p4ee -pee4d -pek4 -pe4la -pel2i4e4 -pel2i -pe4n2a2n -pe1na -p4enc -pen4th -pen1t -pe5o2n -p4era. -per1a -pera5b2l2 -pe2ra4b -p4erag -p4er1i -peri5st -per2is -per4mal -per3m4 -per1ma -per2me5 -p4ern -p2er3o -per3ti -p4e5ru -per1v -pe2t -pe5ten -pe5tiz -4pf -4pg -4ph. -phar5i -ph2a2r -ph4e3no -phe2n -ph4er -ph4es. -ph1es -ph1ic -5ph2ie4 -ph5ing -5phis1t2i -3phiz -p4h2l4 -3phob -3phone -pho2n -5phoni -pho4r -4p4h1s2 -ph3t -5phu -1phy -p2i3a -pi2a2n4 -pi4c2ie4 -p2i1ci -pi4cy -p4id -p5i1d2a -pi3de -5pi2di -3piec -p2ie4 -pi3en -pi4grap -p2ig -pi1gr -pi3lo -pi2n -p4in. -p4ind4 -p4i1no -3p2i1o -pio2n4 -p3ith -pi5tha -pi2tu -2p3k2 -1p2l2 -3pla2n -plas5t -pl2i3a -pli5er -pl2ie4 -4pl2ig -pli4n -ploi4 -plu4m -plu4m4b -4p1m -2p3n -po4c -5pod. -po5em -po3et5 -5po4g -poin2 -poi2 -5poin1t -poly5t -po2ly -po4ni -po2n -po4p -1p4or -po4ry -1pos -po2s1s -p4ot -po4ta -5poun -pou2 -4p1p -ppa5ra -p1pa -pp2a2r -p2pe -p4p2ed -p5pel -p3pen -p3per -p3pe2t -ppo5s2ite -p1pos -pr2 -pray4e4 -5pre1c2i -pre5co -pre3e2m -pre4f5ac -pre1f -pre1fa -pre4la -pr1e3r4 -p3re1s2e -3pr2e2ss -pre5ten -pre3v2 -5pr2i4e4 -prin4t3 -pr2i4s -pri2s3o -p3ro1ca -pr2oc -prof5it -pro2fi -pro3l -pros3e -pro1t -2p1s2 -p2se -ps4h -p4si1b -2p1t -p2t5a4b -p1ta -p2te -p2th -p1ti3m -ptu4r -p1tu -p4tw4 -pub3 -pue4 -puf4 -pu4l3c2 -pu4m -pu2n -pur4r4 -5p2us -pu2t -5pute -put3er -pu3tr -put4t1ed -pu4t3t2 -put4t1in -p3w -qu2 -qua5v4 -2que. -3quer -3quet -2rab -ra3bi -rach4e2 -ra2ch -r5a1c4l4 -raf5fi -ra2f -ra4f1f4 -ra2f4t -r2ai2 -ra4lo -ram3et -r2ami -ra3ne5o -ra2n -ran4ge -r2ang -r4ani -ra5no4 -rap3er -3ra1phy -rar5c -r2a2r -rare4 -rar5e1f -4raril -rar1i -r2as -ratio2n4 -ra1t2io -rau4t -ra5vai2 -ra2va -rav3el -ra5z2ie4 -ra2z1i -r1b -r4bab -r4bag -rbi2 -r2b3i4f -r2bin -r5b2ine -rb5ing. -rb4o -r1c -r2ce -r1cen4 -r3cha -r2ch -rch4er -rche2 -r4ci4b -r1ci -r2c4it -rcum3 -r4dal -r1d2a -rd2i -r1d4i4a -rdi4er -rd2ie4 -rd1in4 -rd3ing -2re. -re1a4l -re3a2n -re5ar1r4 -re2a2r -5rea2v -re4aw -r5ebrat -r2e1b -re3br -rec5ol1l -re2col -re1co -re4c5ompe -reco4m1p -re4cre -re1cr -2r2ed -re1de -re3dis1 -r4edi -red5it -re4fac -re1f -re1fa -re2fe -re5fer. -refer1 -re3fi -re4fy -reg3is -re5it -rei2 -re1l2i -re5lu -r4en4ta -ren1t -ren4te -re1o -re5pi2n -re4posi -re1po -re1pos -re1pu -r1er4 -r4er1i -r2ero4 -r4e5ru -r4es. -re4spi -re1sp -res4s5i4b -r2e2ss -res1si -res2t -re5s2ta2l -res1ta -r2e3st4r -re4ter -re4ti4z -re3tri -r4eu2 -re5u1t2i -rev2 -re4val -re1va -rev3el -r5ev5er. -rev1er -re5ve4r1s2 -re5vert -re5vi4l -re1vi -rev5olu -re4wh -r1f -r3fu4 -r4fy -rg2 -rg3er -r3get -r3g1ic -rgi4n -rg3ing -r5gis -r5git -r1gl2 -rgo4n2 -r1go -r3gu -rh4 -4rh. -4rhal -r2i3a -ria4b -ri4ag -r4ib -rib3a -ric5as5 -ri1ca -r4ice -4r2i1ci -5ri5c2id -ri4c2ie4 -r4i1co -rid5er -r2id -ri3enc -r2ie4 -ri3en1t -ri1er -ri5et -rig5a2n -r2ig -ri1ga -5r4igi -ril3iz -ril1i -5rima2n -ri1ma -rim5i -3ri1mo -rim4pe -ri4m1p -r2i1na -5rina. -r4in4d -r2in4e -rin4g -r2i1o -5riph -r2ip -riph5e -ri2p2l2 -rip5lic -r4iq -r2is -r4is. -r2is4c -r3is2h -ris4p -ri3ta3b -ri1ta -r5ited. -r2ite -ri2t1ed -rit5er. -rit5e4r1s2 -r4i2t3ic -ri1ti -ri2tu -rit5ur -riv5el -r2iv -riv3et -riv3i -r3j -r3ket -rk4le -rk1l -rk4lin -r1l -rle4 -r2led -r4l2ig -r4lis -rl5is2h -r3lo4 -r1m -rma5c -r1ma -r2me -r3men -rm5e4r1s2 -rm3ing -r4ming. -r4m2io -r3mit -r4my -r4n2a2r -r1na -r3nel -r4n1er -r5net -r3ney -r5nic -r1nis4 -r3n2it -r3n2iv -rno4 -r4nou2 -r3nu -rob3l2 -r2oc -ro3cr -ro4e -ro1fe -ro5fil -ro2fi -r2ok2 -ro5k1er -5role. -rom5e1te -ro2me -ro4met -rom4i -ro4m4p -ron4al -ro2n -ro1n1a -ron4e -ro5n4is -ron4ta -ron1t -1room -roo2 -5root -ro3pel -rop3ic -ror3i -ro5ro -ro2s5per -ro2s4s -ro4th2e -r4oth -ro4ty -ro4va -rov5el -rox5 -r1p -r4pe4a -r5pen1t -rp5er. -r3pe2t -rp4h4 -rp3ing -rpi2n -r3po -r1r4 -rre4c -rre4f -r4re1o -rre4s2t -rr2i4o -rr2i4v -rro2n4 -rros4 -rrys4 -4rs2 -r1sa2 -rsa5ti -rs4c -r2se -r3sec -rse4cr -r4s5er. -rs3e4s -r5se5v2 -r1s2h -r5sha -r1si -r4si4b -rso2n3 -r1so -r1sp -r5sw2 -rta2ch4 -r1ta -r4tag -r3t2e1b -r3ten4d -r1te5o -r1ti -r2t5i2b -rt2i4d -r4tier -rt2ie4 -r3t2ig -rtil3i -rtil4l -r4ti1ly -r4tist -r4t2iv -r3tri -rtr2oph4 -rt4s2h4 -r4t1s2 -ru3a -ru3e4l -ru3en -ru4gl2 -ru3i4n -r2ui2 -rum3p2l2 -ru4m2p -ru2n -ru4nk5 -run4ty -run1t -r5usc2 -r2us -ru2t1i5n -r4u1t2i -rv4e -rvel4i -r3ven -rv5er. -r5vest -rv4e2s -r3vey -r3vic -r3v2i4v -r3vo -r1w -ry4c -5rynge -ryn5g -ry3t -sa2 -2s1ab -5sack1 -sac3ri2 -s3a2c1t -5sai2 -sa4l2a2r4 -s4a2l4m -sa5lo -sa4l4t -3sanc -sa2n -san4de -s4and -s1ap -sa5ta -5sa3t2io -sa2t3u -sau4 -sa5vor -5saw -4s5b -scan4t5 -s1ca -sca2n -sca4p -scav5 -s4ced -4s3cei2 -s4ces -s2ch2 -s4cho2 -3s4c2ie4 -s1ci -5sc4in4d -s2cin -scle5 -s1c4l4 -s4cli -scof4 -s1co -4scopy5 -scou1r5a -scou2 -s1cu -4s5d -4se. -se4a -seas4 -sea5w -se2c3o -3se2c1t -4s4ed -se4d4e -s5edl -se2g -se1g3r -5sei2 -se1le -5se2l2f -5selv -4se1me -se4mol -se1mo -sen5at -se1na -4senc -sen4d -s5e2ned -sen5g -s5en1in -4sen4t1d -sen1t -4sen2tl -se2p3a3 -4s1er. -s4er1l -s2er4o -4ser3vo -s1e4s -s4e5s2h -ses5t -5se5um -s4eu -5sev -sev3en -sew4i2 -5sex -4s3f -2s3g -s2h -2sh. -sh1er -5shev -sh1in -sh3io -3sh2i4p -sh2i2v5 -sho4 -sh5o2l2d -sho2n3 -shor4 -short5 -4sh1w -si1b -s5ic3c -3si2de. -s2id -5side4s2 -5si2di -si5diz -4sig1n4a -s2ig -sil4e -4si1ly -2s1in -s2i1na -5si2ne. -s2ine -s3ing -1s2io -5sio2n -sio1n5a -s4i2r -si1r5a -1sis -3s2i1t2io -si1ti -5si1u -1s2iv -5siz -sk2 -4ske -s3ket -sk5ine -sk1i -sk5in4g -s1l2 -s3lat -s2le -sl2ith5 -sl1it -2s1m -s3ma -smal1l3 -sma2n3 -smel4 -s5men -5s4m2ith -smo2l5d4 -s1mo -s1n4 -1so -so4ce -so2ft3 -so4lab -so1la -so2l3d2 -so3lic -sol2i -5sol2v -3som -3s4on. -so2n -so1n1a4 -son4g -s4op -5soph1ic -s2oph -s5o3phiz -s5o1phy -sor5c -sor5d -4sov -so5vi -2s1pa -5sp4ai2 -spa4n -spen4d -2s5peo -2sper -s2phe -3sph4er -spho5 -spil4 -sp5ing -spi2n -4s3p2i1o -s4p1ly -s1p2l2 -s4po2n -s1p4or4 -4sp4ot -squal4l -squ2 -s1r -2ss -s1sa2 -ssas3 -s2s5c -s3sel -s5sen5g -s4ses. -ss1e4s -s5set -s1si -s4s2ie4 -ssi4er -s4s5i1ly -s4s1l2 -ss4li -s4s1n4 -sspen4d4 -ss2t -ssu1r5a -s1su -ssu2r -ss5w2 -2st. -s2tag -s1ta -s2ta2l -stam4i -5st4and -sta2n -s4ta4p -5stat. -s4t1ed -stern5i -s5t2ero -ste2w -ste1w5a -s3th2e -st2i -s4ti. -s5t2i1a -s1tic -5s4tick1 -s4t2ie4 -s3tif2 -st3ing -s2t1in -5st4ir -s1tle -s2tl -5stock1 -s1to -sto2m3a -5stone -sto2n -s4top -3store -st4r -s4tra2d -s1tra -5stra2tu -s4tray -s4tr2id -4stry -4st3w4 -s2ty -1su -su1al -su4b3 -su2g3 -su5is -s2ui2 -suit3 -s4ul -su2m -su1m3i -su2n -su2r -4sv -sw2 -4s1wo2 -s4y -4sy1c -3syl -syn5o -sy5rin -1ta -3ta. -2tab -ta5bles2 -tab2l2 -5tab5o5l1iz -tabol2i -4t4a2ci -ta5do -ta2d -4ta2f4 -tai5lo -tai2 -ta2l -ta5la -tal5en -t2ale -tal3i -4talk -tal4lis -tal1l -tall2i -ta5log -ta5mo -tan4de -ta2n -t4and -1tan1ta3 -tan1t -ta5per -ta5p2l2 -tar4a -t2a2r -4tar1c -4tare -ta3r2iz -tar1i -tas4e -ta5s4y -4tat1ic -ta4tur -ta2tu -taun4 -tav4 -2taw -tax4is -tax3i -2t1b -4tc -t4ch -tch5e4t -tche2 -4t1d -4te. -te2ad4i -tea2d1 -4tea2t -te1ce4 -5te2c1t -2t1ed -t4e5di -1tee -teg4 -te5ger4 -te5gi -3tel. -tel2i4 -5te2l1s2 -te2ma2 -tem3at -3ten2a2n -te1na -3tenc -3tend -4te1nes -1ten1t -ten4tag -ten1ta -1teo -te4p -te5pe -ter3c -5ter3d -1ter1i -ter5ies -ter2ie4 -ter3is -teri5za1 -5t4er3n2it -ter5v -4tes. -4t2e2ss -t3ess. -teth5e -3t4eu -3tex -4tey -2t1f -4t1g -2th. -tha2n4 -th2e -4thea -th3eas -the5a2t -the3is -thei2 -3the4t -th5ic. -th5i1ca -4th4il2 -5th4i4nk2 -4t4h1l4 -th5ode -5thod3ic -4thoo2 -thor5it -tho5riz -2t4h1s2 -1t2i1a -ti4ab -ti4a1to -2ti2b -4tick1 -t4i1co -t4ic1u -5ti2di -t2id -3tien -t2ie4 -tif2 -ti5fy -2t2ig -5tigu -til2l5in4 -til1l -till2i -1tim -4ti4m1p -tim5ul -ti2mu -2t1in -t2i1na -3ti2ne. -t2ine -3t2ini -1t2io -ti5oc -tion5ee -tio2n -5tiq -ti3sa2 -3t4ise -ti2s4m -ti5so -tis4p -5tisti1ca -tis1t2i -tis1tic -ti3tl -ti4u -1t2iv -ti1v4a -1tiz -ti3za1 -ti3ze4n -ti2ze -2tl -t5la -tla2n4 -3tle. -3tled -3tles. -tles2 -t5let. -t5lo -4t1m -tme4 -2t1n2 -1to -to3b -to5crat -4to2do4 -2tof -to2gr -to5ic -toi2 -to2ma -to4m4b -to3my -ton4a4l1i -to2n -to1n1a -to3n2at -4tono -4tony -to2ra -to3r2ie4 -tor5iz -tos2 -5tour -tou2 -4tout -to3w2a2r -4t1p -1tra -t2ra3b -tra5ch -tr4a2ci4 -tra2c4it -trac4te -tra2c1t -tr2as4 -tra5ven -trav5e2s5 -tre5f -tre4m -trem5i -5tr2i3a -tri5ces -tr4ice -5tri3c2i1a -t4r2i1ci -4tri4c3s2 -2trim -tr2i4v -tro5m4i -tron5i -tro2n -4trony -tro5phe -tr2oph -tro3sp -tro3v -tr2u5i2 -tr2us4 -4t1s2 -t4sc -ts2h4 -t4sw2 -4t3t2 -t4tes -t5to -t1tu4 -1tu -tu1a -tu3a2r -tu4b4i -tud2 -4tue -4tuf4 -5t2u3i2 -3tum -tu4nis -tu1ni -2t3up. -3ture -5turi -tur3is -tur5o -tu5ry -3t2us -4tv -tw4 -4t1wa -twis4 -twi2 -4t1wo2 -1ty -4tya -2tyl -type3 -ty5ph -4tz -t2z4e -4uab -uac4 -ua5na -ua2n -uan4i -uar5an1t -u2a2r -uara2n -uar2d -uar3i -uar3t -u1at -uav4 -ub4e -u4bel -u3ber -u4b2ero -u1b4i -u4b5ing -u3b4le. -ub2l2 -u3ca -uci4b -u1ci -u2c4it -ucle3 -u1c4l4 -u3cr -u3cu -u4cy -ud5d4 -ud3er -ud5est -udes2 -ude1v4 -u1dic -ud3ied -ud2ie4 -ud3ies -ud5is1 -u5dit -u4do2n -u1do -ud4si -u2d1s2 -u4du -u4ene -ue2n1s4 -uen4te -uen1t -uer4il -uer1i -3u1fa -u3f4l2 -ugh3e2n -ug5in -2ui2 -uil5iz -uil1i -ui4n -u1ing -uir4m -u4ir -ui1ta4 -u2iv3 -ui4v4er. -u5j -4uk -u1la -ula5b -u5lati -ul2ch4 -u4l1c2 -5ulche2 -ul3der -u2ld -ul2de -ul4e -u1len -ul4gi -u4l1g4 -ul2i -u5l2i1a -ul3ing -ul5is2h -ul4l2a2r -ul1l -ul4li4b -ull2i -ul4lis -4u2l3m -u1l4o -4u2l1s2 -uls5e4s -ul2se -ul1ti -u4lt -ul1tra3 -ul1tr -4ul1tu2 -u3lu -ul5ul -ul5v -u2m5ab -u1ma -um4bi -u4m1b -um4b1ly -umb2l2 -u1mi -u4m3ing -umor5o -u1mo -umo2r -u4m2p -un2at4 -u1na -u2ne -un4er -u1ni -un4im -u2n1in -un5is2h -un2i3v -u2n3s4 -un4sw2 -un2t3a4b -un1t -un1ta -un4ter. -un4tes -unu4 -un5y -u4n5z -u4o4rs2 -u5os -u1ou2 -u1pe -upe4r5s2 -u5p2i3a -up3ing -upi2n -u3p2l2 -u4p3p -upport5 -up1p4or -up2t5i2b -u2p1t -up1tu4 -u1ra -4ura. -u4rag -u4r2as -ur4be -ur1b -ur1c4 -ur1d -ure5a2t -ur4fer1 -ur1f -ur4fr -u3rif -uri4fic -uri1fi -ur1in -u3r2i1o -u1rit -ur3iz -ur2l -url5ing. -ur4no4 -uros4 -ur4pe -ur1p -ur4pi -urs5er -u4rs2 -ur2se -ur5tes -ur3th2e -ur1ti4 -ur4t2ie4 -u3ru -2us -u5sa2d -usa2 -u5sa2n -us4ap -usc2 -us3ci -use5a -u5s2i1a -u3sic -us4lin -us1l2 -us1p -us5s1l2 -u2ss -us5tere -us1t4r -u2su -usu2r4 -u2ta4b -u1ta -u3tat -4u4te. -4utel -4uten -uten4i -4u1t2i -uti5l2iz -util1i -u3t2ine -u2t1in -ut3ing -utio1n5a -u1t2io -utio2n -u4tis -5u5tiz -u4t1l -u2t5of -u1to -uto5g -uto5mat1ic -uto2ma -u5to2n -u4tou2 -u4t1s4 -u3u -uu4m -u1v2 -ux1u3 -u2z4e -1va -5va. -2v1a4b -vac5il -v4a2ci -vac3u -vag4 -va4ge -va5l2i4e4 -val1i -val5o -val1u -va5mo -va5niz -va2n -va5pi -var5ied -v2a2r -var1i -var2ie4 -3vat -4ve. -4ved -veg3 -v3el. -vel3l2i -vel1l -ve4lo -v4e1ly -ven3om -v4eno -v5enue -v4erd -5v2e2re. -v4erel -v3eren -ver5enc -v4eres -ver3ie4 -ver1i -vermi4n -ver3m4 -3ver2se -ve4r1s2 -ver3th -v4e2s -4ves. -ves4te -ve4te -vet3er -ve4ty -vi5al1i -v2i1a -vi2al -5vi2a2n -5vi2de. -v2id -5vi2d1ed -4v3i1den -5vide4s2 -5vi2di -v3if -vi5gn -v2ig -v4ik4 -2vil -5v2il1it -vil1i -v3i3l2iz -v1in -4vi4na -v2inc -v4in5d -4ving -vi1o3l -v2io -v3io4r -vi1ou2 -v2i4p -vi5ro -v4ir -vis3it -vi3so -vi3su -4vi1ti -vit3r -4vi1ty -3v2iv -5vo. -voi4 -3v2ok -vo4la -v5ole -5vo4l2t -3vol2v -vom5i -vo2r5ab -vo1ra -vori4 -vo4ry -vo4ta -4vo1tee -4vv4 -v4y -w5ab2l2 -2wac -wa5ger -wa2g5o -wait5 -wai2 -w5al. -wam4 -war4t -w2a2r -was4t -wa1te -wa5ver -w1b -wea5r2ie4 -we2a2r -wear1i -we4ath3 -wea2t -we4d4n4 -weet3 -wee5v -wel4l -w1er -west3 -w3ev -whi4 -wi2 -wil2 -wil2l5in4 -wil1l -will2i -win4de -w4ind -win4g -w4ir4 -3w4ise -w2ith3 -wiz5 -w4k -wl4es2 -wl3in -w4no -1wo2 -wom1 -wo5v4en -w5p -wra4 -wri4 -wri1ta4 -w3s2h -ws4l2 -ws4pe -w5s4t -4wt -wy4 -x1a -xac5e -x4a2go -xam3 -x4ap -xas5 -x3c2 -x1e -xe4cu1to -xe1cu -xe3c4ut -x2ed -xer4i -x2e5ro -x1h -xhi2 -xh4il5 -xhu4 -x3i -x2i5a -xi5c -xi5di -x2id -x4ime -xi5m2iz -xim1i -x3o -x4ob -x3p -xp4an4d -x1pa -xpa2n -xpec1to5 -xpe2c -xpe2c1t -x2p2e3d -x1t2 -x3ti -x1u -xu3a -xx4 -y5ac -3y2a2r4 -y5at -y1b -y1c -y2ce -yc5er -y3ch -ych4e2 -ycom4 -y1co -ycot4 -y1d -y5ee -y1er -y4er1f -yes4 -ye4t -y5gi -4y3h -y1i -y3la -ylla5b2l2 -yl1l -y3lo -y5lu -ymbol5 -y4m1b -yme4 -ym1pa3 -y4m1p -yn3c4hr4 -yn2ch -yn5d -yn5g -yn5ic -5ynx -y1o4 -yo5d -y4o5g -yom4 -yo5net -yo2n -y4o2n3s2 -y4os -y4p2ed -yper5 -yp3i -y3po -y4po4c -yp2ta -y2p1t -y5pu -yra5m -yr5i3a -y3ro -yr4r4 -ys4c -y3s2e -ys3i1ca -y1s3io -3y1sis -y4so -y2ss4 -ys1t -ys3ta -ysu2r4 -y1su -y3thin -yt3ic -y1w -za1 -z5a2b -z2a2r2 -4zb -2ze -ze4n -ze4p -z1er -z2e3ro -zet4 -2z1i -z4il -z4is -5zl -4zm -1zo -zo4m -zo5ol -zoo2 -zte4 -4z1z2 -z4zy -.as9s8o9c8i8a8te. -.as1so -.asso1ci -.asso3c2i1a -.as9s8o9c8i8a8t8es. -.de8c9l8i9n8a9t8i8on. -.de1c4l4 -.decl4i1na -.declin2at -.declina1t2io -.declinatio2n -.ob8l8i8g9a9t8o8ry. -.ob2l2 -.obl2ig -.obli1ga -.obliga1to -.obligato1ry -.ph8i8l9a8n9t8h8r8o8p8ic. -.ph4il2 -.phi1la -.phila2n -.philan1t -.philant4hr4 -.philanthrop3ic -.pr8e8s8e8nt. -.p3re1s2e -.presen1t -.pr8e8s8e8n8ts. -.presen4t4s2 -.pr8o8j8e8ct. -.pro5j -.pro1je -.proje2c1t -.pr8o8j8e8c8ts. -.projec4t1s2 -.re8c9i9p8r8o8c9i9t8y. -.re1c2i -.rec2ip -.recipr2 -.recipr2oc -.re1cipro1ci -.recipro2c1it -.reciproci1ty -.re9c8o8g9n8i9z8a8n8ce. -.re1co -.re2cog -.rec3ogniz -.recog1ni -.recogniza1 -.recogniza2n -.re8f9o8r9m8a9t8i8on. -.re1f -.re1fo -.refo2r -.refor1m -.refor1ma -.reforma1t2io -.reformatio2n -.re8t9r8i9b8u9t8i8on. -.re3tri -.retr4ib -.retri3bu1t2io -.retrib4u1t2i -.retributio2n -.ta9b8le. -.2tab -.tab2l2 -.ac8a8d9e9m8y. -.a1ca -.aca2d -.acad4em -.acade3my -.ac8a8d9e9m8i8e8s. -.academ2i4e4 -.ac9c8u9s8a9t8i8v8e. -.ac3c -.ac1c2us -.accusa2 -.accusa1t2iv -.ac8r8o9n8y8m. -.acro2n -.acronym4 -.ac8r8y8l9a8m8i8d8e. -.acry3la -.acrylam2id -.ac8r8y8l9a8m8i8d8e8s. -.acrylamide4s2 -.ac8r8y8l9a8l8d8e9h8y8d8e. -.acryla2ld -.acrylal2de -.acrylalde1h4 -.acrylaldehy1d -.ad8d9a9b8l8e. -.ad1d2a -.ad2d3a4b -.addab2l2 -.ad8d9i9b8l8e. -.addi1b2l2 -.ad8r8e8n9a9l8i8n8e. -.a1dr -.adre4 -.a5dren -.adre1na -.adrena4l1i -.adrena1l4ine -.ae8r8o9s8p8a8c8e. -.ae4r -.a2ero -.aero2s4pa -.aerospa4ce -.af9t8e8r9t8h8o8u8g8h8t. -.afterthou2 -.af9t8e8r9t8h8o8u8g8h8t8s. -.afterthough4t1s2 -.ag8r8o8n9o9m8i8s8t. -.a1gr -.ag4ro -.agro2n -.agronom2is -.ag8r8o8n9o9m8i8s8t8s. -.agronomis4t1s2 -.al9g8e9b8r8a9i9c8a8l9l8y. -.a4l1g4 -.alg2e1b -.alge3br -.algebr2ai2 -.algebrai1ca -.algebraical1l -.algebraical1ly -.am9p8h8e8t9a9m8i8n8e. -.a4m1p -.amphe4t -.amphe1ta -.amphetam1in -.amphetam2ine -.am9p8h8e8t9a9m8i8n8e8s. -.amphetami1nes -.an9a9l8y8s8e. -.3ana1ly -.a1na -.an4a2lys4 -.anal5y3s2e -.an9a9l8y8s8e8d. -.analy4s4ed -.an8a8l8y9s8e8s. -.analys1e4s -.an9i8s8o9t8r8o8p9i8c. -.ani2so -.anisotrop3ic -.an9i8s8o9t8r8o8p9i9c8a8l9l8y. -.anisotropi1ca -.anisotropical1l -.anisotropical1ly -.an9i8s8o8t9r8o9p8i8s8m. -.anisotropi2s1m -.an9i8s8o8t9r8o8p8y. -.anisotropy5 -.an8o8m9a8l8y. -.ano4 -.anoma5l -.ano1ma -.anoma1ly -.an8o8m9a8l8i8e8s. -.anomal1i -.anomal2i4e4 -.an8t8i9d8e8r8i8v9a9t8i8v8e. -.ant2id -.antider1i -.antider2i4v -.antide4ri1va -.antideri3vat -.antider2iva1t2iv -.an8t8i9d8e8r8i8v9a9t8i8v8e8s. -.antiderivativ4e2s -.an8t8i9h8o8l8o9m8o8r9p8h8i8c. -.anti3h -.antiholo1mo -.antiholomo2r -.antiholomor1p -.antiholomorp4h4 -.antiholomorph1ic -.an9t8i8n9o9m8y. -.an2t1in -.ant2i1no -.antino3my -.an9t8i8n9o9m8i8e8s. -.antinom2ie4 -.an9t8i9n8u9c8l8e8a8r. -.antin1u -.antinucle3 -.antinu1c4l4 -.antinucle2a -.antinucle2a2r -.an9t8i9n8u9c8l8e9o8n. -.antinucleo2n -.an9t8i9r8e8v9o9l8u9t8i8o8n9a8r8y. -.ant4ir -.antirev2 -.antirev5olu -.antirevo1lut -.antirevol4u1t2i -.antirevolutio1n5a -.antirevolu1t2io -.antirevolutio2n -.antirevolution2a2r -.ap8o8t8h9e9o9s8e8s. -.ap4ot -.ap4oth -.apoth2e -.apotheos4 -.apotheos1e4s -.ap8o8t8h9e9o9s8i8s. -.apotheo1sis -.ap9p8e8n9d8i8x. -.a4p1p -.ap2pe -.ap3pen -.ar9c8h8i9m8e9d8e8a8n. -.ar1c -.ar2ch -.archi2med -.archimedea2n -.ar9c8h8i9p8e8l9a8g8o. -.arch2i4p -.archipe4 -.archipe4la -.archipela2go -.ar9c8h8i9p8e8l9a9g8o8s. -.ar9c8h8i8v8e. -.arch2i2v -.ar9c8h8i8v8e8s. -.archiv4e2s -.ar9c8h8i8v9i8n8g. -.archiv1in -.archi4ving -.ar9c8h8i8v9i8s8t. -.ar9c8h8i8v9i8s8t8s. -.archivis4t1s2 -.ar9c8h8e9t8y8p9a8l. -.arche2 -.arche4t -.arche1ty -.archety1pa -.archetyp4al -.ar9c8h8e9t8y8p9i9c8a8l. -.archetyp3i -.archetypi1ca -.ar8c9t8a8n9g8e8n8t. -.ar2c1t -.arct5ang -.arc1ta -.arcta2n -.arctan1gen -.arctangen1t -.ar8c9t8a8n9g8e8n8t8s. -.arctangen4t4s2 -.as9s8i8g8n9a9b8l8e. -.as1si -.as4sig1n4a -.ass2ig -.assig2n1a2b -.assignab2l2 -.as9s8i8g8n9o8r. -.assig1no -.as9s8i8g8n9o8r8s. -.assigno4rs2 -.as9s8i8s8t9a8n8t9s8h8i8p. -.as1sis -.assis1ta -.assista2n -.assistan1t -.assistan4t4s2 -.assistants2h4 -.assistant3sh2i4p -.as9s8i8s8t9a8n8t9s8h8i8p8s. -.assistantshi2p1s2 -.as8y8m8p9t8o9m8a8t8i8c. -.as4y -.asy4m1p -.asym2p1t -.asymp1to -.asympto2ma -.asymptomat1ic -.as9y8m8p9t8o8t9i8c. -.as8y8n9c8h8r8o9n8o8u8s. -.asyn3c4hr4 -.asyn2ch -.asynchro2n -.asynchro1nou2 -.asynchrono2us -.at8h9e8r9o9s8c8l8e9r8o9s8i8s. -.4ath -.ath2e -.ath2ero -.atheros2c -.atheroscle5 -.atheros1c4l4 -.ath2eroscl4ero -.atherosclero1sis -.at9m8o8s9p8h8e8r8e. -.a4t1m -.at1mo -.atmos2 -.atmo3sp -.atmos2phe -.atmo3sph4er -.at9m8o8s9p8h8e8r8e8s. -.at9t8r8i8b9u8t8e8d. -.a4t3t2 -.attr4ib -.attribu2t1ed -.at9t8r8i8b9u8t9a8b8l8e. -.attri4bu1ta -.attribu2ta4b -.attributab2l2 -.au9t8o9m8a9t8i8o8n. -.au1to -.auto2ma -.automa1t2io -.automatio2n -.au9t8o8m9a9t8o8n. -.automa1to -.automato2n -.au9t8o8m9a9t8a. -.automa2ta -.au9t8o9n8u8m9b8e8r9i8n8g. -.au5to2n -.auton5um -.autonu4m1b -.autonumber1i -.autonumberin4g -.au9t8o8n9o9m8o8u8s. -.au4tono -.autono4mo -.autono3mo2us -.autonomou2 -.au8t8o9r8o8u8n8d9i8n8g. -.autorou2 -.autoroun2d -.autoround1in -.av9o8i8r9d8u9p8o8i8s. -.avoi4 -.avo4ir -.avoir1du -.avoir4dup -.avoirdupoi2 -.ba8n8d9l8e8a8d8e8r. -.b4and -.ban1dl -.bandle2a -.bandlea2d1 -.ba8n8d9l8e8a8d8e8r8s. -.bandleade4r5s2 -.ba8n8k9r8u8p8t. -.ba4nk2 -.bankru2p1t -.ba8n8k9r8u8p8t9c8y. -.bankrup4tc -.bankrupt1cy -.ba8n8k9r8u8p8t9c8i8e8s. -.bankrupt1ci -.bankruptc2ie4 -.ba8r9o8n8i8e8s. -.b2a2r -.ba5roni -.baro2n -.baron2ie4 -.ba8s8e9l8i8n8e9s8k8i8p. -.basel2i -.base1l4ine -.baseli1nes -.baselinesk2 -.baselinesk1i -.baselinesk2i4p -.ba9t8h8y8m9e9t8r8y. -.1bat -.b4ath -.bathyme4 -.bathym4etr -.bathyme3try -.ba8t8h8y9s8c8a8p8h8e. -.bathy2s -.bathys4c -.bathysca4p -.bathys1ca -.be8a8n9i8e8s. -.bea2n -.bea3nies -.bean2ie4 -.be9h8a8v9i8o8u8r. -.be1h4 -.behav1i -.behavi1ou2 -.behav2io -.behavi4our -.be9h8a8v9i8o8u8r8s. -.behaviou4rs2 -.be8v8i8e8s. -.be1vi -.bev2ie4 -.bi8b9l8i9o8g9r8a9p8h8y9s8t8y8l8e. -.bi2b -.bi1b2l2 -.bib3li -.bibli5og -.bibl2io -.biblio2gr -.biblio4g3ra1phy -.bibliography2s -.bibliographys1t -.bibliographys2ty -.bibliographys2tyl -.bi9d8i8f9f8e8r9e8n9t8i8a8l. -.b2i4d -.bi2di -.bid1if -.bidi4f1f -.bidiffer1 -.bidiffer3en1t -.bidifferent2i -.bidifferen1t2i1a -.bidifferenti2al -.bi8g9g8e8s8t. -.b2ig -.bi4g1g2 -.big2ge -.bi8l8l9a8b8l8e. -.1bil -.bill5ab -.bil1l -.billab2l2 -.bi8o9m8a8t8h9e9m8a8t9i8c8s. -.b2io -.bio4m -.bio1ma -.biom4ath3 -.biomath5em -.biomath2e -.biomathe1ma -.biomathemat1ic -.biomathemati4c3s2 -.bi8o9m8e8d9i9c8a8l. -.bio2me -.bio2med -.biom4edi -.biomed3i1ca -.bi8o9m8e8d9i9c8i8n8e. -.biomed2i1ci -.biomedi2cin -.biomedic2ine -.bi8o9r8h8y8t8h8m8s. -.biorh4 -.biorhyt4h1m -.biorhyth4m1s2 -.bi8t9m8a8p. -.bi2t -.bi4t1m -.bit1ma -.bit4map -.bi8t9m8a8p8s. -.bitma2p1s2 -.bl8a8n8d9e8r. -.b2l2 -.b3l4and -.bla2n -.blan1de -.bl8a8n8d9e8s8t. -.blande4s2 -.bl8i8n8d9e8r. -.bl4ind -.blin1de -.bl8o8n8d8e8s. -.b4lo -.blo2n -.bl2ond -.blon1de -.blondes2 -.bl8u8e9p8r8i8n8t. -.bluepr2 -.blueprin4t3 -.bl8u8e9p8r8i8n8t8s. -.blueprin4t4s2 -.bo9l8o8m9e9t8e8r. -.bolo2me -.bolo4met -.bolome1te -.bo8o8k9s8e8l8l9e8r. -.3boo2 -.bo2o4k -.boo4k1s2 -.booksel1l -.booksel2le -.bo8o8k9s8e8l8l9e8r8s. -.bookselle4r1s2 -.bo8o8l9e8a8n. -.boole2a -.boolea2n -.bo8o8l9e8a8n8s. -.boolea2n1s2 -.bo8r9n8o9l8o8g9i9c8a8l. -.borno4 -.borno3log1ic -.bornologi1ca -.bo8t9u9l8i8s8m. -.bo1tu -.botul2i -.botuli2s1m -.br8u8s8q8u8e8r. -.br2us -.brusqu2 -.brus3quer -.bu8f9f8e8r. -.buf4fer1 -.bu4f1f -.bu8f9f8e8r8s. -.buffe4r1s2 -.bu8s8i8e8r. -.bus5ie4 -.b2us -.bu8s8i8e8s8t. -.busi1est -.bu8s8s8i8n8g. -.bu2ss -.bus1si -.bus2s1in -.buss3ing -.bu8t8t8e8d. -.but2t1ed -.bu8z8z9w8o8r8d. -.bu4z1z2 -.buzz1wo2 -.bu8z8z9w8o8r8d8s. -.buzzwor2d1s2 -.ca9c8o8p8h9o9n8y. -.ca1co -.cac2oph -.cacopho5ny -.cacopho2n -.ca9c8o8p8h9o9n8i8e8s. -.caco5phoni -.cacophon2ie4 -.ca8l8l9e8r. -.cal1l -.cal2le -.ca8l8l9e8r8s. -.calle4r1s2 -.ca8m9e8r8a9m8e8n. -.cam5er1a -.camera1men -.ca8r8t9w8h8e8e8l. -.cartw4 -.ca8r8t9w8h8e8e8l8s. -.cartwhee2l1s2 -.ca9t8a8r8r8h8s. -.ca2ta -.cat2a2r -.catar1r4 -.catarrh4 -.catarr4h1s2 -.ca8t9a9s8t8r8o8p8h9i8c. -.catas1t4r -.catastr2oph -.catastroph1ic -.ca8t9a9s8t8r8o8p8h9i9c8a8l8l8y. -.catastrophi1ca -.catastrophical1l -.catastrophical1ly -.ca8t9e9n8o8i8d. -.cat4eno -.catenoi2 -.cateno2id -.ca8t9e9n8o8i8d8s. -.catenoi2d1s2 -.ca8u9l8i9f8l8o8w9e8r. -.cau4l2 -.caul2i -.cauli4f4l2 -.cauliflow1er -.ch8a8p9a8r9r8a8l. -.chap2a2r4 -.cha1pa -.chapar1r4 -.ch8a8r9t8r8e8u8s8e. -.ch2a2r -.chartr4eu2 -.chartre2us4 -.ch8e8m8o9t8h8e8r9a8p8y. -.che2 -.che1mo -.chem4oth3 -.chemoth2e -.chemoth4er1a -.chemothera3p -.ch8e8m8o9t8h8e8r9a9p8i8e8s. -.chemotherap2ie4 -.ch8l8o8r8o9m8e8t8h9a8n8e. -.c4h1l4 -.ch2lo -.chloro2me -.chloro4met -.chlorometha2n4 -.ch8l8o8r8o9m8e8t8h9a8n8e8s. -.chlorometha1nes -.ch8o9l8e8s9t8e8r8i8c. -.3cho2 -.c3hol4e -.choles2 -.choles1ter1i -.ci8g9a9r8e8t8t8e. -.c2ig -.ci1ga -.cig2a2r -.cigare4t3t2 -.ci8g9a9r8e8t8t8e8s. -.cigaret4tes -.ci8n8q8u8e9f8o8i8l. -.2cin -.cin1q -.cinqu2 -.cinque1f -.cinque1fo -.cinquefoi2 -.co9a8s8s8o9c8i8a9t8i8v8e. -.c4oa -.coa2ss -.coas1so -.coasso1ci -.coasso3c2i1a -.coassoci4a1t2iv -.co9g8n8a8c. -.2cog -.cog1n4a -.co9g8n8a8c8s. -.cogna4c3s2 -.co9k8e8r9n8e8l. -.c2ok -.cok1er -.coker3nel -.co9k8e8r9n8e8l8s. -.cokerne2l1s2 -.co8l9l8i8n9e8a9t8i8o8n. -.col1l -.coll2i -.col2lin4 -.col1l4ine -.collin3ea -.collinea2t -.collinea1t2io -.collineatio2n -.co8l9u8m8n8s. -.colu4m1n -.colum2n1s2 -.co8m9p8a8r9a8n8d. -.co4m1p -.compara5 -.com1pa -.comp2a2r -.compara2n -.compar4and -.co8m9p8a8r9a8n8d8s. -.comparan2d1s2 -.co8m9p8e8n9d8i8u8m. -.compendi1u -.co8m9p8o9n8e8n8t9w8i8s8e. -.compo2n -.compo3nen -.componen1t -.componentw4 -.componentwis4 -.componentwi2 -.component3w4ise -.co8m8p9t8r8o8l9l8e8r. -.comp4tr -.com2p1t -.comptrol1l -.comptrol2le -.co8m8p9t8r8o8l9l8e8r8s. -.comptrolle4r1s2 -.co8n9f8o8r8m9a8b8l8e. -.co2n -.con3f -.con1fo -.confo2r -.confor1m -.confor1ma -.confor2mab -.conformab2l2 -.co8n9f8o8r8m9i8s8t. -.confor2mi -.conform2is -.co8n9f8o8r8m9i8s8t8s. -.conformis4t1s2 -.co8n9f8o8r8m9i8t8y. -.confor3mit -.conformi1ty -.co8n9g8r8e8s8s. -.con3g -.con1gr -.congr2e2ss -.co8n9g8r8e8s8s8e8s. -.congress1e4s -.co8n9t8r8i8b9u8t8e. -.con5t -.contr4ib -.co8n9t8r8i8b9u8t8e8s. -.co8n9t8r8i8b9u8t8e8d. -.contribu2t1ed -.co9r8e9l8a9t8i8o8n. -.core1la -.corela1t2io -.corelatio2n -.co9r8e9l8a9t8i8o8n8s. -.corelatio2n3s2 -.co9r8e9l8i9g8i8o8n9i8s8t. -.core1l2i -.corel2ig -.corel4igi -.coreli5g2io -.coreligion3i -.coreligio2n -.coreligion1is -.co9r8e9l8i9g8i8o8n9i8s8t8s. -.coreligionis4t1s2 -.co9r8e9o8p9s8i8s. -.core1o -.coreo2p1s2 -.coreop1sis -.co9r8e9s8p8o8n9d8e8n8t. -.core1sp -.cores4po2n -.coresp2ond -.corespon1de -.corespon1den -.coresponden1t -.co9r8e9s8p8o8n9d8e8n8t8s. -.coresponden4t4s2 -.co9s8e9c8a8n8t. -.cos4e -.cose1ca -.coseca2n -.cosecan1t -.co9t8a8n9g8e8n8t. -.co4ta2n -.co1ta -.cot2ang -.cotan1gen -.cotangen1t -.co8u8r9s8e8s. -.cou2 -.cou4rs2 -.cour2se -.cours3e4s -.co9w8o8r8k9e8r. -.co4wo2 -.cowork1er -.co9w8o8r8k9e8r8s. -.coworke4r1s2 -.cr8a8n8k9c8a8s8e. -.cra2n -.cra4nk2 -.crank1ca -.cr8a8n8k9s8h8a8f8t. -.cran4k1s2 -.cranks2h -.cranksha2f -.cranksha2ft -.cr8o8c9o9d8i8l8e. -.cr2oc -.cro4cod -.cro1co -.cr8o8c9o9d8i8l8e8s. -.crocodiles2 -.cr8o8s8s9h8a8t8c8h. -.cro2s4s -.cross2h -.crossha4tc -.crosshat4ch -.cr8o8s8s9h8a8t8c8h8e8d. -.crosshatche2 -.crosshat4ch4ed -.cr8o8s8s9o8v8e8r. -.cros1so -.cros4sov -.cr8y8p9t8o9g8r8a8m. -.cry2p1t -.cryp1to -.crypto2gr -.cr8y8p9t8o9g8r8a8m8s. -.cryptogra4m1s2 -.cu8f8f9l8i8n8k. -.c4uf -.cu4f1f -.cuff4l2 -.cufflin4 -.cuffl4i4nk2 -.cu8f8f9l8i8n8k8s. -.cufflin4k1s2 -.cu9n8e8i9f8o8r8m. -.3cun -.cu2ne -.cunei2 -.cunei1fo -.cuneifo2r -.cuneifor1m -.cu8s9t8o8m9i8z9a9b8l8e. -.1c2us -.cus1to -.custom2iz -.customiza1 -.customiz5a2b -.customizab2l2 -.cu8s9t8o8m9i8z8e. -.customi2ze -.cu8s9t8o8m9i8z8e8s. -.cu8s9t8o8m9i8z8e8d. -.da8c8h8s9h8u8n8d. -.1d2a -.da2ch4 -.dac4h1s2 -.dach4s2h -.da8m9s8e8l9f8l8y. -.da2m2 -.da4m1s2 -.dam5se2l2f -.damself4l2 -.damself2ly5 -.da8m9s8e8l9f8l8i8e8s. -.damselfl2ie4 -.da8c8t8y8l9o9g8r8a8m. -.da2c1t -.dac1ty -.dac2tyl -.dacty3lo -.dactylo1gr -.da8c8t8y8l9o9g8r8a8p8h. -.da8t8a9b8a8s8e. -.3dat -.da2ta -.da2tab -.da8t8a9b8a8s8e8s. -.databas1e4s -.da8t8a9p8a8t8h. -.dat5ap -.datap5at -.data1pa -.datap4ath -.da8t8a9p8a8t8h8s. -.datapa2t4h1s2 -.da8t8e9s8t8a8m8p. -.dat3est -.dates1ta -.datesta4m1p -.da8t8e9s8t8a8m8p8s. -.datestam2p1s2 -.de9c8l8a8r9a8b8l8e. -.de4cl2a2r -.decla2rab -.declarab2l2 -.de9f8i8n9i9t8i8v8e. -.de1f -.de1fi -.de2fin -.def2ini -.defin2it -.defini1ti -.defini1t2iv -.de9l8e8c9t8a9b8l8e. -.d5elec -.dele2c1t -.delec2ta4b -.delec1ta -.delectab2l2 -.de8m8i9s8e8m8i9q8u8a9v8e8r. -.de4m2is -.dem4ise -.demisemi3qua -.demisemiqu2 -.demisemiqua5v4 -.de8m8i9s8e8m8i9q8u8a9v8e8r8s. -.demisemiquave4r1s2 -.de9m8o8c9r8a9t8i8s8m. -.de4mocr -.democrati2s4m -.de8m8o8s. -.demos2 -.de9r8i8v9a9t8i8v8e. -.der2i4v -.de4ri1va -.deri3vat -.der2iva1t2iv -.de9r8i8v9a9t8i8v8e8s. -.derivativ4e2s -.di8a9l8e8c9t8i8c. -.1d4i3a -.di2al -.di2ale -.diale2c1t -.di8a9l8e8c9t8i8c8s. -.dialecti4c3s2 -.di8a9l8e8c9t8i9c8i8a8n. -.dialect2i1ci -.d2i1alecti3c2i1a -.dialectici2a2n -.di8a9l8e8c9t8i9c8i8a8n8s. -.dialecticia2n1s2 -.di9c8h8l8o8r8o9m8e8t8h9a8n8e. -.d4i2ch -.dic4h1l4 -.dich2lo -.dichloro2me -.dichloro4met -.dichlorometha2n4 -.di8f9f8r8a8c8t. -.d1if -.dif4fr -.di4f1f -.diffra2c1t -.di8f9f8r8a8c8t8s. -.diffrac4t1s2 -.di8f9f8r8a8c9t8i8o8n. -.diffrac1t2io -.diffractio2n -.di8f9f8r8a8c9t8i8o8n8s. -.diffractio2n3s2 -.di8r8e8r. -.d4ir2 -.di1re -.dir1er4 -.di8r8e9n8e8s8s. -.dire1nes -.diren2e2ss -.di8s9p8a8r9a8n8d. -.dis1 -.dis1p -.di2s1pa -.disp2a2r -.dispara2n -.dispar4and -.di8s9p8a8r9a8n8d8s. -.disparan2d1s2 -.di8s9t8r8a8u8g8h8t9l8y. -.d4is3t -.dist4r -.dis1tra -.distraugh3 -.distraugh2tl -.distraught1ly -.di8s9t8r8i8b9u8t8e. -.distr4ib -.di8s9t8r8i8b9u8t8e8s. -.di8s9t8r8i8b9u8t8e8d. -.distribu2t1ed -.do8u9b8l8e9s8p8a8c8e. -.dou2 -.dou3b2l2 -.dou5ble1sp -.doubles2 -.double2s1pa -.doublespa4ce -.do8u9b8l8e9s8p8a8c9i8n8g. -.doublesp4a2ci -.doublespa2c1in -.doublespac1ing -.do8l8l9i8s8h. -.dol1l -.doll2i -.dollis2h -.dr8i8f8t9a8g8e. -.1dr -.dr4i2ft -.drif1ta -.dr8i8v9e8r8s. -.dr2iv -.drive4r1s2 -.dr8o8m9e9d8a8r8y. -.dro2me -.dro2med -.drom2e2d2a -.drome4dary -.dromed2a2r -.dr8o8m9e9d8a8r8i8e8s. -.dromedar1i -.dromedar2ie4 -.du9o8p9o9l8i8s8t. -.duopol2i -.du9o8p9o9l8i8s8t8s. -.duopolis4t1s2 -.du9o8p9o8l8y. -.duopo2ly -.dy8s9l8e8x8i8a. -.d2y -.dys1l2 -.dys2le -.dyslex3i -.dyslex2i5a -.dy8s9l8e8c9t8i8c. -.dysle2c1t -.ea8s8t9e8n8d9e8r8s. -.east3 -.eas3ten -.eas3tend -.easten1de -.eastende4r5s2 -.ec8o9n8o8m9i8c8s. -.e1co -.eco2n -.eco3nomic -.economi4c3s2 -.ec8o8n9o9m8i8s8t. -.econom2is -.ec8o8n9o9m8i8s8t8s. -.economis4t1s2 -.ei9g8e8n9c8l8a8s8s. -.ei2 -.e2ig2 -.ei1gen -.eigen1c4l4 -.eigencla2ss -.ei9g8e8n9c8l8a8s8s8e8s. -.eigenclass1e4s -.ei9g8e8n9v8a8l9u8e. -.eigen1v2 -.eigen1va -.eigenval1u -.ei9g8e8n9v8a8l9u8e8s. -.el8e8c8t8r8o9m8e8c8h8a8n9i9c8a8l. -.5elec -.ele2c1t -.electro2me -.electrome2ch -.electrome5cha4n1ic -.electromecha2n -.electromechani1ca -.el8e8c8t8r8o9m8e8c8h8a8n8o9a8c8o8u8s8t8i8c. -.electromechano4 -.electromechan4oa -.electromechanoa1co -.electromechanoacou2 -.electromechanoaco2us -.electromechanoacoust2i -.electromechanoacous1tic -.el8i8t9i8s8t. -.el2i -.el1it -.eli1ti -.el4itis -.el8i8t9i8s8t8s. -.elitis4t1s2 -.en9t8r8e9p8r8e9n8e8u8r. -.en1t -.entrepr2 -.entrepren4eu -.en9t8r8e9p8r8e9n8e8u8r9i8a8l. -.entrepreneur2i3a -.entrepreneuri2al -.ep9i9n8e8p8h9r8i8n8e. -.epi2n -.ep2ine -.epinep4hr4 -.ep2inephr2in4e -.eq8u8i9v8a8r8i9a8n8t. -.equ2iv3 -.equi1va -.equiv2a2r -.equivar1i -.equivar3i2a2n -.equivar2i3a -.equivar4ian4t -.eq8u8i9v8a8r8i9a8n8c8e. -.equivar4ianc -.et8h9a8n8e. -.etha2n4 -.et8h9y8l9e8n8e. -.ev8e8r9s8i9b8l8e. -.ev1er -.eve4r1s2 -.ever1si -.ever4si4b -.eversi1b2l2 -.ev8e8r8t. -.ev8e8r8t8s. -.ever4t1s2 -.ev8e8r8t9e8d. -.ever2t1ed -.ev8e8r8t9i8n8g. -.ever1ti -.ever2t1in -.ex9q8u8i8s9i8t8e. -.exqu2 -.exq2ui2 -.exquis2ite -.ex9t8r8a9o8r9d8i9n8a8r8y. -.ex1t2 -.ex1tra -.extr4ao -.extraord2i -.extraord1in4 -.extraor1di1na -.extraordin2a2r -.fa8l8l9i8n8g. -.1fa -.fal1l -.fall2i -.fal2lin4 -.fe8r8m8i9o8n8s. -.fer1 -.fer3m4 -.fer4m2io -.fermio2n -.fermio2n3s2 -.fi9n8i8t8e9l8y. -.1fi -.2fin -.f2ini -.fin2it -.fin2ite -.finite1ly -.fl8a9g8e8l9l8u8m. -.f4l2 -.flag5el1l -.fl8a9g8e8l9l8a. -.flag4ella -.fl8a8m9m8a9b8l8e8s. -.flam1m -.flam1ma -.flam2mab -.flammab2l2 -.flammables2 -.fl8e8d8g9l8i8n8g. -.fledgl2 -.fl8o8w9c8h8a8r8t. -.flow2ch -.flowch2a2r -.fl8o8w9c8h8a8r8t8s. -.flowchar4t1s2 -.fl8u8o8r8o9c8a8r9b8o8n. -.flu3o -.fluo3r -.fluor2oc -.fluoro1ca -.fluoroc2a2r -.fluorocar1b -.fluorocarb4o -.fluorocarbo2n -.fo8r9m8i9d8a9b8l8e. -.for2mi -.formi1d4a -.form2id -.formi2d3a4b -.formidab2l2 -.fo8r9m8i9d8a9b8l8y. -.formidab1ly -.fo8r9s8y8t8h9i8a. -.fo4rs2 -.fors4y -.forsyth2i1a -.fo8r8t8h9r8i8g8h8t. -.fort4hr4 -.forthr2ig -.fr8e8e9l8o8a8d8e8r. -.freel4oa -.freeloa2d3 -.fr8e8e9l8o8a8d8e8r8s. -.freeloade4r5s2 -.fr8i8e8n8d9l8i8e8r. -.fri2 -.fr2ie4 -.friendl2ie4 -.fr8i9v8o8l9i8t8y. -.fr2iv -.frivol2i -.frivol1it -.frivoli1ty -.fr8i9v8o8l9i9t8i8e8s. -.frivoli1ti -.frivolit2ie4 -.fr8i8v9o9l8o8u8s. -.frivolou2 -.frivolo2us -.ga9l8a8c9t8i8c. -.gala2c1t -.ga8l9a8x8y. -.ga8l9a8x9i8e8s. -.galax3i -.galax2ie4 -.ga8s9o8m9e9t8e8r. -.ga1so -.ga3som -.gaso2me -.gaso4met -.gasome1te -.ge9o9d8e8s9i8c. -.geodes2 -.geode1si -.geode2sic -.ge9o9d8e8t9i8c. -.geode1t -.geodet1ic -.ge8o9m8e8t9r8i8c. -.ge3om -.geo2me -.geo4met -.geom4etr -.geo5met3ric -.ge8o9m8e8t9r8i8c8s. -.geome4tri4c3s2 -.ge9o9s8t8r8o8p8h8i8c. -.geos4 -.geost4r -.geostr2oph -.geostroph1ic -.ge8o9t8h8e8r9m8a8l. -.ge4ot -.ge4oth -.geoth2e -.geother3m4 -.geother1ma -.ge9o8t9r8o9p8i8s8m. -.geotropi2s1m -.gn8o9m8o8n. -.g1no -.gno4mo -.gno4mo2n -.gn8o9m8o8n8s. -.gnomo2n3s2 -.gr8a8n8d9u8n8c8l8e. -.1gr -.gra2n2 -.gr4and -.gran1du -.grandu4n -.grandun1c4l4 -.gr8a8n8d9u8n8c8l8e8s. -.granduncles2 -.gr8i8e8v9a8n8c8e. -.gr2ie4 -.grie1va -.grieva2n -.gr8i8e8v9a8n8c8e8s. -.gr8i8e8v9o8u8s. -.grievou2 -.grievo2us -.gr8i8e8v9o8u8s9l8y. -.grievous1l2 -.grievous1ly -.ha8i8r9s8t8y8l8e. -.hai2 -.ha4ir -.hai4rs2 -.hairs2ty -.hairs2tyl -.ha8i8r9s8t8y8l8e8s. -.hairstyles2 -.ha8i8r9s8t8y8l9i8s8t. -.ha8i8r9s8t8y8l9i8s8t8s. -.hairstylis4t1s2 -.ha8l8f9s8p8a8c8e. -.ha2lf -.hal2f3s -.half2s1pa -.halfspa4ce -.ha8l8f9s8p8a8c8e8s. -.ha8l8f9w8a8y. -.ha8r9b8i8n9g8e8r. -.h2a2r -.har1b -.harbi2 -.har2bin -.harb4inge -.ha8r9b8i8n9g8e8r8s. -.harbinge4r1s2 -.ha8r9l8e9q8u8i8n. -.har4le4 -.har1l -.harle1q -.harlequ2 -.harleq2ui2 -.harlequi4n -.ha8r9l8e9q8u8i8n8s. -.harlequ2i2n1s2 -.ha8t8c8h9e8r8i8e8s. -.ha4tc -.hat4ch -.hatche2 -.hatcher1i -.hatcher2ie4 -.he8m8i9d8e8m8i9s8e8m8i9q8u8a9v8e8r. -.hem2id -.hemid4em -.hemide4m2is -.hemidem4ise -.hemidemisemi3qua -.hemidemisemiqu2 -.hemidemisemiqua5v4 -.he8m8i9d8e8m8i9s8e8m8i9q8u8a9v8e8r8s. -.hemidemisemiquave4r1s2 -.he9m8o9g8l8o9b8i8n. -.hemo4g -.he1mo -.hemo4gl2 -.hemo3glo -.hemoglo1bi -.hemoglo2bin -.he9m8o9p8h8i8l9i8a. -.hem2oph -.hemoph4il2 -.hemophil1i -.hemophil3i1a -.he9m8o9p8h8i8l9i8a8c. -.he9m8o9p8h8i8l9i8a8c8s. -.hemophilia4c3s2 -.he8m8o9r8h8e9o8l9o8g8y. -.hemo2r -.hemorh4 -.hemorhe3ol -.hemorheol1o1gy -.he9p8a8t9i8c. -.hep5 -.he2pa -.hepat1ic -.he8r9m8a8p8h9r8o9d8i8t8e. -.her3m4 -.her1ma -.her4map -.hermap4hr4 -.hermaphrod2ite -.he8r9m8a8p8h9r8o9d8i8t9i8c. -.hermaphrod2i1ti -.hermaphrod4i2tic -.he9r8o8e8s. -.hero4e -.he8x8a9d8e8c9i9m8a8l. -.hex1a -.hexa2d -.hexade1c2i -.hexade2c3im -.hexadeci1ma -.ho9l8o9n8o9m8y. -.holo2n -.holon3o3my -.ho9m8e8o9m8o8r9p8h8i8c. -.ho2me3 -.homeo1mo -.homeomo2r -.homeomor1p -.homeomorp4h4 -.homeomorph1ic -.ho9m8e8o9m8o8r9p8h8i8s8m. -.homeomorphi2s1m -.ho9m8o9t8h8e8t8i8c. -.ho1mo -.hom4oth3 -.homoth2e -.homo3the4t -.homothet1ic -.ho8r8s8e9r8a8d9i8s8h. -.hor4se -.ho4rs2 -.horser1a -.horsera2d -.horser2adi -.horseradis1 -.horseradis2h -.ho8t9b8e8d. -.ho2t1b -.hot4be2d -.ho8t9b8e8d8s. -.hotbe2d1s2 -.hy9d8r8o9t8h8e8r9m8a8l. -.hy1d -.hy1dr -.hydro4th2e -.hydr4oth -.hydrother3m4 -.hydrother1ma -.hy9p8o9t8h8a8l9a9m8u8s. -.hy3po -.hyp4ot -.hyp4oth -.hypotha3la -.hypothala3m -.hypothala1mu -.hypothalam2us -.id8e8a8l8s. -.ide3a4l -.idea2l1s2 -.id8e8o9g8r8a8p8h8s. -.ideo2g -.ideo1gr -.ideogra4p4h1s2 -.id8i8o9s8y8n9c8r8a8s8y. -.i2di -.i1d3io -.idi4os -.idios4y -.idiosyn1cr -.idiosyncr2as -.idiosyncras4y -.id8i8o9s8y8n9c8r8a9s8i8e8s. -.idiosyncras2ie4 -.id8i8o9s8y8n9c8r8a8t8i8c. -.idiosyn5crat1ic -.id8i8o9s8y8n9c8r8a8t9i9c8a8l9l8y. -.idiosyncrati1ca -.idiosyncratical1l -.idiosyncratical1ly -.ig9n8i8t9e8r. -.2ig -.ig1ni -.ign2it -.ign2ite -.ig9n8i8t9e8r8s. -.ignite4r1s2 -.ig9n8i9t8o8r. -.ign3itor -.igni1to -.ig8n8o8r8e9s8p8a8c8e8s. -.ig1no -.ignore1sp -.ignore2s1pa -.ignorespa4ce -.im9p8e8d9a8n8c8e. -.im2p2ed -.imp2e2d2a -.impeda2n -.im9p8e8d9a8n8c8e8s. -.in9d8u9b8i9t8a9b8l8e. -.4ind -.in1du -.indu1b4i -.indubi2t -.indubi1ta -.indubi2tab -.indubitab2l2 -.in9f8i8n9i8t8e9l8y. -.in3f -.in1fi -.in2fin -.inf2ini -.infin2it -.infin2ite -.infinite1ly -.in9f8i8n9i9t8e8s9i9m8a8l. -.infinit4es -.infinite1si -.infinite2s5im -.infinitesi1ma -.in9f8r8a9s8t8r8u8c9t8u8r8e. -.infr2as -.infras1t4r -.infrastru2c1t -.infrastructu4r -.infrastruc1tu -.infrastruc3ture -.in9f8r8a9s8t8r8u8c9t8u8r8e8s. -.in9s8t8a8l8l9e8r. -.ins2ta2l -.ins1ta -.instal1l -.instal2le -.in9s8t8a8l8l9e8r8s. -.installe4r1s2 -.in9t8e8r9d8i8s9c8i9p8l8i9n8a8r8y. -.in1t -.in5ter3d -.interd2i -.interdis1 -.interd2is1c -.interdis1ci -.interdisc2ip -.interdisci1p2l2 -.interdiscipli4n -.interdiscipl4i1na -.interdisciplin2a2r -.in9t8e8r9g8a9l8a8c9t8i8c. -.interg2 -.inter1ga -.intergala2c1t -.in9u8t8i8l8e. -.in1u -.in4u1t2i -.in9u8t8i8l9i9t8y. -.inutil1i -.inut2il1it -.inutili1ty -.ir9r8e9d8u8c9i8b8l8e. -.ir2r2ed -.irre1du -.irredu2c -.irreduci4b -.irredu1ci -.irreduci1b2l2 -.ir9r8e9d8u8c9i8b8l8y. -.irreducib1ly -.ir9r8e8v9o9c8a9b8l8e. -.irrev2 -.irre5voc -.irrevo1ca -.irrevoca1b2l2 -.is8o8t9r8o8p8y. -.i2so -.isotropy5 -.is8o9t8r8o8p9i8c. -.isotrop3ic -.it8i8n9e8r9a8r8y. -.i1ti -.i2t1in -.it2ine -.itin4er4a2r -.itin1er -.itiner1a -.it8i8n9e8r9a8r9i8e8s. -.itinerar1i -.itinerar2ie4 -.je9r8e9m8i9a8d8s. -.1je -.jerem2i3a -.jeremia2d -.jeremia2d1s2 -.ke8y9n8o8t8e. -.ke8y9n8o8t8e8s. -.keyno4tes -.ke8y9s8t8r8o8k8e. -.keys4 -.keys1t -.keyst4r -.keystr2ok2 -.ke8y9s8t8r8o8k8e8s. -.keystrokes4 -.ki8l8n9i8n8g. -.k1i -.k4i2l1n2 -.kiln1in -.kilnin4g -.la8c9i9e8s8t. -.l4a2ci4 -.la3c2ie4 -.laci1est -.la8m9e8n9t8a9b8l8e. -.la1men -.la3men1t -.lamen2ta4b -.lamen1ta -.lamentab2l2 -.la8n8d9s8c8a8p9e8r. -.3l4and -.la2n -.lan2d1s2 -.landsca4p -.lands1ca -.landsca5per -.la8n8d9s8c8a8p9e8r8s. -.landscape4r1s2 -.la8r9c8e9n8y. -.l2a2r -.lar1c -.lar2ce -.lar1cen4 -.la8r9c8e9n9i8s8t. -.lar4ceni -.le8a8f9h8o8p9p8e8r. -.le2a -.lea2f -.lea4fh -.leafho4p1p -.leafhop2pe -.leafhop3per -.le8a8f9h8o8p9p8e8r8s. -.leafhoppe4r1s2 -.le8t9t8e8r9s8p8a8c9i8n8g. -.le4t3t2 -.lette4r1s2 -.letter1sp -.letter2s1pa -.lettersp4a2ci -.letterspa2c1in -.letterspac1ing -.li8f8e9s8p8a8n. -.life1sp -.life2s1pa -.lifespa4n -.li8f8e9s8p8a8n8s. -.lifespa2n1s2 -.li8f8e9s8t8y8l8e. -.lifes2ty -.lifes2tyl -.li8f8e9s8t8y8l8e8s. -.lifestyles2 -.li8g8h8t9w8e8i8g8h8t. -.3ligh -.lightw4 -.lightwei2 -.l2ightwe2ig2 -.li8m9o8u9s8i8n8e8s. -.li4mo -.li3mo2us -.limou2 -.limou2s1in -.limous2ine -.limousi1nes -.li8n8e9b8a8c8k8e8r. -.1l4ine -.lin2e2b -.lineback1 -.lineback1er -.li8n8e9s8p8a8c8i8n8g. -.li1nes -.li4ne1sp -.line2s1pa -.linesp4a2ci -.linespa2c1in -.linespac1ing -.li9o8n9e8s8s. -.lio2n -.lio1nes -.lion2e2ss -.li8t8h9o9g8r8a8p8h8e8d. -.l2ith -.litho4g -.litho1gr -.lithograph4ed -.li8t8h9o9g8r8a8p8h8s. -.lithogra4p4h1s2 -.lo9b8o8t9o8m8y. -.lobo4to -.loboto3my -.lo9b8o8t9o8m9i8z8e. -.lobotom2iz -.lobotomi2ze -.lo8g8e8s. -.lo1ge -.lo8n8g9e8s8t. -.5long -.lo2n -.lo9q8u8a8c9i8t8y. -.lo1q -.loqu2 -.loquac4 -.loqu4a2ci -.loqua2c1it -.loquaci1ty -.lo8v8e9s8t8r8u8c8k. -.4lov -.lov4e2s -.lov2est4r -.lovestruc5 -.lovestruck1 -.ma8c8r8o9e8c8o9n8o8m8i8c8s. -.macro4e -.macroe1co -.macroeco2n -.macroeco3nomic -.macroeconomi4c3s2 -.ma8l9a9p8r8o8p9i8s8m. -.malapr2 -.malapropi2s1m -.ma8l9a9p8r8o8p9i8s8m8s. -.malaprop4is4m1s2 -.ma8n9s8l8a8u8g8h9t8e8r. -.ma2n1s2 -.man2s1l2 -.manslaugh3 -.ma8n9u9s8c8r8i8p8t. -.man2us -.manusc2 -.manuscri2 -.manuscr2ip -.manuscri2p1t -.ma8r9g8i8n9a8l. -.marg2 -.margi4n -.margi1na -.ma8t8h9e9m8a9t8i9c8i8a8n. -.m4ath3 -.math5em -.math2e -.1mathe1ma -.mathemat1ic -.mathemat2i1ci -.mathemati3c2i1a -.mathematici2a2n -.ma8t8h9e9m8a9t8i9c8i8a8n8s. -.mathematicia2n1s2 -.ma8t8t8e8s. -.mat5te -.ma4t3t2 -.mat4tes -.me8d9i8c9a8i8d. -.2med -.m4edi -.med3i1ca -.medicai2 -.medica2id -.me8d8i9o8c8r8e. -.me1d2io -.mediocre3 -.me8d8i9o8c9r8i9t8i8e8s. -.medi5ocrit -.mediocri2 -.medio5cri1ti -.mediocrit2ie4 -.me8g8a9l8i8t8h. -.me2g -.m4egal -.me1ga -.me3gal1i -.megal1it -.megal2ith -.me8g8a9l8i8t8h8s. -.megali2t4h1s2 -.me8t8a9b8o8l9i8c. -.me4ta -.me2ta4b -.metabol3ic -.metabol2i -.me9t8a8b9o9l8i8s8m. -.metaboli2s1m -.me9t8a8b9o9l8i8s8m8s. -.metabol4is4m1s2 -.me9t8a8b9o9l8i8t8e. -.metabo5l2ite -.metabol1it -.me9t8a8b9o9l8i8t8e8s. -.metabolit4es -.me8t8a9l8a8n9g8u8a8g8e. -.met3a2l -.meta5la -.metala2n -.metal2ang -.metalan1gu -.metalangu4a -.me8t8a9l8a8n9g8u8a8g8e8s. -.me8t8a9p8h8o8r9i8c. -.metapho4r -.me8t8h9a8n8e. -.metha2n4 -.me9t8r8o8p9o9l8i8s. -.m4etr -.metropol2i -.me9t8r8o8p9o9l8i8s8e8s. -.metropol4ise -.metropolis1e4s -.me8t9r8o9p8o8l9i9t8a8n. -.metropol1it -.metropoli3ta2n -.metropoli1ta -.me8t9r8o9p8o8l9i9t8a8n8s. -.metropolita2n1s2 -.mi8c8r8o9e8c8o9n8o8m8i8c8s. -.m4i1cr -.micro4e -.microe1co -.microeco2n -.microeco3nomic -.microeconomi4c3s2 -.mi9c8r8o9f8i8c8h8e. -.micro2fi -.microf4i2ch -.microfiche2 -.mi9c8r8o9f8i8c8h8e8s. -.microfich1es -.mi8c8r8o9o8r8g8a8n9i8s8m. -.microo2 -.microorg2 -.microor1ga -.microorgan5is -.microorga2n -.microorgani2s1m -.mi8c8r8o9o8r8g8a8n9i8s8m8s. -.microorgan4is4m1s2 -.mi8l8l9a8g8e. -.m4il1l -.mi8l9l8i9l8i8t8e8r. -.mill2i -.mil4l4i4l -.millil1i -.mill2il1it -.millil2ite -.mi8m8e8o9g8r8a8p8h8e8d. -.mimeo2g -.mimeo1gr -.mimeograph4ed -.mi8m8e8o9g8r8a8p8h8s. -.mimeogra4p4h1s2 -.mi8m9i8c9r8i8e8s. -.mim1i -.mim4i1cr -.mimicri2 -.mimicr2ie4 -.mi8n9i8s. -.m2ini -.min1is -.mi8n8i9s8y8m9p8o9s8i8u8m. -.minis4y -.minisy4m1p -.minisym1pos -.minisympo5si4u -.mi8n8i9s8y8m9p8o9s8i8a. -.minisympos2i1a -.mi9n8u8t9e8r. -.m4in1u -.mi9n8u8t9e8s8t. -.mi8s9c8h8i8e9v8o8u8s9l8y. -.m2is1c -.mis3ch2 -.misch2ie4 -.mischievou2 -.mischievo2us -.mischievous1l2 -.mischievous1ly -.mi9s8e8r8s. -.m4ise -.mis3er -.mise4r1s2 -.mi9s8o8g9a9m8y. -.mi2so -.miso1ga -.miso2gam -.mo8d9e8l9l8i8n8g. -.mo2d1 -.model1l -.modell2i -.model2lin4 -.mo8l9e9c8u8l8e. -.mole1cu -.mole4cul -.molecul4e -.mo8l9e9c8u8l8e8s. -.molecules2 -.mo8n9a8r8c8h8s. -.mo1n1a -.monar3c -.mon2a2r -.monar2ch -.monarc4h1s2 -.mo8n8e8y9l8e8n9d8e8r. -.moneylen1de -.mo8n8e8y9l8e8n9d8e8r8s. -.moneylende4r5s2 -.mo8n8o9c8h8r8o8m8e. -.mono2ch4 -.monoc4hr4 -.monochro2me -.mo8n8o9e8n9e8r9g8e8t8i8c. -.mo3noe -.monoen1er -.monoenerg2 -.monoener3get -.monoenerget1ic -.mo8n9o8i8d. -.monoi2 -.mono2id -.mo8n8o9p8o8l8e. -.mo4nop -.mo8n8o9p8o8l8e8s. -.monopoles2 -.mo9n8o8p9o8l8y. -.monopo2ly -.mo8n8o9s8p8l8i8n8e. -.monos1p2l2 -.monospli4n -.monosp1l4ine -.mo8n8o9s8p8l8i8n8e8s. -.monospli1nes -.mo8n8o9s8t8r8o8f8i8c. -.monos5t -.monost4r -.monostro2fi -.mo9n8o8t9o9n8i8e8s. -.mono1to -.mo2noto2n -.monoton2ie4 -.mo9n8o8t9o9n8o8u8s. -.mono4tono -.monoto1nou2 -.monotono2us -.mo9r8o8n9i8s8m. -.moro5n4is -.moro2n -.moroni2s1m -.mo8s9q8u8i9t8o. -.mos2 -.mosqu2 -.mosq2ui2 -.mosqui1to -.mo8s9q8u8i9t8o8s. -.mosquitos2 -.mo8s9q8u8i9t8o8e8s. -.mu8d9r8o8o8m. -.mu1dr -.mud1room -.mudroo2 -.mu8d9r8o8o8m8s. -.mudroo4m1s2 -.mu8l9t8i9f8a8c9e8t8e8d. -.5mu4lt -.mul1ti3 -.multif2 -.multi1fa -.multifa4ce -.multifacet4 -.multiface2t1ed -.mu8l9t8i9p8l8i8c9a8b8l8e. -.mult2ip -.multi1p2l2 -.multipli1ca -.multiplica1b2l2 -.mu8l8t8i9u8s8e8r. -.multi4u -.multi2us -.ne8o9f8i8e8l8d8s. -.3neo -.ne5of -.neo2fi -.neof2ie4 -.neofie2ld3 -.neofiel2d1s2 -.ne8o9n8a8z8i. -.neo2n -.neo1n1a -.neona2z1i -.ne8o9n8a8z8i8s. -.neonaz4is -.ne8p8h9e8w8s. -.nephe4 -.ne8p8h9r8i8t8e. -.nep4hr4 -.nephr2ite -.ne8p8h9r8i8t8i8c. -.nephr4i2t3ic -.nephri1ti -.ne8w9e8s8t. -.ne4w -.newest3 -.ne8w8s9l8e8t9t8e8r. -.news4l2 -.news2le -.newsle4t3t2 -.ne8w8s9l8e8t9t8e8r8s. -.newslette4r1s2 -.ni8t8r8o9m8e8t8h9a8n8e. -.n2it -.ni3tr -.nitro2me -.nitro4met -.nitrometha2n4 -.no9n8a8m8e. -.no4n -.no1n1a -.no8n9a8r9i8t8h9m8e8t9i8c. -.nonar3i -.non2a2r -.nonar2ith -.nonarit4h1m -.nonarithmet4 -.nonarithmet1ic -.no8n9e8m8e8r9g8e8n8c8y. -.none1me -.nonemerg2 -.nonemer1gen -.nonemergen1cy -.no8n9e8q8u8i9v8a8r8i9a8n8c8e. -.none2q -.nonequ2 -.noneq2ui2 -.nonequ2iv3 -.nonequi1va -.nonequiv2a2r -.nonequivar1i -.nonequivar3i2a2n -.nonequivar2i3a -.nonequivar4ianc -.no8n8e9t8h8e9l8e8s8s. -.noneth2e -.nonethe1les2 -.nonethe3l2e2ss -.no8n9e8u8c8l8i8d9e8a8n. -.non4eu -.noneu1c4l4 -.noneucl2id -.noneuclidea2n -.no8n9i8s8o9m8o8r9p8h8i8c. -.non5i -.non1is -.noni2so -.noni3som -.noniso1mo -.nonisomo2r -.nonisomor1p -.nonisomorp4h4 -.nonisomorph1ic -.no8n9p8s8e8u8d8o9c8o8m9p8a8c8t. -.non1p4 -.non2p1s2 -.nonp2se -.nonps4eu -.nonpseu1do -.nonpseudo1co -.nonpseudoco4m1p -.nonpseudocom1pa -.nonpseudocompa2c4t -.no8n9s8m8o8o8t8h. -.no2n3s2 -.non2s3m -.nons1mo -.nonsmoo2 -.nonsmo4oth -.no8n9u8n8i9f8o8r8m. -.no3nu4n -.nonu1ni -.nonuni1fo -.nonunifo2r -.nonunifor1m -.no8n9u8n8i9f8o8r8m9l8y. -.nonunifor4m1l -.nonuniform1ly -.no8r9e8p9i9n8e8p8h9r8i8n8e. -.nore5pi2n -.norep2ine -.norepinep4hr4 -.norep2inephr2in4e -.no8t9w8i8t8h9s8t8a8n8d9i8n8g. -.notw4 -.notwi2 -.notw2ith3 -.notwi2t4h1s2 -.notwith5st4and -.notwiths1ta -.notwithsta2n -.notwithstand1in -.nu9c8l8e8o9t8i8d8e. -.nucle3 -.nu1c4l4 -.nucle4ot -.nucleot2id -.nu9c8l8e8o9t8i8d8e8s. -.nucleotide4s2 -.nu8t9c8r8a8c8k9e8r. -.nu4tc -.nutcrack1 -.nutcrack1er -.nu8t9c8r8a8c8k9e8r8s. -.nutcracke4r1s2 -.oe8r9s8t8e8d8s. -.o3er -.oe4r1s2 -.oers4t1ed -.oerste2d1s2 -.of8f9l8i8n8e. -.o4f1f -.off4l2 -.offlin4 -.off1l4ine -.of8f9l8o8a8d. -.offl4oa -.offloa2d3 -.of8f9l8o8a8d8s. -.offloa2d1s2 -.of8f9l8o8a8d8e8d. -.offloa2d1ed -.ol8i9g8o8p9o9l8i8s8t. -.ol2i -.ol2ig -.oli2go -.ol2igopol2i -.ol8i9g8o8p9o9l8i8s8t8s. -.oligopolis4t1s2 -.ol8i9g8o8p9o8l8y. -.oligopo2ly -.ol8i9g8o8p9o8l9i8e8s. -.oligopol2ie4 -.op9e8r9a8n8d. -.op1er -.3oper1a -.op4er4and -.opera2n -.op9e8r9a8n8d8s. -.operan2d1s2 -.or8a8n8g9u8t8a8n. -.ora2n -.or2ang -.oran1gu -.oran4gu4t -.orangu1ta -.ora2nguta2n -.or8a8n8g9u8t8a8n8s. -.oranguta2n1s2 -.or9t8h8o9d8o8n9t8i8s8t. -.ortho2do4 -.orthodo2n -.orthodon3t4i -.orthodon1t -.or9t8h8o9d8o8n9t8i8s8t8s. -.orthodontis4t1s2 -.or9t8h8o9k8e8r9a9t8o8l9o8g8y. -.orth2ok -.orthok1er -.orthoker1a -.orthokera1to -.orthokeratol1o1gy -.or8t8h8o9n8i8t8r8o9t8o8l8u8e8n8e. -.ortho2n -.orthon2it -.orthoni3tr -.orthonitro1to -.orthonitrotolu3en -.orthonitrotolu4ene -.ov8e8r9v8i8e8w. -.overv2ie4 -.ov8e8r9v8i8e8w8s. -.ox9i8d9i8c. -.ox3i -.oxi5di -.ox2id -.pa8d9d8i8n8g. -.1pa -.p4a2d -.pad4d1in -.pad1d4 -.pa8i8n9l8e8s8s9l8y. -.p4ai2 -.pa4i4n4 -.pa4i4n1l -.painles2 -.pain3l2e2ss -.painles4s1l2 -.painless1ly -.pa8l9e8t8t8e. -.p4al -.p2ale -.pale4t3t2 -.pa8l9e8t8t8e8s. -.palet4tes -.pa8r9a9b8o8l8a. -.p2a2r -.pa2rab -.parabo1la -.pa8r9a9b8o8l9i8c. -.parabol3ic -.parabol2i -.pa9r8a8b9o9l8o8i8d. -.paraboloi2 -.parabolo2id -.pa8r9a9d8i8g8m. -.para2d -.par2adi -.parad2ig -.paradig1m -.pa8r9a9d8i8g8m8s. -.paradig4m1s2 -.pa8r8a9c8h8u8t8e. -.para2ch -.parachu4t -.pa8r8a9c8h8u8t8e8s. -.pa8r8a9d8i9m8e8t8h8y8l9b8e8n8z8e8n8e. -.parad4imet -.paradimethy2l1b -.paradimethylb4e4n3z -.paradimethylben2ze -.paradimethylbenze4n -.pa8r8a9f8l8u8o8r8o9t8o8l8u8e8n8e. -.para2f -.paraf4l2 -.paraflu3o -.parafluo3r -.parafluoro1to -.parafluorotolu3en -.parafluorotolu4ene -.pa8r8a9g8r8a8p8h9e8r. -.para1gr -.parag5ra3ph4er -.pa8r8a9l8e9g8a8l. -.par3al -.par2ale -.paral4egal -.parale1ga -.pa8r9a8l9l8e8l9i8s8m. -.paral1l -.paral2le -.paral3lel -.parallel2i -.paralle2lis -.paralleli2s1m -.pa8r8a9m8a8g9n8e8t9i8s8m. -.par4a1ma -.param3ag -.para5mag1n -.paramagneti2s4m -.pa8r8a9m8e8d8i8c. -.para2med -.param4edi -.pa8r8a9m8e8t8h8y8l9a8n8i8s8o8l8e. -.param3et -.paramethy3la -.paramethyla2n -.paramethylani2so -.pa9r8a8m9e9t8r8i8z8e. -.param4etr -.parametri2ze -.pa8r8a9m8i8l9i9t8a8r8y. -.par2ami -.paramil1i -.param2il1it -.paramili1ta -.paramilit2a2r -.pa8r8a9m8o8u8n8t. -.para2mo -.paramou2 -.paramoun1t -.pa8t8h9o9g8e8n9i8c. -.p4ath -.pat4ho -.patho4g -.patho1ge4 -.patho1gen -.pe8e8v9i8s8h. -.p4ee -.pee1vi -.peevis2h -.pe8e8v9i8s8h9n8e8s8s. -.peevis2h1n -.peevish1nes -.peevishn2e2ss -.pe8n9t8a9g8o8n. -.pen1t -.pen1ta -.penta2go -.pentago2n2 -.pe8n9t8a9g8o8n8s. -.pentago2n3s2 -.pe9t8r8o9l8e9u8m. -.petrol4eu -.ph8e9n8o8m9e9n8o8n. -.ph4e3no -.phe2n -.pheno2me -.pheno1men -.phenom4eno -.phenomeno4n -.ph8e8n8y8l9a8l8a9n8i8n8e. -.pheny3la -.phenylala2n -.phenylala5n2ine -.phenylalan1in -.ph8i9l8a8t9e9l8i8s8t. -.phi4latel2i4 -.philate2lis -.ph8i9l8a8t9e9l8i8s8t8s. -.philatelis4t1s2 -.ph8o9n8e8m8e. -.3phone -.pho2n -.phone1me -.ph8o9n8e8m8e8s. -.phone2mes -.ph8o9n8e9m8i8c. -.phone5mi -.ph8o8s9p8h8o8r9i8c. -.phos1p -.phospho5 -.phospho4r -.ph8o9t8o9g8r8a8p8h8s. -.pho1to -.photo2gr -.photogra4p4h1s2 -.ph8o9t8o9o8f8f9s8e8t. -.photoo2 -.photoo4f1f -.photoof2f3s -.pi8c9a9d8o8r. -.pi1ca -.pica2d -.pica1do -.picad4or -.pi8c9a9d8o8r8s. -.picado4rs2 -.pi8p8e9l8i8n8e. -.p2ip -.pipe4 -.pipel2i -.pipe1l4ine -.pi8p8e9l8i8n8e8s. -.pipeli1nes -.pi8p8e9l8i8n9i8n8g. -.pipel2in3i -.pipelin1in -.pipelinin4g -.pi9r8a9n8h8a8s. -.p4ir -.pi1ra -.pira2n -.pira4n1h4 -.piranha4 -.pl8a8c8a9b8l8e. -.1p2l2 -.pla1ca -.placa1b2l2 -.pl8a8n8t9h8o8p9p8e8r. -.3pla2n -.plan1t -.plantho4p1p -.planthop2pe -.planthop3per -.pl8a8n8t9h8o8p9p8e8r8s. -.planthoppe4r1s2 -.pl8e8a8s9a8n8c8e. -.ple2a -.pleasa2 -.plea3sanc -.pleasa2n -.pl8u8g9i8n. -.plug5in -.pl8u8g9i8n8s. -.plu5g4i2n1s2 -.po8l9t8e8r9g8e8i8s8t. -.po4l2t -.pol1te -.polterg2 -.poltergei2 -.po8l8y9e8n8e. -.po2ly -.po8l8y9e8t8h9y8l9e8n8e. -.polye4t -.po9l8y8g9a9m8i8s8t. -.poly1ga -.poly2gam -.polygam2is -.po9l8y8g9a9m8i8s8t8s. -.polygamis4t1s2 -.po8l8y8g9o8n9i9z8a9t8i8o8n. -.poly1go -.polygo2n2 -.polygo3ni -.polygoniza1 -.polygoniza1t2io -.polygonizatio2n -.po9l8y8p8h9o9n8o8u8s. -.polypho2n -.polypho1nou2 -.polyphono2us -.po8l8y9s8t8y8r8e8n8e. -.po2lys4 -.polys1t -.polys2ty -.po8m8e9g8r8a8n9a8t8e. -.po2me -.pome2g -.pome1gr -.pomegra2n2 -.pomegra1na -.pomegran2at -.po8r8o9e8l8a8s9t8i8c. -.1p4or -.poro4e -.poro4el -.poroe1la -.poroelast2i -.poroelas1tic -.po8r9o8u8s. -.porou2 -.poro2us -.po8r9t8a9b8l8e. -.por1ta -.por2tab -.portab2l2 -.po8s8t9a8m9b8l8e. -.1pos -.pos2ta -.posta4m1b -.postamb2l2 -.po8s8t9a8m9b8l8e8s. -.postambles2 -.po8s8t9h8u9m8o8u8s. -.posthu1mo -.posthu3mo2us -.posthumou2 -.po8s8t9s8c8r8i8p8t. -.pos4t1s2 -.post4sc -.postscri2 -.postscr2ip -.postscri2p1t -.po8s8t9s8c8r8i8p8t8s. -.postscrip4t1s2 -.po8s9t8u8r9a8l. -.pos1tu -.postu1ra -.pr8e9a8m9b8l8e. -.prea4m1b -.preamb2l2 -.pr8e9a8m9b8l8e8s. -.preambles2 -.pr8e9l8o8a8d8e8d. -.prel4oa -.preloa2d3 -.preloa2d1ed -.pr8e9p8a8r9i8n8g. -.pre2pa -.prep4a4r1i -.prep2a2r -.preparin4g -.pr8e9p8r8i8n8t. -.pr2epr2 -.preprin4t3 -.pr8e9p8r8i8n8t8s. -.preprin4t4s2 -.pr8e9p8r8o8c8e8s9s8o8r. -.pre3pro -.prepr2oc -.prepro1ce -.preproc2e2ss -.preproces1so -.pr8e9p8r8o8c8e8s9s8o8r8s. -.preprocesso4rs2 -.pr8e9s8p8l8i8t9t8i8n8g. -.pre1sp -.pres1p2l2 -.prespl1it -.prespl4i4t3t2 -.presplit2t1in -.pr8e9w8r8a8p. -.prewra4 -.pr8e9w8r8a8p8p8e8d. -.prewra4p1p -.prewrap2pe -.prewrap4p2ed -.pr8i8e8s8t9e8s8s8e8s. -.5pr2i4e4 -.pri1est -.pries4t2e2ss -.priestess1e4s -.pr8e8t9t8y9p8r8i8n9t8e8r. -.pre4t3t2 -.pret1ty -.pr2ettypr2 -.prettyprin4t3 -.pr8e8t9t8y9p8r8i8n9t8i8n8g. -.prettyprint2i -.prettyprin4t3ing -.prettyprin2t1in -.pr8o9c8e9d8u8r9a8l. -.pr2oc -.pro1ce -.proce1du -.procedu1ra -.pr8o8c8e8s8s. -.proc2e2ss -.pr8o9c8u8r9a8n8c8e. -.procu1ra -.procura2n -.pr8o8g9e9n8i8e8s. -.pro1ge -.pro1gen -.proge5n2ie4 -.pr8o8g9e9n8y. -.pro4geny -.pr8o9g8r8a8m9m8a8b8l8e. -.pro1gr -.program1m -.program1ma -.program2mab -.programmab2l2 -.pr8o8m9i9n8e8n8t. -.prom4i -.prom1in -.prom2ine -.promi1nen -.prominen1t -.pr8o9m8i8s9c8u9o8u8s. -.prom2is -.prom2is1c -.promis1cu -.promiscu1ou2 -.promiscuo2us -.pr8o8m9i8s9s8o8r8y. -.prom4i2s1s -.promis1so -.promisso1ry -.pr8o8m9i8s8e. -.prom4ise -.pr8o8m9i8s8e8s. -.promis1e4s -.pr8o9p8e8l9l8e8r. -.pro3pel -.propel1l -.propel2le -.pr8o9p8e8l9l8e8r8s. -.propelle4r1s2 -.pr8o9p8e8l9l8i8n8g. -.propell2i -.propel2lin4 -.pr8o9h8i8b9i9t8i8v8e. -.pro1h2 -.prohibi2t -.prohibi1ti -.prohibi1t2iv -.pr8o9h8i8b9i9t8i8v8e9l8y. -.prohibitiv4e1ly -.pr8o9s8c8i8u8t9t8o. -.pros2c -.pros1ci -.prosci1u -.prosciu4t3t2 -.prosciut5to -.pr8o9t8e8s8t9e8r. -.pro1t -.pro4tes -.pr8o9t8e8s8t9e8r8s. -.proteste4r1s2 -.pr8o9t8e8s9t8o8r. -.prot4es2to -.pr8o9t8e8s9t8o8r8s. -.protesto4rs2 -.pr8o9t8o9l8a8n9g8u8a8g8e. -.pro1to -.proto1la -.proto4la2n -.protol2ang -.protolan1gu -.protolangu4a -.pr8o9t8o9t8y8p9a8l. -.proto1ty -.prototy1pa -.prototyp4al -.pr8o8v9i8n8c8e. -.prov1in -.prov2inc -.pr8o8v9i8n8c8e8s. -.pr8o9v8i8n9c8i8a8l. -.provin1ci -.provin3c2i1a -.provinci2al -.pr8o8w9e8s8s. -.prow2e2ss -.ps8e8u9d8o9d8i8f9f8e8r9e8n9t8i8a8l. -.2p1s2 -.p2se -.ps4eu -.pseu1do -.pseudod1if -.pseudodi4f1f -.pseudodiffer1 -.pseudodiffer3en1t -.pseudodifferent2i -.pseudodifferen1t2i1a -.pseudodifferenti2al -.ps8e8u9d8o9f8i9n8i8t8e. -.pseu2d5of -.pseudo2fi -.pseudo2fin -.pseudof2ini -.pseudofin2it -.pseudofin2ite -.ps8e8u9d8o9f8i9n8i8t8e9l8y. -.pseudofinite1ly -.ps8e8u9d8o9f8o8r8c8e8s. -.pseudo1fo -.pseudofo2r -.pseudofor1c -.pseudofor2ce -.ps8e8u9d8o8g9r8a9p8h8e8r. -.pseud4og -.pseudo1gr -.pseudog5ra3ph4er -.ps8e8u9d8o9g8r8o8u8p. -.pseudo4g4ro -.pseudogrou2 -.ps8e8u9d8o9g8r8o8u8p8s. -.pseudogrou2p1s2 -.ps8e8u9d8o9n8y8m. -.pseu4do2n -.pseudonym4 -.ps8e8u9d8o9n8y8m8s. -.pseudony4m1s2 -.ps8e8u9d8o9w8o8r8d. -.pseudo4wo2 -.ps8e8u9d8o9w8o8r8d8s. -.pseudowor2d1s2 -.ps8y9c8h8e9d8e8l9i8c. -.ps4y -.p4sy1c -.psy3ch -.psych4e2 -.psy4ch4ed -.psychedel2i -.ps8y8c8h8s. -.psyc4h1s2 -.pu9b8e8s9c8e8n8c8e. -.pub3 -.pub4e -.pu4bes4 -.pubes2c -.pubes1cen -.pubes3cenc -.qu8a8d9d8i8n8g. -.qu2 -.qua2d -.quad4d1in -.quad1d4 -.qu8a9d8r8a8t9i8c. -.qua1dr -.quadrat1ic -.qu8a9d8r8a8t9i8c8s. -.quadrati4c3s2 -.qu8a8d9r8a9t8u8r8e. -.quadra2tu -.quadra3ture -.qu8a8d9r8i9p8l8e8g9i8c. -.quadri2p2l2 -.quadr2ip -.quadripleg4ic -.qu8a8i8n8t9e8r. -.quai2 -.qua4i4n -.quain1t -.qu8a8i8n8t9e8s8t. -.qu8a9s8i9e8q8u8i8v9a9l8e8n8c8e. -.quas2ie4 -.quasie1q -.qu2asiequ2 -.quasieq2ui2 -.quasiequ2iv3 -.quasiequi1va -.quasiequiv2ale -.quasiequiva3lenc -.qu8a9s8i9e8q8u8i8v9a9l8e8n8c8e8s. -.qu8a9s8i9e8q8u8i8v9a9l8e8n8t. -.quasiequiva1len1t -.qu8a9s8i9h8y9p8o9n8o8r9m8a8l. -.quasi3h -.quasihy3po -.quasihypo2n -.quasihyponor1m -.quasihyponor1ma -.qu8a9s8i9r8a8d9i9c8a8l. -.quas4i2r -.quasi1r5a -.quasira2d -.quasir2adi -.quasirad3i1ca -.qu8a9s8i9r8e8s8i8d9u8a8l. -.quasi4res -.quasire1si -.quasire2s2id -.quasiresi2du -.quasiresid1u1a -.qu8a9s8i9s8m8o8o8t8h. -.qua1sis -.quasi2s1m -.quasis1mo -.quasismoo2 -.quasismo4oth -.qu8a9s8i9s8t8a9t8i8o8n9a8r8y. -.quasis1ta -.quasistation5a2r -.quasista1t2io -.quasistatio2n -.quasistatio1n1a -.qu8a9s8i9t8o8p8o8s. -.qu5a5si4t -.quasi1to -.quasito1pos -.qu8a9s8i9t8r8i9a8n9g8u9l8a8r. -.quasi5tr2i3a -.quasitri2a2n -.quasitri2ang -.quasitrian1gu -.quasitriangu1la -.quasitriangul2a2r -.qu8a9s8i9t8r8i8v9i8a8l. -.quasitr2i4v -.quasitriv3i -.quasitriv2i1a -.quasitrivi2al -.qu8i8n9t8e8s9s8e8n8c8e. -.q2ui2 -.qui4n -.quin1t -.quin4t2e2ss -.quintes4senc -.qu8i8n9t8e8s9s8e8n8c8e8s. -.qu8i8n9t8e8s9s8e8n9t8i8a8l. -.quintessen1t -.quintessent2i -.quintessen1t2i1a -.quintessenti2al -.ra8b9b8i8t9r8y. -.2rab -.ra2b1b -.rabbi2t -.rabbi3tr -.rabbit5ry -.ra9d8i9o8g9r8a9p8h8y. -.ra2d -.r2adi -.ra3d2io -.radio5g -.radio2gr -.radio4g3ra1phy -.ra8f8f9i8s8h. -.raf5fi -.ra2f -.ra4f1f4 -.raf2f5is -.raffis2h -.ra8f8f9i8s8h9l8y. -.raffis4h1l4 -.raffish1ly -.ra8m9s8h8a8c8k8l8e. -.ra4m1s2 -.ram4s2h -.ramshack1 -.ramshack1l -.ra8v9e8n9o8u8s. -.rav4e4no -.rave1nou2 -.raveno2us -.re9a8r8r8a8n8g8e9m8e8n8t. -.re5ar1r4 -.re2a2r -.rearran4ge -.rearra2n -.rearr2ang -.rearrange1me -.rearrange1men -.rearrange3men1t -.re9a8r8r8a8n8g8e9m8e8n8t8s. -.rearrangemen4t4s2 -.re8c9i9p8r8o8c9i9t8i8e8s. -.reciproci1ti -.reciprocit2ie4 -.re8c9t8a8n9g8l8e. -.rec4ta2n -.re2c1t -.rect5ang -.rec1ta -.rectan1gl2 -.rectan1gle -.re8c9t8a8n9g8l8e8s. -.rectangles2 -.re8c9t8a8n9g8u9l8a8r. -.rectan1gu -.rectangu1la -.rectangul2a2r -.re9d8i9r8e8c8t. -.2r2ed -.r4edi -.red4ir2 -.redi1re -.redire2c1t -.re9d8i9r8e8c8t9i8o8n. -.redirec1t2io -.redirectio2n -.re9d8u8c9i8b8l8e. -.re1du -.redu2c -.reduci4b -.redu1ci -.reduci1b2l2 -.re9e8c8h8o. -.ree2c -.ree2ch -.ree3cho2 -.re9p8h8r8a8s8e. -.rep4hr4 -.rephr2as -.re9p8h8r8a8s8e8s. -.rephras1e4s -.re9p8h8r8a8s8e8d. -.rephra4s4ed -.re9p8o9s8i9t8i8o8n. -.re4posi -.re1po -.re1pos -.repo3s2i1t2io -.reposi1ti -.repositio2n -.re9p8o9s8i9t8i8o8n8s. -.repositio2n3s2 -.re9p8r8i8n8t. -.repr2 -.reprin4t3 -.re9p8r8i8n8t8s. -.reprin4t4s2 -.re9s8t8o8r9a8b8l8e. -.r4es2to -.resto2ra -.resto2rab -.restorab2l2 -.re8t8r8o9f8i8t. -.retro2fi -.re8t8r8o9f8i8t9t8e8d. -.retrof4i4t4t2 -.retrofit2t1ed -.re9u8s9a8b8l8e. -.r4eu2 -.re2us4 -.reusa2 -.reu2s1ab -.reusab2l2 -.re9u8s8e. -.re9w8i8r8e. -.rewi2 -.rew4ir4 -.re9w8r8a8p. -.rewra4 -.re9w8r8a8p8p8e8d. -.rewra4p1p -.rewrap2pe -.rewrap4p2ed -.re9w8r8i8t8e. -.rewri4 -.rewr2ite -.rh8i9n8o8c9e8r9o8s. -.rh4 -.rh2i1no -.rhi4no4c -.rhino1ce -.rhinoc2ero -.ri8g8h8t9e8o8u8s. -.righ1teo -.righteou2 -.righteo2us -.ri8g8h8t9e8o8u8s9n8e8s8s. -.righteous1n4 -.righteous1nes -.righteousn2e2ss -.ri8n8g9l8e8a8d8e8r. -.rin4g -.ringl2 -.rin1gle -.ringle2a -.ringlea2d1 -.ri8n8g9l8e8a8d8e8r8s. -.ringleade4r5s2 -.ro9b8o8t. -.ro9b8o8t8s. -.robo4t1s2 -.ro9b8o8t8i8c. -.ro9b8o8t9i8c8s. -.roboti4c3s2 -.ro8u8n8d9t8a8b8l8e. -.rou2 -.roun2d -.round1ta -.round2tab -.roundtab2l2 -.ro8u8n8d9t8a8b8l8e8s. -.roundta5bles2 -.sa8l8e8s9c8l8e8r8k. -.sa2 -.s2ale -.sales2 -.sales2c -.salescle5 -.sales1c4l4 -.sa8l8e8s9c8l8e8r8k8s. -.salescler4k1s2 -.sa8l8e8s9w8o8m8a8n. -.sales4w2 -.sale4s1wo2 -.saleswom1 -.saleswo1ma -.saleswoma2n -.sa8l8e8s9w8o8m8e8n. -.saleswo2me -.saleswo1men -.sa8l9m8o9n8e8l9l8a. -.s4a2l4m -.salmo2n4 -.sal1mo -.salmon4ella -.salmonel1l -.sa8l9t8a9t8i8o8n. -.sa4l4t -.sal1ta -.salta1t2io -.saltatio2n -.sa8r9s8a9p8a8r9i8l9l8a. -.s2a2r -.sa2r4sa2 -.sa4rs2 -.sars1ap -.s2a2rsap2a2r4 -.sarsa1pa -.sarsap4a4r1i -.sarsaparil1l -.sa8u8e8r9k8r8a8u8t. -.sau4 -.sauerkrau4t -.sc8a8t9o9l8o8g9i9c8a8l. -.s1ca -.sca1to -.scato3log1ic -.scatologi1ca -.sc8h8e8d9u8l9i8n8g. -.s2ch2 -.sche2 -.s4ch4ed -.sche4dul -.sche1du -.schedul2i -.schedul3ing -.sc8h8i8z9o9p8h8r8e8n8i8c. -.schi2z -.schi1zo -.schiz2oph -.schizop4hr4 -.sc8h8n8a8u9z8e8r. -.sc2h1n -.sch1na -.schn2au -.schnau2z4e -.schnauz1er -.sc8h8o8o8l9c8h8i8l8d. -.s4cho2 -.schoo2 -.schoo4l1c2 -.s2chool2ch -.schoolch4il2 -.schoolchi2ld -.sc8h8o8o8l9c8h8i8l8d9r8e8n. -.schoolchil3dr -.schoolchildre4 -.schoolchil5dren -.sc8h8o8o8l9t8e8a8c8h8e8r. -.schoo4l2t -.school1te -.s2chooltea2ch -.schoolteache2 -.sc8h8o8o8l9t8e8a8c8h9e8r8s. -.schoolteach3e4r1s2 -.sc8r8u9t8i9n8y. -.scru2t1i5n -.scr4u1t2i -.scrut4iny -.sc8y8t8h9i8n8g. -.s1cy -.scy3thin -.se8l8l9e8r. -.sel2le -.se8l8l9e8r8s. -.selle4r1s2 -.se8c9r8e9t8a8r9i8a8t. -.se1cr -.se4c3re1ta -.secret2a2r -.secretar1i -.secretar2i3a -.se8c9r8e9t8a8r9i8a8t8s. -.secretaria4t1s2 -.se8m9a9p8h8o8r8e. -.se1ma -.se4map -.semapho4r -.se8m9a9p8h8o8r8e8s. -.se9m8e8s9t8e8r. -.4se1me -.se2mes -.se8m8i9d8e8f9i9n8i8t8e. -.sem2id -.semide1f -.semidef5i5n2ite -.semide1fi -.semide2fin -.semidef2ini -.semidefin2it -.se8m8i9d8i9r8e8c8t. -.semi2di -.semid4ir2 -.semidi1re -.semidire2c1t -.se8m8i9h8o9m8o9t8h8e8t9i8c. -.semi3h -.semiho1mo -.semihom4oth3 -.semihomoth2e -.semihomo3the4t -.semihomothet1ic -.se8m8i9r8i8n8g. -.sem4ir -.semir1i -.semirin4g -.se8m8i9r8i8n8g8s. -.semirings2 -.se8m8i9s8i8m9p8l8e. -.se4m2is -.semisi4m1p -.semisim1p2l2 -.se8m8i9s8k8i8l8l8e8d. -.sem4is4k2 -.semisk1i -.semisk4il1l -.semiskil2le -.se8r8o9e8p8i9d8e9m8i9o9l8o8g9i9c8a8l. -.s2er4o -.sero4e -.seroep4id -.seroepi3de -.seroepid4em -.seroepidem2io -.seroepidemi1ol -.seroepidemio3log1ic -.seroepidemiologi1ca -.se8r9v8o9m8e8c8h9a8n8i8s8m. -.4ser3vo -.servo2me -.servome2ch -.servomech5a5nis -.servomecha2n -.servomechani2s1m -.se8r9v8o9m8e8c8h9a8n8i8s8m8s. -.servomechan4is4m1s2 -.se8s9q8u8i9p8e9d8a9l8i8a8n. -.s1e4s -.sesqu2 -.sesq2ui2 -.sesqu2ip -.sesquipe4 -.sesqui2p2ed -.sesquip2e2d2a -.sesquipedal1i -.sesquipedal2i1a -.sesquipedali2a2n -.se8t9u8p. -.se1tu -.se8t9u8p8s. -.setu2p1s2 -.se9v8e8r8e9l8y. -.5sev -.sev1er -.sev4erel -.severe1ly -.sh8a8p8e9a8b8l8e. -.sha3pe4a -.shape1a4b -.shapeab2l2 -.sh8o8e9s8t8r8i8n8g. -.sho4 -.sho2est4r -.shoestrin4g -.sh8o8e9s8t8r8i8n8g8s. -.shoestrings2 -.si8d8e9s8t8e8p. -.5side4s2 -.s2id -.sideste4p -.si8d8e9s8t8e8p8s. -.sideste2p1s2 -.si8d8e9s8w8i8p8e. -.sides4w2 -.sideswi2 -.sidesw2ip -.sideswipe4 -.sk8y9s8c8r8a8p8e8r. -.sk2 -.skys4c -.skyscrap3er -.sk8y9s8c8r8a8p8e8r8s. -.skyscrape4r1s2 -.sm8o8k8e9s8t8a8c8k. -.2s1m -.s1mo -.s4m2ok -.smokes4 -.smokes1ta -.smokestack1 -.sm8o8k8e9s8t8a8c8k8s. -.smokestac4k1s2 -.sn8o8r9k8e8l9i8n8g. -.s1n4 -.snorke5l2i -.snorke4l3ing -.so9l8e9n8o8i8d. -.1so -.sol4eno -.solenoi2 -.soleno2id -.so9l8e9n8o8i8d8s. -.solenoi2d1s2 -.so8l8u8t8e. -.so1lut -.so8l8u8t8e8s. -.so8v9e8r9e8i8g8n. -.4sov -.soverei2 -.sovere2ig2 -.so8v9e8r9e8i8g8n8s. -.sovereig2n1s2 -.sp8a9c8e8s. -.2s1pa -.spa4ce -.sp8e9c8i8o8u8s. -.spe2c -.spe1c2i -.spec2io -.speciou2 -.specio2us -.sp8e8l8l9e8r. -.spel1l -.spel2le -.sp8e8l8l9e8r8s. -.spelle4r1s2 -.sp8e8l8l9i8n8g. -.spell2i -.spel2lin4 -.sp8e9l8u8n8k9e8r. -.spelu4nk2 -.spelunk1er -.sp8e8n8d9t8h8r8i8f8t. -.spen4d -.spend2th -.spendt4hr4 -.spendthr4i2ft -.sp8h8e8r9o8i8d. -.s2phe -.3sph4er -.sph2ero -.spheroi2 -.sphero2id -.sp8h8e8r9o8i8d9a8l. -.spheroi1d2a -.sp8h8i8n9g8e8s. -.sph5ing -.sph4inge -.sp8i8c9i9l8y. -.sp2i1ci -.spici1ly -.sp8i8n9o8r8s. -.spi2n -.sp4i1no -.spino4rs2 -.sp8o8k8e8s9w8o8m8a8n. -.sp2ok -.spokes4 -.spokes4w2 -.spoke4s1wo2 -.spokeswom1 -.spokeswo1ma -.spokeswoma2n -.sp8o8k8e8s9w8o8m8e8n. -.spokeswo2me -.spokeswo1men -.sp8o8r8t8s9c8a8s8t. -.s1p4or4 -.spor4t1s2 -.sport4sc -.sports1ca -.sp8o8r8t8s9c8a8s8t9e8r. -.sportscast5er -.sp8o8r9t8i8v8e9l8y. -.spor1ti -.spor4t2iv -.sportiv4e1ly -.sp8o8r8t8s9w8e8a8r. -.sport4sw2 -.sportswe2a2r -.sp8o8r8t8s9w8r8i8t8e8r. -.sportswri4 -.sportswr2ite -.sp8o8r8t8s9w8r8i8t8e8r8s. -.sportswrit5e4r1s2 -.sp8r8i8g8h8t9l8i8e8r. -.spr2 -.spr2ig -.sprigh2tl -.sprightl2ie4 -.sq8u8e8a9m8i8s8h. -.squ2 -.squeam2is -.squeamis2h -.st8a8n8d9a8l8o8n8e. -.5st4and -.sta2n -.stan1d2a -.standalo2n -.st8a8r9t8l8i8n8g. -.st2a2r -.star2tl -.st8a8r9t8l8i8n8g9l8y. -.startlingl2 -.startling1ly -.st8a9t8i8s9t8i8c8s. -.statis1t2i -.statis1tic -.statisti4c3s2 -.st8e8a8l8t8h9i8l8y. -.stea4l -.stea4lt -.stealth3i -.steal4th4il2 -.stealthi1ly -.st8e8e8p8l8e9c8h8a8s8e. -.s1tee -.stee4p1 -.stee1p2l2 -.steeple2ch -.st8e8r8e8o9g8r8a8p8h9i8c. -.stere1o -.stereo2g -.stereo1gr -.stereo5graph1ic -.stereogr4aphi -.st8o9c8h8a8s9t8i8c. -.s1to -.sto2ch4 -.stochast2i -.stochas1tic -.st8r8a8n8g8e9n8e8s8s. -.st4r -.s1tra -.stran4ge -.stra2n -.str2ang -.strange4n4e -.stran1gen -.strange1nes -.strangen2e2ss -.st8r8a8p9h8a8n8g8e8r. -.straph2an4g -.straphang5er -.strapha2n -.st8r8a8t9a9g8e8m. -.stra2ta -.st8r8a8t9a9g8e8m8s. -.stratage4m1s2 -.st8r8e8t8c8h9i9e8r. -.stre4tc -.stret4ch -.stretch2ie4 -.st8r8i8p9t8e8a8s8e. -.str2ip -.stri2p1t -.strip2te -.st8r8o8n8g9h8o8l8d. -.stro2n -.strongho2l2d -.st8r8o8n8g9e8s8t. -.st8u9p8i8d9e8r. -.s1tu -.stup4id -.stupi3de -.st8u9p8i8d9e8s8t. -.stupide4s2 -.su8b9d8i8f9f8e8r9e8n9t8i8a8l. -.1su -.su4b3 -.su4b1d -.subd1if -.subdi4f1f -.subdiffer1 -.subdiffer3en1t -.subdifferent2i -.subdifferen1t2i1a -.subdifferenti2al -.su8b9e8x9p8r8e8s9s8i8o8n. -.sub4e -.sub1ex3p -.subexpr2 -.subex3pr2e2ss -.subexpres1si -.subexpres1s2io -.subexpres5sio2n -.su8b9e8x9p8r8e8s9s8i8o8n8s. -.subexpressio2n3s2 -.su8m9m8a9b8l8e. -.su2m -.sum1m -.sum1ma -.sum2mab -.summab2l2 -.su8p8e8r9e8g8o. -.su1pe -.supere1go -.su8p8e8r9e8g8o8s. -.supere4gos -.su9p8r8e8m9a9c8i8s8t. -.supr2 -.supre4mac -.supre1ma -.suprem4a2ci -.su9p8r8e8m9a9c8i8s8t8s. -.supremacis4t1s2 -.su8r9v8e8i8l9l8a8n8c8e. -.su2r -.surv4e -.survei2 -.surveil1l -.surveilla2n -.sw8i8m9m8i8n8g9l8y. -.sw2 -.swi2 -.swim1m -.swimm4ingl2 -.swimm5ing1ly -.sy8m8p9t8o9m8a8t8i8c. -.sy4m1p -.sym2p1t -.symp1to -.sympto2ma -.symptomat1ic -.sy8n9c8h8r8o9m8e8s8h. -.syn3c4hr4 -.syn2ch -.synchro2me -.synchro2mes -.synchrom4es2h -.sy8n9c8h8r8o9n8o8u8s. -.synchro2n -.synchro1nou2 -.synchrono2us -.sy8n9c8h8r8o9t8r8o8n. -.synchrotro2n -.ta8f8f9r8a8i8l. -.4ta2f4 -.ta4f1f4 -.taffr2ai2 -.ta8l8k9a9t8i8v8e. -.ta2l -.4talk -.talka3 -.talka4t -.talka1t2iv -.ta9p8e8s9t8r8y. -.tap2est4r -.tape4stry -.ta9p8e8s9t8r8i8e8s. -.tapestr2ie4 -.ta8r9p8a8u9l8i8n. -.t2a2r -.tar2p -.tar1pa -.tarpau4l2 -.tarpaul2i -.ta8r9p8a8u9l8i8n8s. -.tarpaul2i2n1s2 -.te9l8e8g9r8a9p8h8e8r. -.tele1gr -.teleg5ra3ph4er -.te9l8e8g9r8a9p8h8e8r8s. -.telegraphe4r1s2 -.te8l8e9k8i9n8e8t9i8c. -.teleki4n -.telek1i -.telek2ine -.teleki3net1ic -.te8l8e9k8i9n8e8t9i8c8s. -.telekineti4c3s2 -.te8l8e9r8o9b8o8t9i8c8s. -.te4l1er -.tel4ero -.teler5ob -.teleroboti4c3s2 -.te8l8l9e8r. -.tel1l -.tel2le -.te8l8l9e8r8s. -.telle4r1s2 -.te8m9p8o9r8a8r9i8l8y. -.te4m1p -.tem1p4or -.tempo1ra -.tempo4raril -.tempor2a2r -.temporar1i -.temporari1ly -.te8n9u8r8e. -.te8s8t9b8e8d. -.tes2t1b -.test4be2d -.te8x8t9w8i8d8t8h. -.3tex -.tex1t2 -.textw4 -.textwi2 -.textw2id -.textwid2th -.th8a8l9a9m8u8s. -.tha3la -.thala3m -.thala1mu -.thalam2us -.th8e8r9m8o9e8l8a8s9t8i8c. -.th2e -.ther3m4 -.ther1mo -.thermo4el -.thermoe1la -.thermoelast2i -.thermoelas1tic -.ti8m8e9s8t8a8m8p. -.ti2mes -.times1ta -.timesta4m1p -.ti8m8e9s8t8a8m8p8s. -.timestam2p1s2 -.to8o8l9k8i8t. -.too2 -.toolk1i -.to8o8l9k8i8t8s. -.toolki4t1s2 -.to8p8o9g8r8a8p8h9i9c8a8l. -.to5po4g -.topo1gr -.topo5graph1ic -.topogr4aphi -.topographi1ca -.to8q8u8e8s. -.to1q -.toqu2 -.tr8a8i9t8o8r9o8u8s. -.1tra -.tr2ai2 -.trai1to -.traitorou2 -.traitoro2us -.tr8a8n8s9c8e8i8v8e8r. -.tra2n -.tra2n1s2 -.trans4c -.tran4s3cei2 -.transce2iv -.tr8a8n8s9c8e8i8v8e8r8s. -.transceive4r1s2 -.tr8a8n8s9g8r8e8s8s. -.tran2s3g -.trans1gr -.transgr2e2ss -.tr8a8n8s9v8e8r9s8a8l. -.tran4sv -.transve4r1s2 -.transver1sa2 -.tr8a8n8s9v8e8r9s8a8l8s. -.transversa2l1s2 -.tr8a8n8s9v8e8s9t8i8t8e. -.transv4e2s -.transvest2i -.transvest2ite -.tr8a8n8s9v8e8s9t8i8t8e8s. -.transvestit4es -.tr8a9v8e8r8s9a9b8l8e. -.trave4r1s2 -.traver1sa2 -.traver2s1ab -.traversab2l2 -.tr8a9v8e8r9s8a8l. -.tr8a9v8e8r9s8a8l8s. -.traversa2l1s2 -.tr8i9e8t8h8y8l9a8m8i8n8e. -.tri5et -.tr2ie4 -.triethy3la -.triethylam1in -.triethylam2ine -.tr8e8a8c8h9e8r8i8e8s. -.trea2ch -.treache2 -.treacher1i -.treacher2ie4 -.tr8o8u9b8a9d8o8u8r. -.trou2 -.trouba2d -.trouba1do -.troubadou2 -.tu8r9k8e8y. -.1tu -.tu8r9k8e8y8s. -.turkeys4 -.tu8r8n9a8r8o8u8n8d. -.tur4n2a2r -.tur1na -.turnarou2 -.turnaroun2d -.tu8r8n9a8r8o8u8n8d8s. -.turnaroun2d1s2 -.ty8p9a8l. -.1ty -.ty1pa -.typ4al -.un9a8t9t8a8c8h8e8d. -.un2at4 -.una4t3t2 -.unat1ta -.unatta2ch -.unattache2 -.unatta4ch4ed -.un9e8r8r9i8n8g9l8y. -.un4er -.uner4r4 -.unerrin4g -.unerringl2 -.unerring1ly -.un9f8r8i8e8n8d9l8y. -.un3f -.unfri2 -.unfr2ie4 -.unfrien2d1ly -.un9f8r8i8e8n8d9l8i9e8r. -.unfriendl2ie4 -.va8g8u8e8r. -.1va -.vag4 -.va5guer -.va2gue -.va8u8d8e9v8i8l8l8e. -.vaude1v4 -.vaude2v3i4l -.vaude1vi -.vaudevil1l -.vaudevil2le -.vi8c9a8r8s. -.v4ic2a2r -.vi1ca -.vica4rs2 -.vi8l9l8a8i8n9e8s8s. -.2vil -.vil1l -.villai2 -.villa4i4n -.villa2ine -.villai5n2e2ss -.villai1nes -.vi8s9u8a8l. -.vi3su -.visu1al -.vi8s9u8a8l9l8y. -.visual1l -.visual1ly -.vi9v8i8p9a9r8o8u8s. -.3v2iv -.viv2i4p -.vivi1pa -.vivip2a2r -.viviparou2 -.viviparo2us -.vo8i8c8e9p8r8i8n8t. -.voi4 -.voi3cep -.voicepr2 -.voiceprin4t3 -.vs8p8a8c8e. -.v2s1pa -.vspa4ce -.wa8d9d8i8n8g. -.wa2d -.wad4d1in -.wad1d4 -.wa8l8l9f8l8o8w8e8r. -.wal1l -.wal2lf -.wallf4l2 -.wallflow1er -.wa8l8l9f8l8o8w9e8r8s. -.wallflowe4r1s2 -.wa8r8m9e8s8t. -.w2a2r -.war1m -.war2me -.war2mes -.wa8s8t8e9w8a8t8e8r. -.was4t -.waste2w -.waste1w5a -.wastewa1te -.wa8v8e9g8u8i8d8e. -.waveg3 -.waveg2ui2 -.wavegu2id -.wa8v8e9g8u8i8d8e8s. -.waveguide4s2 -.wa8v8e9l8e8t. -.wa8v8e9l8e8t8s. -.wavele4t1s2 -.we8b9l8i8k8e. -.w2e1b -.web2l2 -.web3l4ik -.we8e8k9n8i8g8h8t. -.weekn2ig -.we8e8k9n8i8g8h8t8s. -.weeknigh4t1s2 -.wh8e8e8l9c8h8a8i8r. -.whee4l1c2 -.wheel2ch -.wheelchai2 -.wheelcha4ir -.wh8e8e8l9c8h8a8i8r8s. -.wheelchai4rs2 -.wh8i8c8h9e8v8e8r. -.whi4 -.wh4i2ch -.whiche2 -.whichev1er -.wh8i8t8e9s8i8d8e8d. -.wh2ite -.whit4es -.white1si -.white2s2id -.whitesi2d1ed -.wh8i8t8e9s8p8a8c8e. -.white1sp -.white2s1pa -.whitespa4ce -.wh8i8t8e9s8p8a8c8e8s. -.wi8d8e9s8p8r8e8a8d. -.w2id -.wide4s2 -.wide1sp -.wides4pre -.widespr2 -.widesprea2d1 -.wi8n8g9s8p8a8n. -.win4g -.wings2 -.wing2s1pa -.wingspa4n -.wi8n8g9s8p8a8n8s. -.wingspa2n1s2 -.wi8n8g9s8p8r8e8a8d. -.wingspr2 -.wingsprea2d1 -.wi8t8c8h9c8r8a8f8t. -.wi4tc -.wit4ch -.witchcra2f4t -.witchcra2f -.wo8r8d9s8p8a8c9i8n8g. -.1wo2 -.wor2d1s2 -.words4p -.word2s1pa -.wordsp4a2ci -.wordspa2c1in -.wordspac1ing -.wo8r8k9a8r8o8u8n8d. -.work2a2r -.workarou2 -.workaroun2d -.wo8r8k9a8r8o8u8n8d8s. -.workaroun2d1s2 -.wo8r8k9h8o8r8s8e. -.workh4 -.workhor4se -.workho4rs2 -.wo8r8k9h8o8r8s8e8s. -.workhors3e4s -.wr8a8p9a8r8o8u8n8d. -.wra4 -.wrap2a2r4 -.wra1pa -.wraparou2 -.wraparoun2d -.wr8e8t8c8h9e8d. -.wre4tc -.wret4ch -.wretche2 -.wret4ch4ed -.wr8e8t8c8h9e8d9l8y. -.wretche2d1ly -.ye8s9t8e8r9y8e8a8r. -.yes4 -.yesterye2a2r -.al9g8e9b8r8a8i9s8c8h8e. -.algebra2is1c -.algebrais3ch2 -.algebraische2 -.al9l8e9g8h8e9n8y. -.al1l -.al2le -.al3leg -.alleghe2n -.ar9k8a8n9s8a8s. -.arka2n -.arkan2sa2 -.arka2n1s2 -.at8p9a8s8e. -.a4t1p -.at1pa -.at8p9a8s8e8s. -.atpas1e4s -.au8s9t8r8a8l9a8s8i8a8n. -.a2us -.aus1t4r -.aus1tra -.australas2i1a -.australasi2a2n -.au8t8o9m8a8t8i9s8i8e8r9t8e8r. -.automa3tis -.automatis2ie4 -.automatisiert3er -.be9d8i8e9n8u8n8g. -.4be2d -.b4e3di -.be5di3en -.bed2ie4 -.bedie3nu4n -.be8m8b8o. -.4be5m -.be4m5b -.bi8b9l8i9o9g8r8a9p8h8i9s8c8h8e. -.bibliogr4aphi -.bibliograph2is1c -.bibliographis3ch2 -.bibliographische2 -.bo8s9t8o8n. -.5bos4 -.bos1to -.bosto2n -.br8o8w8n9i8a8n. -.brown5i -.brow3n4i1a -.browni3a2n -.br8u8n8s9w8i8c8k. -.bru2n -.bru2n3s4 -.brun4sw2 -.brunswi2 -.brunswick1 -.bu9d8a9p8e8s8t. -.bu1d2a -.ca8r9i8b9b8e8a8n. -.car1i -.car4ib -.cari2b1b -.carib2be -.caribbea2n -.ch8a8r8l8e8s9t8o8n. -.char4le4 -.char1l -.charles2 -.charl4es2to -.charle3sto2n -.ch8a8r9l8o8t8t8e8s9v8i8l8l8e. -.char3lo4 -.charlo4t3t2 -.charlot4tes -.charlotte4sv -.charlottes2vil -.charlottesvil1l -.charlottesvil2le -.co9l8u8m9b8i8a. -.colum4bi -.colu4m1b -.columb2i1a -.cz8e8c8h8o9s8l8o9v8a9k8i8a. -.c2ze4 -.cze2ch -.cze3cho2 -.czechos4l2 -.czechos4lov -.czechoslo1va -.czechoslovak1i -.czechoslovak2i1a -.de8l9a9w8a8r8e. -.de1la -.de4law -.delaw2a2r -.di8j8k9s8t8r8a. -.di3j -.dij4k1s2 -.dijkst4r -.dijks1tra -.du8a8n8e. -.d1u1a -.dua2n -.dy9n8a9m8i9s8c8h8e. -.5dyn -.dy1na -.dynam2is -.dynam2is1c -.dynamis3ch2 -.dynamische2 -.en8g9l8i8s8h. -.engl2 -.englis2h -.eu8l8e8r9i8a8n. -.eul4e -.eu3l4er1i -.eule1r2i3a4 -.euleri2a2n -.ev8a8n9s8t8o8n. -.e1va -.eva2n -.evan4st -.eva2n1s2 -.evans1to -.evansto2n -.fe8b9r8u9a8r8y. -.f2e4b -.fe3br -.febru3a -.febru2a2r -.fe8s8t9s8c8h8r8i8f8t. -.fes4t1s2 -.fest4sc -.fests2ch2 -.festsc4hr4 -.festschr4i2ft -.fl8o8r9i9d8a. -.flor2id -.flori1d2a -.fl8o8r9i9d9i8a8n. -.flori2di -.florid5i2a2n -.flori1d4i3a -.fo8r9s8c8h8u8n8g8s9i8n9s8t8i9t8u8t. -.fors4c -.fors2ch2 -.forschungs2 -.forschung2s1in -.forschungs2i2n1s2 -.forschungsinst2i -.forschungsinsti1tu -.fr8e8e9b8s8d. -.fre2e1b -.free2b5s2 -.freeb4s5d -.fu8n8k9t8s8i8o8n8a8l. -.3fu -.fu4nk2 -.funk5t -.funk4t1s2 -.funkt1s2io -.funkt5sio2n -.funktsio1n5a -.ga8u8s8s9i8a8n. -.ga2us -.gau2ss -.gaus1si -.gauss2i1a -.gaussi2a2n -.gh8o8s8t9s8c8r8i8p8t. -.ghos4t1s2 -.ghost4sc -.ghostscri2 -.ghostscr2ip -.ghostscri2p1t -.gh8o8s8t9v8i8e8w. -.ghos4tv -.ghostv2ie4 -.gr8a8s8s9m8a8n8n9i8a8n. -.gr2as -.gra2ss -.gras2s1m -.grass3ma -.grassma2n3 -.grassma4n1n2 -.grassman3n4i1a -.grassma2nni3a2n -.gr8e8i8f8s9w8a8l8d. -.grei2 -.grei2f3s -.greifsw2 -.greifswa2ld -.gr8o8t8h8e8n9d8i8e8c8k. -.g4ro -.gro4th2e -.gr4oth -.grothe2n -.grothend2ie4 -.grothendieck1 -.gr8u8n8d9l8e8h9r8e8n. -.gru2n -.grundle1h4 -.grundle4hr4 -.ha9d8a9m8a8r8d. -.ha2d -.ha1d2a -.hada2m2 -.had4a1ma -.hadam2a2r -.ha8i9f8a. -.hai1fa -.ha8m8i8l9t8o8n9i8a8n. -.ha4m -.hami4lt -.hamil1to -.hamilto2n -.hamilto3n4i1a -.hamiltoni3a2n -.he8l9s8i8n8k8i. -.he2l1s2 -.hel2s1in -.hels4i4nk2 -.helsink1i -.he8r9m8i8t9i8a8n. -.her3mit -.hermi1ti -.herm4i1t2i1a -.hermiti2a2n -.hi8b8b8s. -.hi2b1b -.hib2b5s2 -.ho8k9k8a8i9d8o. -.h2ok -.hokk4 -.hokkai2 -.hokka2id -.hokkai1do -.ja8c9k8o8w9s8k8i. -.5ja -.jack1 -.jackowsk2 -.jackowsk1i -.ja8n9u9a8r8y. -.ja2n -.jan3u1a -.janu2a2r -.ja9p8a9n8e8s8e. -.ja4p -.ja1pa -.japa2n -.japa1nes -.japane1s2e -.ka8d9o8m9t8s8e8v. -.ka2d -.ka1do -.kado4mt -.kadom4t1s2 -.kadomt5sev -.ka8n9s8a8s. -.ka2n -.kan2sa2 -.ka2n1s2 -.ka8r8l8s9r8u8h8e. -.k2a2r -.kar1l -.kar2l1s2 -.karls1r -.ko8r9t8e9w8e8g. -.ko5r -.kr8i8s8h8n8a. -.kr2is -.kr3is2h -.kris2h1n -.krish1na -.kr8i8s8h9n8a9i8s8m. -.krishnai2 -.krishnai2s1m -.kr8i8s8h9n8a8n. -.krishn2a2n -.la8n9c8a8s9t8e8r. -.lan1ca -.lancast5er -.le9g8e8n8d8r8e. -.le1gen -.legen1dr -.legendre4 -.le8i8c8e8s9t8e8r. -.lei2 -.le5ic -.leices5t -.li8p9s8c8h8i8t8z. -.l2ip -.li2p1s2 -.lips2ch2 -.lips3chit -.lipschi4tz -.li8p9s8c8h8i8t8z9i8a8n. -.lipschit2z1i -.lipschitz2i1a -.lipschitzi2a2n -.lo8j9b8a8n. -.lo5j -.lojba2n -.lo8u9i9s8i9a8n8a. -.lou2 -.lo2ui2 -.louis2i1a -.louisi2a2n -.louisia1na -.ma8c9o8s. -.ma1co -.ma8n9c8h8e8s9t8e8r. -.man2ch -.manche2 -.manch1es -.ma8r9k8o8v9i8a8n. -.marko5vi2a2n -.markov2i1a -.ma8r8k8t9o8b8e8r9d8o8r8f. -.mark5t -.mark1to -.markto3b -.marktober1do -.marktoberd4or -.marktoberdor1f -.ma8s8s9a9c8h8u9s8e8t8t8s. -.ma2ss -.mas1sa2 -.massa2ch -.massach2us -.massachuse4t3t2 -.massachuset4t1s2 -.ma8x9w8e8l8l. -.maxwel4l -.mi9c8r8o9s8o8f8t. -.micro2so -.microso2ft3 -.mi8n9n8e9a8p9o9l8i8s. -.m2i4n1n2 -.minne4 -.minneapol2i -.mi8n9n8e9s8o8t8a. -.min1nes -.minne1so -.minneso1ta -.mo8s9c8o8w. -.mos2c -.mos1co -.na8c8h9r8i8c8h8t8e8n. -.1na -.na2ch -.nac4hr4 -.na2chr4i2ch -.nachricht1en -.na8s8h9v8i8l8l8e. -.n4as -.nas2h -.nash2vil -.nashvil1l -.nashvil2le -.ne8t9b8s8d. -.ne2t1b -.net2b5s2 -.netb4s5d -.ne8t9s8c8a8p8e. -.ne4t1s2 -.net4sc -.netsca4p -.nets1ca -.ni8j9m8e9g8e8n. -.ni3j -.nijme2g -.nijme1gen -.no8e9t8h8e8r9i8a8n. -.3noe -.noeth2e -.noether1i -.noethe1r2i3a4 -.noetheri2a2n -.no8o8r8d9w8i8j8k8e8r9h8o8u8t. -.noo2 -.no3ord -.noord1w -.noordwi2 -.noordwi3j -.noordwijk1er -.noordwijker1h4 -.noordwijkerhou2 -.no9v8e8m9b8e8r. -.nove4m5b -.op8e8n9b8s8d. -.ope4n1b4 -.open2b5s2 -.openb4s5d -.op8e8n9o8f8f8i8c8e. -.op4eno -.openo4f1f -.openof1fi -.pa8l8a9t8i8n8o. -.pala2t1in -.palat2i1no -.pa9l8e8r9m8o. -.paler3m4 -.paler1mo -.pe9t8r8o8v9s8k8i. -.petro3v -.petrovsk2 -.petrovsk1i -.pf8a8f8f9i8a8n. -.4pf -.p1fa -.pfa2f -.pfa4f1f4 -.pfaf1fi -.pfaff2i3a -.pfaffi2a2n -.ph8i8l9a9d8e8l9p8h8i8a. -.phi4l4ade -.phila2d -.philade2lp -.philadel5phi -.philadelph2i1a -.ph8i8l9o9s8o8p8h9i9s8c8h8e. -.philo2so -.philos4op -.philos2oph -.philosoph2is1c -.philosophis3ch2 -.philosophische2 -.po8i8n9c8a8r8e. -.poin2 -.poi2 -.poinc2a2r5 -.poin1ca -.po9t8e8n9t8i8a8l9g8l8e8i9c8h8u8n8g. -.p4ot -.po1ten1t -.potent2i -.poten1t2i1a -.potenti2al -.potentia4l1g4 -.potentialgl2 -.potential1gle -.potentialglei2 -.potentialgle5ic -.potentialgle4i2ch -.ra9d8h8a9k8r8i8s8h9n8a8n. -.rad1h2 -.radhakr2is -.radhakr3is2h -.radhakris2h1n -.radhakrish1na -.radhakrishn2a2n -.ra8t8h8s9k8e8l9l8e8r. -.r4ath -.ra2t4h1s2 -.rathsk2 -.rath4ske -.rathskel1l -.rathskel2le -.ri8e9m8a8n8n9i8a8n. -.r2ie4 -.rie5ma2n -.rie1ma -.riema4n1n2 -.rieman3n4i1a -.riema2nni3a2n -.ry8d9b8e8r8g. -.ry1d -.ryd1b -.rydberg2 -.sc8h8o8t9t8i8s8c8h8e. -.scho4t3t2 -.schott2is1c -.s2ch2ottis3ch2 -.schottische2 -.sc8h8r8o9d8i8n8g9e8r. -.sc4hr4 -.schrod1in -.schrod4inge -.sc8h8w8a9b8a9c8h8e8r. -.sch1w -.schwaba2ch -.schwabache2 -.sc8h8w8a8r8z9s8c8h8i8l8d. -.schw2a2r -.s2chwarzs2ch2 -.schwarzsch4il2 -.schwarzschi2ld -.se8p9t8e8m9b8e8r. -.se2p1t -.sep2te -.septe4m5b -.st8o8k8e8s9s8c8h8e. -.st2ok -.stokes4 -.stok2e2ss -.stokes2s5c -.stokess2ch2 -.stokessche2 -.st8u8t8t9g8a8r8t. -.stu4t3t2 -.stut4t1g -.stutt1ga -.stuttg2a2r -.su8s9q8u8e9h8a8n9n8a. -.s2us -.susqu2 -.susque1h4 -.susqueha2n -.susqueha4n1n2 -.susquehan1na -.ta8u9b8e8r9i8a8n. -.tau4b -.taub4e -.tau3ber -.tauber1i -.taube1r2i3a4 -.tauberi2a2n -.te8c8h9n8i9s8c8h8e. -.te2ch -.tec2h1n -.techn2is1c -.te2chnis3ch2 -.technische2 -.te8n9n8e8s9s8e8e. -.t4e4n1n2 -.tenne4 -.ten1nes -.tenn2e2ss -.to9m8a9s8z8e8w9s8k8i. -.to2ma -.tomas2ze -.tomaszewsk2 -.tomaszewsk1i -.ty9p8o9g8r8a8p8h8i8q8u8e. -.ty3po -.ty5po4g -.typo1gr -.typogr4aphi -.typographiqu2 -.uk8r8a8i8n9i8a8n. -.4uk -.ukr2ai2 -.ukra4i4n -.ukra2ini -.ukrai4n4i1a -.ukraini3a2n -.ve8r9a8l8l9g8e9m8e8i8n9e8r8t8e. -.veral1l -.veral4l1g4 -.verallge1me -.verallgemei2 -.verallgeme2ine -.verallgemein1er -.ve8r9e8i8n9i9g8u8n8g. -.vere3in -.verei2 -.vere2ini -.verein2ig -.vereini3gun -.ve8r9t8e8i9l8u8n9g8e8n. -.vertei2 -.verteilun1gen -.vi8i8i8t8h. -.v4i5i4 -.vi4i5i4 -.vii2ith -.vi8i8t8h. -.vi2ith -.wa8h8r9s8c8h8e8i8n9l8i8c8h9k8e8i8t8s9t8h8e8o9r8i8e. -.wa4hr4 -.wah4rs2 -.wahrs4c -.wahrs2ch2 -.wahrsche2 -.wahrschei2 -.wahrsche4i4n1l -.wahrs2cheinl4i2ch -.wahrscheinlic4hk -.wahrscheinlichkei2 -.wahrscheinlichkei4t1s2 -.wahrscheinlichkeits3th2e -.wahrscheinlichkeitsthe1o5r -.wahrscheinlichkeitstheor2ie4 -.we8r9n8e8r. -.w1er -.wer4n1er -.we8r9t8h8e8r9i8a8n. -.werth2e -.werther1i -.werthe1r2i3a4 -.wertheri2a2n -.wi8n9c8h8e8s9t8e8r. -.win2ch -.winche2 -.winch1es -.wi8r8t9s8c8h8a8f8t. -.w4ir4 -.wir4t1s2 -.wirt4sc -.wirts2ch2 -.wirtscha2f -.wirtscha2ft -.wi8s9s8e8n9s8c8h8a8f8t9l8i8c8h. -.w4i2s1s -.wissen4 -.wisse2n1s2 -.wissens4c -.wissens2ch2 -.wissenscha2f -.wissenscha2ft -.wissenschaf2tl -.wissens2chaftl4i2ch -.xv8i8i8i8t8h. -.xv4i5i4 -.xvi4i5i4 -.xvii2ith -.xv8i8i8t8h. -.xvi2ith -.xx8i8i8i8r8d. -.xx4 -.xx3i -.xx4i5i4 -.xxi4i5i4 -.xxii4ir -.xx8i8i8n8d. -.xxi4ind -.yi8n8g9y8o8n8g. -.y1i -.yin2gy -.yingy1o4 -.yingyo2n -.sh8u9x8u8e. -.shux1u3 -.ji9s8u8a8n. -.ji2su -.jisua2n -.ze8a9l8a8n8d. -.2ze -.zea4l -.zea3l4and -.zeala2n -.ze8i8t9s8c8h8r8i8f8t. -.zei2 -.zei4t1s2 -.zeit4sc -.zeits2ch2 -.zeitsc4hr4 -.zeitschr4i2ft diff --git a/core/res/assets/webkit/incognito_mode_start_page.html b/core/res/assets/webkit/incognito_mode_start_page.html deleted file mode 100644 index 5d7a3fbf98c0..000000000000 --- a/core/res/assets/webkit/incognito_mode_start_page.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - New incognito window - - -

    You've gone incognito. Pages you view in this window - won't appear in your browser history or search history, and they won't - leave other traces, like cookies, on your device after you close the - incognito window. Any files you download or bookmarks you create will be - preserved, however.

    - -

    Going incognito doesn't affect the behavior of other people, - servers, or software. Be wary of:

    - -
      -
    • Websites that collect or share information about you
    • -
    • Internet service providers or employers that track the pages you visit
    • -
    • Malicious software that tracks your keystrokes in exchange for free smileys
    • -
    • Surveillance by secret agents
    • -
    • People standing behind you
    • -
    - - diff --git a/core/res/assets/webkit/missingImage.png b/core/res/assets/webkit/missingImage.png deleted file mode 100644 index f49a98d59d2d..000000000000 Binary files a/core/res/assets/webkit/missingImage.png and /dev/null differ diff --git a/core/res/assets/webkit/nullPlugin.png b/core/res/assets/webkit/nullPlugin.png deleted file mode 100644 index 96a52e3c2cc6..000000000000 Binary files a/core/res/assets/webkit/nullPlugin.png and /dev/null differ diff --git a/core/res/assets/webkit/play.png b/core/res/assets/webkit/play.png deleted file mode 100644 index 26fe2864d7c3..000000000000 Binary files a/core/res/assets/webkit/play.png and /dev/null differ diff --git a/core/res/assets/webkit/textAreaResizeCorner.png b/core/res/assets/webkit/textAreaResizeCorner.png deleted file mode 100644 index 777eff01a0a0..000000000000 Binary files a/core/res/assets/webkit/textAreaResizeCorner.png and /dev/null differ diff --git a/core/res/assets/webkit/togglePlugin.png b/core/res/assets/webkit/togglePlugin.png deleted file mode 100644 index 008333c66e60..000000000000 Binary files a/core/res/assets/webkit/togglePlugin.png and /dev/null differ diff --git a/core/res/assets/webkit/youtube.html b/core/res/assets/webkit/youtube.html deleted file mode 100644 index 8e103c1655e1..000000000000 --- a/core/res/assets/webkit/youtube.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - -
    - - -
    - - diff --git a/core/res/assets/webkit/youtube.png b/core/res/assets/webkit/youtube.png deleted file mode 100644 index 87779b113dd0..000000000000 Binary files a/core/res/assets/webkit/youtube.png and /dev/null differ diff --git a/core/res/res/anim-watch/progress_indeterminate_material.xml b/core/res/res/anim-watch/progress_indeterminate_material.xml new file mode 100644 index 000000000000..8f00d6c4cb66 --- /dev/null +++ b/core/res/res/anim-watch/progress_indeterminate_material.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/core/res/res/anim-watch/progress_indeterminate_rotation_material.xml b/core/res/res/anim-watch/progress_indeterminate_rotation_material.xml new file mode 100644 index 000000000000..63e66ec24410 --- /dev/null +++ b/core/res/res/anim-watch/progress_indeterminate_rotation_material.xml @@ -0,0 +1,24 @@ + + + diff --git a/core/res/res/anim/slide_out_micro.xml b/core/res/res/anim/slide_out_micro.xml index c6470935e5d2..01df0dae6259 100644 --- a/core/res/res/anim/slide_out_micro.xml +++ b/core/res/res/anim/slide_out_micro.xml @@ -19,7 +19,7 @@ --> + android:zAdjustment="normal"> diff --git a/core/res/res/anim/watch_switch_thumb_to_off_animation.xml b/core/res/res/anim/watch_switch_thumb_to_off_animation.xml deleted file mode 100644 index cd02e0db2fd5..000000000000 --- a/core/res/res/anim/watch_switch_thumb_to_off_animation.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - diff --git a/core/res/res/anim/watch_switch_thumb_to_on_animation.xml b/core/res/res/anim/watch_switch_thumb_to_on_animation.xml deleted file mode 100644 index e64421776605..000000000000 --- a/core/res/res/anim/watch_switch_thumb_to_on_animation.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - diff --git a/core/res/res/drawable/watch_switch_thumb_to_on_anim_mtrl.xml b/core/res/res/color/background_cache_hint_selector_device_default.xml similarity index 70% rename from core/res/res/drawable/watch_switch_thumb_to_on_anim_mtrl.xml rename to core/res/res/color/background_cache_hint_selector_device_default.xml index 9f92361e70ea..4470754f4155 100644 --- a/core/res/res/drawable/watch_switch_thumb_to_on_anim_mtrl.xml +++ b/core/res/res/color/background_cache_hint_selector_device_default.xml @@ -1,9 +1,12 @@ - - - + + + + + diff --git a/core/res/res/color/watch_switch_thumb_color_material.xml b/core/res/res/color/watch_switch_thumb_color_material.xml index d4796a032631..f78d9b62a509 100644 --- a/core/res/res/color/watch_switch_thumb_color_material.xml +++ b/core/res/res/color/watch_switch_thumb_color_material.xml @@ -10,9 +10,9 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - - - \ No newline at end of file + + + + diff --git a/core/res/res/drawable/watch_switch_thumb_to_off_anim_mtrl.xml b/core/res/res/color/watch_switch_track_color_material.xml similarity index 70% rename from core/res/res/drawable/watch_switch_thumb_to_off_anim_mtrl.xml rename to core/res/res/color/watch_switch_track_color_material.xml index 2c6ba2f75753..c7dc5d34204a 100644 --- a/core/res/res/drawable/watch_switch_thumb_to_off_anim_mtrl.xml +++ b/core/res/res/color/watch_switch_track_color_material.xml @@ -1,9 +1,12 @@ - - - + + + + \ No newline at end of file diff --git a/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_14w.png b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_14w.png new file mode 100644 index 000000000000..371469c43b13 Binary files /dev/null and b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_14w.png differ diff --git a/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_15w.png b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_15w.png new file mode 100644 index 000000000000..e47726058e3e Binary files /dev/null and b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_15w.png differ diff --git a/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_16w.png b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_16w.png new file mode 100644 index 000000000000..19a1bd317799 Binary files /dev/null and b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_16w.png differ diff --git a/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_17w.png b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_17w.png new file mode 100644 index 000000000000..79dc7332b60d Binary files /dev/null and b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_17w.png differ diff --git a/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_18w.png b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_18w.png new file mode 100644 index 000000000000..6d921c0709b8 Binary files /dev/null and b/core/res/res/drawable-hdpi/watch_switch_thumb_mtrl_18w.png differ diff --git a/core/res/res/drawable-hdpi/watch_switch_track_mtrl.png b/core/res/res/drawable-hdpi/watch_switch_track_mtrl.png new file mode 100644 index 000000000000..ecee3e137ef6 Binary files /dev/null and b/core/res/res/drawable-hdpi/watch_switch_track_mtrl.png differ diff --git a/core/res/res/drawable-watch/ic_input_extract_action_done.xml b/core/res/res/drawable-watch/ic_input_extract_action_done.xml new file mode 100644 index 000000000000..a04b944f391f --- /dev/null +++ b/core/res/res/drawable-watch/ic_input_extract_action_done.xml @@ -0,0 +1,19 @@ + + + + diff --git a/core/res/res/drawable-watch/ic_input_extract_action_send.xml b/core/res/res/drawable-watch/ic_input_extract_action_send.xml new file mode 100644 index 000000000000..3689172f72ab --- /dev/null +++ b/core/res/res/drawable-watch/ic_input_extract_action_send.xml @@ -0,0 +1,24 @@ + + + + diff --git a/core/res/res/drawable-watch/scrollbar_vertical_thumb.xml b/core/res/res/drawable-watch/scrollbar_vertical_thumb.xml new file mode 100644 index 000000000000..51aced25e619 --- /dev/null +++ b/core/res/res/drawable-watch/scrollbar_vertical_thumb.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/core/res/res/drawable-watch/scrollbar_vertical_track.xml b/core/res/res/drawable-watch/scrollbar_vertical_track.xml new file mode 100644 index 000000000000..5a04b1ca0b2c --- /dev/null +++ b/core/res/res/drawable-watch/scrollbar_vertical_track.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_14w.png b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_14w.png new file mode 100644 index 000000000000..7f7ca1416b76 Binary files /dev/null and b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_14w.png differ diff --git a/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_15w.png b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_15w.png new file mode 100644 index 000000000000..52120b8bef02 Binary files /dev/null and b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_15w.png differ diff --git a/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_16w.png b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_16w.png new file mode 100644 index 000000000000..d6e9be9e5daf Binary files /dev/null and b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_16w.png differ diff --git a/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_17w.png b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_17w.png new file mode 100644 index 000000000000..8d76393a1b63 Binary files /dev/null and b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_17w.png differ diff --git a/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_18w.png b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_18w.png new file mode 100644 index 000000000000..ca9c66e994ff Binary files /dev/null and b/core/res/res/drawable-xhdpi/watch_switch_thumb_mtrl_18w.png differ diff --git a/core/res/res/drawable-xhdpi/watch_switch_track_mtrl.png b/core/res/res/drawable-xhdpi/watch_switch_track_mtrl.png new file mode 100644 index 000000000000..1aa544227380 Binary files /dev/null and b/core/res/res/drawable-xhdpi/watch_switch_track_mtrl.png differ diff --git a/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_14w.png b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_14w.png new file mode 100644 index 000000000000..c0d72d70d6dd Binary files /dev/null and b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_14w.png differ diff --git a/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_15w.png b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_15w.png new file mode 100644 index 000000000000..d7c0ec0fd25e Binary files /dev/null and b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_15w.png differ diff --git a/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_16w.png b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_16w.png new file mode 100644 index 000000000000..5815ba9d3767 Binary files /dev/null and b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_16w.png differ diff --git a/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_17w.png b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_17w.png new file mode 100644 index 000000000000..41da8c0eaaa6 Binary files /dev/null and b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_17w.png differ diff --git a/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_18w.png b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_18w.png new file mode 100644 index 000000000000..975eb01cea4a Binary files /dev/null and b/core/res/res/drawable-xxhdpi/watch_switch_thumb_mtrl_18w.png differ diff --git a/core/res/res/drawable-xxhdpi/watch_switch_track_mtrl.png b/core/res/res/drawable-xxhdpi/watch_switch_track_mtrl.png new file mode 100644 index 000000000000..af2042be7f59 Binary files /dev/null and b/core/res/res/drawable-xxhdpi/watch_switch_track_mtrl.png differ diff --git a/core/res/res/drawable/ic_qs_network_logging.xml b/core/res/res/drawable/ic_qs_network_logging.xml new file mode 100644 index 000000000000..9e08264156e6 --- /dev/null +++ b/core/res/res/drawable/ic_qs_network_logging.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/core/res/res/drawable/lockscreen_notselected.xml b/core/res/res/drawable/lockscreen_notselected.xml new file mode 100644 index 000000000000..eecea13b59e2 --- /dev/null +++ b/core/res/res/drawable/lockscreen_notselected.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + diff --git a/core/res/res/drawable/lockscreen_selected.xml b/core/res/res/drawable/lockscreen_selected.xml new file mode 100644 index 000000000000..eecea13b59e2 --- /dev/null +++ b/core/res/res/drawable/lockscreen_selected.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + diff --git a/core/res/res/drawable/watch_switch_thumb_material_anim.xml b/core/res/res/drawable/watch_switch_thumb_material_anim.xml index 686fb976cf1c..9e3e89338dab 100644 --- a/core/res/res/drawable/watch_switch_thumb_material_anim.xml +++ b/core/res/res/drawable/watch_switch_thumb_material_anim.xml @@ -15,21 +15,79 @@ android:constantSize="true"> + android:drawable="@drawable/watch_switch_thumb_mtrl_14w" /> + android:toId="@id/on"> + + + + + + + + + + + + + android:toId="@id/off"> + + + + + + + + + + + + diff --git a/core/res/res/interpolator-watch/progress_indeterminate_rotation_interpolator.xml b/core/res/res/interpolator-watch/progress_indeterminate_rotation_interpolator.xml new file mode 100644 index 000000000000..ed2655cb0ac8 --- /dev/null +++ b/core/res/res/interpolator-watch/progress_indeterminate_rotation_interpolator.xml @@ -0,0 +1,18 @@ + + + diff --git a/core/res/res/interpolator-watch/trim_end_interpolator.xml b/core/res/res/interpolator-watch/trim_end_interpolator.xml new file mode 100644 index 000000000000..f46d5e0e7c82 --- /dev/null +++ b/core/res/res/interpolator-watch/trim_end_interpolator.xml @@ -0,0 +1,18 @@ + + + diff --git a/core/res/res/interpolator-watch/trim_offset_interpolator.xml b/core/res/res/interpolator-watch/trim_offset_interpolator.xml new file mode 100644 index 000000000000..d58672e9cb42 --- /dev/null +++ b/core/res/res/interpolator-watch/trim_offset_interpolator.xml @@ -0,0 +1,18 @@ + + + diff --git a/core/res/res/interpolator-watch/trim_start_interpolator.xml b/core/res/res/interpolator-watch/trim_start_interpolator.xml new file mode 100644 index 000000000000..365609c97d75 --- /dev/null +++ b/core/res/res/interpolator-watch/trim_start_interpolator.xml @@ -0,0 +1,18 @@ + + + diff --git a/core/res/res/layout-notround-watch/alert_dialog_header_micro.xml b/core/res/res/layout-notround-watch/alert_dialog_title_material.xml similarity index 74% rename from core/res/res/layout-notround-watch/alert_dialog_header_micro.xml rename to core/res/res/layout-notround-watch/alert_dialog_title_material.xml index fc840d9fa73f..08eecef1da95 100644 --- a/core/res/res/layout-notround-watch/alert_dialog_header_micro.xml +++ b/core/res/res/layout-notround-watch/alert_dialog_title_material.xml @@ -18,24 +18,21 @@ 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"> - + android:layout_height="wrap_content" /> diff --git a/core/res/res/layout-round-watch/alert_dialog_header_micro.xml b/core/res/res/layout-round-watch/alert_dialog_title_material.xml similarity index 52% rename from core/res/res/layout-round-watch/alert_dialog_header_micro.xml rename to core/res/res/layout-round-watch/alert_dialog_title_material.xml index 6f7ae02388a3..dac1e324be81 100644 --- a/core/res/res/layout-round-watch/alert_dialog_header_micro.xml +++ b/core/res/res/layout-round-watch/alert_dialog_title_material.xml @@ -14,25 +14,30 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> - - + - + + + - + android:layout_height="wrap_content" /> + diff --git a/core/res/res/layout-watch/alert_dialog_material.xml b/core/res/res/layout-watch/alert_dialog_material.xml index ce8e20a12187..960b927a0e64 100644 --- a/core/res/res/layout-watch/alert_dialog_material.xml +++ b/core/res/res/layout-watch/alert_dialog_material.xml @@ -39,18 +39,19 @@ + layout="@layout/alert_dialog_title_material"/> diff --git a/core/res/res/layout-watch/date_picker_dialog.xml b/core/res/res/layout-watch/date_picker_dialog.xml new file mode 100644 index 000000000000..b8772bc5ea3c --- /dev/null +++ b/core/res/res/layout-watch/date_picker_dialog.xml @@ -0,0 +1,26 @@ + + + + diff --git a/core/res/res/layout-watch/input_method_extract_view.xml b/core/res/res/layout-watch/input_method_extract_view.xml index 038b766c749b..3478bb544934 100644 --- a/core/res/res/layout-watch/input_method_extract_view.xml +++ b/core/res/res/layout-watch/input_method_extract_view.xml @@ -49,7 +49,7 @@ android:layout_width="@dimen/input_extract_action_button_width" android:layout_height="@dimen/input_extract_action_button_width" android:background="@drawable/input_extract_action_bg_material_dark" - android:padding="4dp" + android:padding="@dimen/input_extract_action_icon_padding" android:scaleType="centerInside" /> 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" /> diff --git a/core/res/res/layout-watch/preference_widget_switch.xml b/core/res/res/layout-watch/preference_widget_switch.xml index 37d0c6bf1af6..a1a845abfe3a 100644 --- a/core/res/res/layout-watch/preference_widget_switch.xml +++ b/core/res/res/layout-watch/preference_widget_switch.xml @@ -23,8 +23,9 @@ android:layout_gravity="center" android:thumb="@drawable/watch_switch_thumb_material_anim" android:thumbTint="@color/watch_switch_thumb_color_material" - android:track="@drawable/watch_switch_track_material" - android:trackTint="?android:colorPrimary" + android:thumbTintMode="multiply" + android:track="@drawable/watch_switch_track_mtrl" + android:trackTint="@color/watch_switch_track_color_material" android:focusable="false" android:clickable="false" android:background="@null" /> diff --git a/core/res/res/layout-watch/progress_dialog_material.xml b/core/res/res/layout-watch/progress_dialog_material.xml index 228f72454c0a..96bda1d0c285 100644 --- a/core/res/res/layout-watch/progress_dialog_material.xml +++ b/core/res/res/layout-watch/progress_dialog_material.xml @@ -32,14 +32,15 @@ + android:layout_marginEnd="8dp" /> diff --git a/core/res/res/layout-watch/time_picker_dialog.xml b/core/res/res/layout-watch/time_picker_dialog.xml new file mode 100644 index 000000000000..788602bf09ba --- /dev/null +++ b/core/res/res/layout-watch/time_picker_dialog.xml @@ -0,0 +1,26 @@ + + + + diff --git a/core/res/res/layout/date_picker_legacy_holo.xml b/core/res/res/layout/date_picker_legacy_holo.xml index b465d97339a2..a6e93c99160d 100644 --- a/core/res/res/layout/date_picker_legacy_holo.xml +++ b/core/res/res/layout/date_picker_legacy_holo.xml @@ -41,8 +41,8 @@ android:id="@+id/month" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dip" - android:layout_marginBottom="16dip" + android:layout_marginTop="@dimen/picker_top_margin" + android:layout_marginBottom="@dimen/picker_bottom_margin" android:layout_marginStart="8dip" android:layout_marginEnd="8dip" android:focusable="true" @@ -54,8 +54,8 @@ android:id="@+id/day" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dip" - android:layout_marginBottom="16dip" + android:layout_marginTop="@dimen/picker_top_margin" + android:layout_marginBottom="@dimen/picker_bottom_margin" android:layout_marginStart="8dip" android:layout_marginEnd="8dip" android:focusable="true" @@ -67,8 +67,8 @@ android:id="@+id/year" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dip" - android:layout_marginBottom="16dip" + android:layout_marginTop="@dimen/picker_top_margin" + android:layout_marginBottom="@dimen/picker_bottom_margin" android:layout_marginStart="8dip" android:layout_marginEnd="16dip" android:focusable="true" diff --git a/core/res/res/layout/date_picker_material.xml b/core/res/res/layout/date_picker_material.xml index 763f2a416bfb..dd8a45d26172 100644 --- a/core/res/res/layout/date_picker_material.xml +++ b/core/res/res/layout/date_picker_material.xml @@ -25,10 +25,16 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> - + + + diff --git a/core/res/res/layout/number_picker_material.xml b/core/res/res/layout/number_picker_material.xml index b0455857e79e..6fbd2b279f0c 100644 --- a/core/res/res/layout/number_picker_material.xml +++ b/core/res/res/layout/number_picker_material.xml @@ -22,4 +22,4 @@ android:gravity="center" android:singleLine="true" android:background="@null" - android:textAppearance="@style/TextAppearance.Material.Body1" /> + android:textAppearance="@style/TextAppearance.Material.NumberPicker" /> 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/layout/time_picker_legacy_material.xml b/core/res/res/layout/time_picker_legacy_material.xml index c6b7d3a70d97..ee56266390f1 100644 --- a/core/res/res/layout/time_picker_legacy_material.xml +++ b/core/res/res/layout/time_picker_legacy_material.xml @@ -40,8 +40,8 @@ android:id="@+id/hour" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dip" - android:layout_marginBottom="16dip" + android:layout_marginTop="@dimen/picker_top_margin" + android:layout_marginBottom="@dimen/picker_bottom_margin" android:focusable="true" android:focusableInTouchMode="true" /> @@ -62,8 +62,8 @@ android:id="@+id/minute" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dip" - android:layout_marginBottom="16dip" + android:layout_marginTop="@dimen/picker_top_margin" + android:layout_marginBottom="@dimen/picker_bottom_margin" android:focusable="true" android:focusableInTouchMode="true" /> @@ -75,8 +75,8 @@ android:id="@+id/amPm" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="16dip" - android:layout_marginBottom="16dip" + android:layout_marginTop="@dimen/picker_top_margin" + android:layout_marginBottom="@dimen/picker_bottom_margin" android:layout_marginStart="8dip" android:layout_marginEnd="8dip" android:focusable="true" diff --git a/core/res/res/raw-ar-xlarge/incognito_mode_start_page.html b/core/res/res/raw-ar-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 002be4164c9a..000000000000 --- a/core/res/res/raw-ar-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - نافذة جديدة للتصفح المتخفي - - -

    أنت الآن في وضع التصفح المتخفي الصفحات التي تشاهدها في هذه النافذة لن تظهر في سجل المتصفح أو سجلّ البحث، ولن تترك آثارًا أخرى للتتبع، مثل ملفات تعريف الارتباط على جهازك بعد أن تغلق نافذة التصفح المتخفي. ورغم ذلك، سيتم الاحتفاظ بأي ملفات تنزلها أو أية إشارات مرجعية تقوم بإنشائها.

    - -

    العمل في وضع التصفح المخفي لا يؤثر على طريقة عمل الأشخاص الآخرين أو الخوادم أو البرامج الأخرى. كن على حذر مما يلي:

    - -
      -
    • مواقع الويب التي تجمع معلومات عنك أو تشارك الآخرين فيها
    • -
    • مزوّدو خدمة الإنترنت أو الموظفون الذين يتتبعون الصفحات التي تزورها
    • -
    • البرامج الضارة التي تتبع ضغطات المفاتيح التي تقوم بها مقابل تنزيل وجوه رمزية مجانًا
    • -
    • المراقبة من قبل العملاء السريين
    • -
    • الأشخاص الذين يقفون خلفك
    • -
    - - diff --git a/core/res/res/raw-ar/incognito_mode_start_page.html b/core/res/res/raw-ar/incognito_mode_start_page.html deleted file mode 100644 index 002be4164c9a..000000000000 --- a/core/res/res/raw-ar/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - نافذة جديدة للتصفح المتخفي - - -

    أنت الآن في وضع التصفح المتخفي الصفحات التي تشاهدها في هذه النافذة لن تظهر في سجل المتصفح أو سجلّ البحث، ولن تترك آثارًا أخرى للتتبع، مثل ملفات تعريف الارتباط على جهازك بعد أن تغلق نافذة التصفح المتخفي. ورغم ذلك، سيتم الاحتفاظ بأي ملفات تنزلها أو أية إشارات مرجعية تقوم بإنشائها.

    - -

    العمل في وضع التصفح المخفي لا يؤثر على طريقة عمل الأشخاص الآخرين أو الخوادم أو البرامج الأخرى. كن على حذر مما يلي:

    - -
      -
    • مواقع الويب التي تجمع معلومات عنك أو تشارك الآخرين فيها
    • -
    • مزوّدو خدمة الإنترنت أو الموظفون الذين يتتبعون الصفحات التي تزورها
    • -
    • البرامج الضارة التي تتبع ضغطات المفاتيح التي تقوم بها مقابل تنزيل وجوه رمزية مجانًا
    • -
    • المراقبة من قبل العملاء السريين
    • -
    • الأشخاص الذين يقفون خلفك
    • -
    - - diff --git a/core/res/res/raw-bg-xlarge/incognito_mode_start_page.html b/core/res/res/raw-bg-xlarge/incognito_mode_start_page.html deleted file mode 100644 index ee25ae4023ff..000000000000 --- a/core/res/res/raw-bg-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Нов прозорец „инкогнито“ - - -

    Влязохте в режим „инкогнито“. Страниците, които разглеждате в този прозорец, няма да се показват в историята на браузъра ви, нито в историята на търсенията ви. Те също няма да оставят други следи като „бисквитки“ в устройството ви, след като затворите прозореца в режим „инкогнито“. Ще се съхранят обаче всички файлове, които изтеглите, или отметки, които създадете.

    - -

    Преминаването в режим „инкогнито“ не засяга поведението на други хора, сървъри или софтуер. Внимавайте за:

    - -
      -
    • уебсайтове, които събират или споделят информация за вас;
    • -
    • доставчици на интернет услуги или служители, които проследяват посещаваните от вас страници;
    • -
    • злонамерен софтуер, който ви дава безплатни емотикони, но в замяна проследява натисканията на клавишите от вас;
    • -
    • наблюдение от тайните служби;
    • -
    • хора, които стоят зад вас.
    • -
    - - diff --git a/core/res/res/raw-bg/incognito_mode_start_page.html b/core/res/res/raw-bg/incognito_mode_start_page.html deleted file mode 100644 index ee25ae4023ff..000000000000 --- a/core/res/res/raw-bg/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Нов прозорец „инкогнито“ - - -

    Влязохте в режим „инкогнито“. Страниците, които разглеждате в този прозорец, няма да се показват в историята на браузъра ви, нито в историята на търсенията ви. Те също няма да оставят други следи като „бисквитки“ в устройството ви, след като затворите прозореца в режим „инкогнито“. Ще се съхранят обаче всички файлове, които изтеглите, или отметки, които създадете.

    - -

    Преминаването в режим „инкогнито“ не засяга поведението на други хора, сървъри или софтуер. Внимавайте за:

    - -
      -
    • уебсайтове, които събират или споделят информация за вас;
    • -
    • доставчици на интернет услуги или служители, които проследяват посещаваните от вас страници;
    • -
    • злонамерен софтуер, който ви дава безплатни емотикони, но в замяна проследява натисканията на клавишите от вас;
    • -
    • наблюдение от тайните служби;
    • -
    • хора, които стоят зад вас.
    • -
    - - diff --git a/core/res/res/raw-ca-xlarge/incognito_mode_start_page.html b/core/res/res/raw-ca-xlarge/incognito_mode_start_page.html deleted file mode 100644 index bec3dacb9101..000000000000 --- a/core/res/res/raw-ca-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nova finestra d'incògnit - - -

    Has passat a l'estat d'incògnit. Les pàgines que visualitzis en aquesta finestra no apareixeran a l'historial del navegador ni a l'historial de cerques, i no deixaran cap pista, com ara galetes, al dispositiu després de tancar la finestra d'incògnit. Tanmateix, es conservaran tots els fitxers que baixis o les adreces d'interès que creïs.

    - -

    Utilitzar el mode d'incògnit no afecta el comportament d'altres usuaris, servidors ni programari. Vés amb compte amb:

    - -
      -
    • llocs web que recopilen o comparteixen informació sobre la teva identitat,
    • -
    • proveïdors de serveis d'Internet o treballadors que segueixen les pàgines que visites,
    • -
    • programari maliciós que segueix les teves pulsacions del teclat a canvi d'emoticones,
    • -
    • vigilància per part d'agents secrets,
    • -
    • persones que estan darrere teu.
    • -
    - - diff --git a/core/res/res/raw-ca/incognito_mode_start_page.html b/core/res/res/raw-ca/incognito_mode_start_page.html deleted file mode 100644 index bec3dacb9101..000000000000 --- a/core/res/res/raw-ca/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nova finestra d'incògnit - - -

    Has passat a l'estat d'incògnit. Les pàgines que visualitzis en aquesta finestra no apareixeran a l'historial del navegador ni a l'historial de cerques, i no deixaran cap pista, com ara galetes, al dispositiu després de tancar la finestra d'incògnit. Tanmateix, es conservaran tots els fitxers que baixis o les adreces d'interès que creïs.

    - -

    Utilitzar el mode d'incògnit no afecta el comportament d'altres usuaris, servidors ni programari. Vés amb compte amb:

    - -
      -
    • llocs web que recopilen o comparteixen informació sobre la teva identitat,
    • -
    • proveïdors de serveis d'Internet o treballadors que segueixen les pàgines que visites,
    • -
    • programari maliciós que segueix les teves pulsacions del teclat a canvi d'emoticones,
    • -
    • vigilància per part d'agents secrets,
    • -
    • persones que estan darrere teu.
    • -
    - - diff --git a/core/res/res/raw-cs-xlarge/incognito_mode_start_page.html b/core/res/res/raw-cs-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 7420393d3e51..000000000000 --- a/core/res/res/raw-cs-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nové anonymní okno - - -

    Spustili jste anonymní režim. Stránky, které zobrazíte v tomto okně, se nezahrnou do historie prohlížeče ani historie vyhledávání a dokonce po zavření tohoto anonymního okna ve vašem zařízení nezanechají ani žádné jiné stopy například v podobě souborů cookie. Veškeré stažené soubory nebo vytvořené záložky však budou zachovány.

    - -

    Použití anonymního režimu nemá vliv na chování jiných osob, serverů nebo softwaru. Dejte si pozor na:

    - -
      -
    • Weby, které sbírají nebo sdílejí informace o vás
    • -
    • Poskytovatele internetových služeb nebo zaměstnavatele, kteří sledují stránky, které navštěvujete
    • -
    • Škodlivý software, který sleduje stisknuté klávesy a výměnou nabízí nové emotikony
    • -
    • Tajné agenty
    • -
    • Lidi, kteří vám koukají přes rameno
    • -
    - - diff --git a/core/res/res/raw-cs/incognito_mode_start_page.html b/core/res/res/raw-cs/incognito_mode_start_page.html deleted file mode 100644 index 7420393d3e51..000000000000 --- a/core/res/res/raw-cs/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nové anonymní okno - - -

    Spustili jste anonymní režim. Stránky, které zobrazíte v tomto okně, se nezahrnou do historie prohlížeče ani historie vyhledávání a dokonce po zavření tohoto anonymního okna ve vašem zařízení nezanechají ani žádné jiné stopy například v podobě souborů cookie. Veškeré stažené soubory nebo vytvořené záložky však budou zachovány.

    - -

    Použití anonymního režimu nemá vliv na chování jiných osob, serverů nebo softwaru. Dejte si pozor na:

    - -
      -
    • Weby, které sbírají nebo sdílejí informace o vás
    • -
    • Poskytovatele internetových služeb nebo zaměstnavatele, kteří sledují stránky, které navštěvujete
    • -
    • Škodlivý software, který sleduje stisknuté klávesy a výměnou nabízí nové emotikony
    • -
    • Tajné agenty
    • -
    • Lidi, kteří vám koukají přes rameno
    • -
    - - diff --git a/core/res/res/raw-da-xlarge/incognito_mode_start_page.html b/core/res/res/raw-da-xlarge/incognito_mode_start_page.html deleted file mode 100644 index eae989f9cd19..000000000000 --- a/core/res/res/raw-da-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nyt inkognitovindue - - -

    Nu er du inkognito. De sider, du besøger i dette vindue, vises ikke i din browser- eller søgeoversigt, og de efterlader ikke andre spor, såsom cookies, på din enhed, når du lukker incognitovinduet. Filer, som du downloader eller bogmærker, som du opretter, gemmes dog.

    - -

    At være inkognito er ikke noget, der påvirker andre folk, servere eller software. Vær opmærksom på:

    - -
      -
    • Websider, der indsamler eller deler oplysninger om dig
    • -
    • Internetserviceudbydere eller arbejdsgivere, der registrerer de sider, du besøger
    • -
    • Ondsindet software, der registrerer dine tasteslag til gengæld for gratis smileys
    • -
    • Overvågning af hemmelige agenter
    • -
    • Folk, der kigger dig over skulderen
    • -
    - - diff --git a/core/res/res/raw-da/incognito_mode_start_page.html b/core/res/res/raw-da/incognito_mode_start_page.html deleted file mode 100644 index eae989f9cd19..000000000000 --- a/core/res/res/raw-da/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nyt inkognitovindue - - -

    Nu er du inkognito. De sider, du besøger i dette vindue, vises ikke i din browser- eller søgeoversigt, og de efterlader ikke andre spor, såsom cookies, på din enhed, når du lukker incognitovinduet. Filer, som du downloader eller bogmærker, som du opretter, gemmes dog.

    - -

    At være inkognito er ikke noget, der påvirker andre folk, servere eller software. Vær opmærksom på:

    - -
      -
    • Websider, der indsamler eller deler oplysninger om dig
    • -
    • Internetserviceudbydere eller arbejdsgivere, der registrerer de sider, du besøger
    • -
    • Ondsindet software, der registrerer dine tasteslag til gengæld for gratis smileys
    • -
    • Overvågning af hemmelige agenter
    • -
    • Folk, der kigger dig over skulderen
    • -
    - - diff --git a/core/res/res/raw-de-xlarge/incognito_mode_start_page.html b/core/res/res/raw-de-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 1d2cb69904b0..000000000000 --- a/core/res/res/raw-de-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Neues Inkognito-Fenster - - -

    Sie haben den Modus für anonymes Browsen aktiviert. In diesem Fenster aufgerufene Seiten erscheinen nicht in Ihrem Browser- oder Suchverlauf. Zudem werden nach dem Schließen des Inkognito-Fensters keine anderen Spuren wie etwa Cookies auf Ihrem Gerät gespeichert. Heruntergeladene Dateien oder hinzugefügte Lesezeichen werden jedoch beibehalten.

    - -

    Das anonyme Browsen wirkt sich nicht auf das Verhalten von Menschen, Servern oder Software aus. Vorsicht ist geboten bei:

    - -
      -
    • Websites, auf denen Informationen über Sie gesammelt oder weitergegeben werden
    • -
    • Internetanbietern oder Arbeitgebern, die die von Ihnen aufgerufenen Seiten protokollieren
    • -
    • Bösartiger Software, die Ihnen kostenlose Smileys bietet, dafür aber Ihre Tastatureingaben speichert
    • -
    • Geheimagenten
    • -
    • Personen, die hinter Ihnen stehen
    • -
    - - diff --git a/core/res/res/raw-de/incognito_mode_start_page.html b/core/res/res/raw-de/incognito_mode_start_page.html deleted file mode 100644 index 1d2cb69904b0..000000000000 --- a/core/res/res/raw-de/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Neues Inkognito-Fenster - - -

    Sie haben den Modus für anonymes Browsen aktiviert. In diesem Fenster aufgerufene Seiten erscheinen nicht in Ihrem Browser- oder Suchverlauf. Zudem werden nach dem Schließen des Inkognito-Fensters keine anderen Spuren wie etwa Cookies auf Ihrem Gerät gespeichert. Heruntergeladene Dateien oder hinzugefügte Lesezeichen werden jedoch beibehalten.

    - -

    Das anonyme Browsen wirkt sich nicht auf das Verhalten von Menschen, Servern oder Software aus. Vorsicht ist geboten bei:

    - -
      -
    • Websites, auf denen Informationen über Sie gesammelt oder weitergegeben werden
    • -
    • Internetanbietern oder Arbeitgebern, die die von Ihnen aufgerufenen Seiten protokollieren
    • -
    • Bösartiger Software, die Ihnen kostenlose Smileys bietet, dafür aber Ihre Tastatureingaben speichert
    • -
    • Geheimagenten
    • -
    • Personen, die hinter Ihnen stehen
    • -
    - - diff --git a/core/res/res/raw-el-xlarge/incognito_mode_start_page.html b/core/res/res/raw-el-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 5641650b8691..000000000000 --- a/core/res/res/raw-el-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Νέο παράθυρο για ανώνυμη περιήγηση - - -

    Είστε σε κατάσταση ανώνυμης περιήγησης. Οι σελίδες που θα προβάλλετε σε αυτό το παράθυρο δεν θα εμφανιστούν στο ιστορικό του πρόγράμματος περιήγησης ή στο ιστορικό αναζήτησης. Επίσης, δεν θα αφήσουν ίχνη, όπως cookie, στη συσκευή σας αφού κλείσετε το παράθυρο ανώνυμης περιήγησης. Ωστόσο, τα αρχεία και οι σελιδοδείκτες που θα δημιουργήσετε θα διατηρηθούν.

    - -

    Η κατάσταση ανώνυμης περιήγησης δεν επηρεάζει την συμπεριφορά άλλων, διακομιστών ή λογισμικού. Αλλά προσοχή σε:

    - -
      -
    • Ιστοτόπους που συλλέγουν ή μοιράζονται πληροφορίες για εσάς
    • -
    • Πάροχους υπηρεσιών διαδικτύου ή εργοδότες που παρακολουθούν τις ιστοσελίδες που επισκέπτεστε
    • -
    • Κακόβουλο λογισμικό που καταγράφει ότι πληκτρολογείτε με αντάλλαγμα δωρεάν "φατσούλες"
    • -
    • Παρακολούθηση από μυστικούς πράκτορες
    • -
    • Άτομα που στέκονται πίσω σας
    • -
    - - diff --git a/core/res/res/raw-el/incognito_mode_start_page.html b/core/res/res/raw-el/incognito_mode_start_page.html deleted file mode 100644 index 5641650b8691..000000000000 --- a/core/res/res/raw-el/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Νέο παράθυρο για ανώνυμη περιήγηση - - -

    Είστε σε κατάσταση ανώνυμης περιήγησης. Οι σελίδες που θα προβάλλετε σε αυτό το παράθυρο δεν θα εμφανιστούν στο ιστορικό του πρόγράμματος περιήγησης ή στο ιστορικό αναζήτησης. Επίσης, δεν θα αφήσουν ίχνη, όπως cookie, στη συσκευή σας αφού κλείσετε το παράθυρο ανώνυμης περιήγησης. Ωστόσο, τα αρχεία και οι σελιδοδείκτες που θα δημιουργήσετε θα διατηρηθούν.

    - -

    Η κατάσταση ανώνυμης περιήγησης δεν επηρεάζει την συμπεριφορά άλλων, διακομιστών ή λογισμικού. Αλλά προσοχή σε:

    - -
      -
    • Ιστοτόπους που συλλέγουν ή μοιράζονται πληροφορίες για εσάς
    • -
    • Πάροχους υπηρεσιών διαδικτύου ή εργοδότες που παρακολουθούν τις ιστοσελίδες που επισκέπτεστε
    • -
    • Κακόβουλο λογισμικό που καταγράφει ότι πληκτρολογείτε με αντάλλαγμα δωρεάν "φατσούλες"
    • -
    • Παρακολούθηση από μυστικούς πράκτορες
    • -
    • Άτομα που στέκονται πίσω σας
    • -
    - - diff --git a/core/res/res/raw-en-rGB-xlarge/incognito_mode_start_page.html b/core/res/res/raw-en-rGB-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 7436f9804c51..000000000000 --- a/core/res/res/raw-en-rGB-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - New incognito window - - -

    You've gone incognito. Pages that you view in this window won't appear in your browser history or search history, and they won't leave other traces, such as cookies, on your device after you close the incognito window. However, any files that you download or bookmarks that you create will be preserved.

    - -

    Going incognito doesn't affect the behaviour of other people, servers or software. Be cautious of:

    - -
      -
    • Websites that collect or share information about you
    • -
    • Internet service providers or employers that track the pages that you visit
    • -
    • Malicious software that tracks your keystrokes in exchange for free smileys
    • -
    • Surveillance by secret agents
    • -
    • People standing behind you
    • -
    - - diff --git a/core/res/res/raw-en-rGB/incognito_mode_start_page.html b/core/res/res/raw-en-rGB/incognito_mode_start_page.html deleted file mode 100644 index 7436f9804c51..000000000000 --- a/core/res/res/raw-en-rGB/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - New incognito window - - -

    You've gone incognito. Pages that you view in this window won't appear in your browser history or search history, and they won't leave other traces, such as cookies, on your device after you close the incognito window. However, any files that you download or bookmarks that you create will be preserved.

    - -

    Going incognito doesn't affect the behaviour of other people, servers or software. Be cautious of:

    - -
      -
    • Websites that collect or share information about you
    • -
    • Internet service providers or employers that track the pages that you visit
    • -
    • Malicious software that tracks your keystrokes in exchange for free smileys
    • -
    • Surveillance by secret agents
    • -
    • People standing behind you
    • -
    - - diff --git a/core/res/res/raw-es-rUS-xlarge/incognito_mode_start_page.html b/core/res/res/raw-es-rUS-xlarge/incognito_mode_start_page.html deleted file mode 100644 index d283df56cbaf..000000000000 --- a/core/res/res/raw-es-rUS-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nueva ventana de incógnito - - -

    Estás de incógnito. Las páginas que veas en esta ventana no aparecerán en el historial de tu navegador ni en el historial de búsquedas, y cuando cierres la ventana de incógnito, tampoco quedará ningún otro rastro, como cookies, en tu dispositivo. Sin embargo, sí se preservarán los archivos que descargues o los favoritos que marques.

    - -

    Estar de incógnito no afecta el comportamiento de otras personas, servidores o programas. Ten cuidado con:

    - -
      -
    • Sitios web que recaban o comparten tu información
    • -
    • Proveedores de servicio de Internet o empleadores que hacen un seguimiento de las páginas que visitas
    • -
    • Programas de software maliciosos que hacen un seguimiento de la actividad de tu teclado a cambio de emoticones gratuitos
    • -
    • Vigilancia a cargo de agentes secretos
    • -
    • Personas paradas atrás tuyo
    • -
    - - diff --git a/core/res/res/raw-es-rUS/incognito_mode_start_page.html b/core/res/res/raw-es-rUS/incognito_mode_start_page.html deleted file mode 100644 index d283df56cbaf..000000000000 --- a/core/res/res/raw-es-rUS/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nueva ventana de incógnito - - -

    Estás de incógnito. Las páginas que veas en esta ventana no aparecerán en el historial de tu navegador ni en el historial de búsquedas, y cuando cierres la ventana de incógnito, tampoco quedará ningún otro rastro, como cookies, en tu dispositivo. Sin embargo, sí se preservarán los archivos que descargues o los favoritos que marques.

    - -

    Estar de incógnito no afecta el comportamiento de otras personas, servidores o programas. Ten cuidado con:

    - -
      -
    • Sitios web que recaban o comparten tu información
    • -
    • Proveedores de servicio de Internet o empleadores que hacen un seguimiento de las páginas que visitas
    • -
    • Programas de software maliciosos que hacen un seguimiento de la actividad de tu teclado a cambio de emoticones gratuitos
    • -
    • Vigilancia a cargo de agentes secretos
    • -
    • Personas paradas atrás tuyo
    • -
    - - diff --git a/core/res/res/raw-es-xlarge/incognito_mode_start_page.html b/core/res/res/raw-es-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 6d9b5014b615..000000000000 --- a/core/res/res/raw-es-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nueva ventana de incógnito - - -

    Estás navegando de incógnito. Las páginas que consultes a través de esta ventana no quedarán registradas en el historial del navegador ni en el historial de búsquedas, y tampoco dejarán otros rastros en el ordenador (como cookies) una vez cerrada. Los archivos que descargues y los marcadores que guardes sí se almacenarán.

    - -

    La función de navegación de incógnito no afecta al comportamiento de los servidores o programas de software. Ten cuidado con:

    - -
      -
    • sitios web que recopilan o comparten información personal
    • -
    • proveedores de servicios de Internet o trabajadores de estas empresas que supervisan las páginas que visitas
    • -
    • software malicioso que realiza un seguimiento de las teclas que pulsas a cambio de emoticonos gratuitos
    • -
    • actividades de seguimiento por parte de terceros
    • -
    • personas merodeando cerca de tu ordenador
    • -
    - - diff --git a/core/res/res/raw-es/incognito_mode_start_page.html b/core/res/res/raw-es/incognito_mode_start_page.html deleted file mode 100644 index 6d9b5014b615..000000000000 --- a/core/res/res/raw-es/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nueva ventana de incógnito - - -

    Estás navegando de incógnito. Las páginas que consultes a través de esta ventana no quedarán registradas en el historial del navegador ni en el historial de búsquedas, y tampoco dejarán otros rastros en el ordenador (como cookies) una vez cerrada. Los archivos que descargues y los marcadores que guardes sí se almacenarán.

    - -

    La función de navegación de incógnito no afecta al comportamiento de los servidores o programas de software. Ten cuidado con:

    - -
      -
    • sitios web que recopilan o comparten información personal
    • -
    • proveedores de servicios de Internet o trabajadores de estas empresas que supervisan las páginas que visitas
    • -
    • software malicioso que realiza un seguimiento de las teclas que pulsas a cambio de emoticonos gratuitos
    • -
    • actividades de seguimiento por parte de terceros
    • -
    • personas merodeando cerca de tu ordenador
    • -
    - - diff --git a/core/res/res/raw-fa-xlarge/incognito_mode_start_page.html b/core/res/res/raw-fa-xlarge/incognito_mode_start_page.html deleted file mode 100644 index f004120a62e4..000000000000 --- a/core/res/res/raw-fa-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - پنجره ناشناس جدید - - -

    شما به صورت ناشناس وارد شده اید صفحاتی که شما در این پنجره مشاهده میکنید در سابقه مرورگر یا سابقه جستجوی شما ظاهر نمیشوند، و پس از بستن پنجره ناشناس، دنباله ای از خود مانند کوکی ها روی دستگاه شما بر جای نمیگذارند. به هر حال، فایل های دانلود شده و نشانکهای صفحه ای که ایجاد کرده اید باقی خواهند ماند.

    - -

    وارد شدن به صورت ناشناس، تاثیری بر روی رفتار افراد دیگر، سرورها و یا نرم افزارها ندارد. در خصوص موارد زیر هشیار باشید:

    - -
      -
    • وبسایت هایی که اطلاعاتی را در مورد شما جمع آوری کرده و به اشتراک میگذارند
    • -
    • تامین کننده های خدمات اینترنتی شما یا کارمندانی که صفحاتی که شما بازدید کرده اید را پیگیری میکنند
    • -
    • نرم افزارهای مخربی که در ازای نشانک های رایگان، ضربات کلیدهای شما را ذخیره میکنند
    • -
    • نظارت توسط نمایندگان سری
    • -
    • افرادی که پشت سرتان ایستاده اند
    • -
    - - diff --git a/core/res/res/raw-fa/incognito_mode_start_page.html b/core/res/res/raw-fa/incognito_mode_start_page.html deleted file mode 100644 index f004120a62e4..000000000000 --- a/core/res/res/raw-fa/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - پنجره ناشناس جدید - - -

    شما به صورت ناشناس وارد شده اید صفحاتی که شما در این پنجره مشاهده میکنید در سابقه مرورگر یا سابقه جستجوی شما ظاهر نمیشوند، و پس از بستن پنجره ناشناس، دنباله ای از خود مانند کوکی ها روی دستگاه شما بر جای نمیگذارند. به هر حال، فایل های دانلود شده و نشانکهای صفحه ای که ایجاد کرده اید باقی خواهند ماند.

    - -

    وارد شدن به صورت ناشناس، تاثیری بر روی رفتار افراد دیگر، سرورها و یا نرم افزارها ندارد. در خصوص موارد زیر هشیار باشید:

    - -
      -
    • وبسایت هایی که اطلاعاتی را در مورد شما جمع آوری کرده و به اشتراک میگذارند
    • -
    • تامین کننده های خدمات اینترنتی شما یا کارمندانی که صفحاتی که شما بازدید کرده اید را پیگیری میکنند
    • -
    • نرم افزارهای مخربی که در ازای نشانک های رایگان، ضربات کلیدهای شما را ذخیره میکنند
    • -
    • نظارت توسط نمایندگان سری
    • -
    • افرادی که پشت سرتان ایستاده اند
    • -
    - - diff --git a/core/res/res/raw-fi-xlarge/incognito_mode_start_page.html b/core/res/res/raw-fi-xlarge/incognito_mode_start_page.html deleted file mode 100644 index feb9f4faae32..000000000000 --- a/core/res/res/raw-fi-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Uusi incognito-ikkuna - - -

    Olet nyt incognito-tilassa. Incognito-tilassa katsellut sivut eivät näy selainhistoriassa eikä hakuhistoriassa. Ne eivät myöskään jätä muita jälkiä, kuten evästeitä, sivun sulkemisen jälkeen. Lataamasi tiedostot tai luomasi kirjanmerkit tosin tallentuvat.

    - -

    Incognito-tilaan siirtyminen ei vaikuta muiden ihmisten, palvelimien tai tietokoneohjelmien toimintaan. Varo:

    - -
      -
    • Verkkosivustoja jotka keräävät sinusta tietoa ja/tai jakavat sitä eteenpäin
    • -
    • Internet-palveluntarjoajia ja työnantajia jotka seuraavat sivuja, joilla käyt
    • -
    • Haittaohjelmia jotka seuraavat näppäimistön toimintaa ja tarjoavat vastineeksi ilmaisia hymiöitä
    • -
    • Salaisten agenttien seurantaa
    • -
    • Ihmisiä jotka seisovat takanasi
    • -
    - - diff --git a/core/res/res/raw-fi/incognito_mode_start_page.html b/core/res/res/raw-fi/incognito_mode_start_page.html deleted file mode 100644 index feb9f4faae32..000000000000 --- a/core/res/res/raw-fi/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Uusi incognito-ikkuna - - -

    Olet nyt incognito-tilassa. Incognito-tilassa katsellut sivut eivät näy selainhistoriassa eikä hakuhistoriassa. Ne eivät myöskään jätä muita jälkiä, kuten evästeitä, sivun sulkemisen jälkeen. Lataamasi tiedostot tai luomasi kirjanmerkit tosin tallentuvat.

    - -

    Incognito-tilaan siirtyminen ei vaikuta muiden ihmisten, palvelimien tai tietokoneohjelmien toimintaan. Varo:

    - -
      -
    • Verkkosivustoja jotka keräävät sinusta tietoa ja/tai jakavat sitä eteenpäin
    • -
    • Internet-palveluntarjoajia ja työnantajia jotka seuraavat sivuja, joilla käyt
    • -
    • Haittaohjelmia jotka seuraavat näppäimistön toimintaa ja tarjoavat vastineeksi ilmaisia hymiöitä
    • -
    • Salaisten agenttien seurantaa
    • -
    • Ihmisiä jotka seisovat takanasi
    • -
    - - diff --git a/core/res/res/raw-fr-xlarge/incognito_mode_start_page.html b/core/res/res/raw-fr-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 8962cdf28859..000000000000 --- a/core/res/res/raw-fr-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nouvelle fenêtre de navigation privée - - -

    Vous êtes passé en navigation privée. Les pages que vous consultez dans cette fenêtre n'apparaîtront ni dans l'historique de votre navigateur, ni dans l'historique des recherches, et ne laisseront aucune trace (comme les cookies) sur votre appareil une fois que vous aurez fermé la fenêtre de navigation privée. Tous les fichiers téléchargés et les favoris créés seront toutefois conservés.

    - -

    Passer en navigation privée n'a aucun effet sur les autres utilisateurs, serveurs ou logiciels. Méfiez-vous :

    - -
      -
    • Des sites Web qui collectent ou partagent des informations vous concernant
    • -
    • Des fournisseurs d'accès Internet ou des employeurs qui conservent une trace des pages que vous visitez
    • -
    • Des programmes indésirables qui enregistrent vos frappes en échange d'émoticônes gratuites
    • -
    • Des personnes qui pourraient surveiller vos activités
    • -
    • Des personnes qui se tiennent derrière vous
    • -
    - - diff --git a/core/res/res/raw-fr/incognito_mode_start_page.html b/core/res/res/raw-fr/incognito_mode_start_page.html deleted file mode 100644 index 8962cdf28859..000000000000 --- a/core/res/res/raw-fr/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nouvelle fenêtre de navigation privée - - -

    Vous êtes passé en navigation privée. Les pages que vous consultez dans cette fenêtre n'apparaîtront ni dans l'historique de votre navigateur, ni dans l'historique des recherches, et ne laisseront aucune trace (comme les cookies) sur votre appareil une fois que vous aurez fermé la fenêtre de navigation privée. Tous les fichiers téléchargés et les favoris créés seront toutefois conservés.

    - -

    Passer en navigation privée n'a aucun effet sur les autres utilisateurs, serveurs ou logiciels. Méfiez-vous :

    - -
      -
    • Des sites Web qui collectent ou partagent des informations vous concernant
    • -
    • Des fournisseurs d'accès Internet ou des employeurs qui conservent une trace des pages que vous visitez
    • -
    • Des programmes indésirables qui enregistrent vos frappes en échange d'émoticônes gratuites
    • -
    • Des personnes qui pourraient surveiller vos activités
    • -
    • Des personnes qui se tiennent derrière vous
    • -
    - - diff --git a/core/res/res/raw-hi-xlarge/incognito_mode_start_page.html b/core/res/res/raw-hi-xlarge/incognito_mode_start_page.html deleted file mode 100644 index f73c41d01e9c..000000000000 --- a/core/res/res/raw-hi-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - नई गुप्त विंडो - - -

    आप गुप्त मोड में हैं. इस विंडो में देखे गए पृष्ठ आपके ब्राउज़र इतिहास या खोज इतिहास में प्रकट नहीं होंगे, और वे आपके डिवाइस पर गुप्त विंडो बंद करने के बाद और कोई चिह्न जैसे कुकीज़, नहीं छोड़ते. हालांकि डाउनलोड की गई या बुकमार्क की गई कोई भी फ़ाइल संरक्षित रखी जाएगी.

    - -

    गुप्त मोड में होने से दूसरे लोगों, सर्वर. या सॉफ़्टवेयर पर कोई प्रभाव नहीं होता. इनका ध्यान रखें

    - -
      -
    • वे वेबसाइट जो आपके बारे में जानकारी एकत्र या शेयर करती हैं
    • -
    • इंटरनेट सेवा प्रदाता या नियोक्ता जो आपके द्वारा विज़िट किए गए पृष्ठों पर नज़र रखते हैं
    • -
    • दुर्भावनापूर्ण सॉफ़्टवेयर जो मुफ़्त स्माइली के बदले आपके कीस्ट्रोक पर नज़र रखते हैं.
    • -
    • गुप्तचरों द्वारा निगरानी
    • -
    • आपके पीछे खड़े लोग
    • -
    - - diff --git a/core/res/res/raw-hi/incognito_mode_start_page.html b/core/res/res/raw-hi/incognito_mode_start_page.html deleted file mode 100644 index f73c41d01e9c..000000000000 --- a/core/res/res/raw-hi/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - नई गुप्त विंडो - - -

    आप गुप्त मोड में हैं. इस विंडो में देखे गए पृष्ठ आपके ब्राउज़र इतिहास या खोज इतिहास में प्रकट नहीं होंगे, और वे आपके डिवाइस पर गुप्त विंडो बंद करने के बाद और कोई चिह्न जैसे कुकीज़, नहीं छोड़ते. हालांकि डाउनलोड की गई या बुकमार्क की गई कोई भी फ़ाइल संरक्षित रखी जाएगी.

    - -

    गुप्त मोड में होने से दूसरे लोगों, सर्वर. या सॉफ़्टवेयर पर कोई प्रभाव नहीं होता. इनका ध्यान रखें

    - -
      -
    • वे वेबसाइट जो आपके बारे में जानकारी एकत्र या शेयर करती हैं
    • -
    • इंटरनेट सेवा प्रदाता या नियोक्ता जो आपके द्वारा विज़िट किए गए पृष्ठों पर नज़र रखते हैं
    • -
    • दुर्भावनापूर्ण सॉफ़्टवेयर जो मुफ़्त स्माइली के बदले आपके कीस्ट्रोक पर नज़र रखते हैं.
    • -
    • गुप्तचरों द्वारा निगरानी
    • -
    • आपके पीछे खड़े लोग
    • -
    - - diff --git a/core/res/res/raw-hr-xlarge/incognito_mode_start_page.html b/core/res/res/raw-hr-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 6f20fe0ecfd9..000000000000 --- a/core/res/res/raw-hr-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Novi anonimni prozor - - -

    Sada ste anonimni. Stranice koje pregledavate u ovom prozoru neće se pojaviti u povijesti preglednika ili povijesti pretraživanja, neće ostaviti tragove, poput kolačića, na vašem uređaju nakon što zatvorite anonimni prozor. Međutim, sve datoteke koje preuzmete ili oznake koje stvorite bit će sačuvane.

    - -

    Anonimno pregledavanje neće utjecati na ponašanje drugih osoba, poslužitelja ili softvera. Pazite na sljedeće:

    - -
      -
    • Web-lokacije koje prikupljaju ili dijele informacije o vama
    • -
    • Davatelje internetskih usluga ili poslodavce koji prate stranice koje posjećujete
    • -
    • Zlonamjerni softver koji prati koje tipke pritišćete u zamjenu za besplatne emotikone
    • -
    • Nadzor tajnih službi
    • -
    • Osobe koje stoje iza vas
    • -
    - - diff --git a/core/res/res/raw-hr/incognito_mode_start_page.html b/core/res/res/raw-hr/incognito_mode_start_page.html deleted file mode 100644 index 6f20fe0ecfd9..000000000000 --- a/core/res/res/raw-hr/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Novi anonimni prozor - - -

    Sada ste anonimni. Stranice koje pregledavate u ovom prozoru neće se pojaviti u povijesti preglednika ili povijesti pretraživanja, neće ostaviti tragove, poput kolačića, na vašem uređaju nakon što zatvorite anonimni prozor. Međutim, sve datoteke koje preuzmete ili oznake koje stvorite bit će sačuvane.

    - -

    Anonimno pregledavanje neće utjecati na ponašanje drugih osoba, poslužitelja ili softvera. Pazite na sljedeće:

    - -
      -
    • Web-lokacije koje prikupljaju ili dijele informacije o vama
    • -
    • Davatelje internetskih usluga ili poslodavce koji prate stranice koje posjećujete
    • -
    • Zlonamjerni softver koji prati koje tipke pritišćete u zamjenu za besplatne emotikone
    • -
    • Nadzor tajnih službi
    • -
    • Osobe koje stoje iza vas
    • -
    - - diff --git a/core/res/res/raw-hu-xlarge/incognito_mode_start_page.html b/core/res/res/raw-hu-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 38b0806a1d58..000000000000 --- a/core/res/res/raw-hu-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Új inkognitóablak - - -

    Ön inkognitó módra váltott. Az inkognitóablakban megtekintett oldalak nem jelennek meg böngészője előzményeiben, illetve keresési előzményeiben, és nem hagynak más nyomot pl. cookie-t sem a számítógépén az inkognitóablak bezárását követően. A letöltött fájlok, valamint a létrehozott könyvjelzők azonban megmaradnak.

    - -

    Az inkognitó üzemmód nem befolyásolja a többi felhasználó, szerver vagy szoftver viselkedését. Ügyeljen a következőkre:

    - -
      -
    • Olyan webhelyek, amelyek információt gyűjtenek vagy osztanak meg Önről
    • -
    • Olyan internetszolgáltatók vagy alkalmazottaik, akik nyomon követik az Ön által látogatott oldalakat
    • -
    • Olyan kártékony szoftverek, amelyek ingyenes hangulatjelekért cserébe nyomon követik billentyűbeviteleit
    • -
    • Titkos ügynökök megfigyelése
    • -
    • Az Ön mögött álló emberek
    • -
    - - diff --git a/core/res/res/raw-hu/incognito_mode_start_page.html b/core/res/res/raw-hu/incognito_mode_start_page.html deleted file mode 100644 index 38b0806a1d58..000000000000 --- a/core/res/res/raw-hu/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Új inkognitóablak - - -

    Ön inkognitó módra váltott. Az inkognitóablakban megtekintett oldalak nem jelennek meg böngészője előzményeiben, illetve keresési előzményeiben, és nem hagynak más nyomot pl. cookie-t sem a számítógépén az inkognitóablak bezárását követően. A letöltött fájlok, valamint a létrehozott könyvjelzők azonban megmaradnak.

    - -

    Az inkognitó üzemmód nem befolyásolja a többi felhasználó, szerver vagy szoftver viselkedését. Ügyeljen a következőkre:

    - -
      -
    • Olyan webhelyek, amelyek információt gyűjtenek vagy osztanak meg Önről
    • -
    • Olyan internetszolgáltatók vagy alkalmazottaik, akik nyomon követik az Ön által látogatott oldalakat
    • -
    • Olyan kártékony szoftverek, amelyek ingyenes hangulatjelekért cserébe nyomon követik billentyűbeviteleit
    • -
    • Titkos ügynökök megfigyelése
    • -
    • Az Ön mögött álló emberek
    • -
    - - diff --git a/core/res/res/raw-id-xlarge/incognito_mode_start_page.html b/core/res/res/raw-id-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 788c08868012..000000000000 --- a/core/res/res/raw-id-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Jendela penyamaran baru - - -

    Anda menggunakan penyamaran. Laman yang Anda lihat di jendela ini tidak akan ditampilkan dalam riwayat peramban atau riwayat penelusuran, dan tidak akan meninggalkan jejak, seperti kuki, di perangkat setelah jendela penyamaran ditutup. Namun, berkas yang diunduh atau bookmark yang dibuat akan disimpan.

    - -

    Menggunakan penyamaran tidak mempengaruhi perilaku orang lain, server, atau perangkat lunak. Waspadai:

    - -
      -
    • Situs web yang mengumpulkan atau berbagi informasi tentang Anda
    • -
    • Penyedia layanan internet atau tempat kerja yang melacak laman yang Anda kunjungi
    • -
    • Perangkat lunak jahat yang melacak penekanan tombol dengan imbalan smiley gratis
    • -
    • Pemantauan oleh agen rahasia
    • -
    • Orang yang berdiri di belakang Anda
    • -
    - - diff --git a/core/res/res/raw-id/incognito_mode_start_page.html b/core/res/res/raw-id/incognito_mode_start_page.html deleted file mode 100644 index 788c08868012..000000000000 --- a/core/res/res/raw-id/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Jendela penyamaran baru - - -

    Anda menggunakan penyamaran. Laman yang Anda lihat di jendela ini tidak akan ditampilkan dalam riwayat peramban atau riwayat penelusuran, dan tidak akan meninggalkan jejak, seperti kuki, di perangkat setelah jendela penyamaran ditutup. Namun, berkas yang diunduh atau bookmark yang dibuat akan disimpan.

    - -

    Menggunakan penyamaran tidak mempengaruhi perilaku orang lain, server, atau perangkat lunak. Waspadai:

    - -
      -
    • Situs web yang mengumpulkan atau berbagi informasi tentang Anda
    • -
    • Penyedia layanan internet atau tempat kerja yang melacak laman yang Anda kunjungi
    • -
    • Perangkat lunak jahat yang melacak penekanan tombol dengan imbalan smiley gratis
    • -
    • Pemantauan oleh agen rahasia
    • -
    • Orang yang berdiri di belakang Anda
    • -
    - - diff --git a/core/res/res/raw-it-xlarge/incognito_mode_start_page.html b/core/res/res/raw-it-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 4a34874462da..000000000000 --- a/core/res/res/raw-it-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nuova finestra di navigazione in incognito - - -

    Sei passato alla navigazione in incognito. Le pagine aperte in questa finestra non vengono registrate nella cronologia di navigazione o di ricerca, e non lasciano traccia sul tuo computer, ad esempio sotto forma di cookie, una volta chiusa la finestra. Tuttavia, qualsiasi file scaricato o preferito creato verrà conservato.

    - -

    La navigazione in incognito non influisce sul comportamento di altri utenti, server o software. Diffida di:

    - -
      -
    • Siti web che raccolgono o condividono informazioni su di te
    • -
    • Provider di servizi Internet o datori di lavoro che registrano le pagine da te visitate
    • -
    • Software dannosi che registrano le sequenze di tasti da te utilizzate in cambio di smiley gratuiti
    • -
    • Agenti segreti
    • -
    • Persone che ti stanno alle spalle
    • -
    - - diff --git a/core/res/res/raw-it/incognito_mode_start_page.html b/core/res/res/raw-it/incognito_mode_start_page.html deleted file mode 100644 index 4a34874462da..000000000000 --- a/core/res/res/raw-it/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nuova finestra di navigazione in incognito - - -

    Sei passato alla navigazione in incognito. Le pagine aperte in questa finestra non vengono registrate nella cronologia di navigazione o di ricerca, e non lasciano traccia sul tuo computer, ad esempio sotto forma di cookie, una volta chiusa la finestra. Tuttavia, qualsiasi file scaricato o preferito creato verrà conservato.

    - -

    La navigazione in incognito non influisce sul comportamento di altri utenti, server o software. Diffida di:

    - -
      -
    • Siti web che raccolgono o condividono informazioni su di te
    • -
    • Provider di servizi Internet o datori di lavoro che registrano le pagine da te visitate
    • -
    • Software dannosi che registrano le sequenze di tasti da te utilizzate in cambio di smiley gratuiti
    • -
    • Agenti segreti
    • -
    • Persone che ti stanno alle spalle
    • -
    - - diff --git a/core/res/res/raw-iw-xlarge/incognito_mode_start_page.html b/core/res/res/raw-iw-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 368dea0ed395..000000000000 --- a/core/res/res/raw-iw-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - חלון חדש של גלישה בסתר - - -

    עברת למצב של גלישה בסתר. דפים שאתה רואה בחלון זה לא יופיעו בהיסטוריית הדפדפן או בהיסטוריית החיפושים שלך, והם לא ישאירו עקבות אחרים, כמו קובצי cookie, לאחר שתסגור את חלון הגלישה בסתר. עם זאת, כל קובץ שאתה מוריד או כוכביות שאתה יוצר יישמרו.

    - -

    גלישה בסתר לא משפיעה על התנהגותם של אנשים אחרים, שרתים אחרים או תוכנות אחרות. היזהר מ:

    - -
      -
    • אתרים שאוספים נתונים או משתפים מידע לגביך
    • -
    • ספקי שירות אינטרנט או עובדים שעוקבים אחר הדפים שבהם אתה מבקר
    • -
    • תוכנה זדונית שעוקבת אחר ההקשות שלך על המקשים בתמורה לסימני סמיילי בחינם
    • -
    • מעקב של סוכנים חשאיים
    • -
    • אנשים שעומדים מאחוריך
    • -
    - - diff --git a/core/res/res/raw-iw/incognito_mode_start_page.html b/core/res/res/raw-iw/incognito_mode_start_page.html deleted file mode 100644 index 368dea0ed395..000000000000 --- a/core/res/res/raw-iw/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - חלון חדש של גלישה בסתר - - -

    עברת למצב של גלישה בסתר. דפים שאתה רואה בחלון זה לא יופיעו בהיסטוריית הדפדפן או בהיסטוריית החיפושים שלך, והם לא ישאירו עקבות אחרים, כמו קובצי cookie, לאחר שתסגור את חלון הגלישה בסתר. עם זאת, כל קובץ שאתה מוריד או כוכביות שאתה יוצר יישמרו.

    - -

    גלישה בסתר לא משפיעה על התנהגותם של אנשים אחרים, שרתים אחרים או תוכנות אחרות. היזהר מ:

    - -
      -
    • אתרים שאוספים נתונים או משתפים מידע לגביך
    • -
    • ספקי שירות אינטרנט או עובדים שעוקבים אחר הדפים שבהם אתה מבקר
    • -
    • תוכנה זדונית שעוקבת אחר ההקשות שלך על המקשים בתמורה לסימני סמיילי בחינם
    • -
    • מעקב של סוכנים חשאיים
    • -
    • אנשים שעומדים מאחוריך
    • -
    - - diff --git a/core/res/res/raw-ja-xlarge/incognito_mode_start_page.html b/core/res/res/raw-ja-xlarge/incognito_mode_start_page.html deleted file mode 100644 index a58ad05c2ea7..000000000000 --- a/core/res/res/raw-ja-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - 新しいシークレットウィンドウ - - -

    シークレットモードを使用中です。このウィンドウで開いたページはブラウザの履歴や検索履歴に残りません。このウィンドウを閉じるとCookieなどの記録も端末から消去されます。ただし、ダウンロードしたファイルやブックマークしたページは保存されます。

    - -

    シークレットモードが他のユーザーやサーバー、ソフトウェアの動作に影響することはありません。なお、下記のようなケースにご注意ください。

    - -
      -
    • ユーザーの情報を収集、共有するウェブサイト
    • -
    • アクセスしたページをトラッキングするインターネットサービスプロバイダや雇用主
    • -
    • 無料ダウンロードなどと一緒にインストールされ、キーストロークを記録するマルウェア
    • -
    • スパイ、諜報活動
    • -
    • 背後にいる人
    • -
    - - diff --git a/core/res/res/raw-ja/incognito_mode_start_page.html b/core/res/res/raw-ja/incognito_mode_start_page.html deleted file mode 100644 index a58ad05c2ea7..000000000000 --- a/core/res/res/raw-ja/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - 新しいシークレットウィンドウ - - -

    シークレットモードを使用中です。このウィンドウで開いたページはブラウザの履歴や検索履歴に残りません。このウィンドウを閉じるとCookieなどの記録も端末から消去されます。ただし、ダウンロードしたファイルやブックマークしたページは保存されます。

    - -

    シークレットモードが他のユーザーやサーバー、ソフトウェアの動作に影響することはありません。なお、下記のようなケースにご注意ください。

    - -
      -
    • ユーザーの情報を収集、共有するウェブサイト
    • -
    • アクセスしたページをトラッキングするインターネットサービスプロバイダや雇用主
    • -
    • 無料ダウンロードなどと一緒にインストールされ、キーストロークを記録するマルウェア
    • -
    • スパイ、諜報活動
    • -
    • 背後にいる人
    • -
    - - diff --git a/core/res/res/raw-ko-xlarge/incognito_mode_start_page.html b/core/res/res/raw-ko-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 0e703b100102..000000000000 --- a/core/res/res/raw-ko-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - 새 시크릿 창 - - -

    시크릿 모드로 들어오셨습니다. 이 창에서 보는 페이지는 브라우저 기록이나 검색기록에 남지 않으며, 시크릿 창을 닫은 뒤 기기에 쿠기와 같은 흔적도 남기지 않습니다. 다운로드한 파일이나 생성한 북마크는 보관됩니다.

    - -

    시크릿 모드를 이용해도 다른 사용자, 서버, 소프트웨어에 영향을 주지는 않습니다. 다음을 주의하세요.

    - -
      -
    • 사용자에 대한 정보를 모으고 공유하는 웹사이트
    • -
    • 방문 페이지를 추적하는 인터넷 서비스 제공업체나 직원
    • -
    • 스마일 이모티콘을 제공한다는 명목으로 입력 내용을 추적하는 악성 소프트웨어
    • -
    • 비밀 개체를 통한 감시
    • -
    • 뒤에서 사용자의 작업내용을 지켜보는 사람
    • -
    - - diff --git a/core/res/res/raw-ko/incognito_mode_start_page.html b/core/res/res/raw-ko/incognito_mode_start_page.html deleted file mode 100644 index 0e703b100102..000000000000 --- a/core/res/res/raw-ko/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - 새 시크릿 창 - - -

    시크릿 모드로 들어오셨습니다. 이 창에서 보는 페이지는 브라우저 기록이나 검색기록에 남지 않으며, 시크릿 창을 닫은 뒤 기기에 쿠기와 같은 흔적도 남기지 않습니다. 다운로드한 파일이나 생성한 북마크는 보관됩니다.

    - -

    시크릿 모드를 이용해도 다른 사용자, 서버, 소프트웨어에 영향을 주지는 않습니다. 다음을 주의하세요.

    - -
      -
    • 사용자에 대한 정보를 모으고 공유하는 웹사이트
    • -
    • 방문 페이지를 추적하는 인터넷 서비스 제공업체나 직원
    • -
    • 스마일 이모티콘을 제공한다는 명목으로 입력 내용을 추적하는 악성 소프트웨어
    • -
    • 비밀 개체를 통한 감시
    • -
    • 뒤에서 사용자의 작업내용을 지켜보는 사람
    • -
    - - diff --git a/core/res/res/raw-lt-xlarge/incognito_mode_start_page.html b/core/res/res/raw-lt-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 9244ae4398b1..000000000000 --- a/core/res/res/raw-lt-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Naujas inkognito langas - - -

    Naršote inkognito režimu. Šiame lange peržiūrimi puslapiai nebus išsaugomi naršyklės istorijoje ar paieškos istorijoje ir uždarius inkognito langą nepaliks jokių kitų žymių, pvz., slapukų. Tačiau bus išsaugoti atsisiųsti failai ar sukurtos žymos.

    - -

    Naršymas inkognito režimu nedaro jokios įtakos kitiems asmenims, serveriams ar programinei įrangai. Saugokitės:

    - -
      -
    • svetainių, kurios renka ar platina informaciją apie jus
    • -
    • interneto paslaugos teikėjų ar darbdavių, kurie stebi, kuriuos puslapius peržiūrite
    • -
    • kenkėjiškos programinės įrangos, kuri siūlydama nemokamų šypsniukų fiksuoja klavišų paspaudimus
    • -
    • jus galinčių sekti slaptųjų agentų
    • -
    • už nugaros stovinčių asmenų
    • -
    - - diff --git a/core/res/res/raw-lt/incognito_mode_start_page.html b/core/res/res/raw-lt/incognito_mode_start_page.html deleted file mode 100644 index 9244ae4398b1..000000000000 --- a/core/res/res/raw-lt/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Naujas inkognito langas - - -

    Naršote inkognito režimu. Šiame lange peržiūrimi puslapiai nebus išsaugomi naršyklės istorijoje ar paieškos istorijoje ir uždarius inkognito langą nepaliks jokių kitų žymių, pvz., slapukų. Tačiau bus išsaugoti atsisiųsti failai ar sukurtos žymos.

    - -

    Naršymas inkognito režimu nedaro jokios įtakos kitiems asmenims, serveriams ar programinei įrangai. Saugokitės:

    - -
      -
    • svetainių, kurios renka ar platina informaciją apie jus
    • -
    • interneto paslaugos teikėjų ar darbdavių, kurie stebi, kuriuos puslapius peržiūrite
    • -
    • kenkėjiškos programinės įrangos, kuri siūlydama nemokamų šypsniukų fiksuoja klavišų paspaudimus
    • -
    • jus galinčių sekti slaptųjų agentų
    • -
    • už nugaros stovinčių asmenų
    • -
    - - diff --git a/core/res/res/raw-lv-xlarge/incognito_mode_start_page.html b/core/res/res/raw-lv-xlarge/incognito_mode_start_page.html deleted file mode 100644 index f325ef5267b9..000000000000 --- a/core/res/res/raw-lv-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Jauns inkognito logs - - -

    Jūs esat ieslēdzis inkognito režīmu. Šajā logā aplūkotās lapas neparādīsies jūsu pārlūkprogrammas vēsturē vai meklēšanas vēsturē, tās arī neatstās citas pēdas, piemēram, sīkfailus, jūsu ierīcē pēc inkognito režīma loga aizvēršanas. Tomēr visi jūsu lejupielādētie faili vai izveidotās grāmatzīmes tiks saglabātas.

    - -

    Inkognito režīma ieslēgšana neietekmēs citu personu, serveru vai programmatūras darbību. Uzmanieties no

    - -
      -
    • vietnēm, kas apkopo vai koplieto informāciju par jums;
    • -
    • interneta pakalpojumu sniedzējiem vai darba devējiem, kas izseko jūsu apmeklētajām lapām;
    • -
    • maldprogrammatūras, kas izseko jūsu taustiņsitieniem apmaiņā par bezmaksas smaidiņiem;
    • -
    • slepeno aģentu veiktas izmeklēšanas;
    • -
    • personām, kas stāv aiz jums.
    • -
    - - diff --git a/core/res/res/raw-lv/incognito_mode_start_page.html b/core/res/res/raw-lv/incognito_mode_start_page.html deleted file mode 100644 index f325ef5267b9..000000000000 --- a/core/res/res/raw-lv/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Jauns inkognito logs - - -

    Jūs esat ieslēdzis inkognito režīmu. Šajā logā aplūkotās lapas neparādīsies jūsu pārlūkprogrammas vēsturē vai meklēšanas vēsturē, tās arī neatstās citas pēdas, piemēram, sīkfailus, jūsu ierīcē pēc inkognito režīma loga aizvēršanas. Tomēr visi jūsu lejupielādētie faili vai izveidotās grāmatzīmes tiks saglabātas.

    - -

    Inkognito režīma ieslēgšana neietekmēs citu personu, serveru vai programmatūras darbību. Uzmanieties no

    - -
      -
    • vietnēm, kas apkopo vai koplieto informāciju par jums;
    • -
    • interneta pakalpojumu sniedzējiem vai darba devējiem, kas izseko jūsu apmeklētajām lapām;
    • -
    • maldprogrammatūras, kas izseko jūsu taustiņsitieniem apmaiņā par bezmaksas smaidiņiem;
    • -
    • slepeno aģentu veiktas izmeklēšanas;
    • -
    • personām, kas stāv aiz jums.
    • -
    - - diff --git a/core/res/res/raw-nb-xlarge/incognito_mode_start_page.html b/core/res/res/raw-nb-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 724e73433fcb..000000000000 --- a/core/res/res/raw-nb-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nytt inkognitovindu - - -

    Du er nå inkognito Sider du besøker i dette vinduet blir ikke lagret i nettleser- eller søkelogg, og etterlater ikke andre spor, f. eks. informasjonskapsler, på enheten din etter at du har lukket vinduet. Filer du laster ned eller bokmerker du lager blir derimot lagret.

    - -

    Det at du er inkognito endrer ikke hvordan andre mennesker, tjenere eller programmer oppfører seg. Pass deg for:

    - -
      -
    • Nettsider som samler eller deler informasjon om deg
    • -
    • Nettleverandører eller arbeidsgivere som overvåker hvilke sider du besøker
    • -
    • Skadelige programmer som følger med på tastetrykk i bytte mot smilefjes
    • -
    • Hemmelige agenter som spionerer på deg
    • -
    • Folk som titter over skulderen din
    • -
    - - diff --git a/core/res/res/raw-nb/incognito_mode_start_page.html b/core/res/res/raw-nb/incognito_mode_start_page.html deleted file mode 100644 index 724e73433fcb..000000000000 --- a/core/res/res/raw-nb/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nytt inkognitovindu - - -

    Du er nå inkognito Sider du besøker i dette vinduet blir ikke lagret i nettleser- eller søkelogg, og etterlater ikke andre spor, f. eks. informasjonskapsler, på enheten din etter at du har lukket vinduet. Filer du laster ned eller bokmerker du lager blir derimot lagret.

    - -

    Det at du er inkognito endrer ikke hvordan andre mennesker, tjenere eller programmer oppfører seg. Pass deg for:

    - -
      -
    • Nettsider som samler eller deler informasjon om deg
    • -
    • Nettleverandører eller arbeidsgivere som overvåker hvilke sider du besøker
    • -
    • Skadelige programmer som følger med på tastetrykk i bytte mot smilefjes
    • -
    • Hemmelige agenter som spionerer på deg
    • -
    • Folk som titter over skulderen din
    • -
    - - diff --git a/core/res/res/raw-nl-xlarge/incognito_mode_start_page.html b/core/res/res/raw-nl-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 92fedd725fe6..000000000000 --- a/core/res/res/raw-nl-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nieuw incognitovenster - - -

    U bent nu incognito De pagina's die u in dit venster bekijkt worden niet opgenomen in de browsergeschiedenis en de zoekgeschiedenis en laten geen cookies of andere sporen na op uw apparaat nadat u het incognitovenster hebt gesloten. Alle bestanden die u downloadt en bladwijzers die u maakt, blijven echter behouden.

    - -

    Incognito zijn heeft geen invloed op het gedrag van andere personen, servers of software. Wees op uw hoede voor:

    - -
      -
    • Websites die informatie over u verzamelen of delen
    • -
    • Internetproviders of werkgevers die bijhouden welke pagina's u bezoekt
    • -
    • Schadelijke software die uw toetsaanslagen registreert in ruil voor gratis emoticons
    • -
    • Spionage door geheim agenten
    • -
    • Mensen die achter u staan
    • -
    - - diff --git a/core/res/res/raw-nl/incognito_mode_start_page.html b/core/res/res/raw-nl/incognito_mode_start_page.html deleted file mode 100644 index 92fedd725fe6..000000000000 --- a/core/res/res/raw-nl/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nieuw incognitovenster - - -

    U bent nu incognito De pagina's die u in dit venster bekijkt worden niet opgenomen in de browsergeschiedenis en de zoekgeschiedenis en laten geen cookies of andere sporen na op uw apparaat nadat u het incognitovenster hebt gesloten. Alle bestanden die u downloadt en bladwijzers die u maakt, blijven echter behouden.

    - -

    Incognito zijn heeft geen invloed op het gedrag van andere personen, servers of software. Wees op uw hoede voor:

    - -
      -
    • Websites die informatie over u verzamelen of delen
    • -
    • Internetproviders of werkgevers die bijhouden welke pagina's u bezoekt
    • -
    • Schadelijke software die uw toetsaanslagen registreert in ruil voor gratis emoticons
    • -
    • Spionage door geheim agenten
    • -
    • Mensen die achter u staan
    • -
    - - diff --git a/core/res/res/raw-pl-xlarge/incognito_mode_start_page.html b/core/res/res/raw-pl-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 9748ead325a2..000000000000 --- a/core/res/res/raw-pl-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nowe okno incognito - - -

    Jesteś teraz incognito Strony przeglądane w tym oknie nie będą wyświetlane w historii przeglądarki ani w historii wyszukiwania. Po zamknięciu okna incognito na komputerze nie zostanie po nich żaden ślad np. w postaci plików cookie. Zachowane zostaną jednak pobrane pliki lub utworzone zakładki.

    - -

    Przejście do trybu incognito nie ma wpływu na działania innych osób, serwery ani oprogramowanie. Należy uważać na:

    - -
      -
    • witryny zbierające lub udostępniające dane na temat użytkowników
    • -
    • dostawców usług internetowych oraz pracowników monitorujących strony odwiedzane przez użytkowników
    • -
    • złośliwe oprogramowanie śledzące naciśnięcia klawiszy (np. w zamian za darmowe emotikony)
    • -
    • aktywność wywiadowczą tajnych agentów
    • -
    • osoby stojące za plecami
    • -
    - - diff --git a/core/res/res/raw-pl/incognito_mode_start_page.html b/core/res/res/raw-pl/incognito_mode_start_page.html deleted file mode 100644 index 9748ead325a2..000000000000 --- a/core/res/res/raw-pl/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nowe okno incognito - - -

    Jesteś teraz incognito Strony przeglądane w tym oknie nie będą wyświetlane w historii przeglądarki ani w historii wyszukiwania. Po zamknięciu okna incognito na komputerze nie zostanie po nich żaden ślad np. w postaci plików cookie. Zachowane zostaną jednak pobrane pliki lub utworzone zakładki.

    - -

    Przejście do trybu incognito nie ma wpływu na działania innych osób, serwery ani oprogramowanie. Należy uważać na:

    - -
      -
    • witryny zbierające lub udostępniające dane na temat użytkowników
    • -
    • dostawców usług internetowych oraz pracowników monitorujących strony odwiedzane przez użytkowników
    • -
    • złośliwe oprogramowanie śledzące naciśnięcia klawiszy (np. w zamian za darmowe emotikony)
    • -
    • aktywność wywiadowczą tajnych agentów
    • -
    • osoby stojące za plecami
    • -
    - - diff --git a/core/res/res/raw-pt-rPT-xlarge/incognito_mode_start_page.html b/core/res/res/raw-pt-rPT-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 89a5ab0de880..000000000000 --- a/core/res/res/raw-pt-rPT-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nova janela de navegação anónima - - -

    Está no modo de navegação anónima. As páginas que visualizar nesta janela não vão aparecer nos históricos de pesquisa ou de navegação e não deixarão quaisquer vestígios (por exemplo cookies) no computador depois de fechar a janela. No entanto se transferir ficheiros ou criar marcadores, estes serão preservados.

    - -

    Navegar no modo de navegação anónima não afecta o comportamento de outras pessoas, nem o comportamento de servidores ou programas. Tenha cuidado com:

    - -
      -
    • Web sites que recolhem ou partilham informações sobre si
    • -
    • Serviços de fornecimento de internet ou empregadores que monitorizam as páginas que você visita
    • -
    • Programas maliciosos que monitorizam as teclas em que carrega em troca de ícones expressivos ("smileys")
    • -
    • Vigilância de agentes secretos
    • -
    • Pessoas que estejam perto de si
    • -
    - - diff --git a/core/res/res/raw-pt-rPT/incognito_mode_start_page.html b/core/res/res/raw-pt-rPT/incognito_mode_start_page.html deleted file mode 100644 index 89a5ab0de880..000000000000 --- a/core/res/res/raw-pt-rPT/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nova janela de navegação anónima - - -

    Está no modo de navegação anónima. As páginas que visualizar nesta janela não vão aparecer nos históricos de pesquisa ou de navegação e não deixarão quaisquer vestígios (por exemplo cookies) no computador depois de fechar a janela. No entanto se transferir ficheiros ou criar marcadores, estes serão preservados.

    - -

    Navegar no modo de navegação anónima não afecta o comportamento de outras pessoas, nem o comportamento de servidores ou programas. Tenha cuidado com:

    - -
      -
    • Web sites que recolhem ou partilham informações sobre si
    • -
    • Serviços de fornecimento de internet ou empregadores que monitorizam as páginas que você visita
    • -
    • Programas maliciosos que monitorizam as teclas em que carrega em troca de ícones expressivos ("smileys")
    • -
    • Vigilância de agentes secretos
    • -
    • Pessoas que estejam perto de si
    • -
    - - diff --git a/core/res/res/raw-pt-xlarge/incognito_mode_start_page.html b/core/res/res/raw-pt-xlarge/incognito_mode_start_page.html deleted file mode 100644 index b301eda73f49..000000000000 --- a/core/res/res/raw-pt-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nova janela anônima - - -

    Você ficou anônimo. As páginas que você vê nesta janela não aparecerão no histórico do seu navegador ou da sua pesquisa e não deixarão rastros, como cookies, no seu dispositivo depois que você fechar a janela anônima. Quaisquer arquivos que você fizer o download ou favoritos que criar serão preservados.

    - -

    Tornar-se anônimo não afeta o comportamento de outras pessoas, servidores ou software. Esteja atento a:

    - -
      -
    • Websites que coletam ou compartilham informações sobre você
    • -
    • Provedores de serviços de internet ou funcionários que rastreiam as páginas que você visita
    • -
    • Softwares maliciosos que rastreiam os seus toques de teclado em troca de ícones gratuitos
    • -
    • Vigilância por agentes secretos
    • -
    • Pessoas paradas detrás de você
    • -
    - - diff --git a/core/res/res/raw-pt/incognito_mode_start_page.html b/core/res/res/raw-pt/incognito_mode_start_page.html deleted file mode 100644 index b301eda73f49..000000000000 --- a/core/res/res/raw-pt/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nova janela anônima - - -

    Você ficou anônimo. As páginas que você vê nesta janela não aparecerão no histórico do seu navegador ou da sua pesquisa e não deixarão rastros, como cookies, no seu dispositivo depois que você fechar a janela anônima. Quaisquer arquivos que você fizer o download ou favoritos que criar serão preservados.

    - -

    Tornar-se anônimo não afeta o comportamento de outras pessoas, servidores ou software. Esteja atento a:

    - -
      -
    • Websites que coletam ou compartilham informações sobre você
    • -
    • Provedores de serviços de internet ou funcionários que rastreiam as páginas que você visita
    • -
    • Softwares maliciosos que rastreiam os seus toques de teclado em troca de ícones gratuitos
    • -
    • Vigilância por agentes secretos
    • -
    • Pessoas paradas detrás de você
    • -
    - - diff --git a/core/res/res/raw-ro-xlarge/incognito_mode_start_page.html b/core/res/res/raw-ro-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 3e499d30039c..000000000000 --- a/core/res/res/raw-ro-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Fereastră incognito nouă - - -

    Navigaţi incognito. Paginile pe care le afişaţi în această fereastră nu vor apărea în istoricul browserului sau al căutărilor şi nu vor lăsa alte urme, precum cookie-uri, pe dispozitivul dvs. după ce închideţi fereastra incognito. Dar fişierele descărcate şi marcajele create vor fi păstrate.

    - -

    Navigarea incognito nu influenţează comportamentul altor persoane, servere sau aplicaţii software. Fiţi atent(ă) la:

    - -
      -
    • site-urile web care colectează sau distribuie informaţii despre dvs.;
    • -
    • furnizorii de servicii de internet sau angajatorii care urmăresc paginile pe care le accesaţi;
    • -
    • aplicaţiile software rău intenţionate care vă urmăresc apăsările pe taste promiţându-vă că vă oferă emoticonuri gratuite;
    • -
    • acţiunile de monitorizare efectuate de agenţi secreţi;
    • -
    • persoanele din spatele dvs.
    • -
    - - diff --git a/core/res/res/raw-ro/incognito_mode_start_page.html b/core/res/res/raw-ro/incognito_mode_start_page.html deleted file mode 100644 index 3e499d30039c..000000000000 --- a/core/res/res/raw-ro/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Fereastră incognito nouă - - -

    Navigaţi incognito. Paginile pe care le afişaţi în această fereastră nu vor apărea în istoricul browserului sau al căutărilor şi nu vor lăsa alte urme, precum cookie-uri, pe dispozitivul dvs. după ce închideţi fereastra incognito. Dar fişierele descărcate şi marcajele create vor fi păstrate.

    - -

    Navigarea incognito nu influenţează comportamentul altor persoane, servere sau aplicaţii software. Fiţi atent(ă) la:

    - -
      -
    • site-urile web care colectează sau distribuie informaţii despre dvs.;
    • -
    • furnizorii de servicii de internet sau angajatorii care urmăresc paginile pe care le accesaţi;
    • -
    • aplicaţiile software rău intenţionate care vă urmăresc apăsările pe taste promiţându-vă că vă oferă emoticonuri gratuite;
    • -
    • acţiunile de monitorizare efectuate de agenţi secreţi;
    • -
    • persoanele din spatele dvs.
    • -
    - - diff --git a/core/res/res/raw-ru-xlarge/incognito_mode_start_page.html b/core/res/res/raw-ru-xlarge/incognito_mode_start_page.html deleted file mode 100644 index ae7b59cacfec..000000000000 --- a/core/res/res/raw-ru-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Новое окно в режиме инкогнито - - -

    Вы перешли в режим инкогнито. Страницы, которые вы просматриваете в окне в режиме инкогнито, не появятся в истории вашего браузера или истории поиска, а также не оставят на вашем компьютере других следов, таких как файлы cookie, когда вы закроете это окно. Тем не менее, все файлы, которые вы загружаете, или закладки, которые вы создаете, останутся в целости и сохранности.

    - -

    Переход в режим инкогнито не влияет на поведение других пользователей, серверов или программ. Опасайтесь:

    - -
      -
    • Веб-сайтов, которые собирают информацию о вас или передают ее другим
    • -
    • Поставщиков услуг Интернета или их сотрудников, которые отслеживают, какие страницы вы посещаете
    • -
    • Вредоносного ПО, которое отслеживает нажатие клавиш клавиатуры в обмен на бесплатные смайлики
    • -
    • Слежки тайными агентами
    • -
    • Людей, которые стоят у вас за спиной
    • -
    - - diff --git a/core/res/res/raw-ru/incognito_mode_start_page.html b/core/res/res/raw-ru/incognito_mode_start_page.html deleted file mode 100644 index ae7b59cacfec..000000000000 --- a/core/res/res/raw-ru/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Новое окно в режиме инкогнито - - -

    Вы перешли в режим инкогнито. Страницы, которые вы просматриваете в окне в режиме инкогнито, не появятся в истории вашего браузера или истории поиска, а также не оставят на вашем компьютере других следов, таких как файлы cookie, когда вы закроете это окно. Тем не менее, все файлы, которые вы загружаете, или закладки, которые вы создаете, останутся в целости и сохранности.

    - -

    Переход в режим инкогнито не влияет на поведение других пользователей, серверов или программ. Опасайтесь:

    - -
      -
    • Веб-сайтов, которые собирают информацию о вас или передают ее другим
    • -
    • Поставщиков услуг Интернета или их сотрудников, которые отслеживают, какие страницы вы посещаете
    • -
    • Вредоносного ПО, которое отслеживает нажатие клавиш клавиатуры в обмен на бесплатные смайлики
    • -
    • Слежки тайными агентами
    • -
    • Людей, которые стоят у вас за спиной
    • -
    - - diff --git a/core/res/res/raw-sk-xlarge/incognito_mode_start_page.html b/core/res/res/raw-sk-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 5b138f1e087c..000000000000 --- a/core/res/res/raw-sk-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nové okno inkognito - - -

    Ste v režime inkognito Stránky, ktoré si pozriete v tomto okne, sa nezobrazia v histórii prehliadača ani v histórii vyhľadávania. Po zavretí okna inkognito na zariadení nezostanú ani žiadne iné stopy, ako sú napr. súbory cookie. Napriek tomu však zostanú zachované všetky prevzaté súbory aj záložky, ktoré ste vytvorili.

    - -

    Režim inkognito neovplyvňuje správanie iných ľudí, serverov ani softvéru. Dávajte si pozor na:

    - -
      -
    • webové stránky, ktoré zbierajú alebo zdieľajú vaše informácie;
    • -
    • poskytovateľov internetových služieb alebo zamestnancov, ktorí sledujú vaše navštívené stránky;
    • -
    • škodlivý softvér, ktorý sleduje ktoré klávesy stláčate výmenou za smajlíkov zadarmo;
    • -
    • sledovanie tajnými agentmi;
    • -
    • ľudí, ktorí stoja za vami.
    • -
    - - diff --git a/core/res/res/raw-sk/incognito_mode_start_page.html b/core/res/res/raw-sk/incognito_mode_start_page.html deleted file mode 100644 index 5b138f1e087c..000000000000 --- a/core/res/res/raw-sk/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nové okno inkognito - - -

    Ste v režime inkognito Stránky, ktoré si pozriete v tomto okne, sa nezobrazia v histórii prehliadača ani v histórii vyhľadávania. Po zavretí okna inkognito na zariadení nezostanú ani žiadne iné stopy, ako sú napr. súbory cookie. Napriek tomu však zostanú zachované všetky prevzaté súbory aj záložky, ktoré ste vytvorili.

    - -

    Režim inkognito neovplyvňuje správanie iných ľudí, serverov ani softvéru. Dávajte si pozor na:

    - -
      -
    • webové stránky, ktoré zbierajú alebo zdieľajú vaše informácie;
    • -
    • poskytovateľov internetových služieb alebo zamestnancov, ktorí sledujú vaše navštívené stránky;
    • -
    • škodlivý softvér, ktorý sleduje ktoré klávesy stláčate výmenou za smajlíkov zadarmo;
    • -
    • sledovanie tajnými agentmi;
    • -
    • ľudí, ktorí stoja za vami.
    • -
    - - diff --git a/core/res/res/raw-sl-xlarge/incognito_mode_start_page.html b/core/res/res/raw-sl-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 33a8b08fed49..000000000000 --- a/core/res/res/raw-sl-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Novo okno brez beleženja zgodovine - - -

    Ste v načinu brez beleženja zgodovine. Strani, ki si jih ogledate v tem oknu, ne bodo prikazane v zgodovini brskalnika ali zgodovini iskanja, prav tako v vaši napravi ne bodo pustile sledi, kot npr. piškotkov, ko zaprete stran, ki jo imate odprto v tem načinu. Datoteke, ki jih prenesete ali zaznamki, ki jih ustvarite, bodo ohranjeni.

    - -

    Funkcije brez beleženja zgodovine ne vplivajo na obnašanje drugih oseb, strežnikov ali programske opreme. Pazite na:

    - -
      -
    • Spletna mesta, ki zbirajo informacije o vas ali jih dajejo v skupno rabo.
    • -
    • Ponudnike internetnih storitev ali zaposlene, ki spremljajo spletna mesta, ki ste jih obiskali.
    • -
    • Zlonamerno programsko opremo, ki spremlja vaše tipkanje, v zameno pa vam ponuja brezplačne čustvene simbole.
    • -
    • Nadzor tajnih agentov.
    • -
    • Osebe, ki stojijo za vašim hrbtom.
    • -
    - - diff --git a/core/res/res/raw-sl/incognito_mode_start_page.html b/core/res/res/raw-sl/incognito_mode_start_page.html deleted file mode 100644 index 33a8b08fed49..000000000000 --- a/core/res/res/raw-sl/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Novo okno brez beleženja zgodovine - - -

    Ste v načinu brez beleženja zgodovine. Strani, ki si jih ogledate v tem oknu, ne bodo prikazane v zgodovini brskalnika ali zgodovini iskanja, prav tako v vaši napravi ne bodo pustile sledi, kot npr. piškotkov, ko zaprete stran, ki jo imate odprto v tem načinu. Datoteke, ki jih prenesete ali zaznamki, ki jih ustvarite, bodo ohranjeni.

    - -

    Funkcije brez beleženja zgodovine ne vplivajo na obnašanje drugih oseb, strežnikov ali programske opreme. Pazite na:

    - -
      -
    • Spletna mesta, ki zbirajo informacije o vas ali jih dajejo v skupno rabo.
    • -
    • Ponudnike internetnih storitev ali zaposlene, ki spremljajo spletna mesta, ki ste jih obiskali.
    • -
    • Zlonamerno programsko opremo, ki spremlja vaše tipkanje, v zameno pa vam ponuja brezplačne čustvene simbole.
    • -
    • Nadzor tajnih agentov.
    • -
    • Osebe, ki stojijo za vašim hrbtom.
    • -
    - - diff --git a/core/res/res/raw-sr-xlarge/incognito_mode_start_page.html b/core/res/res/raw-sr-xlarge/incognito_mode_start_page.html deleted file mode 100644 index b1fbcb1324bd..000000000000 --- a/core/res/res/raw-sr-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Нов прозор без архивирања - - -

    Ушли сте у режим без архивирања Странице које гледате у овом прозору се неће појавити у историји прегледања ни историји претраге, нити ће оставити друге трагове, попут колачића, на вашем уређају када затворите овај прозор. Међутим, ако преузмете датотеке или направите обележиваче, они ће бити сачувани.

    - -

    Режим без архивирања не утиче на понашање других људи, сервера нити софтвера. Чувајте се:

    - -
      -
    • Веб сајтова који прикупљају и деле податке о вама
    • -
    • Добављача интернет услуга или запослених који прате странице које посетите
    • -
    • Злонамерног софтвера који прати шта куцате
    • -
    • Надзора тајних агената
    • -
    • Људи који вам стоје иза леђа
    • -
    - - diff --git a/core/res/res/raw-sr/incognito_mode_start_page.html b/core/res/res/raw-sr/incognito_mode_start_page.html deleted file mode 100644 index b1fbcb1324bd..000000000000 --- a/core/res/res/raw-sr/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Нов прозор без архивирања - - -

    Ушли сте у режим без архивирања Странице које гледате у овом прозору се неће појавити у историји прегледања ни историји претраге, нити ће оставити друге трагове, попут колачића, на вашем уређају када затворите овај прозор. Међутим, ако преузмете датотеке или направите обележиваче, они ће бити сачувани.

    - -

    Режим без архивирања не утиче на понашање других људи, сервера нити софтвера. Чувајте се:

    - -
      -
    • Веб сајтова који прикупљају и деле податке о вама
    • -
    • Добављача интернет услуга или запослених који прате странице које посетите
    • -
    • Злонамерног софтвера који прати шта куцате
    • -
    • Надзора тајних агената
    • -
    • Људи који вам стоје иза леђа
    • -
    - - diff --git a/core/res/res/raw-sv-xlarge/incognito_mode_start_page.html b/core/res/res/raw-sv-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 5ebbb22f409b..000000000000 --- a/core/res/res/raw-sv-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nytt inkognitofönster - - -

    Du använder inkognitoläget. Sidor som du har läst i detta fönster visas inte i din webbläsarhistorik eller sökhistorik. De lämnar inga spår efter sig, till exempel cookies, i din enhet efter att du stängt inkognitofönstret. Alla filer som du hämtar eller bokmärken du skapar sparas dock.

    - -

    Att använda datorn inkognito påverkar inte användare, servrar eller program. Se upp för:

    - -
      -
    • Webbplatser som samlar eller delar information om dig
    • -
    • Internetleverantörer eller arbetsgivare som spårar var du surfar
    • -
    • Skadlig programvara som spårar dina tangenttryckningar som nyckelloggare
    • -
    • Övervakning av hemliga agenter
    • -
    • Personer som står bakom dig
    • -
    - - diff --git a/core/res/res/raw-sv/incognito_mode_start_page.html b/core/res/res/raw-sv/incognito_mode_start_page.html deleted file mode 100644 index 5ebbb22f409b..000000000000 --- a/core/res/res/raw-sv/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Nytt inkognitofönster - - -

    Du använder inkognitoläget. Sidor som du har läst i detta fönster visas inte i din webbläsarhistorik eller sökhistorik. De lämnar inga spår efter sig, till exempel cookies, i din enhet efter att du stängt inkognitofönstret. Alla filer som du hämtar eller bokmärken du skapar sparas dock.

    - -

    Att använda datorn inkognito påverkar inte användare, servrar eller program. Se upp för:

    - -
      -
    • Webbplatser som samlar eller delar information om dig
    • -
    • Internetleverantörer eller arbetsgivare som spårar var du surfar
    • -
    • Skadlig programvara som spårar dina tangenttryckningar som nyckelloggare
    • -
    • Övervakning av hemliga agenter
    • -
    • Personer som står bakom dig
    • -
    - - diff --git a/core/res/res/raw-th-xlarge/incognito_mode_start_page.html b/core/res/res/raw-th-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 29c64eb4c041..000000000000 --- a/core/res/res/raw-th-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - หน้าต่างใหม่ที่ไม่ระบุตัวตน - - -

    คุณได้เข้าสู่โหมดไม่ระบุตัวตนแล้ว หน้าเว็บที่คุณดูในหน้าต่างนี้จะไม่ปรากฏในประวัติของเบราว์เซอร์หรือประวัติการค้นหาของคุณ และจะไม่ทิ้งร่องรอยอื่นๆ เช่น คุกกี้ ไว้บนอุปกรณ์หลังจากที่คุณปิดหน้าต่างที่ไม่ระบุตัวตนนี้แล้ว อย่างไรก็ตาม ไฟล์ที่คุณดาวน์โหลดหรือบุ๊กมาร์กที่สร้างขึ้นจะถูกเก็บไว้

    - -

    การเข้าสู่โหมดไม่ระบุตัวตนจะไม่กระทบต่อการทำงานของบุคคล เซิร์ฟเวอร์ หรือซอฟต์แวร์อื่น โปรดระวัง:

    - -
      -
    • เว็บไซต์ที่เก็บหรือแบ่งปันข้อมูลเกี่ยวกับคุณ
    • -
    • ผู้ให้บริการอินเทอร์เน็ตหรือนายจ้างที่ติดตามหน้าเว็บที่คุณเข้าชม
    • -
    • ซอฟต์แวร์มุ่งร้ายที่ติดตามการกดแป้นพิมพ์โดยมากับของฟรี
    • -
    • การตรวจสอบของหน่วยสืบราชการลับ
    • -
    • บุคคลที่ยืนอยู่ข้างหลังคุณ
    • -
    - - diff --git a/core/res/res/raw-th/incognito_mode_start_page.html b/core/res/res/raw-th/incognito_mode_start_page.html deleted file mode 100644 index 29c64eb4c041..000000000000 --- a/core/res/res/raw-th/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - หน้าต่างใหม่ที่ไม่ระบุตัวตน - - -

    คุณได้เข้าสู่โหมดไม่ระบุตัวตนแล้ว หน้าเว็บที่คุณดูในหน้าต่างนี้จะไม่ปรากฏในประวัติของเบราว์เซอร์หรือประวัติการค้นหาของคุณ และจะไม่ทิ้งร่องรอยอื่นๆ เช่น คุกกี้ ไว้บนอุปกรณ์หลังจากที่คุณปิดหน้าต่างที่ไม่ระบุตัวตนนี้แล้ว อย่างไรก็ตาม ไฟล์ที่คุณดาวน์โหลดหรือบุ๊กมาร์กที่สร้างขึ้นจะถูกเก็บไว้

    - -

    การเข้าสู่โหมดไม่ระบุตัวตนจะไม่กระทบต่อการทำงานของบุคคล เซิร์ฟเวอร์ หรือซอฟต์แวร์อื่น โปรดระวัง:

    - -
      -
    • เว็บไซต์ที่เก็บหรือแบ่งปันข้อมูลเกี่ยวกับคุณ
    • -
    • ผู้ให้บริการอินเทอร์เน็ตหรือนายจ้างที่ติดตามหน้าเว็บที่คุณเข้าชม
    • -
    • ซอฟต์แวร์มุ่งร้ายที่ติดตามการกดแป้นพิมพ์โดยมากับของฟรี
    • -
    • การตรวจสอบของหน่วยสืบราชการลับ
    • -
    • บุคคลที่ยืนอยู่ข้างหลังคุณ
    • -
    - - diff --git a/core/res/res/raw-tl-xlarge/incognito_mode_start_page.html b/core/res/res/raw-tl-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 6ce5853de0cd..000000000000 --- a/core/res/res/raw-tl-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Bagong incognito window - - -

    Nag-incognito ka. Hindi lalabas sa iyong kasaysayan ng pag-browse at kasaysayan ng paghahanap ang mga pahinang tiningnan mo sa window na ito, at hindi sila mag-iiwan ng ibang bakas, gaya ng cookies, sa iyong device matapos mong isara ang window na incognito. Gayunpaman, pananatiliin ang anumang mga file na iyong na-download o ang iyong mga ginawang bookmark.

    - -

    Hindi nakakaapekto ang pagiging incognito sa gawi ng ibang mga tao, server, o software. Maging maingat sa:

    - -
      -
    • Mga website na kumokolekta o nagbabahagi ng impormasyong tungkol sa iyo
    • -
    • Mga internet service provider o mga employer na sinusubaybayan ang mga pahinang binibisita mo
    • -
    • Malicious software na sinusubaybayan ang iyong mga keystroke kapalit ng mga libreng smiley
    • -
    • Pagmamasid ng mga secret agent
    • -
    • Mga tao na nakatayo sa likuran mo
    • -
    - - diff --git a/core/res/res/raw-tl/incognito_mode_start_page.html b/core/res/res/raw-tl/incognito_mode_start_page.html deleted file mode 100644 index 6ce5853de0cd..000000000000 --- a/core/res/res/raw-tl/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Bagong incognito window - - -

    Nag-incognito ka. Hindi lalabas sa iyong kasaysayan ng pag-browse at kasaysayan ng paghahanap ang mga pahinang tiningnan mo sa window na ito, at hindi sila mag-iiwan ng ibang bakas, gaya ng cookies, sa iyong device matapos mong isara ang window na incognito. Gayunpaman, pananatiliin ang anumang mga file na iyong na-download o ang iyong mga ginawang bookmark.

    - -

    Hindi nakakaapekto ang pagiging incognito sa gawi ng ibang mga tao, server, o software. Maging maingat sa:

    - -
      -
    • Mga website na kumokolekta o nagbabahagi ng impormasyong tungkol sa iyo
    • -
    • Mga internet service provider o mga employer na sinusubaybayan ang mga pahinang binibisita mo
    • -
    • Malicious software na sinusubaybayan ang iyong mga keystroke kapalit ng mga libreng smiley
    • -
    • Pagmamasid ng mga secret agent
    • -
    • Mga tao na nakatayo sa likuran mo
    • -
    - - diff --git a/core/res/res/raw-tr-xlarge/incognito_mode_start_page.html b/core/res/res/raw-tr-xlarge/incognito_mode_start_page.html deleted file mode 100644 index c570cc7e645f..000000000000 --- a/core/res/res/raw-tr-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Yeni gizli pencere - - -

    Gizli moda geçtiniz Bu pencerede görüntülediğiniz sayfalar tarayıcı geçmişinizde veya arama geçmişinizde görünmez ve gizli pencereyi kapatmanızın ardından cihazınızda çerezler gibi izler bırakmaz. Ancak, indirdiğiniz dosyalar ve oluşturduğunuz favoriler korunur.

    - -

    Gizli moda geçmeniz diğer kişilerin, sunucuların veya yazılımların davranışlarını etkilemez. Şu konularda dikkatli olun:

    - -
      -
    • Hakkınızda bilgi toplayan veya paylaşan web siteleri
    • -
    • Ziyaret ettiğiniz sayfaları izleyen şirket çalışanları veya servis sağlayıcıları
    • -
    • Ücretsiz ifade simgeleri karşılığında tuş vuruşlarınızı takip eden kötü niyetli yazılımlar
    • -
    • Gizli ajanlar tarafından takip edilme
    • -
    • Arkanızda dikilip ne yaptığınıza bakan kişiler
    • -
    - - diff --git a/core/res/res/raw-tr/incognito_mode_start_page.html b/core/res/res/raw-tr/incognito_mode_start_page.html deleted file mode 100644 index c570cc7e645f..000000000000 --- a/core/res/res/raw-tr/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Yeni gizli pencere - - -

    Gizli moda geçtiniz Bu pencerede görüntülediğiniz sayfalar tarayıcı geçmişinizde veya arama geçmişinizde görünmez ve gizli pencereyi kapatmanızın ardından cihazınızda çerezler gibi izler bırakmaz. Ancak, indirdiğiniz dosyalar ve oluşturduğunuz favoriler korunur.

    - -

    Gizli moda geçmeniz diğer kişilerin, sunucuların veya yazılımların davranışlarını etkilemez. Şu konularda dikkatli olun:

    - -
      -
    • Hakkınızda bilgi toplayan veya paylaşan web siteleri
    • -
    • Ziyaret ettiğiniz sayfaları izleyen şirket çalışanları veya servis sağlayıcıları
    • -
    • Ücretsiz ifade simgeleri karşılığında tuş vuruşlarınızı takip eden kötü niyetli yazılımlar
    • -
    • Gizli ajanlar tarafından takip edilme
    • -
    • Arkanızda dikilip ne yaptığınıza bakan kişiler
    • -
    - - diff --git a/core/res/res/raw-uk-xlarge/incognito_mode_start_page.html b/core/res/res/raw-uk-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 8852854b4110..000000000000 --- a/core/res/res/raw-uk-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Нове анонімне вікно - - -

    Ви в анонімному режимі. Сторінки, які ви переглядаєте в цьому вікні, не з’являться в історії веб-переглядача чи в історії пошуку. Вони також не залишать жодних слідів, як-от файлів cookie, у вашому пристрої після того, як ви закриєте анонімне вікно. Однак, завантажені файли та збережені закладки залишаться.

    - -

    Анонімний режим не впливає на поведінку інших людей, серверів чи програмного забезпечення. Остерігайтеся:

    - -
      -
    • веб-сайтів, які збирають чи поширюють інформацію про вас
    • -
    • постачальників інтернет-послуг або роботодавців, які відстежують сторінки, які ви відвідуєте
    • -
    • зловмисного програмного забезпечення, яке пропонує безкоштовні смайли, натомість реєструючи клавіші, які ви натискаєте
    • -
    • нагляду збоку секретних служб
    • -
    • людей за вашою спиною
    • -
    - - diff --git a/core/res/res/raw-uk/incognito_mode_start_page.html b/core/res/res/raw-uk/incognito_mode_start_page.html deleted file mode 100644 index 8852854b4110..000000000000 --- a/core/res/res/raw-uk/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Нове анонімне вікно - - -

    Ви в анонімному режимі. Сторінки, які ви переглядаєте в цьому вікні, не з’являться в історії веб-переглядача чи в історії пошуку. Вони також не залишать жодних слідів, як-от файлів cookie, у вашому пристрої після того, як ви закриєте анонімне вікно. Однак, завантажені файли та збережені закладки залишаться.

    - -

    Анонімний режим не впливає на поведінку інших людей, серверів чи програмного забезпечення. Остерігайтеся:

    - -
      -
    • веб-сайтів, які збирають чи поширюють інформацію про вас
    • -
    • постачальників інтернет-послуг або роботодавців, які відстежують сторінки, які ви відвідуєте
    • -
    • зловмисного програмного забезпечення, яке пропонує безкоштовні смайли, натомість реєструючи клавіші, які ви натискаєте
    • -
    • нагляду збоку секретних служб
    • -
    • людей за вашою спиною
    • -
    - - diff --git a/core/res/res/raw-vi-xlarge/incognito_mode_start_page.html b/core/res/res/raw-vi-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 9902cdef45cb..000000000000 --- a/core/res/res/raw-vi-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Cửa sổ ẩn danh mới - - -

    Bạn đã sử dụng cửa sổ ẩn danh. Các trang bạn xem trong cửa sổ này sẽ không xuất hiện trong lịch sử của trình duyệt hoặc lịch sử tìm kiếm và chúng cũng không để lại dấu vết như cookie trên thiết bị sau khi bạn đóng cửa sổ ẩn danh. Tuy nhiên, mọi tệp bạn tải xuống hoặc mọi dấu trang bạn tạo sẽ được giữ nguyên.

    - -

    Sử dụng cửa sổ ẩn danh không ảnh hưởng đến hành vi của người khác, của máy chủ hoặc phần mềm. Hãy cảnh giác với:

    - -
      -
    • Các trang web thu thập hoặc chia sẻ thông tin về bạn
    • -
    • Nhà cung cấp dịch vụ Internet hoặc ông chủ muốn theo dõi những trang bạn đã truy cập
    • -
    • Phần mềm độc hại theo dõi thao tác gõ phím khi nhập các mặt cười
    • -
    • Sự theo dõi của các cơ quan tình báo
    • -
    • Những người đứng đằng sau bạn
    • -
    - - diff --git a/core/res/res/raw-vi/incognito_mode_start_page.html b/core/res/res/raw-vi/incognito_mode_start_page.html deleted file mode 100644 index 9902cdef45cb..000000000000 --- a/core/res/res/raw-vi/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - Cửa sổ ẩn danh mới - - -

    Bạn đã sử dụng cửa sổ ẩn danh. Các trang bạn xem trong cửa sổ này sẽ không xuất hiện trong lịch sử của trình duyệt hoặc lịch sử tìm kiếm và chúng cũng không để lại dấu vết như cookie trên thiết bị sau khi bạn đóng cửa sổ ẩn danh. Tuy nhiên, mọi tệp bạn tải xuống hoặc mọi dấu trang bạn tạo sẽ được giữ nguyên.

    - -

    Sử dụng cửa sổ ẩn danh không ảnh hưởng đến hành vi của người khác, của máy chủ hoặc phần mềm. Hãy cảnh giác với:

    - -
      -
    • Các trang web thu thập hoặc chia sẻ thông tin về bạn
    • -
    • Nhà cung cấp dịch vụ Internet hoặc ông chủ muốn theo dõi những trang bạn đã truy cập
    • -
    • Phần mềm độc hại theo dõi thao tác gõ phím khi nhập các mặt cười
    • -
    • Sự theo dõi của các cơ quan tình báo
    • -
    • Những người đứng đằng sau bạn
    • -
    - - diff --git a/core/res/res/raw-xlarge/incognito_mode_start_page.html b/core/res/res/raw-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 492658d29484..000000000000 --- a/core/res/res/raw-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - New incognito tab - - -

    You've gone incognito. Pages you view in this tab - won't appear in your browser history or search history, and they won't - leave other traces, like cookies, on your device after you close the - incognito tab. Any files you download or bookmarks you create will be - preserved, however.

    - -

    Going incognito doesn't affect the behavior of other people, - servers, or software. Be wary of:

    - -
      -
    • Websites that collect or share information about you
    • -
    • Internet service providers or employers that track the pages you visit
    • -
    • Malicious software that tracks your keystrokes in exchange for free smileys
    • -
    • Surveillance by secret agents
    • -
    • People standing behind you
    • -
    - - diff --git a/core/res/res/raw-zh-rCN-xlarge/incognito_mode_start_page.html b/core/res/res/raw-zh-rCN-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 2caf8f8bc807..000000000000 --- a/core/res/res/raw-zh-rCN-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - 新建隐身窗口 - - -

    您已进入隐身模式。当关闭隐身窗口后,您在此窗口中查看的网页将不会出现在您的浏览器历史记录或搜索记录中,也不会在您的设备留下任何踪迹(如 cookie)。但是,您下载的任何文件或您创建的书签会予以保留。

    - -

    进入隐身模式不会影响他人、其他服务器或软件的行为。敬请提防:

    - -
      -
    • 搜集并分享有关您的信息的网站
    • -
    • 跟踪您所访问的网页的互联网服务提供商或雇主
    • -
    • 跟踪您的键盘输入内容以换取免费表情符号的恶意软件
    • -
    • 对您进行监视的秘密代理
    • -
    • 站在您身后的人
    • -
    - - diff --git a/core/res/res/raw-zh-rCN/incognito_mode_start_page.html b/core/res/res/raw-zh-rCN/incognito_mode_start_page.html deleted file mode 100644 index 2caf8f8bc807..000000000000 --- a/core/res/res/raw-zh-rCN/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - 新建隐身窗口 - - -

    您已进入隐身模式。当关闭隐身窗口后,您在此窗口中查看的网页将不会出现在您的浏览器历史记录或搜索记录中,也不会在您的设备留下任何踪迹(如 cookie)。但是,您下载的任何文件或您创建的书签会予以保留。

    - -

    进入隐身模式不会影响他人、其他服务器或软件的行为。敬请提防:

    - -
      -
    • 搜集并分享有关您的信息的网站
    • -
    • 跟踪您所访问的网页的互联网服务提供商或雇主
    • -
    • 跟踪您的键盘输入内容以换取免费表情符号的恶意软件
    • -
    • 对您进行监视的秘密代理
    • -
    • 站在您身后的人
    • -
    - - diff --git a/core/res/res/raw-zh-rTW-xlarge/incognito_mode_start_page.html b/core/res/res/raw-zh-rTW-xlarge/incognito_mode_start_page.html deleted file mode 100644 index 54eb40bbecd0..000000000000 --- a/core/res/res/raw-zh-rTW-xlarge/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - 新的無痕式視窗 - - -

    您已開啟無痕式視窗。透過這個視窗開啟的網頁都不會出現在瀏覽器記錄和搜尋記錄中,而且您關閉此類視窗之後,裝置上並不會保留任何相關記錄 (例如 cookie)。不過系統會保存您的下載檔案和書籤。

    - -

    無痕式視窗無法掌控人、伺服器和軟體的行為,所以請小心下列的人事物:

    - -
      -
    • 會收集或分享您的相關資訊的網站
    • -
    • 會追蹤您造訪網頁的網路服務供應商或雇主
    • -
    • 以免費下載為誘因引誘您點擊的連結,其中通常隱藏鍵盤記錄惡意軟體
    • -
    • 情報特務的監控
    • -
    • 站在您身後的人
    • -
    - - diff --git a/core/res/res/raw-zh-rTW/incognito_mode_start_page.html b/core/res/res/raw-zh-rTW/incognito_mode_start_page.html deleted file mode 100644 index 54eb40bbecd0..000000000000 --- a/core/res/res/raw-zh-rTW/incognito_mode_start_page.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - 新的無痕式視窗 - - -

    您已開啟無痕式視窗。透過這個視窗開啟的網頁都不會出現在瀏覽器記錄和搜尋記錄中,而且您關閉此類視窗之後,裝置上並不會保留任何相關記錄 (例如 cookie)。不過系統會保存您的下載檔案和書籤。

    - -

    無痕式視窗無法掌控人、伺服器和軟體的行為,所以請小心下列的人事物:

    - -
      -
    • 會收集或分享您的相關資訊的網站
    • -
    • 會追蹤您造訪網頁的網路服務供應商或雇主
    • -
    • 以免費下載為誘因引誘您點擊的連結,其中通常隱藏鍵盤記錄惡意軟體
    • -
    • 情報特務的監控
    • -
    • 站在您身後的人
    • -
    - - diff --git a/core/res/res/raw/incognito_mode_start_page.html b/core/res/res/raw/incognito_mode_start_page.html deleted file mode 100644 index 5d7a3fbf98c0..000000000000 --- a/core/res/res/raw/incognito_mode_start_page.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - New incognito window - - -

    You've gone incognito. Pages you view in this window - won't appear in your browser history or search history, and they won't - leave other traces, like cookies, on your device after you close the - incognito window. Any files you download or bookmarks you create will be - preserved, however.

    - -

    Going incognito doesn't affect the behavior of other people, - servers, or software. Be wary of:

    - -
      -
    • Websites that collect or share information about you
    • -
    • Internet service providers or employers that track the pages you visit
    • -
    • Malicious software that tracks your keystrokes in exchange for free smileys
    • -
    • Surveillance by secret agents
    • -
    • People standing behind you
    • -
    - - diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 4b59f21ec69a..e34d0dce9bd8 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Verbindingsprobleem of ongeldige MMI-kode." "Bewerking is beperk tot belbeperking-nommers." + "Kan oproep-aanstuurinstellings nie van jou foon af verander tewyl jy swerf nie." "Diens is geaktiveer." "Diens geaktiveer vir:" "Diens is gedeaktiveer." @@ -96,6 +97,8 @@ "Stem/data-dienste is geblokkeer." "Stem-/SMS-dienste is geblokkeer." "Alle stem-/data-/SMS-dienste is geblokkeer." + "Kan netwerk nie bereik nie" + "Probeer om die soort te verander wat jy by Instellings > Sellulêre netwerke > Voorkeurnetwerksoort kies, om ontvangs te verbeter." "Ander party het TTY-modus VOL versoek" "Ander party het TTY-modus GOD versoek" "Ander party het TTY-modus SOD versoek" @@ -179,6 +182,8 @@ "Werkprofiel is uitgevee weens ontbrekende administrasieprogram." "Die werkprofiel se administrasieprogram ontbreek of is korrup. Gevolglik is jou werkprofiel en verwante data uitgevee. Kontak jou administrateur vir bystand." "Jou werkprofiel is nie meer op hierdie toestel beskikbaar nie." + "Netwerkverkeer word gemonitor" + "Tik om meer te wete te kom" "Jou toestel sal uitgevee word" "Die administrasieprogram kort komponente of is korrup en kan nie gebruik word nie. Jou toestel sal nou uitgevee word. Kontak jou administrateur vir bystand." "Ek" @@ -1208,6 +1213,8 @@ "Laat \'n program toe om installasiesessies te lees. Dit laat dit toe om besonderhede van aktiewe pakketinstallasies te sien." "versoek installeerpakkette" "Laat \'n program toe om te versoek dat pakkette geïnstalleer word." + "vra om batteryoptimerings te ignoreer" + "Laat \'n program toe om toestemming te vra om batteryoptimerings vir daardie program ignoreer." "Klop twee keer vir zoembeheer" "Kon nie legstuk byvoeg nie." "Gaan" @@ -1558,7 +1565,7 @@ "Kies jaar" "%1$s uitgevee" "Werk-%1$s" - "Raak en hou Terug om hierdie skerm te ontspeld." + "Raak en hou Terug en Oorsig om hierdie skerm te ontspeld." "Program is vasgespeld: Dit mag nie op hierdie toestel ontspeld word nie." "Skerm vasgespeld" "Skerm ontspeld" diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 54bddc753e3b..eb1208824d44 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "የተያያዥ ችግር ወይም ትክከል ያልሆነየMMI ኮድ ባህሪ።" "ክዋኔ ለቋሚ መደወያ ቁጥሮች ብቻ ተገድቧል።" + "Can not change call forwarding settings from your phone while you are roaming." "አገልግሎት ነቅቶ ነበር።" "ለ፡ አገልግሎት ነቅቶ ነበር" "አገልግሎቱ ቦዝኗል።" @@ -96,6 +97,8 @@ "ድምፅ/ውሂብ አገልግሎቶች ታግደዋል።" "ድምፅ/SMS አገልግሎቶች ታግደዋል።" "ሁሉም ድምጽ/ውሂብ/ኤስ ኤም ኤስ አገልግሎቶች ታግደዋል።" + "አውታረ መረብ ላይ መድረስ አይቻልም" + "ቅበላን ለማሻሻል የተመረጠውን ዓይነት በቅንብሮች > ተንቀሳቃሽ አውታረ መረቦች > ተመራጭ የአውታረ መረብ ዓይነት ላይ ለመለወጥ ይሞክሩ።" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ FULL ጠይቋል" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ HCO ጠይቋል" "ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ VCO ጠይቋል" @@ -179,6 +182,8 @@ "በጎደለ የአስተዳዳሪ መተግበሪያ ምክንያት የስራ መገለጫ ተሰርዟል።" "የስራ መገለጫ አስተዳዳሪ መተግበሪያው ወይም ይጎድላል ወይም ተበላሽቷል። በዚህ ምክንያት የስራ መገለጫዎ እና ተዛማጅ ውሂብ ተሰርዘዋል። እርዳታን ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" "የስራ መገለጫዎ ከዚህ በኋላ በዚህ መሳሪያ ላይ አይገኝም።" + "የአውታረ መረብ ክትትል እየተደረገበት ነው" + "የበለጠ ለመረዳት መታ ያድርጉ" "የእርስዎ መሣሪያ ይደመሰሳል" "የአስተዳዳሪ መተግበሪያው ክፍሎች ይጎድሉታል ወይም ተበላሽቷል፣ እና ስራ ላይ መዋል አይችልም። የእርስዎ መሣሪያ አሁን ይደመሰሳል። እርዳታ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" "እኔ" @@ -1208,6 +1213,8 @@ "መተግበሪያው የመጫን ክፍለ ጊዜዎችን እንዲያነብ ይፈቅድለታል። ይህም ስለ ገቢር የጥቅል ጭነቶች ዝርዝር መረጃን እንዲያይ ይፈቅድለታል።" "የጭነት ጥቅሎችን መጠየቅ" "መተግበሪያ የጥቅሎች መጫንን እንዲጠይቅ ይፈቅዳል።" + "የባትሪ ማትባቶችን ችላ ለማለት መጠየቅ" + "አንድ መተግበሪያ ለዚያ መተግበሪያ የባትሪ ማትባቶችን ችላ ለማለት እንዲጠይቅ ይፈቅድለታል።" "ለአጉላ መቆጣጠሪያ ሁለት ጊዜ ነካ አድርግ" "ምግብር ማከል አልተቻለም።" "ሂድ" @@ -1558,7 +1565,7 @@ "ዓመት ይምረጡ" "%1$s ተሰርዟል" "ስራ %1$s" - "ይህን ማያ ገጽ ለመንቀል ተመለስን ይንኩትና ያዙት።" + "ይህን ማያ ገጽ ለመንቀል ተመለስ እና አጠቃላይ እይታን ተጭነው ይያዙ።" "መተግበሪያ ተሰክቷል፦ በዚህ መሣሪያ ላይ ማላቀቅ አይፈቀድም።" "ማያ ገጽ ተሰክቷል" "ማያ ገጽ ተነቅሏል" diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 493170bf7c0c..74b145bcca31 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "‏حدثت مشكلة في الاتصال أو أن كود MMI غير صحيح." "تم تقييد التشغيل لأرقام الاتصال الثابت فقط." + "يتعذر تغيير إعدادات إعادة توجيه المكالمات من هاتفك أثناء التجوال." "تم تمكين الخدمة." "تم تمكين الخدمة لـ:" "تم تعطيل الخدمة." @@ -100,6 +101,8 @@ "خدمات الصوت/البيانات محظورة." "‏خدمات الصوت/الرسائل القصيرة SMS محظورة." "‏جميع خدمات الصوت/البيانات/الرسائل القصيرة SMS محظورة." + "يتعذر الوصول إلى الشبكة" + "لتحسين الاستقبال، يمكنك تجربة تغيير النوع المحدّد في الإعدادات > شبكات الجوّال > نوع الشبكة المفضَّل." "‏طلب النظير وضع TTY الكامل" "‏طلب النظير وضع TTY على HCO" "‏طلب النظير وضع TTY على VCO" @@ -187,6 +190,8 @@ "تم حذف الملف الشخصي للعمل نتيجة فقد تطبيق المشرف." "تطبيق المشرف للملف الشخصي للعمل مفقود أو تالف لذا تم حذف الملف والبيانات ذات الصلة. اتصل بالمشرف للحصول على المساعدة." "لم يعد ملفك الشخصي للعمل متاحًا على هذا الجهاز." + "تتم مراقبة حركة بيانات الشبكة" + "انقر لمعرفة المزيد من المعلومات" "سيتم محو بيانات جهازك." "تطبيق المشرف فاقد لمكونات أو تالف ويتعذر استخدامه. سيتم محو بيانات جهازك الآن. اتصل بالمشرف للحصول على المساعدة." "أنا" @@ -783,7 +788,7 @@ "تأكيد الانتقال" "مغادرة هذه الصفحة" "البقاء في هذه الصفحة" - "%s\n\nهل تريد بالتأكيد الانتقال بعيدًا عن هذه الصفحة؟" + "%s\n\nهل تريد فعلًا الانتقال بعيدًا عن هذه الصفحة؟" "تأكيد" "نصيحة: اضغط مرتين للتكبير والتصغير." "ملء تلقائي" @@ -1308,6 +1313,8 @@ "للسماح لأحد التطبيقات بقراءة جلسات التثبيت. ويسمح لك هذا بالاطلاع على تفاصيل بشأن عمليات تثبيت الحزم النشطة." "طلب حزم التثبيت" "للسماح لتطبيق ما بطلب تثبيت الحزم." + "طلب تجاهل تحسينات البطارية" + "للسماح للتطبيق بطلب الإذن لتجاهل تحسينات البطارية في هذا التطبيق." "اضغط مرتين للتحكم في التكبير/التصغير" "تعذرت إضافة أداة." "تنفيذ" @@ -1666,7 +1673,7 @@ "تحديد العام" "تم حذف %1$s" "%1$s المخصص للعمل" - "لإزالة تثبيت هذه الشاشة، يمكنك لمس زر الرجوع مع الاستمرار." + "لإزالة تثبيت هذه الشاشة، يمكنك لمس زر \"رجوع\" و\"نظرة عامة\" مع الاستمرار." "التطبيق مقيد: ولا يسمح بإلغاء التقييد على هذا الجهاز." "تم تثبيت الشاشة" "تم إلغاء تثبيت الشاشة" diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index 7c3f2a44eef0..4dd9a79a26ba 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Bağlantı problemi və ya yalnış MM kodu." "Əməliyyat yalnız sabit nömrələrə yığımla məhdudlaşıb." + "Roaminqdə olarkən zəng yönləndirmə ayarlarını telefonunuzdan dəyişə bilməz." "Servis işə salındı." "Xidmət aktiv edilmişdir:" "Xidmət deaktiv edilib." @@ -96,6 +97,8 @@ "Səs/data xidmətləri bloklanıb." "Səs/SMS xidmətləri bloklanıb." "Bütün səs/data/SMS xidmətləri bağlıdır." + "Şəbəkəyə daxil olmaq mümkün deyil" + "Qəbulu inkişaf etdirmək üçün, Ayarlar > Mobil Şəbəkə > Tərcih edilən şəbəkə növü bölməsindən seçilmiş növü dəyişməyə çalışın." "Eskpert TTY Rejimi FULL-u sorğuladı" "Ekspert TTY Rejimi HCO-nu sorğuladı" "Ekspert TTY Rejimi VCO-nu sorğuladı" @@ -179,6 +182,8 @@ "İnzibatçı proqramı olmadığından iş profili silindi." "İnzibatçı proqramın iş profili ya yoxdur, ya da korlanıb. Nəticədə iş profiliniz və onunla bağlı məlumatlar silinib. Yardım üçün inzibatçınızla əlaqə saxlayın." "İş profiliniz daha bu cihazda əlçatan deyil." + "Şəbəkə trafikinə nəzarət edilir" + "Ətraflı məlumat üçün klikləyin" "Cihazınız təmizlənəcəkdir" "İnzibatçı proqramında komponentlər yoxdur və ya korlanıb və istifadə oluna bilməz. Cihazınız indi təmizlənəcəkdir. Yardım üçün inzibatçınızla əlaqə saxlayın." "Mən" @@ -1208,6 +1213,8 @@ "Tətbiqə quraşdırma sessiyalarını oxumağa yardım edir. Bu da aktiv paket quraşdırmaları haqqında məlumatları görməyə imkan verir." "paketləri quraşdırma sorğusu" "Tətbiqə paketləri quraşdırma sorğusu göndərməyə icazə verir." + "batareya optimallaşdırmasını iqnor etmək üçün soruşun" + "Tatareya optimallaşdırılmasını o tətbiq üçün iqnor edilməsinə icazə vermək məqsədilə soruşmağa tətbiqə icazə verilir." "Zoom kontrolu üçün iki dəfə toxunun" "Widget əlavə edilə bilmədi." "Get" @@ -1558,7 +1565,7 @@ "İl seçin" "%1$s silindi" "İş %1$s" - "Sancağı götürmək üçün Geri düyməsinə toxunun və saxlayın." + "Sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın" "Tətbiq sancılıb: Açmağa bu cihazda icazə verilmir." "Screen pinned" "Screen unpinned" diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 50e1327f4a9c..b1146f394533 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problemi sa vezom ili nevažeći MMI kôd." "Rad je ograničen samo na brojeve fiksnog biranja." + "Ne možete da promenite podešavanja preusmeravanja poziva sa telefona dok ste u romingu." "Usluga je omogućena." "Usluga je omogućena za:" "Usluga je onemogućena." @@ -97,6 +98,8 @@ "Glasovna usluga/usluga prenosa podataka su blokirane." "Glasovna usluga i SMS usluga su blokirane." "Sve glasovne i SMS usluge, kao i usluge prenosa podataka su blokirane." + "Povezivanje sa mrežom nije uspelo" + "Da biste poboljšali prijem, probajte da promenite izabrani tip u odeljku Podešavanja > Mobilne mreže > Željeni tip mreže." "Korisnik zahteva POTPUN režim TTY" "Korisnik zahteva PRENOS ZVUKA za režim TTY" "Korisnik zahteva PRENOS GLASA za režim TTY" @@ -181,6 +184,8 @@ "Poslovni profil je izbrisan jer nedostaje administratorska aplikacija." "Administratorska aplikacija poslovnog profila nedostaje ili je oštećena. Zbog toga su vaš poslovni profil i povezani podaci izbrisani. Obratite se administratoru za pomoć." "Profil za Work više nije dostupan na ovom uređaju." + "Mrežni saobraćaj se prati" + "Dodirnite da biste saznali više" "Uređaj će biti obrisan" "Administratorskoj aplikaciji nedostaju neke komponente ili je oštećena i ne može da se koristi. Uređaj će sada biti obrisan. Obratite se administratoru za pomoć." "Ja" @@ -371,7 +376,7 @@ "slanje komandi na SIM" "Omogućava aplikaciji da šalje komande SIM kartici. To je veoma opasno." "snimanje fotografija i video snimaka" - "Dozvoljava aplikaciji da snima slike i video snimke kamerom. Ova dozvola omogućava aplikaciji da u bilo kom trenutku koristi kameru bez vaše potvrde." + "Dozvoljava aplikaciji da snima slike i video kamerom. Ova dozvola omogućava aplikaciji da u bilo kom trenutku koristi kameru bez vaše potvrde." "kontrola vibracije" "Dozvoljava aplikaciji da kontroliše vibraciju." "direktno pozivanje brojeva telefona" @@ -1233,6 +1238,8 @@ "Dozvoljava aplikaciji da čita sesije instaliranja. To joj dozvoljava da vidi detalje o aktivnim instalacijama paketa." "zahtevanje paketa za instaliranje" "Omogućava da aplikacija zahteva instalaciju paketa." + "traženje dozvole za ignorisanje optimizacija baterije" + "Dozvoljava aplikaciji da traži dozvolu za ignorisanje optimizacija baterije za tu aplikaciju." "Dodirnite dvaput za kontrolu zumiranja" "Nije moguće dodati vidžet." "Idi" @@ -1585,7 +1592,7 @@ "Izaberite godinu" "Izbrisali ste %1$s" "%1$s na poslu" - "Da biste otkačili ovaj ekran, dodirnite i zadržite Nazad." + "Da biste otkačili ovaj ekran, dodirnite i zadržite Nazad i Pregled." "Aplikacija je zakačena: otkačinjanje nije dozvoljeno na ovom uređaju." "Ekran je zakačen" "Ekran je otkačen" diff --git a/core/res/res/values-be-rBY/strings.xml b/core/res/res/values-be-rBY/strings.xml index cadc0bc9ebd4..715141400a97 100644 --- a/core/res/res/values-be-rBY/strings.xml +++ b/core/res/res/values-be-rBY/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Праблема падлучэння ці няправільны код MMI." "Выкарыстанне абмежаванае толькі дазволенымі нумарамі." + "Немагчыма змяніць налады пераадрасацыі выклікаў з тэлефона, пакуль вы знаходзіцеся ў роўмінгу." "Служба была ўключана." "Служба была ўключана для:" "Служба была адключаная." @@ -98,6 +99,8 @@ "Службы перадачы голаса/дадзеных заблакаваны." "Службы перадачы голаса і SMS заблакаваныя." "Усе службы перадачы дадзеных, галасавыя і SMS-службы заблакаваны." + "Немагчыма падключыцца да сеткі" + "Каб палепшыць якасць прыёму, паспрабуйце змяніць тып, выбраны ў меню \"Налады > Сотавыя сеткі > Прыярытэтны тып сеткі\"." "Аднарангавая прылада запытала рэжым TTY FULL" "Аднарангавая прылада запытала рэжым TTY НСО" "Аднарангавая прылада запытала рэжым TTY VCO" @@ -183,6 +186,8 @@ "Рабочы профіль выдалены з-за адсутнасці праграмы адміністравання." "Праграма для адміністравання рабочага профілю адсутнічае або пашкоджана. У выніку гэтага ваш рабочы профіль і звязаныя з ім даныя былі выдаленыя. Звярніцеся па дапамогу да адміністратара." "Ваш працоўны профіль больш не даступны на гэтай прыладзе." + "Сеткавы трафік адсочваецца" + "Дакраніцеся, каб даведацца больш" "Даныя вашай прылады будуць сцерты" "Праграма для адміністравання не можа быць выкарыстана, таму што ў яе адсутнічаюць кампаненты або яна пашкоджана. Зараз даныя вашай прылады будуць сцерты. Звярніцеся па дапамогу да адміністратара." "Я" @@ -1258,6 +1263,8 @@ "Дазваляе праграме счытваць сеансы ўсталёўкі. Гэта дазваляе ёй праглядаць інфармацыю аб актыўных усталёўках пакета." "запытваць усталёўку пакетаў" "Дазваляе праграме запытваць усталёўку пакетаў." + "запытваць дазвол на ігнараванне аптымізацыі акумулятара" + "Дазваляе праграме запытваць дазвол на ігнараванне аптымізацыі акумулятара для гэтай праграмы." "Націсніце двойчы, каб кіраваць маштабаваннем" "Немагчыма дадаць віджэт." "Пачаць" @@ -1612,7 +1619,7 @@ "Выберыце год" "Выдалена: %1$s" "%1$s (праца)" - "Каб адмацаваць гэты экран, дакраніцеся і ўтрымлівайце кнопку \"Назад\"." + "Каб адмацаваць гэты экран, дакраніцеся і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\"." "Праграма замацавана: адмацаванне на гэтай прыладзе не дапускаецца." "Экран замацаваны" "Экран адмацаваны" diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 4d8915b46202..4def3fe3ebb7 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Има проблем с връзката или MMI кодът е невалиден." "Операцията е ограничена само до фиксираните номера за набиране." + "Докато сте в режим на роуминг, настройките за пренасочване на обажданията не могат да се променят от телефона ви." "Услугата бе активирана." "Услугата бе активирана за:" "Услугата бе деактивирана." @@ -96,6 +97,8 @@ "Услугите за глас или данни са блокирани." "Услугите за глас и SMS са блокирани." "Всички услуги за глас/данни/SMS са блокирани." + "Не може да се установи връзка с мрежата" + "За да подобрите сигнала, променете избрания тип от „Настройки“ > „Клетъчни мрежи“ > „Предпочитан тип мрежа“." "Отсрещният потребител заяви пълен TTY режим (FULL)" "Отсрещният потребител заяви TTY режим с пренос на слух (HCO)" "Отсрещният потребител заяви TTY режим с пренос на глас (VCО)" @@ -179,6 +182,8 @@ "Служебният потребителски профил е изтрит поради липса на администраторско приложение." "Администраторското приложение на служебния потребителски профил липсва или е повредено. В резултат на това той и свързаните с него данни са изтрити. За съдействие се свържете с администратора си." "Служебният ви потребителски профил вече не е налице на това устройство." + "Трафикът в мрежата се следи" + "Докоснете, за да научите повече" "Данните на устройството ви ще бъдат изтрити" "В администраторското приложение липсват компоненти или то е невалидно и не може да се използва. Сега данните на устройството ви ще бъдат изтрити. Свържете се с администратора си за съдействие." "Аз" @@ -250,15 +255,15 @@ "Календар" "има достъп до календара ви" "SMS" - "изпраща и преглежда SMS съобщения" + "да изпраща и преглежда SMS съобщения" "Съхранение" - "има достъп до снимките, мултимедията и файловете на устройството ви" + "да има достъп до снимките, мултимедията и файловете на устройството ви" "Микрофон" "записва звук" "Камера" - "прави снимки и записва видеоклипове" + "да прави снимки и записва видеоклипове" "Телефон" - "извършва телефонни обаждания и да ги управлява" + "да извършва телефонни обаждания и да ги управлява" "Телесни сензори" "достъп до сензорните данни за жизнените ви показатели" "Извличане на съдържанието от прозореца" @@ -1208,6 +1213,8 @@ "Разрешава на приложението да чете сесии за инсталиране. Това му позволява да вижда подробности за активните инсталирания на пакети." "заявка на пакети за инсталиране" "Разрешава на приложението да заявява инсталиране на пакети." + "искане за пренебрегване на оптимизациите на батерията" + "Разрешава на дадено приложение да иска разрешение за пренебрегване на свързаните с него оптимизации на батерията." "Докоснете двукратно за управление на промяната на мащаба" "Приспособлението не можа да бъде добавено." "Старт" @@ -1234,7 +1241,7 @@ "Тапет" "Промяна на тапета" "Слушател на известия" - "Приемател за виртуална реалност" + "Приемател за VR" "Доставчик на условия" "Услуга за класифициране на известията" "VPN е активирана" @@ -1558,7 +1565,7 @@ "Избиране на година" "Изтрихте %1$s" "%1$s за работа" - "За да освободите този екран, докоснете и задръжте бутона за връщане назад." + "За да освободите този екран, докоснете и задръжте бутона за връщане назад и този за общ преглед." "Приложението е фиксирано. Освобождаването му не е разрешено на това устройство." "Екранът е фиксиран" "Екранът е освободен" diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index 8d893e53a91c..3c8d3bce4627 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "সংযোগ সমস্যা বা অবৈধ MMI কোড৷" "নির্দিষ্ট নম্বরে ডায়ালযোগ্য হিসাবে প্রক্রিয়াটি সীমিত করা হয়েছে৷" + "আপনি রোমিংয়ে থাকাকালীন আপনার ফোন থেকে \'কল ফরওয়ার্ড করার সেটিংস\' পরিবর্তন করা যাবে না৷" "পরিষেবা সক্ষম করা ছিল৷" "এর জন্য পরিষেবার সক্ষম করা ছিল:" "পরিষেবা অক্ষম করা হয়েছে৷" @@ -62,8 +63,8 @@ "সিম কার্ড অবরোধ মুক্ত করতে PUK2 লিখুন৷" "অসফল, সিম/RUIM লক সক্ষম করুন৷" - আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে এটির পরেই আপনার SIM লক হয়ে যাবে৷ - আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে এটির পরেই আপনার SIM লক হয়ে যাবে৷ + আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে এটির পরেই আপনার সিম লক হয়ে যাবে৷ + আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে এটির পরেই আপনার সিম লক হয়ে যাবে৷ "IMEI" "MEID" @@ -96,6 +97,8 @@ "ভয়েস/ডেটা পরিষেবাগুলি অবরুদ্ধ করা হয়েছে৷" "ভয়েস/SMS পরিষেবা অবরুদ্ধ করা আছে৷" "সমস্ত ভয়েস/ডেটা/SMS পরিষেবা অবরুদ্ধ করা হয়েছে৷" + "নেটওয়ার্কের সিগন্যাল নেই" + "রিসেপশন উন্নত করতে সেটিংস > সেলুলার নেটওয়ার্ক > পছন্দের নেটওয়ার্কের প্রকার এ নির্বাচিত প্রকারটি পরিবর্তন করার চেষ্টা করুন৷" "পির TTY মোড FULL অনুরোধ করেছে" "পির TTY মোড HCO অনুরোধ করেছে" "পির TTY মোড VCO অনুরোধ করেছে" @@ -179,6 +182,8 @@ "প্রশাসক অ্যাপ্লিকেশান অনুপস্থিত থাকায় কাজের প্রোফাইল মুছে ফেলা হয়েছে৷" "কাজের প্রোফাইলের প্রশাসক অ্যাপ্লিকেশান হয় অনুপস্থিত বা ক্ষতিগ্রস্ত হয়েছে৷ এর ফলস্বরূপ আপনার কাজের প্রোফাইল এবং সম্পর্কিত ডেটা মুছে দেওয়া হয়েছে৷ সহায়তার জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন৷" "আপনার কাজের প্রোফাইল এই ডিভাইসে আর উপলব্ধ নেই।" + "নেটওয়ার্ক ট্রাফিক মনিটর করা হচ্ছে" + "আরো জানতে আলতো চাপুন" "আপনার ডিভাইসটি মুছে ফেলা হবে" "প্রশাসক অ্যাপকেশানটিতে উপাদান অনুপস্থিত বা ক্ষতিগ্রস্ত হয়েছে এবং ব্যবহার করা যাবে না৷ আপনার ডিভাইস এখন মুছে ফেলা হবে৷ সহায়তার জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন৷" "আমাকে" @@ -250,7 +255,7 @@ "ক্যালেন্ডার" "আপনার ক্যালেন্ডারে অ্যাক্সেস" "SMS" - "SMS বার্তাগুলি পাঠাতে এবং দেখতে" + "এসএমএসগুলি পাঠাতে এবং দেখতে" "সঞ্চয়স্থান" "আপনার ডিভাইসে ফটো, মিডিয়া এবং ফাইলগুলিতে অ্যাক্সেস" "মাইক্রোফোন" @@ -286,7 +291,7 @@ "আউটগোয়িং কলগুলি পুনঃচালিত করুন" "অ্যাপ্লিকেশানকে কল চলাকালীন অন্য একটি নম্বরে কল পুনঃনির্দেশ বা কলটি একসথে বন্ধ করার সাথে ডায়াল করা নম্বরটি দেখতে দেয়৷" "পাঠ্য বার্তা পান (SMS)" - "অ্যাপ্লিকেশানটিকে SMS বার্তা প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷" + "অ্যাপ্লিকেশানটিকে এসএমএস প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷" "পাঠ্য বার্তা পান (MMS)" "অ্যাপ্লিকেশানটিকে MMS বার্তা প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷" "সেল সম্প্রচার বার্তা পড়ুন" @@ -294,11 +299,11 @@ "গ্রাহক হিসাবে নেওয়া ফিডগুলি পড়ে" "অ্যাপ্লিকেশানকে বর্তমানে সিঙ্ক করা ফিডগুলির সম্পর্কে বিবরণ পেতে দেয়৷" "SMS পাঠানো ও দেখা,আপনি কি পরিচিতি কে এগুলি করার অনুমতি দেবেন?" - "অ্যাপ্লিকেশানটিকে SMS বার্তাগুলি পাঠাতে অনুমতি দেয়৷ এর জন্য অপ্রত্যাশিত চার্জ কাটা হতে পারে৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার নিশ্চিতকরণ ছাড়া বার্তা পাঠানোর মাধ্যমে আপনাকে অর্থ চার্জ করতে পারে৷" + "অ্যাপ্লিকেশানটিকে এসএমএসগুলি পাঠাতে অনুমতি দেয়৷ এর জন্য অপ্রত্যাশিত চার্জ কাটা হতে পারে৷ ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার নিশ্চিতকরণ ছাড়া বার্তা পাঠানোর মাধ্যমে আপনাকে অর্থ চার্জ করতে পারে৷" "আপনার পাঠ্য বার্তা পড়ুন (SMS বা MMS)" - "অ্যাপ্লিকেশানটিকে আপনার ট্যাবলেটে বা আপনার সিম কার্ডে সংরক্ষিত SMS বার্তাগুলি পড়ার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে সামগ্রী বা গোপনীয়তার সমস্ত SMS বার্তা নির্বিশেষে পড়ার অনুমতি দেয়৷" - "অ্যাপ্লিকেশানটিকে আপনার টিভি বা SIM কার্ডে সংরক্ষিত SMS বার্তাগুলি পড়ার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে সামগ্রী বা গোপনীয়তা নির্বিশেষে সমস্ত SMS বার্তাগুলি পড়ার অনুমতি দেয়৷" - "অ্যাপ্লিকেশানটিকে আপনার ফোনে বা আপনার সিম কার্ডে সংরক্ষিত SMS বার্তাগুলি পড়ার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে সামগ্রী বা গোপনীয়তার সমস্ত SMS বার্তা নির্বিশেষে পড়ার অনুমতি দেয়৷" + "অ্যাপ্লিকেশানটিকে আপনার ট্যাবলেটে বা আপনার সিম কার্ডে সংরক্ষিত এসএমএসগুলি পড়ার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে সামগ্রী বা গোপনীয়তার সমস্ত এসএমএস নির্বিশেষে পড়ার অনুমতি দেয়৷" + "অ্যাপ্লিকেশানটিকে আপনার টিভি বা সিম কার্ডে সংরক্ষিত এসএমএসগুলি পড়ার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে সামগ্রী বা গোপনীয়তা নির্বিশেষে সমস্ত এসএমএসগুলি পড়ার অনুমতি দেয়৷" + "অ্যাপ্লিকেশানটিকে আপনার ফোনে বা আপনার সিম কার্ডে সংরক্ষিত এসএমএসগুলি পড়ার অনুমতি দেয়৷ এটি অ্যাপ্লিকেশানটিকে সামগ্রী বা গোপনীয়তার সমস্ত এসএমএস নির্বিশেষে পড়ার অনুমতি দেয়৷" "পাঠ্য বার্তা পান (WAP)" "অ্যাপ্লিকেশানটিকে WAP বার্তা প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷" "চলমান অ্যাপ্লিকেশান উদ্ধার করে" @@ -365,7 +370,7 @@ "ভলিউম এবং যেখানে স্পিকার আউটপুট সামগ্রী হিসাবে ব্যবহৃত হয় সেই সব ক্ষেত্রে গ্লোবাল অডিও সেটিংসের সংশোধন করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷" "অডিও রেকর্ড" "অ্যাপ্লিকেশানটিকে মাইক্রোফোনের দ্বারা অডিও রেকর্ড করার অনুমতি দেয়৷ এই অনুমতিটি অ্যাপ্লিকেশানটিকে আপনার অনুমোদন ছাড়া যেকোনো সময় অডিও রেকর্ড করার অনুমতি দেয়৷" - "SIM এ আদেশগুলি পাঠান" + "সিম এ আদেশগুলি পাঠান" "অ্যাপ্লিকেশানটিকে সিম কার্ডে কমান্ডগুলি পাঠানোর অনুমতি দেয়৷ এটি খুবই বিপজ্জনক৷" "ছবি এবং ভিডিও তোলে" "ক্যামেরার সাহায্যে ছবি তুলতে ও ভিডিও তৈরি করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ এই অনুমতিটি অ্যাপ্লিকেশানটিকে আপনার নিশ্চয়তা ছাড়াই যেকোনো সময় ক্যামেরা ব্যবহার করতে মঞ্জুর করে৷" @@ -470,8 +475,8 @@ "অ্যাপ্লিকেশানকে SD কার্ডে লেখার অনুমতি দেয়৷" "SIP কল করুন/গ্রহণ করুন" "অ্যাপ্লিকেশানকে SIP কল করতে ও গ্রহণ করতে অনুমতি দেয়।" - "নতুন টেলিকম SIM সংযোগগুলির নিবন্ধন" - "অ্যাপ্লিকেশানটিকে নতুন টেলিকম SIM সংযোগগুলি নিবন্ধিত করতে অনুমোদিত করে৷" + "নতুন টেলিকম সিম সংযোগগুলির নিবন্ধন" + "অ্যাপ্লিকেশানটিকে নতুন টেলিকম সিম সংযোগগুলি নিবন্ধিত করতে অনুমোদিত করে৷" "নতুন টেলিকম সংযোগগুলির নিবন্ধন" "নতুন টেলিকম সংযোগ নিবন্ধিত করতে অ্যাপ্লিকেশানটিকে অনুমোদিত করে৷" "টেলিকম সংযোগগুলি পরিচালনা করুন" @@ -605,7 +610,7 @@ "রেডিও" "টেলেক্স" "TTY TDD" - "কার্যক্ষেত্রের মোবাইল" + "অফিসের মোবাইল" "কার্যক্ষেত্রের পেজার" "সহায়ক" "MMS" @@ -683,7 +688,7 @@ "মুখের সাহায্যে আনলক করার প্রচেষ্টা যতবার করা যায় তার সীমা পেরিয়ে গেছে" "কোনো সিম কার্ড নেই" "ট্যাবলেটের মধ্যে কোনো সিম কার্ড নেই৷" - "টিভির মধ্যে কোনো SIM কার্ড নেই৷" + "টিভির মধ্যে কোনো সিম কার্ড নেই৷" "ফোনের মধ্যে কোনো সিম কার্ড নেই৷" "একটি সিম কার্ড ঢোকান৷" "সিম কার্ডটি অনুপস্থিত বা পাঠযোগ্য নয়৷ একটি সিম কার্ড ঢোকান৷" @@ -1110,8 +1115,8 @@ "আপনার টিভি %1$s এ সংযুক্ত থাকার সময় ওয়াই-ফাই থেকে সাময়িকভাবে সংযোগ বিচ্ছিন্ন হবে৷" "ফোনটি যখন %1$s এ সংযুক্ত হবে তখন এটি ওয়াই-ফাই থেকে সাময়িকভাবে সংযোগ বিচ্ছিন্ন হবে" "অক্ষর ঢোকান" - "SMS বার্তা পাঠানো হচ্ছে" - "<b>%1$s</b> অনেকগুলি SMS বার্তা পাঠাচ্ছে৷ আপনি কি এই অ্যাপ্লিকেশানটিকে বার্তা পাঠানো চালিয়ে যাওয়ার অনুমতি দিতে চান?" + "এসএমএস পাঠানো হচ্ছে" + "<b>%1$s</b> অনেকগুলি এসএমএস পাঠাচ্ছে৷ আপনি কি এই অ্যাপ্লিকেশানটিকে বার্তা পাঠানো চালিয়ে যাওয়ার অনুমতি দিতে চান?" "অনুমতি দিন" "আস্বীকার করুন" "<b>%1$s</b> <b>%2$s</b> এ একটি বার্তা পাঠাতে চায়৷" @@ -1129,10 +1134,10 @@ "সিম কার্ড যোগ করা হয়েছে" "সেলুলার নেটওয়ার্ক অ্যাক্সেস করতে আপনার ডিভাইস পুনর্সূচনা করুন" "পুনর্সূচনা" - "যাতে আপনার নতুন SIM সঠিকভাবে কাজ করে, তার জন্য আপনাকে আপনার পরিষেবা প্রদানকারীর থেকে একটি অ্যাপ্লিকেশান ইনস্টল করতে এবং খুলতে হবে৷" + "যাতে আপনার নতুন সিম সঠিকভাবে কাজ করে, তার জন্য আপনাকে আপনার পরিষেবা প্রদানকারীর থেকে একটি অ্যাপ্লিকেশান ইনস্টল করতে এবং খুলতে হবে৷" "অ্যাপ্লিকেশানটি পান" "এখনই নয়" - "নতুন SIM ঢোকানো হয়েছে" + "নতুন সিম ঢোকানো হয়েছে" "এটিকে সেট আপ করতে আলতো চাপুন" "সময় সেট করুন" "তারিখ সেট করুন" @@ -1208,6 +1213,8 @@ "কোনো অ্যাপ্লিকেশানকে সেশনগুলি পড়ার অনুমতি দেয়। এটি সক্রিয় প্যাকেজ ইনস্টলেশনের বিশদ বিবরণ দেখতে দেয়।" "প্যাকেজগুলি ইনস্টল করার অনুরোধ" "একটি অ্যাপ্লিকেশানকে প্যাকেজগুলির ইনস্টল করার অনুরোধ জানাতে অনুমতি দেয়৷" + "ব্যাটারি অপ্টিমাইজেশন উপেক্ষা করার জন্য অনুমতি চাওয়া" + "কোনো অ্যাপের জন্য ব্যাটারি অপ্টিমাইজেশন উপেক্ষা করতে সেটিকে অনুমতির চাওয়ার মঞ্জুরি দেয়৷" "জুম নিয়ন্ত্রণের জন্য দুবার আলতো চাপুন" "উইজেট যোগ করা যায়নি৷" "যান" @@ -1234,7 +1241,7 @@ "ওয়ালপেপার" "ওয়ালপেপার পরিবর্তন করুন" "বিজ্ঞপ্তির শ্রোতা" - "VR শ্রোতা" + "(ভিআর)VR শ্রোতা" "শর্ত প্রদানকারী" "বিজ্ঞপ্তি র‌্যাঙ্কার পরিষেবা" "VPN সক্রিয়" @@ -1432,7 +1439,7 @@ " — " "সরান" "প্রস্তাবিত স্তরের চেয়ে বেশি উঁচুতে ভলিউম বাড়াবেন?\n\nউঁচু ভলিউমে বেশি সময় ধরে কিছু শুনলে আপনার শ্রবনশক্তির ক্ষতি হতে পারে।" - "অ্যাক্সেসযোগ্যতা সক্রিয় করতে দুইটি আঙ্গুলকে চেপে নীচে ধরে রাখুন৷" + "অ্যাক্সেসযোগ্যতা সক্রিয় করতে দুইটি আঙ্গুলকে চেপে নিচে ধরে রাখুন৷" "অ্যাক্সেসযোগ্যতা সক্ষম করা হয়েছে৷" "অ্যাক্সেসযোগ্যতা বাতিল করা হয়েছে৷" "বর্তমান ব্যবহারকারী %1$s৷" @@ -1558,7 +1565,7 @@ "বছর নির্বাচন করুন" "%1$s মুছে ফেলা হয়েছে" "কর্মক্ষেত্র %1$s" - "এই স্ক্রীনটিকে আনপিন করতে, \'ফিরুন\' স্পর্শ করুন এবং ধরে রাখুন৷" + "এই স্ক্রীনটিকে আনপিন করতে, \'ফিরুন এবং ওভারভিউ\' স্পর্শ করে ধরে রাখুন৷" "অ্যাপ্লিকেশান পিন করা আছে: এই ডিভাইস এটিকে পিনমুক্ত করা মঞ্জুরিপ্রাপ্ত নয়৷" "স্ক্রীন পিন করা হয়েছে" "পিন না করা স্ক্রীন" diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml index e8a3c028eeaa..b809f3cfcabb 100644 --- a/core/res/res/values-bs-rBA/strings.xml +++ b/core/res/res/values-bs-rBA/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problem sa povezivanjem ili nevažeći MMI kôd." "Operacija je ograničena samo na brojeve fiksnog biranja." + "Nije moguće promijeniti postavke za preusmjeravanje poziva s vašeg telefona dok ste u romingu." "Usluga je omogućena." "Usluga je omogućena za:" "Usluga je onemogućena." @@ -97,6 +98,8 @@ "Blokirane su govorne usluge i usluge prijenosa podataka." "Blokirane su govorne/SMS usluge." "Blokirane su sve govorne i SMS usluge te usluge prijenosa podataka." + "Nije moguće dosegnuti mrežu" + "Da poboljšate prijem, pokušajte promijeniti odabranu vrstu mreže u meniju Postavke > Mobilne mreže > Preferirana vrsta mreže." "Ravnopravni uređaj zatražio TTY PUNI način rada" "Ravnopravni uređaj zatražio TTY HCO način rada" "Ravnopravni uređaj zatražio TTY VCO način rada" @@ -181,6 +184,8 @@ "Poslovni profil je obrisan jer nedostaje aplikacija administratora." "Aplikacija administratora za poslovni profil nedostaje ili je neispravna. Zbog toga su vaš poslovni profil i vezani podaci obrisani. Za pomoć se obratite administratoru." "Profil za posao više nije dostupan na ovom uređaju." + "Mrežni saobraćaj se nadgleda" + "Dodirnite da saznate više" "Uređaj će biti izbrisan" "Aplikaciji administratora nedostaju komponente ili je neispravna, i ne može se koristiti. Vaš uređaj će sada biti izbrisan. Za pomoć se obratite administratoru." "Ja" @@ -551,35 +556,35 @@ "Kuća" "Mobilni" - "Poslovni" + "Posao" "Poslovni faks" "Kućni faks" "Pejdžer" "Ostalo" - "Dodatno" + "Prilagođeno" "Kućni" - "Poslovni" - "Ostali" - "Dodatni" + "Posao" + "Ostalo" + "Prilagođeno" "Kuća" "Posao" "Ostalo" - "Dodatno" + "Prilagođeno" "Kućni" - "Poslovni" - "Ostali" - "Dodatni" + "Posao" + "Ostalo" + "Prilagođeno" "Posao" "Ostalo" - "Dodatno" + "Prilagođeno" "AIM" @@ -600,15 +605,15 @@ "Pejdžer" "Ostalo" "Povratni poziv" - "Auto" - "Glavni broj kompanije" + "Automobil" + "Poslovni glavni" "ISDN" "Glavni" "Drugi faks" "Radio" "Teleks" "TTY TDD" - "Posao mobilni" + "Poslovni mobilni" "Poslovni pejdžer" "Pomoćnik" "MMS" @@ -616,10 +621,10 @@ "Rođendan" "Godišnjica" "Ostalo" - "Prilagođeni" + "Prilagođeno" "Kućni" - "Poslovni" - "Ostali" + "Posao" + "Ostalo" "Mobilni" "Prilagođeno" "Kućna adresa" @@ -646,17 +651,17 @@ "Pomoćnik" "Brat" "Dijete" - "Domaći partner" + "Nevjenčani partner" "Otac" "Prijatelj" - "Menadžer" + "Šef" "Majka" "Roditelj" "Partner" "Uputio(la)" - "Rođak" + "Rođak/ica" "Sestra" - "Bračni partner" + "Suprug/a" "Prilagođeno" "Kuća" "Posao" @@ -1084,7 +1089,7 @@ "Jačina zvuka za medijske sadržaje" "Jačina zvuka za obavještenja" "Zadana melodija zvona" - "Zadano zvono (%1$s)" + "Zadana melodija zvona (%1$s)" "Bez zvuka" "Melodije zvona" "Nepoznato zvono" @@ -1235,6 +1240,8 @@ "Dozvoljava aplikaciji da čita sesije instalacija. Ovim se aplikaciji omogućava da vidi detalje o aktivnim instalacijama paketa." "zahtijevanje paketa za instaliranje" "Omogućava aplikaciji da zahtijeva instalaciju paket ā." + "traži zanemarivanje optimizacije baterije" + "Omogućava aplikaciji da traži dozvolu za zanemarivanje optimizacije baterije za tu aplikaciju." "Dodirnite dvaput za kontrolu uvećanja" "Dodavanje vidžeta nije uspjelo." "Počni" @@ -1587,7 +1594,7 @@ "Odaberite godinu" "Broj %1$s je izbrisan" "Poslovni %1$s" - "Da biste otkačili ovaj ekran, dodirnite i držite dugme Nazad." + "Da biste otkačili ovaj ekran, dodirnite i držite dugme Nazad i Pregled." "Aplikacija je prikačena. Na ovom uređaju nije dozvoljeno otkačivanje." "Ekran je zakačen" "Ekran je otkačen" diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 137d924ac1fc..44bd36a9122d 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problema de connexió o codi MMI no vàlid." "L\'operació està restringida a números de marcatge fixos." + "No es pot canviar la configuració de desviació de trucades del telèfon quan estàs en itinerància." "El servei s\'ha activat." "S\'ha activat el servei per a:" "El servei s\'ha desactivat." @@ -67,8 +68,8 @@ "IMEI" "MEID" - "ID de l\'emissor (trucada entrant)" - "ID de l\'emissor (trucada de sortida)" + "Identificador de trucada (trucada entrant)" + "Identificador de trucada (trucada de sortida)" "Identificador de la línia connectada" "Restricció de l\'identificador de la línia connectada" "Desviació de trucades" @@ -82,12 +83,12 @@ "Rebuig de trucades molestes no desitjades" "Lliurament de número que truca" "No molesteu" - "El valor predeterminat de l\'identificador de l\'emissor és restringit. Següent trucada: restringit" - "El valor predeterminat de l\'identificador de l\'emissor és restringit. Següent trucada: no restringit" - "El valor predeterminat de l\'identificador de l\'emissor és no restringit. Següent trucada: restringit" - "El valor predeterminat de l\'identificador de l\'emissor és no restringit. Següent trucada: no restringit" + "El valor predeterminat de l\'identificador de trucada és restringit. Trucada següent: restringit" + "El valor predeterminat de l\'identificador de trucada és restringit. Trucada següent: no restringit" + "El valor predeterminat de l\'identificador de trucada és no restringit. Trucada següent: restringit" + "El valor predeterminat de l\'identificador de trucada és no restringit. Trucada següent: no restringit" "No s\'ha proveït el servei." - "No pots canviar la configuració de l\'identificador de l\'emissor." + "No pots canviar la configuració de l\'identificador de trucada." "El servei de dades està bloquejat." "El servei d\'emergència està bloquejat." "El servei de veu està bloquejat." @@ -96,6 +97,8 @@ "Els serveis de veu/dades estan bloquejats." "Els serveis de veu/SMS estan bloquejats." "Tots els serveis de veu/dades/SMS estan bloquejats." + "No es pot accedir a la xarxa" + "Per millorar la recepció, prova de canviar-ne el tipus a Configuració > Xarxes mòbils > Tipus de xarxa preferit." "L\'altre dispositiu ha sol·licitat el mode TTY COMPLET." "L\'altre dispositiu ha sol·licitat el mode TTY HCO." "L\'altre dispositiu ha sol·licitat el mode TTY VCO." @@ -179,6 +182,8 @@ "S\'ha suprimit el perfil professional perquè no s\'ha detectat cap aplicació d\'administració." "L\'aplicació d\'administració del perfil professional està malmesa o no es detecta. Com a conseqüència, el perfil professional i les dades relacionades s\'han suprimit. Contacta amb l\'administrador per obtenir ajuda." "El perfil professional ja no està disponible en aquest dispositiu." + "El trànsit de xarxa s\'està supervisant" + "Toca per obtenir més informació" "El contingut del dispositiu s\'esborrarà" "L\'aplicació d\'administració està malmesa o hi falten components, i no es pot fer servir. El contingut del dispositiu s\'esborrarà. Contacta amb l\'administrador per obtenir ajuda." "Mi" @@ -503,7 +508,7 @@ "canviar el calibratge del dispositiu d\'entrada" "Permet que l\'aplicació modifiqui els paràmetres de calibratge de la pantalla tàctil. No ha de ser mai necessari per a aplicacions normals." "accedir als certificats de DRM" - "Permet que una aplicació proporcioni i utilitzi certificats de gestió de drets digitals (DRM, Digital Rights Management). No ha de ser mai necessari per a aplicacions normals." + "Permet que una aplicació proporcioni i utilitzi certificats DRM. No ha de ser mai necessari per a aplicacions normals." "rebre l\'estat de la transferència d\'Android Beam" "Permet que aquesta aplicació rebi informació sobre les transferències d\'Android Beam actuals." "suprimir els certificats DRM" @@ -596,7 +601,7 @@ "Fax de casa" "Cercapersones" "Altres" - "Torna la trucada" + "Devolució de trucada" "Cotxe" "Telèfon d\'empresa" "XDSI" @@ -1208,6 +1213,8 @@ "Permet que una aplicació llegeixi les sessions d\'instal·lació i això permet veure detalls sobre les instal·lacions de paquet actives." "sol·licitar la instal·lació de paquets" "Permet que una aplicació sol·liciti la instal·lació de paquets." + "Demanar permís per ignorar les optimitzacions de bateria" + "Permet que una aplicació demani permís per ignorar les optimitzacions de bateria per a l\'aplicació." "Piqueu dos cops per controlar el zoom" "No s\'ha pogut afegir el widget." "Vés" @@ -1234,7 +1241,7 @@ "Fons de pantalla" "Canvia el fons de pantalla" "Oient de notificacions" - "Processador de realitat virtual" + "Processador de RV" "Proveïdor de condicions" "Servei de classificació de notificacions" "VPN activada" @@ -1246,7 +1253,7 @@ "La VPN sempre activada està desconnectada" "Error de la VPN sempre activada" "Toca per configurar" - "Trieu un fitxer" + "Tria un fitxer" "No s\'ha escollit cap fitxer" "Restableix" "Envia" @@ -1558,7 +1565,7 @@ "Selecciona un any" "%1$s suprimit" "%1$s de la feina" - "Toca i mantén premuda l\'opció Enrere per deixar de fixar aquesta pantalla." + "Toca i mantén premudes les opcions Enrere i Visió general per deixar de fixar aquesta pantalla." "S\'ha fixat l\'aplicació. En aquest dispositiu no es permet anul·lar-ne la fixació." "Pantalla fixada" "Fixació de la pantalla anul·lada" diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 8037681ea37a..218221e073cc 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problém s připojením nebo neplatný kód MMI." "Operace je omezena pouze na povolená telefonní čísla." + "Když je aktivní roaming, nastavení přesměrování hovorů z telefonu nelze změnit." "Služba byla zapnuta." "Služba byla zapnuta pro:" "Služba byla vypnuta." @@ -98,6 +99,8 @@ "Hlasové a datové služby jsou zablokovány." "Hlasové služby a služby SMS jsou zablokovány." "Veškeré hlasové a datové služby a služby SMS jsou zablokovány." + "K síti se nelze připojit" + "Chcete-li zlepšit příjem, zkuste v Nastavení > Mobilní sítě > Preferovaný typ sítě změnit vybraný typ." "Partner požádal o přechod na režim TTY FULL" "Partner požádal o přechod na režim TTY HCO" "Partner požádal o přechod na režim TTY VCO" @@ -183,6 +186,8 @@ "Pracovní profil byl smazán, protože není k dispozici aplikace pro správu." "Aplikace pro správu pracovního profilu chybí nebo je poškozena. Váš pracovní profil a související data proto byla smazána. Kontaktujte svého administrátora a požádejte jej o pomoc." "Váš pracovní profil v tomto zařízení již není k dispozici." + "Síťový provoz je monitorován" + "Klepnutím zobrazíte další informace" "Zařízení bude vymazáno" "V aplikaci pro správu chybí některé součásti nebo je poškozená, a proto ji nelze použít. Zařízení nyní bude vymazáno. Kontaktujte svého administrátora a požádejte jej o pomoc." "Já" @@ -256,9 +261,9 @@ "Kalendář" "přístup ke kalendáři" "SMS" - "odesílání a zobrazení zpráv SMS" + "odesílání a zobrazování zpráv SMS" "Úložiště" - "přístup k fotkám, médiím a souborům na zařízení" + "přístup k fotkám, médiím a souborům v zařízení" "Mikrofon" "nahrávání zvuku" "Fotoaparát" @@ -299,7 +304,7 @@ "Umožňuje aplikaci číst zprávy informačních služeb přijaté ve vašem zařízení. Výstražná upozornění informačních služeb jsou v některých oblastech odesílána za účelem varování před výjimečnými událostmi. Škodlivé aplikace mohou narušit výkon či provoz vašeho zařízení během přijímání zpráv informačních služeb." "čtení zdrojů přihlášených k odběru" "Umožňuje aplikaci získat podrobnosti o aktuálně synchronizovaných zdrojích." - "odesílání a zobrazení zpráv SMS" + "odesílání a zobrazování zpráv SMS" "Umožňuje aplikaci odesílat zprávy SMS. Může to mít za následek účtování neočekávaných poplatků. Škodlivé aplikace vás mohou připravit o peníze odesíláním zpráv bez vašeho svolení." "čtení textových zpráv (SMS nebo MMS)" "Umožňuje aplikaci číst zprávy SMS uložené v tabletu nebo na SIM kartě.Toto oprávnění umožňuje aplikaci číst zprávy SMS bez ohledu na jejich obsah nebo důvěrnost." @@ -1258,6 +1263,8 @@ "Povoluje aplikaci číst instalační relace. Díky tomu můžete zobrazit podrobnosti o aktivních instalacích balíčku." "odesílání žádostí o přístup k instalačním balíčkům" "Umožňuje aplikaci požádat o instalaci balíčků." + "požádat o ignorování optimalizace využití baterie" + "Povoluje aplikaci požádat o oprávnění ignorovat optimalizaci využití baterie, která pro ni je nastavena." "Poklepáním můžete ovládat přiblížení" "Widget nelze přidat." "Přejít" @@ -1284,7 +1291,7 @@ "Tapeta" "Změnit tapetu" "Aplikace poslouchající oznámení" - "Přijímač virtuální reality" + "VR přijímač" "Poskytovatel podmínky" "Služba na hodnocení důležitosti oznámení" "Síť VPN je aktivována" @@ -1612,7 +1619,7 @@ "Vyberte rok" "Číslice %1$s byla smazána" "Pracovní %1$s" - "Chcete-li tuto obrazovku uvolnit, klepněte na tlačítko Zpět a podržte jej." + "Chcete-li tuto obrazovku uvolnit, klepněte na tlačítko Zpět a poté na tlačítko Přehled a podržte jej." "Aplikace je připnutá: Odepnutí v tomto zařízení není povoleno." "Obrazovka připnuta" "Obrazovka uvolněna" diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index eb4d2555f9f4..12679774e1e3 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Forbindelsesproblemer eller ugyldigt MMI-nummer." "Du kan kun foretage handlinger med dine numre til begrænset opkald." + "Det er ikke muligt at ændre indstillingerne for viderestilling af opkald fra din telefon, mens du bruger roaming." "Tjenesten blev aktiveret." "Tjenesten blev aktiveret for:" "Tjenesten er deaktiveret." @@ -96,6 +97,8 @@ "Stemme-/datatjenester er blokeret." "Stemme-/sms-tjenester er blokerede." "Alle stemme-/data-/sms-tjenester er blokeret." + "Der er ingen forbindelse til netværket" + "For at forbedre signalet kan du prøve at ændre den valgte netværkstype i Indstillinger > Mobilnetværk > Foretrukken netværkstype." "Den anden enhed har skiftet til FULD TTY-tilstand" "Den anden enhed har skiftet til TTY-tilstanden HCO" "Den anden enhed har skiftet til TTY-tilstanden VCO" @@ -179,6 +182,8 @@ "Arbejdsprofilen blev slettet, fordi der mangler en administrationsapp." "Administrationsappen til arbejdsprofilen mangler eller er beskadiget. Derfor er din arbejdsprofil og dine relaterede data blevet slettet. Kontakt din administrator for at få hjælp." "Din arbejdsprofil er ikke længere tilgængelig på denne enhed." + "Netværkstrafikken overvåges" + "Tryk for at få flere oplysninger" "Enheden slettes" "Administrationsappen mangler komponenter eller er beskadiget og kan ikke bruges. Enheden vil nu blive slettet. Kontakt din administrator for at få hjælp." "Mig" @@ -219,12 +224,12 @@ "Lav fejlrapport" "Der indsamles oplysninger om din enheds aktuelle status, der efterfølgende sendes i en e-mail. Der går lidt tid, fra fejlrapporten påbegyndes, til den er klar til at blive sendt. Tak for tålmodigheden." "Interaktiv rapport" - "Brug dette workflow under de fleste omstændigheder. Det giver dig mulighed for at se status på rapporten, angive flere oplysninger om problemet og tage skærmbilleder. Nogle mindre brugte sektioner, der tager lang tid at rapportere, udelades muligvis." + "Brug dette workflow under de fleste omstændigheder. Det giver dig mulighed for at se status på rapporten, angive flere oplysninger om problemet og tage screenshots. Nogle mindre brugte sektioner, der tager lang tid at rapportere, udelades muligvis." "Fuld rapport" - "Brug denne mulighed for at gribe mindst muligt ind, når enheden ikke reagerer eller er for langsom, eller når du har brug for alle rapportsektioner. Du har ikke mulighed for at angive flere oplysninger eller tage yderligere skærmbilleder." + "Brug denne mulighed for at gribe mindst muligt ind, når enheden ikke reagerer eller er for langsom, eller når du har brug for alle rapportsektioner. Du har ikke mulighed for at angive flere oplysninger eller tage yderligere screenshots." - Der tages et skærmbillede til fejlrapporten om %d sekund. - Der tages et skærmbillede til fejlrapporten om %d sekunder. + Der tages et screenshot til fejlrapporten om %d sekund. + Der tages et screenshot til fejlrapporten om %d sekunder. "Lydløs" "Lyden er slået FRA" @@ -1208,6 +1213,8 @@ "Tillader, at en applikation læser installationssessioner. Dermed kan applikationen se oplysninger om aktive pakkeinstallationer." "anmod om installation af pakker" "Tillader, at en app anmoder om installation af pakker." + "bede om at ignorere batterioptimeringer" + "Gør det muligt for en app at bede om tilladelse til at ignorere batterioptimeringer for den pågældende app." "Tryk to gange for zoomkontrol" "Widget kunne ikke tilføjes." "Gå" @@ -1397,7 +1404,7 @@ "Forkert pinkode" "Prøv igen om %1$d sekunder." "Tegn dit mønster" - "Indtast pinkode til SIM" + "Indtast pinkode til SIM-kort" "Indtast pinkode" "Angiv adgangskode" "SIM-kortet er nu deaktiveret. Indtast PUK-koden for at fortsætte. Kontakt mobiloperatøren for at få flere oplysninger." @@ -1558,7 +1565,7 @@ "Vælg år" "%1$s er slettet" "%1$s – arbejde" - "Hvis du vil frigøre dette skærmbillede, skal du trykke på Tilbage og holde fingeren nede." + "Hvis du vil frigøre dette skærmbillede, skal du trykke på Tilbage og Oversigt samt holde fingeren nede." "Appen er fastgjort: Det er ikke tilladt at frigøre den på denne enhed." "Skærmen blev fastgjort" "Skærmen blev frigjort" @@ -1606,7 +1613,7 @@ "Indtil %1$s" "Indtil %1$s (næste alarm)" - "Indtil du slår denne indstilling fra" + "Indtil du slår dette fra" "Indtil du slår \"Forstyr ikke\" fra" "%1$s/%2$s" "Skjul" diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index a6fad85e2df9..c9c74542b172 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Verbindungsproblem oder ungültiger MMI-Code." "Der Vorgang ist nur für deine zugelassenen Rufnummern möglich." + "Die Einstellungen für die Anrufweiterleitung von deinem Smartphone können während des Roamings nicht geändert werden." "Dienst wurde aktiviert." "Dienst wurde aktiviert für:" "Dienst wurde deaktiviert." @@ -96,6 +97,8 @@ "Sprach-/Datendienste sind gesperrt." "Sprach-/SMS-Dienste sind gesperrt." "Alle Sprach-/Daten-/SMS-Dienste sind gesperrt." + "Netzwerk nicht erreichbar" + "Der Empfang lässt sich möglicherweise verbessern, indem du unter \"Einstellungen\" > \"Mobilfunknetze\" > \"Bevorzugter Netzwerktyp\" einen anderen Typ auswählst." "Peer hat TTY-Modus \"Vollständig\" angefordert." "Peer hat TTY-Modus \"HCO\" angefordert." "Peer hat TTY-Modus \"VC\" angefordert." @@ -179,6 +182,8 @@ "Arbeitsprofil aufgrund fehlender Admin-App gelöscht" "Die Admin-App für das Arbeitsprofil fehlt oder ist beschädigt. Daher wurden dein Arbeitsprofil und alle zugehörigen Daten gelöscht. Wende dich für weitere Hilfe an deinen Administrator." "Dein Arbeitsprofil ist auf diesem Gerät nicht mehr verfügbar." + "Der Netzwerkverkehr wird protokolliert" + "Für weitere Informationen tippen" "Die Daten auf deinem Gerät werden gelöscht." "Die Admin-App kann nicht verwendet werden, da sie beschädigt wurde oder Komponenten fehlen. Die Daten auf deinem Gerät werden nun gelöscht. Wende dich für weitere Hilfe an deinen Administrator." "Eigene" @@ -1208,6 +1213,8 @@ "Ermöglicht der App, Installationssitzungen zu lesen. Dadurch kann sie Details aktiver Paketinstallationen abrufen." "Installation von Paketen anfordern" "Ermöglicht der App, die Installation von Paketen anzufordern" + "fragen, ob Akku-Leistungsoptimierungen ignoriert werden können" + "Erlaubt einer App, nach der Berechtigung zum Ignorieren der Akku-Leistungsoptimierungen zu fragen." "Für Zoomeinstellung zweimal berühren" "Widget konnte nicht hinzugefügt werden." "Los" @@ -1226,7 +1233,7 @@ "Ablehnen" "Berechtigung angefordert" "Berechtigung angefordert\nfür Konto %s" - "Sie verwenden diese App außerhalb Ihres Arbeitsprofils" + "Du verwendest diese App außerhalb deines Arbeitsprofils" "Du verwendest diese App in deinem Arbeitsprofil." "Eingabemethode" "Synchronisieren" @@ -1558,7 +1565,7 @@ "Jahr auswählen" "%1$s gelöscht" "%1$s (geschäftlich)" - "Um die Fixierung dieses Bildschirms aufzuheben, \"Zurück\" berühren und halten." + "Um die Fixierung dieses Bildschirms aufzuheben, berühre und halte gleichzeitig \"Zurück\" und \"Übersicht\"." "Die App ist fixiert. Das Aufheben der Fixierung ist auf diesem Gerät nicht zulässig." "Bildschirm fixiert" "Bildschirm gelöst" diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 9e41023575f9..0739f24651e1 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Πρόβλημα σύνδεσης ή μη έγκυρος κώδικας MMI." "Η λειτουργία περιορίζεται μόνο σε προκαθορισμένους αριθμούς κλήσης." + "Δεν είναι δυνατή η αλλαγή των ρυθμίσεων προώθησης κλήσεων από το τηλέφωνό σας κατά τη διάρκεια της περιαγωγής." "Η υπηρεσία ενεργοποιήθηκε." "Η υπηρεσία ενεργοποιήθηκε για:" "Η υπηρεσία έχει απενεργοποιηθεί." @@ -96,6 +97,8 @@ "Οι υπηρεσίες φωνής/δεδομένων έχουν αποκλειστεί." "Όλες οι υπηρεσίες φωνής/SMS έχουν αποκλειστεί." "Όλες οι υπηρεσίες φωνής/δεδομένων/SMS έχουν αποκλειστεί." + "Δεν είναι δυνατή η σύνδεση στο δίκτυο" + "Για να βελτιώσετε τη λήψη, δοκιμάστε να αλλάξετε τον επιλεγμένο τύπο από τις Ρυθμίσεις > Δίκτυα κινητής τηλεφωνίας > Προτιμώμενος τύπος δικτύου." "Αίτημα peer για TTY ΠΛΗΡΗΣ Λειτουργία" "Αίτημα peer για TTY Λειτουργία HCO" "Αίτημα peer για TTY Λειτουργία VCO" @@ -179,6 +182,8 @@ "Το προφίλ εργασίας διαγράφηκε επειδή λείπει η εφαρμογή διαχείρισης." "Η εφαρμογή διαχείρισης προφίλ εργασίας είτε λείπει είτε είναι κατεστραμμένη. Ως αποτέλεσμα, το προφίλ εργασίας και σχετικά δεδομένα διαγράφηκαν. Επικοινωνήστε με το διαχειριστή για βοήθεια." "Το προφίλ σας εργασίας δεν είναι πια διαθέσιμο σε αυτήν τη συσκευή." + "Η επισκεψιμότητα δικτύου παρακολουθείται" + "Πατήστε για να μάθετε περισσότερα" "Η συσκευή σας θα διαγραφεί" "Λείπουν στοιχεία από την εφαρμογή διαχείρισης ή είναι κατεστραμμένη, και δεν μπορεί να χρησιμοποιηθεί. Η συσκευή σας θα διαγραφεί. Επικοινωνήστε με το διαχειριστή για βοήθεια." "Για εμένα" @@ -1208,6 +1213,8 @@ "Επιτρέπει σε μια εφαρμογή την ανάγνωση των περιόδων σύνδεσης εγκατάστασης. Αυτό της επιτρέπει να βλέπει λεπτομέρειες σχετικά με τις εγκαταστάσεις του ενεργού πακέτου." "ζητά πακέτα εγκατάστασης" "Επιτρέπει σε μια εφαρμογή να ζητά εγκατάσταση πακέτων." + "αίτημα αγνόησης βελτιστοποιήσεων μπαταρίας" + "Επιτρέπει σε μια εφαρμογή να ζητήσει άδεια για την αγνόηση βελτιστοποιήσεων της μπαταρίας για τη συγκεκριμένη εφαρμογή." "Πατήστε δύο φορές για έλεγχο εστίασης" "Δεν ήταν δυνατή η προσθήκη του γραφικού στοιχείου." "Μετάβαση" @@ -1234,7 +1241,7 @@ "Ταπετσαρία" "Αλλαγή ταπετσαρίας" "Υπηρεσία ακρόασης ειδοποίησης" - "Λειτουργία ακρόασης Εικονικής Πραγματικότητας" + "Λειτουργία ακρόασης VR" "Πάροχος συνθηκών" "Υπηρεσία κατάταξης ειδοποιήσεων" "Το VPN ενεργοποιήθηκε" @@ -1558,7 +1565,7 @@ "Επιλογή έτους" "%1$s διαγράφηκε" "Εργασία %1$s" - "Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα \"Επιστροφή\"." + "Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα τις επιλογές \"Πίσω\" και \"Επισκόπηση\"." "Η εφαρμογή καρφιτσώθηκε: Το ξεκαρφίτσωμα δεν επιτρέπεται σε αυτήν τη συσκευή." "Η οθόνη καρφιτσώθηκε" "Η οθόνη ξεκαρφιτσώθηκε" diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index c6e04d71c5db..d650f15c09b0 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Connection problem or invalid MMI code." "Operation is restricted to fixed dialling numbers only." + "Cannot change call forwarding settings from your phone while you are roaming." "Service was enabled." "Service was enabled for:" "Service has been disabled." @@ -96,6 +97,8 @@ "Voice/Data services are blocked." "Voice/SMS services are blocked." "All voice/data/SMS services are blocked." + "Can’t find network" + "To improve signal, try changing the type selected at Settings > Mobile networks > Preferred network type." "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -179,6 +182,8 @@ "Work profile deleted due to missing admin app." "The work profile admin app is either missing or corrupted. As a result, your work profile and related data have been deleted. Contact your administrator for assistance." "Your work profile is no longer available on this device." + "Network traffic is being monitored" + "Tap to find out more" "Your device will be erased" "The admin app is missing components or corrupted, and can\'t be used. Your device will now be erased. Contact your administrator for assistance." "Me" @@ -1208,6 +1213,8 @@ "Allows an application to read install sessions. This allows it to see details about active package installations." "request install packages" "Allows an application to request installation of packages." + "ask to ignore battery optimisations" + "Allows an app to ask for permission to ignore battery optimisations for that app." "Tap twice for zoom control" "Couldn\'t add widget." "Go" @@ -1558,7 +1565,7 @@ "Select year" "%1$s deleted" "Work %1$s" - "To unpin this screen, touch & hold Back." + "To unpin this screen, touch & hold Back and Overview." "App is pinned: unpinning isn\'t allowed on this device." "Screen pinned" "Screen unpinned" diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index c6e04d71c5db..d650f15c09b0 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Connection problem or invalid MMI code." "Operation is restricted to fixed dialling numbers only." + "Cannot change call forwarding settings from your phone while you are roaming." "Service was enabled." "Service was enabled for:" "Service has been disabled." @@ -96,6 +97,8 @@ "Voice/Data services are blocked." "Voice/SMS services are blocked." "All voice/data/SMS services are blocked." + "Can’t find network" + "To improve signal, try changing the type selected at Settings > Mobile networks > Preferred network type." "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -179,6 +182,8 @@ "Work profile deleted due to missing admin app." "The work profile admin app is either missing or corrupted. As a result, your work profile and related data have been deleted. Contact your administrator for assistance." "Your work profile is no longer available on this device." + "Network traffic is being monitored" + "Tap to find out more" "Your device will be erased" "The admin app is missing components or corrupted, and can\'t be used. Your device will now be erased. Contact your administrator for assistance." "Me" @@ -1208,6 +1213,8 @@ "Allows an application to read install sessions. This allows it to see details about active package installations." "request install packages" "Allows an application to request installation of packages." + "ask to ignore battery optimisations" + "Allows an app to ask for permission to ignore battery optimisations for that app." "Tap twice for zoom control" "Couldn\'t add widget." "Go" @@ -1558,7 +1565,7 @@ "Select year" "%1$s deleted" "Work %1$s" - "To unpin this screen, touch & hold Back." + "To unpin this screen, touch & hold Back and Overview." "App is pinned: unpinning isn\'t allowed on this device." "Screen pinned" "Screen unpinned" diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index c6e04d71c5db..d650f15c09b0 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Connection problem or invalid MMI code." "Operation is restricted to fixed dialling numbers only." + "Cannot change call forwarding settings from your phone while you are roaming." "Service was enabled." "Service was enabled for:" "Service has been disabled." @@ -96,6 +97,8 @@ "Voice/Data services are blocked." "Voice/SMS services are blocked." "All voice/data/SMS services are blocked." + "Can’t find network" + "To improve signal, try changing the type selected at Settings > Mobile networks > Preferred network type." "Peer requested TTY Mode FULL" "Peer requested TTY Mode HCO" "Peer requested TTY Mode VCO" @@ -179,6 +182,8 @@ "Work profile deleted due to missing admin app." "The work profile admin app is either missing or corrupted. As a result, your work profile and related data have been deleted. Contact your administrator for assistance." "Your work profile is no longer available on this device." + "Network traffic is being monitored" + "Tap to find out more" "Your device will be erased" "The admin app is missing components or corrupted, and can\'t be used. Your device will now be erased. Contact your administrator for assistance." "Me" @@ -1208,6 +1213,8 @@ "Allows an application to read install sessions. This allows it to see details about active package installations." "request install packages" "Allows an application to request installation of packages." + "ask to ignore battery optimisations" + "Allows an app to ask for permission to ignore battery optimisations for that app." "Tap twice for zoom control" "Couldn\'t add widget." "Go" @@ -1558,7 +1565,7 @@ "Select year" "%1$s deleted" "Work %1$s" - "To unpin this screen, touch & hold Back." + "To unpin this screen, touch & hold Back and Overview." "App is pinned: unpinning isn\'t allowed on this device." "Screen pinned" "Screen unpinned" diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index ea1c1a5bda83..2db6686a0b6f 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problema de conexión o código incorrecto de MMI." "La operación está limitada a números de marcación fija." + "No se puede cambiar la configuración de reenvío de llamadas de tu teléfono mientras usas el servicio de roaming." "Se ha activado el servicio." "Se activó el servicio para:" "Se ha desactivado el servicio." @@ -96,6 +97,8 @@ "Los servicios de voz o datos están bloqueados." "Los servicios de voz/SMS están bloqueados." "Todos los servicios de voz, datos o SMS están bloqueados." + "No se puede establecer conexión con la red" + "Para mejorar la recepción, intenta cambiar el tipo de red seleccionado en Configuración > Redes móviles > Tipo de red preferido." "El dispositivo del mismo nivel solicitó el modo TTY FULL." "El dispositivo del mismo nivel solicitó el modo TTY HCO." "El dispositivo del mismo nivel solicitó el modo TTY VCO." @@ -179,6 +182,8 @@ "Se eliminó el perfil de trabajo debido a la falta de una aplicación de administración." "La aplicación de administración de perfil de trabajo no se encuentra o está dañada. Por lo tanto, se eliminaron tu perfil de trabajo y los datos relacionados. Para obtener asistencia, comunícate con el administrador." "Tu perfil de trabajo ya no está disponible en este dispositivo." + "Se está controlando el tráfico de red" + "Presiona para obtener más información" "Se borrarán los datos del dispositivo" "La aplicación de administración no cuenta con algunos componentes o está dañada, de modo que no puede usarse. Se borrarán los datos del dispositivo. Para obtener asistencia, comunícate con el administrador." "Yo" @@ -792,12 +797,12 @@ "Circunscripción" "Área" "Emirato" - "leer tus marcadores web y el historial" - "Permite que la aplicación consulte el historial de todas las URL visitadas por el navegador, y todos sus marcadores. Nota: Este permiso no puede ser utilizado por navegadores externos ni otras aplicaciones que tengan funciones de navegación por Internet." - "escribir marcadores web e historial" - "Permite que la aplicación modifique el historial o los marcadores del navegador almacenados en la tablet. La aplicación puede utilizar este permiso para borrar o modificar datos del navegador. Nota: Este permiso no puede ser utilizado por navegadores externos ni otras aplicaciones que tengan funciones de navegación por Internet." - "Permite que la aplicación modifique el historial o los marcadores del navegador almacenados en la TV. Esta opción puede permitir que la aplicación borre o modifique los datos del navegador. Ten en cuenta que este permiso no puede ser usado por navegadores de terceros ni otras aplicaciones con capacidades de navegación web." - "Permite que la aplicación modifique el historial o los marcadores del navegador almacenados en el dispositivo. La aplicación puede utilizar este permiso para borrar o modificar los datos del navegador. Nota: Este permiso no puede ser utilizado por navegadores externos ni otras aplicaciones que tengan funciones de navegación por Internet." + "leer tus favoritos web y el historial" + "Permite que la aplicación consulte el historial de todas las URL visitadas por el navegador, y todos sus favoritos. Nota: Este permiso no puede ser utilizado por navegadores externos ni otras aplicaciones que tengan funciones de navegación por Internet." + "escribir favoritos web e historial" + "Permite que la aplicación modifique el historial o los favoritos del navegador almacenados en la tablet. La aplicación puede utilizar este permiso para borrar o modificar datos del navegador. Nota: Este permiso no puede ser utilizado por navegadores externos ni otras aplicaciones que tengan funciones de navegación por Internet." + "Permite que la aplicación modifique el historial o los favoritos del navegador almacenados en la TV. Esta opción puede permitir que la aplicación borre o modifique los datos del navegador. Ten en cuenta que este permiso no puede ser usado por navegadores de terceros ni otras aplicaciones con capacidades de navegación web." + "Permite que la aplicación modifique el historial o los favoritos del navegador almacenados en el dispositivo. La aplicación puede utilizar este permiso para borrar o modificar los datos del navegador. Nota: Este permiso no puede ser utilizado por navegadores externos ni otras aplicaciones que tengan funciones de navegación por Internet." "programar una alarma" "Permite que la aplicación establezca una alarma en una aplicación de alarma instalada. Es posible que algunas aplicaciones de alarma no incluyan esta función." "agregar correo de voz" @@ -818,7 +823,7 @@ "Buscar" "Buscar…" "Buscar" - "Consulta de búsqueda" + "Búsqueda" "Eliminar la consulta" "Enviar consulta" "Búsqueda por voz" @@ -1208,6 +1213,8 @@ "Permite que una aplicación lea sesiones de instalación. Esto le permite ver detalles acerca de instalaciones de paquetes activas." "solicitar la instalación de paquetes" "Permite que una aplicación solicite la instalación de paquetes." + "solicitar permiso para ignorar las optimizaciones de la batería" + "Permite que una app solicite permiso para ignorar las optimizaciones de la batería." "Presiona dos veces para obtener el control del zoom" "No se pudo agregar el widget." "Ir" @@ -1558,7 +1565,7 @@ "Seleccionar año" "%1$s borrado" "%1$s de trabajo" - "Para dejar de fijar esta pantalla, mantén presionado Atrás." + "Para dejar de fijar esta pantalla, mantén presionados Atrás y Recientes." "La aplicación está fijada, no se puede anular la fijación en este dispositivo." "Pantalla fija" "Pantalla no fija" diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index c6d6663c2d6a..c140e0cf8b5a 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Se ha producido un problema de conexión o el código MMI no es válido." "La operación solo es válida para números de marcación fija." + "No se puede cambiar la configuración de desvío de llamada desde tu teléfono mientras estás en itinerancia." "El servicio se ha habilitado." "Se ha habilitado el servicio para:" "El servicio se ha inhabilitado." @@ -96,6 +97,8 @@ "Los servicios de voz y de datos están bloqueados." "Todos los servicios de voz y de SMS están bloqueados." "Todos los servicios de voz, de datos y de SMS están bloqueados." + "No se puede establecer conexión con la red" + "Para mejorar la recepción, intenta cambiar el tipo seleccionado en Ajustes > Redes móviles > Tipo de red preferida." "Un dispositivo ha solicitado el modo TTY FULL" "Un dispositivo ha solicitado el modo TTY HCO" "Un dispositivo ha solicitado el modo TTY VCO" @@ -179,6 +182,8 @@ "Perfil de trabajo eliminado porque falta la aplicación de administración." "La aplicación de administración del perfil de trabajo falta o está dañada. Como consecuencia, se han eliminado tu perfil de trabajo y todos los datos asociados. Si necesitas ayuda, ponte en contacto con tu administrador." "Tu perfil de trabajo ya no está disponible en este dispositivo." + "Se está controlando el tráfico de la red" + "Toca la notificación para obtener más información" "Tu dispositivo se borrará" "La aplicación de administración no se puede usar porque está dañada o le faltan componentes. Tu dispositivo se borrará. Si necesitas ayuda, ponte en contacto con tu administrador." "Yo" @@ -258,7 +263,7 @@ "Cámara" "hacer fotos y grabar vídeos" "Teléfono" - "hacer y administrar llamadas de teléfono" + "hacer y administrar llamadas telefónicas" "Sensores corporales" "acceder a datos de sensores de tus constantes vitales" "Recuperar el contenido de la ventana" @@ -1208,6 +1213,8 @@ "Permite que una aplicación consulte sesiones de instalación para ver detalles sobre instalaciones de paquetes activos." "solicitar instalación de paquetes" "Permite a una aplicación solicitar la instalación de paquetes." + "solicitar permiso para ignorar las optimizaciones de la batería" + "Permite que una aplicación solicite permiso para ignorar las optimizaciones de la batería." "Da dos toques para acceder al control de zoom." "No se ha podido añadir el widget." "Ir" @@ -1558,7 +1565,7 @@ "Seleccionar año" "%1$s eliminado" "%1$s de trabajo" - "Mantén pulsado el botón Atrás para dejar de fijar esta pantalla." + "Mantén pulsado el botón Atrás y el de aplicaciones recientes para dejar de fijar esta pantalla." "La aplicación está fijada: no se puede deshacer la fijación en este dispositivo." "Pantalla fijada" "La pantalla ya no está fija" diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 9263b59b65b9..91891b58bf02 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Ühendusprobleem või kehtetu MMI-kood." "Toiming on ainult fikseeritud valimisnumbritele." + "Kõne suunamise seadeid ei saa rändluse ajal teie telefonis muuta." "Teenus on lubatud." "Teenus oli lubatud järgmisele:" "Teenus on keelatud." @@ -96,6 +97,8 @@ "Hääl-/andmeteenused on blokeeritud." "Hääl-/SMS-teenused on blokeeritud." "Kõik hääl-/andme-/SMS-teenused on blokeeritud." + "Võrguga ei saa ühendust" + "Vastuvõtu parandamiseks muutke menüüs Seaded > Mobiilsidevõrgud > Eelistatud võrgutüüp valitud tüüpi." "Partner taotles TTY-režiimi TÄIELIK" "Partner taotles TTY-režiimi HCO" "Partner taotles TTY-režiimi VCO" @@ -179,6 +182,8 @@ "Tööprofiil on kustutatud puuduva administraatori rakenduse tõttu." "Tööprofiili administraatori rakendus puudub või on rikutud. Seetõttu on teie tööprofiil ja seotud andmed kustutatud. Abi saamiseks võtke ühendust administraatoriga." "Teie tööprofiil pole selles seadmes enam saadaval." + "Võrguliiklust jälgitakse" + "Puudutage lisateabe saamiseks" "Seade kustutatakse" "Administraatori rakendusel on puuduvaid osi või on see rikutud ja seda ei saa kasutada. Seade kustutatakse. Abi saamiseks võtke ühendust administraatoriga." "Mina" @@ -252,7 +257,7 @@ "SMS" "saata ja vaadata SMS-sõnumeid" "Mäluruum" - "juurde pääseda seadmesse salvestatud fotodele, meediasisule ja failidele" + "juurdepääs seadmesse salvestatud fotodele, meediasisule ja failidele" "Mikrofon" "heli salvestamine" "Kaamera" @@ -650,7 +655,7 @@ "Ema" "Vanem" "Partner" - "Viitas:" + "Soovitaja" "Sugulane" "Õde" "Abikaasa" @@ -1208,6 +1213,8 @@ "Lubab rakendusel lugeda installiseansse. See võimaldab näha aktiivse paketi installimise üksikasju." "installipakettide taotlemine" "Võimaldab rakendusel pakettide installimist taotleda." + "küsida luba aku optimeerimise eiramiseks" + "Lubab rakendusel küsida luba rakenduse aku optimeerimise eiramiseks." "Suumi kasutamiseks koputage kaks korda" "Vidinat ei saanud lisada." "Mine" @@ -1558,7 +1565,7 @@ "Aasta valimine" "%1$s on kustutatud" "Töö %1$s" - "Ekraani vabastamiseks puudutage pikalt nuppu Tagasi." + "Ekraani vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade." "Rakendus on kinnitatud: vabastamine pole selles seadmes lubatud." "Ekraan on kinnitatud" "Ekraan on vabastatud" diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 97628fc76836..1ab61c6174cc 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Konexio-arazoren bat gertatu da edo MMI kodea baliogabea da." "Eragiketa markatze finkoko zenbakietara murriztua dago." + "Ezin dira aldatu deiak desbideratzeko ezarpenak telefonoa ibiltaritzan dagoenean." "Zerbitzua gaitu da." "Zerbitzua honetarako gaitu da:" "Zerbitzua desgaitu da." @@ -96,6 +97,8 @@ "Ahots- eta datu-zerbitzuak blokeatuta daude." "Ahots eta SMS zerbitzuak blokeatuta daude." "Ahotsaren, datuen eta SMSen zerbitzuak blokeatuta daude." + "Ezin da konektatu sarera" + "Seinalea hobea izan dadin, aldatu hautatutako mota Ezarpenak > Sare mugikorrak > Sare mota hobetsia atalean." "Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du" "Beste gailuak TTY osagarria HCO moduan erabiltzea eskatu du" "Beste gailuak TTY osagarria VCO moduan erabiltzea eskatu du" @@ -179,6 +182,8 @@ "Laneko profila ezabatu egin da hura administratzeko aplikazioa falta delako." "Laneko profila administratzeko aplikazioa falta da edo hondatuta dago. Ondorioz, laneko profila eta horrekin erlazionatutako datuak ezabatu egin dira. Laguntza lortzeko, jarri administratzailearekin harremanetan." "Work profila ez dago erabilgarri gailu honetan." + "Sareko trafikoa gainbegiratzen da" + "Sakatu informazio gehiago lortzeko" "Gailuko datuak ezabatu egingo dira" "Administrazio-aplikazioaren osagai batzuk falta dira edo aplikazioa hondatuta dago eta ezin da erabili. Gailuko datuak ezabatu egingo dira. Laguntza lortzeko, jarri administratzailearekin harremanetan." "Ni" @@ -1075,7 +1080,7 @@ "Hasi saioa sarean" - "Wi-Fi eginbidea ezin da Internetera konektatu" + "Ezin da konektatu Internetera Wi-Fi bidez" "Sakatu aukerak ikusteko" "%1$s erabiltzen ari zara orain" "%2$s Internetera konektatzeko gauza ez denean, %1$s erabiltzen du gailuak. Agian kostuak ordaindu beharko dituzu." @@ -1208,6 +1213,8 @@ "Instalazio-saioak irakurtzea baimentzen die aplikazioei. Horrela, pakete-instalazio aktiboei buruzko xehetasunak ikus ditzakete." "Eskatu instalazio-paketeak" "Paketeak instalatzeko eskatzea baimentzen die aplikazioei." + "Eskatu bateriaren optimizazioei ez ikusi egitea" + "Bateriaren optimizazioei ez ikusi egiteko baimena eskatzea baimentzen die aplikazioei." "Sakatu birritan zooma kontrolatzeko" "Ezin izan da widgeta gehitu." "Joan" @@ -1234,7 +1241,7 @@ "Horma-papera" "Aldatu horma-papera" "Jakinarazpenak hautemateko zerbitzua" - "Errealitate birtualeko hautemailea" + "EB hautemailea" "Baldintza-hornitzailea" "Jakinarazpenen sailkapen-zerbitzua" "VPN eginbidea aktibatuta" @@ -1558,7 +1565,7 @@ "Hautatu urtea" "%1$s ezabatu da" "Laneko %1$s" - "Pantailari aingura kentzeko, eduki sakatuta Atzera botoia." + "Pantailari aingura kentzeko, eduki sakatuta Atzera eta Ikuspegi orokorra botoiak." "Aplikazioa ainguratuta dago. Gailu honetan ezin da aingura kendu." "Pantaila ainguratu da" "Aingura kendu zaio pantailari" diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 128a66f394da..1c9289b37599 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "‏مشکل در اتصال یا کد MMI نامعتبر." "عملکرد فقط به شماره‌های شماره‌گیری ثابت محدود است." + "وقتی درحال رومینگ هستید، نمی‌توانید تنظیمات هدایت تماس را از تلفنتان تغییر دهید." "سرویس فعال شد." "سرویس فعال شد برای:" "سرویس غیرفعال شده است." @@ -96,6 +97,8 @@ "‏سرویس‎‎های صدا/داده مسدود شدند." "سرویس‌های صوتی/پیامک مسدود شده‌اند" "تمام سرویس‌های صدا/داده/ پیامک مسدود هستند." + "شبکه دردسترس نیست" + "‏برای بهبود دریافت، نوع شبکه‌ای را که انتخاب کرده‌اید در «تنظیمات > شبکه‌های تلفن همراه & gt؛ نوع شبکه ترجیحی» تغییر دهید." "‏دستگاه مرتبط درخواست TTY حالت FULL کرد" "‏دستگاه مرتبط درخواست TTY حالت HCO کرد" "‏دستگاه مرتبط درخواست TTY حالت VCO کرد" @@ -179,6 +182,8 @@ "به دلیل نداشتن برنامه سرپرست، نمایه کار حذف شده است." "برنامه سرپرست نمایه کار وجود ندارد یا خراب است. در نتیجه، نمایه کاریتان و اطلاعات مرتبط حذف شده است. برای دریافت راهنمایی با سرپرستتان تماس بگیرید." "نمایه کاری شما دیگر در این دستگاه در دسترس نیست." + "ترافیک شبکه، تحت نظارت است" + "برای اطلاعات بیشتر ضربه بزنید" "دستگاهتان پاک خواهد شد" "برنامه سرپرست بخش‌هایی را ندارد یا خراب است، و نمی‌تواند استفاده شود. دستگاهتان اکنون پاک می‌شود. برای این که راهنمایی شوید، با سرپرستتان تماس بگیرید." "من" @@ -1208,6 +1213,8 @@ "به برنامه اجازه می‌دهد جلسات نصب را بخواند. این کار به برنامه اجازه می‌دهد جزئیات نصب‌های بسته فعال را ببیند." "درخواست نصب بسته" "به برنامه اجازه می‌دهد درخواست نصب بسته‌بندی کند." + "درخواست نادیده‌گرفتن بهینه‌سازی باتری" + "به یک برنامه اجازه می‌دهد جهت نادیده گرفتن بهینه‌سازی باتری برای خود مجوز درخواست کند." "برای کنترل بزرگ‌نمایی، دو بار ضربه بزنید" "افزودن ابزارک انجام نشد." "برو" @@ -1558,7 +1565,7 @@ "انتخاب سال" "%1$s حذف شد" "%1$s محل کار" - "برای برداشتن پین این صفحه، «برگشت» را لمس کنید و نگه‌ دارید." + "برای برداشتن پین این صفحه، «برگشت» و «نمای کلی» را لمس کنید و نگه‌دارید." "برنامه پین شده است: برداشتن پین در این دستگاه مجاز نیست." "صفحه پین شد" "پین صفحه برداشته شد" diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index c4c223bd7085..dce680d01b91 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Yhteysongelma tai virheellinen MMI-koodi." "Voit suorittaa toiminnon vain sallitut puhelut -numeroihin." + "Soitonsiirtoasetuksia ei voi muuttaa puhelimella roaming-tilassa." "Palvelu otettiin käyttöön." "Palvelu käytössä luokalle:" "Palvelu on poistettu käytöstä." @@ -96,6 +97,8 @@ "Ääni/tiedonsiirtopalvelut on estetty." "Ääni/tekstiviestipalvelut on estetty." "Kaikki ääni-/tiedonsiirto-/tekstiviestipalvelut on estetty." + "Ei yhteyttä verkkoon" + "Voit yrittää parantaa kuuluvuutta vaihtamalla tyypin asetusta. Valitse Asetukset > Matkapuhelinverkot > Ensisijainen verkko." "Toinen käyttäjä vaihtoi TTY-tilaksi TÄYSI" "Toinen käyttäjä vaihtoi TTY-tilaksi HCO" "Toinen käyttäjä vaihtoi TTY-tilaksi VCO" @@ -179,6 +182,8 @@ "Työprofiili poistettiin, koska laitteelta puuttuu järjestelmänvalvojasovellus." "Työprofiilin järjestelmänvalvojasovellus puuttuu tai se on vioittunut. Tästä syystä työprofiilisi ja siihen liittyvät tiedot on poistettu. Pyydä ohjeita järjestelmänvalvojaltasi." "Työprofiilisi ei ole enää käytettävissä tällä laitteella." + "Verkkoliikennettä seurataan" + "Lue lisää napauttamalla." "Laitteen tiedot poistetaan" "Järjestelmänvalvojasovelluksesta puuttuu osia tai se on vioittunut, eikä sitä voi käyttää. Laitteen tiedot poistetaan. Pyydä ohjeita järjestelmänvalvojaltasi." "Minä" @@ -1208,6 +1213,8 @@ "Sallii sovelluksen lukea asennusistuntoja. Toiminto sallii sovelluksen lukea aktiivisten asennuspakettien tietoja." "pyytää asennuspaketteja" "Antaa sovelluksen pyytää pakettien asennusta." + "Lupa ohittaa akun optimoinnit" + "Sallii sovelluksen pyytää lupaa ohittaa tietyn sovelluksen akun optimoinnit." "Hallitse zoomausta napauttamalla kahdesti" "Widgetin lisääminen epäonnistui." "Siirry" @@ -1234,7 +1241,7 @@ "Taustakuva" "Vaihda taustakuvaa" "Ilmoituskuuntelija" - "Virtuaalitodellisuuden kuuntelija" + "VR-kuuntelija" "Ehtojen toimituspalvelu" "Ilmoitusten sijoituspalvelu" "VPN on aktivoitu" @@ -1558,7 +1565,7 @@ "Valitse vuosi" "%1$s poistettiin" "%1$s (työ)" - "Irrota näyttö koskettamalla Takaisin-painiketta pitkään." + "Irrota näyttö koskettamalla pitkään Takaisin- ja Viimeisimmät-painikkeita." "Sovellus on kiinnitetty. Irrottaminen ei ole sallittua tällä laitteella." "Näyttö kiinnitetty" "Näyttö irrotettu" @@ -1606,7 +1613,7 @@ "Kunnes kello on %1$s" "%1$s asti (seuraava hälytys)" - "Kunnes poistat tämän käytöstä" + "Kunnes otat tämän pois päältä" "Kunnes poistat Varattu-tilan käytöstä." "%1$s/%2$s" "Kutista" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index e52eeda9f7f3..5d63bae107b7 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problème de connexion ou code IHM incorrect" "Opération réservée aux numéros autorisés" + "Impossible de modifier les paramètres de transfert d\'appel sur votre téléphone lorsque vous êtes en itinérance." "Le service a été activé." "Ce service a été activé pour :" "Ce service a été désactivé." @@ -96,6 +97,8 @@ "Les services vocaux/de données sont bloqués." "Les services voix/SMS sont bloqués." "Tous les services vocaux/de données/SMS sont bloqués." + "Impossible de joindre le réseau" + "Pour améliorer la réception, essayez de changer le type de réseau sélectionné, sous Paramètres > Réseaux cellulaires > Type de réseau préféré." "Mode TTY COMPLET demandé par un pair" "Mode TTY HCO demandé par un pair" "Mode TTY VCO demandé par un pair" @@ -179,6 +182,8 @@ "Profil professionnel supprimé en raison de l\'application d\'administration manquante." "Le profil professionnel de l\'application d\'administration est manquant ou corrompu. Votre profil professionnel et ses données connexes ont donc été supprimés. Communiquez avec votre administrateur pour obtenir de l\'assistance." "Votre profil professionnel n\'est plus accessible sur cet appareil." + "Le trafic réseau est surveillé" + "Touchez ici pour en savoir plus" "Le contenu de votre appareil sera effacé" "Des éléments de l\'application d\'administration sont manquants ou celle-ci est corrompue, ce qui la rend inutilisable. Le contenu de votre appareil sera maintenant effacé. Communiquez avec votre administrateur pour obtenir de l\'assistance." "Moi" @@ -1060,7 +1065,7 @@ "Volume des notifications" "Sonnerie par défaut" "Sonnerie par défaut (%1$s)" - "Aucune" + "Aucun" "Sonneries" "Sonnerie inconnue" @@ -1208,6 +1213,8 @@ "Permet à une application d\'accéder aux sessions d\'installation. Cela lui permet de consulter les détails relatifs à l\'installation des paquets actifs." "demander l\'installation de paquets" "Permet à une application de demander l\'installation de paquets." + "demander d\'ignorer les optimisations de la pile" + "Permet à une application de demander la permission d\'ignorer les optimisations de la pile." "Appuyer deux fois pour régler le zoom" "Impossible d\'ajouter le widget." "Aller" @@ -1558,7 +1565,7 @@ "Sélectionnez une année" "« %1$s » a été supprimé" "%1$s (travail)" - "Pour annuler l\'épinglage de cet écran, maintenez enfoncée la touche Retour." + "Pour annuler l\'épinglage de cet écran, maintenez enfoncées les touches Retour et Aperçu." "L\'application est épinglée : l\'annulation de l\'épinglage n\'est pas autorisée sur cet appareil." "Écran épinglé" "Épinglage d\'écran annulé" diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 9da228e40d01..faa5686593da 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problème de connexion ou code IHM non valide." "Opération réservée aux numéros autorisés" + "Impossible de modifier les paramètres de transfert d\'appel depuis votre téléphone lorsque vous êtes en itinérance." "Le service a été activé." "Ce service a été activé pour :" "Ce service a été désactivé." @@ -96,6 +97,8 @@ "Les services vocaux/de données sont bloqués." "Les services voix/SMS sont bloqués." "Tous les services vocaux/de données/SMS sont bloqués." + "Impossible d\'accéder au réseau" + "Pour améliorer la réception, essayez de modifier le type sélectionné sous Paramètres > Réseaux mobiles > Type de réseau préféré." "Mode TTY demandé par l\'interlocuteur : COMPLET" "Mode TTY demandé par l\'interlocuteur : HCO" "Mode TTY demandé par l\'interlocuteur : VCO" @@ -179,6 +182,8 @@ "Le profil professionnel a été supprimé, car une application d\'administration est manquante." "L\'application d\'administration du profil professionnel est manquante ou endommagée. Par conséquent, votre profil professionnel et toutes les données associées ont été supprimés. Pour obtenir de l\'aide, contactez l\'administrateur." "Votre profil professionnel n\'est plus disponible sur cet appareil." + "Le trafic réseau est surveillé" + "Appuyez sur cette notification pour en savoir plus" "Les données de votre appareil vont être effacées" "Certains composants de l\'application d\'administration sont manquants ou endommagés, et l\'application est donc inutilisable. Les données de votre appareil vont maintenant être effacées. Pour obtenir de l\'aide, contactez l\'administrateur." "Moi" @@ -1208,6 +1213,8 @@ "Permet à une application d\'accéder aux sessions d\'installation. Cela lui permet de consulter les détails relatifs à l\'installation des packages actifs." "demander l\'installation de packages" "Permet à une application de demander l\'installation de packages." + "demander à ignorer les optimisations de batterie" + "Autorise une application à demander l\'autorisation d\'ignorer les optimisations de batterie pour cette application." "Appuyer deux fois pour régler le zoom" "Impossible d\'ajouter le widget." "OK" @@ -1558,7 +1565,7 @@ "Sélectionner une année" "\"%1$s\" supprimé" "%1$s (travail)" - "Pour annuler l\'épinglage, appuyez de manière prolongée sur \"Retour\"." + "Pour annuler l\'épinglage de l\'écran, appuyez de manière prolongée sur les boutons Retour et Aperçu." "L\'application est épinglée. L\'annulation de l\'épinglage n\'est pas autorisée sur cet appareil." "Écran épinglé." "Épinglage d\'écran annulé." diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index 72757a6aae6b..4ab2a9a9589f 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problema de conexión ou código MMI non válido." "A operación está restrinxida a números de marcación fixa." + "Non se pode cambiar a configuración do desvío de chamadas desde o teléfono mentres estás en itinerancia." "Activouse o servizo." "Activouse o servizo para:" "Desactivouse o servizo." @@ -96,6 +97,8 @@ "Os servizos de voz/datos están bloqueados." "Os servizos de voz/SMS están bloqueados." "Todos os servizos de voz/datos/SMS están bloqueados." + "Non se pode conectar coa rede" + "Para mellorar a recepción, proba a cambiar o tipo seleccionado en Configuración > Redes móbiles > Tipo de rede preferido." "Outro dispositivo solicitou o modo TTY COMPLETO" "Outro dispositivo solicitou o modo TTY HCO" "Outro dispositivo solicitou o modo TTY VCO" @@ -179,6 +182,8 @@ "Eliminouse o perfil de traballo porque falta a aplicación de administración." "Falta a aplicación de administración no perfil de traballo ou ben está danada. Como resultado, eliminouse o teu perfil de traballo e os datos relacionados. Ponte en contacto co teu administrador para obter asistencia." "O teu perfil de traballo xa non está dispoñible neste dispositivo." + "Estase controlando o tráfico da rede" + "Toca para obter máis información" "Borrarase o teu dispositivo" "Non se pode utilizar a aplicación de administración porque lle faltan compoñentes ou están danados. Agora borrarase o teu dispositivo. Ponte en contacto co teu administrador para obter asistencia." "Eu" @@ -551,7 +556,7 @@ "Traballo" "Fax do traballo" "Fax particular" - "Busca" + "Buscapersoas" "Outros" "Personalizado" @@ -594,7 +599,7 @@ "Traballo" "Fax do traballo" "Fax particular" - "Busca" + "Buscapersoas" "Outro" "Devolver chamada" "Coche" @@ -606,7 +611,7 @@ "Télex" "TTY TDD" "Móbil do traballo" - "Busca do traballo" + "Buscapersoas do traballo" "Asistente" "MMS" "Personalizados" @@ -1208,6 +1213,8 @@ "Permite que unha aplicación consulte as sesións de instalación. Desta forma, pode ver os detalles acerca das instalacións de paquetes activas." "solicitar instalación de paquetes" "Permite a unha aplicación solicitar a instalación dos paquetes." + "pedir que se ignore a optimización da batería" + "Fai que unha aplicación poida solicitar permiso para ignorar as optimizacións da batería." "Toca dúas veces para controlar o zoom" "Non se puido engadir o widget." "Ir" @@ -1558,7 +1565,7 @@ "Seleccionar ano" "%1$s eliminado" "%1$s do traballo" - "Para soltar a pantalla, mantén premido Volver." + "Para soltar a pantalla, mantén premido Atrás e Visión xeral." "A aplicación está fixada: non se permite soltala neste dispositivo." "Pantalla fixada" "Pantalla desactivada" diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index a233361d5792..290e885c9ce7 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "કનેક્શન સમસ્યા અથવા અમાન્ય MMI કોડ." "ઑપરેશન ફક્ત સ્થિર ડાયલિંગ નંબર્સ પર પ્રતિબંધિત છે." + "તમે રોમિંગમાં હોવ તે વખતે તમારા ફોન પરથી કૉલ ફોરવર્ડિગ સેટિંગ્સ બદલી શકતાં નથી." "સેવા સક્ષમ હતી." "સેવા આ માટે સક્ષમ હતી:" "સેવા અક્ષમ કરવામાં આવી છે." @@ -96,6 +97,8 @@ "વૉઇસ/ડેટા સેવાઓ અવરોધિત છે." "તમામ વૉઇસ/SMS સેવાઓ અવરોધિત છે." "તમામ વૉઇસ/ડેટા/SMS સેવાઓ અવરોધિત છે." + "નેટવર્ક પર પહોંચી શકાતું નથી" + "પ્રાપ્તિને બહેતર બનાવવા માટે, સેટિંગ્સ > સેલ્યુલર નેટવર્ક્સ > પસંદગીનો નેટવર્ક પ્રકાર પર પસંદ કરેલ પ્રકારને બદલી જુઓ." "પીઅરે TTY મોડ પૂર્ણની વિનંતી કરી" "પીઅરે TTY મોડ HCO ની વિનંતી કરી" "પીઅરે TTY મોડ VCO ની વિનંતી કરી" @@ -179,6 +182,8 @@ "ખૂટતી એડમિન એપ્લિકેશનને કારણે કાર્ય પ્રોફાઇલ કાઢી નાખી." "કાર્ય પ્રોફાઇલ વ્યવસ્થાપક ઍપ્લિકેશન કાં તો ખૂટે છે અથવા દૂષિત છે. પરિણામે, તમારી કાર્ય પ્રોફાઇલ અને સંબંધિત ડેટા કાઢી નાખવામાં આવ્યો છે. સહાયતા માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો." "આ ઉપકરણ પર તમારી કાર્ય પ્રોફાઇલ હવે ઉપલબ્ધ નથી." + "નેટવર્ક ટ્રાફિક મૉનિટર કરવામાં આવી રહ્યું છે" + "વધુ જાણવા માટે ટૅપ કરો" "તમારું ઉપકરણ કાઢી નાખવામાં આવશે" "એડમિન એપ્લિકેશનમાં ઘટકો ખૂટે છે અથવા દૂષિત છે અને વાપરી શકાશે નહીં. તમારું ઉપકરણ હવે કાઢી નાખવામાં આવશે. સહાયતા માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો." "હું" @@ -1208,6 +1213,8 @@ "એપ્લિકેશનને ઇન્સ્ટોલ સત્રોને વાંચવાની મંજૂરી આપે છે. આ તેને સક્રિય પૅકેજ ઇન્સ્ટોલેશન્સ વિશે વિગતો જોવાની મંજૂરી આપે છે." "પૅકેજેસ ઇન્સ્ટૉલ કરવાની વિનંતી કરો" "એપ્લિકેશનને પૅકેજેસના ઇન્સ્ટોલેશનની વિનંતી કરવાની મંજૂરી આપો." + "બૅટરી ઓપ્ટિમાઇઝેશન્સને અવગણવા માટે પૂછો" + "ઍપ્લિકેશનને તે ઍપ્લિકેશન માટે બૅટરી ઓપ્ટિમાઇઝેશન્સને અવગણવાની પરવાનગી આપવા માટે પૂછવાની મંજૂરી આપે છે." "ઝૂમ નિયંત્રણ માટે બેવાર ટૅપ કરો" "વિજેટ ઉમેરી શકાયું નથી." "જાઓ" @@ -1558,7 +1565,7 @@ "વર્ષ પસંદ કરો" "%1$s કાઢી નાખી" "કાર્યાલય %1$s" - "આ સ્ક્રીનને અનપિન કરવા માટે, પાછળને ટચ કરીને પકડી રાખો." + "આ સ્ક્રીનને અનપિન કરવા માટે, પાછળ અને વિહંગાવલોકનને ટચ કરો અને પકડો." "ઍપ્લિકેશન પિન કરેલ છે. આ ઉપકરણ પર અનપિન કરવાની મંજૂરી નથી." "સ્ક્રીન પિન કરી" "સ્ક્રીન અનપિન કરી" diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index ea45c1a17642..96be6b0edeff 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "कनेक्‍शन समस्‍या या अमान्‍य MMI कोड." "कार्रवाई केवल फ़िक्‍स्‍ड डायलिंग नंबर के लिए प्रतिबंधित है." + "आपके रोमिंग में होने पर आपके फ़ोन से कॉल अग्रेषण की सेटिंग नहीं बदली जा सकतीं." "सेवा अक्षम थी." "सेवा इसके लिए सक्षम की गई थी:" "सेवा अक्षम कर दी गई है." @@ -96,6 +97,8 @@ "ध्‍वनि/डेटा सेवाएं अवरोधित हैं." "ध्‍वनि/SMS सेवाएं अवरोधित हैं." "सभी ध्‍वनि/डेटा/SMS सेवाएं अवरोधित हैं." + "नेटवर्क तक नहीं पहुंच पा रहे हैं" + "रिसेप्शन बेहतर करने के लिए, सेटिंग > सेल्युलर नेटवर्क > पसंदीदा नेटवर्क प्रकार में चयनित प्रकार को बदलकर देखें." "पीयर ने TTY मोड पूर्ण का अनुरोध किया" "पीयर ने TTY मोड HCO का अनुरोध किया" "पीयर ने TTY मोड VCO का अनुरोध किया" @@ -153,10 +156,10 @@ "सर्वर से कनेक्ट नहीं किया जा सका." "सर्वर से संचार नहीं किया जा सका. बाद में पुन: प्रयास करें." "सर्वर से कनेक्‍शन का समय समाप्त हुआ." - "पृष्ठ में कई सर्वर रीडायरेक्‍ट हैं." + "पेज में कई सर्वर रीडायरेक्‍ट हैं." "प्रोटोकॉल समर्थित नहीं है." "सुरक्षित कनेक्शन स्थापित नहीं किया जा सका." - "URL अमान्‍य होने के कारण पृष्ठ नहीं खोला जा सका." + "URL अमान्‍य होने के कारण पेज नहीं खोला जा सका." "फ़ाइल पर नहीं पहुंचा जा सका." "अनुरोधित फ़ाइल नहीं मिल सकी." "बहुत सारे अनुरोधों का संसाधन हो रहा है. बाद में पुन: प्रयास करें." @@ -179,6 +182,8 @@ "अनुपलब्‍ध व्‍यवस्‍थापक ऐप के कारण कार्य प्रोफ़ाइल हटाई गई." "कार्य प्रोफ़ाइल व्‍यवस्‍थापक ऐप या तो अनुपलब्‍ध है या दूषित है. परिणाम स्‍वरूप, आपकी कार्य प्रोफ़ाइल और संबंधित डेटा हटा दिया गया है. सहायता के लिए अपने नियंत्रक से संपर्क करें." "आपकी कार्य प्रोफ़ाइल इस डिवाइस पर उपलब्‍ध नहीं है." + "नेटवर्क ट्रैफ़िक मॉनीटर किया जा रहा है" + "अधिक जानने के लिए टैप करें" "आपके डिवाइस को मिटा दिया जाएगा" "व्‍यवस्‍थापक ऐप में घटक अनुपलब्‍ध हैं या वह दूषित है और उसका उपयोग नहीं किया जा सकता. आपके डिवाइस को अब मिटा दिया जाएगा. सहायता के लिए अपने नियंत्रक से संपर्क करें." "मैं" @@ -347,14 +352,14 @@ "ऐप्स को इनकमिंग और आउटगोइंग कॉल के डेटा सहित, आपके फ़ोन का कॉल लॉग संशोधित करने देता है. दुर्भावनापूर्ण ऐप्स आपके कॉल लॉग को मिटाने या संशोधित करने के लिए इसका उपयोग कर सकते हैं." "शरीर संवेदक एक्सेस करें (जैसे हृदय गति मॉनीटर)" "ऐप को आपकी शारीरिक स्‍थिति, जैसे आपकी हृदय गति पर नज़र रखने वाले संवेदकों का डेटा एक्‍सेस करने देती है." - "केलैंडर ईवेंट के साथ-साथ गोपनीय जानकारी पढ़ें" + "केलैंडर इवेंट के साथ-साथ गोपनीय जानकारी पढ़ें" "ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके टेबलेट पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे निजता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है." - "ऐप को, मित्रों और सहकर्मियों के कैलेंडर ईवेंट सहित, आपके टीवी पर संग्रहीत सभी कैलेंडर ईवेंट पढ़ने देती है. इससे ऐप को निजता या संवेदनशीलता पर ध्‍यान दिए बिना, आपका कैलेडर डेटा साझा करने या सहेजने की अनुमति मिल जाती है." + "ऐप को, मित्रों और सहकर्मियों के कैलेंडर इवेंट सहित, आपके टीवी पर संग्रहीत सभी कैलेंडर इवेंट पढ़ने देती है. इससे ऐप को निजता या संवेदनशीलता पर ध्‍यान दिए बिना, आपका कैलेडर डेटा साझा करने या सहेजने की अनुमति मिल जाती है." "ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके फ़ोन पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे निजता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है." - "अपनी जानकारी के बि‍ना कैलेंडर ईवेंट जोड़ें या संशोधि‍त करें और अति‍थि‍यों को ईमेल भेजें" - "ऐप्स को मित्रों या सहकर्मियों के ईवेंट के साथ ही वे ईवेंट जोड़ने, निकालने, बदलने देता है जिन्हें आप अपने टेबलेट पर संशोधित कर सकते हैं. इससे ऐप्स ,अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर स्वामियों की ओर से आते दिखाई देते हैं, या ईवेंट संशोधित कर सकता है." - "ऐप को ऐसे ईवेंट जोड़ने, निकालने, बदलने देती है जिन्हें आप अपने डिवाइस पर बदल सकते हैं, जिनमें मित्रों या सहकर्मियों के ईवेंट शामिल हैं. इससे ऐप ऐसे संदेश भेज सकता है जो कैलेंडर स्वामी से आते हुए प्रतीत होते हैं या ऐप स्वामी की जानकारी के बिना ईवेंट बदल सकता है." - "ऐप्स को मित्रों या सहकर्मियों के ईवेंट के साथ ही वे ईवेंट जोड़ने, निकालने, बदलने देता है जिन्हें आप अपने फ़ोन पर संशोधित कर सकते हैं. इससे ऐप्स , अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर स्वामियों की ओर से आते दिखाई देते हैं, या ईवेंट संशोधित कर सकता है." + "अपनी जानकारी के बि‍ना कैलेंडर इवेंट जोड़ें या संशोधि‍त करें और अति‍थि‍यों को ईमेल भेजें" + "ऐप्स को मित्रों या सहकर्मियों के इवेंट के साथ ही वे इवेंट जोड़ने, निकालने, बदलने देता है जिन्हें आप अपने टेबलेट पर संशोधित कर सकते हैं. इससे ऐप्स ,अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर स्वामियों की ओर से आते दिखाई देते हैं, या इवेंट संशोधित कर सकता है." + "ऐप को ऐसे इवेंट जोड़ने, निकालने, बदलने देती है जिन्हें आप अपने डिवाइस पर बदल सकते हैं, जिनमें मित्रों या सहकर्मियों के इवेंट शामिल हैं. इससे ऐप ऐसे संदेश भेज सकता है जो कैलेंडर स्वामी से आते हुए प्रतीत होते हैं या ऐप स्वामी की जानकारी के बिना इवेंट बदल सकता है." + "ऐप्स को मित्रों या सहकर्मियों के इवेंट के साथ ही वे इवेंट जोड़ने, निकालने, बदलने देता है जिन्हें आप अपने फ़ोन पर संशोधित कर सकते हैं. इससे ऐप्स , अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर स्वामियों की ओर से आते दिखाई देते हैं, या इवेंट संशोधित कर सकता है." "अतिरिक्त स्‍थान प्रदाता आदेशों में पहुंचे" "ऐप्स को अतिरिक्त स्थान प्रदाता आदेशों पर पहुंचने देती है. इससे ऐप्स GPS या अन्य स्थान स्रोतों के संचालन में अवरोध पहुंचा सकता है." "सटीक स्थान एक्सेस करें (GPS और नेटवर्क-आधारित)" @@ -410,7 +415,7 @@ "वाई-फ़ाई कनेक्‍शन देखें" "ऐप्स को वाई-फ़ाई नेटवर्क के बारे में जानकारी, जैसे WI-Fi सक्षम है या नहीं और कनेक्‍ट किए गए वाई-फ़ाई डिवाइस के नाम, देखने देता है." "वाई-फ़ाई से कनेक्‍ट और डिस्‍कनेक्‍ट करें" - "ऐप्स को वाई-फ़ाई पहुंच बिंदुओं से कनेक्ट और डिस्कनेक्ट करने और वाई-फ़ाई नेटवर्क के लिए डिवाइस कॉन्फ़िगरेशन में परिवर्तन करने देता है." + "ऐप्स को वाई-फ़ाई पहुंच बिंदुओं से कनेक्ट और डिसकनेक्ट करने और वाई-फ़ाई नेटवर्क के लिए डिवाइस कॉन्फ़िगरेशन में परिवर्तन करने देता है." "वाई-फ़ाई मल्‍टीकास्‍ट प्राप्ति को अनुमति दें" "ऐप्स को वाई-फ़ाई नेटवर्क पर मल्टीकास्ट पते के उपयोग से केवल आपके टेबलेट पर ही नहीं, बल्कि सभी डिवाइस पर भेजे गए पैकेट प्राप्‍त करने देता है. यह गैर-मल्टीकास्ट मोड से अधिक पावर का उपयोग करता है." "ऐप को मल्‍टीकास्‍ट पतों का उपयोग करके ना केवल आपके टीवी को, बल्‍कि वाई-फ़ाई पर मौजूद सभी डिवाइसों को पैकेट भेजने और प्राप्‍त करने देती है. इसमें गैर-मल्‍टीकास्‍ट मोड की अपेक्षा अधिक पावर का उपयोग होता है." @@ -419,7 +424,7 @@ "किसी ऐप्स को स्‍थानीय ब्लूटूथ टेबलेट कॉन्‍फ़िगर करने की और रिमोट डिवाइस के साथ खोजने और युग्‍मित करने देता है." "ऐप को स्‍थानीय ब्‍लूटूथ टीवी कॉन्‍फ़िगर करने देती है और दूरस्‍थ डिवाइसों को खोजने और उनसे युग्‍मित करने देती है." "ऐप्स को स्‍थानीय ब्लूटूथ फ़ोन कॉन्‍फ़िगर करने देता है, और रिमोट डिवाइस के साथ खोजने और युग्‍मित करने देता है." - "WiMAX से कनेक्ट और डिस्कनेक्ट करें" + "WiMAX से कनेक्ट और डिसकनेक्ट करें" "ऐप्स को WiMAX सक्षम है या नहीं और कनेक्‍ट किए गए किसी WiMAX नेटवर्क के बारे में जानकारी निर्धारित करने देता है." "WiMAX स्‍थिति बदलें" "ऐप्स को WiMAX नेटवर्क से टेबलेट को कनेक्‍ट और डिस्‍कनेक्‍ट करने देता है." @@ -459,7 +464,7 @@ "समन्‍वयन बंद या चालू टॉगल करें" "ऐप्स को किसी खाते की समन्वयन सेटिंग संशोधित करने देता है. उदाहरण के लिए, इसका उपयोग लोग ऐप्स का समन्‍वयन किसी खाते से सक्षम करने में हो सकता है." "समन्वयन आंकड़े पढ़ें" - "ऐप्स को किसी खाते के समन्वयन आंकड़े, साथ ही समन्‍वयित ईवेंट का इतिहास और समन्‍वयित डेटा की मात्रा पढ़ने देता है." + "ऐप्स को किसी खाते के समन्वयन आंकड़े, साथ ही समन्‍वयित इवेंट का इतिहास और समन्‍वयित डेटा की मात्रा पढ़ने देता है." "अपने USB मेमोरी की सामग्री पढ़ें" "अपने SD कार्ड की सामग्री पढ़ें" "एप्‍लिकेशन को आपके USB मेमोरी की सामग्री पढ़ने की अनुमति देता है." @@ -766,12 +771,12 @@ "FACTORY_TEST क्रिया केवल /system/app में इंस्‍टॉल किए गए पैकेज के लिए समर्थित है." "ऐसा कोई पैकेज नहीं मिला था जो FACTORY_TEST कार्रवाई प्रदान करता हो." "रीबूट करें" - "\'%s\' पर यह पृष्ठ दर्शाता है:" + "\'%s\' पर यह पेज दर्शाता है:" "JavaScript" "मार्गदर्शक की दुबारा पूछें" - "इस पृष्ठ से आगे बढ़ें" - "इस पृष्ठ पर बने रहें" - "%s\n\nक्या आप वाकई इस पृष्ठ से दूर नेविगेट करना चाहते हैं?" + "इस पेज से आगे बढ़ें" + "इस पेज पर बने रहें" + "%s\n\nक्या आप वाकई इस पेज से दूर नेविगेट करना चाहते हैं?" "दुबारा पूछें" "युक्ति: ज़ूम इन और आउट करने के लिए डबल-टैप करें." "स्‍वत: भरण" @@ -808,7 +813,7 @@ "अभी नहीं" "याद रखें" "कभी नहीं" - "आपके पास इस पृष्ठ को खोलने की अनुमति नहीं है." + "आपके पास इस पेज को खोलने की अनुमति नहीं है." "लेख की क्‍लिपबोर्ड पर प्रतिलिपि बनाई गई." "अधिक" "मेनू+" @@ -1010,7 +1015,7 @@ "ठीक है" "रिपोर्ट करें" "प्रतीक्षा करें" - "पृष्ठ प्रतिसाद नहीं दे रहा है.\n\nक्‍या आप इसे बंद करना चाहते हैं?" + "पेज प्रतिसाद नहीं दे रहा है.\n\nक्‍या आप इसे बंद करना चाहते हैं?" "एप्‍लि. रीडायरेक्‍ट किया गया" "%1$s अभी चल रहा है." "%1$s को वास्‍तविक रूप से लॉन्‍च किया गया था." @@ -1106,9 +1111,9 @@ "प्रति:" "आवश्‍यक पिन लिखें:" "पिन:" - "%1$s से कनेक्ट रहने पर टेबलेट वाई-फ़ाई से अस्थायी रूप से डिस्कनेक्ट हो जाएगा" + "%1$s से कनेक्ट रहने पर टेबलेट वाई-फ़ाई से अस्थायी रूप से डिसकनेक्ट हो जाएगा" "जब टीवी %1$s से कनेक्‍ट होगा तब वह वाई-फ़ाई से अस्‍थायी रूप से डिस्‍कनेक्‍ट हो जाएगा" - "फ़ोन %1$s से कनेक्ट रहते समय वाई-फ़ाई से अस्थायी रूप से डिस्कनेक्ट हो जाएगा" + "फ़ोन %1$s से कनेक्ट रहते समय वाई-फ़ाई से अस्थायी रूप से डिसकनेक्ट हो जाएगा" "वर्ण सम्‍मिलित करें" "SMS संदेश भेज रहा है" "<b>%1$s</b> बड़ी संख्या में SMS संदेश भेज रहा है. क्या आप इस ऐप्स को संदेश भेजना जारी रखने देना चाहते हैं?" @@ -1208,6 +1213,8 @@ "ऐप्लिकेशन को इंस्टॉल सत्रों को पढ़ने देती है. इससे उसे सक्रिय पैकेज इंस्टॉलेशन के बारे में विवरण देखने की अनुमति मिल जाती है." "पैकेज इंस्टॉल करने का अनुरोध करें" "किसी ऐप्लिकेशन को पैकेज इंस्टॉल करने के अनुरोध की अनुमति देता है." + "बैटरी ऑप्टिमाइज़ेशन पर ध्यान ना देने के लिए पूछें" + "किसी ऐप्लिकेशन को उस ऐप्लिकेशन के लिए बैटरी ऑप्टिमाइज़ेशन पर ध्यान ना देने की अनुमति के लिए पूछने देता है." "ज़ूम नियंत्रण के लिए दो बार टैप करें" "विजेट नहीं जोड़ा जा सका." "जाएं" @@ -1258,7 +1265,7 @@ "आगे" "अभी नहीं" "कोई मिलान नहीं" - "पृष्ठ पर ढूंढें" + "पेज पर ढूंढें" %d में से %d %d में से %d @@ -1329,7 +1336,7 @@ "%s USB डिस्‍क" "USB मेमोरी" "संपादित करें" - "डेटा उपयोग की सूचना" + "डेटा उपयोग की चेतावनी" "उपयोग व सेटिंग देखने हेतु टैप करें." "2G-3G डेटा सीमा पूर्ण हो गई" "4G डेटा सीमा पूर्ण हो गई" @@ -1380,7 +1387,7 @@ "स्क्रीन को डिवाइस में कास्ट करें" "डिवाइस खोजे जा रहे हैं…" "सेटिंग" - "डिस्कनेक्ट करें" + "डिसकनेक्ट करें" "स्‍कैन कर रहा है..." "कनेक्ट हो रहा है..." "उपलब्ध" @@ -1558,7 +1565,7 @@ "वर्ष चुनें" "%1$s को हटा दिया गया" "कार्यस्थल का %1$s" - "इस स्क्रीन को अनपिन करने के लिए, वापस जाएं को स्पर्श करके रखें." + "इस स्क्रीन को अनपिन करने के लिए, वापस जाएं और अवलोकन को स्पर्श करके रखें." "ऐप पिन किया गया है: इस डिवाइस पर अनपिन करने की अनुमति नहीं है." "स्‍क्रीन पिन की गई" "स्‍क्रीन अनपिन की गई" @@ -1614,7 +1621,7 @@ "बंद रहने का समय" "सप्ताह की रात" "सप्ताहांत" - "ईवेंट" + "इवेंट" "%1$s द्वारा म्यूट किया गया" "आपके डिवाइस के साथ कोई आंतरिक त्रुटि हुई और यह तब तक अस्‍थिर रह सकता है, जब तक आप फ़ैक्‍टरी डेटा रीसेट नहीं करते हैं." "आपके डिवाइस के साथ कोई आंतरिक त्रुटि हुई. विवरणों के लिए अपने निर्माता से संपर्क करें." diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 5f2d3d62d50e..c3d1f6dbcb1b 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problem s vezom ili nevažeći MMI kôd." "Operacija je ograničena samo na brojeve s fiksnim biranjem." + "Nije moguće promijeniti postavke preusmjeravanja poziva na telefonu dok ste u roamingu." "Usluga nije omogućena." "Usluga je omogućena za korisnika:" "Usluga je onemogućena." @@ -97,6 +98,8 @@ "Glasovne/podatkovne usluge blokirane su." "Glasovne/SMS usluge su blokirane." "Sve su glasovne/podatkovne/SMS usluge blokirane." + "Pristup mreži nije moguć" + "Za bolji prijem pokušajte odabrati drugu vrstu mreže u odjeljku Postavke > Mobilne mreže > Željena vrsta mreže." "Način TTY FULL koji zahtijeva paralelni uređaj" "Način TTY HCO koji zahtijeva paralelni uređaj" "Način TTY VCO koji zahtijeva paralelni uređaj" @@ -181,6 +184,8 @@ "Radni je profil izbrisan jer nedostaje administratorska aplikacija." "Administratorska aplikacija radnog profila nedostaje ili je oštećena. Zbog toga su radni profil i povezani podaci izbrisani. Za pomoć se obratite svom administratoru." "Vaš poslovni profil više nije dostupan na ovom uređaju." + "Mrežni se promet prati" + "Dodirnite da biste saznali više" "Uređaj će se izbrisati" "Nije moguće upotrijebiti administratorsku aplikaciju jer joj nedostaju komponente ili je oštećena. Vaš će se uređaj sada izbrisati. Za pomoć se obratite svom administratoru." "Ja" @@ -646,7 +651,7 @@ "Pomoćnik" "Brat" "Dijete" - "Partner u kućan." + "Vanbračni partner" "Otac" "Prijatelj" "Voditelj" @@ -1233,6 +1238,8 @@ "Omogućuje aplikaciji čitanje sesija instaliranja. Aplikacija može vidjeti pojedinosti o aktivnim instaliranjima paketa." "zahtijevati instaliranje paketa" "Aplikaciji omogućuje zahtijevanje instaliranja paketa." + "tražiti zanemarivanje optimizacija baterije" + "Aplikaciji omogućuje da traži dopuštenje za zanemarivanje optimizacija baterije za tu aplikaciju." "Dvaput dotaknite za upravljanje zumiranjem" "Widget nije moguće dodati." "Idi" @@ -1585,7 +1592,7 @@ "Odaberite godinu" "Izbrisan je broj %1$s" "%1$s za posao" - "Da biste otkvačili ovaj zaslon, dodirnite i zadržite Natrag." + "Da biste otkvačili ovaj zaslon, dodirnite i zadržite Natrag i Pregled." "Aplikacija je prikvačena: otkvačivanje nije dopušteno na tom uređaju." "Zaslon je pričvršćen" "Zaslon je otkvačen" diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index cd3659a7f0f9..9731aba90eef 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Kapcsolódási probléma vagy érvénytelen MMI-kód." "A művelet fix hívószámokra van korlátozva." + "A hívásátirányítási beállításokat barangolás közben telefonról nem lehet módosítani." "A szolgáltatás engedélyezésre került." "Engedélyezett szolgáltatás(ok):" "A szolgáltatás ki van kapcsolva." @@ -96,6 +97,8 @@ "A hang- és adatszolgáltatások le vannak tiltva." "A hang- és SMS szolgáltatások le vannak tiltva." "Minden hang-, adat- és SMS szolgáltatás le van tiltva." + "A hálózat nem érhető el" + "A vétel javítása érdekében próbálja módosítani a kiválasztott hálózattípust a Beállítások > Mobilhálózatok > Preferált hálózattípus lehetőségnél." "Partner által kért TTY-mód: FULL" "Partner által kért TTY-mód: HCO" "Partner által kért TTY-mód: VCO" @@ -179,6 +182,8 @@ "A munkahelyi profilt a rendszer a hiányzó rendszergazda alkalmazás miatt törölte." "A munkahelyi profil rendszergazda alkalmazása hiányzik vagy sérült. A rendszer ezért törölte munkahelyi profilját, és az ahhoz kapcsolódó adatokat. Ha segítségre van szüksége, vegye fel a kapcsolatot rendszergazdájával." "Munkaprofilja már nem érhető el ezen az eszközön." + "A hálózati forgalmat figyelik" + "Koppintson, ha további információt szeretne kapni" "A rendszer törölni fogja eszközét" "A rendszergazda alkalmazás egyes részei hiányoznak, vagy az alkalmazás sérült, ezért nem használható. A rendszer most törölni fogja eszközét. Ha segítségre van szüksége, vegye fel a kapcsolatot rendszergazdájával." "Saját" @@ -1208,6 +1213,8 @@ "Engedélyezi az alkalmazásnak a telepítési munkamenetek olvasását. Ezáltal részleteket kaphat az egyes csomagok éppen folyamatban lévő telepítéséről." "telepítőcsomagok kérése" "Lehetővé teszi az alkalmazás számára csomagok telepítésének kérését." + "Akkumulátoroptimalizálási beállítások mellőzésének kérése" + "Az alkalmazás engedélyt kérhet az akkumulátoroptimalizálási beállítások mellőzésére." "Érintse meg kétszer a nagyítás beállításához" "Nem sikerült hozzáadni a modult." "Ugrás" @@ -1558,7 +1565,7 @@ "Válassza ki az évet" "A(z) %1$s érték törölve" "Munkahelyi %1$s" - "A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza lehetőséget." + "A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza és az Áttekintés lehetőségeket." "Az alkalmazás rögzítve van: a rögzítés feloldása nem engedélyezett ezen az eszközön." "Képernyő rögzítve" "Képernyő rögzítése feloldva" diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 160efff177e3..14c9385749a4 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Միացման խնդիր կամ անվավեր MMI ծածակագիր:" "Գործողությունը սահմանափակված է միայն ամրակայված հեռախոսահամարների համար:" + "Ռոումինգում չեք կարող փոխել զանգի վերահասցեավորման կարգավորումները ձեր հեռախոսից։" "Ծառայությունը միացված է:" "Ծառայությունը միացված է`" "Ծառայությունն անջատվել է:" @@ -96,6 +97,8 @@ "Ձայնային կամ տվյալների ծառայություններն արգելափակված են:" "Ձայնային/SMS ծառայությունները արգելափակված են:" "Բոլոր ձայնային/տվյալների/SMS ծառայությունները արգելափակված են:" + "Ցանցն անհասանելի է" + "Ազդանշանի ընդունման որակը բարելավելու համար փոխեք ցանցի տեսակը՝ անցնելով Կարգավորումներ > Բջջային ցանցեր > Ցանկալի ցանցի տեսակը։" "Բաժանորդի սարքում ընտրված է հեռատիպի ԲՈԼՈՐԸ ռեժիմը" "Բաժանորդի սարքում ընտրված է հեռատիպի HCO ռեժիմը" "Բաժանորդի սարքում ընտրված է հեռատիպի VCO ռեժիմը" @@ -179,6 +182,8 @@ "Աշխատանքային պրոֆիլը ջնջվել է ադմինիստրատորի հավելվածի բացակայության պատճառով:" "Աշխատանքային պրոֆիլի ադմինիստրատորի հավելվածը բացակայում է կամ վնասված է: Արդյունքում ձեր աշխատանքային պրոֆիլը և առնչվող տվյալները ջնջվել են: Օգնության համար դիմեք ձեր ադմինիստրատորին:" "Ձեր աշխատանքային պրոֆիլն այս սարքում այլևս հասանելի չէ:" + "Ցանցային թրաֆիկը վերահսկվում է" + "Հպեք՝ ավելին իմանալու համար" "Ձեր սարքը ջնջվելու է" "Ադմինիստրատորի հավելվածում բացակայում են բաղադրիչներ կամ այն վնասված է և չի կարող օգտագործվել: Ձեր սարքն այժմ ջնջվելու է: Օգնություն համար դիմեք ձեր ադմինիստրատորին:" "Իմ" @@ -312,7 +317,7 @@ "փակել այլ հավելվածները" "Թույլ է տալիս հավելվածին վերջ տալ այլ հավելվածների հետնաշերտի գործընթացները: Սա կարող է պատճառ դառնալ, որ այլ հավելվածները դադարեն աշխատել:" "անցնել այլ ծրագրերի վրայով" - "Թույլ է տալիս հավելվածին երևալ այլ հավելվածների վերևում կամ օգտվողի ինտերֆեյսի մասերում: Դրանք կարող են խոչընդոտել ձեր ինտերֆեյսի օգտագործմանը ցանկացած հավելվածում կամ փոխել այն, ինչը կարծում եք, որ տեսնում եք այլ հավելվածներում:" + "Թույլ է տալիս հավելվածին երևալ այլ հավելվածների վերևում կամ օգտատիրոջ ինտերֆեյսի մասերում: Դրանք կարող են խոչընդոտել ձեր ինտերֆեյսի օգտագործմանը ցանկացած հավելվածում կամ փոխել այն, ինչը կարծում եք, որ տեսնում եք այլ հավելվածներում:" "միշտ աշխատեցնել հավելվածը" "Թույլ է տալիս հավելվածին մնայուն դարձնել իր մասերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածներին հասանելի հիշողությունը` դանդաղեցնելով պլանշետի աշխատանքը:" "Թույլ է տալիս հավելվածին պահել իր տարրերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածների համար հատկացված հիշողությունը և դանդաղեցնել հեռուստացույցի աշխատանքը:" @@ -347,11 +352,11 @@ "Թույլ է տալիս հավելվածին փոփոխել ձեր հեռախոսի զանգերի մատյանը, այդ թվում` մուտքային և ելքային զանգերի մասին տվյալները: Վնասարար հավելվածները կարող են սա օգտագործել` ձեր զանգերի մատյանը ջնջելու կամ փոփոխելու համար:" "օգտագործել մարմնի սենսորները (օրինակ` սրտի կծկումների հաճախականության չափիչ)" "Հավելվածին թույլ է տալիս մուտք ունենալ սենսորների տվյալներին, որոնք վերահսկում են ձեր ֆիզիկական վիճակը, օրինակ՝ ձեր սրտի զարկերը:" - "կարդալ օրացուցային իրադարձությունները և գաղտնի տեղեկությունները" - "Թույլ է տալիս հավելվածին կարդալ ձեր պլանշետում պահված բոլոր օրացուցային իրադարձությունները, այդ թվում` ընկերների կամ գործընկերների: Սա կարող է թույլ տալ հավելվածին տարածել կամ պահել ձեր օրացուցային տվյալները` անկախ գաղտնիությունից կամ զգայունությունից:" - "Թույլ է տալիս հավելվածին կարդալ հեռուստացույցի օրացույցում պահված բոլոր իրադարձությունները, այդ թվում նաև ընկերների կամ գործընկերների հետ կապված իրադարձությունները: Սա կարող է թույլ տալ հավելվածին համօգտագործել կամ պահել ձեր օրացույցի տվյալները՝ անկախ նրանց գաղտնիության կամ կարևորության աստիճանից:" - "Թույլ է տալիս հավելվածին կարդալ ձեր հեռախոսում պահված բոլոր օրացուցային իրադարձությունները, այդ թվում` ընկերների կամ գործընկերների: Սա կարող է թույլ տալ հավելվածին տարածել կամ պահել ձեր օրացուցային տվյալները` անկախ գաղտնիությունից կամ զգայունությունից:" - "ավելացնել կամ փոփոխել օրացուցային իրադարձությունները և ուղարկել նամակ հյուրերին` առանց սեփականատերերի իմացության" + "կարդալ օրացուցային միջոցառումները և գաղտնի տեղեկությունները" + "Թույլ է տալիս հավելվածին կարդալ ձեր պլանշետում պահված բոլոր օրացուցային միջոցառումները, այդ թվում` ընկերների կամ գործընկերների: Սա կարող է թույլ տալ հավելվածին տարածել կամ պահել ձեր օրացուցային տվյալները` անկախ գաղտնիությունից կամ զգայունությունից:" + "Թույլ է տալիս հավելվածին կարդալ հեռուստացույցի օրացույցում պահված բոլոր միջոցառումները, այդ թվում նաև ընկերների կամ գործընկերների հետ կապված իրադարձությունները: Սա կարող է թույլ տալ հավելվածին համօգտագործել կամ պահել ձեր օրացույցի տվյալները՝ անկախ նրանց գաղտնիության կամ կարևորության աստիճանից:" + "Թույլ է տալիս հավելվածին կարդալ ձեր հեռախոսում պահված բոլոր օրացուցային միջոցառումները, այդ թվում` ընկերների կամ գործընկերների: Սա կարող է թույլ տալ հավելվածին տարածել կամ պահել ձեր օրացուցային տվյալները` անկախ գաղտնիությունից կամ զգայունությունից:" + "ավելացնել կամ փոփոխել օրացուցային միջոցառումները և ուղարկել նամակ հյուրերին` առանց սեփականատերերի իմացության" "Թույլ է տալիս հավելվածին ավելացնել, հեռացնել, փոխել իրադարձություններ, որոնք դուք կարող եք փոփոխել ձեր պլանշետում, այդ թվում ընկերների կամ աշխատակիցների իրադարձությունները: Սա կարող է թույլ տալ հավելվածին ուղարկել հաղորդագրություններ, որոնք երևում են որպես օրացույցի սեփականատերերից ուղարկված, կամ փոփոխել իրադարձություններն առանց սեփականատերերի իմացության:" "Թույլ է տալիս հավելվածին ավելացնել, հեռացնել, փոփոխել իրադարձությունները, որոնք կարող եք փոփոխել ձեր հեռուստացույցի մեջ, այդ թվում` ընկերների կամ աշխատակիցների հետ կապված իրադարձությունները: Սա կարող է թույլատրել հավելվածին ուղարկել հաղորդագրություններ, որոնք հայտնվում են օրացույցի սեփականատերերից կամ փոփոխել իրադարձություններն` առանց սեփականատերերի իմացության:" "Թույլ է տալիս հավելվածին ավելացնել, հեռացնել, փոխել այն իրադարձությունները, որոնք կարող եք փոփոխել ձեր հեռախոսից, այդ թվում` ընկերների կամ գործընկերների: Սա կարող է թույլ տալ հավելվածին ուղարկել հաղորդագրություններ, որոնք իբրև գալիս են օրացույցի սեփականատիրոջից, կամ փոփոխել իրադարձությունները` առանց սեփականատիրոջ իմացության:" @@ -477,7 +482,7 @@ "կառավարել հեռահաղորդակցության կապերը" "Հավելվածին թույլ է տալիս կառավարել հեռահաղորդակցության կապերը:" "փոխազդել մուտքային զանգի էկրանին" - "Թույլ է տալիս ծրագրին վերահսկել՝ երբ և ինչպես է օգտվողը տեսնում մուտքային զանգը էկրանին:" + "Թույլ է տալիս ծրագրին վերահսկել՝ երբ և ինչպես է օգտատերը տեսնում մուտքային զանգը էկրանին:" "համագործակցել հեռախոսակապի ծառայությունների հետ" "Թույլատրում է ծրագրին համագործակցել հեռախոսակապի ծառայությունների հետ՝ զանգեր կատարելու/ստանալու համար:" "Մատակարարել ներզանգային հնարավորություն:" @@ -520,9 +525,9 @@ "Վերահսկել սխալ գաղտնաբառերի թիվը, որոնք մուտքագրվել են էկրանն ապակողպելիս, և կողպել պլանշետը կամ ջնջել պլանշետի բոլոր տվյալները, եթե մուտքագրվել են չափից շատ սխալ գաղտնաբառեր:" "Վերահսկել սխալ գաղտնաբառերի թիվը, որոնք մուտքագրվել են էկրանը ապակողպելիս, և կողպել հեռուստացույցը կամ ջնջել բոլոր տվյալները, եթե չափից ավելի սխալ գաղտնաբառեր են մուտքագրվել:" "Վերահսկել սխալ գաղտնաբառերի թիվը, որոնք մուտքագրվել են էկրանն ապակողպելիս, և կողպել հեռախոսը կամ ջնջել հեռախոսի բոլոր տվյալները, եթե մուտքագրվել են չափից շատ սխալ գաղտնաբառեր:" - "Կառավարել էկրանն ապակողպելիս մուտքագրվող սխալ գաղտնաբառերի թիվը և կողպել պլանշետը կամ ջնջել այս օգտվողի բոլոր տվյալները չափից ավելի սխալ գաղտնաբառեր մուտքագրելու դեպքում:" - "Կառավարել էկրանն ապակողպելիս մուտքագրվող սխալ գաղտնաբառերի թիվը և կողպել հեռուստացույցը կամ ջնջել այս օգտվողի բոլոր տվյալները չափից ավելի սխալ գաղտնաբառեր մուտքագրելու դեպքում:" - "Կառավարել էկրանն ապակողպելիս մուտքագրվող սխալ գաղտնաբառերի թիվը և կողպել հեռախոսը կամ ջնջել այս օգտվողի բոլոր տվյալները չափից ավելի սխալ գաղտնաբառեր մուտքագրելու դեպքում:" + "Կառավարել էկրանն ապակողպելիս մուտքագրվող սխալ գաղտնաբառերի թիվը և կողպել պլանշետը կամ ջնջել այս օգտատիրոջ բոլոր տվյալները չափից ավելի սխալ գաղտնաբառեր մուտքագրելու դեպքում:" + "Կառավարել էկրանն ապակողպելիս մուտքագրվող սխալ գաղտնաբառերի թիվը և կողպել հեռուստացույցը կամ ջնջել այս օգտատիրոջ բոլոր տվյալները չափից ավելի սխալ գաղտնաբառեր մուտքագրելու դեպքում:" + "Կառավարել էկրանն ապակողպելիս մուտքագրվող սխալ գաղտնաբառերի թիվը և կողպել հեռախոսը կամ ջնջել այս օգտատիրոջ բոլոր տվյալները չափից ավելի սխալ գաղտնաբառեր մուտքագրելու դեպքում:" "Փոխել էկրանի կողպման գաղտնաբառը" "Փոխել էկրանի կողպման գաղտնաբառը:" "Կողպել էկրանը" @@ -531,10 +536,10 @@ "Ջնջել պլանշետի տվյալներն առանց նախազգուշացման` կատարելով գործարանային տվյալների վերակայում:" "Ջնջել հեռուստացույցի տվյալները առանց զգուշացման՝ վերականգնելով գործարանային կարգավորումները:" "Ջնջել հեռախոսի տվյալներն առանց նախազգուշացման` կատարելով գործարանային տվյալների վերակայում:" - "Ջնջել օգտվողի տվյալները" - "Ջնջել այս օգտվողի տվյալներն այս պլանշետում առանց նախազգուշացման:" - "Ջնջել այս օգտվողի տվյալներն այս հեռուստացույցում առանց նախազգուշացման:" - "Ջնջել այս օգտվողի տվյալներն այս հեռախոսում առանց նախազգուշացման:" + "Ջնջել օգտատիրոջ տվյալները" + "Ջնջել այս օգտատիրոջ տվյալներն այս պլանշետում առանց նախազգուշացման:" + "Ջնջել այս օգտատիրոջ տվյալներն այս հեռուստացույցում առանց նախազգուշացման:" + "Ջնջել այս օգտատիրոջ տվյալներն այս հեռախոսում առանց նախազգուշացման:" "Կարգավորել սարքի համաշխարհային պրոքսին" "Կարգավորել, որ սարքի համընդհանուր պրոքսի-սերվերն օգտագործվի, երբ քաղաքականությունը միացված է: Միայն սարքի սեփականատերը կարող է կարգավորել համընդհանուր պրոքսի-սերվերը:" "Նշել էկր կողպ գաղտնաբ սպառումը" @@ -598,7 +603,7 @@ "Այլ" "Ետզանգ" "Մեքենա" - "Ընկերության գլխավոր" + "Ընկերության հիմնական" "ISDN" "Հիմնական" "Այլ ֆաքս" @@ -643,14 +648,14 @@ "Օգնական" "Եղբայր" "Երեխա" - "Տեղական գործընկեր" + "Կենակից" "Հայր" "Ընկեր" "Կառավարիչ" "Մայր" "Ծնող" "Գործընկեր" - "Հղված է" + "Հանձնարարված" "Բարեկամ" "Քույր" "Ամուսին" @@ -699,7 +704,7 @@ "Միայն արտակարգ իրավիճակների զանգեր" "Ցանցը կողպված է" "SIM քարտը PUK-ով կողպված է:" - "Տեսեք Օգտվողի ուղեցույցը կամ դիմեք Բաժանորդների սպասարկման կենտրոն:" + "Տեսեք Օգտատիրոջ ուղեցույցը կամ դիմեք Բաժանորդների սպասարկման կենտրոն:" "SIM քարտը կողպված է:" "SIM քարտը ապակողպվում է…" "Դուք %1$d անգամ սխալ եք հավաքել ձեր ապակողպման սխեման: \n\nՓորձեք կրկին %2$d վայրկյանից:" @@ -708,9 +713,9 @@ "Դուք %1$d անգամ սխալ եք հավաքել ձեր ապակողպման սխեման: %2$d անգամից ավել անհաջող փորձերից հետո ձեզ կառաջարկվի ապակողպել ձեր պլանշետը` օգտագործելով ձեր Google-ի մուտքի օգտանունը:\n \n Փորձեք կրկին %3$d վայրկյանից:" "Դուք %1$d անգամ սխալ եք գծել ապակողպման նախշը: Եվս %2$d անհաջող փորձից հետո հեռուստացույցը կկարողանաք ապակողպել միայն մուտք գործելով ձեր Google հաշիվ:\n\n Նորից փորձեք %3$d վայրկյանից:" "Դուք %1$d անգամ սխալ եք հավաքել ձեր ապակողպման սխեման: Եվս %2$d անհաջող փորձից հետո ձեզ կառաջարկվի ապակողպել ձեր հեռախոսը` օգտագործելով Google-ի ձեր մուտքը:\n \n Փորձեք կրկին %3$d վայրկյանից:" - "Դուք %1$d անգամ գրասալիկն ապակողպելու սխալ փորձ եք արել: Եվս %2$d անհաջող փորձից հետո պլանշետը կվերակարգավորվի գործարանային լռելյայնի, և օգտվողի բոլոր տվյալները կկորեն:" - "Դուք հեռուստացույցն ապակողպելու %1$d սխալ փորձ եք կատարել: Եվս %2$d անհաջող փորձից հետո հեռուստացույցի գործարանային կարգավորումները կվերականգնվեն և օգտվողի բոլոր տվյալները կջնջվեն:" - "Դուք %1$d անգամ հեռախոսը ապակողպելու սխալ փորձ եք արել: Եվս %2$d անհաջող փորձից հետո հեռախոսը կվերակարգավորվի գործարանային սկզբնադիր ռեժիմի, և օգտվողի բոլոր տվյալները կկորեն:" + "Դուք %1$d անգամ գրասալիկն ապակողպելու սխալ փորձ եք արել: Եվս %2$d անհաջող փորձից հետո պլանշետը կվերակարգավորվի գործարանային լռելյայնի, և օգտատիրոջ բոլոր տվյալները կկորեն:" + "Դուք հեռուստացույցն ապակողպելու %1$d սխալ փորձ եք կատարել: Եվս %2$d անհաջող փորձից հետո հեռուստացույցի գործարանային կարգավորումները կվերականգնվեն և օգտատիրոջ բոլոր տվյալները կջնջվեն:" + "Դուք %1$d անգամ հեռախոսը ապակողպելու սխալ փորձ եք արել: Եվս %2$d անհաջող փորձից հետո հեռախոսը կվերակարգավորվի գործարանային սկզբնադիր ռեժիմի, և օգտատիրոջ բոլոր տվյալները կկորեն:" "Դուք %d անգամ սխալ փորձ եք արել գրասալիկն ապակողպելու համար: Գրասալիկն այժմ կվերակարգավորվի գործարանային լռելյայնի:" "Դուք հեռուստացույցն ապակողպելու %d սխալ փորձ եք կատարել: Այժմ կվերականգնվեն հեռուստացույցի գործարանային կարգավորումները:" "Դուք %d անգամ հեռախոսը ապակողպելու սխալ փորձ եք արել: Հեռախոսն այժմ կվերակարգավորվի գործարանային սկզբնադիր ռեժիմի:" @@ -740,7 +745,7 @@ "Ապակողպման տարածքն ընդլայնված է:" "Ապակողպման տարածքը ետ է ծալված:" "%1$s վիջեթ:" - "Օգտվողի ընտրիչ" + "Օգտատիրոջ ընտրիչ" "Կարգավիճակ" "Ֆոտոխցիկ" "Մեդիա կարգավորումներ" @@ -1137,7 +1142,7 @@ "Սահմանել ժամը" "Սահմանել ամսաթիվը" "Սահմանել" - "Կատարված է" + "Պատրաստ է" "Նոր` " "Տրամադրված է %1$s-ի կողմից:" "Թույլտվություններ չեն պահանջվում" @@ -1208,13 +1213,15 @@ "Ծրագրին թույլ է տալիս կարդալ տեղադրման աշխատաշրջանները: Սա թույլ է տալիս տեղեկանալ փաթեթների ակտիվ տեղադրումների մանրամասներին:" "պահանջել տեղադրման փաթեթներ" "Թույլ է տալիս հավելվածին պահանջել փաթեթների տեղադրումը:" + "հայցել մարտկոցի օպտիմալացումն անտեսելու թույլտվություն" + "Հավելվածին հնարավորություն է տալիս հայցելու թույլտվություն՝ տվյալ հավելվածի համար մարտկոցի օպտիմալացումն անտեսելու համար:" "Հպեք երկու անգամ` խոշորացման վերահսկման համար" "Չհաջողվեց վիջեթ ավելացնել:" "Առաջ" "Որոնել" "Ուղարկել" "Հաջորդը" - "Կատարված է" + "Պատրաստ է" "Նախորդ" "Կատարել" "Հավաքել հեռախոսահամարը`\nօգտագործելով %s-ը" @@ -1263,7 +1270,7 @@ %d՝ %d-ից %d՝ %d-ից - "Կատարված է" + "Պատրաստ է" "Ջնջում է USB կրիչը..." "Ջնջում է SD քարտը..." "Կիսվել" @@ -1273,7 +1280,7 @@ "Գտնել նախորդը" "Տեղադրության հարցում %s-ից" "Տեղադրության հարցում" - "%1$s (%2$s)-ի հարցմամբ" + "%1$s (%2$s)-ի հարցումով" "Այո" "Ոչ" "Ջնջելու սահմանը գերազանցվել է" @@ -1305,7 +1312,7 @@ "Alt" "Չեղարկել" "Ջնջել" - "Կատարված է" + "Պատրաստ է" "Ռեժիմի փոփոխում" "Shift" "Մուտք" @@ -1420,9 +1427,9 @@ "Դուք %1$d անգամ սխալ եք մուտքագրել ձեր PIN-ը: \n\nՓորձեք կրկին %2$d վայրկյանից:" "Դուք սխալ եք մուտքագրել ձեր գաղտնաբառը %1$d անգամ: \n\nՓորձեք կրկին %2$d վայրկյանից:" "Դուք %1$d անգամ սխալ եք հավաքել ձեր ապակողպման սխեման: \n\nՓորձեք կրկին %2$d վայրկյանից:" - "Դուք %1$d անգամ սխալ փորձ եք արել գրասալիկն ապակողպելու համար: %2$d անգամից ավել անհաջող փորձերից հետո պլանշետը կվերակարգավորվի գործարանային լռելյայնի, և օգտվողի բոլոր տվյալները կկորեն:" - "Դուք հեռուստացույցն ապակողպելու %1$d սխալ փորձ եք կատարել: Եվս %2$d անհաջող փորձից հետո հեռուստացույցի գործարանային կարգավորումները կվերականգնվեն և օգտվողի բոլոր տվյալները կջնջվեն:" - "Դուք %1$d անգամ սխալ փորձ եք արել հեռախոսն ապակողպելու համար: %2$d անգամից ավել անհաջող փորձերից հետո հեռախոսը կվերակարգավորվի գործարանային լռելյայնի, և օգտվողի բոլոր տվյալները կկորեն:" + "Դուք %1$d անգամ սխալ փորձ եք արել գրասալիկն ապակողպելու համար: %2$d անգամից ավել անհաջող փորձերից հետո պլանշետը կվերակարգավորվի գործարանային լռելյայնի, և օգտատիրոջ բոլոր տվյալները կկորեն:" + "Դուք հեռուստացույցն ապակողպելու %1$d սխալ փորձ եք կատարել: Եվս %2$d անհաջող փորձից հետո հեռուստացույցի գործարանային կարգավորումները կվերականգնվեն և օգտատիրոջ բոլոր տվյալները կջնջվեն:" + "Դուք %1$d անգամ սխալ փորձ եք արել հեռախոսն ապակողպելու համար: %2$d անգամից ավել անհաջող փորձերից հետո հեռախոսը կվերակարգավորվի գործարանային լռելյայնի, և օգտատիրոջ բոլոր տվյալները կկորեն:" "Դուք %d անգամ սխալ փորձ եք արել գրասալիկն ապակողպելու համար: Գրասալիկն այժմ կվերակարգավորվի գործարանային լռելյայնի:" "Դուք հեռուստացույցն ապակողպելու %d սխալ փորձ եք կատարել: Այժմ կվերականգնվեն հեռուստացույցի գործարանային կարգավորումները:" "Դուք %d անգամ սխալ փորձ եք արել հեռախոսն ապակողպելու համար: Հեռախոսն այժմ կվերակարգավորվի գործարանային լռելյայնի:" @@ -1435,7 +1442,7 @@ "Սեղմած պահեք երկու մատները` մատչելիությունը միացնելու համար:" "Մատչելիությունը միացված է:" "Մուտքի հնարավորությունը չեղարկված է:" - "Ներկայիս օգտվողը %1$s:" + "Ներկայիս օգտատերը %1$s:" "Փոխարկվում է %1$s-ին..." "Ելք %1$s-ից…" "Սեփականատեր" @@ -1558,7 +1565,7 @@ "Ընտրեք տարին" "%1$s թիվը ջնջված է" "Աշխատանքային %1$s" - "Այս էկրանն ապամրացնելու համար հպեք և պահեք Հետ կոճակը:" + "Այս էկրանն ապամրացնելու համար հպեք և պահեք Հետ և Համատեսք կոճակները:" "Հավելվածն ամրացված է: Ապամրացումն այս սարքում չի թույլատրվում:" "Էկրանն ամրացված է" "Էկրանն ապամրացված է" @@ -1614,7 +1621,7 @@ "Անգործունության ժամանակը" "Աշխատանքային օր" "Շաբաթ-կիրակի" - "Իրադարձություն" + "Միջոցառում" "Համրեցվել է %1$s-ի կողմից" "Սարքում ներքին խնդիր է առաջացել և այն կարող է կրկնվել, մինչև չվերականգնեք գործարանային կարգավորումները:" "Սարքում ներքին խնդիր է առաջացել: Մանրամասների համար կապվեք արտադրողի հետ:" @@ -1641,8 +1648,8 @@ "Դուք սահմանել եք այս ծանուցումների կարևորությունը:" "Կարևոր է, քանի որ որոշակի մարդիկ են ներգրավված:" - "Թույլ տա՞լ %1$s հավելվածին %2$s հաշվով նոր Օգտվող ստեղծել:" - "Թույլ տա՞լ %1$s հավելվածին %2$s հաշվով նոր Օգտվող ստեղծել (նման հաշվով Օգտվող արդեն գոյություն ունի):" + "Թույլ տա՞լ %1$s հավելվածին %2$s հաշվով նոր Օտատեր ստեղծել:" + "Թույլ տա՞լ %1$s հավելվածին %2$s հաշվով նոր Օտատեր ստեղծել (նման հաշվով Օտատեր արդեն գոյություն ունի):" "Ավելացնել լեզու" "Նախընտրելի տարածաշրջան" "Մուտքագրեք լեզուն" @@ -1657,7 +1664,7 @@ "Դիտելու համար բացել SMS հավելվածը" "Որոշ գործառույթներ կարող են սահմանափակված լինել" "Հպեք՝ ապակողպելու համար" - "Օգտվողի տվյալները կողպված են" + "Օգտատիրոջ տվյալները կողպված են" "Աշխատանքային պրոֆիլը կողպված է" "Հպեք՝ այն ապակողպելու համար" "Միացված է %1$s-ին" @@ -1668,7 +1675,7 @@ "−%1$s" "Վերակայե՞լ սարքը:" "Հպեք՝ սարքը վերակայելու համար" - "Ցուցադրական օգտվողը գործարկվում է…" + "Ցուցադրական օգտատերը գործարկվում է…" "Սարաքը վերակայվում է…" "Վերակայե՞լ սարքը:" "Կատարված փոփոխությունները չեն պահվի, իսկ ցուցադրական նյութը կրկին կգործարկվի %1$s վայրկյանից…" diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index fefca0ccd58b..aa90d5aa48ac 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Masalah sambungan atau kode MMI tidak valid." "Operasi dibatasi untuk nomor panggilan tetap saja." + "Tidak dapat mengubah setelan penerusan panggilan dari ponsel saat roaming" "Layanan telah diaktifkan." "Layanan diaktifkan untuk:" "Layanan telah dinonaktifkan." @@ -96,6 +97,8 @@ "Layanan suara/data dicekal." "Layanan suara/SMS dicekal." "Semua layanan suara/data/SMS dicekal." + "Tidak dapat menjangkau jaringan" + "Untuk meningkatkan penerimaan sinyal, coba ubah jenis yang dipilih di Setelan > Data seluler > Jenis jaringan pilihan." "Rekan meminta Mode TTY PENUH" "Rekan meminta Mode TTY HCO" "Rekan meminta Mode TTY VCO" @@ -179,6 +182,8 @@ "Profil kerja dihapus karena tidak ada aplikasi admin." "Aplikasi admin profil kerja tidak ada atau rusak. Akibatnya, profil kerja dan data terkait telah dihapus. Hubungi administrator untuk meminta bantuan." "Profil kerja tidak tersedia lagi di perangkat ini." + "Traffic jaringan sedang dipantau" + "Tap untuk mempelajari lebih lanjut" "Perangkat akan dihapus" "Aplikasi admin kehilangan komponen atau rusak, dan tidak dapat digunakan. Perangkat sekarang akan dihapus. Hubungi administrator untuk meminta bantuan." "Saya" @@ -988,7 +993,7 @@ "Jepret gambar" "Gunakan secara default untuk tindakan ini." "Gunakan aplikasi yang berbeda" - "Menghapus default di Setelan sistem > Apl > Terunduh." + "Menghapus default di Setelan sistem > Apl > Terdownload." "Pilih tindakan" "Pilih apl untuk perangkat USB" "Tidak ada apl yang dapat melakukan tindakan ini." @@ -1016,7 +1021,7 @@ "%1$s telah diluncurkan aslinya." "Skala" "Selalu tampilkan" - "Aktifkan kembali dialog ini di Setelan sistem > Apl > Terunduh." + "Aktifkan kembali dialog ini di Setelan sistem > Apl > Terdownload." "%1$s tidak mendukung setelan Ukuran layar saat ini dan dapat menunjukkan perilaku yang tak diharapkan." "Selalu tampilkan" "Apl %1$s (proses %2$s) telah melanggar kebijakan StrictMode yang diberlakukannya sendiri." @@ -1208,6 +1213,8 @@ "Memungkinkan aplikasi membaca sesi pemasangan. Tindakan ini memungkinkannya melihat detail tentang pemasangan paket aktif." "minta pasang paket" "Mengizinkan aplikasi meminta pemasangan paket." + "meminta mengabaikan pengoptimalan baterai" + "Mengizinkan aplikasi meminta izin untuk mengabaikan pengoptimalan baterai bagi aplikasi tersebut." "Ketuk dua kali untuk kontrol perbesar/perkecil" "Tidak dapat menambahkan widget." "Buka" @@ -1234,7 +1241,7 @@ "Wallpaper" "Ubah wallpaper" "Pendengar pemberitahuan" - "Pemroses Realitas Maya" + "Pemroses VR" "Penyedia ketentuan" "Layanan penentu peringkat notifikasi" "VPN diaktifkan" @@ -1558,7 +1565,7 @@ "Pilih tahun" "%1$s dihapus" "Kantor %1$s" - "Untuk melepas pin layar ini, sentuh & tahan tombol Kembali." + "Untuk melepas pin layar ini, sentuh & tahan Kembali dan Ringkasan." "Pin dipasang ke aplikasi. Melepas pin tidak diizinkan di perangkat ini." "Layar disematkan" "Layar dicopot sematannya" diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index cdc6d4228a9e..563563561356 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Vandamál með tengingu eða ógild MMI-kóðaskipun." "Aðgerð takmarkast við fast númeraval." + "Ekki er hægt að breyta stillingum fyrir framsendingu símtala úr símanum á meðan þú ert í reiki." "Þjónustan var virkjuð." "Þjónustan var virkjuð fyrir:" "Þjónustan hefur verið gerð óvirk." @@ -96,6 +97,8 @@ "Lokað er á radd-/gagnaþjónustu." "Lokað er fyrir raddþjónustu/SMS-þjónustu." "Lokað á alla radd-, gagna- og SMS-þjónustu." + "Ekki næst samband við símkerfi" + "Reyndu að breyta valinni gerð í Stillingar > Farsímakerfi > Valin símkerfistegund til að bæta móttökuskilyrðin." "Jafningi bað um FULLA stillingu fjarrita" "Jafningi bað um HCO-stillingu fjarrita" "Jafningi bað um VCO-stillingu fjarrita" @@ -179,6 +182,8 @@ "Vinnusniði eytt vegna þess að stjórnunarforrit vantar." "Stjórnunarforrit vinnusniðsins vantar eða er skemmt. Vinnusniðinu og gögnum því tengdu hefur því verið eytt. Hafðu samband við kerfisstjórann til að fá frekari aðstoð." "Vinnusniðið þitt er ekki lengur í boði á þessu tæki." + "Verið er að fylgjast með netumferð" + "Ýttu til að fá frekari upplýsingar" "Tækið verður hreinsað" "Stjórnunarforritið vantar íhluti eða er skemmt og ekki er hægt að nota það. Þurrkað verður út af tækinu. Hafðu samband við kerfisstjórann til að fá aðstoð." "Ég" @@ -1208,6 +1213,8 @@ "Leyfir forriti að lesa uppsetningarlotur. Þetta gerir því kleift að sjá upplýsingar um virkar pakkauppsetningar." "fara fram á uppsetningu pakka" "Leyfir forriti að fara fram á uppsetningu pakka." + "biðja um að hunsa rafhlöðusparnað" + "Gerir forriti kleift að biðja um heimild til að hunsa rafhlöðusparnað fyrir forritið." "Ýttu tvisvar til að opna aðdráttarstýringar" "Ekki tókst að bæta græju við." "Áfram" @@ -1558,7 +1565,7 @@ "Veldu ár" "%1$s eytt" "%1$s í vinnu" - "Til að taka lásinn af þessari skjámynd skaltu halda inni bakkhnappinum." + "Til að losa þessa skjámynd skaltu halda „Til baka“ og „Yfirlit“ inni." "Forritið er fest: Ekki er hægt að losa forrit í þessu tæki." "Skjár festur" "Skjár opnaður" diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index b82470fe2254..a1f8fc2bbc20 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problema di connessione o codice MMI non valido." "Operazione limitata solo ai numeri di selezione fissa." + "Impossibile modificare le impostazioni di deviazione chiamate dal telefono durante il roaming." "Il servizio è stato attivato." "Il servizio è stato attivato per:" "Il servizio è stato disattivato." @@ -96,6 +97,8 @@ "I servizi vocali/dati sono bloccati." "I servizi vocali/SMS sono bloccati." "Tutti i servizi vocali/dati/SMS sono bloccati." + "Impossibile raggiungere la rete" + "Per migliorare la ricezione, prova a modificare il tipo selezionato in Impostazioni > Reti cellulari > Tipo di rete preferito." "Peer ha richiesto la modalità TTY FULL" "Peer ha richiesto la modalità TTY HCO" "Peer ha richiesto la modalità TTY VCO" @@ -179,6 +182,8 @@ "Profilo di lavoro eliminato per app di amministrazione mancante." "L\'app di amministrazione dei profili di lavoro manca o è danneggiata. Di conseguenza, il tuo profilo di lavoro e i relativi dati sono stati eliminati. Contatta l\'amministratore per ricevere assistenza." "Il tuo profilo di lavoro non è più disponibile sul dispositivo." + "Il traffico di rete è monitorato" + "Tocca per ulteriori informazioni" "Il dispositivo verrà resettato" "L\'app di amministrazione è danneggiata o mancano componenti, pertanto non è possibile utilizzarla. Il dispositivo verrà resettato. Contatta l\'amministratore per ricevere assistenza." "Io" @@ -1208,6 +1213,8 @@ "Consente a un\'applicazione di leggere le sessioni di installazione. L\'app può conoscere i dettagli sulle installazioni di pacchetti attive." "richiesta di pacchetti di installazione" "Consente a un\'applicazione di richiedere l\'installazione di pacchetti." + "chiedi di ignorare le ottimizzazioni della batteria" + "Consente a un\'app di chiedere l\'autorizzazione a ignorare le ottimizzazioni della batteria per quell\'app." "Tocca due volte per il comando dello zoom" "Aggiunta del widget non riuscita." "Vai" @@ -1234,7 +1241,7 @@ "Sfondo" "Cambia sfondo" "Listener di notifica" - "Listener realtà virtuale" + "Listener VR" "Provider condizioni" "Servizio di classificazione delle notifiche" "VPN attiva" @@ -1558,7 +1565,7 @@ "Seleziona anno" "%1$s eliminato" "%1$s lavoro" - "Per sbloccare questa schermata tieni premuta l\'opzione Indietro." + "Per sbloccare questa schermata tieni premuto Indietro e Panoramica." "L\'app è bloccata. Su questo dispositivo non è consentito lo sblocco." "Schermata bloccata" "Schermata sbloccata" diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 36c52057f38a..705cbe805ae5 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "‏בעיה בחיבור או קוד MMI לא חוקי." "הפעולה מוגבלת למספרי חיוג קבועים בלבד." + "לא ניתן לשנות את הגדרות העברת השיחות מהטלפון שלך כשאתה במצב נדידה." "השירות הופעל." "השירות הופעל עבור:" "השירות הושבת." @@ -98,6 +99,8 @@ "שירותי הקול/נתונים חסומים." "‏שירותי קול/SMS חסומים." "‏כל השירותים של קול/נתונים/SMS חסומים." + "לא ניתן להתחבר לרשת" + "כדי לשפר את הקליטה, נסה לשנות את סוג הרשת באפשרות \'הגדרות\' > \'רשתות סלולריות\' > \'סוג רשת מועדף\'." "‏העמית ביקש TTY במצב FULL" "‏העמית ביקש TTY במצב HCO" "‏העמית ביקש TTY במצב VCO" @@ -183,6 +186,8 @@ "פרופיל העבודה נמחק מפני שחסרה אפליקציית ניהול." "אפליקציית הניהול של פרופיל העבודה חסרה או פגומה. כתוצאה מכך פרופיל העבודה שלך נמחק, כולל כל הנתונים הקשורים אליו. לקבלת סיוע, פנה למנהל המערכת שלך." "פרופיל העבודה שלך אינו זמין עוד במכשיר הזה." + "התנועה ברשת מנוטרת" + "למידע נוסף, הקש" "תתבצע מחיקה של המכשיר" "באפליקציית הניהול חסרים מרכיבים או שהיא פגומה ולא ניתן להשתמש בה. תתבצע כעת מחיקה של המכשיר. לקבלת סיוע, פנה למנהל המערכת שלך." "אני" @@ -324,7 +329,7 @@ "מאפשרת לאפליקציה ליצור חלקים ממנה השמורים בזיכרון באופן עקבי. הדבר עלול להגביל את הזיכרון הזמין לאפליקציות אחרות וכתוצאה מכך להאט את פעולת הטלוויזיה." "מאפשר לאפליקציה להפוך חלקים ממנו לקבועים בזיכרון. פעולה זו עשויה להגביל את הזיכרון הזמין לאפליקציות אחרים ולהאט את פעולת הטלפון." "מדידת נפח האחסון של אפליקציות" - "מאפשר לאפליקציה לאחזר את הקוד, הנתונים, וגודלי הקבצים השמורים שלו" + "מאפשר לאפליקציה לאחזר את הקוד, הנתונים, וגודלי קובצי המטמון שלו" "שינוי הגדרות מערכת" "מאפשר לאפליקציה לשנות את נתוני הגדרות המערכת. אפליקציות זדוניות עלולות לשבש את תצורת המערכת שלך." "הפעלה בעת אתחול" @@ -599,7 +604,7 @@ "נייד" "עבודה" "פקס בעבודה" - "מס\' פקס בבית" + "פקס בבית" "זימונית" "אחר" "התקשרות חזרה" @@ -612,7 +617,7 @@ "טלקס" "TTY TDD" "נייד של העבודה" - "איתורית של העבודה" + "זימונית מהעבודה" "מסייע" "MMS" "מותאם אישית" @@ -1258,6 +1263,8 @@ "מאפשר לאפליקציה לקרוא הפעלות התקנה. הרשאה זו מאפשרת לה לראות פרטים על התקנות פעילות של חבילות." "בקשה להתקנת חבילות" "מתיר לאפליקציה לבקש התקנה של חבילות." + "בקשה להתעלם מאופטימיזציות של הסוללה" + "מאפשר לאפליקציה לבקש רשות להתעלם מאופטימיזציות של הסוללה לאפליקציה הזו." "הקש פעמיים לבקרת מרחק מתצוגה" "‏לא ניתן להוסיף widget." "התחל" @@ -1612,7 +1619,7 @@ "בחר שנה" "%1$s נמחק" "עבודה %1$s" - "כדי לבטל את הצמדת המסך הזה, לחץ לחיצה ממושכת על הלחצן \'הקודם\'." + "כדי לבטל את ההצמדה של מסך זה, גע בלחצן \'הקודם\' והחזק אותו, ואז גע בלחצן \'סקירה\'." "האפליקציה מוצמדת: ביטול ההצמדה אסור במכשיר הזה." "המסך מוצמד" "הצמדת המסך בוטלה" diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 5550900543e4..2614d4fbddca 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "接続に問題があるか、MMIコードが正しくありません。" "発信番号制限で指定された番号に対してのみ操作できます。" + "ローミング中はスマートフォンから着信転送設定の変更はできません。" "サービスが有効になりました。" "次のサービスが有効になりました:" "サービスが無効になりました。" @@ -96,6 +97,8 @@ "音声/データサービスがブロックされています。" "音声/SMSサービスがブロックされています。" "すべての音声/データ/SMSサービスがブロックされています。" + "ネットワークにアクセスできません" + "受信状態を改善するには、[設定] > [モバイル ネットワーク] > [優先ネットワーク タイプ] で選択したタイプを変更してみてください。" "ピアから、TTYモードをFULLにするようリクエストされました" "ピアから、TTYモードをHCOにするようリクエストされました" "ピアから、TTYモードをVCOにするようリクエストされました" @@ -179,6 +182,8 @@ "管理アプリがないため仕事用プロファイルが削除されました。" "仕事用プロファイルの管理アプリがないか、破損しています。そのため仕事用プロファイルと関連データが削除されました。管理者にサポートをご依頼ください。" "お使いの仕事用プロファイルはこの端末で使用できなくなりました" + "ネットワーク トラフィックの監視中" + "詳細を確認するにはタップします" "端末のデータが消去されます" "管理アプリの構成要素が不足しているか、アプリが破損しているため、ご利用になれません。端末のデータはこれから消去されます。管理者にサポートをご依頼ください。" "自分" @@ -1208,6 +1213,8 @@ "インストールセッションの読み取りをアプリに許可します。これにより、アプリはアクティブパッケージのインストールに関する詳細情報を参照できるようになります。" "インストールパッケージのリクエスト" "パッケージのインストールをリクエストすることをアプリケーションに許可します。" + "電池の最適化を無視するかどうかの確認" + "電池の最適化の無視についてアプリが確認することを許可します。" "ダブルタップでズームします" "ウィジェットを追加できませんでした。" "移動" @@ -1558,7 +1565,7 @@ "年を選択" "%1$sを削除しました" "仕事の%1$s" - "この画面の固定を解除するには [戻る] を押し続けます。" + "この画面の固定を解除するには [戻る] と [概要] を押し続けます。" "アプリは固定されています。この端末では固定を解除できません。" "画面を固定しました" "画面固定を解除しました" diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index a8fed8b577b5..55de3c3de0fe 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "კავშირის პრობლემა ან არასწორი MMI კოდი." "ოპერაცია შეზღუდულია მხოლოდ დაშვებულ ნომრებზე." + "ზარის გადამისამართების პარამეტრების თქვენი ტელეფონიდან შეცვლა როუმინგისას ვერ მოხერხდება." "სერვისი ჩართულია." "სერვისი ჩართულია შემდეგისთვის:" "სერვისი გამორთულია." @@ -96,6 +97,8 @@ "ხმის/მონაცემების სერვისები დაბლოკილია." "ყველა ხმოვანი/SMS-ის სერვისი დაბლოკილია." "ხმის/მონაცემების/SMS-ის ყველა სერვისი დაბლოკილია." + "ქსელთან დაკავშირება ვერ ხერხდება" + "მიღების გასაუმჯობესებლად ცადეთ არჩეული ტიპის შეცვლა აქ: პარამეტრები > ფიჭური ქსელები > ქსელის სასურველი ტიპი." "მოთხოვნილია კვანძი TTY რეჟიმი FULL" "მოთხოვნილია კვანძი TTY რეჟიმი HCO" "მოთხოვნილია კვანძი TTY რეჟიმი VCO" @@ -179,6 +182,8 @@ "სამუშაო პროფილი წაშლილია ადმინისტრატორის აპლიკაციის არ ქონის გამო." "სამუშაო პროფილის ადმინისტრატორის აპლიკაცია გამოტოვებული ან დაზიანებულია. შედეგად, თქვენი სამუშაო პროფილი და მასთან დაკავშირებული მონაცემები წაიშალა. დახმარებისათვის დაუკავშირდით თქვენს ადმინისტრატორს." "თქვენი სამუშაო პროფილი აღარ არის ხელმისაწვდომი ამ მოწყობილობაზე." + "ქსელის ტრაფიკი მონიტორინგს გადის" + "შეეხეთ, რათა შეიტყოთ მეტი" "თქვენი მოწყობილობა წაიშლება" "ადმინისტრატორის აპლიკაციას კომპონენტები აკლია ან დაზიანებულია, შესაბამისად, მისი გამოყენება ვერ მოხერხდება. თქვენი მოწყობილობა წაიშლება. დახმარებისათვის დაუკავშირდით თქვენს ადმინისტრატორს." "მე" @@ -1208,6 +1213,8 @@ "საშუალებას აძლევს აპლიკაციას წაიკითხოს ინსტალაციის სესიები. ამით მას საშუალება აქვს იხილოს პაკეტის აქტიური ინსტალაციები." "პაკეტების ინსტალაციის მოთხოვნა" "აპლიკაციას შეეძლება მოითხოვოს პაკეტების ინსტალაცია." + "ბატარეის ოპტიმიზაციის იგნორირების მოთხოვნა" + "საშუალებას მისცემს აპს, მოითხოვოს მასთან დაკავშირებული ბატარეის ოპტიმიზაციის იგნორირების ნებართვა." "მასშტაბის ცვლილებისთვის შეეხეთ ორჯერ" "ვერ დაემატა ვიჯეტი." "გადასვლა" @@ -1558,7 +1565,7 @@ "აირჩიეთ წელი" "%1$s წაიშალა" "სამსახური %1$s" - "ამ ეკრანის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკს „უკან“." + "ამ ეკრანის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკს „უკან და მიმოხილვა“." "აპი მიმაგრებულია: მიმაგრების მოხსნა არ არის ნებადართული ამ მოწყობილობაზე." "ეკრანი დაფიქსირდა" "ეკრანს ფიქსაცია მოეხსნა" diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index 00264ad8969a..7f9bc230993c 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Байланыс мәселесі немесе MMИ коды жарамсыз." "Әрекет анықталған сандарды теруге шектелген." + "Роуминг кезінде телефоннан қоңырауды басқа нөмірге бағыттау параметрлері өзгертілмейді." "Қызмет қосылған." "Қызмет келесі мақсат үшін қосылды:" "Қызмет өшірілген." @@ -96,6 +97,8 @@ "Дыбыс/дерекқор қызметтері бөгелген." "Дауыс/SMS қызметтері бөгелген." "Барлық дыбыс/дерекқор/SMS қызметтері бөгелген." + "Желіге қосылу мүмкін емес" + "Қабылдау мүмкіндігін жақсарту үшін \"Параметрлер > Ұялы желілер > Қалаған желі түрін\" таңдап, басқасына өзгертіп көріңіз." "Пир TTY режимі ТОЛЫҚ сұрады" "Пир TTY режимінің HCO сұрады" "Пир TTY режимінің VCO сұрады" @@ -179,6 +182,8 @@ "Басқару қолданбасы болмағандықтан жұмыс профилі жойылды." "Жұмыс профилінің басқару қолданбасы жоқ немесе бүлінген. Нәтижесінде жұмыс профиліңіз және қатысты деректер жойылды. Көмек алу үшін әкімшіге хабарласыңыз." "Жұмыс профиліңіз осы құрылғыда енді қолжетімді емес." + "Желі трафигі бақылануда" + "Толығырақ мәліметтер үшін түртіңіз" "Құрылғыңыздағы деректер өшіріледі" "Басқару қолданбасында құрамдастар жетіспейді немесе ол бүлінген және оны пайдалану мүмкін емес. Құрылғыңыздағы деректер қазір өшіріледі. Көмек алу үшін әкімшіге хабарласыңыз." "Мен" @@ -1208,6 +1213,8 @@ "Қолданбаға орнату сеанстарын оқуға рұқсат етеді. Бұл оған белсенді бума орнатулары туралы мәліметтерді көруге рұқсат етеді." "орнату бумаларын сұрау" "Қолданбаның бумаларды орнатуға рұқсат сұрауына мүмкіндік береді." + "батареяны оңтайландыру әрекетін елемеуді сұрау" + "Қолданба батареяны оңтайландыру әрекетін елемеуді сұрай алады." "Масштабтау параметрін басқару үшін екі рет түртіңіз" "Виджетті қосу." "Өту" @@ -1558,7 +1565,7 @@ "Жыл таңдау" "%1$s жойылды" "Жұмыс %1$s" - "Осы экранды босату үшін \"Артқа\" түймесін басып тұрыңыз." + "Бұл экранды ашу үшін \"Артқа\" және \"Шолу\" түймелерін қатар басып тұрыңыз" "Бағдарлама белгіленді: Бұл құрылғыда белгіні алуға рұқсат берілмейді." "Экран түйрелді" "Экран босатылды" diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index feaef821e535..d00c8398848d 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "បញ្ហា​ក្នុង​ការ​តភ្ជាប់​ ឬ​កូដ MMI មិន​ត្រឹមត្រូវ។" "ប្រតិបត្តិការ​ត្រូវ​បាន​ដាក់​កម្រិត​​​ចំពោះ​លេខ​ហៅ​ថេរ​តែ​ប៉ុណ្ណោះ។" + "មិន​អាច​ប្តូរ​ការ​កំណត់​នៃ​ការ​បញ្ជូន​ការ​ហៅ​បន្ត​ពី​ទូរសព្ទ​របស់​អ្នក​បាន​ទេ​ ខណៈ​ពេល​ដែល​អ្នក​កំពុង​ប្រើ​សេវា​រ៉ូមីង។" "បាន​បើក​សេវាកម្ម។" "បាន​បើក​សេវាកម្ម​សម្រាប់៖" "បាន​បិទ​សេវាកម្ម។" @@ -96,6 +97,8 @@ "បាន​ទប់​ស្កាត់​សេវាកម្ម​សំឡេង/ទិន្នន័យ។" "បាន​ទប់ស្កាត់​សេវាកម្ម​សំឡេង/សារ SMS ។" "សំឡេង/ទិន្នន័យ/សេវាកម្ម SMS ទាំងអស់​ត្រូវ​បាន​ទប់​ស្កាត់។" + "មិន​អាច​ភ្ជាប់​ទៅ​បណ្តាញ​បានទេ​" + "ដើម្បី​ធ្វើ​ឲ្យ​ការ​ទទួល​​រលក​សញ្ញា​​ប្រសើរ​ជាងមុន​ សូម​សាកល្បង​ប្តូរ​ប្រភេទ​ដែល​បាន​ជ្រើសរើស​នៅ​ក្នុង ការកំណត់​ >​ បណ្តាញ​ចល័ត​ >​ ប្រភេទ​បណ្តាញ​ដែល​ពេញចិត្ត​។" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode FULL" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode HCO" "ម៉ាស៊ីនកូនបានស្នើ TTY Mode VCO" @@ -179,6 +182,8 @@ "ប្រវត្តិរូបការងារត្រូវបានលុបដោយសារបាត់បង់កម្មវិធីគ្រប់គ្រង។" "ប្រវត្តិរូបការងាររបស់អ្នកអាចបាត់បង់ ឬមានបញ្ហា។ ជាលទ្ធផល ប្រវត្តិរូបការងាររបស់អ្នក និងទិន្នន័យដែលពាក់ព័ន្ធត្រូវបានលុប។ ទំនាក់ទំនងអ្នកគ្រប់គ្រងរបស់អ្នកសម្រាប់ជំនួយ។" "ប្រវត្តិរូបការងាររបស់អ្នកមិនមាននៅលើឧបករណ៍នេះទៀតទេ។" + "កំពុង​តាមដាន​ចរាចរណ៍​បណ្តាញ" + "ចុច​ដើម្បី​ស្វែងយល់​បន្ថែម" "ឧបករណ៍របស់អ្នកនឹងត្រូវបានលុប" "កម្មវិធីគ្រប់គ្រងបាត់បង់សមាសធាតុ ឬមានបញ្ហា ហើយមិនអាចប្រើបានទេ។ ឧបករណ៍របស់អ្នកនឹងត្រូវបានលុបឥឡូវនេះ។ ទំនាក់ទំនងអ្នកគ្រប់គ្រងរបស់អ្នកសម្រាប់ជំនួយ។" "ខ្ញុំ" @@ -605,9 +610,9 @@ "វិទ្យុ" "ទូរសារ" "TTY TDD" - "ទូរស័ព្ទ​​កន្លែងធ្វើការ" + "ទូរសព្ទ​​កន្លែងធ្វើការ" "ភេយ័រ​កន្លែង​ធ្វើ​ការ" - "អ្នក​ជំនួយ​ការ" + "ជំនួយ​ការ" "សារ MMS" "តាម​តម្រូវ​ការ" "ថ្ងៃ​ខួប​កំណើត" @@ -640,10 +645,10 @@ "ផ្សេងៗ" "តាម​តម្រូវការ" "តាម​បំណង" - "អ្នក​ជំនួយ​ការ" + "ជំនួយ​ការ" "បងប្អូន​ប្រុស" "កូន" - "ដៃគូ​ក្នុងស្រុក" + "ដៃគូ​រួមរស់ជាមួយគ្នា" "ឪពុក" "មិត្តភ័ក្ដិ" "អ្នក​គ្រប់គ្រង" @@ -1210,6 +1215,8 @@ "ឲ្យ​កម្មវិធី​អាន​សម័យ​ដំឡើង។ វា​អនុញ្ញាត​ឲ្យ​ឃើញ​ព័ត៌មាន​លម្អិត​អំពី​​ការដំឡើង​កញ្ចប់​សកម្ម។" "ស្នើសុំកញ្ចប់ដំឡើង" "អនុញ្ញាតឲ្យកម្មវិធីស្នើសុំដំឡើងកញ្ចប់ (ឯកសារ/មាតិកា)។" + "ស្នើឲ្យមិនអើពើចំពោះការបង្កើនប្រសិទ្ធភាពថ្ម" + "អនុញ្ញាតឲ្យកម្មវិធីស្នើសុំការអនុញ្ញាត ដើម្បីមិនអើពើចំពោះការបង្កើនប្រសិទ្ធភាពថ្ម។" "ប៉ះ ពីរ​ដង​ដើម្បី​ពិនិត្យ​ការ​ពង្រីក" "មិន​អាច​បន្ថែម​ធាតុ​ក្រាហ្វិក។" "ទៅ" @@ -1560,7 +1567,7 @@ "ជ្រើស​ឆ្នាំ" "បាន​លុប %1$s" "កន្លែង​ធ្វើការ %1$s" - "ដើម្បីផ្តាច់អេក្រង់នេះ សូមប៉ះ និងសង្កត់ប៊ូតុងថយក្រោយឲ្យជាប់។" + "ដើម្បី​ដក​ការ​ខ្ទាស់​អេក្រង់​នេះ សូម​សង្កត់​ប៉ូតុង​ថយ​ក្រោយ និង​ប៊ូតុង​ថ្មី​ឲ្យ​ជាប់។" "កម្មវិធីនេះត្រូវបានខ្ទាស់។ មិនអនុញ្ញាតឲ្យដោះការខ្ទាស់នៅលើឧបករណ៍នេះទេ។" "បាន​ភ្ជាប់​អេក្រង់" "មិន​បាន​ភ្ជាប់​អេក្រង់" diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index 7cb97a7c56b7..ab8d33a7352f 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "ಸಂಪರ್ಕ ಸಮಸ್ಯೆ ಇಲ್ಲವೇ ಅಮಾನ್ಯ MMI ಕೋಡ್." "ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಸ್ಥಿರ ದೂರವಾಣಿ ಸಂಖ್ಯೆಗಳಿಗೆ ಮಾತ್ರ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ." + "ನೀವು ರೋಮಿಂಗ್‌ನಲ್ಲಿರುವಾಗ ನಿಮ್ಮ ಫೋನ್‌ನಿಂದ ಕರೆ ಫಾರ್ವರ್ಡ್ ಮಾಡುವಿಕೆಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ." "ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ." "ಸೇವೆಯನ್ನು ಇವುಗಳಿಗಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ:" "ಸೇವೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ." @@ -96,6 +97,8 @@ "ಧ್ವನಿ/ಡೇಟಾ ಸೇವೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ." "ಧ್ವನಿ/SMS ಸೇವೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ." "ಎಲ್ಲಾ ದ್ವನಿ/ಡೇಟಾ/SMS ಸೇವೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ." + "ನೆಟ್‌ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ" + "ಸ್ವೀಕರಿಸುವುದನ್ನು ಸುಧಾರಿಸಲು, ಸೆಟ್ಟಿಂಗ್‌ಗಳು > ಸೆಲ್ಯುಲಾರ್ ನೆಟ್‌ವರ್ಕ್ > ಪ್ರಾಶಸ್ತ್ಯ ನೀಡಲಾದ ನೆಟ್‌ವರ್ಕ್ ಪ್ರಕಾರದಲ್ಲಿ ಆಯ್ಕೆ ಮಾಡಲಾದ ರೀತಿಯನ್ನು ಬದಲಾಯಿಸಲು ಪ್ರಯತ್ನಿಸಿ." "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO" "ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO" @@ -179,6 +182,8 @@ "ತಪ್ಪಿಹೋಗಿರುವ ನಿರ್ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದಾಗಿ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ." "ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ನಿರ್ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ ಕಳೆದು ಹೋಗಿದೆ ಅಥವಾ ಹಾಳಾಗಿದೆ. ಇದರ ಪರಿಣಾಮವಾಗಿ ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಅದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗಿದೆ. ಸಹಾಯಕ್ಕಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." "ನಿಮ್ಮ ಕಾರ್ಯ ಪ್ರೊಫೈಲ್ ಈ ಸಾಧನದಲ್ಲಿ ಇನ್ನು ಮುಂದೆ ಲಭ್ಯವಿರುವುದಿಲ್ಲ." + "ನೆಟ್‌ವರ್ಕ್ ಟ್ರಾಫಿಕ್ ಅನ್ನು ಮಾನಿಟರ್ ಮಾಡಲಾಗುತ್ತಿದೆ" + "ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ" "ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ" "ನಿರ್ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್‌ನ ಅಂಶಗಳು ಕಾಣೆಯಾಗಿವೆ ಅಥವಾ ದೋಷಪೂರಿತವಾಗಿದೆ ಮತ್ತು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ಇದೀಗ ಅಳಿಸಲಾಗುತ್ತದೆ. ಸಹಾಯಕ್ಕಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." "ನಾನು" @@ -958,9 +963,9 @@ "%1$s ಚಾಲನೆಯಲ್ಲಿದೆ" "ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಅಥವಾ ಅಪ್ಲಿಕೇಶನ್ ನಿಲ್ಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ." "ಸರಿ" - "ರದ್ದುಮಾಡು" + "ರದ್ದುಮಾಡಿ" "ಸರಿ" - "ರದ್ದುಮಾಡು" + "ರದ್ದುಮಾಡಿ" "ಗಮನಿಸಿ" "ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..." "ಆನ್ ಮಾಡು" @@ -997,7 +1002,7 @@ "%1$s ನಿಲ್ಲುತ್ತಲೇ ಇರುತ್ತದೆ" "%1$s ನಿಲ್ಲುತ್ತಲೇ ಇರುತ್ತದೆ" "ಅಪ್ಲಿಕೇಶನ್ ಮತ್ತೆ ತೆರೆಯಿರಿ" - "ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸು" + "ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ" "ಮುಚ್ಚು" "ಸಾಧನವು ಮರುಪ್ರಾರಂಭವಾಗುವವರೆಗೂ ಮ್ಯೂಟ್ ಮಾಡಿ" "ನಿರೀಕ್ಷಿಸು" @@ -1118,7 +1123,7 @@ "ಇದು ನಿಮ್ಮ ಮೊಬೈಲ್ ಖಾತೆಯಲ್ಲಿ ""ಶುಲ್ಕಗಳನ್ನು ವಿಧಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗಬಹುದು""." "ಇದು ನಿಮ್ಮ ಮೊಬೈಲ್ ಖಾತೆಯಲ್ಲಿ ಶುಲ್ಕಗಳನ್ನು ವಿಧಿಸುವುದಕ್ಕೆ ಕಾರಣವಾಗುತ್ತದೆ." "ಕಳುಹಿಸು" - "ರದ್ದುಮಾಡು" + "ರದ್ದುಮಾಡಿ" "ನನ್ನ ಆಯ್ಕೆಯನ್ನು ನೆನಪಿಡು" "ನೀವು ಇದನ್ನು ನಂತರದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್‍‍ಗಳು > ಅಪ್ಲಿಕೇಶನ್‍‍ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು" "ಯಾವಾಗಲೂ ಅನುಮತಿಸು" @@ -1208,6 +1213,8 @@ "ಸ್ಥಾಪಿತ ಸೆಷನ್‌ಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ. ಸಕ್ರಿಯ ಪ್ಯಾಕೇಜ್‌ ಸ್ಥಾಪನೆಗಳ ಕುರಿತು ವಿವರಣೆಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಇದು ಅನುಮತಿಸುತ್ತದೆ." "ಸ್ಥಾಪನೆ ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ವಿನಂತಿಸಿ" "ಪ್ಯಾಕೇಜ್‌ಗಳ ಸ್ಥಾಪನೆಯನ್ನು ವಿನಂತಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ." + "ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್‌ಗಳನ್ನು ಕಡೆಗಣಿಸಲು ಕೇಳಿ" + "ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಬ್ಯಾಟರಿ ಆಪ್ಟಿಮೈಸೇಶನ್‌ಗಳನ್ನು ಕಡೆಗಣಿಸುವುದಕ್ಕೆ ಅನುಮತಿಯನ್ನು ಕೇಳಲು ಅಪ್ಲಿಕೇಶನ್‌ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ." "ಝೂಮ್‌ ನಿಯಂತ್ರಿಸಲು ಎರಡು ಬಾರಿ ಟ್ಯಾಪ್ ಮಾಡಿ" "ವಿಜೆಟ್ ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ." "ಹೋಗು" @@ -1303,7 +1310,7 @@ "ಹಿಂದಿನ ತಿಂಗಳು" "ಮುಂದಿನ ತಿಂಗಳು" "Alt" - "ರದ್ದುಮಾಡು" + "ರದ್ದುಮಾಡಿ" "ಅಳಿಸು" "ಮುಗಿದಿದೆ" "ಮೋಡ್ ಬದಲಾವಣೆ" @@ -1558,7 +1565,7 @@ "ವರ್ಷವನ್ನು ಆಯ್ಕೆಮಾಡಿ" "%1$s ಅಳಿಸಲಾಗಿದೆ" "ಕೆಲಸ %1$s" - "ಈ ಪರದೆಯನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಲು, ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಂಂದೆ ಒತ್ತಿ ಹಿಡಿಯಿರಿ." + "ಈ ಪರದೆಯನ್ನು ಅನ್‌ಪಿನ್ ಮಾಡಲು, ಅವಲೋಕನವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್‌ ಮಾಡಿ." "ಅಪ್ಲಿಕೇಶನ್ ಪಿನ್‌ ಮಾಡಲಾಗಿದೆ: ಈ ಸಾಧನದಲ್ಲಿ ಅನ್‌ಪಿನ್‌ ಮಾಡುವುದನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ." "ಸ್ಕ್ರೀನ್‌ ಪಿನ್‌ ಮಾಡಲಾಗಿದೆ" "ಸ್ಕ್ರೀನ್‌ ಅನ್‌ಪಿನ್‌ ಮಾಡಲಾಗಿದೆ" @@ -1672,7 +1679,7 @@ "ಸಾಧನ ಮರುಹೊಂದಿಸಲಾಗುತ್ತಿದೆ..." "ಸಾಧನವನ್ನು ಮರುಹೊಂದಿಸುವುದೇ?" "ನೀವು ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತೀರಿ ಮತ್ತು %1$s ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಡೆಮೋ ಮತ್ತೆ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ..." - "ರದ್ದುಮಾಡು" + "ರದ್ದುಮಾಡಿ" "ಈಗಲೇ ಮರುಹೊಂದಿಸು" "ನಿರ್ಬಂಧಗಳು ಇಲ್ಲದೆಯೇ ಈ ಸಾಧನವನ್ನು ಬಳಸಲು ಫ್ಯಾಕ್ಟರಿ ಮರುಹೊಂದಿಸಿ" "ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಸ್ಪರ್ಶಿಸಿ." diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index b23a96637c57..4e704d67767f 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "연결에 문제가 있거나 MMI 코드가 잘못되었습니다." "발신 허용 번호에서만 수행할 수 있는 작업입니다." + "로밍 중에는 착신 전환 설정을 변경할 수 없습니다." "서비스를 사용하도록 설정했습니다." "사용 설정된 서비스 목록:" "서비스가 사용 중지되었습니다." @@ -96,6 +97,8 @@ "음성/데이터 서비스가 차단되었습니다." "음성/SMS 서비스가 차단되었습니다." "모든 음성/데이터/SMS 서비스가 차단되었습니다." + "네트워크에 연결할 수 없습니다." + "수신 상태를 개선하려면 설정 > 이동통신망 > 기본 네트워크 유형에서 선택된 유형을 변경해 보세요." "피어가 TTY 모드 FULL을 요청했습니다." "피어가 TTY 모드 HCO를 요청했습니다." "피어가 TTY 모드 VCO를 요청했습니다." @@ -179,6 +182,8 @@ "관리 앱이 누락되어 직장 프로필이 삭제되었습니다." "직장 프로필 관리 앱이 없거나 손상되어 직장 프로필 및 관련 데이터가 삭제되었습니다. 도움이 필요한 경우 관리자에게 문의하세요." "직장 프로필을 이 기기에서 더 이상 사용할 수 없습니다." + "네트워크 트래픽이 모니터링되고 있음" + "자세한 내용을 보려면 탭하세요." "기기가 삭제됩니다." "관리 앱이 손상되었거나 구성요소가 없어서 사용할 수 없습니다. 이제 기기가 삭제됩니다. 도움이 필요한 경우 관리자에게 문의하세요." "나" @@ -248,17 +253,17 @@ "위치" "이 기기의 위치정보에 액세스" "캘린더" - "일정에 접근할 수 있도록" + "캘린더에 액세스" "SMS" - "문자 메시지를 보내고 확인할 수 있도록" + "SMS 메시지 전송 및 보기" "저장" "기기 사진, 미디어, 파일 액세스" "마이크" - "오디오를 녹음할 수 있도록" + "오디오 녹음" "카메라" "사진 및 동영상 촬영" "전화" - "통화 상태를 관리하거나 전화를 걸 수 있도록" + "전화 걸기 및 관리" "신체 센서" "생체 신호에 관한 센서 데이터에 액세스" "창 콘텐츠 가져오기" @@ -284,11 +289,11 @@ "바로가기 제거" "애플리케이션이 사용자의 작업 없이 홈 화면 바로가기를 삭제할 수 있도록 허용합니다." "발신전화 경로 전환" - "통화를 다른 번호로 리디렉션하거나 통화를 완전히 중단하는 옵션을 사용하여, 앱에서 발신 통화 중에 전화를 거는 번호를 볼 수 있게 허용합니다." + "다른 번호로 다시 걸거나 중단시키는 옵션을 사용하여 발신한 번호를 볼 수 있게 허용합니다." "문자 메시지 받기(SMS)" - "앱이 SMS 메시지를 수신하고 처리할 수 있도록 허용합니다. 이는 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 모니터링 또는 삭제할 수도 있다는 것을 의미합니다." + "앱이 SMS 메시지를 수신하고 처리할 수 있도록 허용합니다. 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 확인 또는 삭제할 수도 있습니다." "문자 메시지 받기(MMS)" - "앱이 MMS 메시지를 수신하고 처리할 수 있도록 허용합니다. 이는 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 모니터링 또는 삭제할 수도 있다는 것을 의미합니다." + "앱이 MMS 메시지를 수신하고 처리할 수 있도록 허용합니다. 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 확인 또는 삭제할 수도 있습니다." "셀 브로드캐스트 메시지 읽기" "앱이 기기가 수신한 셀 브로드캐스트 메시지를 읽을 수 있도록 합니다. 비상 상황임을 알리기 위해 일부 지역에서 셀 브로드캐스트 경고가 전달됩니다. 비상 셀 브로드캐스트를 수신할 때 악성 앱이 기기의 성능이나 작동을 방해할 수 있습니다." "가입된 피드 읽기" @@ -346,7 +351,7 @@ "앱에서 수신 및 발신 통화 데이터를 포함하여 TV의 통화 기록을 수정할 수 있도록 허용합니다. 이 경우 악성 앱이 통화 기록을 삭제하거나 수정할 수도 있습니다." "앱에서 수신 및 발신 통화 데이터를 포함하여 휴대전화의 통화 기록을 수정할 수 있도록 허용합니다. 이 경우 악성 앱이 통화 기록을 지우거나 수정할 수 있습니다." "신체 센서(예: 심박수 모니터)에 액세스" - "앱이 심박수와 같은 신체 상태를 모니터링하는 센서의 데이터에 액세스하도록 허용합니다." + "앱이 심박수와 같은 신체 상태를 확인하는 센서의 데이터에 접근하도록 허용합니다." "캘린더 일정 및 기밀정보 읽기" "앱이 친구나 동료의 일정을 포함하여 태블릿에 저장된 모든 캘린더 일정을 읽을 수 있도록 허용합니다. 이 경우 앱이 비밀유지 또는 기밀성을 무시하고 캘린더 데이터를 공유 또는 저장할 수도 있습니다." "앱이 친구 및 동료들의 일정을 포함하여 TV에 저장된 모든 캘린더 일정을 읽을 수 있도록 허용합니다. 이 경우 앱이 데이터의 민감성 또는 기밀성과 상관없이 캘린더 데이터를 공유하거나 저장할 수 있게 됩니다." @@ -355,8 +360,8 @@ "앱이 친구나 동료의 일정을 포함하여 태블릿에서 수정할 수 있는 일정을 추가, 삭제, 변경할 수 있도록 허용합니다. 이 경우 앱이 캘린더 소유자가 보내는 것처럼 메시지를 전송하거나 소유자 모르게 일정을 수정할 수도 있습니다." "앱이 친구나 동료의 일정을 비롯하여 TV에서 수정할 수 있는 일정을 추가, 삭제, 변경할 수 있도록 허용합니다. 이 경우 앱이 발신자가 캘린더 소유자인 메시지를 전송하거나 소유자가 모르는 사이에 일정을 수정할 수 있습니다." "앱이 친구나 동료의 일정을 포함하여 휴대전화에서 수정할 수 있는 일정을 추가, 삭제, 변경할 수 있도록 허용합니다. 이 경우 앱이 캘린더 소유자가 보내는 것처럼 메시지를 전송하거나 소유자 모르게 일정을 수정할 수도 있습니다." - "추가 위치 제공업체 명령에 액세스" - "앱이 추가 위치 정보 제공 기능의 명령에 액세스하도록 허용합니다. 이 경우 앱이 GPS 또는 기타 위치 소스의 작동을 방해할 수 있습니다." + "추가 위치 제공업체 명령에 접근" + "앱이 추가 위치 정보 제공 기능의 명령에 접근하도록 허용합니다. 이 경우 앱이 GPS 또는 기타 위치 소스의 작동을 방해할 수 있습니다." "정확한 위치(GPS 및 네트워크 기반)에 액세스" "앱에서 GPS 또는 기지국 및 Wi-Fi와 같은 네트워크 위치 제공자를 사용하는 위치 서비스를 통해 내 정확한 위치를 알 수 있도록 합니다. 앱에서 이를 사용하도록 하려면 기기에서 이러한 위치 서비스는 사용하도록 설정해야 합니다. 앱에서 위치 서비스를 사용하여 내 위치를 파악할 수 있으며 배터리 소모량이 증가할 수 있습니다." "대략적인 위치(네트워크 기반)에 액세스" @@ -373,10 +378,10 @@ "앱이 진동을 제어할 수 있도록 허용합니다." "전화번호 자동 연결" "앱이 사용자의 조작 없이 전화번호로 전화를 걸 수 있도록 허용합니다. 이 경우 예상치 못한 통화 요금이 부과될 수 있습니다. 앱이 비상 전화를 걸도록 하는 권한은 주어지지 않습니다. 악성 앱이 사용자의 확인 없이 전화를 걸어 요금이 부과될 수 있습니다." - "IMS 통화 서비스에 액세스" + "IMS 통화 서비스에 접근" "앱이 IMS 서비스를 사용하여 자동으로 전화를 걸 수 있도록 허용합니다." "휴대전화 상태 및 ID 읽기" - "앱이 기기의 휴대전화 기능에 액세스할 수 있도록 허용합니다. 이 권한을 사용하면 앱이 전화번호 및 기기의 ID, 활성 통화인지 여부, 통화가 연결된 원격 번호 등을 확인할 수 있습니다." + "앱이 기기의 휴대전화 기능에 접근할 수 있도록 허용합니다. 이 권한을 사용하면 앱이 전화번호 및 기기의 ID, 활성 통화인지 여부, 통화가 연결된 원격 번호 등을 확인할 수 있습니다." "태블릿이 절전 모드로 전환되지 않도록 설정" "TV의 절전 모드 전환 방지" "휴대전화가 절전 모드로 전환되지 않도록 설정" @@ -401,7 +406,7 @@ "앱이 휴대전화가 알고 있는 계정 목록을 가져올 수 있도록 허용합니다. 이 경우 설치한 애플리케이션에 의해 만들어진 모든 계정을 포함할 수 있습니다." "네트워크 연결 보기" "앱이 어떤 네트워크가 존재하며 연결되었는지 등의 네트워크 연결에 대한 정보를 볼 수 있도록 허용합니다." - "전체 네트워크 액세스 권한 보유" + "완전한 네트워크 접근" "앱이 네트워크 소켓을 만들고 맞춤 네트워크 프로토콜을 사용할 수 있도록 허용합니다. 브라우저 및 기타 앱이 데이터를 인터넷에 전송하는 수단을 제공하므로, 이 권한이 데이터를 인터넷에 전송하는 데 필요하지 않습니다." "네트워크 연결 변경" "앱이 네트워크 연결 상태를 변경할 수 있도록 허용합니다." @@ -415,7 +420,7 @@ "앱이 사용자의 태블릿뿐 아니라 멀티캐스트 주소를 사용하여 Wi-Fi 네트워크에서 모든 기기로 전송된 패킷을 받도록 허용합니다. 이 경우 비멀티캐스트 모드보다 전력을 더 많이 소비합니다." "앱이 멀티캐스트 주소를 사용하여 TV뿐 아니라 Wi-Fi 네트워크에 있는 모든 기기로 전송된 패킷을 수신할 수 있도록 허용합니다. 멀티캐스트 모드를 사용하지 않을 때보다 전략 소비량이 많아집니다." "앱이 사용자의 휴대전화뿐 아니라 멀티캐스트 주소를 사용하여 Wi-Fi 네트워크에서 모든 기기로 전송된 패킷을 받을 수 있도록 허용합니다. 이 경우 비멀티캐스트 모드보다 전력을 더 많이 소비합니다." - "블루투스 설정에 액세스" + "블루투스 설정에 접근" "앱이 로컬 블루투스 태블릿을 설정한 다음 원격 기기를 검색하여 페어링할 수 있도록 허용합니다." "앱이 로컬 블루투스 TV를 설정하고 원격 기기를 검색하여 페어링할 수 있도록 허용합니다." "앱이 로컬 블루투스 휴대전화를 설정한 다음 원격 기기를 검색하여 페어링할 수 있도록 허용합니다." @@ -428,7 +433,7 @@ "블루투스 기기와 페어링" "앱이 태블릿의 블루투스 설정을 확인하고 페어링된 기기에 연결하며 연결을 수락할 수 있도록 허용합니다." "앱이 TV에서 블루투스 설정을 확인하고 페어링된 기기의 연결을 수락할 수 있도록 허용합니다." - "앱이 휴대전화의 블루투스 설정을 확인하고 페어링된 기기에 연결하며 연결을 수락할 수 있도록 허용합니다." + "앱에서 휴대전화의 블루투스 설정을 확인하고 등록된 디바이스에 연결하며 연결을 수락할 수 있습니다." "NFC(Near Field Communication) 제어" "앱이 NFC(근거리 무선 통신) 태그, 카드 및 리더와 통신할 수 있도록 허용합니다." "화면 잠금 사용 중지" @@ -488,7 +493,7 @@ "앱이 네트워크 정책을 관리하고 앱별 규칙을 정의할 수 있도록 허용합니다." "네트워크 사용량 계산 수정" "애플리케이션이 애플리케이션의 네트워크 사용량을 계산하는 방식을 수정할 수 있도록 허용합니다. 일반 애플리케이션에서는 사용하지 않습니다." - "알림 액세스" + "알림 접근" "앱이 다른 앱에서 게시한 알림을 비롯하여 알림을 검색하고 살펴보며 삭제할 수 있도록 허용합니다." "알림 수신기 서비스 사용" "권한을 가진 프로그램이 알림 수신기 서비스에 대한 최상위 인터페이스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다." @@ -502,7 +507,7 @@ "애플리케이션이 네트워크 상태에 대한 관측 보고를 수신하도록 허용합니다. 일반 앱에는 필요하지 않습니다." "입력 기기 보정 변경" "앱이 터치 스크린의 보정 매개변수를 수정할 수 있도록 허용합니다. 일반 앱에는 필요하지 않습니다." - "DRM 인증서에 액세스" + "DRM 인증서에 접근" "애플리케이션이 DRM 인증서를 프로비저닝하고 사용하도록 허용합니다. 일반 앱에서는 필요하지 않습니다." "Android Beam 전송 상태 수신" "이 애플리케이션이 현재 Android Beam 전송 관련 정보를 수신하도록 허용합니다." @@ -512,7 +517,7 @@ "보유자가 이동통신사 메시지 서비스의 최상위 인터페이스에 고정할 수 있습니다. 일반 앱에는 필요하지 않습니다." "이동통신사 서비스 사용" "권한을 가진 애플리케이션에서 이동통신사 서비스를 사용하도록 허용합니다. 일반 앱에는 필요하지 않습니다." - "알림 일시중지에 액세스" + "알림 일시중지에 접근" "앱에 알림 일시중지 설정을 읽고 작성하도록 허용합니다." "비밀번호 규칙 설정" "화면 잠금 비밀번호와 PIN에 허용되는 길이와 문자 수를 제어합니다." @@ -1208,6 +1213,8 @@ "애플리케이션의 설치 세션 읽기를 허용하면, 활성 패키지 설치에 대한 세부 정보를 볼 수 있습니다." "패키지 설치 요청" "애플리케이션이 패키지 설치를 요청하도록 허용합니다." + "배터리 최적화를 무시하도록 요청" + "앱에서 배터리 최적화를 무시할 수 있는 권한을 요청할 수 있도록 허용합니다." "확대/축소하려면 두 번 탭하세요." "위젯을 추가할 수 없습니다." "이동" @@ -1234,7 +1241,7 @@ "배경화면" "배경화면 변경" "알림 수신기" - "가상 현실 리스너" + "VR 리스너" "조건 제공자" "알림 순위 지정 서비스" "VPN이 활성화됨" @@ -1558,7 +1565,7 @@ "연도 선택" "%1$s 삭제됨" "업무용 %1$s" - "이 화면을 고정 해제하려면 \'뒤로\'를 길게 터치합니다." + "이 화면을 고정 해제하려면 \'뒤로\' 및 \'최근 사용\'을 길게 터치하세요." "앱이 고정되었습니다. 이 기기에서는 고정 해제를 허용하지 않습니다." "화면 고정됨" "화면 고정 해제됨" diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 4f48a944f798..21a50870c0dd 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Туташууда көйгөй чыкты же MMI коду жараксыз." "Иш-аракет туруктуу терүү номерлери менен гана чектелет." + "Роуминг учурунда чалууну башка номерге багыттоонун жөндөөлөрүн телефонуңуздан өзгөртүү мүмкүн эмес." "Кызмат иштетилди." "Кызмат төмөнкү үчүн иштетилди:" "Кызмат өчүрүлдү." @@ -96,6 +97,8 @@ "Үн/берилиштер кызматтары бөгөттөлдү." "Үн/SMS кызматтары бөгөттөлгөн." "Бардык үн/берилиштер/SMS кызматтары бөгөттөлдү." + "Тармакка туташпай жатат" + "Кабыл алуу мүмкүнчүлүгүн жакшыртуу үчүн Жөндөөлөр > Мобилдик тармактар > Тандалган тармак бөлүмүнөн тармактын түрүн өзгөртүп көрүңүз." "Peer TTY режимин FULL кылууну суранды" "Peer TTY режимин HCO кылууну суранды" "Peer TTY режимин VCO кылууну суранды" @@ -179,6 +182,8 @@ "Администратордун колдонмосу жок болгондуктан, жумуш профили жок кылынды." "Жумуш профилинин администратор колдонмосу жок же бузулгандыктан, жумуш профилиңиз жана ага байланыштуу дайындар жок кылынган. Жардам алуу үчүн администраторуңузга кайрылыңыз." "Жумуш профилиңиз бул түзмөктө жеткиликтүү болбой калды." + "Тармак трафиги көзөмөлдөнүүдө" + "Көбүрөөк маалымат алуу үчүн таптап коюңуз" "Түзмөгүңүз тазаланат" "Администратор колдонмосунун курамдары жок же бузулгандыктан, аны колдонуу мүмкүн эмес. Түзмөгүңүз азыр тазаланат. Жардам алуу үчүн администраторуңузга кайрылыңыз." "Мен" @@ -641,18 +646,18 @@ "Өзгөчө" "Өзгөчө" "Жардамчы" - "Ага-ини" - "Баласы" - "Жергиликтүү Өнөктөш" - "Атасы" - "Досу" - "Менежер" - "Энеси" + "Ага/Ини" + "Бала" + "Жарандык нике" + "Ата" + "Дос" + "Башчы" + "Эне" "Ата/эне" "Өнөк" - "Төмөнкүдөй аталат" + "Сунушталган" "Тууган" - "Эже-сиңди" + "Эже/Сиңди" "Жубай" "Өзгөчө" "Үй" @@ -997,7 +1002,7 @@ "%1$s колдонмосу иштебей калып жатат" "%1$s колдонмосу иштебей калып жатат" "Колдонмону кайра ачуу" - "Жооп пикир жөнөтүү" + "Пикир билдирүү" "Жабуу" "Түзмөк өчүрүлүп-күйгүзүлгүчө үнүн өчүрүү" "Күтүү" @@ -1058,10 +1063,10 @@ "Чалуунун үн деңгээли" "Медиа үнүнүн деңгээли" "Эскертме үнүнүн деңгээли" - "Демейки рингтон" - "Демейки рингтон (%1$s)" + "Демейки шыңгыр" + "Демейки шыңгыр (%1$s)" "Эч бир" - "Ринтондор" + "Шыңгырлар" "Белгисиз рингтон" Wi-Fi тармагы жеткиликтүү @@ -1208,6 +1213,8 @@ "Колдонмого орнотуу сеанстарын окуу мүмкүнчүлүгүн берет. Ушуну менен, ал жигердүү топтом орнотууларынын чоо-жайын көрө алат." "орнотуу топтомдорун суроо" "Колдонмо топтомдорду орнотууга уруксат сурай алат." + "батареянын кубатын көп керектей берсин" + "Колдонмо батареянын кубатын керектегенден мурун уруксат суралсын." "Масштабдын параметрлерин өзгөртүү үчүн бул жерди эки жолу басыңыз." "Виджетти кошуу мүмкүн болбоду." "Өтүү" @@ -1558,7 +1565,7 @@ "Жылды тандаңыз" "%1$s өчүрүлдү" "Жумуш %1$s" - "Бул экранды бошотуу үчүн \"Артка\" баскычын басып, кармап туруңуз." + "Бул экранды бошотуу үчүн \"Артка\" жана \"Сереп салуу\" баскычтарын басып, кармап туруңуз." "Колдонмо кадалган: Бул түзмөктө бошотууга уруксат жок." "Экран кадалды" "Экран бошотулду" diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index 18f285f96d89..84ea55a5e747 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "ມີບັນຫາໃນການເຊື່ອມຕໍ່ ຫຼືລະຫັດ MMI ບໍ່ຖືກຕ້ອງ." "ການດຳເນີນການຖືກຈຳກັດເປັນ ຈຳກັດໝາຍເລກໂທອອກເທົ່ານັ້ນ." + "Can not change call forwarding settings from your phone while you are roaming." "ບໍລິການຖືກເປີດໄວ້ແລ້ວ." "ບໍລິການຖືກເປີດໃຊ້ສຳລັບ:" "ບໍ​ລິ​ການ​ໄດ້​ຖືກ​ປິດແລ້ວ." @@ -96,6 +97,8 @@ "ບໍລິການ ຂໍ້ມູນ/ສຽງ ຖືກບລັອກ." "ບໍລິການ ສຽງ/SMS ຖືກບລັອກ." "ບໍລິການ ການໂທ/ອິນເຕີເນັດ/SMS ຖືກປິດກັ້ນໄວ້." + "Can’t reach network" + "To improve reception, try changing the type selected at Settings > Cellular networks > Preferred network type." "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ​ນັ້ນ​ເຕັມ​ແລ້ວ" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ HCO" "ໂໝດ TTY ທີ່​ເພື່ອນ​ຂໍ VCO" @@ -179,6 +182,8 @@ "ລຶບ​ໂປ​ຣ​ໄຟ​ລ໌​ບ່ອນ​ເຮັດ​ວຽກ​ແລ້ວ ເນື່ອງ​ຈາກຂາດ​ແອັບ​ບໍ​ລິ​ຫານ​ໄປ." "ແອັບ​ບໍ​ລິ​ຫານ​ໂປ​ຣ​ໄຟ​ລ໌​ວຽກ​ຂາດ​ໄປ ຫຼື​ຖືກ​​ເສຍ​ຫາຍ. ດ້ວຍ​ເຫດ​ຜົນ​ນັ້ນ, ໂປ​ຣ​ໄຟ​ລ໌​ບ່ອນ​ເຮັດວຽກ​ຂອງ​ທ່ານ ແລະ​ຂໍ້​ມູນ​ທີ່​ກ່ຽວ​ຂ້ອງ​ຈິ່ງ​ຖືກ​ລຶບ​ໄປ. ຕິດ​ຕໍ່​ຜູ້​ຄວບ​ຄຸ​ມ​ຂອງ​ທ່ານ ເພື່ອ​ຂໍ​ຄວາມ​ຊ່ວຍ​ເຫຼືອ." "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກບໍ່ມີໃຫ້ໃຊ້ງານເທິງອຸປະກອນນີ້ອີກຕໍ່ໄປ." + "ກຳລັງຕິດຕາມທຣາບຟິກເຄືອຂ່າຍ" + "ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ" "ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ຈະ​ຖືກ​ລຶບ" "ແອັບ​ບໍ​ລິ​ຫານ​ຂາດ​ອົງ​ປະ​ກອບ​ ຫ​ຼື​ຖືກ​ຂັດ​ຈັງ​ຫວະ, ແລະ​ບໍ່​ສາ​ມາດ​ໃຊ​ໄດ້. ດຽວ​ນີ້​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ຈະ​ຖືກ​ລຶບ. ຕິດ​ຕໍ່​ຜູ້​ຄວບ​ຄຸມ​ຂອງ​ທ່ານ ເພື່ອ​ຂໍ​ຄວາມ​ຊ່ວຍ​ເຫຼືອ." "ຂ້າພະເຈົ້າ" @@ -1208,6 +1213,8 @@ "​ອະ​ນຸ​ຍາດ​ໃຫ້​ແອັບ​ພລິ​ເຄ​ຊັນ​ອ່ານ​ເຊດ​ຊັນ​ການ​ຕິດ​ຕັ້ງ​ໄດ້. ນີ້​ຈະ​ອະ​ນຸ​ຍາດ​ໃຫ້​ມັນ​ເບິ່ງ​ເຫັນ​ລາຍ​ລະ​ອຽດ​ກ່ຽວ​ກັບ​ການ​ຕິດ​ຕັ້ງ​ແພັກ​ເກດ​ທີ່​ເຮັດ​​ວຽກ​ຢູ່​ໄດ້." "ຂໍ​ຕິດ​ຕັ້ງ​ແພັກ​ເກດ" "ອະ​ນຸ​ຍາດ​ໃຫ້​ແອັບ​ພ​ລິ​ເຄ​ຊັນ​ຂອງ​ການ​ຕິດ​ຕັ້ງ​ແພັກ​ເກດ." + "ຖາມເພື່ອໃຫ້ເພີກເສີຍການປັບແຕ່ງແບັດເຕີຣີ" + "ອະນຸຍາດໃຫ້ແອັບຖາມສິດອະນຸຍາດເພື່ອເພີກເສີຍຕໍ່ການປັບແຕ່ງແບັດເຕີຣີສຳລັບແອັບນັ້ນ." "ແຕະສອງເທື່ອເພື່ອຄວບຄຸມການຊູມ" "ບໍ່ສາມາດເພີ່ມວິດເຈັດໄດ້." "ໄປ" @@ -1558,7 +1565,7 @@ "ເລືອກ​ປີ" "%1$s ຖືກລຶບແລ້ວ" "​ບ່ອນ​ເຮັດ​ວຽກ %1$s" - "ກົດປຸ່ມກັບຄືນຄ້າງໄວ້ເພື່ອເຊົາປັກໝຸດໜ້າຈໍນີ້." + "To unpin this screen, touch & hold Back and Overview." "ແອັບ​ຖືກ​ປັກ​ໝຸດ​ແລ້ວ: ບໍ່​ອະ​ນຸ​ຍາດ​ໃຫ້​ຖອນ​ປັກ​ໝຸດ​ຢູ່​ເທິງ​ອຸ​ປະ​ກອນ​ນີ້." "​ປັກ​ໝຸດ​ໜ້າ​ຈໍ​ແລ້ວ" "ຍົກ​ເລີກ​ການ​ປັກ​ໝຸນ​​ຫນ້າ​ຈໍ​ແລ້ວ" diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 9952a7c5a109..d3414518ad26 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Ryšio problema arba neteisingas MMI kodas." "Operacija ribojama tik naudojant fiksuoto rinkimo numerius." + "Negalima pakeisti telefono skambučio peradresavimo nustatymų, kai naudojate tarptinklinį ryšį." "Paslauga įgalinta." "Paslauga buvo įgalinta:" "Paslauga išjungta." @@ -98,6 +99,8 @@ "Balso / duomenų paslaugos užblokuotos." "Balso / SMS paslaugos blokuojamos." "Blokuojamos visos balso / duomenų / SMS paslaugos." + "Nepavyko pasiekti tinklo" + "Kad pagerintumėte ryšį, pabandykite pakeisti tipą, pasirinktą skiltyje „Nustatymai“ > „Mobiliojo ryšio tinklai“ > „Pageidaujamas tinklo tipas“." "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo FULL" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo HCO" "Lygiavertis naudotojas pateikė užklausą dėl TTY režimo VCO" @@ -183,6 +186,8 @@ "Darbo profilis ištrintas dėl trūkstamos administratoriaus programos." "Trūksta darbo profilio administratoriaus programos arba ji sugadinta. Todėl darbo profilis ir susiję duomenys buvo ištrinti. Dėl pagalbos susisiekite su administratoriumi." "Darbo profilis nebepasiekiamas šiame įrenginyje." + "Tinklo srautas stebimas" + "Palieskite, kad sužinotumėte daugiau" "Įrenginys bus ištrintas" "Trūksta administratoriaus programos komponentų arba programa sugadinta ir jos negalima naudoti. Dabar įrenginys bus ištrintas. Dėl pagalbos susisiekite su administratoriumi." "Aš" @@ -1258,6 +1263,8 @@ "Leidžiama programai skaityti diegimo seansus. Leidžiama peržiūrėti išsamią aktyvių paketų diegimo informaciją." "pateikti užklausą dėl diegimo paketų" "Programai leidžiama pateikti užklausą dėl paketų diegimo." + "prašyti nepaisyti akumuliatoriaus optimizavimo nustatymų" + "Programai leidžiama prašyti leidimo nepaisyti tai programai skirto akumuliatoriaus optimizavimo nustatymų." "Bakstelėkite du kartus, kad valdytumėte mastelio keitimą" "Nepavyko pridėti." "Pradėti" @@ -1612,7 +1619,7 @@ "Pasirinkite metus" "Ištrinta: %1$s" "Darbo %1$s" - "Kad atsegtumėte šį ekraną, palieskite ir palaikykite „Atgal“." + "Kad atsegtumėte šį ekraną, palieskite ir palaikykite „Atgal“ ir „Apžvalga“." "Programa prisegta: šiame įrenginyje negalima atsegti." "Ekrano prisegtas" "Ekranas atsegtas" @@ -1682,7 +1689,7 @@ "Sutraukti" "Netrukdyti" "Prastova" - "Savaitgalio vakarą" + "Darbo dienos vakarą" "Savaitgalį" "Įvykis" "Nutildė %1$s" diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index ff2e97482524..b65eb4e5d83c 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Savienojuma problēma vai nederīgs MMI kods." "Darbība ir atļauta tikai fiksēto numuru sastādīšanai." + "Nevar mainīt zvanu pāradresēšanas iestatījumus tālrunī, kamēr izmantojat viesabonēšanu." "Pakalpojums tika iespējots." "Pakalpojums tika iespējots šādai pakalpojumu klasei:" "Pakalpojums ir atspējots." @@ -97,6 +98,8 @@ "Balss/datu pakalpojumi ir bloķēti." "Balss/īsziņu pakalpojumi ir bloķēti." "Visi balss/datu/īsziņu pakalpojumi ir bloķēti." + "Nevar sasniegt tīklu" + "Lai uzlabotu uztveršanu, mainiet atlasīto veidu sadaļā Iestatījumi > Mobilie tīkli gt; Ieteicamais tīkla veids." "Vienādranga ierīce pieprasīja teksta tālruņa režīmu FULL" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu HCO" "Vienādranga ierīce pieprasīja teksta tālruņa režīmu VCO" @@ -181,6 +184,8 @@ "Darba profils tika dzēsts, jo trūkst administratora lietotnes." "Trūkst darba profila administratora lietotnes, vai šī lietotne ir bojāta. Šī iemesla dēļ jūsu darba profils un saistītie dati tika dzēsti. Lai saņemtu palīdzību, sazinieties ar administratoru." "Jūsu darba profils šai ierīcē vairs nav pieejams." + "Tīkla datplūsma tiek pārraudzīta" + "Pieskarieties, lai uzzinātu vairāk" "Jūsu ierīces dati tiks dzēsti" "Administratora lietotnē trūkst komponentu, vai šī lietotne ir bojāta. Lietotni nevar izmantot. Ierīces dati tūlīt tiks dzēsti. Lai saņemtu palīdzību, sazinieties ar administratoru." "Man" @@ -1233,6 +1238,8 @@ "Ļauj lietojumprogrammai lasīt instalēšanas sesijas. Tādējādi lietojumprogrammai ir pieejama informācija par aktīvajām pakotņu instalācijām." "Pieprasīt pakotņu instalēšanu" "Ļauj lietojumprogrammai pieprasīt pakotņu instalēšanu." + "Lūgt akumulatora optimizācijas ignorēšanu" + "Ļauj lietotnei lūgt atļauju ignorēt akumulatora optimizāciju šai lietotnei." "Pieskarieties divreiz, lai kontrolētu tālummaiņu." "Nevarēja pievienot logrīku." "Doties uz" @@ -1585,7 +1592,7 @@ "Atlasiet gadu." "%1$s tika dzēsts." "Darbā: %1$s" - "Lai atspraustu šo ekrānu, pieskarieties pogai “Atpakaļ” un turiet to." + "Lai atspraustu šo ekrānu, pieskarieties pogām “Atpakaļ” un “Pārskats” un turiet tās." "Lietotne ir piesprausta. Atspraušana šajā ierīcē nav atļauta." "Ekrāns ir piesprausts" "Ekrāns ir atsprausts" diff --git a/core/res/res/values-mcc208-mnc10/config.xml b/core/res/res/values-mcc208-mnc10/config.xml index d3640e5c4153..3ed78181ffe6 100644 --- a/core/res/res/values-mcc208-mnc10/config.xml +++ b/core/res/res/values-mcc208-mnc10/config.xml @@ -31,28 +31,4 @@ [ApnSettingV3]INTERNET NRJ,internetnrj,,,,,,,,,208,10,,DUN,,,true,0,,,,,,,gid,4E - - 21401 - 21402 - 21403 - 21404 - 21405 - 21406 - 21407 - 21408 - 21409 - 21410 - 21411 - 21412 - 21413 - 21414 - 21415 - 21416 - 21417 - 21418 - 21419 - 21420 - 21421 - - diff --git a/core/res/res/values-mcc214-mnc01/config.xml b/core/res/res/values-mcc214-mnc01/config.xml index 895b770d771c..24150a782d22 100644 --- a/core/res/res/values-mcc214-mnc01/config.xml +++ b/core/res/res/values-mcc214-mnc01/config.xml @@ -40,27 +40,4 @@ INTERNET,airtelnet.es,,,vodafone,vodafone,,,,,214,01,1,DUN - - 21402 - 21403 - 21404 - 21405 - 21406 - 21407 - 21408 - 21409 - 21410 - 21411 - 21412 - 21413 - 21414 - 21415 - 21416 - 21417 - 21418 - 21419 - 21420 - 21421 - - diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index eb86a77e0e5d..5d7aaa4510ff 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Проблем со поврзување или неважечки MMI код." "Операцијата е ограничена на бирање само фиксни броеви." + "Не може да се сменат поставките за проследување повик од телефонот додека сте во роаминг." "Услугата беше овозможена." "Услугата беше овозможена за:" "Услугата е оневозможена." @@ -96,6 +97,8 @@ "Услугите со говор/податоци се блокирани." "Услугите за гласовно бирање/SMS пораки се блокирани." "Сите услугите со говор/податоци/SMS пораки се блокирани." + "Не може да се дојде до мрежата" + "За да се подобри приемот, обидете се да го смените избраниот тип во „Поставки“ > „Мобилни мрежи“ > „Претпочитан тип мрежа“." "Рамноправен уред го побара режимот на TTY „FULL“" "Рамноправен уред го побара режимот на TTY „HCO“" "Рамноправен уред го побара режимот на TTY „VCO“" @@ -179,6 +182,8 @@ "Работниот профил е избришан заради отсуството на апликација на администратор." "Апликацијата на администраторот за работниот профил недостасува или е оштетена. Како резултат на тоа, работниот профил и поврзаните податоци ќе се избришат. Контактирајте со администраторот за помош." "Работниот профил веќе не е достапен на уредов." + "Се следи сообраќајот на мрежата" + "Допрете за да дознаете повеќе" "Уредот ќе се избрише" "На апликацијата на администраторот ѝ недостасуваат компоненти или е оштетена, па не може да се користи. Уредот ќе се избрише сега. Контактирајте со администраторот за помош." "Јас" @@ -196,9 +201,9 @@ "Системско ажурирање на Android" "Се подготвува ажурирањето…" "Пакетот за ажурирање се обработува..." - "Се престартува…" + "Се рестартира…" "Ресетирање фабрички податоци" - "Се престартува…" + "Се рестартира…" "Се исклучува..." "Вашиот таблет ќе се исклучи." "Вашиот телевизор ќе се исклучи." @@ -1208,6 +1213,8 @@ "Дозволува апликација да чита сесии на инсталирање. Тоа овозможува апликацијата да гледа детали за активни инсталации на пакет." "барање пакети за инсталирање" "Дозволува апликацијата да бара инсталација на пакети." + "прашај дали да се игнорираат оптимизациите на батеријата" + "Овозможува апликацијата да побара дозвола за игнорирање на оптимизациите на батеријата за таа апликација." "Допрете двапати за контрола на зумот" "Не можеше да се додаде виџет." "Оди" @@ -1560,7 +1567,7 @@ "Избери година" "Избришано %1$s" "Работа %1$s" - "За откачување на екранов, допрете и задржете Назад." + "За откачување на екранов, допрете и задржете Назад и Краток преглед." "Апликацијата е закачена: откачување не е дозволено на уредов." "Екранот е закачен" "Екранот е откачен" diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index 423db1d19599..09b405c2774e 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "കണക്ഷൻ പ്രശ്‌നം അല്ലെങ്കിൽ MMI കോഡ് അസാധുവാണ്." "നിശ്ചയിച്ചുറപ്പിച്ച ഡയൽ ചെയ്യൽ നമ്പറുകൾക്ക് മാത്രമായി പ്രവർത്തനം പരിമിതപ്പെടുത്തിയിരിക്കുന്നു." + "റോമിംഗിൽ ആയിരിക്കുമ്പോൾ നിങ്ങളുടെ ഫോണിൽ നിന്ന് കോൾ കൈമാറൽ ക്രമീകരണം മാറ്റാൻ കഴിയില്ല." "സേവനം പ്രവർത്തനക്ഷമമാക്കി." "സേവനം ഇവയ്‌ക്കായി പ്രവർത്തനക്ഷമമാക്കി:" "സേവനം പ്രവർത്തനരഹിതമാക്കി." @@ -96,6 +97,8 @@ "വോയ്‌സ്/ഡാറ്റ സേവനങ്ങൾ തടഞ്ഞു." "വോയ്‌സ്/SMS സേവനങ്ങൾ തടഞ്ഞു." "എല്ലാ വോയ്‌സ്/ഡാറ്റ/SMS സേവനങ്ങളും തടഞ്ഞു." + "നെറ്റ്‌വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനാവുന്നില്ല" + "സ്വീകരണം മെച്ചപ്പെടുത്തുന്നതിന് ക്രമീകരണം > സെല്ലുലാർ നെറ്റ്‌വർക്കുകൾ > തിരഞ്ഞെടുത്ത നെറ്റ്‌വർക്ക് തരം എന്നതിൽ തിരഞ്ഞെടുത്തിരിക്കുന്ന തരം മാറ്റിക്കൊണ്ട് ശ്രമിച്ചുനോക്കുക." "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഫുൾ\'" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO" "പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO" @@ -163,7 +166,7 @@ "%1$s എന്നതിൽ സൈൻ ഇൻ ചെയ്യുന്നതിൽ പിശക്" "സമന്വയിപ്പിക്കുക" "സമന്വയിപ്പിക്കുക" - "വളരെയധികം %s ഇല്ലാതാക്കലുകൾ." + "വളരെയധികം %s ഇല്ലാതാക്കുന്നു." "ടാബ്‌ലെറ്റ് സ്റ്റോറേജ് കഴിഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ ചില ഫയലുകൾ ഇല്ലാതാക്കുക." "വാച്ചിലെ സ്റ്റോറേജ് നിറഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ കുറച്ച് ഫയലുകൾ ഇല്ലാതാക്കുക." "ടിവി സ്റ്റോറേജ് നിറഞ്ഞു. ഇടം ശൂന്യമാക്കാൻ കുറച്ച് ഫയലുകൾ ഇല്ലാതാക്കുക." @@ -179,6 +182,8 @@ "അഡ്‌മിൻ അപ്ലിക്കേഷൻ നഷ്‌ടപ്പെട്ടതിനാൽ ഔദ്യോഗിക പ്രൊഫൈൽ ഇല്ലാതാക്കി." "ഔദ്യോഗിക പ്രൊഫൈൽ അഡ്‌മിൻ അപ്ലിക്കേഷൻ നഷ്‌ടപ്പെട്ടതോ കേടായതോ ആണ്. അക്കാരണത്താൽ നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലും ബന്ധപ്പെട്ട വിവരവും ഇല്ലാതാക്കിയിരിക്കുന്നു. സഹായത്തിന് അഡ്‌മിനിസ്‌ട്രേറ്ററുമായി ബന്ധപ്പെടുക." "ഈ ഉപകരണത്തിൽ തുടർന്നങ്ങോട്ട് നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ ലഭ്യമല്ല." + "നെറ്റ്‌വർക്ക് ട്രാഫിക്ക് നിരീക്ഷിക്കപ്പെടുന്നു" + "കൂടുതലറിയുന്നതിന് ടാപ്പുചെയ്യുക" "നിങ്ങളുടെ ഉപകരണം മായ്‌ക്കും" "അഡ്‌മിൻ അപ്ലിക്കേഷൻ, ഘടകഭാഗങ്ങൾ നഷ്‌ടപ്പെട്ടതോ കേടായതോ ആണെങ്കിൽ ഉപയോഗിക്കാനാവില്ല. നിങ്ങളുടെ ഉപകരണം ഇപ്പോൾ ഇല്ലാതാക്കും. സഹായത്തിന് നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുക." "ഞാന്‍" @@ -265,7 +270,7 @@ "നിങ്ങൾ സംവദിക്കുന്ന ഒരു വിൻഡോയുടെ ഉള്ളടക്കം പരിശോധിക്കുക." "സ്‌പർശനം വഴി പര്യവേക്ഷണം ചെയ്യുക ഓൺ ചെയ്യുക" "ടാപ്പുചെയ്ത ഇനങ്ങൾ ഉച്ചത്തിൽ പറയപ്പെടും, ജെസ്റ്ററുകൾ ഉപയോഗിച്ച് സ്‌ക്രീൻ അടുത്തറിയാവുന്നതാണ്." - "മെച്ചപ്പെടുത്തിയ വെബ് പ്രവേശനക്ഷമത ഓണാക്കുക" + "മെച്ചപ്പെടുത്തിയ വെബ് ഉപയോഗസഹായി ഓണാക്കുക" "അപ്ലിക്കേഷൻ ഉള്ളടക്കം കൂടുതൽ ആക്‌സസ്സുചെയ്യാൻ കഴിയുന്നതാക്കാൻ സ്‌ക്രിപ്റ്റുകൾ ഇൻസ്റ്റാളുചെയ്യാനിടയുണ്ട്." "നിങ്ങൾ ടൈപ്പുചെയ്യുന്ന വാചകം നിരീക്ഷിക്കുക" "ക്രെഡിറ്റ് കാർഡ് നമ്പറുകളും പാസ്‌വേഡുകളും പോലുള്ള വ്യക്തിഗത ഡാറ്റ ഉൾപ്പെടുന്നു." @@ -1208,6 +1213,8 @@ "ഇൻസ്റ്റാൾ ചെയ്‌ത സെഷനുകൾ റീഡുചെയ്യുന്നതിന് ഒരു അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. സജീവ പാക്കേജ് ഇൻസ്റ്റാളേഷനുകളെക്കുറിച്ചുള്ള വിശദാംശങ്ങൾ കാണുന്നതിന് ഇത് അനുവദിക്കുന്നു." "പാക്കേജുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ അഭ്യർത്ഥിക്കുക" "പാക്കേജുകളുടെ ഇൻസ്റ്റാളേഷൻ അഭ്യർത്ഥിക്കാൻ ഒരു അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു." + "ബാറ്ററി ഒപ്റ്റിമൈസേഷനുകൾ അവഗണിക്കാൻ ആവശ്യപ്പെടുക" + "ആപ്പിന് വേണ്ടിയുള്ള ബാറ്ററി ഒപ്റ്റിമൈസേഷനുകളെ അവഗണിക്കാനുള്ള അനുമതി ചോദിക്കുന്നതിന് ആപ്പിനെ അനുവദിക്കുന്നു." "സൂം നിയന്ത്രണം ലഭിക്കാൻ രണ്ടുതവണ ടാപ്പുചെയ്യുക" "വിജറ്റ് ചേർക്കാനായില്ല." "പോവുക" @@ -1230,7 +1237,7 @@ "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലിൽ ഈ അപ്ലിക്കേഷൻ ഉപയോഗിക്കുന്നു" "ടൈപ്പുചെയ്യൽ രീതി" "സമന്വയിപ്പിക്കുക" - "പ്രവേശനക്ഷമത" + "ഉപയോഗസഹായി" "വാൾപേപ്പർ" "വാൾപേപ്പർ മാറ്റുക" "അറിയിപ്പ് ലിസണർ" @@ -1432,9 +1439,9 @@ " — " "നീക്കംചെയ്യുക" "മുകളിൽക്കൊടുത്തിരിക്കുന്ന ശുപാർശചെയ്‌ത ലെവലിലേക്ക് വോളിയം വർദ്ധിപ്പിക്കണോ?\n\nഉയർന്ന വോളിയത്തിൽ ദീർഘനേരം കേൾക്കുന്നത് നിങ്ങളുടെ ശ്രവണ ശേഷിയെ ദോഷകരമായി ബാധിക്കാം." - "പ്രവേശനക്ഷമത പ്രവർത്തനക്ഷമമാക്കാൻ രണ്ട് വിരലുകൾ അമർത്തിപ്പിടിക്കുക." - "പ്രവേശനക്ഷമത പ്രവർത്തനക്ഷമമാക്കി." - "പ്രവേശനക്ഷമത റദ്ദാക്കി." + "ഉപയോഗസഹായി പ്രവർത്തനക്ഷമമാക്കാൻ രണ്ട് വിരലുകൾ അമർത്തിപ്പിടിക്കുക." + "ഉപയോഗസഹായി പ്രവർത്തനക്ഷമമാക്കി." + "ഉപയോഗസഹായി റദ്ദാക്കി." "നിലവിലെ ഉപയോക്താവ് %1$s ആണ്." "%1$s എന്ന ഉപയോക്താവിലേക്ക് മാറുന്നു…" "%1$s ലോഗൌട്ട് ചെയ്യുന്നു…" @@ -1558,7 +1565,7 @@ "വർഷം തിരഞ്ഞെടുക്കുക" "%1$s ഇല്ലാതാക്കി" "ഔദ്യോഗികം %1$s" - "ഈ സ്‌ക്രീൻ അൺപിൻ ചെയ്യാൻ, ബാക്ക് ബട്ടൺ സ്‌പർശിച്ച് പിടിക്കുക" + "ഈ സ്‌ക്രീൻ അൺപിൻ ചെയ്യാൻ, ബാക്കും ചുരുക്കവിവരണവും സ്‌പർശിച്ച് പിടിക്കുക." "അപ്ലിക്കേഷൻ പിൻ ചെയ്‌തു: ഈ ഉപകരണത്തിൽ അൺപിൻ ചെയ്യാനാവില്ല." "സ്ക്രീൻ പിൻ ചെയ്തു" "സ്ക്രീൻ അൺപിൻ ചെയ്തു" diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index f936b85966a7..2f7857327578 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Холболтын асуудал эсвэл буруу MMI код." "Ажиллагаа зөвөх тогтсон дугаараар хязгаарлагдсан." + "Таныг роуминг үйлчилгээг идэвхжүүлсэн үед таны утаснаас дуудлага дамжуулах тохиргоог өөрчлөх боломжгүй." "Үйлчилгээ идэвхжсэн." "Дараах үйлчилгээ идэвхтэй болсон:" "Үйлчилгээ идэвхгүй болсон." @@ -96,6 +97,8 @@ "Дуут/дата үйлчилгээ хаагдсан." "Дуут/SMS үйлчилгээнүүд хориглогдсон." "Бүх дуут/дата/SMS үйлчилгээнүүд хориглогдсон." + "Сүлжээнд холбогдох боломжгүй байна" + "Хүлээн авалтыг сайжруулахын тулд Тохиргоо > Үүрэн сүлжээ > Сүлжээний төрөл хэсгийг сонгон төрлөө өөрчилнө үү." "Хандлагын цэгт хүсэлт тавьсан TTY Mode FULL" "Хандлагын цэгт хүсэлт тавьсан TTY Mode HCO" "Хандлагын цэгт хүсэлт тавьсан TTY Mode VCO" @@ -179,6 +182,8 @@ "Зохицуулагч аппликейшн алга болсон учраас ажлын профайл устсан байна." "Ажлын профайлын зохицуулагч аппликейшн алга болсон эсвэл эвдэрсэн байна. Үүний улмаас таны ажлын профайл болон холбогдох мэдээллүүд устсан байна. Тусламж хэрэгтэй байгаа бол админтай холбоо барина уу." "Таны ажлын профайл энэ төхөөрөмж дээр ажиллахгүй болсон байна." + "Сүлжээний ачааллыг хянаж байна" + "Дэлгэрэнгүй үзэхийн тулд товшино уу" "Таны төхөөрөмж устах болно." "Зохицуулагч аппликейшны зарим нэг хэсэг дутуу эсвэл эвдэрсэн байгаа тул ашиглах боломжгүй байна. Таны төхөөрөмжийг одоо устгах болно. Танд тусламж хэрэгтэй байгаа бол админтайгаа холбоо барина уу." "Би" @@ -436,7 +441,7 @@ "хурууны хээний програм хангамжийг удирдах" "Хурууны хээний загварыг нэмэх эсвэл усгтах үйлдлийг хийх зөвшөөрлийг програмд олгодог." "хурууны хээний програм хангамжийг ашиглах" - "Баталгаажуулалт хийх зорилгоор хурууны хээний програм хамгамжийг ашиглах зөвшөөрлийг програмд олгодог" + "Баталгаажуулалт хийх зорилгоор хурууны хээний апп хамгамжийг ашиглах зөвшөөрлийг аппд олгодог" "Хурууны хээг дутуу уншуулсан байна. Дахин оролдоно уу." "Хурууны хээ боловсруулж чадахгүй байна. Дахин оролдоно уу." "Хурууны хээ мэдрэгч бохирдсон байна. Та цэвэрлэсний дараагаар дахин оролдоно уу." @@ -1202,12 +1207,14 @@ "Хэлбэршүүлж байна..." "Оруулаагүй байна" "Таарах активити олдсонгүй." - "медиа гаралтын маршрут" + "медиа гаралтын чиглэл" "Аппликешн нь медиа гаралтыг бусад гадаад төхөөрөмжрүү чиглүүлэх боломжтой." "Суулгах харилцан үйлдлийг унших" "Аппликешн-д суулгах сешн уншихыг зөвшөөрнө. Энэ нь идэвхтэй багцуудыг суулгалтын талаар дэлгэрэнгүй мэдээллийг үзэх боломж олгоно." "багц суулгахыг хүсэх" "Аппликейшн нь багц суулгахыг хүсэх боломжтой." + "батерейны оновчлол алгасахыг асуух" + "Тухайн аппaaс батерейны оновчлол алгасах зөвшөөрөл асуухыг зөвшөөрдөг." "Өсгөх контрол дээр хоёр удаа товшино уу" "Виджет нэмж чадсангүй." "Очих" @@ -1558,7 +1565,7 @@ "Жилийг сонгоно уу" "%1$s устсан" "Ажлын %1$s" - "Энэ дэлгэцийг эхэнд нээхийг болиулахын тулд Буцах товчлуурыг дараад, хүлээнэ үү." + "Энэ дэлгэцийг тогтоосныг болиулахын тулд Буцах, Тойм гэснийг товшоод, хүлээнэ үү." "App-ыг тусгайлан тэмдэглэсэн байна: Энэ төхөөрөмж дээр тусгайлан тэмдэглэсэн сонголтыг устгах боломжгүй." "Дэлгэцийг тогтоосон" "Дэлгэцийг сулласан" diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index 8951643cfde0..5239d8f6a84b 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "कनेक्शन समस्या किंवा अवैध MMI कोड." "कार्य फक्त निश्चित डायलिंग नंबरसाठी प्रतिबंधित आहे." + "आपण रोमिंगमध्ये असताना आपल्या फोनवरील कॉल अग्रेषण सेटिंंग्ज बदलू शकत नाही." "सेवा सक्षम केली." "सेवा यासाठी सक्षम केली:" "सेवा अक्षम केली गेली आहे." @@ -67,10 +68,10 @@ "IMEI" "MEID" - "येणारा कॉलर ID" - "केला जाणारा कॉलर ID" - "कनेक्ट केलेला रेखा ID" - "कनेक्ट केलेला रेखा ID प्रतिबंध" + "येणारा कॉलर आयडी" + "केला जाणारा कॉलर आयडी" + "कनेक्ट केलेला रेखा आयडी" + "कनेक्ट केलेला रेखा आयडी प्रतिबंध" "कॉल अग्रेषण" "कॉल प्रतीक्षा" "कॉल सोडून" @@ -82,12 +83,12 @@ "अवांछित त्रासदायक कॉल ला नकार" "कॉल करणार्‍या नंबरचे वितरण" "व्यत्यय आणू नका" - "कॉलर ID डीफॉल्‍ट रूपात प्रतिबंधित वर सेट असतो. पुढील कॉल: प्रतिबंधित" - "कॉलर ID डीफॉल्‍ट रूपात प्रतिबंधित वर सेट असतो. पुढील कॉल: प्रतिबंधित नाही" - "कॉलर ID डीफॉल्‍ट रूपात प्रतिबंधित नाही वर सेट असतो. पुढील कॉल: प्रतिबंधित" - "कॉलर ID डीफॉल्‍ट रूपात प्रतिबंधित नाही वर सेट असतो. पुढील कॉल: प्रतिबंधित नाही" + "कॉलर आयडी डीफॉल्‍ट रूपात प्रतिबंधित वर सेट असतो. पुढील कॉल: प्रतिबंधित" + "कॉलर आयडी डीफॉल्‍ट रूपात प्रतिबंधित वर सेट असतो. पुढील कॉल: प्रतिबंधित नाही" + "कॉलर आयडी डीफॉल्‍ट रूपात प्रतिबंधित नाही वर सेट असतो. पुढील कॉल: प्रतिबंधित" + "कॉलर आयडी डीफॉल्‍ट रूपात प्रतिबंधित नाही वर सेट असतो. पुढील कॉल: प्रतिबंधित नाही" "सेवेची तरतूद केलेली नाही." - "आपण कॉलर ID सेटिंग बदलू शकत नाही." + "आपण कॉलर आयडी सेटिंग बदलू शकत नाही." "डेटा सेवा अवरोधित केली आहे." "आणीबाणी सेवा अवरोधित केली आहे." "व्हॉइस सेवा अवरोधित केली आहे." @@ -96,6 +97,8 @@ "व्हॉइस/डेटा सेवा अवरोधित केल्या आहेत." "व्हॉइस/SMS सेवा अवरोधित केल्या आहेत." "सर्व व्हॉइस/डेटा/SMS सेवा अवरोधित केल्या आहेत." + "नेटवर्कवर पोहोचूू शकत नाही" + "रिसेप्शन सुधारण्यासाठी, प्रकार सेटिंग्ज > सेल्युलर नेटवर्क > प्राधान्यीकृत नेटवर्क प्रकार येथे निवडलेला प्रकार बदलून पहा." "समवयस्क व्यक्तीने TTY मोड पूर्ण ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली" "समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली" @@ -179,6 +182,8 @@ "गहाळ प्रशासन अॅपमुळे कार्य प्रोफाईल हटविले." "कार्य प्रोफाईल प्रशासन अॅप गहाळ आहे किंवा दुषित आहे. यामुळे, आपले कार्य प्रोफाईल आणि संबंधित डेटा हटविला गेला आहे. सहाय्यासाठी आपल्या प्रशासकाशी संपर्क साधा." "आपले कार्य प्रोफाईल या डिव्‍डाइसवर यापुढे उपलब्‍ध नाही." + "नेटवर्क रहदारीचे परीक्षण केले जात आहे" + "अधिक जाणून घेण्यासाठी टॅप करा" "आपले डिव्हाइस मिटविले जाईल" "प्रशासन अॅपमध्ये घटक गहाळ किंवा दूषित आहेत आणि वापरला जाऊ शकत नाही. आपले डिव्हाइस आता मिटविले जाईल. सहाय्यासाठी आपल्या प्रशासकाशी संपर्क साधा." "मी" @@ -318,7 +323,7 @@ "अॅपला मेमरीमध्ये कायम असलेले त्याचे स्वतःचे भाग बनविण्यासाठी अनुमती देते. हे टीव्ही धीमा करून इतर अॅप्सवर उपलब्ध असलेली मेमरी मर्यादित करू शकते." "अॅप ला मेमरीमध्ये कायम असलेले त्याचे स्वतःचे भाग बनविण्यास अनुमती देते. हे फोन धीमा करून अन्य अॅप्सवर उपलब्ध असलेल्या मेमरीवर मर्यादा घालू शकते." "अॅप संचयन स्थान मोजा" - "अॅप ला त्याचा कोड, डेटा आणि कॅशे आकार पुनर्प्राप्त करण्यासाठी अनुमती देते" + "अॅप ला त्याचा कोड, डेटा आणि कॅश आकार पुनर्प्राप्त करण्यासाठी अनुमती देते" "सिस्टम सेटिंग्ज सुधारित करा" "सिस्टीमचा सेटिंग्ज डेटा सुधारित करण्यासाठी अॅप ला अनुमती देते. दुर्भावनापूर्ण अॅप्स आपल्या सिस्टीमचे कॉन्फिगरेशन दूषित करू शकतात." "सुरूवातीस चालवा" @@ -376,7 +381,7 @@ "IMS कॉल सेवेमध्‍ये प्रवेश करा" "आपल्‍या हस्तक्षेपाशिवाय अ‍ॅपला कॉल करण्‍यासाठी IMS सेवा वापरण्याची अनुमती देते." "फोन स्थिती आणि ओळख वाचा" - "डिव्हाइसच्या फोन वैशिष्ट्यांवर प्रवेश करण्यास अॅप ला अनुमती देते. ही परवानगी कॉल सक्रिय असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस ID आणि कॉलद्वारे कनेक्ट केलेला रीमोट नंबर निर्धारित करण्यासाठी अॅप ला अनुमती देते." + "डिव्हाइसच्या फोन वैशिष्ट्यांवर प्रवेश करण्यास अॅप ला अनुमती देते. ही परवानगी कॉल सक्रिय असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस आयडी आणि कॉलद्वारे कनेक्ट केलेला रीमोट नंबर निर्धारित करण्यासाठी अॅप ला अनुमती देते." "टॅबलेट निष्क्रिय होण्यापासून प्रतिबंधित करा" "निष्क्रिय होण्यापासून प्रतिबंध करा" "फोन निष्‍क्रिय होण्‍यापासून प्रतिबंधित करा" @@ -1208,6 +1213,8 @@ "अनुप्रयोगास स्‍थापना सत्र वाचण्‍याची अनुमती देते. हे सक्रिय पॅकेज स्‍थापनांविषयी तपशील पाहाण्‍याची यास अनुमती देते." "पॅकेज स्थापित करण्यासाठी विनंती करा" "पॅकेजच्या स्थापना करण्यासाठी अनुप्रयोगास अनुमती देते." + "बॅटरी ऑप्टिमायझेशन दुर्लक्षित करण्‍यास सांगा" + "त्या अॅपसाठी बॅटरी ऑप्टिमायझेशन दुर्लक्षित करण्‍यासाठी अॅपला परवानगी मागण्याची अनुमती देते." "झूम नियंत्रणासाठी दोनदा टॅप करा" "विजेट जोडू शकलो नाही." "जा" @@ -1558,7 +1565,7 @@ "वर्ष निवडा" "%1$s हटविली" "कार्य %1$s" - "ही स्क्रीन अनपिन करण्यासाठी, परत ला स्पर्श करा आणि धरून ठेवा." + "ही स्क्रीन अनपिन करण्यासाठी, परत जा आणि विहंगावलोकन करा स्पर्श करा आणि धरून ठेवा." "अॅप पिन केलेला आहे: या डिव्हाइसवर अनपिन करण्यास अनुमती नाही." "स्क्रीन पिन केली" "स्क्रीन अनपिन केली" diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index e096aecd0188..820963ff1512 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Masalah sambungan atau kod MMI tidak sah" "Pengendalian dihadkan kepada nombor dailan tetap sahaja." + "Tidak dapat mengubah tetapan pemajuan panggilan daripad telefon anda semasa dalam perayauan." "Perkhidmatan telah didayakan." "Perkhidmatan didayakan untuk:" "Perkhidmatan telah dilumpuhkan." @@ -96,6 +97,8 @@ "Perkhidmatan suara/data disekat." "Perkhidmatan suara/SMS disekat." "Semua perkhidmatan suara/data/SMS disekat." + "Tidak dapat mencapai rangkaian" + "Untuk mempertingkat penerimaan, cuba tukar jenis yang dipilih di Tetapan > Rangkaian selular > Jenis rangkaian yang dipilih." "Rakan meminta Mod TTY PENUH" "Rakan meminta Mod TTY HCO" "Rakan meminta Mod TTY VCO" @@ -179,6 +182,8 @@ "Profil kerja dipadam kerana apl pentadbir hilang." "Apl admin profil kerja hilang atau pun rosak. Akibatnya, profil kerja anda dan data yang berkaitan telah dipadam. Hubungi pentadbir anda untuk mendapatkan bantuan." "Profil kerja anda tidak tersedia pada peranti ini lagi." + "Trafik rangkaian sedang dipantau" + "Ketik untuk mengetahui lebih lanjut" "Peranti anda akan dipadam" "Apl pentadbir kehilangan komponen atau rosak dan tidak boleh digunakan. Sekarang peranti anda akan dipadam. Hubungi pentadbir anda untuk mendapatkan bantuan." "Saya" @@ -1208,6 +1213,8 @@ "Membenarkan aplikasi membaca sesi pemasangan Ini membenarkan apl melihat butiran mengenai pemasangan pakej yang aktif." "minta pakej pemasangan" "Membenarkan aplikasi meminta pemasangan pakej." + "minta kebenaran untuk mengabaikan pengoptimuman bateri" + "Membenarkan apl meminta kebenaran untuk mengabaikan pengoptimuman bateri untuk apl itu." "Ketik dua kali untuk mendapatkan kawalan zum" "Tidak dapat menambahkan widget." "Pergi" @@ -1558,7 +1565,7 @@ "Pilih tahun" "%1$s dipadamkan" "Kerja %1$s" - "Untuk menyahsematkan skrin ni, ketik & tahan Kembali." + "Untuk menyahsematkan skrin ini, sentuh & tahan Kembali dan Ikhtisar." "Apl disemat: Nyahsemat tidak dibenarkan pada peranti ini." "Skrin disemat" "Skrin dinyahsemat" diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index 80d331d6ec34..fbcb1d15e8fd 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "ဆက်သွယ်မှုဆိုင်ရာပြသနာ သို့မဟုတ် မမှန်ကန်သောMMIကုတ်" "သတ်မှတ်ခေါ်ဆိုနိုင်သောနံပါတ်များထံသာ ကန့်သတ်ထားသည်" + "ကွန်ရက်ပြင်ပဒေတာအသုံးပြုခြင်းကို ဖွင့်ထားသည့်အခါ သင့်ဖုန်းမှနေ၍ ခေါ်ဆိုမှုထပ်ဆင့်ပို့ခြင်းဆက်တင်အား ပြောင်း၍မရပါ။" "ဝန်ဆောင်မှု လုပ်ဆောင်နိုင်မည်" "ဝန်ဆောင်မှု ရရှိမည်" "ဝန်ဆောင်မှုအား ရပ်ဆိုင်းသည်" @@ -96,6 +97,8 @@ "အသံ၊ဒေတာ ဆားဗစ်များအားလုံး ပိတ်ထားပါသည်" "အသံ/SMSဝန်ဆောင်မှုများအားပိတ်ထားသည်။" "အသံ၊အချက်အလက်၊စာတိုဆားဗစ်များအားလုံး ပိတ်ထားပါသည်" + "ကွန်ရက်ကို ချိတ်ဆက်၍မရပါ" + "လိုင်းကောင်းစေရန်အတွက် ဆက်တင် > ဆယ်လူလာကွန်ရက်များ > ပိုနှစ်သက်သည့် ကွန်ရက်အမျိုးအစားထဲတွင် ရွေးချယ်ထားသည့် အမျိုးအစားကို ပြောင်းကြည့်ပါ။" "အခြားစက်မှ TTY မုဒ် FULL ပြုရန် တောင်းဆို၏" "အခြားစက်မှ TTY မုဒ် HCO ပြုရန် တောင်းဆို၏" "TTY မုဒ် VCO ပြုရန် အခြားစက်မှ တောင်းဆို၏" @@ -179,6 +182,8 @@ "အက်ဒမင် အက်ပ်ပျောက်နေသောကြောင့် အလုပ်ပရိုဖိုင် ပျက်သွားသည်။" "အလုပ်ပရိုဖိုင် အက်ဒမင် အပလီကေးရှင်းပျောက်နေသည် သို့မဟုတ် ပျက်စီးနေသည်။ ထို့ကြောင့် သင့်အလုပ်ပရိုဖိုင်နှင့် ဆက်စပ်နေသော ဒေတာများအား ပယ်ဖျက်ခြင်းခံရမည်။ အကူအညီတောင်းခံရန် သင့်အက်ဒမင်အား ဆက်သွယ်ပါ။" "ဤစက်ကိရိယာတွင် သင့်အလုပ်ပရိုဖိုင် မရှိတော့ပါ။" + "ကွန်ရက်အသွားအလာကို စောင့်ကြည့်နေပါသည်" + "ပိုမိုလေ့လာရန် တို့ပါ" "သင့်ကိရိယာအား ပယ်ဖျက်လိမ့်မည်" "အက်ဒမင် အက်ပ်၏ အစိတ်အပိုင်းများ ပျောက်နေသည် သို့မဟုတ် ပျက်စီးနေသည်။ သင့်ကိရိယာအား ပယ်ဖျက်လိမ့်မည်။ အကူအညီတောင်းခံရန် သင့်အက်ဒမင်အား ဆက်သွယ်ပါ။" "ကျွန်ုပ်" @@ -643,7 +648,7 @@ "အထောက်အကူ" "ညီအကို" "သားသမီး" - "အတူနေအပေါင်းအဖော်" + "အတူနေအဖော်" "ဖခင်" "သူငယ်ချင်း" "မန်နေဂျာ" @@ -651,7 +656,7 @@ "မိဘ" "လုပ်ဖော်ကိုင်ဖက်" "မှရည်ညွှန်းပေးသည်" - "ဆွေးမျိုး" + "ဆွေမျိုး" "ညီအမ" "အိမ်ထောင်ဖက်" "မိမိစိတ်ကြိုက်" @@ -1208,6 +1213,8 @@ "အပလီကေးရှင်းအား တပ်ဆင်ရေး ချိတ်ဆက်မှုများကို ဖတ်ခွင့်ပြုသည်။ ၎င်းသည် ဖွင့်သုံးနေသည့် အထုပ်အား တပ်ဆင်မှုဆိုင်ရာ အသေးိစတ်များကို ကြည့်ရှုခွင့် ပြုသည်။" "တပ်ဆင်ရေး အထုပ်များကို တောင်းဆိုပါ" "ပက်ကေ့များ သွင်းယူခြင်းအတွက် တောင်းဆိုရန် အပလီကေးရှင်းအား ခွင့်ပြုပါ" + "ဘက်ထရီ ပိုမိုကောင်းမွန်အောင် ပြုလုပ်ခြင်းကို လျစ်လျူရှုရန် တောင်းဆိုပါ" + "ဘက်ထရီ ပိုမိုကောင်းမွန်အောင် ပြုလုပ်ခြင်းကို လျစ်လျူရှုရန်အတွက် ခွင့်ပြုချက်တောင်းရန် အက်ပ်ကို ခွင့်ပြုပါ။" "ဇူးမ်အသုံးပြုရန် နှစ်ချက်တို့ပါ" "ဝဒ်ဂျက်ထည့်လို့ မရပါ" "သွားပါ" @@ -1558,7 +1565,7 @@ "ခုနှစ်ကို ရွေးပါ" "%1$s ကို ဖျက်ပြီးပါပြီ" "အလုပ် %1$s" - "ဤမျက်နှာပြင်ကို ပင်ဖြုတ်ရန် \"နောက်သို့\" ကိုထိပြီးဖိထားပါ။" + "ဤမျက်နှာပြင်ကို ပင်ဖြုတ်ရန်အတွက် Back နှင့် Overview ကိုနှိပ်၍ ဖိထားပါ။" "အက်ပ်ကို ပင်ထိုးထားသည်။ ပင်ဖျက်ခြင်းကို ဒီစက်မှာ မရနိုင်ပါ။" "မျက်နှာပြင်ကို ပင်ထိုးထား" "မျက်နှာပြင် ပင်ထိုးမှု ဖြတ်လိုက်ပြီ" diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 691da31748c6..75b57cba1a8f 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Tilkoblingsproblem eller ugyldig MMI-kode." "Handlingen kan kun utføres på numre med anropsbegrensning." + "Får ikke endret innstillinger for viderekobling fra telefonen din når du bruker roaming." "Tjenesten ble aktivert." "Tjenesten ble aktivert for:" "Tjenesten ble deaktivert." @@ -96,6 +97,8 @@ "Alle tjenester for tale og data er blokkert." "Tjenester for tale og tekstmeldinger er blokkert." "Alle tjenester for tale, data og tekstmeldinger er blokkert." + "Får ikke kontakt med nettverket" + "For å forbedre signalet, prøv å endre valgt nettverkstype i Innstillinger > Mobilnettverk > Foretrukket nettverkstype." "Motpart ba om TTY-modus FULL" "Motpart ba om TTY-modus HCO" "Motpart ba om TTY-modus VCO" @@ -179,6 +182,8 @@ "Arbeidsprofilen er slettet på grunn av manglende admin-app." "Arbeidsprofilens admin-app mangler eller er ødelagt. Dette har ført til at arbeidsprofilen og alle data knyttet til den er blitt slettet. Kontakt administratoren for å få hjelp." "Arbeidsprofilen din er ikke lenger tilgjengelig på denne enheten." + "Nettverkstrafikken blir overvåket" + "Trykk for å finne ut mer" "Enheten blir slettet" "Admin-appen mangler komponenter eller er ødelagt, og kan ikke brukes. Enheten din blir nå slettet. Kontakt administratoren for å få hjelp." "Meg" @@ -1208,6 +1213,8 @@ "Tillater en app å lese installeringsøkter. Dette gjør det mulig for den å se detaljer om aktive pakkeinstallasjoner." "be om installasjon av pakker" "Lar apper be om installasjon av pakker." + "be om å ignorere batterioptimaliseringer" + "Gjør det mulig for apper å be om tillatelse til å ignorere batterioptimaliseringer for disse appene." "Trykk to ganger for zoomkontroll" "Kunne ikke legge til modulen." "Utfør" @@ -1234,7 +1241,7 @@ "Bakgrunnsbilde" "Velg bakgrunnsbilde" "Varsellytteren" - "Lyttetjeneste for virtuell virkelighet" + "Lyttetjeneste for VR" "Betingelsesleverandør" "Tjeneste for rangering av varsler" "VPN er aktivert" @@ -1328,7 +1335,7 @@ "USB-stasjon" "%s USB-stasjon" "USB-lagring" - "Rediger" + "Endre" "Varsel om databruk" "Trykk for å se bruken og innstillingene." "Datagrensen for 2G-3G er nådd" @@ -1558,7 +1565,7 @@ "Velg året" "%1$s er slettet" "Jobb-%1$s" - "For å løsne denne skjermen, trykk og hold inne Tilbake." + "For å løsne denne skjermen, trykk på og hold inne Tilbake og Oversikt." "Appen er festet – du kan ikke løsne apper på denne enheten." "Skjermen er festet" "Skjermen er løsnet" diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index 3d5cfeddd91c..75ee39d1d3ef 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -46,6 +46,7 @@ "MSISDN१" "जडान समस्या वा अमान्य MMI कोड।" "अपरेशन निश्चित डायल नम्बरहरूको लागि मात्र प्रतिबन्धित छ।" + "तपाईं रोमिङमा हुनुहुँदा तपाईंको फोनबाट कल फर्वार्ड गर्ने सम्बन्धी सेटिङहरू परिवर्तन गर्न सकिँदैन।" "सेवा सक्षम पारियो।" "निम्न उल्लेखितको लागि सेवा सक्षम पारियो:" "सेवा असक्षम पारिएको छ।" @@ -96,6 +97,8 @@ "भ्वाइस/डेटा सेवाहरू रोकिएका छन्।" "आवाज/SMS सेवाहरू बन्द छन्।" "सबै भ्वाइस/डेटा/SMS सेवाहरू ब्लक भएका छन्।" + "नेटवर्कमाथि पहुँच राख्न सकिँदैन" + "सेलुलरको रिसेप्सनलाई सुधार्न सेटिङहरू > सेलुलर नेटवर्कहरू > नेटवर्कको रुचाइएको प्रकारमा गई चयन गरिएको प्रकार परिवर्तन गरी हेर्नुहोस्।" "सहकर्मी अनुरोध गरियो। TTY मोड पूर्ण" "सहकर्मी अनुरोध गरियो। TTY मोड HCO" "सहकर्मी अनुरोध गरियो। TTY मोड VCO" @@ -179,6 +182,8 @@ "प्रशासन अनुप्रयोग हराएको कारण कार्य प्रोफाइल मेटियो।" "कार्य प्रोफाइल व्यवस्थापक अनुप्रयोग या त हराएको या त बिग्रेको छ। फलस्वरूप, तपाईँको कार्य प्रोफाइल र सम्बन्धित डेटा मेटिएको छ। सहयोगको लागि तपाईँको व्यवस्थापकसँग सम्पर्क गर्नुहोस्।" "यस यन्त्रमा तपाईँको कार्य प्रोफाइल अब उपलब्ध छैन।" + "नेटवर्कको ट्राफिकको अनुगमन गरिँदै छ" + "थप जान्न ट्याप गर्नुहोस्" "तपाईंको यन्त्र मेटिनेछ" "व्यवस्थापक अनुप्रयोगमा कम्पोनेन्टहरू या त हराएको वा भ्रष्ट छन्, र यसैले प्रयोग गर्न सकिँदैन। तपाईंको यन्त्र अब मेटिनेछ। सहयोगको लागि आफ्नो व्यवस्थापकलाई सम्पर्क गर्नुहोस्।" "मलाई" @@ -553,30 +558,30 @@ "घरको फ्याक्स" "पेजर" "अन्य" - "अनुकूलन" + "आफू अनुकूल" "गृह" "काम" "अन्य" - "अनुकूलन" + "आफू अनुकूल" "गृह" "काम" "अन्य" - "अनुकूलन" + "आफू अनुकूल" "गृह" "काम" "अन्य" - "अनुकूलन" + "आफू अनुकूल" "काम गर्नुहोस्" "अन्य" - "अनुकूलन" + "आफू अनुकूल" "AIM" @@ -588,7 +593,7 @@ "ICQ" "Jabber" - "अनुकूलन" + "आफू अनुकूल" "गृह" "मोबाइल" "काम" @@ -609,24 +614,24 @@ "कार्य पेजर" "सहायक" "MMS" - "अनुकूलन" + "आफू अनुकूल" "जन्मदिन" "वार्षिक समारोह" "अन्य" - "अनुकूलन" + "आफू अनुकूल" "गृह" "काम" "अन्य" "मोबाइल" - "अनुकूलन" + "आफू अनुकूल" "गृह" "काम" "अन्य" - "अनुकूलन" + "आफू अनुकूल" "गृह" "काम" "अन्य" - "अनुकूलन" + "आफू अनुकूल" "AIM" "Windows Live" "Yahoo" @@ -638,8 +643,8 @@ "NetMeeting" "काम" "अन्य" - "अनुकूलन" - "अनुकूलन" + "आफू अनुकूल" + "आफू अनुकूल" "सहायक" "भाइ" "सन्तान" @@ -653,8 +658,8 @@ "द्वारा उल्लिखित" "आफन्त" "बहिनी" - "पति-पत्नि" - "अनुकूलन" + "पति-पत्नी" + "आफू अनुकूल" "गृह" "काम गर्नुहोस्" "अन्य" @@ -1029,7 +1034,7 @@ "प्रक्रिया %1$s यसको आफ्नै कडामोड नीतिका कारण उल्लङ्घन गरिएको छ।" "एन्ड्रोइड अपग्रेड हुँदैछ…" "Android शुरू हुँदैछ..." - "भण्डारण अनुकूलन गर्दै।" + "भण्डारण आफू अनुकूल गर्दै।" "Android को अद्यावधिकलाई सम्पन्न गर्दै…" "स्तरवृद्धि सम्पन्न नभएसम्म केही अनुप्रयोगहरू राम्ररी काम नगर्न सक्छन्" "%1$s को स्तरवृद्धि हुँदैछ…" @@ -1100,8 +1105,8 @@ "अनुप्रयोग %1$s Wifi सञ्जाल %2$s मा जडान गर्न चाहन्छ" "एउटा अनुप्रयोग" "Wi-Fi प्रत्यक्ष" - "Wi-Fi सिधा सुरु गर्नुहोस्। यसले Wi-Fi ग्राहक/हट्स्पटलाई बन्द गराउने छ।" - "Wi-Fi सिधा सुरु हुन सकेन।" + "Wi-Fi सीधा सुरु गर्नुहोस्। यसले Wi-Fi ग्राहक/हट्स्पटलाई बन्द गराउने छ।" + "Wi-Fi सीधा सुरु हुन सकेन।" "Wi-Fi प्रत्यक्ष खुल्ला छ" "सेटिङहरूका लागि ट्याप गर्नुहोस्" "स्वीकार्नुहोस्" @@ -1214,6 +1219,8 @@ "स्थापित सत्र पढ्न अनुप्रयोगलाई अनुमति दिनुहोस्। यसले सक्रिय प्याकेज प्रतिष्ठानहरू बारेमा विवरण हेर्ने अनुमति दिन्छ।" "स्थापना प्याकेजहरू अनुरोध गर्नुहोस्" "प्याकेजहरूको स्थापना अनुरोध गर्न अनुप्रयोगलाई अनुमति दिन्छ।" + "ब्याट्री सम्बन्धी अनुकूलनहरूलाई बेवास्ता गर्न सोध्नुहोस्" + "कुनै अनुप्रयोगलाई त्यसका ब्याट्री सम्बन्धी अनुकूलनहरूलाई बेवास्ता गर्नका लागि अनुमति माग्न दिन्छ।" "जुम नियन्त्रणको लागि दुई चोटि ट्याप गर्नुहोस्" "विजेट थप गर्न सकिँदैन।" "जानुहोस्" @@ -1564,7 +1571,7 @@ "वर्ष चयन गर्नुहोस्" "%1$s हटाइयो" "कार्य %1$s" - "यस स्क्रिनलाई अनपिन गर्न पछाडि बटनलाई छोइराख्नुहोस्।" + "यस स्क्रिनलाई अनपिन गर्न पछाडि र परिदृश्य बटनलाई छोइराख्नुहोस्।" "अनुप्रयोग पिन गरियो: यस यन्त्रमा अनपिन गर्ने अनुमति छैन।" "स्क्रिन पिन गरियो" "स्क्रिन अनपिन गरियो" diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 1f53e8dc1bfd..4a15417fcfb6 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -21,7 +21,7 @@ "B" - "kB" + " KB" "MB" "GB" "TB" @@ -46,6 +46,7 @@ "MSISDN1" "Verbindingsprobleem of ongeldige MMI-code." "Bewerking is beperkt tot vaste nummers." + "Kan instellingen voor doorschakelen van oproepen niet wijzigen vanaf je telefoon tijdens roaming." "Service is ingeschakeld." "Service is ingeschakeld voor:" "Service is uitgeschakeld." @@ -54,11 +55,11 @@ "Onjuist wachtwoord." "MMI voltooid." "De oude pincode die je hebt ingevoerd, is onjuist." - "De PUK-code die je hebt ingevoerd, is onjuist." + "De pukcode die je hebt ingevoerd, is onjuist." "De pincodes die je hebt ingevoerd, komen niet overeen." "Voer een pincode van 4 tot 8 cijfers in." - "Typ een PUK-code die 8 cijfers of langer is." - "Je SIM-kaart is vergrendeld met de PUK-code. Typ de PUK-code om te ontgrendelen." + "Typ een pukcode die 8 cijfers of langer is." + "Je SIM-kaart is vergrendeld met de pukcode. Typ de pukcode om te ontgrendelen." "Voer de PUK2-code in om de SIM-kaart te ontgrendelen." "Mislukt. Schakel SIM/RUIM-vergrendeling in." @@ -96,6 +97,8 @@ "Spraak-/gegevensservices zijn geblokkeerd." "Spraak-/SMS-services zijn geblokkeerd." "Alle spraak-/gegevens-/SMS-services zijn geblokkeerd." + "Kan netwerk niet bereiken" + "Als je de ontvangst wilt verbeteren, kun je het netwerktype wijzigen dat is geselecteerd bij Instellingen > Mobiele netwerken > Voorkeursnetwerktype." "Door peer aangevraagde TTY-modus VOL" "Door peer aangevraagde TTY-modus HCO" "Door peer aangevraagde TTY-modus VCO" @@ -179,6 +182,8 @@ "Werkprofiel verwijderd wegens ontbrekende beheerapp." "De beheerapp van het werkprofiel ontbreekt of is beschadigd. Als gevolg hiervan zijn je werkprofiel en alle gerelateerde gegevens verwijderd. Neem voor hulp contact op met je beheerder." "Je werkprofiel is niet meer beschikbaar op dit apparaat." + "Netwerkverkeer wordt bijgehouden" + "Tik voor meer informatie" "Je apparaat wordt gewist" "Er ontbreken onderdelen van de beheerapp of de app is beschadigd, waardoor de app niet kan worden gebruikt. Je apparaat wordt nu gewist. Neem voor hulp contact op met je beheerder." "Ik" @@ -204,9 +209,9 @@ "Je tv wordt uitgeschakeld.." "Je horloge wordt uitgeschakeld." "Je telefoon wordt uitgeschakeld." - "Wilt u afsluiten?" + "Wil je afsluiten?" "Opnieuw opstarten in veilige modus" - "Wilt u opnieuw opstarten in de veilige modus? Als u dit doet, worden alle geïnstalleerde applicaties van derden uitgeschakeld. Ze worden weer ingeschakeld als u weer opnieuw opstart." + "Wil je opnieuw opstarten in de veilige modus? Als u dit doet, worden alle geïnstalleerde applicaties van derden uitgeschakeld. Ze worden weer ingeschakeld als u weer opnieuw opstart." "Recent" "Geen recente apps." "Tabletopties" @@ -258,7 +263,7 @@ "Camera" "foto\'s maken en video opnemen" "Telefoon" - "bellen en telefoontjes beheren" + "telefoneren en oproepen beheren" "Lichaamssensoren" "toegang krijgen tot sensorgegevens over je vitale functies" "Content van vensters ophalen" @@ -356,9 +361,9 @@ "Hiermee kan de app afspraken toevoegen, verwijderen en wijzigen die u op je tv kunt aanpassen, inclusief afspraken van vrienden of collega\'s. Met deze toestemming zou de app berichten kunnen verzenden die afkomstig lijken te zijn van agenda-eigenaren of afspraken kunnen aanpassen zonder medeweten van de eigenaar." "Hiermee kan de app afspraken toevoegen, verwijderen en wijzigen die u kunt bewerken op je telefoon, inclusief afspraken van vrienden of collega\'s. Zo kan de app berichten verzenden die afkomstig lijken te zijn van agenda-eigenaren, of afspraken aanpassen zonder medeweten van de eigenaar." "toegang tot extra opdrachten van locatieaanbieder" - "Hiermee kan de app toegang krijgen tot extra opdrachten voor de locatieprovider. De app kan hiermee de werking van GPS of andere locatiebronnen te verstoren." - "toegang tot precieze locatie (GPS- en netwerkgebaseerd)" - "Hiermee kan de app je precieze locatie bepalen via GPS (Global Positioning System) of netwerklocatiebronnen zoals zendmasten en wifi. Deze locatieservices moeten zijn ingeschakeld en beschikbaar zijn op je apparaat voordat de app ze kan gebruiken. Apps kunnen dit gebruiken om te bepalen waar u bent en verbruiken mogelijk extra acculading." + "Hiermee kan de app toegang krijgen tot extra opdrachten voor de locatieprovider. De app kan hiermee de werking van gps of andere locatiebronnen te verstoren." + "toegang tot precieze locatie (gps- en netwerkgebaseerd)" + "Hiermee kan de app je precieze locatie bepalen via gps (Global Positioning System) of netwerklocatiebronnen zoals zendmasten en wifi. Deze locatieservices moeten zijn ingeschakeld en beschikbaar zijn op je apparaat voordat de app ze kan gebruiken. Apps kunnen dit gebruiken om te bepalen waar u bent en verbruiken mogelijk extra acculading." "toegang tot geschatte locatie (netwerkgebaseerd)" "Hiermee kan de app beschikken over je geschatte locatie. Deze locatie wordt afgeleid van locatieservices die netwerklocatiebronnen zoals zendmasten en wifi gebruiken. Deze locatieservices moeten zijn ingeschakeld en beschikbaar zijn op je apparaat voordat de app ze kan gebruiken. Apps kunnen dit gebruiken om ongeveer te bepalen waar u zich bevindt." "je audio-instellingen wijzigen" @@ -655,13 +660,13 @@ "Zus" "Huwelijkspartner" "Aangepast" - "Startpagina" + "Homepage" "Werk" "Overig" "Er is geen app gevonden om dit contact te bekijken." "Pincode typen" - "Geef de PUK-code en de nieuwe pincode op" - "PUK-code" + "Geef de pukcode en de nieuwe pincode op" + "pukcode" "Nieuwe pincode" "Tik om het wachtwoord te typen" "Typ het wachtwoord om te ontgrendelen" @@ -698,7 +703,7 @@ "Vooruitspoelen" "Alleen noodoproepen" "Netwerk vergrendeld" - "SIM-kaart is vergrendeld met PUK-code." + "SIM-kaart is vergrendeld met pukcode." "Raadpleeg de gebruikershandleiding of neem contact op met de klantenservice." "SIM-kaart is vergrendeld." "SIM-kaart ontgrendelen..." @@ -804,7 +809,7 @@ "Hiermee kan de app berichten toevoegen aan de inbox van je voicemail." "geolocatiemachtigingen voor browser aanpassen" "Hiermee kan de app de geolocatiemachtigingen van de browser aanpassen. Schadelijke apps kunnen dit gebruiken om locatiegegevens te verzenden naar willekeurige websites." - "Wilt u dat de browser dit wachtwoord onthoudt?" + "Wil je dat de browser dit wachtwoord onthoudt?" "Niet nu" "Onthouden" "Nooit" @@ -1010,7 +1015,7 @@ "OK" "Melden" "Wachten" - "De pagina reageert niet meer.\n\nWilt u de pagina sluiten?" + "De pagina reageert niet meer.\n\nWil je de pagina sluiten?" "App verplaatst" "%1$s is nu actief." "%1$s was het eerst gestart." @@ -1111,7 +1116,7 @@ "De verbinding met het wifi-netwerk wordt tijdelijk uitgeschakeld terwijl de telefoon verbonden is met %1$s" "Teken invoegen" "SMS-berichten verzenden" - "<b>%1$s</b> verzendt moment een groot aantal sms-berichten. Wilt u toestaan ​​dat deze app berichten blijft verzenden?" + "<b>%1$s</b> verzendt moment een groot aantal sms-berichten. Wil je toestaan ​​dat deze app berichten blijft verzenden?" "Toestaan" "Weigeren" "<b>%1$s</b> wil graag een bericht verzenden naar <b>%2$s</b>." @@ -1208,6 +1213,8 @@ "Hiermee wordt een app toegestaan installatiesessies te lezen. Zo kan de app informatie bekijken over actieve pakketinstallaties." "installatiepakketten aanvragen" "Hiermee kan een app installatie van pakketten aanvragen." + "vragen om batterijoptimalisatie te negeren" + "Hiermee kan een app toestemming vragen om batterijoptimalisatie voor die app te negeren." "Tik twee keer voor zoomregeling" "Kan widget niet toevoegen." "Ga" @@ -1220,7 +1227,7 @@ "Nummer bellen\nmet %s" "Contact maken\nmet %s" "De volgende apps verzoeken om toegang tot je account, nu en in de toekomst." - "Wilt u dit verzoek toestaan?" + "Wil je dit verzoek toestaan?" "Verzoek om toegang" "Toestaan" "Weigeren" @@ -1277,7 +1284,7 @@ "Ja" "Nee" "Verwijderingslimiet overschreden" - "Er zijn %1$d verwijderde items voor %2$s , account %3$s . Wat wilt u doen?" + "Er zijn %1$d verwijderde items voor %2$s , account %3$s . Wat wil je doen?" "De items verwijderen." "Verwijderingen ongedaan maken" "Nu niets doen." @@ -1333,7 +1340,7 @@ "Tik voor gebruik en instellingen" "Gegevenslimiet van 2G-3G bereikt" "Gegevenslimiet van 4G bereikt" - "Mobiele gegevenslimiet bereikt" + "Mobiele datalimiet bereikt" "Wifi-gegevenslimiet bereikt" "Gegev. onderbr. voor rest cyclus" "Gegevenslimiet 2G-3G overschreden" @@ -1400,14 +1407,14 @@ "Geef de pincode van de simkaart op" "Pincode opgeven" "Wachtwoord invoeren" - "De simkaart is nu uitgeschakeld. Geef de PUK-code op om door te gaan. Neem contact op met de provider voor informatie." + "De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie." "Gewenste pincode opgeven" "Gewenste pincode bevestigen" "Simkaart ontgrendelen..." "Onjuiste pincode." "Voer een pincode van 4 tot 8 cijfers in." - "De PUK-code is acht cijfers lang." - "Geef de juiste PUK-code opnieuw op. Bij herhaalde pogingen wordt de simkaart permanent uitgeschakeld." + "De pukcode is acht cijfers lang." + "Geef de juiste pukcode opnieuw op. Bij herhaalde pogingen wordt de simkaart permanent uitgeschakeld." "Pincodes komen niet overeen" "Te veel patroonpogingen" "Als u wilt ontgrendelen, moet u inloggen op je Google-account." @@ -1524,8 +1531,8 @@ "Kahu" "Kaku2" "You4" - "Onbekend portret" - "Onbekend landschap" + "Onbekend staand" + "Onbekend liggend" "Geannuleerd" "Fout bij schrijven van content" "onbekend" @@ -1558,7 +1565,7 @@ "Jaar selecteren" "%1$s verwijderd" "Werk %1$s" - "Tik op Terug en houd vast om dit scherm los te maken." + "Tik op Terug en Overzicht en houd vast om dit scherm los te maken." "App is vastgezet: losmaken is niet toegestaan op dit apparaat." "Scherm vastgezet" "Scherm losgemaakt" diff --git a/core/res/res/values-notround-watch/dimens.xml b/core/res/res/values-notround-watch/dimens.xml index f103aa91dcfe..f0204d0f2d34 100644 --- a/core/res/res/values-notround-watch/dimens.xml +++ b/core/res/res/values-notround-watch/dimens.xml @@ -24,4 +24,5 @@ 0% 24dp 24dp + 3dp 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 @@ --> 8dp - 0dp + 8dp - 16dp - 16dp - 16dp + 8dp + 8dp + 8dp - 8dp - 8dp + 0dp + 0dp + + + 8dp + 8dp diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index 9658e1e15790..fc26602b1eca 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -40,12 +40,13 @@ "%1$d ਸਕਿੰਟ" "%1$d ਸਕਿੰਟ" "<ਬਿਨਾਂ ਸਿਰਲੇਖ>" - "(ਕੋਈ ਫੋਨ ਨੰਬਰ ਨਹੀਂ)" + "(ਕੋਈ ਫ਼ੋਨ ਨੰਬਰ ਨਹੀਂ)" "ਅਗਿਆਤ" "ਵੌਇਸਮੇਲ" "MSISDN1" "ਕਨੈਕਸ਼ਨ ਸਮੱਸਿਆ ਜਾਂ ਅਪ੍ਰਮਾਣਿਕ MMI ਕੋਡ।" "ਓਪਰੇਸ਼ਨ ਕੇਵਲ ਫਿਕਸਡ ਡਾਇਲਿੰਗ ਨੰਬਰਾਂ ਤੱਕ ਸੀਮਿਤ ਹੈ।" + "ਤੁਹਾਡੇ ਰੋਮਿੰਗ ਵਿੱਚ ਹੋਣ ਦੌਰਾਨ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੋਂ ਕਾਲ ਫਾਰਵਰਡਿੰਗ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।" "ਸੇਵਾ ਅਸਮਰੱਥ ਬਣਾਈ ਗਈ ਸੀ।" "ਸੇਵਾ ਇਸ ਲਈ ਸਮਰੱਥ ਬਣਾਈ ਗਈ ਸੀ:" "ਸੇਵਾ ਅਸਮਰੱਥ ਬਣਾਈ ਗਈ ਹੈ।" @@ -96,6 +97,8 @@ "ਵੌਇਸ/ਡੈਟਾ ਸੇਵਾਵਾਂ ਬਲੌਕ ਕੀਤੀਆਂ ਹੋਈਆਂ ਹਨ।" "ਵੌਇਸ/SMS ਸੇਵਾਵਾਂ ਬਲੌਕ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ।" "ਸਾਰੀਆਂ ਵੌਇਸ/ਡੈਟਾ/SMS ਸੇਵਾਵਾਂ ਬਲੌਕ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ।" + "ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ" + "ਪ੍ਰਾਪਤੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਸੈਟਿੰਗਾਂ > ਸੈਲਿਊਲਰ ਨੈੱਟਵਰਕ > ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਕਿਸਮ \'ਤੇ ਚੁਣੀ ਗਈ ਕਿਸਮ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" "ਪੀਅਰ ਨੇ TTY Mode FULL ਦੀ ਬੇਨਤੀ ਕੀਤੀ" "ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ" "ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ" @@ -179,6 +182,8 @@ "ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਐਡਮਿਨ ਐਪ ਦੇ ਕਾਰਨ ਮਿਟਾਈ ਗਈ।" "ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਐਡਮਿਨ ਐਪ ਜਾਂ ਤਾਂ ਲੁਪਤ ਹੈ ਜਾਂ ਕਰਪਟ ਹੈ। ਇੱਕ ਸਿੱਟੇ ਦੇ ਤੌਰ ਤੇ, ਤੁਹਾਡੀ ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਸੰਬੰਧਿਤ ਡੈਟਾ ਮਿਟਾਇਆ ਗਿਆ ਹੈ। ਸਹਾਇਤਾ ਲਈ ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।" "ਤੁਹਾਡੀ ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਹੁਣ ਇਸ ਡੀਵਾਈਸ ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।" + "ਨੈੱਟਵਰਕ ਟਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" + "ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ" "ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਮਿਟਾਈ ਜਾਏਗੀ" "ਐਡਮਿਨ ਐਪ ਲੁਪਤ ਕੰਪੋਨੈਂਟ ਜਾਂ ਕਰਪਟ ਹੈ ਅਤੇ ਇਸਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਹੁਣ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਮਿਟਾ ਦਿੱਤੀ ਜਾਏਗੀ। ਸਹਾਇਤਾ ਲਈ ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।" "ਮੈਂ" @@ -252,7 +257,7 @@ "SMS" "SMS ਸੁਨੇਹੇ ਭੇਜਣ ਅਤੇ ਦੇਖਣ" "ਸਟੋਰੇਜ" - "ਆਪਣੀ ਡੀਵਾਈਸ ’ਤੇ ਫੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ" + "ਆਪਣੀ ਡੀਵਾਈਸ ’ਤੇ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਫਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ" "ਮਾਈਕ੍ਰੋਫੋਨ" "ਔਡੀਓ ਰਿਕਾਰਡ ਕਰਨ" "ਕੈਮਰਾ" @@ -376,7 +381,7 @@ "IMS ਕਾਲ ਸੇਵਾ ਤੱਕ ਪਹੁੰਚ" "ਐਪ ਨੂੰ ਤੁਹਾਡੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਕਾਲਾਂ ਕਰਨ ਲਈ IMS ਸੇਵਾ ਵਰਤਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।" "ਫੋਨ ਸਥਿਤੀ ਅਤੇ ਪਛਾਣ ਪੜ੍ਹੋ" - "ਐਪ ਨੂੰ ਡੀਵਾਈਸ ਦੀਆਂ ਫੋਨ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਅਨੁਮਤੀ ਐਪ ਨੂੰ ਫੋਨ ਨੰਬਰ ਅਤੇ ਡੀਵਾਈਸ ID ਨਿਰਧਾਰਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ, ਇੱਕ ਕਾਲ ਸਕਿਰਿਆ ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇ ਰਿਮੋਟ ਨੰਬਰ ਇੱਕ ਕਾਲ ਨਾਲ ਕਨੈਕਟ ਹੈ ਜਾਂ ਨਹੀਂ।" + "ਐਪ ਨੂੰ ਡੀਵਾਈਸ ਦੀਆਂ ਫੋਨ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਅਨੁਮਤੀ ਐਪ ਨੂੰ ਫ਼ੋਨ ਨੰਬਰ ਅਤੇ ਡੀਵਾਈਸ ID ਨਿਰਧਾਰਿਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ, ਇੱਕ ਕਾਲ ਸਕਿਰਿਆ ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇ ਰਿਮੋਟ ਨੰਬਰ ਇੱਕ ਕਾਲ ਨਾਲ ਕਨੈਕਟ ਹੈ ਜਾਂ ਨਹੀਂ।" "ਟੈਬਲੇਟ ਨੂੰ ਸਲੀਪਿੰਗ ਤੋਂ ਰੋਕੋ" "TV ਨੂੰ ਸਲੀਪਿੰਗ ਤੋਂ ਰੋਕੋ" "ਫੋਨ ਨੂੰ ਸਲੀਪਿੰਗ ਤੋਂ ਰੋਕੋ" @@ -549,7 +554,7 @@ "ਘਰ" "ਮੋਬਾਈਲ" "ਕੰਮ" - "ਦਫ਼ਤਰ ਦੀ ਫੈਕਸ" + "ਕਾਰਜ-ਸਥਾਨ ਫੈਕਸ" "ਘਰ ਦੀ ਫੈਕਸ" "ਪੇਜਰ" "ਹੋਰ" @@ -592,7 +597,7 @@ "ਘਰ" "ਮੋਬਾਈਲ" "ਕੰਮ" - "ਦਫ਼ਤਰ ਦੀ ਫੈਕਸ" + "ਕਾਰਜ-ਸਥਾਨ ਫੈਕਸ" "ਘਰ ਦੀ ਫੈਕਸ" "ਪੇਜਰ" "ਹੋਰ" @@ -1146,7 +1151,7 @@ "ਇਹ ਡੀਵਾਈਸ USB ਰਾਹੀਂ ਚਾਰਜ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" "ਨੱਥੀ ਕੀਤੀ ਡੀਵਾਈਸ ਨੂੰ USB ਰਾਹੀਂ ਪਾਵਰ ਮਿਲ ਰਹੀ ਹੈ" "ਫ਼ਾਈਲ ਟ੍ਰਾਂਸਫ਼ਰ ਲਈ USB" - "ਫੋਟੋ ਟ੍ਰਾਂਸਫ਼ਰ ਲਈ USB" + "ਫ਼ੋਟੋ ਟ੍ਰਾਂਸਫ਼ਰ ਲਈ USB" "MIDI ਲਈ USB" "ਇੱਕ USB ਐਕਸੈਸਰੀ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ" "ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।" @@ -1168,7 +1173,7 @@ "%s ਤਿਆਰ ਹੋ ਰਿਹਾ ਹੈ" "ਤਰੁੱਟੀਆਂ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ" "ਨਵੇਂ %s ਦਾ ਪਤਾ ਲਗਾਇਆ ਗਿਆ" - "ਫੋਟੋਆਂ ਅਤੇ ਮੀਡੀਆ ਨੂੰ ਟ੍ਰਾਂਸਫ਼ਰ ਕਰਨ ਲਈ" + "ਫ਼ੋਟੋਆਂ ਅਤੇ ਮੀਡੀਆ ਨੂੰ ਟ੍ਰਾਂਸਫ਼ਰ ਕਰਨ ਲਈ" "ਕਰਪਟਿਡ %s" "%s ਗ਼ਲਤ ਹੈ। ਠੀਕ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।" "ਅਸਮਰਥਿਤ %s" @@ -1208,6 +1213,8 @@ "ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਇੰਸਟੌਲ ਸੈਸ਼ਨ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਇਸਨੂੰ ਸਕਿਰਿਆ ਪੈਕੇਜ ਇੰਸਟੌਲੇਸ਼ਨਾਂ ਬਾਰੇ ਵੇਰਵੇ ਦੇਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।" "ਪੈਕੇਜ ਸਥਾਪਿਤ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕਰੋ" "ਪੈਕੇਜ ਦੀ ਸਥਾਪਨਾ ਦੀ ਬੇਨਤੀ ਕਰਨ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਅਨੁਮਤੀ ਦਿੰਦਾ ਹੈ" + "ਬੈਟਰੀ ਸੁਯੋਗਤਾਵਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰਨ ਲਈ ਪੁੱਛੋ" + "ਕਿਸੇ ਐਪ ਨੂੰ ਉਸ ਵਾਸਤੇ ਬੈਟਰੀ ਸੁਯੋਗਤਾਵਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰਨ ਲਈ ਇਜਾਜ਼ਤ ਵਾਸਤੇ ਪੁੱਛਣ ਲਈ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।" "ਜ਼ੂਮ ਕੰਟਰੋਲ ਲਈ ਦੋ ਵਾਰ ਟੈਪ ਕਰੋ" "ਵਿਜੇਟ ਨਹੀਂ ਜੋੜ ਸਕਿਆ।" "ਜਾਓ" @@ -1558,7 +1565,7 @@ "ਸਾਲ ਚੁਣੋ" "%1$s ਹਟਾਇਆ ਗਿਆ" "ਕੰਮ %1$s" - "ਇਸ ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰਨ ਲਈ, ਸਪਰਸ਼ ਕਰੋ & ਦਬਾਈ ਰੱਖੋ।" + "ਇਸ ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰਨ ਲਈ, \'ਪਿੱਛੇ\' ਅਤੇ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।" "ਐਪ ਪਿੰਨਡ ਹੈ: ਇਸ ਡੀਵਾਈਸ ਤੇ ਅਨਪਿਨ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ।" "ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ" "ਸਕ੍ਰੀਨ ਅਨਪਿਨ ਕੀਤੀ" diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index dbe29ee33993..5a88c933ec63 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problem z połączeniem lub błędny kod MMI." "Operacja jest ograniczona wyłącznie do numerów ustalonych." + "Podczas roamingu nie można zmienić ustawień przekazywania połączeń z telefonu." "Usługa została włączona." "Usługa została włączona dla:" "Usługa została wyłączona." @@ -98,6 +99,8 @@ "Usługi głosowe/danych są zablokowane." "Usługi głosowe/SMS są zablokowane." "Wszystkie usługi głosowe/danych/SMS są zablokowane." + "Brak zasięgu sieci" + "Aby poprawić odbiór, zmień typ sieci – wybierz Ustawienia > Sieci komórkowe > Preferowany typ sieci." "Drugie urządzenie zażądało trybu „TTY pełny”" "Drugie urządzenie zażądało trybu „TTY HCO”" "Drugie urządzenie zażądało trybu „TTY VCO”" @@ -183,6 +186,8 @@ "Profil do pracy został usunięty z powodu braku aplikacji administracyjnej." "Brakuje aplikacji administracyjnej profilu do pracy lub jest ona uszkodzona. Z tego powodu Twój profil do pracy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc." "Twój profil do pracy nie jest już dostępny na tym urządzeniu." + "Ruch w sieci jest monitorowany" + "Kliknij, by dowiedzieć się więcej" "Twoje urządzenie zostanie wyczyszczone" "Aplikacja administracyjna nie ma wszystkich składników lub jest uszkodzona i nie można jej użyć. Twoje urządzenie zostanie teraz wyczyszczone. Skontaktuj się ze swoim administratorem, aby uzyskać pomoc." "Ja" @@ -1008,7 +1013,7 @@ "OK" "Anuluj" "Uwaga" - "Wczytywanie…" + "Wczytuję…" "Wł" "Wył" "Wykonaj czynność przez..." @@ -1258,6 +1263,8 @@ "Pozwala aplikacji odczytywać sesje instalacji. Umożliwia to jej na poznanie szczegółów aktywnych instalacji pakietów." "żądanie instalacji pakietów" "Zezwala aplikacji żądanie instalacji pakietów." + "Prośba o ignorowanie optymalizacji wykorzystania baterii" + "Zezwala aplikacji na proszenie o uprawnienia do ignorowania optymalizacji wykorzystania baterii w przypadku danej aplikacji." "Dotknij dwukrotnie, aby sterować powiększeniem" "Nie można dodać widżetu." "OK" @@ -1284,7 +1291,7 @@ "Tapeta" "Zmień tapetę" "Odbiornik powiadomień" - "Odbiornik rzeczywistości wirtualnej" + "Odbiornik VR" "Dostawca warunków" "Usługa rankingu powiadomień" "VPN aktywny" @@ -1612,7 +1619,7 @@ "Wybierz rok" "%1$s usunięte" "%1$s (praca)" - "Aby odpiąć ten ekran, naciśnij i przytrzymaj Wstecz." + "Aby odpiąć ten ekran, naciśnij i przytrzymaj Wstecz oraz Przegląd." "Aplikacja jest przypięta. Nie możesz jej odpiąć na tym urządzeniu." "Ekran przypięty" "Ekran odpięty" diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 4f3b09fd5ca6..5947ac27ef0c 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -21,7 +21,7 @@ "B" - "Kb" + "KB" "MB" "GB" "TB" @@ -46,6 +46,7 @@ "MSISDN1" "Problema de conexão ou código MMI inválido." "A operação é limitada somente a números de chamadas fixas." + "Não é possível alterar as configurações de encaminhamento de chamada do seu smartphone em roaming." "O serviço foi ativado." "O serviço foi ativado para:" "O serviço foi desativado." @@ -96,6 +97,8 @@ "Os serviços de voz/dados estão bloqueados." "Os serviços de voz/SMS estão bloqueados." "Todos os serviços de voz/dados/SMS estão bloqueados." + "Não foi possível acessar a rede" + "Para melhorar a recepção, tente alterar o tipo selecionado em Configurações > Redes celulares > Tipo de rede preferencial." "TTD modo COMPLETO solicitado" "TTD modo HCO solicitado" "TTD modo VCO solicitado" @@ -179,6 +182,8 @@ "Perfil de trabalho excluído devido à ausência de um app para administrador." "O app para administrador do perfil de trabalho não foi encontrado ou está corrompido. Consequentemente, seu perfil de trabalho e os dados relacionados foram excluídos. Entre em contato com seu administrador para receber assistência." "Seu perfil de trabalho não está mais disponível neste dispositivo." + "O tráfego de rede está sendo monitorado" + "Toque para saber mais" "Seu dispositivo será limpo" "O app para administrador está sem alguns componentes ou foi corrompido e não pode ser usado. Seu dispositivo será limpo agora. Entre em contato com seu administrador para receber assistência." "Eu" @@ -1208,6 +1213,8 @@ "Permite que um app leia sessões de instalação. Isso permite que ele veja detalhes sobre as instalações de pacote ativas." "solicitar pacotes de instalação" "Permite que um app solicite a instalação de pacotes." + "solicitar que as otimizações de bateria sejam ignoradas" + "Permite que um app peça permissão para ignorar as otimizações de bateria para esse app." "Toque duas vezes para ter controle do zoom" "Não foi possível adicionar widget." "Ir" @@ -1268,7 +1275,7 @@ "Apagando cartão SD..." "Compartilhar" "Localizar" - "Pesquisa na web do Google" + "Pesquisa Google na Web" "Localizar próximo" "Localizar anterior" "Solicitação de local de %s" @@ -1558,7 +1565,7 @@ "Selecione o ano" "%1$s excluído" "Trabalho: %1$s" - "Para liberar esta tela, toque no botão \"Voltar\" e mantenha-o pressionado." + "Para liberar essa tela, toque nos botões Voltar e Visão geral e mantenha-os pressionados." "O app está fixado. A liberação não é permitida neste dispositivo." "Tela fixada" "Tela liberada" diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 64db1c2ad70b..eff872fd579e 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problema de ligação ou código MMI inválido." "A operação está restringida a números fixos autorizados." + "Não é possível alterar as definições do encaminhamento de chamadas no telemóvel quando está em roaming." "O serviço foi ativado." "O serviço foi ativado para:" "O serviço foi desativado." @@ -96,6 +97,8 @@ "Os serviços de voz/dados estão bloqueados." "Os serviços de Voz/SMS estão bloqueados." "Todos os serviços de voz/dados/SMS estão bloqueados." + "Não é possível ligar à rede" + "Para melhorar a receção, experimente alterar o tipo selecionado em Definições > Redes móveis > Tipo de rede preferido." "O par solicitou o modo COMPLETO de teletipo" "O par solicitou o modo HCO de teletipo" "O par solicitou o modo VCO de teletipo" @@ -179,6 +182,8 @@ "Perfil de trabalho eliminado devido a aplicação de administração em falta." "A aplicação de administração do perfil de trabalho está em falta ou corrompida. Consequentemente, o seu perfil de trabalho e os dados relacionados foram eliminados. Contacte o seu administrador para obter assistência." "O seu perfil de trabalho já não está disponível neste dispositivo." + "O tráfego de rede está a ser monitorizado" + "Toque para saber mais" "O seu dispositivo será apagado" "A aplicação de administração tem componentes em falta ou corrompidos e não podem ser utilizados. O seu dispositivo será agora apagado. Contacte o seu administrador para obter assistência." "Eu" @@ -1208,6 +1213,8 @@ "Permite que uma aplicação leia sessões de instalação. Isto permite que veja detalhes acerca de instalações de pacotes ativas." "solicitar pacotes de instalação" "Permite que uma aplicação solicite a instalação de pacotes." + "pedir para ignorar as otimizações da bateria" + "Permite que uma aplicação solicite autorização para ignorar as otimizações da bateria para a mesma." "Tocar duas vezes para controlar o zoom" "Não foi possível adicionar widget." "Ir" @@ -1558,7 +1565,7 @@ "Selecionar ano" "%1$s eliminado" "%1$s de trabalho" - "Para soltar este ecrã, toque sem soltar em Anterior." + "Para soltar este ecrã, toque sem soltar em Anterior e Vista geral." "A aplicação está fixa: não é permitido soltá-la neste dispositivo." "Ecrã fixo" "Ecrã solto" diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 4f3b09fd5ca6..5947ac27ef0c 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -21,7 +21,7 @@ "B" - "Kb" + "KB" "MB" "GB" "TB" @@ -46,6 +46,7 @@ "MSISDN1" "Problema de conexão ou código MMI inválido." "A operação é limitada somente a números de chamadas fixas." + "Não é possível alterar as configurações de encaminhamento de chamada do seu smartphone em roaming." "O serviço foi ativado." "O serviço foi ativado para:" "O serviço foi desativado." @@ -96,6 +97,8 @@ "Os serviços de voz/dados estão bloqueados." "Os serviços de voz/SMS estão bloqueados." "Todos os serviços de voz/dados/SMS estão bloqueados." + "Não foi possível acessar a rede" + "Para melhorar a recepção, tente alterar o tipo selecionado em Configurações > Redes celulares > Tipo de rede preferencial." "TTD modo COMPLETO solicitado" "TTD modo HCO solicitado" "TTD modo VCO solicitado" @@ -179,6 +182,8 @@ "Perfil de trabalho excluído devido à ausência de um app para administrador." "O app para administrador do perfil de trabalho não foi encontrado ou está corrompido. Consequentemente, seu perfil de trabalho e os dados relacionados foram excluídos. Entre em contato com seu administrador para receber assistência." "Seu perfil de trabalho não está mais disponível neste dispositivo." + "O tráfego de rede está sendo monitorado" + "Toque para saber mais" "Seu dispositivo será limpo" "O app para administrador está sem alguns componentes ou foi corrompido e não pode ser usado. Seu dispositivo será limpo agora. Entre em contato com seu administrador para receber assistência." "Eu" @@ -1208,6 +1213,8 @@ "Permite que um app leia sessões de instalação. Isso permite que ele veja detalhes sobre as instalações de pacote ativas." "solicitar pacotes de instalação" "Permite que um app solicite a instalação de pacotes." + "solicitar que as otimizações de bateria sejam ignoradas" + "Permite que um app peça permissão para ignorar as otimizações de bateria para esse app." "Toque duas vezes para ter controle do zoom" "Não foi possível adicionar widget." "Ir" @@ -1268,7 +1275,7 @@ "Apagando cartão SD..." "Compartilhar" "Localizar" - "Pesquisa na web do Google" + "Pesquisa Google na Web" "Localizar próximo" "Localizar anterior" "Solicitação de local de %s" @@ -1558,7 +1565,7 @@ "Selecione o ano" "%1$s excluído" "Trabalho: %1$s" - "Para liberar esta tela, toque no botão \"Voltar\" e mantenha-o pressionado." + "Para liberar essa tela, toque nos botões Voltar e Visão geral e mantenha-os pressionados." "O app está fixado. A liberação não é permitida neste dispositivo." "Tela fixada" "Tela liberada" diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 192d9c1a1f95..40230fab26cd 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problemă de conexiune sau cod MMI nevalid." "Operația este limitată la numerele cu apelări restricționate." + "Nu puteți schimba setările de redirecționare a apelurilor de pe telefon când sunteți în roaming." "Serviciul a fost activat." "Serviciul a fost activat pentru:" "Serviciul a fost dezactivat." @@ -97,6 +98,8 @@ "Serviciile de voce/date sunt blocate." "Serviciile de voce/SMS sunt blocate." "Toate serviciile de voce/date/SMS sunt blocate." + "Nu se poate stabili conexiunea la rețea" + "Pentru o recepție mai bună, încercați să schimbați tipul selectat în Setări > Rețele mobile > Tip preferat de rețea." "Cealaltă persoană a solicitat modul TTY cu setarea COMPLET" "Cealaltă persoană a solicitat modul TTY cu setarea HCO" "Cealaltă persoană a solicitat modul TTY cu setarea VCO" @@ -181,6 +184,8 @@ "Profilul de serviciu a fost șters, deoarece aplicația de administrare lipsește." "Aplicația de administrare a profilului de serviciu lipsește sau este deteriorată. Prin urmare, profilul de serviciu și datele asociate au fost șterse. Pentru asistență, contactați administratorul." "Profilul de serviciu nu mai este disponibil pe acest dispozitiv." + "Traficul de rețea este monitorizat" + "Atingeți ca să aflați mai multe" "Datele de pe dispozitiv vor fi șterse" "Aplicația de administrare nu poate fi utilizată, deoarece este deteriorată sau îi lipsesc componente. Datele de pe dispozitiv vor fi șterse. Pentru asistență, contactați administratorul." "Eu" @@ -1084,7 +1089,7 @@ "Ton de apel prestabilit" "Ton de apel prestabilit (%1$s)" "Niciunul" - "Tonuri de sonerie" + "Tonuri de apel" "Ton de apel necunoscut" Rețele Wi-Fi disponibile @@ -1233,6 +1238,8 @@ "Permite unei aplicații accesul la citirea sesiunilor de instalare. Aceasta poate vedea detalii despre instalările de pachete active." "să solicite pachete de instalare" "Permite unei aplicații să solicite instalarea pachetelor." + "să solicite ignorarea optimizărilor bateriei" + "Permite unei aplicații să solicite permisiunea de a ignora optimizările bateriei pentru aplicația respectivă." "Apăsați de două ori pentru a controla mărirea/micșorarea" "Nu s-a putut adăuga widgetul." "Accesați" @@ -1259,7 +1266,7 @@ "Imagine de fundal" "Schimbați imaginea de fundal" "Serviciu de citire a notificărilor" - "Instrument de ascultare pentru Realitatea virtuală" + "Instrument de ascultare pentru RV" "Furnizor de condiții" "Serviciul de clasificare a notificărilor" "VPN activat" @@ -1585,7 +1592,7 @@ "Selectați anul" "%1$s a fost șters" "%1$s de serviciu" - "Pentru a anula fixarea acestui ecran, atingeți lung opțiunea Înapoi." + "Pentru a anula fixarea acestui ecran, atingeți lung opțiunile Înapoi și Recente." "Aplicația este fixată: Anularea fixării nu este permisă pe acest dispozitiv." "Ecran fixat" "Fixarea ecranului anulată" diff --git a/core/res/res/values-round-watch/config_material.xml b/core/res/res/values-round-watch/config_material.xml index bf445ef3fd0e..ae4a6eedf4fd 100644 --- a/core/res/res/values-round-watch/config_material.xml +++ b/core/res/res/values-round-watch/config_material.xml @@ -19,4 +19,7 @@ false + + + @dimen/screen_percentage_15 diff --git a/core/res/res/values-round-watch/dimens.xml b/core/res/res/values-round-watch/dimens.xml index a12f49929929..1d8c669ac55b 100644 --- a/core/res/res/values-round-watch/dimens.xml +++ b/core/res/res/values-round-watch/dimens.xml @@ -24,4 +24,5 @@ 2.1% 32dp 32dp + 5dp 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/screen_percentage_15 @dimen/screen_percentage_15 + + + @dimen/screen_percentage_15 + 8dp diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index b1b14f9d2292..a126950ca9df 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Неполадки подключения или неверный код MMI." "Операция возможна только для разрешенных номеров." + "Вы не можете изменить настройки переадресации вызовов, поскольку находитесь в роуминге." "Служба включена." "Служба подключена для:" "Служба отключена." @@ -90,7 +91,7 @@ "Идентификация абонента по умолчанию не запрещена. След. вызов: разрешена" "Услуга не предоставляется." "Невозможно изменить параметр идентификатора вызывающего абонента." - "Служба данных заблокирована." + "Передача данных заблокирована." "Служба экстренной помощи заблокирована." "Служба передачи голосовых сообщений заблокирована." "Все службы передачи голосовых сообщений заблокированы." @@ -98,6 +99,8 @@ "Службы передачи данных/голосовых сообщений заблокированы." "Службы передачи голосовых сообщений/SMS заблокированы." "Все службы передачи данных/голосовых сообщений/SMS заблокированы." + "Сеть недоступна" + "Чтобы улучшить сигнал, попробуйте выбрать другой тип сети в настройках (раздел \"Мобильные сети\")." "На устройстве абонента выбран режим телетайпа \"ВСЕ\"" "На устройстве абонента выбран режим телетайпа HCO" "На устройстве абонента выбран режим телетайпа VCO" @@ -183,6 +186,8 @@ "Рабочий профиль удален из-за отсутствия приложения Admin." "Приложение Admin в рабочем профиле отсутствует или повреждено. Из-за этого рабочий профиль и связанные с ним данные были удалены. Если у вас возникли вопросы, обратитесь к администратору." "Ваш рабочий профиль больше не доступен на этом устройстве." + "Включен мониторинг сетевого трафика" + "Подробнее…" "Все данные с устройства будут удалены" "Приложение Admin нельзя использовать, так как оно отсутствует или повреждено. С устройства будут удалены все данные. Если у вас возникли вопросы, обратитесь к администратору." "Я" @@ -1258,6 +1263,8 @@ "Чтение данных текущих сеансов установки пакетов." "Запрос пакетов установки" "Приложение сможет запрашивать разрешения на установку пакетов." + "Без ограничения расхода батареи" + "Разрешает приложению игнорировать ограничение на расход заряда батареи." "Нажмите дважды для изменения масштаба" "Не удалось добавить виджет." "Выбрать" @@ -1612,7 +1619,7 @@ "Выберите год" "Цифра %1$s удалена" "Рабочий %1$s" - "Чтобы открепить экран, нажмите и удерживайте кнопку \"Назад\"." + "Чтобы открепить экран, нажмите и удерживайте кнопки \"Назад\"и \"Обзор\"" "Включена блокировка в приложении. Ее отключение запрещено правилами организации." "Блокировка включена" "Блокировка выключена" diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index f3c8e7bad0d6..098f1940fe96 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "සම්බන්ධතා ගැටළුවක් හෝ අවලංගු MMI කේතයකි." "ස්ථාවර ඇමතීම් අංක වලට පමණක් මෙහෙයුම සීමාකර ඇත." + "ඔබ රෝමිං තුළ සිටින අතරතුර ඔබේ දුරකථනයෙන් ඇමතුම් ප්‍රතියොමු සැකසීම් වෙනස් කළ නොහැකිය." "සේවාව සබල කරන ලදි." "සේවාව සබලයි, සඳහා:" "සේවාව අබල කරන ලදි." @@ -96,6 +97,8 @@ "හඬ/දත්ත සේවා අවහිර කර ඇත." "හඬ/SMS සේවා අවහිර කර ඇත." "සියලුම හඬ/දත්ත/SMS සේවාවන් බාධා කර ඇත." + "ජාලය වෙත ළඟා විය නොහැකිය" + "ලැබීම වැඩි දියුණු කිරීමට, සැකසීම් > සෙලියුලර් ජාල > වඩා කැමති ජාල වර්ගය තුළ තෝරන ලද වර්ගය වෙනස් කිරීම උත්සාහ කරන්න." "සම ඉල්ලීම් කළ TTY ප්‍රකාරය පූර්ණයි" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය HCO" "සම ඉල්ලීම් කළ TTY ප්‍රකාරය VCO" @@ -108,7 +111,7 @@ "සමමුහුර්ත කිරීම" "පැකැට්ටුව" "PAD" - "රෝමිං දර්ශකය සක්‍රියයි" + "රෝමිං දර්ශකය ක්‍රියාත්මකයි" "රෝමිං දර්ශකය අක්‍රියයි" "රෝමිං දර්ශකය සැණෙලි වෙයි" "වටපිටාවෙන් ඉවත්ව" @@ -179,6 +182,8 @@ "පරිපාලක යෙදුමක් නොමැති වීමෙන් කාර්යාල පැතිකඩ මකා දමන ලදි." "කාර්යාල පැතිකඩ පාලක යෙදුම නොමැති හෝ දූෂණය වී ඇත. ප්‍රතිඵලයක් ලෙස ඔබගේ කාර්යාල පැතිකඩ සහ අදාළ දත්ත මකා දමා ඇත. සහය සඳහා ඔබගේ පරිපාලකයා සම්බන්ධ කර ගන්න." "ඔබේ කාර්යාල පැතිකඩ මෙම උපාංගය මත තවදුරටත් ලබා ගැනීමට නොහැකිය." + "ජාල තදබදය නිරීක්ෂණය කරමින් පවතී" + "තව දැන ගැනීමට තට්ටු කරන්න" "ඔබගේ උපාංගය මකා දැමෙනු ඇත" "යෙදුමේ කොටස් නොමැති හෝ දූෂණය වී ඇති නිසා, භාවිතා කළ නොහැක. ඔබගේ උපාංගය දැන් මකා දැමෙනු ඇත. සහය සඳහා ඔබගේ පරිපාලකයා සම්බන්ධ කරගන්න." "මම" @@ -189,7 +194,7 @@ "නොරැහන් සක්‍රිය කරන්න" "නොරැහැන් අක්‍රිය කරන්න" "තිර අගුල" - "බලය අක්‍රිය කරන්න" + "බල රහිත කරන්න" "හඬ නඟනය අක්‍රියයි" "හඬ නඟනය කම්පනය" "හඬ නඟනය සක්‍රීයයි" @@ -213,7 +218,7 @@ "රූපවාහිනී විකල්ප" "දුරකථන විකල්ප" "තිර අගුල" - "බලය අක්‍රිය කරන්න" + "බල රහිත කරන්න" "හදිසි" "දෝෂ වර්තාව" "දෝෂ වාර්තාවක් ගන්න" @@ -228,7 +233,7 @@ "නිහඬ ආකාරය" "ශබ්දය අක්‍රියයි" - "හඬ සක්‍රියයි" + "හඬ ක්‍රියාත්මකයි" "අහස්යානා ආකාරය" "අහස්යානා ආකාරය සක්‍රීයයි." "අහස්යානා අකාරය අක්‍රියයි" @@ -269,8 +274,8 @@ "යෙදුම් අන්තර්ගතයට ප්‍රවේශ්‍යතාවය වැඩිවන ලෙස සකස් කිරීමට ඇතැම් විට ස්ක්‍රිප්ට් ස්ථාපනය කර ඇත." "ඔබ ටයිප් කළ පෙළ බලන්න" "ණයවරපත් අංක සහ මුරපද වැනි පුද්ගලික දත්ත ඇතුළත් වේ." - "සංදර්ශන විශාලන මට්ටම පාලනය කිරීම" - "සංදර්ශනයේ විශාලන මට්ටම සහ පිහිටීම පාලනය කිරීම." + "සංදර්ශනයේ විශාලනය පාලනය කරන්න" + "සංදර්ශනයේ විශාලන මට්ටම සහ පිහිටීම පාලනය කරන්න." "අභින සිදු කරන්න" "තට්ටු කිරීමට, ස්වයිප් කිරීමට, පින්ච් කිරීමට, සහ වෙනත් අභින සිදු කිරීමට හැකිය." "තත්ව තීරුව අබල කරන්න හෝ වෙනස් කරන්න" @@ -284,7 +289,7 @@ "කෙටිමං අස්ථාපනය කරන්න" "පරිශීලක මැදිහත්වීමෙන් තොරව මුල්තිර කෙටිමං එක් කිරීමට යෙදුමකට අවසර දෙයි." "පිටවන ඇමතුම් වල මග වෙනස් කිරීම" - "ඇමතුම වෙනත් අංකයකට හරවා යැවීම හෝ ඇමතුම මුළුමනින්ම නැවත් වීම වැනි විකල්ප සමඟ පිටතට යන ඇමතුමකදී ඩයල් කළ අංකය බැලීමට යෙදුමට ඉඩ දෙන්න." + "ඇමතුම වෙනත් අංකයකට හරවා යැවීම හෝ ඇමතුම මුළුමනින්ම නැවත්වීම වැනි විකල්ප සමඟ පිටතට යන ඇමතුමකදී අංකනය කළ අංකය බැලීමට යෙදුමට ඉඩ දෙයි." "කෙටි පණිවිඩ ලබාගැනීම (SMS)" "SMS පණිවිඩ ලැබීමට සහ ක්‍රියාත්මක කිරීමට යෙදුමට අවසර දෙන්න. මෙහි තේරුම යෙදුමට ඔබගේ උපාංගයට ලැබෙන පණිවිඩ අධීක්ෂණය කිරීමට හැකිවීම වන අතර, ඒවා ඔබට නොපෙන්වා මකා දැමීමටද හැකි වීමයි." "පෙළ පණිවුඩ ලබාගන්න (MMS)" @@ -376,7 +381,7 @@ "IMS ඇමතුම් සේවාවට පිවිසෙන්න" "ඔබේ මැදිහත්වීමකින් තොරව ඇමතුම් සිදු කිරීමට IMS සේවාව භාවිතයට යෙදුමට ඉඩ දෙන්න." "දුරකථනයේ තත්වය සහ අනන්‍යතාවය කියවීම" - "උපාංගයේ දුරකථන විශේෂාංග වෙත පිවිසීමට යෙදුමට අවසර දෙන්න. ඇමතුම සක්‍රිය වුවත් සහ ඇමතුමකින් දුරස්ථ අංකය සම්බන්ධ වුවත් දුරකථන අංකය සහ උපාංග ID හඳුනා ගැනීමට මෙම අවසරය යෙදුමට අවසර දෙයි." + "උපාංගයේ දුරකථන විශේෂාංග වෙත ප්‍රවේශයට යෙදුමට ඉඩ දෙයි. ඇමතුම සක්‍රිය වුවත්, සහ ඇමතුමකින් දුරස්ථ අංකය සම්බන්ධ වුවත් දුරකථන අංකය සහ උපාංග ID හඳුනා ගැනීමට මෙම අවසරය යෙදුමට ඉඩ දෙයි." "ටැබ්ලටය නින්දෙන් වැළක්වීම" "රූපවාහිනිය නින්දට යාමෙන් නවත්වන්න" "දුරකථනය නින්දට යාමෙන් වළකන්න" @@ -457,13 +462,13 @@ "සමමුහුර්ත සැකසීම් කියවන්න" "ගිණුම සඳහා සමමුහුර්ත සැකසීම් කියවීමට යෙදුමට අවසර දෙන්න. උදාහරණයක් ලෙස, ගිණුමක් සමඟ පුද්ගල යෙදුම සමමුහුර්ත දැයි මෙයට හඳුනා ගත හැක." "සමමුහුර්ත කිරීම සක්‍රිය කරන්න සහ අක්‍රිය කරන්න" - "ගිණුම සඳහා සමමුහුර්ත සැකසීම් වෙනස් කිරීමට යෙදුමට අවසර දෙන්න. උදාහරණයක් ලෙස, ගිණුම සමඟ පුද්ගල යෙදුම සමමුහුර්ත කිරීම සක්‍රිය කිරීමට භාවිත කල හැක." + "ගිණුමක් සඳහා සමමුහුර්ත සැකසීම් විකරණය කිරීමට යෙදුමකට ඉඩ දෙයි. උදාහරණයක් ලෙස, ගිණුමක් සමඟ පුද්ගල යෙදුම සමමුහුර්ත කිරීම සබල කිරීමට මෙය භාවිත කළ හැක." "සමමුහුර්ත කිරීමේ සංඛ්‍යාන කියවීම" "සමමුහුර්ත කිරීමේ සිදුවීම් ඉතිහාසය සහ කෙතරම් දත්ත සමමුහුර්ත වී ඇතිදැයි ඇතුලත් ගිණුම සඳහා සමමුහුර්ත කිරීමේ සංඛ්‍යාන කියවීමට යෙදුමට අවසර දෙන්න." "ඔබගේ USB ආචයනය හි අන්තර්ගතය කියවන්න" "ඔබගේ SD කාඩ් පතෙහි අන්තර්ගතය කියවන්න" "යෙදුමට ඔබගේ USB ආචයනය අන්තර්ගතය කියවීමට අවසර දෙන්න." - "යෙදුමට ඔබගේ SD කාඩ් පතින් අන්තර්ගත කියවීමට අවසර දෙන්න." + "යෙදුමට ඔබගේ SD කාඩ්පතේ අන්තර්ගතය කියවීමට ඉඩ දෙයි." "ඔබගේ USB ආචයනයේ අන්තර්ගත වෙනස් කිරීම හෝ මැකීම" "ඔබගේ SD පතේ අන්තර්ගත වෙනස් කිරීම හෝ මැකීම" "USB ආචයනය වෙත ලිවීමට යෙදුමට අවසර දෙන්න." @@ -737,7 +742,7 @@ - "විජටය එකතු කරන්න." + "විජටය එක් කරන්න." "හිස්" "අගුළු අරින ප්‍රදේශය විදහා ඇත." "අගුළු අරින ප්‍රදේශය හැකිලී ඇත." @@ -950,7 +955,7 @@ "අස් කරන්න" "යළි කරන්න" "පෙළ තේරීම" - "ශබ්ද කෝෂයට එකතු කරන්න" + "ශබ්ද කෝෂයට එක් කරන්න" "මකන්න" "ආදාන ක්‍රමය" "පෙළ ක්‍රියාවන්" @@ -975,7 +980,7 @@ "විවෘත කරන්න" "සමඟ සංස්කරණය කරන්න" "%1$s සමඟ සංස්කරණය කරන්න" - "සංස්කරණය කරන්න" + "සංස්කරණය" "සමඟ බෙදාගන්න" "%s සමඟ බෙදාගන්න" "බෙදා ගන්න" @@ -1095,10 +1100,10 @@ "සම්බන්ධතාවයට ඉඩ දෙන්නද?" "යෙදුම් %1$s ක් WiFi ජාලය %2$s වෙත සම්බන්ධ කිරීමට කැමතියි" "යෙදුම" - "ඍජු Wi-Fi" - "ඍජු Wi-Fi ආරම්භ කරන්න. මෙය Wi-Fi සේවාදායක/හොට්ස්පොට් එක අක්‍රිය කරනු ඇත." - "ඍජු Wi-Fi ආරම්භ කළ නොහැක." - "Wi-Fi ඍජු සම්බන්ධතාව සක්‍රියයි" + "Wi-Fi Direct" + "Wi-Fi Direct ආරම්භ කරන්න. මෙය Wi-Fi සේවාදායක/හොට්ස්පොට් එක අක්‍රිය කරනු ඇත." + "Wi-Fi Direct ආරම්භ කළ නොහැක." + "Wi-Fi Direct ක්‍රියාත්මකයි" "සැකසීම් සඳහා තට්ටු කරන්න" "පිළිගන්න" "ප්‍රතික්ෂේප කරන්න" @@ -1210,6 +1215,8 @@ "ස්ථාපන සැසිය කියවීමට යෙදුමට ඉඩ දෙන්න. සක්‍රිය පැකේජ ස්ථාපනය පිළිබඳ විස්තර බැලීමට එයට මෙයින් ඉඩ දෙයි." "ස්ථාපන පැකේජ ඉල්ලීම" "ස්ථාපන පැකේජ ඉල්ලීමට යෙදුමකට අවසර දීම." + "බැටරි ප්‍රශස්තකරණ නොසලකා හැරීමට ඉල්ලන්න" + "යෙදුමකට එම යෙදුම සඳහා බැටරි ප්‍රශස්තකරණ නොසලකා හැරීමට අවසර ඉල්ලීමට ඉඩ දෙයි." "විශාලන පාලක සඳහා දෙවතාවක් තට්ටු කරන්න" "විජටය එකතු කිරීමට නොහැකි විය." "යන්න" @@ -1284,7 +1291,7 @@ "මැකීම් අස් කරන්න" "දැනට කිසිවක් නොකරන්න" "ගිණුමක් තෝරන්න" - "ගිණුමක් එකතු කරන්න" + "ගිණුමක් එක් කරන්න" "ගිණුමක් එක් කරන්න" "වැඩි කරන්න" "අඩු කරන්න" @@ -1330,7 +1337,7 @@ "USB ධාවකය" "%s USB ධාවකය" "USB ආචයනය" - "සංස්කරණය කරන්න" + "සංස්කරණය" "දත්ත භාවිතය ගැන ඇඟවීම" "භාවිතය සහ සැකසීම් බැලීමට තට්ටු කරන්න." "2G-3G දත්ත සීමාවට ළඟාවී ඇත" @@ -1376,7 +1383,7 @@ "HDMI" "පද්ධතිය" "බ්ලූටූත් ශ්‍රව්‍ය" - "රැහැන් රහිත දර්ශනය" + "නොරැහැන් සංදර්ශකය" "Cast" "උපාංගයට සම්බන්ධ වන්න" "තිරය උපාංගයට යොමු කරන්න" @@ -1560,7 +1567,7 @@ "වසර තෝරන්න" "%1$s මකා දමන ලදි" "වැඩ %1$s" - "මෙම තිරය ඇමුණුම් ඉවත් කිරීමට, ස්පර්ශ කර අල්ලා ගෙන සිටින්න." + "මෙම තිරය ඇමුණුම් ඉවත් කිරීමට, දළ විශ්ලේෂණය ස්පර්ශ කර අල්ලා ගෙන සිටින්න." "යෙදුම අමුණා ඇත: ගැලවීමට මෙම උපාංගය මත ඉඩ දිය නොහැකිය.‍" "තිරය අගුළු දමා ඇත" "තිරයේ අගුළු ඇර ඇත" @@ -1608,7 +1615,7 @@ "%1$s තෙක්" "%1$s තෙක් (ඊළඟ එලාමය)" - "ඔබ මෙය අක්‍රිය කරන තුරු" + "ඔබ මෙය ක්‍රියාවිරහිත කරන තුරු" "බාධා නොකරන්න ඔබ අක්‍රිය කරන තුරු" "%1$s / %2$s" "හකුළන්න" diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index a94c3b40d5dc..c2bcbf398d86 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problém s pripojením alebo neplatný kód MMI." "Operácia je obmedzená len na povolené čísla." + "Nastavenia presmerovania hovorov nie je možné zmeniť z telefónu počas roamingu." "Služba bola povolená." "Služba bola povolená pre:" "Služba bola vypnutá." @@ -98,6 +99,8 @@ "Hlasové a dátové služby sú zablokované." "Hlasové služby a služby SMS sú zablokované." "Všetky hlasové, údajové služby a služby SMS sú zablokované." + "Nepodarilo sa pripojiť k sieti" + "Ak chcete vylepšiť príjem, skúste zmeniť vybratý typ siete v časti Nastavenia > Mobilné siete > Preferovaný typ siete." "Používateľ, s ktorým komunikujete, požiadal o režim FULL textového telefónu" "Používateľ, s ktorým komunikujete, požiadal o režim HCO textového telefónu" "Používateľ, s ktorým komunikujete, požiadal o režim VCO textového telefónu" @@ -183,6 +186,8 @@ "Pracovný profil bol odstránený z dôvodu chýbajúcej správcovskej aplikácie." "Správcovská aplikácia pracovného profilu buď chýba, alebo je poškodená. Z toho dôvodu boli váš pracovný profil a s ním súvisiace údaje odstránené. Ak potrebujete pomoc, kontaktujte svojho správcu." "Váš pracovný profil už nie je na tomto zariadení dostupný." + "Sleduje sa sieťová premávka." + "Klepnutím získate ďalšie informácie" "Vaše zariadenie bude vymazané" "V správcovskej aplikácii chýbajú komponenty alebo je poškodená, a preto sa nedá použiť. Vaše zariadenie bude vymazané. Ak potrebujete pomoc, kontaktujte svojho správcu." "Ja" @@ -649,10 +654,10 @@ "Asistent" "Brat" "Dieťa" - "Partner(ka)" + "Druh(-žka)" "Otec" "Kamarát(ka)" - "Manažér" + "Vedúci(-a)" "Matka" "Rodič" "Partner(ka)" @@ -1258,6 +1263,8 @@ "Toto povolenie umožňuje aplikácii čítať relácie inštalácií a zobraziť tak podrobnosti o aktívnych inštaláciách balíkov." "odosielanie žiadostí o inštaláciu balíkov" "Umožňuje aplikácii vyžiadať inštaláciu balíkov." + "požiadať o ignorovanie optimalizácií výdrže batérie" + "Umožňuje aplikácii požiadať o povolenie ignorovať optimalizácie výdrže batérie pre danú aplikáciu." "Dvojitým klepnutím môžete ovládať priblíženie" "Miniaplikáciu sa nepodarilo pridať." "Hľadať" @@ -1612,7 +1619,7 @@ "Vyberte rok" "Číslo %1$s bolo odstránené" "Práca – %1$s" - "Ak chcete uvoľniť túto obrazovku, klepnite na tlačidlo Späť a podržte ho." + "Ak chcete odopnúť túto obrazovku, klepnite na tlačidlá Späť a Prehľad a podržte ich." "Aplikácia je pripnutá. Uvoľnenie nie je na tomto zariadení povolené." "Obrazovka bola pripnutá" "Obrazovka bola uvoľnená" diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index a19643b13533..99f1163742eb 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Težava s povezavo ali neveljavna koda MMI." "Operacija je omejena na dovoljene telefonske številke, za katere ne velja zapora odhodnega klica." + "Nastavitev preusmerjanja klicev ni mogoče spremeniti v telefonu med gostovanjem v tujem omrežju." "Storitev je omogočena." "Storitev je bila omogočena za:" "Storitev je onemogočena." @@ -98,6 +99,8 @@ "Storitvi za govor/podatke sta blokirani." "Storitvi za govor/SMS sta blokirani." "Vse storitve za govor/podatke/SMS so blokirane." + "Povezave z omrežjem ni mogoče vzpostaviti" + "Če želite izboljšati sprejem, poskusite zamenjati vrsto omrežja v »Nastavitve« > »Mobilna omrežja« > »Prednostna vrsta omrežja«." "Enakovredna naprava je zahtevala način TTY FULL" "Enakovredna naprava je zahtevala način TTY HCO" "Enakovredna naprava je zahtevala način TTY VCO" @@ -183,6 +186,8 @@ "Delovni profil izbrisan zaradi manjkajoče skrbniške aplikacije." "Skrbniška aplikacija delovnega profila manjka ali pa je poškodovana, zaradi česar je bil delovni profil s povezanimi podatki izbrisan. Za pomoč se obrnite na skrbnika." "Vaš delovni profil ni več na voljo v tej napravi." + "Omrežni promet je nadzorovan" + "Dotaknite se, če želite izvedeti več" "Podatki v napravi bodo izbrisani" "Skrbniška aplikacija je nepopolna ali poškodovana, zato je ni mogoče uporabiti. Podatki v napravi bodo izbrisani. Za pomoč se obrnite na skrbnika." "Jaz" @@ -656,7 +661,7 @@ "Mati" "Starši" "Partner" - "Predlagatelj:" + "Predlagatelj" "Sorodnik" "Sestra" "Zakonski partner" @@ -1258,6 +1263,8 @@ "Aplikaciji omogoča branje sej namestitev. Tako lahko bere podrobnosti o aktivnih namestitvah paketov." "zahtevanje paketov za namestitev" "Aplikaciji omogoča zahtevanje namestitve paketov." + "Dovoljenje za prezrtje optimizacij akumulatorja" + "Aplikaciji dovoljuje, da vpraša za dovoljenje, ali naj prezre optimizacije akumulatorja." "Tapnite dvakrat za nadzor povečave/pomanjšave" "Pripomočka ni bilo mogoče dodati." "Pojdi" @@ -1284,7 +1291,7 @@ "Ozadje" "Spreminjanje ozadja" "Poslušalec obvestil" - "Poslušalec za navidezno resničnost" + "Poslušalec za VR" "Ponudnik pogojev" "Storitev za določanje stopenj pomembnosti obvestil" "VPN aktiviran" @@ -1612,7 +1619,7 @@ "Izberite leto" "Številka %1$s je izbrisana" "%1$s za delo" - "Če želite odpeti ta zaslon, se dotaknite tipke za nazaj in jo pridržite." + "Če želite odpeti ta zaslon, hkrati pridržite gumba Nazaj in Pregled." "Aplikacija je pripeta: v tej napravi odpenjanje ni dovoljeno." "Zaslon je pripet" "Zaslon je odpet" diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 624b00466a75..339ac59d1a90 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problem në lidhje ose kod i pavlefshëm MMI-je." "Veprimi është i kufizuar vetëm kundrejt numrave me telefonim të përzgjedhur" + "Cilësimet e transferimit të telefonatave nuk mund të ndryshohen nga telefoni yt kur je në roaming." "Shërbimi u aktivizua." "Shërbimi u aktivizua për:" "Shërbimi është çaktivizuar." @@ -96,6 +97,8 @@ "Shërbimet zanore/të të dhënave janë bllokuar." "Shërbimet me zë/SMS-të janë të bllokuara." "Të gjitha shërbimet me zë/të të dhënave/SMS-të janë bllokuar." + "Rrjeti i paarritshëm" + "Për të përmirësuar marrjen e sinjalit, provo të ndryshosh llojin e zgjedhur te Cilësimet > Rrjetet celulare > Lloji i preferuar i rrjetit." "Homologu yt kërkoi modalitet \"TTY\" të plotë" "Homologu kërkoi modalitet \"TTY\" të llojit \"HCO\"" "Homologu yt kërkoi modalitet \"TTY\" të llojit \"VCO\"" @@ -179,6 +182,8 @@ "Profili i punës u fshi për shkak të mungesës së aplikacionit të administratorit." "Aplikacioni i administratorit të profilit të punës mungon ose është dëmtuar. Si rezultat i kësaj, profili yt i punës dhe të dhënat përkatëse janë fshirë. Kontakto administratorin tënd për ndihmë." "Profili yt i punës nuk është më i disponueshëm në këtë pajisje." + "Trafiku i rrjetit po monitorohet" + "Trokit për të mësuar më shumë" "Pajisja do të spastrohet" "Aplikacionit të administratorit i mungojnë përbërësit ose është dëmtuar dhe nuk mund të përdoret. Pajisja jote tani do të fshihet. Kontakto administratorin tënd për ndihmë." "Unë" @@ -1208,6 +1213,8 @@ "Lejon një aplikacion të lexojë sesionet e instalimit. Kjo e lejon atë të shohë detaje rreth instalimeve të paketave aktive." "kërko paketat e instalimit" "Lejon që një aplikacion të kërkojë instalimin e paketave." + "kërko të shpërfillësh optimizimet e baterisë" + "Lejon që një aplikacion të kërkojë leje për të shpërfillur optimizimet e baterisë për atë aplikacion." "Trokit dy herë për të kontrolluar zmadhimin" "Nuk mundi të shtonte miniaplikacion." "Shko" @@ -1558,7 +1565,7 @@ "Përzgjidh vitin" "%1$s u fshi" "Puna %1$s" - "Për të hequr gozhdimin e ekranit, prek dhe mbaj të shtypur \"Prapa\"." + "Për të hequr gozhdimin e ekranit, prek dhe mbaj të shtypur \"Prapa\" dhe \"Përmbledhja\"." "Ekrani është i gozhduar. Anulimi i mbërthimit nuk lejohet nga organizata jote." "Ekrani u gozhdua" "Ekrani u hoq nga gozhdimi" diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 395b049c1d2d..7bba6fe1e26f 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Проблеми са везом или неважећи MMI кôд." "Рад је ограничен само на бројеве фиксног бирања." + "Не можете да промените подешавања преусмеравања позива са телефона док сте у ромингу." "Услуга је омогућена." "Услуга је омогућена за:" "Услуга је онемогућена." @@ -97,6 +98,8 @@ "Гласовна услуга/услуга преноса података су блокиране." "Гласовна услуга и SMS услуга су блокиране." "Све гласовне и SMS услуге, као и услуге преноса података су блокиране." + "Повезивање са мрежом није успело" + "Да бисте побољшали пријем, пробајте да промените изабрани тип у одељку Подешавања > Мобилне мреже > Жељени тип мреже." "Корисник захтева ПОТПУН режим TTY" "Корисник захтева ПРЕНОС ЗВУКА за режим TTY" "Корисник захтева ПРЕНОС ГЛАСА за режим TTY" @@ -181,6 +184,8 @@ "Пословни профил је избрисан јер недостаје администраторска апликација." "Администраторска апликација пословног профила недостаје или је оштећена. Због тога су ваш пословни профил и повезани подаци избрисани. Обратите се администратору за помоћ." "Профил за Work више није доступан на овом уређају." + "Мрежни саобраћај се прати" + "Додирните да бисте сазнали више" "Уређај ће бити обрисан" "Администраторској апликацији недостају неке компоненте или је оштећена и не може да се користи. Уређај ће сада бити обрисан. Обратите се администратору за помоћ." "Ја" @@ -371,7 +376,7 @@ "слање команди на SIM" "Омогућава апликацији да шаље команде SIM картици. То је веома опасно." "снимање фотографија и видео снимака" - "Дозвољава апликацији да снима слике и видео снимке камером. Ова дозвола омогућава апликацији да у било ком тренутку користи камеру без ваше потврде." + "Дозвољава апликацији да снима слике и видео камером. Ова дозвола омогућава апликацији да у било ком тренутку користи камеру без ваше потврде." "контрола вибрације" "Дозвољава апликацији да контролише вибрацију." "директно позивање бројева телефона" @@ -1233,6 +1238,8 @@ "Дозвољава апликацији да чита сесије инсталирања. То јој дозвољава да види детаље о активним инсталацијама пакета." "захтевање пакета за инсталирање" "Омогућава да апликација захтева инсталацију пакета." + "тражење дозволе за игнорисање оптимизација батерије" + "Дозвољава апликацији да тражи дозволу за игнорисање оптимизација батерије за ту апликацију." "Додирните двапут за контролу зумирања" "Није могуће додати виџет." "Иди" @@ -1585,7 +1592,7 @@ "Изаберите годину" "Избрисали сте %1$s" "%1$s на послу" - "Да бисте откачили овај екран, додирните и задржите Назад." + "Да бисте откачили овај екран, додирните и задржите Назад и Преглед." "Апликација је закачена: откачињање није дозвољено на овом уређају." "Екран је закачен" "Екран је откачен" diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index d43282db7686..c2b919eac86b 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Anslutningsproblem eller ogiltig MMI-kod." "Endast fasta nummer kan användas." + "Det går inte att ändra inställningarna för vidarebefordran av samtal medan mobilen är i roaming-läge." "Tjänsten har aktiverats." "Tjänsten har aktiverats för:" "Tjänsten har inaktiverats." @@ -82,10 +83,10 @@ "Avvisande av oönskade irriterande samtal" "Leverans av nummer för inkommande samtal" "Stör ej" - "Nummerpresentatören är begränsad som standard. Nästa samtal: Begränsad" - "Nummerpresentatörens standardinställning är begränsad. Nästa samtal: Inte begränsad" - "Nummerpresentatörens standardinställning är inte begränsad. Nästa samtal: Begränsad" - "Nummerpresentatörens standardinställning är inte begränsad. Nästa samtal: Inte begränsad" + "Nummerpresentatören är blockerad som standard. Nästa samtal: Blockerad" + "Nummerpresentatörens standardinställning är blockerad. Nästa samtal: Inte blockerad" + "Nummerpresentatörens standardinställning är inte blockerad. Nästa samtal: Blockerad" + "Nummerpresentatörens standardinställning är inte blockerad. Nästa samtal: Inte blockerad" "Tjänsten är inte etablerad." "Det går inte att ändra inställningen för nummerpresentatör." "Datatjänsten är blockerad." @@ -96,6 +97,8 @@ "Röst- och datatjänster är blockerade." "Röst- och SMS-tjänster är blockerade." "Alla röst-, data- och SMS-tjänster är blockerade." + "Det går inte att nå nätverket" + "Testa om du får bättre mottagning genom att ändra till en annan typ under Inställningar > Mobilnät > Önskad nätverkstyp." "Peer-enheten begärde texttelefonläget FULL" "Peer-enheten begärde texttelefonläget HCO" "Peer-enheten begärde texttelefonläget VCO" @@ -179,6 +182,8 @@ "Jobbprofilen har raderats eftersom det saknas en administratörsapp." "Administratörsappen för jobbprofilen saknas eller är skadad. Det innebär att jobbprofilen och all relaterad data har raderats. Kontakta administratören om du vill ha hjälp." "Din jobbprofil är inte längre tillgänglig på den här enheten." + "Nätverkstrafiken övervakas" + "Tryck här om du vill läsa mer" "Enheten kommer att rensas" "Administratörsappen saknar delar eller är skadad och kan inte användas. Enheten kommer nu att rensas. Kontakta administratören om du behöver hjälp." "Jag" @@ -650,7 +655,7 @@ "Mamma" "Förälder" "Partner" - "Genom" + "Känner genom" "Släkting" "Syster" "Make/maka" @@ -667,11 +672,11 @@ "Ange lösenord för att låsa upp" "Ange PIN-kod för att låsa upp" "Fel PIN-kod." - "Tryck på Menu och sedan på 0 om du vill låsa upp." + "Tryck på Menu och sedan på 0 för att låsa upp." "Nödsamtalsnummer" "Ingen tjänst" "Skärmen har låsts." - "Tryck på Menu om du vill låsa upp eller ringa nödsamtal." + "Tryck på Menu för att låsa upp eller ringa nödsamtal." "Tryck på Menu för att låsa upp." "Rita grafiskt lösenord för att låsa upp" "Nödsamtal" @@ -1208,6 +1213,8 @@ "Tillåt appen att läsa installationssessioner. Det ger den tillgång till uppgifter om aktiva paketinstallationer." "begära installationspaket" "Tillåter att en app begär paketinstallation." + "får be om tillstånd att ignorera batterioptimering" + "Appen får be om tillstånd att ignorera batterioptimering." "Peka två gånger för zoomkontroll" "Det gick inte att lägga till widgeten." "Kör" @@ -1234,7 +1241,7 @@ "Bakgrund" "Ändra bakgrund" "Meddelandelyssnare" - "Lyssnare för virtuell verklighet" + "Lyssnare för VR" "Leverantör" "Rankningstjänst för aviseringar" "VPN är aktiverat" @@ -1558,7 +1565,7 @@ "Välj år" "%1$s har tagits bort" "%1$s för arbetet" - "Om du vill lossa skärmen trycker du länge på Tillbaka." + "Om du vill lossa skärmen trycker du länge på Tillbaka och Översikt." "Appen är fäst. Att lossa den är inte tillåtet på den här enheten." "Skärmen är fäst" "Skärmen är inte längre fäst" diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index cc750d6f37bb..261ec7ff3eb9 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Tatizo la muunganisho au msimbo batili MMI." "Uendeshaji umepunguzwa kwa namba za upigaji simu za kudumu pekee." + "Haiwezi kubadilisha mipangilio ya kusambaza simu kutoka kwenye simu yako ukiwa unatumia mitandao mingine." "Huduma iliwezeshwa" "Huduma iliwezesha kwa:" "Hitilafu ya huduma!" @@ -96,6 +97,8 @@ "Huduma za sauti/data zimezuiwa." "Huduma za Sauti/Ujumbe mfupi zimezuiwa." "Huduma zote za Sauti/data/SMS zimezuiwa." + "Haiwezi kufikia mtandao" + "Ili uboreshe upokeaji, jaribu kubadilisha aina iliyochaguliwa katika Mipangilio > Mitandao ya simu > Aina ya mtandao unaopendelea." "Hali ya TTY iliyoombwa na mtandao mwenza KAMILI" "Hali ya TTY iliyoombwa na mtandao mwenza HCO" "Hali ya TTY iliyoombwa na mtandao mwenza VCO" @@ -177,6 +180,8 @@ "Wasifu wa kazini umefutwa kutokana na kupotea kwa programu ya msimamizi." "Programu ya msimamizi wa wasifu wa kazini imepotea au ina hitilafu. Kwa sbabu hiyo, wasifu wako wa kazini na data husika imefutwa. Wasiliana na msimamizi wako kwa usaidizi." "Wasifu wako wa kazini haupatikani tena kwenye kifaa hiki." + "Trafiki ya mtandao inachunguzwa" + "Gonga ili upate maelezo zaidi" "Data iliyomo kwenye kifaa chako itafutwa" "Programu ya msimamizi inakosa vipengele au ina hitilafu, na haiwezi kutumika. Data iliyomo kwenye kifaa chako sasa itafutwa. Wasiliana na msimamizi wako kwa usaidizi." "Mimi" @@ -1206,6 +1211,8 @@ "Huruhusu programu kusoma vipindi vya kusanikisha. Hii huiruhusu kuona maelezo kuhusu usanikishaji wa programu unaoendelea." "omba ruhusa ya kusakinisha vifurushi" "Huruhusu programu kuomba idhini ya kusakinisha vifurushi." + "omba kupuuza uimarishji wa betri" + "Huruhusu programu kuomba ruhusa ya kupuuza uimarishaji wa betri katika programu yako." "Gonga mara mbili kwa udhibiti wa kuza" "Haikuweza kuongeza wijeti." "Nenda" @@ -1232,7 +1239,7 @@ "Mandhari" "Badilisha mandhari" "Kisikilizi cha arifa" - "Kisikilizaji cha Uhalisia Pepe" + "Kisikilizaji cha VR" "Mtoa masharti" "Huduma ya kupanga arifa" "VPN imewezeshwa" @@ -1556,7 +1563,7 @@ "Chagua mwaka" "%1$s kimefutwa" "Ya kazini %1$s" - "Ili kubandua skrini hii, gusa na ushikilie Nyuma." + "Ili kubandua skrini hii, gusa na ushikilie kitufe cha Nyuma na Muhtasari." "Programu imebanwa: Kubanuliwa hakuruhusiwi kwenye kifaa hiki." "Skrini imebandikwa" "Skrini imebanduliwa" diff --git a/core/res/res/values-sw900dp/dimens.xml b/core/res/res/values-sw900dp/dimens.xml new file mode 100644 index 000000000000..11092b2cb9e9 --- /dev/null +++ b/core/res/res/values-sw900dp/dimens.xml @@ -0,0 +1,27 @@ + + + + + + 56dp + + + 56dp + + diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index 20226e9c856a..271e8855d40c 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "இணைப்பு சிக்கல் அல்லது தவறான MMI குறியீடு." "நிலையான அழைப்பு எண்களுக்கு மட்டுமே எனச் செயல்பாடு வரையறுக்கப்பட்டுள்ளது." + "ரோமிங்கில் இருக்கும் போது, உங்கள் மொபைலிலிருந்து அழைப்புப் பகிர்வு அமைப்புகளை மாற்ற முடியாது." "சேவை இயக்கப்பட்டுள்ளது." "சேவை பின்வருவதற்கு இயக்கப்பட்டுள்ளது:" "சேவை முடக்கப்பட்டுள்ளது." @@ -96,6 +97,8 @@ "குரல்/தரவு சேவைகள் தடைசெய்யப்பட்டுள்ளன." "குரல்/SMS சேவைகள் தடைசெய்யப்பட்டுள்ளன." "எல்லா குரல்/தரவு/SMS சேவைகள் தடைசெய்யப்பட்டுள்ளன." + "நெட்வொர்க்குடன் இணைக்க முடியவில்லை" + "பெறுதலை மேம்படுத்த, அமைப்புகள் > செல்லுலார் நெட்வொர்க்குகள் > விரும்பும் நெட்வொர்க் வகை என்பதில் தேர்ந்தெடுத்த நெட்வொர்க் வகையை மாற்றவும்." "TTY Mode FULLஐ இணைச் செயல்பாடு கோரியது" "TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது" "TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது" @@ -179,6 +182,8 @@ "நிர்வாகி பயன்பாடு இல்லாததனால், பணி சுயவிவரம் நீக்கப்பட்டது." "பணி சுயவிவர நிர்வாகி பயன்பாடு இல்லை அல்லது சேதமடைந்துள்ளது. இதன் விளைவாக, உங்கள் பணி சுயவிவரமும், அதனுடன் தொடர்புடைய தரவும் நீக்கப்பட்டன. உதவிக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்." "சாதனத்தில் இனி பணி சுயவிவரம் கிடைக்காது." + "நெட்வொர்க் ட்ராஃபிக் கண்காணிக்கப்படுகிறது" + "மேலும் அறிய, தட்டவும்" "சாதனத் தரவு அழிக்கப்படும்" "நிர்வாகி பயன்பாடு இல்லை அல்லது சேதமடைந்துள்ளது மற்றும் பயன்படுத்த முடியாது. இப்போது சாதனத் தரவு அழிக்கப்படும். உதவிக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்." "நான்" @@ -1208,6 +1213,8 @@ "நிறுவல் அமர்வுகளைப் படிக்க, பயன்பாட்டை அனுமதிக்கிறது. இது செயல்படும் தொகுப்பு நிறுவல்களைப் பற்றிய விவரங்களைப் பார்க்க அனுமதிக்கிறது." "நிறுவல் தொகுப்புகளைக் கோருதல்" "தொகுப்புகளின் நிறுவலைக் கோர, பயன்பாட்டை அனுமதிக்கும்." + "பேட்டரி மேம்படுத்தல்களைப் புறக்கணிப்பதற்கான அனுமதியைக் கோரு" + "பயன்பாட்டிற்கான பேட்டரி மேம்படுத்தல்களைப் புறக்கணிப்பதற்கான அனுமதியைக் கோர, பயன்பாட்டை அனுமதிக்கும்." "அளவை மாற்றுவதற்கான கட்டுப்பாட்டிற்கு, இருமுறை தட்டவும்" "விட்ஜெட்டைச் சேர்க்க முடியவில்லை." "செல்" @@ -1558,7 +1565,7 @@ "ஆண்டைத் தேர்ந்தெடுக்கவும்" "%1$s நீக்கப்பட்டது" "பணியிடம் %1$s" - "இந்தத் திரையை விலக்க, \"முந்தையது\" பொத்தானைத் தொட்டுப் பிடிக்கவும்." + "இந்தத் திரையை அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வை ஆகிய இரண்டையும் தொட்டுப் பிடித்திருக்கவும்." "பயன்பாடு பொருத்தப்பட்டது: பொருத்தியதை நீக்குவதற்கு இந்தச் சாதனத்தில் அனுமதியில்லை." "திரை பின் செய்யப்பட்டது" "திரையின் பின் அகற்றப்பட்டது" diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 072b69bcaefc..cd67c80e56cb 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "కనెక్షన్ సమస్య లేదా చెల్లని MMI కోడ్." "చర్య స్థిరమైన డయలింగ్ నంబర్‌లకు మాత్రమే పరిమితం చేయబడింది." + "మీరు రోమింగ్‌లో ఉన్నప్పుడు మీ ఫోన్‌ నుండి కాల్ ఫార్వార్డింగ్ సెట్టింగ్‌లను మార్చలేరు." "సేవ ప్రారంభించబడింది." "వీటి కోసం సేవ ప్రారంభించబడింది:" "సేవ నిలిపివేయబడింది." @@ -96,6 +97,8 @@ "వాయిస్/డేటా సేవలు బ్లాక్ చేయబడ్డాయి." "వాయిస్/SMS సేవలు బ్లాక్ చేయబడ్డాయి." "అన్ని వాయిస్/డేటా/SMS సేవలు బ్లాక్ చేయబడ్డాయి." + "నెట్‌వర్క్‌ను చేరుకోలేరు" + "స్వీకరణను మెరుగుపరచడానికి, సెట్టింగ్‌లు > సెల్యులార్ నెట్‌వర్క్‌లు > ప్రాధాన్య నెట్‌వర్క్ రకం ఎంపికలో ఎంచుకున్న రకాన్ని మార్చడానికి ప్రయత్నించండి." "అవతలి వారు FULL TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు HCO TTY మోడ్‌ని అభ్యర్థించారు" "అవతలి వారు VCO TTY మోడ్‌ని అభ్యర్థించారు" @@ -179,6 +182,8 @@ "నిర్వాహక అనువర్తనం లేనందున కార్యాలయ ప్రొఫైల్ తొలగించబడింది." "కార్యాలయ ప్రొఫైల్ నిర్వాహక అనువర్తనం లేదు లేదా పాడైంది. తత్ఫలితంగా, మీ కార్యాలయ ప్రొఫైల్ మరియు సంబంధిత డేటా తొలగించబడ్డాయి. సహాయం కోసం మీ నిర్వాహకుడిని సంప్రదించండి." "ఈ పరికరంలో మీ కార్యాలయ ప్రొఫైల్ ఇప్పుడు అందుబాటులో లేదు." + "నెట్‌వర్క్ ట్రాఫిక్ పర్యవేక్షించబడుతోంది" + "మరింత తెలుసుకోవడానికి నొక్కండి" "మీ పరికరంలోని డేటా తొలగించబడుతుంది" "నిర్వాహక అనువర్తనంలో కొన్ని అంతర్భాగాలు లేవు లేదా అది పాడైపోయి, నిరుపయోగంగా మారింది. మీ పరికరంలోని డేటా ఇప్పుడు తొలగించబడుతుంది. సహాయం కోసం మీ నిర్వాహకుడిని సంప్రదించండి." "నేను" @@ -1208,6 +1213,8 @@ "ఇన్‌స్టాల్ సెషన్‌లను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది సక్రియ ప్యాకేజీ ఇన్‌స్టాలేషన్‌ల గురించి వివరాలను చూడటానికి అనువర్తనాన్ని అనుమతిస్తుంది." "ఇన్‌స్టాల్ ప్యాకేజీలను అభ్యర్థించడం" "ప్యాకేజీల ఇన్‌స్టాలేషన్ అభ్యర్థించడానికి అనువర్తనాన్ని అనుమతిస్తుంది." + "బ్యాటరీ అనుకూలీకరణలను విస్మరించడానికి అడగాలి" + "ఆ అనువర్తనం కోసం బ్యాటరీ అనుకూలీకరణలు విస్మరించేలా అనుమతి కోరడానికి అనువర్తనాన్ని అనుమతిస్తుంది." "జూమ్ నియంత్రణ కోసం రెండుసార్లు నొక్కండి" "విడ్జెట్‌ను జోడించడం సాధ్యపడలేదు." "వెళ్లు" @@ -1558,7 +1565,7 @@ "సంవత్సరాన్ని ఎంచుకోండి" "%1$s తొలగించబడింది" "కార్యాలయం %1$s" - "ఈ స్క్రీన్‌ని అన్‌పిన్ చేయడానికి, వెనుకకు తాకి & అలాగే పట్టుకోండి." + "ఈ స్క్రీన్‌ను అన్‌పిన్ చేయడానికి, వెనుకకు మరియు స్థూలదృష్టి తాకి & అలాగే పట్టుకోండి." "అనువర్తనం పిన్ చేయబడింది: ఈ పరికరంలో అన్‌పిన్ చేయడానికి అనుమతి లేదు." "స్క్రీన్ పిన్ చేయబడింది" "స్క్రీన్ అన్‌పిన్ చేయబడింది" diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index c2515908dd7b..fbbca8929eb1 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "ปัญหาการเชื่อมต่อหรือรหัส MMI ไม่ถูกต้อง" "การดำเนินการถูกจำกัดไว้ที่การจำกัดหมายเลขโทรออกเท่านั้น" + "ไม่สามารถเปลี่ยนการตั้งค่าการโอนสายจากโทรศัพท์ในขณะที่โรมมิ่ง" "เปิดใช้งานบริการแล้ว" "เปิดการใช้งานบริการสำหรับ:" "ปิดใช้บริการไว้" @@ -96,6 +97,8 @@ "บริการเสียง/ข้อมูลถูกบล็อก" "บริการเสียง/SMS ถูกปิดกั้น" "บริการเสียง/ข้อมูล/SMS ทั้งหมดถูกบล็อก" + "เข้าถึงเครือข่ายไม่ได้" + "เพื่อให้การรับสัญญาณดีขึ้น ลองเปลี่ยนประเภทที่เลือกที่ \"การตั้งค่า\" > \"เครือข่ายมือถือ\" > \"ประเภทเครือข่ายที่ต้องการ\"" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"เต็ม\"" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"HCO\"" "อีกฝั่งหนึ่งขอโหมด TTY เป็น \"VCO\"" @@ -179,6 +182,8 @@ "ลบโปรไฟล์งานแล้วเนื่องจากไม่มีแอปผู้ดูแลระบบ" "แอปผู้ดูแลระบบโปรไฟล์งานไม่มีอยู่หรือเสียหาย ระบบจึงทำการลบโปรไฟล์งานและข้อมูลที่เกี่ยวข้องของคุณออก โปรดติดต่อผู้ดูแลระบบเพื่อรับความช่วยเหลือ" "โปรไฟล์งานของคุณไม่สามารถใช้บนอุปกรณ์นี้ได้อีกต่อไป" + "มีการติดตามดูการจราจรของข้อมูลในเครือข่าย" + "แตะเพื่อเรียนรู้เพิ่มเติม" "ระบบจะลบข้อมูลในอุปกรณ์ของคุณ" "แอปผู้ดูแลระบบมีองค์ประกอบไม่ครบหรือเสียหาย และใช้งานไม่ได้ ระบบจะลบข้อมูลอุปกรณ์ของคุณ โปรดติดต่อผู้ดูแลระบบเพื่อรับความช่วยเหลือ" "ฉัน" @@ -1208,6 +1213,8 @@ "อนุญาตให้แอปพลิเคชันอ่านเซสชันการติดตั้ง ซึ่งจะอนุญาตให้อ่านรายละเอียดเกี่ยวกับการติดตั้งแพ็กเกจที่ใช้งาน" "ขอติดตั้งแพ็กเกจ" "อนุญาตให้แอปพลิเคชันขอการติดตั้งแพ็กเกจ" + "ขอเพิกเฉยต่อการเพิ่มประสิทธิภาพแบตเตอรี่" + "อนุญาตให้แอปขอสิทธิ์เพิกเฉยต่อการเพิ่มประสิทธิภาพแบตเตอรี่สำหรับแอปนั้น" "แตะสองครั้งเพื่อควบคุมการซูม" "ไม่สามารถเพิ่มวิดเจ็ต" "ไป" @@ -1234,7 +1241,7 @@ "วอลเปเปอร์" "เปลี่ยนวอลเปเปอร์" "ตัวฟังการแจ้งเตือน" - "Listener ความเป็นจริงเสมือน" + "VR Listener" "ผู้เสนอเงื่อนไข" "บริการตัวจัดอันดับการแจ้งเตือน" "VPN เปิดใช้งานแล้ว" @@ -1547,7 +1554,7 @@ "ลองอีกครั้งในภายหลัง" "กำลังดูแบบเต็มหน้าจอ" - "หากต้องการออกไป ให้เลื่อนลงจากด้านบน" + "หากต้องการออก ให้เลื่อนลงจากด้านบน" "รับทราบ" "เสร็จสิ้น" "ตัวเลื่อนหมุนระบุชั่วโมง" @@ -1558,7 +1565,7 @@ "เลือกปี" "ลบ %1$s แล้ว" "%1$sที่ทำงาน" - "หากต้องการเลิกตรึงหน้าจอนี้ แตะ \"กลับ\" ค้างไว้" + "หากต้องการเลิกตรึงหน้าจอนี้ ให้แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้" "มีการตรึงแอป: ไม่อนุญาตให้เลิกตรึงบนอุปกรณ์นี้" "ตรึงหน้าจอแล้ว" "เลิกตรึงหน้าจอแล้ว" diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index b0d84ea51ba4..0cabf8706a7d 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Problema sa koneksyon o di-wastong MMI code." "Pinaghihigpitan ang pagpapatakbo sa mga fixed dialing number lang." + "Hindi maaaring baguhin ang mga setting ng pagpapasa ng tawag mula sa iyong telepono habang naka-roaming ka." "Pinagana ang serbisyo." "Pinagana ang serbisyo para sa:" "Hindi pinagana ang serbisyo." @@ -96,6 +97,8 @@ "Naka-block ang mga serbisyo sa boses/data." "Naka-block ang mga serbisyo ng Voice/SMS." "Naka-block ang lahat ng serbisyo sa boses/data/SMS." + "Hindi maabot ang network" + "Upang mapahusay ang reception, subukang baguhin ang uring napili sa Mga Setting > Mga cellular network > Gustong uri ng network." "Hiniling ng peer ang TTY Mode FULL" "Hiniling ng peer ang TTY Mode HCO" "Hiniling ng peer ang TTY Mode VCO" @@ -179,6 +182,8 @@ "Na-delete ang profile sa trabaho dahil wala itong admin app." "Ang admin app ng profile sa trabaho ay nawawala o sira. Bilang resulta, na-delete na ang iyong profile sa trabaho at nauugnay na data. Makipag-ugnayan sa iyong administrator para sa tulong." "Hindi na available ang iyong profile sa trabaho sa device na ito." + "Sinusubaybayan ang trapiko sa network" + "I-tap upang matuto pa" "Buburahin ang iyong device" "Ang admin app ay may mga kulang na bahagi o sira, at hindi ito magagamit. Buburahin na ngayon ang iyong device. Makipag-ugnayan sa iyong administrator para sa tulong." "Ako" @@ -244,23 +249,23 @@ "Lumipat sa Personal" "Lumipat sa para sa Trabaho" "Mga Contact" - "ina-access ang iyong mga contact" + "i-access ang iyong mga contact" "Lokasyon" "i-access ang lokasyon ng device na ito" "Kalendaryo" - "ina-access ang iyong kalendaryo" + "i-access ang iyong kalendaryo" "SMS" "magpadala at tumingin ng mga mensaheng SMS" "Imbakan" - "mag-access ng mga larawan, media at file sa iyong device" + "i-access ang mga larawan, media at file sa iyong device" "Mikropono" "mag-record ng audio" "Camera" "kumuha ng mga larawan at mag-record ng video" "Telepono" - "tumatawag sa telepono at namamahala sa mga tawag sa telepono" + "tumawag at mamahala ng mga tawag sa telepono" "Mga Sensor ng Katawan" - "i-access ang data ng sensor tungkol sa iyong mahahalagang senyales" + "i-access ang data ng sensor tungkol sa iyong vital signs" "Kunin ang content ng window" "Siyasatin ang nilalaman ng isang window kung saan ka nakikipag-ugnayan." "I-on ang Explore by Touch" @@ -1208,6 +1213,8 @@ "Pinapayagan ang isang application na magbasa ng mga session ng pag-install. Nagbibigay-daan ito upang makita ang mga detalye tungkol sa mga aktibong pag-install ng package." "humiling ng mga package sa pag-install" "Pinapayagan ang isang application na hilingin ang pag-install ng mga package." + "hilingin na balewalain ang mga pag-optimize ng baterya" + "Pinapayagang humingi ng pahintulot ang isang app na balewalain ang mga pag-optimize ng baterya para sa app na iyon." "Tapikin ng dalawang beses para sa pagkontrol ng zoom" "Hindi maidagdag ang widget." "Pumunta" @@ -1558,7 +1565,7 @@ "Pumili ng taon" "Tinanggal ang %1$s" "%1$s sa Trabaho" - "Upang i-unpin ang screen na ito, pindutin nang matagal ang Bumalik." + "Upang i-unpin ang screen na ito, pindutin nang matagal ang Bumalik at Pangkalahatang-ideya." "Naka-pin ang app: Hindi pinapayagan ang pag-a-unpin sa device na ito." "Naka-pin ang screen" "Naka-unpin ang screen" diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index a089fd42feb6..1043e93b07c8 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Bağlantı sorunu veya geçersiz MMI kodu." "İşlem sadece sabit arama numaralarıyla sınırlandırılmıştır." + "Dolaşımdayken telefonunuzdan çağrı yönlendirme ayarları değiştirilemiyor." "Hizmet etkindi." "Hizmet şunun için etkinleştirildi:" "Hizmet devre dışı bırakıldı." @@ -96,6 +97,8 @@ "Ses/Veri hizmetleri engellendi." "Ses/SMS hizmetleri engellendi." "Tüm Ses/Veri/SMS hizmetleri engellendi." + "Ağa erişilemiyor" + "Sinyal gücünü iyileştirmek için Ayarlar > Hücresel ağlar > Tercih Edilen Ağ Modu\'ndan seçili türü değiştirmeyi deneyin." "Karşı taraf TTY Modunu TAM yaptı" "Karşı taraf TTY Modunu HCO yaptı" "Karşı taraf TTY Modunu VCO yaptı" @@ -179,6 +182,8 @@ "Eksik yönetici uygulaması nedeniyle iş profili silindi." "İş profili yönetici uygulaması eksik ya da bozuk. Bunun sonucunda iş profiliniz ve ilgili veriler silindi. Yardım almak için yöneticiniz ile iletişim kurun." "İş profiliniz arık bu cihazda kullanılamıyor." + "Ağ trafiği izleniyor" + "Daha fazla bilgi için dokunun" "Cihazınız silinecek" "Yönetici uygulamasında bileşen eksik ya da uygulama bozuk ve kullanılamaz durumda. Cihazınız şimdi silinecek. Yardım için yöneticinizle iletişim kurun." "Ben" @@ -605,7 +610,7 @@ "Telsiz" "Teleks" "TTY TDD" - "İş Cep Telefonu" + "İş Mobil" "İş Çağrı Cihazı" "Yardımcı" "MMS" @@ -649,7 +654,7 @@ "Yönetici" "Anne" "Ebeveyn" - "Hayat Arkadaşı" + "Ortak" "Öneren" "Akraba" "Kız Kardeş" @@ -773,7 +778,7 @@ "Bu sayfada kal" "%s\n\nBu sayfadan ayrılmak istediğinizden emin misiniz?" "Onayla" - "İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez hafifçe dokunun." + "İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez dokunun." "Otomatik Doldur" "Otomatik doldurma ayarla" " " @@ -1133,7 +1138,7 @@ "UYGULAMAYI AL" "ŞİMDİ DEĞİL" "Yeni SIM kart takıldı" - "Kurmak için hafifçe dokunun" + "Kurmak için dokunun" "Saati ayarlayın" "Tarihi ayarlayın" "Ayarla" @@ -1208,6 +1213,8 @@ "Bir uygulamanın yükleme oturumlarını okumasına izin verir. Bu, etkin paket yüklemeleriyle ilgili ayrıntıların görülmesine olanak tanır." "paket yükleme isteğinde bulunma" "Uygulamaya, paketleri yükleme isteğinde bulunma izni verir." + "pil optimizasyonlarını göz ardı etme izni iste" + "Bir uygulamanın, kendisi için pil optimizasyonlarını göz ardı etme izni istemesine olanak sağlar." "Zum denetimi için iki kez dokun" "Widget eklenemedi." "Git" @@ -1234,7 +1241,7 @@ "Duvar Kağıdı" "Duvar kağıdını değiştir" "Bildirim dinleyici" - "Sanal Gerçeklik dinleyici" + "VR dinleyici" "Durum sağlayıcı" "Bildirim sıralama hizmeti" "VPN etkinleştirildi" @@ -1531,7 +1538,7 @@ "bilinmiyor" "Yazdırma hizmeti etkin değil" "%s hizmeti yüklendi" - "Etkinleştirmek için hafifçe dokunun" + "Etkinleştirmek için dokunun" "Yönetici PIN\'ini girin" "PIN\'i girin" "Yanlış" @@ -1558,7 +1565,7 @@ "Yılı seçin" "%1$s silindi" "%1$s (İş)" - "Bu ekranın sabitlemesini kaldırmak için Geri\'ye dokunup basılı tutun." + "Bu ekranın sabitlemesini kaldırmak için Geri\'ye ve Genel Bakış\'a dokunup basılı tutun." "Uygulama sabitlendi. Bu cihazda sabitlemenin kaldırılmasına izin verilmiyor." "Ekran sabitlendi" "Ekran sabitlemesi kaldırıldı" @@ -1659,9 +1666,9 @@ "Kilidi açmak için dokunun" "Kullanıcı verileri kilitlendi" "İş profili kilitlendi" - "İş profilinin kilidini açmak için hafifçe dokunun" + "İş profilinin kilidini açmak için dokunun" "%1$s cihazına bağlandı" - "Dosyaları görüntülemek için hafifçe dokunun" + "Dosyaları görüntülemek için dokunun" "Sabitle" "Sabitlemeyi kaldır" "Uygulama bilgileri" diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 704ade8e27dd..aaf5253fa3c5 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Пробл. підключення чи недійсний код MMI." "Операція лише для номерів фіксованого набору." + "У роумінгу на телефоні не можна змінити налаштування переадресації викликів." "Послугу ввімкнено." "Службу ввімкнено для:" "Службу вимкнено." @@ -98,6 +99,8 @@ "Голосові служби чи служби даних заблоковано." "Голос.служ. чи служ. даних заблок." "Усі голосові служби, служби даних і SMS заблоковано." + "Не вдається під’єднатися до мережі" + "Щоб покращити якість сигналу, змініть тип у меню \"Налаштування > Мобільні мережі > Тип мережі\"." "Пристрій змінив режим TTY на FULL" "Пристрій змінив режим TTY на HCO" "Пристрій змінив режим TTY на VCO" @@ -183,6 +186,8 @@ "Робочий профіль видалено через відсутність додатка адміністратора." "Додаток адміністратора в робочому профілі відсутній або пошкоджений. У результаті ваш робочий профіль і пов’язані з ним дані видалено. Зверніться до свого адміністратора по допомогу." "Робочий профіль більше не доступний на цьому пристрої." + "Відстежується мережевий трафік" + "Торкніться, щоб дізнатися більше" "З вашого пристрою буде стерто всі дані" "Неможливо скористатися додатком адміністратора, оскільки в ньому немає певних компонентів або його пошкоджено. З вашого пристрою буде стерто всі дані. Зверніться до свого адміністратора по допомогу." "Я" @@ -1258,6 +1263,8 @@ "Дозволяє додатку читати дані сеансів встановлення. Додаток може бачити деталі про активні встановлення пакетів." "запитувати дані про пакети встановлення" "Додаток зможе надсилати запити на встановлення пакетів." + "запитувати дозвіл ігнорувати оптимізацію використання заряду акумулятора" + "Додаток зможе запитувати дозвіл ігнорувати оптимізацію використання заряду акумулятора." "Двічі натис. для кер. масшт." "Не вдалося додати віджет." "Йти" @@ -1284,7 +1291,7 @@ "Фоновий мал." "Змінити фоновий малюнок" "Служба читання сповіщень" - "Обробник віртуальної реальності" + "VR-режим" "Постачальник умов" "Служба встановлення пріоритетності сповіщень" "Мережу VPN активовано" @@ -1371,7 +1378,7 @@ "Крапка." "Перейти на головну" "Перейти вгору" - "Інші варіанти" + "Більше" "%1$s, %2$s" "%1$s, %2$s, %3$s" "Внутрішнє спільне сховище" @@ -1612,7 +1619,7 @@ "Виберіть рік" "%1$s видалено" "Робоча %1$s" - "Щоб відкріпити цей екран, натисніть і утримуйте кнопку \"Назад\"." + "Щоб відкріпити цей екран, натисніть і втримуйте кнопки \"Назад\" та \"Огляд\"." "Додаток закріплено. Його не можна відкріпити на цьому пристрої." "Екран закріплено" "Екран відкріплено" diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index 24a03b24e066..3136c33b51c6 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "‏کنکشن مسئلہ یا غلط MMI کوڈ۔" "آپریشن صرف متعین ڈائلنگ نمبرز تک محدود ہے۔" + "جب آپ رومنگ پر ہوں تو اپنے فون سے کال فارورڈنگ کی ترتیبات تبدیل نہیں کی جا سکتیں۔" "سروس فعال کی گئی۔" "سروس فعال کی گئی برائے:" "سروس غیر فعال کر دی گئی ہے۔" @@ -96,6 +97,8 @@ "صوتی/ڈیٹا سروسز مسدود کر دی گئی ہیں۔" "‏وائس/SMS سروسز مسدود ہیں۔" "‏سبھی صوتی/ڈیٹا/SMS سروسز مسدود کر دی گئی ہیں۔" + "نیٹ ورک تک نہیں پہنچا جا سکتا" + "ریسپشن کو بہتر بنانے کیلئے، ترتیبات > سیلولر نیٹ ورکس > ترجیحی نیٹ ورک کی قسم پرمنتخب کی گئی قسم تبدیل کرنے کی کوشش کریں۔" "‏ہمسر نے TTY وضع مکمل کی درخواست کی" "‏ہمسر نے TTY وضع HCO کی درخواست کی" "‏ہمسر نے TTY وضع VCO کی درخواست کی" @@ -179,6 +182,8 @@ "گمشدہ منتظم ایپ کی وجہ سے دفتری پروفائل حذف کر دیا گیا۔" "دفتری پروفائل کی منتظم ایپ یا تو غائب ہے یا خراب ہے۔ اس کی وجہ سے، آپ کا دفتری پروفائل اور متعلقہ ڈیٹا حذف کر دیے گئے ہیں۔ مدد کیلئے اپنے منتظم سے رابطہ کریں۔" "آپ کا دفتری پروفائل اس آلہ پر مزید دستیاب نہیں ہے۔" + "نیٹ ورک ٹریفک مانیٹر ہو رہی ہے" + "مزید جاننے کیلئے تھپتھپائیں" "آپ کا آلہ صاف کر دیا جائے گا" "منتظم کی ایپ میں گمشدہ اجزاء ہیں یا وہ خراب ہے اور اسے استعمال نہیں کیا جا سکتا ہے۔ آپ کے آلہ کو اب صاف کر دیا جائے گا۔ مدد کیلئے اپنے منتظم سے رابطہ کریں۔" "میں" @@ -265,7 +270,7 @@ "کسی ایسی ونڈو کے مواد کا معائنہ کریں جس کے ساتھ آپ تعامل کر رہے ہیں۔" "ٹچ کے ذریعے دریافت کریں کو آن کرنے کی" "تھپتھپائے گئے آئٹمز کو باآواز بلند بولا جائے گا اور اشاروں کا استعمال کرکے اسکرین کو دریافت کیا جا سکتا ہے۔" - "‏بہتر ویب accessibility کو آن کرنے کی" + "بہتر ویب ایکسیسبیلٹی کو آن کرنے کی" "ایپ کا مواد مزید قابل رسائی بنانے کیلئے اسکرپٹس کو انسٹال کیا جا سکتا ہے۔" "آپکے ٹائپ کردہ متن کا مشاہدہ کرنے کی" "اس میں ذاتی ڈیٹا جیسے کریڈٹ کارڈ نمبرز اور پاس ورڈز شامل ہیں۔" @@ -1208,6 +1213,8 @@ "ایک ایپلیکیشن کو انسٹال سیشنز پڑھنے کی اجازت دیتا ہے۔ یہ اسے فعال پیکیج انسٹالیشنز کے بارے میں تفصیلات دیکھنے کی اجازت دیتا ہے۔" "پیکجز انسٹال کرنے کی درخواست کریں" "ایک ایپلیکیشن کو پیکجز انسٹال کرنے کی اجازت دیتی ہے۔" + "بیٹری کی بہتریاں نظر انداز کرنے کا پوچھیں" + "اس ایپ کیلئے ایک ایپ کو بیٹری کی کارکردگی بہتر بنانے کو نظر انداز کرنے کی اجازت دیں۔" "زوم کنٹرول کیلئے دوبار تھپتھپائیں" "ویجٹس کو شامل نہیں کرسکا۔" "جائیں" @@ -1230,7 +1237,7 @@ "آپ اس ایپ کو اپنے دفتری پروفائل میں استعمال کر رہے ہیں" "اندراج کا طریقہ" "مطابقت پذیری کریں" - "Accessibility" + "ایکسیسبیلٹی" "وال پیپر" "وال پیپر تبدیل کریں" "اطلاع سننے والا" @@ -1432,9 +1439,9 @@ " — " "ہٹائیں" "والیوم کو تجویز کردہ سطح سے زیادہ کریں؟\n\nزیادہ وقت تک اونچی آواز میں سننے سے آپ کی سماعت کو نقصان پہنچ سکتا ہے۔" - "‏accessibility فعال کرنے کیلئے دو انگلیاں نیچے دبائے رکھیں۔" - "‏Accessibility فعال۔" - "‏Accessibility منسوخ ہوگئی۔" + "ایکسیسبیلٹی فعال کرنے کیلئے دو انگلیاں نیچے دبائے رکھیں۔" + "ایکسیسبیلٹی فعال۔" + "ایکسیسبیلٹی منسوخ ہوگئی۔" "موجودہ صارف %1$s۔" "%1$s پر سوئچ کیا جا رہا ہے…" "%1$s لاگ آؤٹ ہو رہا ہے…" @@ -1558,7 +1565,7 @@ "سال منتخب کریں" "%1$s کو حذف کر دیا گیا" "دفتر %1$s" - "اس اسکرین سے پن ہٹانے کیلئے، پیچھے کو تھپتھپائیں اور دبا کر رکھیں۔" + "اس اسکرین سے پن ہٹانے کیلئے، ٹچ کریں، دبائیں اور مجموعی جائزہ۔" "ایپ کو پن کر دیا گیا ہے: اس آلہ پر پن ہٹانے کی اجازت نہیں ہے۔" "اسکرین کو پن کر دیا گیا" "اسکرین کا پن ہٹا دیا گیا" diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index e5a2889b7054..cc213e639ef9 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Tarmoqda xato yoki MMI kod noto‘g‘ri." "Bu amal faqat ruxsat etilgan raqamlar uchun mavjud." + "Rouming vaqtida telefondagi chaqiruvni boshqa raqamga uzatish sozlamalarini o‘zgartirib bo‘lmadi." "Xizmat yoqildi." "Xizmat quyidagi uchun yoqildi:" "Xizmat o‘chirib qo‘yilgan." @@ -96,6 +97,8 @@ "Ovozli/internet xizmatlari to‘sib qo‘yilgan." "Ovoz/SMS xizmatlari bloklandi." "Barcha ovozli/internet/SMS xizmatlari to‘sib qo‘yilgan." + "Tarmoq bilan bog‘lanib bo‘lmadi" + "Qabul qilish sifatini yaxshilash uchun Sozlamalar > Mobil tarmoqlar > Asosiy tarmoq turi orqali tarmoqni o‘zgartirib ko‘ring." "Teng huquqli ishtirokchi teletayp rejimini FULL (to‘liq) qilib o‘zgartirdi" "Teng huquqli ishtirokchi teletayp rejimini HCO (eshitadi, gapirolmaydi) qilib o‘zgartirdi" "Teng huquqli ishtirokchi teletayp rejimini VCO (gapiradi, eshitolmaydi) qilib o‘zgartirdi" @@ -179,6 +182,8 @@ "Administrator ilovasi yo‘qligi sababli ishchi profil o‘chirib tashlandi" "Ishchi profilning administrator ilovasi yo‘q yoki buzilgan. Shuning uchun, ishchi profilingiz va unga aloqador ma’lumotlar o‘chirib tashlandi. Yordam olish uchun administratoringizga murojaat qiling." "Bu qurilmada endi ishchi profilingiz mavjud emas." + "Tarmoq trafigi nazorat qilinmoqda" + "Batafsil ma’lumot olish uchun bosing" "Qurilmangizdagi ma’lumotlar o‘chirib tashlanadi" "Administrator ilovasining ba’zi qismlari yo‘qolgan yoki buzilgan, shuning uchun undan foydalanib bo‘lmaydi. Qurilmangizdagi ma’lumotlar o‘chirib tashlanadi. Yordam olish uchun administratoringizga murojaat qiling." "Men" @@ -696,7 +701,7 @@ "To‘xtatish" "Orqaga o‘tkazish" "Oldinga o‘tkazish" - "Faqat favqulodda qo‘ng‘iroqlar" + "Faqat favqulodda chaqiruvlar" "Tarmoq qulflangan" "SIM karta PUK kod bilan qulflangan." "Foydalanuvchi qo‘llanmasiga qarang yoki Abonentlarni qo‘llab-quvvatlash markaziga murojaat qiling." @@ -1208,6 +1213,8 @@ "Ilovaga o‘rnatilgan seanslarni o‘qish uchun ruxsat beradi. Bu unga faol paket o‘rnatmalari haqidagi ma’lumotlarni ko‘rish imkonini beradi." "paketlarni o‘rnatish so‘rovini yuborish" "Ilovaga paketlarni o‘rnatish so‘rovini yuborish imkonini beradi." + "batareya quvvatidan xohlagancha foydalanishni so‘rash" + "Ilovaga batareya quvvatidan xohlagancha foydalanish uchun ruxsat so‘rashga imkon beradi." "Ko‘lamini o‘zgartirish uchun ikki marta bosing" "Vidjet qo‘shilmadi." "O‘tish" @@ -1558,7 +1565,7 @@ "Yilni tanlash" "%1$s raqami o‘chirib tashlandi" "Ish %1$s" - "Bu ekrandan chiqish uchun “Orqaga” tugmasini bosib turing." + "Bu ekrandan chiqish uchun “Orqaga” va “Umumiy ma’lumot” tugmalarini bosib turing." "Ilova qadab qo‘yilgan. Uni ekrandan yechish ushbu qurilmada ta’qiqlangan." "Ekran qadab qo‘yildi" "Ekran bo‘shatildi" diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 0bbfe3b8a8c1..63af1e256183 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -46,6 +46,7 @@ "MSISDN1" "Sự cố kết nối hoặc mã MMI không hợp lệ." "Chỉ hạn chế thao tác đối với số quay số định sẵn." + "Không thể thay đổi cài đặt chuyển tiếp cuộc gọi từ điện thoại của bạn khi bạn đang chuyển vùng." "Dịch vụ đã được bật." "Dịch vụ đã được bật cho:" "Dịch vụ đã bị vô hiệu hóa." @@ -96,6 +97,8 @@ "Dịch vụ thoại/dữ liệu đã bị chặn." "Dịch vụ Thoại/SMS đã bị chặn." "Tất cả các dịch vụ thoại/dữ liệu/SMS đã bị chặn." + "Không thể kết nối mạng" + "Để cải thiện khả năng thu tín hiệu, hãy thử thay đổi loại được chọn tại Cài đặt > Mạng di động > Loại mạng ưa thích." "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ ĐẦY ĐỦ" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ HCO" "TTY theo yêu cầu của thiết bị ngang hàng ở chế độ VCO" @@ -179,6 +182,8 @@ "Đã xóa hồ sơ công việc do thiếu ứng dụng quản trị." "Ứng dụng quản trị hồ sơ công việc bị thiếu hoặc hỏng. Do vậy, hồ sơ công việc của bạn và dữ liệu liên quan đã bị xóa. Hãy liên hệ với quản trị viên để được trợ giúp." "Hồ sơ công việc của bạn không có sẵn trên thiết bị này nữa." + "Lưu lượng truy cập mạng đang được giám sát" + "Nhấn để tìm hiểu thêm" "Thiết bị của bạn sẽ bị xóa" "Ứng dụng quản trị đang bị thiếu thành phần hoặc bị hỏng và không thể sử dụng được. Bây giờ, thiết bị của bạn sẽ bị xóa. Hãy liên hệ với quản trị viên của bạn để được trợ giúp." "Tôi" @@ -1208,6 +1213,8 @@ "Cho phép ứng dụng đọc phiên cài đặt. Thao tác này sẽ cho phép ứng dụng xem chi tiết về gói cài đặt đang hoạt động." "yêu cầu gói cài đặt" "Cho phép ứng dụng yêu cầu cài đặt gói." + "hỏi để bỏ qua tối ưu hóa pin" + "Cho phép ứng dụng hỏi quyền để bỏ qua tối ưu hóa pin cho ứng dụng đó." "Nhấn hai lần để kiểm soát thu phóng" "Không thể thêm tiện ích." "Đến" @@ -1558,7 +1565,7 @@ "Chọn năm" "Đã xóa %1$s" "%1$s làm việc" - "Để bỏ ghim màn hình này, nhấn và giữ Quay lại." + "Để bỏ ghim màn hình này, chạm và giữ Quay lại và Tổng quan." "Ứng dụng được ghim: Không được phép bỏ ghim trên thiết bị này." "Đã ghim màn hình" "Đã bỏ ghim màn hình" diff --git a/core/res/res/values-w180dp-notround-watch/dimens_material.xml b/core/res/res/values-w180dp-notround-watch/dimens_material.xml new file mode 100644 index 000000000000..79acf84b7e3f --- /dev/null +++ b/core/res/res/values-w180dp-notround-watch/dimens_material.xml @@ -0,0 +1,36 @@ + + + + 80sp + 50sp + 40sp + 30sp + 20sp + 18sp + 18sp + 18dp + 18dp + 18sp + 16sp + 16sp + 16sp + 14sp + 16sp + + 18sp + 16sp + 14sp + diff --git a/core/res/res/values-w210dp-round-watch/dimens_material.xml b/core/res/res/values-w210dp-round-watch/dimens_material.xml new file mode 100644 index 000000000000..79acf84b7e3f --- /dev/null +++ b/core/res/res/values-w210dp-round-watch/dimens_material.xml @@ -0,0 +1,36 @@ + + + + 80sp + 50sp + 40sp + 30sp + 20sp + 18sp + 18sp + 18dp + 18dp + 18sp + 16sp + 16sp + 16sp + 14sp + 16sp + + 18sp + 16sp + 14sp + diff --git a/core/res/res/values-w225dp/dimens_material.xml b/core/res/res/values-w225dp/dimens_material.xml new file mode 100644 index 000000000000..aa822a32c975 --- /dev/null +++ b/core/res/res/values-w225dp/dimens_material.xml @@ -0,0 +1,20 @@ + + + + 11.25dp + 22.5dp + 33.75dp + diff --git a/core/res/res/values-watch/colors_device_defaults.xml b/core/res/res/values-watch/colors_device_defaults.xml new file mode 100644 index 000000000000..15786b4a23f8 --- /dev/null +++ b/core/res/res/values-watch/colors_device_defaults.xml @@ -0,0 +1,24 @@ + + + + + + @color/btn_default_material_dark + + #995E97f6 + diff --git a/core/res/res/values-watch/colors_material.xml b/core/res/res/values-watch/colors_material.xml index 45eb9812f137..72f589b3d337 100644 --- a/core/res/res/values-watch/colors_material.xml +++ b/core/res/res/values-watch/colors_material.xml @@ -14,13 +14,15 @@ limitations under the License. --> - #ff232e33 - #ff3e5059 + #232E33 + #3E5059 - #ff5e97f6 - #ff4285f4 + #5385DB + #75A4F5 + #5E97F6 + #93B7F5 - #4D4D4D + #33ffffff - #ff999999 + #ff919699 diff --git a/core/res/res/values-watch/config.xml b/core/res/res/values-watch/config.xml index 919519e5832a..d13d15468825 100644 --- a/core/res/res/values-watch/config.xml +++ b/core/res/res/values-watch/config.xml @@ -57,4 +57,12 @@ true + + + true + + + false diff --git a/core/res/res/values-watch/config_material.xml b/core/res/res/values-watch/config_material.xml index 81b53e71b5d7..03d3637b150d 100644 --- a/core/res/res/values-watch/config_material.xml +++ b/core/res/res/values-watch/config_material.xml @@ -30,6 +30,10 @@ true - - 3 + + true + + + @drawable/scrollbar_vertical_thumb + @drawable/scrollbar_vertical_track diff --git a/core/res/res/values-watch/dimens.xml b/core/res/res/values-watch/dimens.xml new file mode 100644 index 000000000000..4c8b39ca92a7 --- /dev/null +++ b/core/res/res/values-watch/dimens.xml @@ -0,0 +1,21 @@ + + + + + 0dp + + 0dp + diff --git a/core/res/res/values-watch/dimens_material.xml b/core/res/res/values-watch/dimens_material.xml index d579434d5e30..3c4904ccf07d 100644 --- a/core/res/res/values-watch/dimens_material.xml +++ b/core/res/res/values-watch/dimens_material.xml @@ -14,5 +14,34 @@ limitations under the License. --> + 71sp + 44sp + 36sp + 27sp + 18sp + 16sp + 16sp + 16dp + 16dp + 16sp + 14sp + 14sp + 14sp + 12sp + 14sp + + 16sp + 14sp + 12sp + 1.2 + + + 1dip + 1dip + + + 16dip + 32dip + 64dip diff --git a/core/res/res/layout-watch/number_picker_material.xml b/core/res/res/values-watch/integers.xml similarity index 59% rename from core/res/res/layout-watch/number_picker_material.xml rename to core/res/res/values-watch/integers.xml index a1c0921482ad..46ed97d83182 100644 --- a/core/res/res/layout-watch/number_picker_material.xml +++ b/core/res/res/values-watch/integers.xml @@ -1,6 +1,6 @@ + + + 1 - - - - - + + 1 + diff --git a/core/res/res/values-watch/styles_material.xml b/core/res/res/values-watch/styles_material.xml index a9f6e226510c..0053c12d9d84 100644 --- a/core/res/res/values-watch/styles_material.xml +++ b/core/res/res/values-watch/styles_material.xml @@ -61,11 +61,16 @@ please see styles_device_defaults.xml. @empty + - + + diff --git a/core/res/res/values-watch/themes_device_defaults.xml b/core/res/res/values-watch/themes_device_defaults.xml index 2313b26c1f8d..4d210f6e2f9f 100644 --- a/core/res/res/values-watch/themes_device_defaults.xml +++ b/core/res/res/values-watch/themes_device_defaults.xml @@ -1,5 +1,5 @@ - + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/res/res/values-watch/themes_material.xml b/core/res/res/values-watch/themes_material.xml index 4ae4367e8bc7..0cf398b11085 100644 --- a/core/res/res/values-watch/themes_material.xml +++ b/core/res/res/values-watch/themes_material.xml @@ -37,6 +37,7 @@ please see styles_device_defaults.xml. @style/Animation.InputMethod ?colorBackground @anim/input_method_extract_enter + false @@ -59,4 +60,17 @@ please see styles_device_defaults.xml. @color/background_cache_hint_selector_material_light false + + + + + - - - @@ -684,7 +685,7 @@ please see styles_device_defaults.xml. diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index f446341d97d8..c280b2864995 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -312,6 +312,7 @@ + @@ -381,6 +382,7 @@ + @@ -421,6 +423,7 @@ + @@ -489,6 +492,8 @@ + + @@ -728,6 +733,7 @@ + @@ -1111,6 +1117,8 @@ + + @@ -1121,6 +1129,9 @@ + + + @@ -1224,6 +1235,7 @@ + @@ -1418,7 +1430,6 @@ - @@ -1656,6 +1667,11 @@ + + + + + @@ -1673,6 +1689,8 @@ + + @@ -1704,6 +1722,7 @@ + @@ -1742,6 +1761,7 @@ + @@ -1772,6 +1792,9 @@ + + + @@ -1782,6 +1805,7 @@ + @@ -2724,6 +2748,10 @@ + + + + @@ -2778,4 +2806,9 @@ + + + + + diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 0e98adea434a..b19858ef194d 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -49,7 +49,7 @@ easier. Type.DeviceDefault.Etc (for example, {@code Widget.DeviceDefault.Button} and {@code TextAppearance.DeviceDefault.Widget.PopupMenu.Large}).

    --> - + + + + + + + + + + + + +<h2> +Frame Alert +</h2> + +<p> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<br> +Link to <a href="changes/changes-summary.html" target="_top">Non-frame version.</A> + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_additions.html b/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_additions.html new file mode 100644 index 000000000000..369d9b162d09 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_additions.html @@ -0,0 +1,252 @@ + + + + + + + + + +All Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Differences +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + +
    A  +B +D +G +I +N +R +S +U + TOP +

    +ActivityCompat +() constructor
    + +android.support.v13.view.inputmethod
    + + +
    B  +A +D +G +I +N +R +S +U + TOP +

    +BottomNavigationView
    + +BottomNavigationView.OnNavigationItemSelectedListener
    + + +
    D  +A +B +G +I +N +R +S +U + TOP +

    +DividerItemDecoration
    + + +
    G  +A +B +D +I +N +R +S +U + TOP +

    +getBridgeTag +()
    + +getDecoratedBoundsWithMargins +(View, Rect)
    + +getDisplay +(View)
    + +getProgressViewEndOffset +()
    + +getProgressViewStartOffset +()
    + +getRestrictBackgroundStatus +(ConnectivityManager)
    + +getRippleColor +()
    + + +
    I  +A +B +D +G +N +R +S +U + TOP +

    +isItemPrefetchEnabled +()
    + +isRtl +(CharSequence)
    + + +
    N  +A +B +D +G +I +R +S +U + TOP +

    +NotificationCompat.DecoratedCustomViewStyle
    + +NotificationCompat.DecoratedMediaCustomViewStyle
    + + +
    R  +A +B +D +G +I +N +S +U + TOP +

    +RESTRICT_BACKGROUND_STATUS_DISABLED +
    + +RESTRICT_BACKGROUND_STATUS_ENABLED +
    + +RESTRICT_BACKGROUND_STATUS_WHITELISTED +
    + + +
    S  +A +B +D +G +I +N +R +U + TOP +

    +setBackground +(View, Drawable)
    + +setBridgeTag +(String)
    + +setItemPrefetchEnabled +(boolean)
    + +setPageTransformer +(boolean, PageTransformer, int)
    + +startActivity +(Context, Intent, Bundle)
    + + +
    U  +A +B +D +G +I +N +R +S + TOP +

    +unicodeWrap
    +  type  +(CharSequence) in android.support.v4.text.BidiFormatter +
    + +  type  +(CharSequence, TextDirectionHeuristicCompat) in android.support.v4.text.BidiFormatter +
    + +  type  +(CharSequence, TextDirectionHeuristicCompat, boolean) in android.support.v4.text.BidiFormatter +
    + +  type  +(CharSequence, boolean) in android.support.v4.text.BidiFormatter +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_all.html b/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_all.html new file mode 100644 index 000000000000..9396e5206dd9 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_all.html @@ -0,0 +1,422 @@ + + + + + + + + + +All Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Differences +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + +
    A  +B +C +D +F +G +I +L +N +R +S +U +V + TOP +

    +ActivityCompat
    +  android.support.v13.app
    + +  android.support.v4.app
    + +  ActivityCompat +() constructor
    + +  ActivityCompat +() constructor
    + +android.support.customtabs
    + +android.support.design.widget
    + +android.support.v13.app
    + +android.support.v13.view.inputmethod
    + +android.support.v4.app
    + +android.support.v4.content
    + +android.support.v4.net
    + +android.support.v4.text
    + +android.support.v4.view
    + +android.support.v4.widget
    + +android.support.v7.app
    + +android.support.v7.widget
    + + +
    B  +A +C +D +F +G +I +L +N +R +S +U +V + TOP +

    +BidiFormatter
    + +BottomNavigationView
    + +BottomNavigationView.OnNavigationItemSelectedListener
    + + +
    C  +A +B +D +F +G +I +L +N +R +S +U +V + TOP +

    +ConnectivityManagerCompat
    + +ContextCompat
    +  android.support.v4.content
    + +  ContextCompat +() constructor
    + +CustomTabsIntent
    + + +
    D  +A +B +C +F +G +I +L +N +R +S +U +V + TOP +

    +DividerItemDecoration
    + + +
    F  +A +B +C +D +G +I +L +N +R +S +U +V + TOP +

    +FloatingActionButton
    + + +
    G  +A +B +C +D +F +I +L +N +R +S +U +V + TOP +

    +getBridgeTag +()
    + +getDecoratedBoundsWithMargins +(View, Rect)
    + +getDisplay +(View)
    + +getProgressViewEndOffset +()
    + +getProgressViewStartOffset +()
    + +getReferrer +(Activity)
    + +getRestrictBackgroundStatus +(ConnectivityManager)
    + +getRippleColor +()
    + + +
    I  +A +B +C +D +F +G +L +N +R +S +U +V + TOP +

    +isItemPrefetchEnabled +()
    + +isRtl +(CharSequence)
    + + +
    L  +A +B +C +D +F +G +I +N +R +S +U +V + TOP +

    +launchUrl +(Context, Uri)
    + + +
    N  +A +B +C +D +F +G +I +L +R +S +U +V + TOP +

    +NotificationCompat.DecoratedCustomViewStyle
    + +NotificationCompat.DecoratedMediaCustomViewStyle
    + +NotificationCompat.WearableExtender
    + + +
    R  +A +B +C +D +F +G +I +L +N +S +U +V + TOP +

    +RecyclerView
    + +RecyclerView.LayoutManager
    + +RESTRICT_BACKGROUND_STATUS_DISABLED +
    + +RESTRICT_BACKGROUND_STATUS_ENABLED +
    + +RESTRICT_BACKGROUND_STATUS_WHITELISTED +
    + + +
    S  +A +B +C +D +F +G +I +L +N +R +U +V + TOP +

    +setBackground +(View, Drawable)
    + +setBridgeTag +(String)
    + +setItemPrefetchEnabled +(boolean)
    + +setPageTransformer +(boolean, PageTransformer, int)
    + +Space
    + +startActivity
    +  type  +(Context, Intent, Bundle) in android.support.v4.app.ActivityCompat +
    + +  type  +(Context, Intent, Bundle) in android.support.v4.content.ContextCompat +
    + +SwipeRefreshLayout
    + + +
    U  +A +B +C +D +F +G +I +L +N +R +S +V + TOP +

    +unicodeWrap
    +  type  +(CharSequence) in android.support.v4.text.BidiFormatter +
    + +  type  +(CharSequence, TextDirectionHeuristicCompat) in android.support.v4.text.BidiFormatter +
    + +  type  +(CharSequence, TextDirectionHeuristicCompat, boolean) in android.support.v4.text.BidiFormatter +
    + +  type  +(CharSequence, boolean) in android.support.v4.text.BidiFormatter +
    + + +
    V  +A +B +C +D +F +G +I +L +N +R +S +U + TOP +

    +ViewCompat
    + +ViewPager
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_changes.html b/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_changes.html new file mode 100644 index 000000000000..e0c9f1ed73a9 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_changes.html @@ -0,0 +1,256 @@ + + + + + + + + + +All Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Differences +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + +
    A  +B +C +F +G +L +N +R +S +V + TOP +

    +ActivityCompat
    +  android.support.v13.app
    + +  android.support.v4.app
    + +  ActivityCompat +() constructor
    + +android.support.customtabs
    + +android.support.design.widget
    + +android.support.v13.app
    + +android.support.v4.app
    + +android.support.v4.content
    + +android.support.v4.net
    + +android.support.v4.text
    + +android.support.v4.view
    + +android.support.v4.widget
    + +android.support.v7.app
    + +android.support.v7.widget
    + + +
    B  +A +C +F +G +L +N +R +S +V + TOP +

    +BidiFormatter
    + + +
    C  +A +B +F +G +L +N +R +S +V + TOP +

    +ConnectivityManagerCompat
    + +ContextCompat
    +  android.support.v4.content
    + +  ContextCompat +() constructor
    + +CustomTabsIntent
    + + +
    F  +A +B +C +G +L +N +R +S +V + TOP +

    +FloatingActionButton
    + + +
    G  +A +B +C +F +L +N +R +S +V + TOP +

    +getReferrer +(Activity)
    + + +
    L  +A +B +C +F +G +N +R +S +V + TOP +

    +launchUrl +(Context, Uri)
    + + +
    N  +A +B +C +F +G +L +R +S +V + TOP +

    +NotificationCompat.WearableExtender
    + + +
    R  +A +B +C +F +G +L +N +S +V + TOP +

    +RecyclerView
    + +RecyclerView.LayoutManager
    + + +
    S  +A +B +C +F +G +L +N +R +V + TOP +

    +startActivity +(Context, Intent, Bundle)
    + +SwipeRefreshLayout
    + + +
    V  +A +B +C +F +G +L +N +R +S + TOP +

    +ViewCompat
    + +ViewPager
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_removals.html b/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_removals.html new file mode 100644 index 000000000000..76010db10580 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/alldiffs_index_removals.html @@ -0,0 +1,67 @@ + + + + + + + + + +All Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Differences +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + +
    S  + TOP +

    +Space
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.customtabs.CustomTabsIntent.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.customtabs.CustomTabsIntent.html new file mode 100644 index 000000000000..891be3d93f7e --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.customtabs.CustomTabsIntent.html @@ -0,0 +1,125 @@ + + + + + + + + + +android.support.customtabs.CustomTabsIntent + + + + + + + + + + +
    +
    +
    +

    +Class android.support.customtabs.CustomTabsIntent +

    + + +

    + + + + + + + + + +
    Changed Methods +
    + + void launchUrl(Context, Uri) + +Change in signature from (Activity, Uri) to (Context, Uri).
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.design.widget.FloatingActionButton.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.design.widget.FloatingActionButton.html new file mode 100644 index 000000000000..d048222a97bf --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.design.widget.FloatingActionButton.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.design.widget.FloatingActionButton + + + + + + + + + + +
    +
    +
    +

    +Class android.support.design.widget.FloatingActionButton +

    + + +

    + + + + + + + + +
    Added Methods +
    + + int getRippleColor() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v13.app.ActivityCompat.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v13.app.ActivityCompat.html new file mode 100644 index 000000000000..c11dce291622 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v13.app.ActivityCompat.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v13.app.ActivityCompat + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v13.app.ActivityCompat +

    + +

    + + + + + + + + +
    Added Constructors +
    + + ActivityCompat() +  
    +  + + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.app.ActivityCompat.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.app.ActivityCompat.html new file mode 100644 index 000000000000..e728c87784f0 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.app.ActivityCompat.html @@ -0,0 +1,154 @@ + + + + + + + + + +android.support.v4.app.ActivityCompat + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.app.ActivityCompat +

    + +

    + + + + + + + + + +
    Changed Constructors +
    + + ActivityCompat() + +Change from deprecated to undeprecated.
    Change of visibility from public to protected.
    +
     
    +  + +

    + + + + + + + + + + + + + + +
    Changed Methods +
    + + Uri getReferrer(Activity) + +Change from non-static to static.
    Change from deprecated to undeprecated.
    +
     
    + + void startActivity(Context, Intent, Bundle) + +Change in signature from (Activity, Intent, Bundle) to (Context, Intent, Bundle).
    + Method was locally defined, but is now inherited from ContextCompat. +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.app.NotificationCompat.WearableExtender.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.app.NotificationCompat.WearableExtender.html new file mode 100644 index 000000000000..fb9d1fca1fb1 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.app.NotificationCompat.WearableExtender.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v4.app.NotificationCompat.WearableExtender + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.app.NotificationCompat.WearableExtender +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + String getBridgeTag() +  
    + + WearableExtender setBridgeTag(String) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.content.ContextCompat.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.content.ContextCompat.html new file mode 100644 index 000000000000..ffcebd00d4db --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.content.ContextCompat.html @@ -0,0 +1,140 @@ + + + + + + + + + +android.support.v4.content.ContextCompat + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.content.ContextCompat +

    + +

    + + + + + + + + + +
    Changed Constructors +
    + + ContextCompat() + +Change from deprecated to undeprecated.
    Change of visibility from public to protected.
    +
     
    +  + +

    + + + + + + + + +
    Added Methods +
    + + void startActivity(Context, Intent, Bundle) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.net.ConnectivityManagerCompat.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.net.ConnectivityManagerCompat.html new file mode 100644 index 000000000000..f9ca4c0ee0e5 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.net.ConnectivityManagerCompat.html @@ -0,0 +1,151 @@ + + + + + + + + + +android.support.v4.net.ConnectivityManagerCompat + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.net.ConnectivityManagerCompat +

    + + +

    + + + + + + + + +
    Added Methods +
    + + int getRestrictBackgroundStatus(ConnectivityManager) +  
    +  + +

    + + + + + + + + + + + + + + + + +
    Added Fields +
    + + int RESTRICT_BACKGROUND_STATUS_DISABLED +  
    + + int RESTRICT_BACKGROUND_STATUS_ENABLED +  
    + + int RESTRICT_BACKGROUND_STATUS_WHITELISTED +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.text.BidiFormatter.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.text.BidiFormatter.html new file mode 100644 index 000000000000..63ee221ce452 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.text.BidiFormatter.html @@ -0,0 +1,150 @@ + + + + + + + + + +android.support.v4.text.BidiFormatter + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.text.BidiFormatter +

    + + +

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Added Methods +
    + + boolean isRtl(CharSequence) +  
    + + CharSequence unicodeWrap(CharSequence) +  
    + + CharSequence unicodeWrap(CharSequence, TextDirectionHeuristicCompat) +  
    + + CharSequence unicodeWrap(CharSequence, TextDirectionHeuristicCompat, boolean) +  
    + + CharSequence unicodeWrap(CharSequence, boolean) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.view.ViewCompat.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.view.ViewCompat.html new file mode 100644 index 000000000000..9e99e731d322 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.view.ViewCompat.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v4.view.ViewCompat + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.view.ViewCompat +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + Display getDisplay(View) +  
    + + void setBackground(View, Drawable) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.view.ViewPager.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.view.ViewPager.html new file mode 100644 index 000000000000..ca17f87b749d --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.view.ViewPager.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v4.view.ViewPager + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.view.ViewPager +

    + + +

    + + + + + + + + +
    Added Methods +
    + + void setPageTransformer(boolean, PageTransformer, int) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.widget.SwipeRefreshLayout.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.widget.SwipeRefreshLayout.html new file mode 100644 index 000000000000..aca6ab9d7242 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v4.widget.SwipeRefreshLayout.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v4.widget.SwipeRefreshLayout + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.widget.SwipeRefreshLayout +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + int getProgressViewEndOffset() +  
    + + int getProgressViewStartOffset() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v7.widget.RecyclerView.LayoutManager.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v7.widget.RecyclerView.LayoutManager.html new file mode 100644 index 000000000000..7a5df64927f5 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v7.widget.RecyclerView.LayoutManager.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v7.widget.RecyclerView.LayoutManager + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.widget.RecyclerView.LayoutManager +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + boolean isItemPrefetchEnabled() +  
    + + void setItemPrefetchEnabled(boolean) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v7.widget.RecyclerView.html b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v7.widget.RecyclerView.html new file mode 100644 index 000000000000..af4c24d781cc --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/android.support.v7.widget.RecyclerView.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v7.widget.RecyclerView + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.widget.RecyclerView +

    + + +

    + + + + + + + + +
    Added Methods +
    + + void getDecoratedBoundsWithMargins(View, Rect) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/changes-summary.html b/docs/html/sdk/support_api_diff/25.0.0/changes/changes-summary.html new file mode 100644 index 000000000000..d8bd829fa0c5 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/changes-summary.html @@ -0,0 +1,220 @@ + + + + + + + + + +Support Library API Differences Report + + + + + + + + + + +
    +
    +
    +
    +

    Support Library API Differences Report

    +

    This report details the changes in the core Android framework API between two API Level +specifications. It shows additions, modifications, and removals for packages, classes, methods, and fields. +The report also includes general statistics that characterize the extent and type of the differences.

    +

    This report is based a comparison of the Android API specifications +whose API Level identifiers are given in the upper-right corner of this page. It compares a +newer "to" API to an older "from" API, noting all changes relative to the +older API. So, for example, API elements marked as removed are no longer present in the "to" +API specification.

    +

    To navigate the report, use the "Select a Diffs Index" and "Filter the Index" +controls on the left. The report uses text formatting to indicate interface names, +links to reference documentation, and links to change +description. The statistics are accessible from the "Statistics" link in the upper-right corner.

    +

    For more information about the Android framework API and SDK, +see the Android Developers site.

    +

    + + + + + + + + +
    Added Packages +
    + + android.support.v13.view.inputmethod +  
    +  +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Changed Packages +
    + + android.support.customtabs +  
    + + android.support.design.widget +  
    + + android.support.v13.app +  
    + + android.support.v4.app +  
    + + android.support.v4.content +  
    + + android.support.v4.net +  
    + + android.support.v4.text +  
    + + android.support.v4.view +  
    + + android.support.v4.widget +  
    + + android.support.v7.app +  
    + + android.support.v7.widget +  
    +  + + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_additions.html b/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_additions.html new file mode 100644 index 000000000000..c3286a835eb0 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_additions.html @@ -0,0 +1,84 @@ + + + + + + + + + +Class Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Classes +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    B  +D +N + TOP +

    +BottomNavigationView
    +BottomNavigationView.OnNavigationItemSelectedListener
    + +
    D  +B +N + TOP +

    +DividerItemDecoration
    + +
    N  +B +D + TOP +

    +NotificationCompat.DecoratedCustomViewStyle
    +NotificationCompat.DecoratedMediaCustomViewStyle
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_all.html b/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_all.html new file mode 100644 index 000000000000..6a862ffe1fc2 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_all.html @@ -0,0 +1,189 @@ + + + + + + + + + +Class Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Classes +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    A  +B +C +D +F +N +R +S +V + TOP +

    +ActivityCompat
    +  android.support.v13.app
    +  android.support.v4.app
    + +
    B  +A +C +D +F +N +R +S +V + TOP +

    +BidiFormatter
    +BottomNavigationView
    +BottomNavigationView.OnNavigationItemSelectedListener
    + +
    C  +A +B +D +F +N +R +S +V + TOP +

    +ConnectivityManagerCompat
    +ContextCompat
    +CustomTabsIntent
    + +
    D  +A +B +C +F +N +R +S +V + TOP +

    +DividerItemDecoration
    + +
    F  +A +B +C +D +N +R +S +V + TOP +

    +FloatingActionButton
    + +
    N  +A +B +C +D +F +R +S +V + TOP +

    +NotificationCompat.DecoratedCustomViewStyle
    +NotificationCompat.DecoratedMediaCustomViewStyle
    +NotificationCompat.WearableExtender
    + +
    R  +A +B +C +D +F +N +S +V + TOP +

    +RecyclerView
    +RecyclerView.LayoutManager
    + +
    S  +A +B +C +D +F +N +R +V + TOP +

    +Space
    +SwipeRefreshLayout
    + +
    V  +A +B +C +D +F +N +R +S + TOP +

    +ViewCompat
    +ViewPager
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_changes.html b/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_changes.html new file mode 100644 index 000000000000..9881ce6849be --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_changes.html @@ -0,0 +1,163 @@ + + + + + + + + + +Class Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Classes +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    A  +B +C +F +N +R +S +V + TOP +

    +ActivityCompat
    +  android.support.v13.app
    +  android.support.v4.app
    + +
    B  +A +C +F +N +R +S +V + TOP +

    +BidiFormatter
    + +
    C  +A +B +F +N +R +S +V + TOP +

    +ConnectivityManagerCompat
    +ContextCompat
    +CustomTabsIntent
    + +
    F  +A +B +C +N +R +S +V + TOP +

    +FloatingActionButton
    + +
    N  +A +B +C +F +R +S +V + TOP +

    +NotificationCompat.WearableExtender
    + +
    R  +A +B +C +F +N +S +V + TOP +

    +RecyclerView
    +RecyclerView.LayoutManager
    + +
    S  +A +B +C +F +N +R +V + TOP +

    +SwipeRefreshLayout
    + +
    V  +A +B +C +F +N +R +S + TOP +

    +ViewCompat
    +ViewPager
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_removals.html b/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_removals.html new file mode 100644 index 000000000000..65dc88b17d3b --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/classes_index_removals.html @@ -0,0 +1,66 @@ + + + + + + + + + +Class Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Classes +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    S  + TOP +

    +Space
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_additions.html b/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_additions.html new file mode 100644 index 000000000000..b119899d33d7 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_additions.html @@ -0,0 +1,67 @@ + + + + + + + + + +Constructor Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Constructors +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    A  + TOP +

    +ActivityCompat +() constructor
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_all.html b/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_all.html new file mode 100644 index 000000000000..d19abe3d9650 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_all.html @@ -0,0 +1,78 @@ + + + + + + + + + +Constructor Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Constructors +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    A  +C + TOP +

    +ActivityCompat
    +  ActivityCompat +() constructor
    +  ActivityCompat +() constructor
    + +
    C  +A + TOP +

    +ContextCompat +() constructor
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_changes.html b/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_changes.html new file mode 100644 index 000000000000..9c48ca4e112d --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_changes.html @@ -0,0 +1,75 @@ + + + + + + + + + +Constructor Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Constructors +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    A  +C + TOP +

    +ActivityCompat +() constructor
    + +
    C  +A + TOP +

    +ContextCompat +() constructor
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_removals.html b/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_removals.html new file mode 100644 index 000000000000..55afb300bec1 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/constructors_index_removals.html @@ -0,0 +1,61 @@ + + + + + + + + + +Constructor Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Constructors +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_additions.html b/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_additions.html new file mode 100644 index 000000000000..19d218907b77 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_additions.html @@ -0,0 +1,71 @@ + + + + + + + + + +Field Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Fields +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    R  + TOP +

    +RESTRICT_BACKGROUND_STATUS_DISABLED +
    +RESTRICT_BACKGROUND_STATUS_ENABLED +
    +RESTRICT_BACKGROUND_STATUS_WHITELISTED +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_all.html b/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_all.html new file mode 100644 index 000000000000..2f658abfdfb0 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_all.html @@ -0,0 +1,71 @@ + + + + + + + + + +Field Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Fields +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    R  + TOP +

    +RESTRICT_BACKGROUND_STATUS_DISABLED +
    +RESTRICT_BACKGROUND_STATUS_ENABLED +
    +RESTRICT_BACKGROUND_STATUS_WHITELISTED +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_changes.html b/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_changes.html new file mode 100644 index 000000000000..f6d915847e09 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_changes.html @@ -0,0 +1,61 @@ + + + + + + + + + +Field Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Fields +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_removals.html b/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_removals.html new file mode 100644 index 000000000000..b16c79f3caac --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/fields_index_removals.html @@ -0,0 +1,61 @@ + + + + + + + + + +Field Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Fields +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/jdiff_help.html b/docs/html/sdk/support_api_diff/25.0.0/changes/jdiff_help.html new file mode 100644 index 000000000000..0f826e399bf5 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/jdiff_help.html @@ -0,0 +1,134 @@ + + + + + + + + + +JDiff Help + + + + + + + + + + + + + + + + + +
    Generated by
    JDiff
    +
    + +
    +

    JDiff Documentation

    +
    +
    +JDiff is a Javadoc doclet which generates a report of the API differences between two versions of a product. It does not report changes in Javadoc comments, or changes in what a class or method does. +This help page describes the different parts of the output from JDiff. +
    +
    + See the reference page in the source for JDiff for information about how to generate a report like this one. +
    +
    +The indexes shown in the top-left frame help show each type of change in more detail. The index "All Differences" contains all the differences between the APIs, in alphabetical order. +These indexes all use the same format: +
      +
    • Removed packages, classes, constructors, methods and fields are struck through.
    • +
    • Added packages, classes, constructors, methods and fields appear in bold.
    • +
    • Changed packages, classes, constructors, methods and fields appear in normal text.
    • +
    +
    +
    +You can always tell when you are reading a JDiff page, rather than a Javadoc page, by the color of the index bar and the color of the background. +Links which take you to a Javadoc page are always in a typewriter font. +Just like Javadoc, all interface names are in italic, and class names are not italicized. Where there are multiple entries in an index with the same name, the heading for them is also in italics, but is not a link. +
    +
    +

    Javadoc

    +This is a link to the top-level Javadoc page for the new version of the product. +
    +
    +

    Overview

    +The overview is the top-level summary of what was removed, added and changed between versions. +
    +
    +

    Package

    +This is a link to the package containing the current changed class or interface. +
    +
    +

    Class

    +This is highlighted when you are looking at the changed class or interface. +
    +
    +

    Text Changes

    +This is a link to the top-level index of all documentation changes for the current package or class. +If it is not present, then there are no documentation changes for the current package or class. +This link can be removed entirely by not using the -docchanges option. +
    +
    +

    Statistics

    +This is a link to a page which shows statistics about the changes between the two APIs. +This link can be removed entirely by not using the -stats option. +
    +
    +

    Help

    +A link to this Help page for JDiff. +
    +
    +

    Prev/Next

    +These links take you to the previous and next changed package or class. +
    +
    +

    Frames/No Frames

    +These links show and hide the HTML frames. All pages are available with or without frames. +
    +
    +

    Complex Changes

    +There are some complex changes which can occur between versions, for example, when two or more methods with the same name change simultaneously, or when a method or field is moved into or from a superclass. +In these cases, the change will be seen as a removal and an addition, rather than as a change. Unexpected removals or additions are often part of one of these type of changes. +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/jdiff_statistics.html b/docs/html/sdk/support_api_diff/25.0.0/changes/jdiff_statistics.html new file mode 100644 index 000000000000..de60506169ae --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/jdiff_statistics.html @@ -0,0 +1,302 @@ + + + + + + + + + +API Change Statistics + + + + + + + + + + +
    +
    +
    +

    API Change Statistics

    +

    The overall difference between API Levels 24.2.0 and 25.0.0 is approximately 1.82%. +

    +
    + +

    Total of Differences, by Number and Type

    +

    +The table below lists the numbers of program elements (packages, classes, constructors, methods, and fields) that were added, changed, or removed. The table includes only the highest-level program elements — that is, if a class with two methods was added, the number of methods added does not include those two methods, but the number of classes added does include that class. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeAdditionsChangesRemovalsTotal
    Packages111012
    Classes and Interfaces513119
    Constructors1203
    Methods183021
    Fields3003
    Total2829158
    +
    + +

    Changed Packages, Sorted by Percentage Difference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Percentage Difference*Package
    25android.support.v4.net
    5android.support.v13.app
    3android.support.v7.app
    3android.support.v4.text
    2android.support.design.widget
    1android.support.v7.widget
    <1android.support.v4.content
    <1android.support.v4.app
    <1android.support.customtabs
    <1android.support.v4.widget
    <1android.support.v4.view
    +

    * See Calculation of Change Percentages, below.

    +
    + +

    Changed Classes and Interfaces, Sorted by Percentage Difference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Percentage
    Difference*
    Class or Interface
    50 +android.support.v4.net.ConnectivityManagerCompat
    33 +android.support.v13.app.ActivityCompat
    20 +android.support.v4.text.BidiFormatter
    11 +android.support.v4.app.ActivityCompat
    6 +android.support.v4.content.ContextCompat
    4 +android.support.v4.widget.SwipeRefreshLayout
    2 +android.support.design.widget.FloatingActionButton
    1 +android.support.v4.app.NotificationCompat.WearableExtender
    1 +android.support.customtabs.CustomTabsIntent
    1 +android.support.v4.view.ViewPager
    <1 +android.support.v7.widget.RecyclerView.LayoutManager
    <1 +android.support.v4.view.ViewCompat
    <1 +android.support.v7.widget.RecyclerView
    +

    * See Calculation of Change Percentages, below.

    +
    +

    Calculation of Change Percentages

    +

    +The percent change statistic reported for all elements in the "to" API Level specification is defined recursively as follows:

    +
    +Percentage difference = 100 * (added + removed + 2*changed)
    +                        -----------------------------------
    +                        sum of public elements in BOTH APIs
    +
    +

    where added is the number of packages added, removed is the number of packages removed, and changed is the number of packages changed. +This definition is applied recursively for the classes and their program elements, so the value for a changed package will be less than 1, unless every class in that package has changed. +The definition ensures that if all packages are removed and all new packages are +added, the change will be 100%.

    +
    + +
    +
    + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/jdiff_topleftframe.html b/docs/html/sdk/support_api_diff/25.0.0/changes/jdiff_topleftframe.html new file mode 100644 index 000000000000..4368791353f0 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/jdiff_topleftframe.html @@ -0,0 +1,63 @@ + + + + + + + + + +Android API Version Differences + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Select a Diffs Index:
    All Differences
    By Package
    By Class
    By Constructor
    By Method
    By Field
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_additions.html b/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_additions.html new file mode 100644 index 000000000000..0ef8e0d7e05a --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_additions.html @@ -0,0 +1,130 @@ + + + + + + + + + +Method Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Methods +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    G  +I +S +U + TOP +

    +getBridgeTag +()
    +getDecoratedBoundsWithMargins +(View, Rect)
    +getDisplay +(View)
    +getProgressViewEndOffset +()
    +getProgressViewStartOffset +()
    +getRestrictBackgroundStatus +(ConnectivityManager)
    +getRippleColor +()
    + +
    I  +G +S +U + TOP +

    +isItemPrefetchEnabled +()
    +isRtl +(CharSequence)
    + +
    S  +G +I +U + TOP +

    +setBackground +(View, Drawable)
    +setBridgeTag +(String)
    +setItemPrefetchEnabled +(boolean)
    +setPageTransformer +(boolean, PageTransformer, int)
    +startActivity +(Context, Intent, Bundle)
    + +
    U  +G +I +S + TOP +

    +unicodeWrap
    +  type  +(CharSequence) in android.support.v4.text.BidiFormatter +
    +  type  +(CharSequence, TextDirectionHeuristicCompat) in android.support.v4.text.BidiFormatter +
    +  type  +(CharSequence, TextDirectionHeuristicCompat, boolean) in android.support.v4.text.BidiFormatter +
    +  type  +(CharSequence, boolean) in android.support.v4.text.BidiFormatter +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_all.html b/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_all.html new file mode 100644 index 000000000000..08df08521bbd --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_all.html @@ -0,0 +1,151 @@ + + + + + + + + + +Method Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Methods +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    G  +I +L +S +U + TOP +

    +getBridgeTag +()
    +getDecoratedBoundsWithMargins +(View, Rect)
    +getDisplay +(View)
    +getProgressViewEndOffset +()
    +getProgressViewStartOffset +()
    +getReferrer +(Activity)
    +getRestrictBackgroundStatus +(ConnectivityManager)
    +getRippleColor +()
    + +
    I  +G +L +S +U + TOP +

    +isItemPrefetchEnabled +()
    +isRtl +(CharSequence)
    + +
    L  +G +I +S +U + TOP +

    +launchUrl +(Context, Uri)
    + +
    S  +G +I +L +U + TOP +

    +setBackground +(View, Drawable)
    +setBridgeTag +(String)
    +setItemPrefetchEnabled +(boolean)
    +setPageTransformer +(boolean, PageTransformer, int)
    +startActivity
    +  type  +(Context, Intent, Bundle) in android.support.v4.app.ActivityCompat +
    +  type  +(Context, Intent, Bundle) in android.support.v4.content.ContextCompat +
    + +
    U  +G +I +L +S + TOP +

    +unicodeWrap
    +  type  +(CharSequence) in android.support.v4.text.BidiFormatter +
    +  type  +(CharSequence, TextDirectionHeuristicCompat) in android.support.v4.text.BidiFormatter +
    +  type  +(CharSequence, TextDirectionHeuristicCompat, boolean) in android.support.v4.text.BidiFormatter +
    +  type  +(CharSequence, boolean) in android.support.v4.text.BidiFormatter +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_changes.html b/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_changes.html new file mode 100644 index 000000000000..b2aae91a2ff7 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_changes.html @@ -0,0 +1,85 @@ + + + + + + + + + +Method Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Methods +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    G  +L +S + TOP +

    +getReferrer +(Activity)
    + +
    L  +G +S + TOP +

    +launchUrl +(Context, Uri)
    + +
    S  +G +L + TOP +

    +startActivity +(Context, Intent, Bundle)
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_removals.html b/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_removals.html new file mode 100644 index 000000000000..d88010f9b13f --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/methods_index_removals.html @@ -0,0 +1,61 @@ + + + + + + + + + +Method Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Methods +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_additions.html b/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_additions.html new file mode 100644 index 000000000000..bcbbaf0ef762 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_additions.html @@ -0,0 +1,65 @@ + + + + + + + + + +Package Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Packages +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    +
    +
    + +android.support.v13.view.inputmethod
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_all.html b/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_all.html new file mode 100644 index 000000000000..bfadc87c424b --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_all.html @@ -0,0 +1,76 @@ + + + + + + + + + +Package Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Packages +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    +
    +
    + +android.support.customtabs
    +android.support.design.widget
    +android.support.v13.app
    +android.support.v13.view.inputmethod
    +android.support.v4.app
    +android.support.v4.content
    +android.support.v4.net
    +android.support.v4.text
    +android.support.v4.view
    +android.support.v4.widget
    +android.support.v7.app
    +android.support.v7.widget
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_changes.html b/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_changes.html new file mode 100644 index 000000000000..df273007c495 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_changes.html @@ -0,0 +1,75 @@ + + + + + + + + + +Package Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Packages +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    +
    +
    + +android.support.customtabs
    +android.support.design.widget
    +android.support.v13.app
    +android.support.v4.app
    +android.support.v4.content
    +android.support.v4.net
    +android.support.v4.text
    +android.support.v4.view
    +android.support.v4.widget
    +android.support.v7.app
    +android.support.v7.widget
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_removals.html b/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_removals.html new file mode 100644 index 000000000000..c91155c64fc4 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/packages_index_removals.html @@ -0,0 +1,63 @@ + + + + + + + + + +Package Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Packages +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.customtabs.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.customtabs.html new file mode 100644 index 000000000000..7e1276de8315 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.customtabs.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.customtabs + + + + + + + + + + +
    +
    +
    +

    +Package android.support.customtabs +

    +

    + + + + + + + + +
    Changed Classes +
    + + CustomTabsIntent +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.design.widget.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.design.widget.html new file mode 100644 index 000000000000..e7326e7452cc --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.design.widget.html @@ -0,0 +1,141 @@ + + + + + + + + + +android.support.design.widget + + + + + + + + + + +
    +
    +
    +

    +Package android.support.design.widget +

    +

    + + + + + + + + + + + + +
    Added Classes and Interfaces +
    + + BottomNavigationView +  
    + + BottomNavigationView.
    OnNavigationItemSelectedListener
    +
     
    +  +

    + + + + + + + + +
    Changed Classes +
    + + FloatingActionButton +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v13.app.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v13.app.html new file mode 100644 index 000000000000..5f9d84e41eb0 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v13.app.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v13.app + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v13.app +

    +

    + + + + + + + + +
    Changed Classes +
    + + ActivityCompat +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.app.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.app.html new file mode 100644 index 000000000000..4ebfbdd970b0 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.app.html @@ -0,0 +1,126 @@ + + + + + + + + + +android.support.v4.app + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.app +

    +

    + + + + + + + + + + + + +
    Changed Classes +
    + + ActivityCompat +  
    + + NotificationCompat.WearableExtender +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.content.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.content.html new file mode 100644 index 000000000000..a5e7ef8b6ad5 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.content.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v4.content + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.content +

    +

    + + + + + + + + +
    Changed Classes +
    + + ContextCompat +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.net.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.net.html new file mode 100644 index 000000000000..978acb25a6f5 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.net.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v4.net + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.net +

    +

    + + + + + + + + +
    Changed Classes +
    + + ConnectivityManagerCompat +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.text.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.text.html new file mode 100644 index 000000000000..821ac2352e55 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.text.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v4.text + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.text +

    +

    + + + + + + + + +
    Changed Classes +
    + + BidiFormatter +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.view.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.view.html new file mode 100644 index 000000000000..062bb90d58e6 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.view.html @@ -0,0 +1,126 @@ + + + + + + + + + +android.support.v4.view + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.view +

    +

    + + + + + + + + + + + + +
    Changed Classes +
    + + ViewCompat +  
    + + ViewPager +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.widget.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.widget.html new file mode 100644 index 000000000000..7c6be7a6d745 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v4.widget.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v4.widget + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.widget +

    +

    + + + + + + + + +
    Changed Classes +
    + + SwipeRefreshLayout +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v7.app.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v7.app.html new file mode 100644 index 000000000000..eaf702c1d1ee --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v7.app.html @@ -0,0 +1,126 @@ + + + + + + + + + +android.support.v7.app + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v7.app +

    +

    + + + + + + + + + + + + +
    Added Classes +
    + + NotificationCompat.DecoratedCustomViewStyle +  
    + + NotificationCompat.DecoratedMediaCustomViewStyle +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v7.widget.html b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v7.widget.html new file mode 100644 index 000000000000..d6c4f1235fc6 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/changes/pkg_android.support.v7.widget.html @@ -0,0 +1,156 @@ + + + + + + + + + +android.support.v7.widget + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v7.widget +

    +

    + + + + + + + + +
    Removed Classes +
    + + Space +  
    +  +

    + + + + + + + + +
    Added Classes +
    + + DividerItemDecoration +  
    +  +

    + + + + + + + + + + + + +
    Changed Classes +
    + + RecyclerView +  
    + + RecyclerView.LayoutManager +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.0.0/missingSinces.txt b/docs/html/sdk/support_api_diff/25.0.0/missingSinces.txt new file mode 100644 index 000000000000..5d93bd9e57c1 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/missingSinces.txt @@ -0,0 +1,27 @@ +NO DOC BLOCK: android.support.design.widget.BottomNavigationView Class +NO DOC BLOCK: android.support.design.widget.BottomNavigationView.OnNavigationItemSelectedListener Interface +NO DOC BLOCK: android.support.v7.widget.DividerItemDecoration Class +NO DOC BLOCK: android.support.v7.app.NotificationCompat.DecoratedCustomViewStyle Class +NO DOC BLOCK: android.support.v7.app.NotificationCompat.DecoratedMediaCustomViewStyle Class +NO DOC BLOCK: android.support.v13.app.ActivityCompat Constructor () +NO DOC BLOCK: android.support.v4.app.NotificationCompat.WearableExtender Method getBridgeTag() +NO DOC BLOCK: android.support.v7.widget.RecyclerView Method getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect) +NO DOC BLOCK: android.support.v4.view.ViewCompat Method getDisplay(android.view.View) +NO DOC BLOCK: android.support.v4.widget.SwipeRefreshLayout Method getProgressViewEndOffset() +NO DOC BLOCK: android.support.v4.widget.SwipeRefreshLayout Method getProgressViewStartOffset() +NO DOC BLOCK: android.support.v4.net.ConnectivityManagerCompat Method getRestrictBackgroundStatus(android.net.ConnectivityManager) +NO DOC BLOCK: android.support.design.widget.FloatingActionButton Method getRippleColor() +NO DOC BLOCK: android.support.v7.widget.RecyclerView.LayoutManager Method isItemPrefetchEnabled() +NO DOC BLOCK: android.support.v4.text.BidiFormatter Method isRtl(java.lang.CharSequence) +NO DOC BLOCK: android.support.v4.view.ViewCompat Method setBackground(android.view.View, android.graphics.drawable.Drawable) +NO DOC BLOCK: android.support.v4.app.NotificationCompat.WearableExtender Method setBridgeTag(java.lang.String) +NO DOC BLOCK: android.support.v7.widget.RecyclerView.LayoutManager Method setItemPrefetchEnabled(boolean) +NO DOC BLOCK: android.support.v4.view.ViewPager Method setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer, int) +NO DOC BLOCK: android.support.v4.content.ContextCompat Method startActivity(android.content.Context, android.content.Intent, android.os.Bundle) +NO DOC BLOCK: android.support.v4.text.BidiFormatter Method unicodeWrap(java.lang.CharSequence) +NO DOC BLOCK: android.support.v4.text.BidiFormatter Method unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat) +NO DOC BLOCK: android.support.v4.text.BidiFormatter Method unicodeWrap(java.lang.CharSequence, android.support.v4.text.TextDirectionHeuristicCompat, boolean) +NO DOC BLOCK: android.support.v4.text.BidiFormatter Method unicodeWrap(java.lang.CharSequence, boolean) +NO DOC BLOCK: android.support.v4.net.ConnectivityManagerCompat Field RESTRICT_BACKGROUND_STATUS_DISABLED +NO DOC BLOCK: android.support.v4.net.ConnectivityManagerCompat Field RESTRICT_BACKGROUND_STATUS_ENABLED +NO DOC BLOCK: android.support.v4.net.ConnectivityManagerCompat Field RESTRICT_BACKGROUND_STATUS_WHITELISTED diff --git a/docs/html/sdk/support_api_diff/25.0.0/stylesheet-jdiff.css b/docs/html/sdk/support_api_diff/25.0.0/stylesheet-jdiff.css new file mode 100644 index 000000000000..edafaa3da3e5 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/stylesheet-jdiff.css @@ -0,0 +1,44 @@ + +/* (http://www.jdiff.org) */ + +div.and-diff-id {border: 1px solid #eee;position:relative;float:right;clear:both;padding:0px;} +table.diffspectable {border:1px;padding:0px;margin:0px;} +.diffspechead {background-color:#eee;} +.diffspectable tr {border:0px;padding:0px;} +.diffspectable td {background-color:eee;border:0px;font-size:90%;font-weight:normal;padding:0px;padding-left:1px;padding-right:1px;text-align:center;color:777;} +td.diffvalueold {color:orange;background-color:white;border:0px;font-size:80%;font-style:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;} +td.diffvaluenew {color:green;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;} +td.diffvalue {color:444;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;} +td.diffspec {background-color:white;border:0px;font-size:80%;font-weight:normal;padding:1px;color:444;text-align:right;padding-right:.5em;line-height:.95em;} +tt {font-size:11pt;font-family:monospace;} +.indexHeader { + font-size:96%; + line-height:.8em;} +.jdiffIndex td { + font-size:96%; + xline-height:.8em; + padding:2px; + padding-left:1em;} +.indexText { + font-size:100%; + padding-left:1em;} +#indexTableCaption { + font-size:96%; + margin-top:.25em; + margin-bottom:0; + } +.hiddenlink { + font-size:96%; + line-height:.8em; + text-decoration:none;} +a { + text-decoration:none;} +a:hover { + text-decoration:underline;} +.indexBox { + border: 1px solid red; + margin:1em 0 0 0;} +.letterIndexHead { + font-size: 1.5em;font-weight:9; + margin:0 0 0em 0; + border: 1px solid red;} diff --git a/docs/html/sdk/support_api_diff/25.0.0/user_comments_for_24.2.0_to_25.0.0.xml b/docs/html/sdk/support_api_diff/25.0.0/user_comments_for_24.2.0_to_25.0.0.xml new file mode 100644 index 000000000000..9091eb67f029 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.0.0/user_comments_for_24.2.0_to_25.0.0.xml @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes.html b/docs/html/sdk/support_api_diff/25.1.0/changes.html new file mode 100644 index 000000000000..269519ec9eb4 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes.html @@ -0,0 +1,45 @@ + + + + + + + + + + +Support Library API Differences Report + + + + + + + + + + + + + + +<h2> +Frame Alert +</h2> + +<p> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<br> +Link to <a href="changes/changes-summary.html" target="_top">Non-frame version.</A> + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_additions.html b/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_additions.html new file mode 100644 index 000000000000..8b8446efb070 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_additions.html @@ -0,0 +1,579 @@ + + + + + + + + + +All Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Differences +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + +
    A  +B +C +E +F +G +I +M +O +P +R +S +U + TOP +

    +AnimatedVectorDrawableCompat
    + +ArraySet
    + +attachToView +(View)
    + + +
    B  +A +C +E +F +G +I +M +O +P +R +S +U + TOP +

    +BaseTransientBottomBar
    + +BaseTransientBottomBar.BaseCallback
    + +BaseTransientBottomBar.ContentViewCallback
    + + +
    C  +A +B +E +F +G +I +M +O +P +R +S +U + TOP +

    +clearDrawable +()
    + +collapseAction
    +  type  +(boolean) in android.support.v17.leanback.app.GuidedStepFragment +
    + +  type  +(boolean) in android.support.v17.leanback.app.GuidedStepSupportFragment +
    + +  type  +(boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    + +createSnapScroller +(LayoutManager)
    + + +
    E  +A +B +C +F +G +I +M +O +P +R +S +U + TOP +

    +expandAction
    +  type  +(GuidedAction, boolean) in android.support.v17.leanback.app.GuidedStepFragment +
    + +  type  +(GuidedAction, boolean) in android.support.v17.leanback.app.GuidedStepSupportFragment +
    + +  type  +(GuidedAction, boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    + + +
    F  +A +B +C +E +G +I +M +O +P +R +S +U + TOP +

    +findRowViewHolderByPosition
    +  type  +(int) in android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter +
    + +  type  +(int) in android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter +
    + +  type  +(int) in android.support.v17.leanback.app.RowsFragment +
    + +  type  +(int) in android.support.v17.leanback.app.RowsSupportFragment +
    + +FragmentManager.FragmentLifecycleCallbacks
    + + +
    G  +A +B +C +E +F +I +M +O +P +R +S +U + TOP +

    +getBluetoothRoute +()
    + +getBufferedProgressLong +()
    + +getCurrentTimeLong +()
    + +getDescription +()
    + +getEventHandler
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlayFragment +
    + +  type  +() in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    + +getGravity +()
    + +getMainFragment
    +  type  +() in android.support.v17.leanback.app.BrowseFragment +
    + +  type  +() in android.support.v17.leanback.app.BrowseSupportFragment +
    + +getMediaController +(Activity)
    + +getPreferenceComparisonCallback +()
    + +getRecycledViewCount +(int)
    + +getSelectedItem +()
    + +getSelectedItemViewHolder +()
    + +getSelectedRowViewHolder
    +  type  +() in android.support.v17.leanback.app.BrowseFragment +
    + +  type  +() in android.support.v17.leanback.app.BrowseSupportFragment +
    + +getTotalTimeLong +()
    + +getVerticalGridView
    +  type  +() in android.support.v17.leanback.app.BaseRowFragment +
    + +  type  +() in android.support.v17.leanback.app.BaseRowSupportFragment +
    + + +
    I  +A +B +C +E +F +G +M +O +P +R +S +U + TOP +

    +isAtLeastO +()
    + +isAutoReleaseOnStop +()
    + +isBackKeyToCollapseActivatorView +()
    + +isBackKeyToCollapseSubActions +()
    + +isBluetooth +()
    + +isDeviceSpeaker +()
    + +isExpanded
    +  type  +() in android.support.v17.leanback.app.GuidedStepFragment +
    + +  type  +() in android.support.v17.leanback.app.GuidedStepSupportFragment +
    + +  type  +() in android.support.v17.leanback.widget.GuidedActionsStylist +
    + +isVirtual +()
    + + +
    M  +A +B +C +E +F +G +I +O +P +R +S +U + TOP +

    +MediaControllerGlue +(Context, PlaybackGlueHost, int[], int[]) constructor
    + + +
    O  +A +B +C +E +F +G +I +M +P +R +S +U + TOP +

    +onChildViewHolderSelectedAndPositioned +(RecyclerView, ViewHolder, int, int)
    + +onEditingModeChange +(ViewHolder, boolean, boolean)
    + + +
    P  +A +B +C +E +F +G +I +M +O +R +S +U + TOP +

    +PagerSnapHelper
    + +PlaybackControlGlue +(Context, PlaybackGlueHost, int[], int[]) constructor
    + +PlaybackControlGlue.InputEventHandler
    + +PlaybackFragment
    + +PlaybackFragment.OnFadeCompleteListener
    + +PlaybackFragmentGlueHost
    + +PlaybackGlue
    + +PlaybackGlue.HostLifecycleCallback
    + +PlaybackGlue.PlaybackGlueHost
    + +PlaybackGlue.PlayerCallback
    + +PlaybackRowPresenter
    + +PlaybackRowPresenter.ViewHolder
    + +PlaybackSupportFragment
    + +PlaybackSupportFragment.OnFadeCompleteListener
    + +PlaybackSupportFragmentGlueHost
    + +postponeEnterTransition +()
    + +PreferenceManager.PreferenceComparisonCallback
    + +PreferenceManager.SimplePreferenceComparisonCallback
    + + +
    R  +A +B +C +E +F +G +I +M +O +P +S +U + TOP +

    +registerFragmentLifecycleCallbacks +(FragmentLifecycleCallbacks, boolean)
    + + +
    S  +A +B +C +E +F +G +I +M +O +P +R +U + TOP +

    +SeekBarPreference
    + +setAllowOptimization +(boolean)
    + +setAutoReleaseOnStop +(boolean)
    + +setBackKeyToCollapseActivatorView +(boolean)
    + +setBackKeyToCollapseSubActions +(boolean)
    + +setBufferedProgressLong +(long)
    + +setCurrentTimeLong +(long)
    + +setDescription +(CharSequence)
    + +setErrorTextAppearance +(int)
    + +setEventHandler
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlayFragment +
    + +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    + +setListeningOrbColors +(Colors)
    + +setMediaController +(Activity, MediaControllerCompat)
    + +setNotListeningOrbColors +(Colors)
    + +setOnDispatchKeyListener +(OnKeyListener)
    + +setPreferenceComparisonCallback +(PreferenceComparisonCallback)
    + +setSearchAffordanceColors
    +  type  +(Colors) in android.support.v17.leanback.app.SearchFragment +
    + +  type  +(Colors) in android.support.v17.leanback.app.SearchSupportFragment +
    + +  type  +(Colors) in android.support.v17.leanback.widget.SearchBar +
    + +setSearchAffordanceColorsInListening
    +  type  +(Colors) in android.support.v17.leanback.app.SearchFragment +
    + +  type  +(Colors) in android.support.v17.leanback.app.SearchSupportFragment +
    + +  type  +(Colors) in android.support.v17.leanback.widget.SearchBar +
    + +setTitle +(CharSequence)
    + +setTotalTimeLong +(long)
    + +smoothScrollBy +(int, int, Interpolator)
    + +startPostponedEnterTransition +()
    + +SurfaceHolderGlueHost
    + + +
    U  +A +B +C +E +F +G +I +M +O +P +R +S + TOP +

    +unregisterFragmentLifecycleCallbacks +(FragmentLifecycleCallbacks)
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_all.html b/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_all.html new file mode 100644 index 000000000000..4b3966cecf9e --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_all.html @@ -0,0 +1,1126 @@ + + + + + + + + + +All Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Differences +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + +android.support.design.widget
    + +android.support.graphics.drawable
    + +android.support.v17.leanback.app
    + +android.support.v17.leanback.widget
    + +android.support.v17.preference
    + +android.support.v4.app
    + +android.support.v4.media.session
    + +android.support.v4.os
    + +android.support.v4.provider
    + +android.support.v4.util
    + +android.support.v7.app
    + +android.support.v7.media
    + +android.support.v7.preference
    + +android.support.v7.widget
    + +AnimatedVectorDrawableCompat
    + +ArraySet
    + +attachToView +(View)
    + + +
    B  +A +C +D +E +F +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +BackgroundManager
    + +BaseCardView
    + +BaseRowFragment
    + +BaseRowSupportFragment
    + +BaseTransientBottomBar
    + +BaseTransientBottomBar.BaseCallback
    + +BaseTransientBottomBar.ContentViewCallback
    + +BrowseFragment
    + +BrowseFragment.MainFragmentRowsAdapter
    + +BrowseFrameLayout
    + +BrowseSupportFragment
    + +BrowseSupportFragment.MainFragmentRowsAdapter
    + +BuildCompat
    + + +
    C  +A +B +D +E +F +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +clearDrawable +()
    + +collapseAction
    +  type  +(boolean) in android.support.v17.leanback.app.GuidedStepFragment +
    + +  type  +(boolean) in android.support.v17.leanback.app.GuidedStepSupportFragment +
    + +  type  +(boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    + +createControlsRowAndPresenter +()
    + +createPrimaryActionsAdapter +(PresenterSelector)
    + +createSnapScroller +(LayoutManager)
    + + +
    D  +A +B +C +E +F +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +dismiss +()
    + +DocumentFile
    + + +
    E  +A +B +C +D +F +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +enableProgressUpdating +(boolean)
    + +expandAction
    +  type  +(GuidedAction, boolean) in android.support.v17.leanback.app.GuidedStepFragment +
    + +  type  +(GuidedAction, boolean) in android.support.v17.leanback.app.GuidedStepSupportFragment +
    + +  type  +(GuidedAction, boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    + + +
    F  +A +B +C +D +E +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +findRowViewHolderByPosition
    +  type  +(int) in android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter +
    + +  type  +(int) in android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter +
    + +  type  +(int) in android.support.v17.leanback.app.RowsFragment +
    + +  type  +(int) in android.support.v17.leanback.app.RowsSupportFragment +
    + +Fragment
    + +FragmentActivity
    + +FragmentManager
    + +FragmentManager.FragmentLifecycleCallbacks
    + +FragmentTransaction
    + + +
    G  +A +B +C +D +E +F +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +getBluetoothRoute +()
    + +getBufferedProgressLong +()
    + +getContext
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +getControlsRow +()
    + +getCurrentPosition +()
    + +getCurrentSpeedId +()
    + +getCurrentTimeLong +()
    + +getDefaultDimLayer +()
    + +getDescription +()
    + +getDimLayer +()
    + +getDuration +()
    + +getEventHandler
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlayFragment +
    + +  type  +() in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    + +getExtraVisibility +()
    + +getFastForwardSpeeds +()
    + +getFragment
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +getGravity +()
    + +getInputEventHandler
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlayFragment +
    + +  type  +() in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    + +getMainFragment
    +  type  +() in android.support.v17.leanback.app.BrowseFragment +
    + +  type  +() in android.support.v17.leanback.app.BrowseSupportFragment +
    + +getMediaArt +()
    + +getMediaController +(Activity)
    + +getMediaDuration +()
    + +getMediaSubtitle +()
    + +getMediaTitle +()
    + +getOnItemViewClickedListener
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +getPreferenceComparisonCallback +()
    + +getRecycledViewCount +(int)
    + +getRewindSpeeds +()
    + +getSelectedItem +()
    + +getSelectedItemViewHolder +()
    + +getSelectedRowViewHolder
    +  type  +() in android.support.v17.leanback.app.BrowseFragment +
    + +  type  +() in android.support.v17.leanback.app.BrowseSupportFragment +
    + +getSupportedActions +()
    + +getSupportMediaController +()
    + +getTotalTimeLong +()
    + +getUpdatePeriod +()
    + +getVerticalGridView
    +  type  +() in android.support.v17.leanback.app.BaseRowFragment +
    + +  type  +() in android.support.v17.leanback.app.BaseRowSupportFragment +
    + +getView +()
    + +GuidedActionsStylist
    + +GuidedStepFragment
    + +GuidedStepSupportFragment
    + + +
    H  +A +B +C +D +E +F +G +I +L +M +N +O +P +R +S +T +U + TOP +

    +handleInputEvent
    +  type  +(InputEvent) in android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler +
    + +  type  +(InputEvent) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler +
    + +hasValidMedia +()
    + +HeaderItem
    + + +
    I  +A +B +C +D +E +F +G +H +L +M +N +O +P +R +S +T +U + TOP +

    +isAtLeastO +()
    + +isAutoReleaseOnStop +()
    + +isBackKeyToCollapseActivatorView +()
    + +isBackKeyToCollapseSubActions +()
    + +isBluetooth +()
    + +isDeviceSpeaker +()
    + +isExpanded
    +  type  +() in android.support.v17.leanback.app.GuidedStepFragment +
    + +  type  +() in android.support.v17.leanback.app.GuidedStepSupportFragment +
    + +  type  +() in android.support.v17.leanback.widget.GuidedActionsStylist +
    + +isFadingEnabled +()
    + +isMediaPlaying +()
    + +isShown +()
    + +isShownOrQueued +()
    + +isVirtual +()
    + + +
    L  +A +B +C +D +E +F +G +H +I +M +N +O +P +R +S +T +U + TOP +

    +LeanbackPreferenceFragment
    + +LinearLayoutCompat
    + + +
    M  +A +B +C +D +E +F +G +H +I +L +N +O +P +R +S +T +U + TOP +

    +MediaControllerCompat
    + +MediaControllerGlue
    +  android.support.v17.leanback.app
    + +  MediaControllerGlue +(Context, PlaybackGlueHost, int[], int[]) constructor
    + +  MediaControllerGlue +(Context, PlaybackOverlayFragment, int[]) constructor
    + +  MediaControllerGlue +(Context, PlaybackOverlayFragment, int[], int[]) constructor
    + +MediaRouteChooserDialog
    + +MediaRouter
    + +MediaRouter.RouteInfo
    + + +
    N  +A +B +C +D +E +F +G +H +I +L +M +O +P +R +S +T +U + TOP +

    +notifyItemRangeChanged +(int, int)
    + + +
    O  +A +B +C +D +E +F +G +H +I +L +M +N +P +R +S +T +U + TOP +

    +ObjectAdapter
    + +onActionClicked +(Action)
    + +onChildViewHolderSelectedAndPositioned +(RecyclerView, ViewHolder, int, int)
    + +OnChildViewHolderSelectedListener
    + +onEditingModeChange
    +  type  +(ViewHolder, boolean, boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    + +  type  +(ViewHolder, GuidedAction, boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    + +onKey +(View, int, KeyEvent)
    + +onMetadataChanged +()
    + +onRowChanged
    +  type  +(PlaybackControlsRow) in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +(PlaybackControlsRow) in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +onStateChanged +()
    + + +
    P  +A +B +C +D +E +F +G +H +I +L +M +N +O +R +S +T +U + TOP +

    +PagerSnapHelper
    + +pausePlayback
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +PlaybackControlGlue
    +  android.support.v17.leanback.app
    + +  PlaybackControlGlue +(Context, PlaybackGlueHost, int[], int[]) constructor
    + +  PlaybackControlGlue +(Context, PlaybackOverlayFragment, int[]) constructor
    + +  PlaybackControlGlue +(Context, PlaybackOverlayFragment, int[], int[]) constructor
    + +PlaybackControlGlue.InputEventHandler
    + +PlaybackControlsRow
    + +PlaybackControlsRowPresenter
    + +PlaybackControlsRowPresenter.ViewHolder
    + +PlaybackControlSupportGlue
    + +PlaybackFragment
    + +PlaybackFragment.OnFadeCompleteListener
    + +PlaybackFragmentGlueHost
    + +PlaybackGlue
    + +PlaybackGlue.HostLifecycleCallback
    + +PlaybackGlue.PlaybackGlueHost
    + +PlaybackGlue.PlayerCallback
    + +PlaybackOverlayFragment
    + +PlaybackOverlayFragment.InputEventHandler
    + +PlaybackOverlaySupportFragment
    + +PlaybackOverlaySupportFragment.InputEventHandler
    + +PlaybackRowPresenter
    + +PlaybackRowPresenter.ViewHolder
    + +PlaybackSupportFragment
    + +PlaybackSupportFragment.OnFadeCompleteListener
    + +PlaybackSupportFragmentGlueHost
    + +postponeEnterTransition +()
    + +PreferenceManager
    + +PreferenceManager.PreferenceComparisonCallback
    + +PreferenceManager.SimplePreferenceComparisonCallback
    + + +
    R  +A +B +C +D +E +F +G +H +I +L +M +N +O +P +S +T +U + TOP +

    +RecyclerView
    + +RecyclerView.RecycledViewPool
    + +registerFragmentLifecycleCallbacks +(FragmentLifecycleCallbacks, boolean)
    + +RowPresenter.ViewHolder
    + +RowsFragment
    + +RowsSupportFragment
    + + +
    S  +A +B +C +D +E +F +G +H +I +L +M +N +O +P +R +T +U + TOP +

    +SearchBar
    + +SearchFragment
    + +SearchSupportFragment
    + +SeekBarPreference
    + +setAllowOptimization +(boolean)
    + +setAutoReleaseOnStop +(boolean)
    + +setBackKeyToCollapseActivatorView +(boolean)
    + +setBackKeyToCollapseSubActions +(boolean)
    + +setBufferedProgressLong +(long)
    + +setCallback +(Callback)
    + +setControlsRow +(PlaybackControlsRow)
    + +setCurrentTimeLong +(long)
    + +setDescription +(CharSequence)
    + +setDimLayer +(Drawable)
    + +setDuration +(int)
    + +setEditingMode +(ViewHolder, GuidedAction, boolean)
    + +setErrorTextAppearance +(int)
    + +setEventHandler
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlayFragment +
    + +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    + +setExpandedViewHolder +(ViewHolder)
    + +setExtraVisibility +(int)
    + +setFadingEnabled +(boolean)
    + +setInputEventHandler
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlayFragment +
    + +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    + +setListeningOrbColors +(Colors)
    + +setMediaController +(Activity, MediaControllerCompat)
    + +setNotListeningOrbColors +(Colors)
    + +setOnDispatchKeyListener +(OnKeyListener)
    + +setOnItemViewClickedListener +(OnItemViewClickedListener)
    + +setPreferenceComparisonCallback +(PreferenceComparisonCallback)
    + +setSearchAffordanceColors
    +  type  +(Colors) in android.support.v17.leanback.app.SearchFragment +
    + +  type  +(Colors) in android.support.v17.leanback.app.SearchSupportFragment +
    + +  type  +(Colors) in android.support.v17.leanback.widget.SearchBar +
    + +setSearchAffordanceColorsInListening
    +  type  +(Colors) in android.support.v17.leanback.app.SearchFragment +
    + +  type  +(Colors) in android.support.v17.leanback.app.SearchSupportFragment +
    + +  type  +(Colors) in android.support.v17.leanback.widget.SearchBar +
    + +setSupportMediaController +(MediaControllerCompat)
    + +setTitle +(CharSequence)
    + +setTotalTimeLong +(long)
    + +show +()
    + +skipToNext
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +skipToPrevious
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +smoothScrollBy +(int, int, Interpolator)
    + +Snackbar
    + +Snackbar.Callback
    + +SnapHelper
    + +SpeechOrbView
    + +startExpandedTransition +(ViewHolder)
    + +startPlayback
    +  type  +(int) in android.support.v17.leanback.app.MediaControllerGlue +
    + +  type  +(int) in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +(int) in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +startPostponedEnterTransition +()
    + +SurfaceHolderGlueHost
    + + +
    T  +A +B +C +D +E +F +G +H +I +L +M +N +O +P +R +S +U + TOP +

    +TextInputLayout
    + + +
    U  +A +B +C +D +E +F +G +H +I +L +M +N +O +P +R +S +T + TOP +

    +unregisterFragmentLifecycleCallbacks +(FragmentLifecycleCallbacks)
    + +updateProgress +()
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_changes.html b/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_changes.html new file mode 100644 index 000000000000..3078b6a12231 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_changes.html @@ -0,0 +1,804 @@ + + + + + + + + + +All Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Differences +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + +android.support.design.widget
    + +android.support.graphics.drawable
    + +android.support.v17.leanback.app
    + +android.support.v17.leanback.widget
    + +android.support.v17.preference
    + +android.support.v4.app
    + +android.support.v4.media.session
    + +android.support.v4.os
    + +android.support.v4.provider
    + +android.support.v4.util
    + +android.support.v7.app
    + +android.support.v7.media
    + +android.support.v7.preference
    + +android.support.v7.widget
    + + +
    B  +A +C +D +E +F +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +BackgroundManager
    + +BaseCardView
    + +BaseRowFragment
    + +BaseRowSupportFragment
    + +BrowseFragment
    + +BrowseFragment.MainFragmentRowsAdapter
    + +BrowseFrameLayout
    + +BrowseSupportFragment
    + +BrowseSupportFragment.MainFragmentRowsAdapter
    + +BuildCompat
    + + +
    C  +A +B +D +E +F +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +createControlsRowAndPresenter +()
    + +createPrimaryActionsAdapter +(PresenterSelector)
    + + +
    D  +A +B +C +E +F +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +dismiss +()
    + +DocumentFile
    + + +
    E  +A +B +C +D +F +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +enableProgressUpdating +(boolean)
    + + +
    F  +A +B +C +D +E +G +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +Fragment
    + +FragmentActivity
    + +FragmentManager
    + +FragmentTransaction
    + + +
    G  +A +B +C +D +E +F +H +I +L +M +N +O +P +R +S +T +U + TOP +

    +getContext
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +getControlsRow +()
    + +getCurrentPosition +()
    + +getCurrentSpeedId +()
    + +getDefaultDimLayer +()
    + +getDimLayer +()
    + +getDuration +()
    + +getExtraVisibility +()
    + +getFastForwardSpeeds +()
    + +getFragment
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +getInputEventHandler
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlayFragment +
    + +  type  +() in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    + +getMediaArt +()
    + +getMediaDuration +()
    + +getMediaSubtitle +()
    + +getMediaTitle +()
    + +getOnItemViewClickedListener
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +getRewindSpeeds +()
    + +getSupportedActions +()
    + +getSupportMediaController +()
    + +getUpdatePeriod +()
    + +getView +()
    + +GuidedActionsStylist
    + +GuidedStepFragment
    + +GuidedStepSupportFragment
    + + +
    H  +A +B +C +D +E +F +G +I +L +M +N +O +P +R +S +T +U + TOP +

    +hasValidMedia +()
    + +HeaderItem
    + + +
    I  +A +B +C +D +E +F +G +H +L +M +N +O +P +R +S +T +U + TOP +

    +isFadingEnabled +()
    + +isMediaPlaying +()
    + +isShown +()
    + +isShownOrQueued +()
    + + +
    L  +A +B +C +D +E +F +G +H +I +M +N +O +P +R +S +T +U + TOP +

    +LeanbackPreferenceFragment
    + +LinearLayoutCompat
    + + +
    M  +A +B +C +D +E +F +G +H +I +L +N +O +P +R +S +T +U + TOP +

    +MediaControllerCompat
    + +MediaControllerGlue
    +  android.support.v17.leanback.app
    + +  MediaControllerGlue +(Context, PlaybackOverlayFragment, int[]) constructor
    + +  MediaControllerGlue +(Context, PlaybackOverlayFragment, int[], int[]) constructor
    + +MediaRouteChooserDialog
    + +MediaRouter
    + +MediaRouter.RouteInfo
    + + +
    N  +A +B +C +D +E +F +G +H +I +L +M +O +P +R +S +T +U + TOP +

    +notifyItemRangeChanged +(int, int)
    + + +
    O  +A +B +C +D +E +F +G +H +I +L +M +N +P +R +S +T +U + TOP +

    +ObjectAdapter
    + +onActionClicked +(Action)
    + +OnChildViewHolderSelectedListener
    + +onEditingModeChange +(ViewHolder, GuidedAction, boolean)
    + +onKey +(View, int, KeyEvent)
    + +onMetadataChanged +()
    + +onRowChanged
    +  type  +(PlaybackControlsRow) in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +(PlaybackControlsRow) in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +onStateChanged +()
    + + +
    P  +A +B +C +D +E +F +G +H +I +L +M +N +O +R +S +T +U + TOP +

    +pausePlayback
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +PlaybackControlGlue
    +  android.support.v17.leanback.app
    + +  PlaybackControlGlue +(Context, PlaybackOverlayFragment, int[]) constructor
    + +  PlaybackControlGlue +(Context, PlaybackOverlayFragment, int[], int[]) constructor
    + +PlaybackControlsRow
    + +PlaybackControlsRowPresenter
    + +PlaybackControlsRowPresenter.ViewHolder
    + +PlaybackControlSupportGlue
    + +PlaybackOverlayFragment
    + +PlaybackOverlayFragment.InputEventHandler
    + +PlaybackOverlaySupportFragment
    + +PlaybackOverlaySupportFragment.InputEventHandler
    + +PreferenceManager
    + + +
    R  +A +B +C +D +E +F +G +H +I +L +M +N +O +P +S +T +U + TOP +

    +RecyclerView
    + +RecyclerView.RecycledViewPool
    + +RowPresenter.ViewHolder
    + +RowsFragment
    + +RowsSupportFragment
    + + +
    S  +A +B +C +D +E +F +G +H +I +L +M +N +O +P +R +T +U + TOP +

    +SearchBar
    + +SearchFragment
    + +SearchSupportFragment
    + +setCallback +(Callback)
    + +setControlsRow +(PlaybackControlsRow)
    + +setDimLayer +(Drawable)
    + +setDuration +(int)
    + +setEditingMode +(ViewHolder, GuidedAction, boolean)
    + +setExpandedViewHolder +(ViewHolder)
    + +setExtraVisibility +(int)
    + +setFadingEnabled +(boolean)
    + +setInputEventHandler
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlayFragment +
    + +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    + +setOnItemViewClickedListener +(OnItemViewClickedListener)
    + +setSupportMediaController +(MediaControllerCompat)
    + +show +()
    + +skipToNext
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +skipToPrevious
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +Snackbar
    + +Snackbar.Callback
    + +SnapHelper
    + +SpeechOrbView
    + +startExpandedTransition +(ViewHolder)
    + +startPlayback
    +  type  +(int) in android.support.v17.leanback.app.MediaControllerGlue +
    + +  type  +(int) in android.support.v17.leanback.app.PlaybackControlGlue +
    + +  type  +(int) in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + + +
    T  +A +B +C +D +E +F +G +H +I +L +M +N +O +P +R +S +U + TOP +

    +TextInputLayout
    + + +
    U  +A +B +C +D +E +F +G +H +I +L +M +N +O +P +R +S +T + TOP +

    +updateProgress +()
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_removals.html b/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_removals.html new file mode 100644 index 000000000000..444161432d10 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/alldiffs_index_removals.html @@ -0,0 +1,74 @@ + + + + + + + + + +All Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Differences +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + +
    H  + TOP +

    +handleInputEvent
    +  type  +(InputEvent) in android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler +
    + +  type  +(InputEvent) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.design.widget.Snackbar.Callback.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.design.widget.Snackbar.Callback.html new file mode 100644 index 000000000000..379adb428d7a --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.design.widget.Snackbar.Callback.html @@ -0,0 +1,109 @@ + + + + + + + + + +android.support.design.widget.Snackbar.Callback + + + + + + + + + + +
    +
    +
    +

    +Class android.support.design.widget.Snackbar.Callback +

    +

    The superclass changed from java.lang.Object to android.support.design.widget.BaseTransientBottomBar.BaseCallback.
    +

    Changed from abstract to non-abstract. + + + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.design.widget.Snackbar.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.design.widget.Snackbar.html new file mode 100644 index 000000000000..2b64f0601655 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.design.widget.Snackbar.html @@ -0,0 +1,197 @@ + + + + + + + + + +android.support.design.widget.Snackbar + + + + + + + + + + +
    +
    +
    +

    +Class android.support.design.widget.Snackbar +

    +

    The superclass changed from java.lang.Object to android.support.design.widget.BaseTransientBottomBar.
    + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Changed Methods +
    + + void dismiss() + +Method was locally defined, but is now inherited from BaseTransientBottomBar. +  
    + + int getDuration() + +Method was locally defined, but is now inherited from BaseTransientBottomBar. +  
    + + View getView() + +Method was locally defined, but is now inherited from BaseTransientBottomBar. +  
    + + boolean isShown() + +Method was locally defined, but is now inherited from BaseTransientBottomBar. +  
    + + boolean isShownOrQueued() + +Method was locally defined, but is now inherited from BaseTransientBottomBar. +  
    + + Snackbar setCallback(Callback) + +Now deprecated.
    +
     
    + + B setDuration(int) + +Change in return type from Snackbar to B.
    + Method was locally defined, but is now inherited from BaseTransientBottomBar. +
     
    + + void show() + +Method was locally defined, but is now inherited from BaseTransientBottomBar. +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.design.widget.TextInputLayout.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.design.widget.TextInputLayout.html new file mode 100644 index 000000000000..67422f96b561 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.design.widget.TextInputLayout.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.design.widget.TextInputLayout + + + + + + + + + + +
    +
    +
    +

    +Class android.support.design.widget.TextInputLayout +

    + + +

    + + + + + + + + +
    Added Methods +
    + + void setErrorTextAppearance(int) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BackgroundManager.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BackgroundManager.html new file mode 100644 index 000000000000..0a71e6aa9f9d --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BackgroundManager.html @@ -0,0 +1,181 @@ + + + + + + + + + +android.support.v17.leanback.app.BackgroundManager + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.BackgroundManager +

    + + +

    + + + + + + + + + + + + + + + + + + + + +
    Added Methods +
    + + void attachToView(View) +  
    + + void clearDrawable() +  
    + + boolean isAutoReleaseOnStop() +  
    + + void setAutoReleaseOnStop(boolean) +  
    +  +

    + + + + + + + + + + + + + + + + + + + +
    Changed Methods +
    + + Drawable getDefaultDimLayer() + +Now deprecated.
    +
     
    + + Drawable getDimLayer() + +Now deprecated.
    +
     
    + + void setDimLayer(Drawable) + +Now deprecated.
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BaseRowFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BaseRowFragment.html new file mode 100644 index 000000000000..c798e246bc0e --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BaseRowFragment.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v17.leanback.app.BaseRowFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.BaseRowFragment +

    + + +

    + + + + + + + + +
    Added Methods +
    + + VerticalGridView getVerticalGridView() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BaseRowSupportFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BaseRowSupportFragment.html new file mode 100644 index 000000000000..3487eff97746 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BaseRowSupportFragment.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v17.leanback.app.BaseRowSupportFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.BaseRowSupportFragment +

    + + +

    + + + + + + + + +
    Added Methods +
    + + VerticalGridView getVerticalGridView() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter.html new file mode 100644 index 000000000000..c5f37183f2e8 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter +

    + + +

    + + + + + + + + +
    Added Methods +
    + + ViewHolder findRowViewHolderByPosition(int) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseFragment.html new file mode 100644 index 000000000000..753fb6a5d709 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseFragment.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v17.leanback.app.BrowseFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.BrowseFragment +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + Fragment getMainFragment() +  
    + + ViewHolder getSelectedRowViewHolder() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter.html new file mode 100644 index 000000000000..999b145ef932 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter +

    + + +

    + + + + + + + + +
    Added Methods +
    + + ViewHolder findRowViewHolderByPosition(int) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html new file mode 100644 index 000000000000..989a41257b9f --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.BrowseSupportFragment.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v17.leanback.app.BrowseSupportFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.BrowseSupportFragment +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + Fragment getMainFragment() +  
    + + ViewHolder getSelectedRowViewHolder() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html new file mode 100644 index 000000000000..3d404854c942 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.GuidedStepFragment.html @@ -0,0 +1,136 @@ + + + + + + + + + +android.support.v17.leanback.app.GuidedStepFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.GuidedStepFragment +

    + + +

    + + + + + + + + + + + + + + + + +
    Added Methods +
    + + void collapseAction(boolean) +  
    + + void expandAction(GuidedAction, boolean) +  
    + + boolean isExpanded() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.GuidedStepSupportFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.GuidedStepSupportFragment.html new file mode 100644 index 000000000000..bb7ec40cd49a --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.GuidedStepSupportFragment.html @@ -0,0 +1,136 @@ + + + + + + + + + +android.support.v17.leanback.app.GuidedStepSupportFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.GuidedStepSupportFragment +

    + + +

    + + + + + + + + + + + + + + + + +
    Added Methods +
    + + void collapseAction(boolean) +  
    + + void expandAction(GuidedAction, boolean) +  
    + + boolean isExpanded() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.MediaControllerGlue.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.MediaControllerGlue.html new file mode 100644 index 000000000000..c27112810a96 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.MediaControllerGlue.html @@ -0,0 +1,198 @@ + + + + + + + + + +android.support.v17.leanback.app.MediaControllerGlue + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.MediaControllerGlue +

    + +

    + + + + + + + + +
    Added Constructors +
    + + MediaControllerGlue(Context, PlaybackGlueHost, int[], int[]) +  
    +  +

    + + + + + + + + + + + + + + +
    Changed Constructors +
    + + MediaControllerGlue(Context, PlaybackOverlayFragment, int[]) + +Now deprecated.
    +
     
    + + MediaControllerGlue(Context, PlaybackOverlayFragment, int[], int[]) + +Now deprecated.
    +
     
    +  + +

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Changed Methods +
    + + void pausePlayback() + +Method was locally defined, but is now inherited from PlaybackControlGlue. Now deprecated.
    +
     
    + + void skipToNext() + +Method was locally defined, but is now inherited from PlaybackControlGlue. Now deprecated.
    +
     
    + + void skipToPrevious() + +Method was locally defined, but is now inherited from PlaybackControlGlue. Now deprecated.
    +
     
    + + void startPlayback(int) + +Method was locally defined, but is now inherited from PlaybackControlGlue. Now deprecated.
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackControlGlue.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackControlGlue.html new file mode 100644 index 000000000000..0657ab00aa63 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackControlGlue.html @@ -0,0 +1,239 @@ + + + + + + + + + +android.support.v17.leanback.app.PlaybackControlGlue + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.PlaybackControlGlue +

    +

    The superclass changed from java.lang.Object to android.support.v17.leanback.app.PlaybackGlue.
    + +

    + + + + + + + + +
    Added Constructors +
    + + PlaybackControlGlue(Context, PlaybackGlueHost, int[], int[]) +  
    +  +

    + + + + + + + + + + + + + + +
    Changed Constructors +
    + + PlaybackControlGlue(Context, PlaybackOverlayFragment, int[]) + +Now deprecated.
    +
     
    + + PlaybackControlGlue(Context, PlaybackOverlayFragment, int[], int[]) + +Now deprecated.
    +
     
    +  + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Changed Methods +
    + + Context getContext() + +Method was locally defined, but is now inherited from PlaybackGlue. +  
    + + PlaybackOverlayFragment getFragment() + +Now deprecated.
    +
     
    + + OnItemViewClickedListener getOnItemViewClickedListener() + +Now deprecated.
    +
     
    + + void onRowChanged(PlaybackControlsRow) + +Changed from abstract to non-abstract. Now deprecated.
    +
     
    + + void pausePlayback() + +Changed from abstract to non-abstract. Now deprecated.
    +
     
    + + void skipToNext() + +Changed from abstract to non-abstract. Now deprecated.
    +
     
    + + void skipToPrevious() + +Changed from abstract to non-abstract. Now deprecated.
    +
     
    + + void startPlayback(int) + +Changed from abstract to non-abstract. Now deprecated.
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackControlSupportGlue.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackControlSupportGlue.html new file mode 100644 index 000000000000..a7bb4e873e9c --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackControlSupportGlue.html @@ -0,0 +1,448 @@ + + + + + + + + + +android.support.v17.leanback.app.PlaybackControlSupportGlue + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.PlaybackControlSupportGlue +

    +

    The superclass changed from java.lang.Object to android.support.v17.leanback.app.PlaybackControlGlue.
    Removed interface android.support.v17.leanback.widget.OnActionClickedListener.
    +

    Now deprecated.
    + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Changed Methods +
    + + PlaybackControlsRowPresenter createControlsRowAndPresenter() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + SparseArrayObjectAdapter createPrimaryActionsAdapter(PresenterSelector) + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + void enableProgressUpdating(boolean) + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + Context getContext() + +Method was locally defined, but is now inherited from PlaybackGlue. +  
    + + PlaybackControlsRow getControlsRow() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + int getCurrentPosition() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + int getCurrentSpeedId() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + int[] getFastForwardSpeeds() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + PlaybackOverlayFragment getFragment() + +Change in return type from PlaybackOverlaySupportFragment to PlaybackOverlayFragment.
    + Method was locally defined, but is now inherited from PlaybackControlGlue. Now deprecated.
    +
     
    + + Drawable getMediaArt() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + int getMediaDuration() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + CharSequence getMediaSubtitle() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + CharSequence getMediaTitle() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + OnItemViewClickedListener getOnItemViewClickedListener() + +Method was locally defined, but is now inherited from PlaybackControlGlue. Now deprecated.
    +
     
    + + int[] getRewindSpeeds() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + long getSupportedActions() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + int getUpdatePeriod() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + boolean hasValidMedia() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + boolean isFadingEnabled() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + boolean isMediaPlaying() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + void onActionClicked(Action) + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + boolean onKey(View, int, KeyEvent) + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + void onMetadataChanged() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + void onRowChanged(PlaybackControlsRow) + +Method was locally defined, but is now inherited from PlaybackControlGlue. Changed from abstract to non-abstract. Now deprecated.
    +
     
    + + void onStateChanged() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + void pausePlayback() + +Method was locally defined, but is now inherited from PlaybackControlGlue. Changed from abstract to non-abstract. Now deprecated.
    +
     
    + + void setControlsRow(PlaybackControlsRow) + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + void setFadingEnabled(boolean) + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + void setOnItemViewClickedListener(OnItemViewClickedListener) + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    + + void skipToNext() + +Method was locally defined, but is now inherited from PlaybackControlGlue. Changed from abstract to non-abstract. Now deprecated.
    +
     
    + + void skipToPrevious() + +Method was locally defined, but is now inherited from PlaybackControlGlue. Changed from abstract to non-abstract. Now deprecated.
    +
     
    + + void startPlayback(int) + +Method was locally defined, but is now inherited from PlaybackControlGlue. Changed from abstract to non-abstract. Now deprecated.
    +
     
    + + void updateProgress() + +Method was locally defined, but is now inherited from PlaybackControlGlue. +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler.html new file mode 100644 index 000000000000..0cffcc30301e --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler.html @@ -0,0 +1,124 @@ + + + + + + + + + +android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler + + + + + + + + + + +
    +
    +
    +

    +Interface android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler +

    +

    Added interface android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler.
    +

    Now deprecated.
    + + +

    + + + + + + + + +
    Removed Methods +
    + + boolean handleInputEvent(InputEvent) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.html new file mode 100644 index 000000000000..5ee015c51fe7 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlayFragment.html @@ -0,0 +1,158 @@ + + + + + + + + + +android.support.v17.leanback.app.PlaybackOverlayFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.PlaybackOverlayFragment +

    +

    Now deprecated.
    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + InputEventHandler getEventHandler() +  
    + + void setEventHandler(InputEventHandler) +  
    +  +

    + + + + + + + + + + + + + + +
    Changed Methods +
    + + InputEventHandler getInputEventHandler() + +Now deprecated.
    +
     
    + + void setInputEventHandler(InputEventHandler) + +Now deprecated.
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler.html new file mode 100644 index 000000000000..74409a1d6943 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler.html @@ -0,0 +1,124 @@ + + + + + + + + + +android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler + + + + + + + + + + +
    +
    +
    +

    +Interface android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler +

    +

    Added interface android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler.
    +

    Now deprecated.
    + + +

    + + + + + + + + +
    Removed Methods +
    + + boolean handleInputEvent(InputEvent) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.html new file mode 100644 index 000000000000..567a011bff45 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.PlaybackOverlaySupportFragment.html @@ -0,0 +1,158 @@ + + + + + + + + + +android.support.v17.leanback.app.PlaybackOverlaySupportFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.PlaybackOverlaySupportFragment +

    +

    Now deprecated.
    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + InputEventHandler getEventHandler() +  
    + + void setEventHandler(InputEventHandler) +  
    +  +

    + + + + + + + + + + + + + + +
    Changed Methods +
    + + InputEventHandler getInputEventHandler() + +Now deprecated.
    +
     
    + + void setInputEventHandler(InputEventHandler) + +Now deprecated.
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.RowsFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.RowsFragment.html new file mode 100644 index 000000000000..a11c9f8f2123 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.RowsFragment.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v17.leanback.app.RowsFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.RowsFragment +

    + + +

    + + + + + + + + +
    Added Methods +
    + + ViewHolder findRowViewHolderByPosition(int) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.RowsSupportFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.RowsSupportFragment.html new file mode 100644 index 000000000000..6f39b91bf689 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.RowsSupportFragment.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v17.leanback.app.RowsSupportFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.RowsSupportFragment +

    + + +

    + + + + + + + + +
    Added Methods +
    + + ViewHolder findRowViewHolderByPosition(int) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.SearchFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.SearchFragment.html new file mode 100644 index 000000000000..14824ee4fb5a --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.SearchFragment.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v17.leanback.app.SearchFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.SearchFragment +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + void setSearchAffordanceColors(Colors) +  
    + + void setSearchAffordanceColorsInListening(Colors) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.SearchSupportFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.SearchSupportFragment.html new file mode 100644 index 000000000000..6d904d2374d8 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.app.SearchSupportFragment.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v17.leanback.app.SearchSupportFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.app.SearchSupportFragment +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + void setSearchAffordanceColors(Colors) +  
    + + void setSearchAffordanceColorsInListening(Colors) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.BaseCardView.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.BaseCardView.html new file mode 100644 index 000000000000..fb480bb0a9fa --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.BaseCardView.html @@ -0,0 +1,135 @@ + + + + + + + + + +android.support.v17.leanback.widget.BaseCardView + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.BaseCardView +

    + + +

    + + + + + + + + + + + + + + +
    Changed Methods +
    + + int getExtraVisibility() + +Now deprecated.
    +
     
    + + void setExtraVisibility(int) + +Now deprecated.
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.BrowseFrameLayout.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.BrowseFrameLayout.html new file mode 100644 index 000000000000..34409ff698f6 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.BrowseFrameLayout.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v17.leanback.widget.BrowseFrameLayout + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.BrowseFrameLayout +

    + + +

    + + + + + + + + +
    Added Methods +
    + + void setOnDispatchKeyListener(OnKeyListener) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html new file mode 100644 index 000000000000..2958388b84e8 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.GuidedActionsStylist.html @@ -0,0 +1,219 @@ + + + + + + + + + +android.support.v17.leanback.widget.GuidedActionsStylist + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.GuidedActionsStylist +

    + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Added Methods +
    + + void collapseAction(boolean) +  
    + + void expandAction(GuidedAction, boolean) +  
    + + boolean isBackKeyToCollapseActivatorView() +  
    + + boolean isBackKeyToCollapseSubActions() +  
    + + boolean isExpanded() +  
    + + void onEditingModeChange(ViewHolder, boolean, boolean) +  
    + + void setBackKeyToCollapseActivatorView(boolean) +  
    + + void setBackKeyToCollapseSubActions(boolean) +  
    +  +

    + + + + + + + + + + + + + + + + + + + + + + + + +
    Changed Methods +
    + + void setEditingMode(ViewHolder, GuidedAction, boolean) + +Now deprecated.
    +
     
    + + void setExpandedViewHolder(ViewHolder) + +Now deprecated.
    +
     
    + + void startExpandedTransition(ViewHolder) + +Now deprecated.
    +
     
    + + void onEditingModeChange(ViewHolder, GuidedAction, boolean) + +Now deprecated.
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.HeaderItem.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.HeaderItem.html new file mode 100644 index 000000000000..4050be575656 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.HeaderItem.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v17.leanback.widget.HeaderItem + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.HeaderItem +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + CharSequence getDescription() +  
    + + void setDescription(CharSequence) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.ObjectAdapter.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.ObjectAdapter.html new file mode 100644 index 000000000000..1a9616a7e7b8 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.ObjectAdapter.html @@ -0,0 +1,125 @@ + + + + + + + + + +android.support.v17.leanback.widget.ObjectAdapter + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.ObjectAdapter +

    + + +

    + + + + + + + + + +
    Changed Methods +
    + + void notifyItemRangeChanged(int, int) + +Change of visibility from protected to public.
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.OnChildViewHolderSelectedListener.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.OnChildViewHolderSelectedListener.html new file mode 100644 index 000000000000..a15728ff5fb9 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.OnChildViewHolderSelectedListener.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v17.leanback.widget.OnChildViewHolderSelectedListener + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.OnChildViewHolderSelectedListener +

    + + +

    + + + + + + + + +
    Added Methods +
    + + void onChildViewHolderSelectedAndPositioned(RecyclerView, ViewHolder, int, int) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.PlaybackControlsRow.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.PlaybackControlsRow.html new file mode 100644 index 000000000000..60200295354d --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.PlaybackControlsRow.html @@ -0,0 +1,157 @@ + + + + + + + + + +android.support.v17.leanback.widget.PlaybackControlsRow + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.PlaybackControlsRow +

    + + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Added Methods +
    + + long getBufferedProgressLong() +  
    + + long getCurrentTimeLong() +  
    + + long getTotalTimeLong() +  
    + + void setBufferedProgressLong(long) +  
    + + void setCurrentTimeLong(long) +  
    + + void setTotalTimeLong(long) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder.html new file mode 100644 index 000000000000..105b2970e395 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder.html @@ -0,0 +1,108 @@ + + + + + + + + + +android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder +

    +

    The superclass changed from android.support.v17.leanback.widget.RowPresenter.ViewHolder to android.support.v17.leanback.widget.PlaybackRowPresenter.ViewHolder.
    + + + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.PlaybackControlsRowPresenter.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.PlaybackControlsRowPresenter.html new file mode 100644 index 000000000000..55f18baa2263 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.PlaybackControlsRowPresenter.html @@ -0,0 +1,108 @@ + + + + + + + + + +android.support.v17.leanback.widget.PlaybackControlsRowPresenter + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.PlaybackControlsRowPresenter +

    +

    The superclass changed from android.support.v17.leanback.widget.RowPresenter to android.support.v17.leanback.widget.PlaybackRowPresenter.
    + + + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.RowPresenter.ViewHolder.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.RowPresenter.ViewHolder.html new file mode 100644 index 000000000000..0585d72b4d4a --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.RowPresenter.ViewHolder.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v17.leanback.widget.RowPresenter.ViewHolder + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.RowPresenter.ViewHolder +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + Object getSelectedItem() +  
    + + ViewHolder getSelectedItemViewHolder() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.SearchBar.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.SearchBar.html new file mode 100644 index 000000000000..d98f1018dc72 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.SearchBar.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v17.leanback.widget.SearchBar + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.SearchBar +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + void setSearchAffordanceColors(Colors) +  
    + + void setSearchAffordanceColorsInListening(Colors) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.SpeechOrbView.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.SpeechOrbView.html new file mode 100644 index 000000000000..8f7181852030 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.leanback.widget.SpeechOrbView.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v17.leanback.widget.SpeechOrbView + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.leanback.widget.SpeechOrbView +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + void setListeningOrbColors(Colors) +  
    + + void setNotListeningOrbColors(Colors) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.preference.LeanbackPreferenceFragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.preference.LeanbackPreferenceFragment.html new file mode 100644 index 000000000000..ad5fd1ceb0d7 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v17.preference.LeanbackPreferenceFragment.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v17.preference.LeanbackPreferenceFragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v17.preference.LeanbackPreferenceFragment +

    + + +

    + + + + + + + + +
    Added Methods +
    + + void setTitle(CharSequence) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.Fragment.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.Fragment.html new file mode 100644 index 000000000000..e5d0d8c047dc --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.Fragment.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v4.app.Fragment + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.app.Fragment +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + void postponeEnterTransition() +  
    + + void startPostponedEnterTransition() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.FragmentActivity.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.FragmentActivity.html new file mode 100644 index 000000000000..2e3e30b41608 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.FragmentActivity.html @@ -0,0 +1,135 @@ + + + + + + + + + +android.support.v4.app.FragmentActivity + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.app.FragmentActivity +

    + + +

    + + + + + + + + + + + + + + +
    Changed Methods +
    + + MediaControllerCompat getSupportMediaController() + +Now deprecated.
    +
     
    + + void setSupportMediaController(MediaControllerCompat) + +Now deprecated.
    +
     
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.FragmentManager.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.FragmentManager.html new file mode 100644 index 000000000000..9d4058442b38 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.FragmentManager.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v4.app.FragmentManager + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.app.FragmentManager +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + void registerFragmentLifecycleCallbacks(FragmentLifecycleCallbacks, boolean) +  
    + + void unregisterFragmentLifecycleCallbacks(FragmentLifecycleCallbacks) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.FragmentTransaction.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.FragmentTransaction.html new file mode 100644 index 000000000000..9a8cb402fda4 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.app.FragmentTransaction.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v4.app.FragmentTransaction + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.app.FragmentTransaction +

    + + +

    + + + + + + + + +
    Added Methods +
    + + FragmentTransaction setAllowOptimization(boolean) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.media.session.MediaControllerCompat.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.media.session.MediaControllerCompat.html new file mode 100644 index 000000000000..6bb1866c09a8 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.media.session.MediaControllerCompat.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v4.media.session.MediaControllerCompat + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.media.session.MediaControllerCompat +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + MediaControllerCompat getMediaController(Activity) +  
    + + void setMediaController(Activity, MediaControllerCompat) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.os.BuildCompat.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.os.BuildCompat.html new file mode 100644 index 000000000000..a488cb615681 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.os.BuildCompat.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v4.os.BuildCompat + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.os.BuildCompat +

    + + +

    + + + + + + + + +
    Added Methods +
    + + boolean isAtLeastO() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.provider.DocumentFile.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.provider.DocumentFile.html new file mode 100644 index 000000000000..ef149cec7114 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v4.provider.DocumentFile.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v4.provider.DocumentFile + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v4.provider.DocumentFile +

    + + +

    + + + + + + + + +
    Added Methods +
    + + boolean isVirtual() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.app.MediaRouteChooserDialog.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.app.MediaRouteChooserDialog.html new file mode 100644 index 000000000000..c9423a483cc1 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.app.MediaRouteChooserDialog.html @@ -0,0 +1,108 @@ + + + + + + + + + +android.support.v7.app.MediaRouteChooserDialog + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.app.MediaRouteChooserDialog +

    +

    The superclass changed from android.app.Dialog to android.support.v7.app.AppCompatDialog.
    + + + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.media.MediaRouter.RouteInfo.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.media.MediaRouter.RouteInfo.html new file mode 100644 index 000000000000..a43ca9f15f0a --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.media.MediaRouter.RouteInfo.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v7.media.MediaRouter.RouteInfo + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.media.MediaRouter.RouteInfo +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + boolean isBluetooth() +  
    + + boolean isDeviceSpeaker() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.media.MediaRouter.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.media.MediaRouter.html new file mode 100644 index 000000000000..99cdb64641de --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.media.MediaRouter.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v7.media.MediaRouter + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.media.MediaRouter +

    + + +

    + + + + + + + + +
    Added Methods +
    + + RouteInfo getBluetoothRoute() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.preference.PreferenceManager.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.preference.PreferenceManager.html new file mode 100644 index 000000000000..dbbb24c369c1 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.preference.PreferenceManager.html @@ -0,0 +1,129 @@ + + + + + + + + + +android.support.v7.preference.PreferenceManager + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.preference.PreferenceManager +

    + + +

    + + + + + + + + + + + + +
    Added Methods +
    + + PreferenceComparisonCallback getPreferenceComparisonCallback() +  
    + + void setPreferenceComparisonCallback(PreferenceComparisonCallback) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.LinearLayoutCompat.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.LinearLayoutCompat.html new file mode 100644 index 000000000000..bfad8d847f00 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.LinearLayoutCompat.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v7.widget.LinearLayoutCompat + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.widget.LinearLayoutCompat +

    + + +

    + + + + + + + + +
    Added Methods +
    + + int getGravity() +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.RecyclerView.RecycledViewPool.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.RecyclerView.RecycledViewPool.html new file mode 100644 index 000000000000..070d12ce513d --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.RecyclerView.RecycledViewPool.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v7.widget.RecyclerView.RecycledViewPool + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.widget.RecyclerView.RecycledViewPool +

    + + +

    + + + + + + + + +
    Added Methods +
    + + int getRecycledViewCount(int) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.RecyclerView.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.RecyclerView.html new file mode 100644 index 000000000000..712b113713b8 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.RecyclerView.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v7.widget.RecyclerView + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.widget.RecyclerView +

    + + +

    + + + + + + + + +
    Added Methods +
    + + void smoothScrollBy(int, int, Interpolator) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.SnapHelper.html b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.SnapHelper.html new file mode 100644 index 000000000000..4db82da11e94 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/android.support.v7.widget.SnapHelper.html @@ -0,0 +1,122 @@ + + + + + + + + + +android.support.v7.widget.SnapHelper + + + + + + + + + + +
    +
    +
    +

    +Class android.support.v7.widget.SnapHelper +

    + + +

    + + + + + + + + +
    Added Methods +
    + + LinearSmoothScroller createSnapScroller(LayoutManager) +  
    +  + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/changes-summary.html b/docs/html/sdk/support_api_diff/25.1.0/changes/changes-summary.html new file mode 100644 index 000000000000..1924404c0fb7 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/changes-summary.html @@ -0,0 +1,225 @@ + + + + + + + + + +Support Library API Differences Report + + + + + + + + + + +
    +
    +
    +
    +

    Support Library API Differences Report

    +

    This report details the changes in the Android Support Library API between two versions. +It shows additions, modifications, and removals for packages, classes, methods, and fields. +The report also includes general statistics that characterize the extent and type of the differences.

    +

    This report is based a comparison of the Support Library API specifications +whose version level identifiers are given in the upper-right corner of this page. It compares a +newer "to" version's API to an older "from" version's API, noting all changes relative to the +older API. So, for example, API elements marked as removed are no longer present in the "to" +API specification.

    +

    To navigate the report, use the "Select a Diffs Index" and "Filter the Index" +controls on the left. The report uses text formatting to indicate interface names, +links to reference documentation, and links to change +description. The statistics are accessible from the "Statistics" link in the upper-right corner.

    +

    For more information about the Android API and SDK, +see the Android Developers site.

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Changed Packages +
    + + android.support.design.widget +  
    + + android.support.graphics.drawable +  
    + + android.support.v17.leanback.app +  
    + + android.support.v17.leanback.widget +  
    + + android.support.v17.preference +  
    + + android.support.v4.app +  
    + + android.support.v4.media.session +  
    + + android.support.v4.os +  
    + + android.support.v4.provider +  
    + + android.support.v4.util +  
    + + android.support.v7.app +  
    + + android.support.v7.media +  
    + + android.support.v7.preference +  
    + + android.support.v7.widget +  
    +  + + +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_additions.html b/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_additions.html new file mode 100644 index 000000000000..d47dee04d9d3 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_additions.html @@ -0,0 +1,125 @@ + + + + + + + + + +Class Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Classes +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    A  +B +F +P +S + TOP +

    +AnimatedVectorDrawableCompat
    +ArraySet
    + +
    B  +A +F +P +S + TOP +

    +BaseTransientBottomBar
    +BaseTransientBottomBar.BaseCallback
    +BaseTransientBottomBar.ContentViewCallback
    + +
    F  +A +B +P +S + TOP +

    +FragmentManager.FragmentLifecycleCallbacks
    + +
    P  +A +B +F +S + TOP +

    +PagerSnapHelper
    +PlaybackControlGlue.InputEventHandler
    +PlaybackFragment
    +PlaybackFragment.OnFadeCompleteListener
    +PlaybackFragmentGlueHost
    +PlaybackGlue
    +PlaybackGlue.HostLifecycleCallback
    +PlaybackGlue.PlaybackGlueHost
    +PlaybackGlue.PlayerCallback
    +PlaybackRowPresenter
    +PlaybackRowPresenter.ViewHolder
    +PlaybackSupportFragment
    +PlaybackSupportFragment.OnFadeCompleteListener
    +PlaybackSupportFragmentGlueHost
    +PreferenceManager.PreferenceComparisonCallback
    +PreferenceManager.SimplePreferenceComparisonCallback
    + +
    S  +A +B +F +P + TOP +

    +SeekBarPreference
    +SurfaceHolderGlueHost
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_all.html b/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_all.html new file mode 100644 index 000000000000..1540eb872709 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_all.html @@ -0,0 +1,344 @@ + + + + + + + + + +Class Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Classes +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    A  +B +D +F +G +H +L +M +O +P +R +S +T + TOP +

    +AnimatedVectorDrawableCompat
    +ArraySet
    + +
    B  +A +D +F +G +H +L +M +O +P +R +S +T + TOP +

    +BackgroundManager
    +BaseCardView
    +BaseRowFragment
    +BaseRowSupportFragment
    +BaseTransientBottomBar
    +BaseTransientBottomBar.BaseCallback
    +BaseTransientBottomBar.ContentViewCallback
    +BrowseFragment
    +BrowseFragment.MainFragmentRowsAdapter
    +BrowseFrameLayout
    +BrowseSupportFragment
    +BrowseSupportFragment.MainFragmentRowsAdapter
    +BuildCompat
    + +
    D  +A +B +F +G +H +L +M +O +P +R +S +T + TOP +

    +DocumentFile
    + +
    F  +A +B +D +G +H +L +M +O +P +R +S +T + TOP +

    +Fragment
    +FragmentActivity
    +FragmentManager
    +FragmentManager.FragmentLifecycleCallbacks
    +FragmentTransaction
    + +
    G  +A +B +D +F +H +L +M +O +P +R +S +T + TOP +

    +GuidedActionsStylist
    +GuidedStepFragment
    +GuidedStepSupportFragment
    + +
    H  +A +B +D +F +G +L +M +O +P +R +S +T + TOP +

    +HeaderItem
    + +
    L  +A +B +D +F +G +H +M +O +P +R +S +T + TOP +

    +LeanbackPreferenceFragment
    +LinearLayoutCompat
    + +
    M  +A +B +D +F +G +H +L +O +P +R +S +T + TOP +

    +MediaControllerCompat
    +MediaControllerGlue
    +MediaRouteChooserDialog
    +MediaRouter
    +MediaRouter.RouteInfo
    + +
    O  +A +B +D +F +G +H +L +M +P +R +S +T + TOP +

    +ObjectAdapter
    +OnChildViewHolderSelectedListener
    + +
    P  +A +B +D +F +G +H +L +M +O +R +S +T + TOP +

    +PagerSnapHelper
    +PlaybackControlGlue
    +PlaybackControlGlue.InputEventHandler
    +PlaybackControlsRow
    +PlaybackControlsRowPresenter
    +PlaybackControlsRowPresenter.ViewHolder
    +PlaybackControlSupportGlue
    +PlaybackFragment
    +PlaybackFragment.OnFadeCompleteListener
    +PlaybackFragmentGlueHost
    +PlaybackGlue
    +PlaybackGlue.HostLifecycleCallback
    +PlaybackGlue.PlaybackGlueHost
    +PlaybackGlue.PlayerCallback
    +PlaybackOverlayFragment
    +PlaybackOverlayFragment.InputEventHandler
    +PlaybackOverlaySupportFragment
    +PlaybackOverlaySupportFragment.InputEventHandler
    +PlaybackRowPresenter
    +PlaybackRowPresenter.ViewHolder
    +PlaybackSupportFragment
    +PlaybackSupportFragment.OnFadeCompleteListener
    +PlaybackSupportFragmentGlueHost
    +PreferenceManager
    +PreferenceManager.PreferenceComparisonCallback
    +PreferenceManager.SimplePreferenceComparisonCallback
    + +
    R  +A +B +D +F +G +H +L +M +O +P +S +T + TOP +

    +RecyclerView
    +RecyclerView.RecycledViewPool
    +RowPresenter.ViewHolder
    +RowsFragment
    +RowsSupportFragment
    + +
    S  +A +B +D +F +G +H +L +M +O +P +R +T + TOP +

    +SearchBar
    +SearchFragment
    +SearchSupportFragment
    +SeekBarPreference
    +Snackbar
    +Snackbar.Callback
    +SnapHelper
    +SpeechOrbView
    +SurfaceHolderGlueHost
    + +
    T  +A +B +D +F +G +H +L +M +O +P +R +S + TOP +

    +TextInputLayout
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_changes.html b/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_changes.html new file mode 100644 index 000000000000..8265878c9e9b --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_changes.html @@ -0,0 +1,292 @@ + + + + + + + + + +Class Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Classes +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    B  +D +F +G +H +L +M +O +P +R +S +T + TOP +

    +BackgroundManager
    +BaseCardView
    +BaseRowFragment
    +BaseRowSupportFragment
    +BrowseFragment
    +BrowseFragment.MainFragmentRowsAdapter
    +BrowseFrameLayout
    +BrowseSupportFragment
    +BrowseSupportFragment.MainFragmentRowsAdapter
    +BuildCompat
    + +
    D  +B +F +G +H +L +M +O +P +R +S +T + TOP +

    +DocumentFile
    + +
    F  +B +D +G +H +L +M +O +P +R +S +T + TOP +

    +Fragment
    +FragmentActivity
    +FragmentManager
    +FragmentTransaction
    + +
    G  +B +D +F +H +L +M +O +P +R +S +T + TOP +

    +GuidedActionsStylist
    +GuidedStepFragment
    +GuidedStepSupportFragment
    + +
    H  +B +D +F +G +L +M +O +P +R +S +T + TOP +

    +HeaderItem
    + +
    L  +B +D +F +G +H +M +O +P +R +S +T + TOP +

    +LeanbackPreferenceFragment
    +LinearLayoutCompat
    + +
    M  +B +D +F +G +H +L +O +P +R +S +T + TOP +

    +MediaControllerCompat
    +MediaControllerGlue
    +MediaRouteChooserDialog
    +MediaRouter
    +MediaRouter.RouteInfo
    + +
    O  +B +D +F +G +H +L +M +P +R +S +T + TOP +

    +ObjectAdapter
    +OnChildViewHolderSelectedListener
    + +
    P  +B +D +F +G +H +L +M +O +R +S +T + TOP +

    +PlaybackControlGlue
    +PlaybackControlsRow
    +PlaybackControlsRowPresenter
    +PlaybackControlsRowPresenter.ViewHolder
    +PlaybackControlSupportGlue
    +PlaybackOverlayFragment
    +PlaybackOverlayFragment.InputEventHandler
    +PlaybackOverlaySupportFragment
    +PlaybackOverlaySupportFragment.InputEventHandler
    +PreferenceManager
    + +
    R  +B +D +F +G +H +L +M +O +P +S +T + TOP +

    +RecyclerView
    +RecyclerView.RecycledViewPool
    +RowPresenter.ViewHolder
    +RowsFragment
    +RowsSupportFragment
    + +
    S  +B +D +F +G +H +L +M +O +P +R +T + TOP +

    +SearchBar
    +SearchFragment
    +SearchSupportFragment
    +Snackbar
    +Snackbar.Callback
    +SnapHelper
    +SpeechOrbView
    + +
    T  +B +D +F +G +H +L +M +O +P +R +S + TOP +

    +TextInputLayout
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_removals.html b/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_removals.html new file mode 100644 index 000000000000..e6da73f487d3 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/classes_index_removals.html @@ -0,0 +1,61 @@ + + + + + + + + + +Class Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Classes +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_additions.html b/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_additions.html new file mode 100644 index 000000000000..dcd6a787ae96 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_additions.html @@ -0,0 +1,75 @@ + + + + + + + + + +Constructor Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Constructors +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    M  +P + TOP +

    +MediaControllerGlue +(Context, PlaybackGlueHost, int[], int[]) constructor
    + +
    P  +M + TOP +

    +PlaybackControlGlue +(Context, PlaybackGlueHost, int[], int[]) constructor
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_all.html b/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_all.html new file mode 100644 index 000000000000..7bb3a5a878d6 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_all.html @@ -0,0 +1,85 @@ + + + + + + + + + +Constructor Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Constructors +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    M  +P + TOP +

    +MediaControllerGlue
    +  MediaControllerGlue +(Context, PlaybackGlueHost, int[], int[]) constructor
    +  MediaControllerGlue +(Context, PlaybackOverlayFragment, int[]) constructor
    +  MediaControllerGlue +(Context, PlaybackOverlayFragment, int[], int[]) constructor
    + +
    P  +M + TOP +

    +PlaybackControlGlue
    +  PlaybackControlGlue +(Context, PlaybackGlueHost, int[], int[]) constructor
    +  PlaybackControlGlue +(Context, PlaybackOverlayFragment, int[]) constructor
    +  PlaybackControlGlue +(Context, PlaybackOverlayFragment, int[], int[]) constructor
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_changes.html b/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_changes.html new file mode 100644 index 000000000000..24f5247c9fa1 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_changes.html @@ -0,0 +1,81 @@ + + + + + + + + + +Constructor Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Constructors +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    M  +P + TOP +

    +MediaControllerGlue
    +  MediaControllerGlue +(Context, PlaybackOverlayFragment, int[]) constructor
    +  MediaControllerGlue +(Context, PlaybackOverlayFragment, int[], int[]) constructor
    + +
    P  +M + TOP +

    +PlaybackControlGlue
    +  PlaybackControlGlue +(Context, PlaybackOverlayFragment, int[]) constructor
    +  PlaybackControlGlue +(Context, PlaybackOverlayFragment, int[], int[]) constructor
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_removals.html b/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_removals.html new file mode 100644 index 000000000000..f1a99529b22d --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/constructors_index_removals.html @@ -0,0 +1,61 @@ + + + + + + + + + +Constructor Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Constructors +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_additions.html b/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_additions.html new file mode 100644 index 000000000000..215cabf5d764 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_additions.html @@ -0,0 +1,61 @@ + + + + + + + + + +Field Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Fields +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_all.html b/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_all.html new file mode 100644 index 000000000000..ffe49f3baa73 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_all.html @@ -0,0 +1,61 @@ + + + + + + + + + +Field Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Fields +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_changes.html b/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_changes.html new file mode 100644 index 000000000000..72c26d9ed4f0 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_changes.html @@ -0,0 +1,61 @@ + + + + + + + + + +Field Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Fields +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_removals.html b/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_removals.html new file mode 100644 index 000000000000..259c00e4780f --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/fields_index_removals.html @@ -0,0 +1,61 @@ + + + + + + + + + +Field Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Fields +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/jdiff_help.html b/docs/html/sdk/support_api_diff/25.1.0/changes/jdiff_help.html new file mode 100644 index 000000000000..6449baf88247 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/jdiff_help.html @@ -0,0 +1,134 @@ + + + + + + + + + +JDiff Help + + + + + + + + + + + + + + + + + +
    Generated by
    JDiff
    +
    + +
    +

    JDiff Documentation

    +
    +
    +JDiff is a Javadoc doclet which generates a report of the API differences between two versions of a product. It does not report changes in Javadoc comments, or changes in what a class or method does. +This help page describes the different parts of the output from JDiff. +
    +
    + See the reference page in the source for JDiff for information about how to generate a report like this one. +
    +
    +The indexes shown in the top-left frame help show each type of change in more detail. The index "All Differences" contains all the differences between the APIs, in alphabetical order. +These indexes all use the same format: +
      +
    • Removed packages, classes, constructors, methods and fields are struck through.
    • +
    • Added packages, classes, constructors, methods and fields appear in bold.
    • +
    • Changed packages, classes, constructors, methods and fields appear in normal text.
    • +
    +
    +
    +You can always tell when you are reading a JDiff page, rather than a Javadoc page, by the color of the index bar and the color of the background. +Links which take you to a Javadoc page are always in a typewriter font. +Just like Javadoc, all interface names are in italic, and class names are not italicized. Where there are multiple entries in an index with the same name, the heading for them is also in italics, but is not a link. +
    +
    +

    Javadoc

    +This is a link to the top-level Javadoc page for the new version of the product. +
    +
    +

    Overview

    +The overview is the top-level summary of what was removed, added and changed between versions. +
    +
    +

    Package

    +This is a link to the package containing the current changed class or interface. +
    +
    +

    Class

    +This is highlighted when you are looking at the changed class or interface. +
    +
    +

    Text Changes

    +This is a link to the top-level index of all documentation changes for the current package or class. +If it is not present, then there are no documentation changes for the current package or class. +This link can be removed entirely by not using the -docchanges option. +
    +
    +

    Statistics

    +This is a link to a page which shows statistics about the changes between the two APIs. +This link can be removed entirely by not using the -stats option. +
    +
    +

    Help

    +A link to this Help page for JDiff. +
    +
    +

    Prev/Next

    +These links take you to the previous and next changed package or class. +
    +
    +

    Frames/No Frames

    +These links show and hide the HTML frames. All pages are available with or without frames. +
    +
    +

    Complex Changes

    +There are some complex changes which can occur between versions, for example, when two or more methods with the same name change simultaneously, or when a method or field is moved into or from a superclass. +In these cases, the change will be seen as a removal and an addition, rather than as a change. Unexpected removals or additions are often part of one of these type of changes. +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/jdiff_statistics.html b/docs/html/sdk/support_api_diff/25.1.0/changes/jdiff_statistics.html new file mode 100644 index 000000000000..54510ebd101c --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/jdiff_statistics.html @@ -0,0 +1,504 @@ + + + + + + + + + +API Change Statistics + + + + + + + + + + +
    +
    +
    +

    API Change Statistics

    +

    The overall difference between API Levels 25.0.0 and 25.1.0 is approximately 1.17%. +

    +
    + +

    Total of Differences, by Number and Type

    +

    +The table below lists the numbers of program elements (packages, classes, constructors, methods, and fields) that were added, changed, or removed. The table includes only the highest-level program elements — that is, if a class with two methods was added, the number of methods added does not include those two methods, but the number of classes added does include that class. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeAdditionsChangesRemovalsTotal
    Packages014014
    Classes and Interfaces2451075
    Constructors2406
    Methods72692143
    Fields0000
    Total981382238
    +
    + +

    Changed Packages, Sorted by Percentage Difference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Percentage Difference*Package
    20android.support.graphics.drawable
    14android.support.v17.leanback.app
    5android.support.v7.preference
    4android.support.design.widget
    3android.support.v17.preference
    3android.support.v4.util
    2android.support.v4.provider
    2android.support.v4.os
    1android.support.v17.leanback.widget
    <1android.support.v4.app
    <1android.support.v7.widget
    <1android.support.v4.media.session
    <1android.support.v7.app
    <1android.support.v7.media
    +

    * See Calculation of Change Percentages, below.

    +
    + +

    Changed Classes and Interfaces, Sorted by Percentage Difference

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Percentage
    Difference*
    Class or Interface
    100 +android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler
    100 +android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler
    50 +android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder
    46 +android.support.v17.leanback.app.PlaybackControlSupportGlue
    33 +android.support.v17.preference.LeanbackPreferenceFragment
    27 +android.support.v17.leanback.app.MediaControllerGlue
    25 +android.support.design.widget.Snackbar
    23 +android.support.v17.leanback.app.BackgroundManager
    20 +android.support.v17.leanback.widget.OnChildViewHolderSelectedListener
    20 +android.support.v4.os.BuildCompat
    16 +android.support.v17.leanback.widget.GuidedActionsStylist
    14 +android.support.v17.leanback.widget.HeaderItem
    14 +android.support.v17.leanback.widget.PlaybackControlsRow
    14 +android.support.v17.leanback.widget.SpeechOrbView
    13 +android.support.v17.leanback.app.PlaybackOverlayFragment
    13 +android.support.v17.leanback.app.PlaybackOverlaySupportFragment
    12 +android.support.v17.leanback.app.PlaybackControlGlue
    9 +android.support.v7.widget.RecyclerView.RecycledViewPool
    7 +android.support.v7.app.MediaRouteChooserDialog
    6 +android.support.v17.leanback.widget.BrowseFrameLayout
    6 +android.support.v7.widget.SnapHelper
    6 +android.support.design.widget.Snackbar.Callback
    5 +android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter
    5 +android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter
    5 +android.support.v17.leanback.widget.RowPresenter.ViewHolder
    5 +android.support.v17.leanback.widget.BaseCardView
    5 +android.support.v17.leanback.app.SearchFragment
    5 +android.support.v17.leanback.app.SearchSupportFragment
    5 +android.support.v17.leanback.widget.SearchBar
    5 +android.support.v4.app.FragmentActivity
    4 +android.support.v17.leanback.app.BaseRowFragment
    4 +android.support.v17.leanback.app.BaseRowSupportFragment
    4 +android.support.v4.app.FragmentManager
    4 +android.support.v4.media.session.MediaControllerCompat
    3 +android.support.v17.leanback.widget.PlaybackControlsRowPresenter
    3 +android.support.v7.preference.PreferenceManager
    3 +android.support.v17.leanback.app.RowsFragment
    3 +android.support.v17.leanback.app.RowsSupportFragment
    2 +android.support.v17.leanback.app.BrowseFragment
    2 +android.support.v17.leanback.app.BrowseSupportFragment
    2 +android.support.v17.leanback.app.GuidedStepFragment
    2 +android.support.v17.leanback.app.GuidedStepSupportFragment
    2 +android.support.v7.media.MediaRouter.RouteInfo
    2 +android.support.v4.provider.DocumentFile
    2 +android.support.v17.leanback.widget.ObjectAdapter
    1 +android.support.v7.media.MediaRouter
    1 +android.support.v7.widget.LinearLayoutCompat
    1 +android.support.design.widget.TextInputLayout
    1 +android.support.v4.app.FragmentTransaction
    1 +android.support.v4.app.Fragment
    <1 +android.support.v7.widget.RecyclerView
    +

    * See Calculation of Change Percentages, below.

    +
    +

    Calculation of Change Percentages

    +

    +The percent change statistic reported for all elements in the "to" API Level specification is defined recursively as follows:

    +
    +Percentage difference = 100 * (added + removed + 2*changed)
    +                        -----------------------------------
    +                        sum of public elements in BOTH APIs
    +
    +

    where added is the number of packages added, removed is the number of packages removed, and changed is the number of packages changed. +This definition is applied recursively for the classes and their program elements, so the value for a changed package will be less than 1, unless every class in that package has changed. +The definition ensures that if all packages are removed and all new packages are +added, the change will be 100%.

    +
    + +
    +
    + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/jdiff_topleftframe.html b/docs/html/sdk/support_api_diff/25.1.0/changes/jdiff_topleftframe.html new file mode 100644 index 000000000000..36f9836e4478 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/jdiff_topleftframe.html @@ -0,0 +1,63 @@ + + + + + + + + + +Android API Version Differences + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Select a Diffs Index:
    All Differences
    By Package
    By Class
    By Constructor
    By Method
    By Field
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_additions.html b/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_additions.html new file mode 100644 index 000000000000..61e22fee4ffc --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_additions.html @@ -0,0 +1,399 @@ + + + + + + + + + +Method Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Methods +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    A  +C +E +F +G +I +O +P +R +S +U + TOP +

    +attachToView +(View)
    + +
    C  +A +E +F +G +I +O +P +R +S +U + TOP +

    +clearDrawable +()
    +collapseAction
    +  type  +(boolean) in android.support.v17.leanback.app.GuidedStepFragment +
    +  type  +(boolean) in android.support.v17.leanback.app.GuidedStepSupportFragment +
    +  type  +(boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    +createSnapScroller +(LayoutManager)
    + +
    E  +A +C +F +G +I +O +P +R +S +U + TOP +

    +expandAction
    +  type  +(GuidedAction, boolean) in android.support.v17.leanback.app.GuidedStepFragment +
    +  type  +(GuidedAction, boolean) in android.support.v17.leanback.app.GuidedStepSupportFragment +
    +  type  +(GuidedAction, boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    + +
    F  +A +C +E +G +I +O +P +R +S +U + TOP +

    +findRowViewHolderByPosition
    +  type  +(int) in android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter +
    +  type  +(int) in android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter +
    +  type  +(int) in android.support.v17.leanback.app.RowsFragment +
    +  type  +(int) in android.support.v17.leanback.app.RowsSupportFragment +
    + +
    G  +A +C +E +F +I +O +P +R +S +U + TOP +

    +getBluetoothRoute +()
    +getBufferedProgressLong +()
    +getCurrentTimeLong +()
    +getDescription +()
    +getEventHandler
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlayFragment +
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    +getGravity +()
    +getMainFragment
    +  type  +() in android.support.v17.leanback.app.BrowseFragment +
    +  type  +() in android.support.v17.leanback.app.BrowseSupportFragment +
    +getMediaController +(Activity)
    +getPreferenceComparisonCallback +()
    +getRecycledViewCount +(int)
    +getSelectedItem +()
    +getSelectedItemViewHolder +()
    +getSelectedRowViewHolder
    +  type  +() in android.support.v17.leanback.app.BrowseFragment +
    +  type  +() in android.support.v17.leanback.app.BrowseSupportFragment +
    +getTotalTimeLong +()
    +getVerticalGridView
    +  type  +() in android.support.v17.leanback.app.BaseRowFragment +
    +  type  +() in android.support.v17.leanback.app.BaseRowSupportFragment +
    + +
    I  +A +C +E +F +G +O +P +R +S +U + TOP +

    +isAtLeastO +()
    +isAutoReleaseOnStop +()
    +isBackKeyToCollapseActivatorView +()
    +isBackKeyToCollapseSubActions +()
    +isBluetooth +()
    +isDeviceSpeaker +()
    +isExpanded
    +  type  +() in android.support.v17.leanback.app.GuidedStepFragment +
    +  type  +() in android.support.v17.leanback.app.GuidedStepSupportFragment +
    +  type  +() in android.support.v17.leanback.widget.GuidedActionsStylist +
    +isVirtual +()
    + +
    O  +A +C +E +F +G +I +P +R +S +U + TOP +

    +onChildViewHolderSelectedAndPositioned +(RecyclerView, ViewHolder, int, int)
    +onEditingModeChange +(ViewHolder, boolean, boolean)
    + +
    P  +A +C +E +F +G +I +O +R +S +U + TOP +

    +postponeEnterTransition +()
    + +
    R  +A +C +E +F +G +I +O +P +S +U + TOP +

    +registerFragmentLifecycleCallbacks +(FragmentLifecycleCallbacks, boolean)
    + +
    S  +A +C +E +F +G +I +O +P +R +U + TOP +

    +setAllowOptimization +(boolean)
    +setAutoReleaseOnStop +(boolean)
    +setBackKeyToCollapseActivatorView +(boolean)
    +setBackKeyToCollapseSubActions +(boolean)
    +setBufferedProgressLong +(long)
    +setCurrentTimeLong +(long)
    +setDescription +(CharSequence)
    +setErrorTextAppearance +(int)
    +setEventHandler
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlayFragment +
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    +setListeningOrbColors +(Colors)
    +setMediaController +(Activity, MediaControllerCompat)
    +setNotListeningOrbColors +(Colors)
    +setOnDispatchKeyListener +(OnKeyListener)
    +setPreferenceComparisonCallback +(PreferenceComparisonCallback)
    +setSearchAffordanceColors
    +  type  +(Colors) in android.support.v17.leanback.app.SearchFragment +
    +  type  +(Colors) in android.support.v17.leanback.app.SearchSupportFragment +
    +  type  +(Colors) in android.support.v17.leanback.widget.SearchBar +
    +setSearchAffordanceColorsInListening
    +  type  +(Colors) in android.support.v17.leanback.app.SearchFragment +
    +  type  +(Colors) in android.support.v17.leanback.app.SearchSupportFragment +
    +  type  +(Colors) in android.support.v17.leanback.widget.SearchBar +
    +setTitle +(CharSequence)
    +setTotalTimeLong +(long)
    +smoothScrollBy +(int, int, Interpolator)
    +startPostponedEnterTransition +()
    + +
    U  +A +C +E +F +G +I +O +P +R +S + TOP +

    +unregisterFragmentLifecycleCallbacks +(FragmentLifecycleCallbacks)
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_all.html b/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_all.html new file mode 100644 index 000000000000..2f522da033c6 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_all.html @@ -0,0 +1,665 @@ + + + + + + + + + +Method Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Methods +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    A  +C +D +E +F +G +H +I +N +O +P +R +S +U + TOP +

    +attachToView +(View)
    + +
    C  +A +D +E +F +G +H +I +N +O +P +R +S +U + TOP +

    +clearDrawable +()
    +collapseAction
    +  type  +(boolean) in android.support.v17.leanback.app.GuidedStepFragment +
    +  type  +(boolean) in android.support.v17.leanback.app.GuidedStepSupportFragment +
    +  type  +(boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    +createControlsRowAndPresenter +()
    +createPrimaryActionsAdapter +(PresenterSelector)
    +createSnapScroller +(LayoutManager)
    + +
    D  +A +C +E +F +G +H +I +N +O +P +R +S +U + TOP +

    +dismiss +()
    + +
    E  +A +C +D +F +G +H +I +N +O +P +R +S +U + TOP +

    +enableProgressUpdating +(boolean)
    +expandAction
    +  type  +(GuidedAction, boolean) in android.support.v17.leanback.app.GuidedStepFragment +
    +  type  +(GuidedAction, boolean) in android.support.v17.leanback.app.GuidedStepSupportFragment +
    +  type  +(GuidedAction, boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    + +
    F  +A +C +D +E +G +H +I +N +O +P +R +S +U + TOP +

    +findRowViewHolderByPosition
    +  type  +(int) in android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter +
    +  type  +(int) in android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter +
    +  type  +(int) in android.support.v17.leanback.app.RowsFragment +
    +  type  +(int) in android.support.v17.leanback.app.RowsSupportFragment +
    + +
    G  +A +C +D +E +F +H +I +N +O +P +R +S +U + TOP +

    +getBluetoothRoute +()
    +getBufferedProgressLong +()
    +getContext
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +getControlsRow +()
    +getCurrentPosition +()
    +getCurrentSpeedId +()
    +getCurrentTimeLong +()
    +getDefaultDimLayer +()
    +getDescription +()
    +getDimLayer +()
    +getDuration +()
    +getEventHandler
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlayFragment +
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    +getExtraVisibility +()
    +getFastForwardSpeeds +()
    +getFragment
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +getGravity +()
    +getInputEventHandler
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlayFragment +
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    +getMainFragment
    +  type  +() in android.support.v17.leanback.app.BrowseFragment +
    +  type  +() in android.support.v17.leanback.app.BrowseSupportFragment +
    +getMediaArt +()
    +getMediaController +(Activity)
    +getMediaDuration +()
    +getMediaSubtitle +()
    +getMediaTitle +()
    +getOnItemViewClickedListener
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +getPreferenceComparisonCallback +()
    +getRecycledViewCount +(int)
    +getRewindSpeeds +()
    +getSelectedItem +()
    +getSelectedItemViewHolder +()
    +getSelectedRowViewHolder
    +  type  +() in android.support.v17.leanback.app.BrowseFragment +
    +  type  +() in android.support.v17.leanback.app.BrowseSupportFragment +
    +getSupportedActions +()
    +getSupportMediaController +()
    +getTotalTimeLong +()
    +getUpdatePeriod +()
    +getVerticalGridView
    +  type  +() in android.support.v17.leanback.app.BaseRowFragment +
    +  type  +() in android.support.v17.leanback.app.BaseRowSupportFragment +
    +getView +()
    + +
    H  +A +C +D +E +F +G +I +N +O +P +R +S +U + TOP +

    +handleInputEvent
    +  type  +(InputEvent) in android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler +
    +  type  +(InputEvent) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler +
    +hasValidMedia +()
    + +
    I  +A +C +D +E +F +G +H +N +O +P +R +S +U + TOP +

    +isAtLeastO +()
    +isAutoReleaseOnStop +()
    +isBackKeyToCollapseActivatorView +()
    +isBackKeyToCollapseSubActions +()
    +isBluetooth +()
    +isDeviceSpeaker +()
    +isExpanded
    +  type  +() in android.support.v17.leanback.app.GuidedStepFragment +
    +  type  +() in android.support.v17.leanback.app.GuidedStepSupportFragment +
    +  type  +() in android.support.v17.leanback.widget.GuidedActionsStylist +
    +isFadingEnabled +()
    +isMediaPlaying +()
    +isShown +()
    +isShownOrQueued +()
    +isVirtual +()
    + +
    N  +A +C +D +E +F +G +H +I +O +P +R +S +U + TOP +

    +notifyItemRangeChanged +(int, int)
    + +
    O  +A +C +D +E +F +G +H +I +N +P +R +S +U + TOP +

    +onActionClicked +(Action)
    +onChildViewHolderSelectedAndPositioned +(RecyclerView, ViewHolder, int, int)
    +onEditingModeChange
    +  type  +(ViewHolder, boolean, boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    +  type  +(ViewHolder, GuidedAction, boolean) in android.support.v17.leanback.widget.GuidedActionsStylist +
    +onKey +(View, int, KeyEvent)
    +onMetadataChanged +()
    +onRowChanged
    +  type  +(PlaybackControlsRow) in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +(PlaybackControlsRow) in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +onStateChanged +()
    + +
    P  +A +C +D +E +F +G +H +I +N +O +R +S +U + TOP +

    +pausePlayback
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +postponeEnterTransition +()
    + +
    R  +A +C +D +E +F +G +H +I +N +O +P +S +U + TOP +

    +registerFragmentLifecycleCallbacks +(FragmentLifecycleCallbacks, boolean)
    + +
    S  +A +C +D +E +F +G +H +I +N +O +P +R +U + TOP +

    +setAllowOptimization +(boolean)
    +setAutoReleaseOnStop +(boolean)
    +setBackKeyToCollapseActivatorView +(boolean)
    +setBackKeyToCollapseSubActions +(boolean)
    +setBufferedProgressLong +(long)
    +setCallback +(Callback)
    +setControlsRow +(PlaybackControlsRow)
    +setCurrentTimeLong +(long)
    +setDescription +(CharSequence)
    +setDimLayer +(Drawable)
    +setDuration +(int)
    +setEditingMode +(ViewHolder, GuidedAction, boolean)
    +setErrorTextAppearance +(int)
    +setEventHandler
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlayFragment +
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    +setExpandedViewHolder +(ViewHolder)
    +setExtraVisibility +(int)
    +setFadingEnabled +(boolean)
    +setInputEventHandler
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlayFragment +
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    +setListeningOrbColors +(Colors)
    +setMediaController +(Activity, MediaControllerCompat)
    +setNotListeningOrbColors +(Colors)
    +setOnDispatchKeyListener +(OnKeyListener)
    +setOnItemViewClickedListener +(OnItemViewClickedListener)
    +setPreferenceComparisonCallback +(PreferenceComparisonCallback)
    +setSearchAffordanceColors
    +  type  +(Colors) in android.support.v17.leanback.app.SearchFragment +
    +  type  +(Colors) in android.support.v17.leanback.app.SearchSupportFragment +
    +  type  +(Colors) in android.support.v17.leanback.widget.SearchBar +
    +setSearchAffordanceColorsInListening
    +  type  +(Colors) in android.support.v17.leanback.app.SearchFragment +
    +  type  +(Colors) in android.support.v17.leanback.app.SearchSupportFragment +
    +  type  +(Colors) in android.support.v17.leanback.widget.SearchBar +
    +setSupportMediaController +(MediaControllerCompat)
    +setTitle +(CharSequence)
    +setTotalTimeLong +(long)
    +show +()
    +skipToNext
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +skipToPrevious
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +smoothScrollBy +(int, int, Interpolator)
    +startExpandedTransition +(ViewHolder)
    +startPlayback
    +  type  +(int) in android.support.v17.leanback.app.MediaControllerGlue +
    +  type  +(int) in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +(int) in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +startPostponedEnterTransition +()
    + +
    U  +A +C +D +E +F +G +H +I +N +O +P +R +S + TOP +

    +unregisterFragmentLifecycleCallbacks +(FragmentLifecycleCallbacks)
    +updateProgress +()
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_changes.html b/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_changes.html new file mode 100644 index 000000000000..c3228f903367 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_changes.html @@ -0,0 +1,387 @@ + + + + + + + + + +Method Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Methods +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    C  +D +E +G +H +I +N +O +P +S +U + TOP +

    +createControlsRowAndPresenter +()
    +createPrimaryActionsAdapter +(PresenterSelector)
    + +
    D  +C +E +G +H +I +N +O +P +S +U + TOP +

    +dismiss +()
    + +
    E  +C +D +G +H +I +N +O +P +S +U + TOP +

    +enableProgressUpdating +(boolean)
    + +
    G  +C +D +E +H +I +N +O +P +S +U + TOP +

    +getContext
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +getControlsRow +()
    +getCurrentPosition +()
    +getCurrentSpeedId +()
    +getDefaultDimLayer +()
    +getDimLayer +()
    +getDuration +()
    +getExtraVisibility +()
    +getFastForwardSpeeds +()
    +getFragment
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +getInputEventHandler
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlayFragment +
    +  type  +() in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    +getMediaArt +()
    +getMediaDuration +()
    +getMediaSubtitle +()
    +getMediaTitle +()
    +getOnItemViewClickedListener
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +getRewindSpeeds +()
    +getSupportedActions +()
    +getSupportMediaController +()
    +getUpdatePeriod +()
    +getView +()
    + +
    H  +C +D +E +G +I +N +O +P +S +U + TOP +

    +hasValidMedia +()
    + +
    I  +C +D +E +G +H +N +O +P +S +U + TOP +

    +isFadingEnabled +()
    +isMediaPlaying +()
    +isShown +()
    +isShownOrQueued +()
    + +
    N  +C +D +E +G +H +I +O +P +S +U + TOP +

    +notifyItemRangeChanged +(int, int)
    + +
    O  +C +D +E +G +H +I +N +P +S +U + TOP +

    +onActionClicked +(Action)
    +onEditingModeChange +(ViewHolder, GuidedAction, boolean)
    +onKey +(View, int, KeyEvent)
    +onMetadataChanged +()
    +onRowChanged
    +  type  +(PlaybackControlsRow) in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +(PlaybackControlsRow) in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +onStateChanged +()
    + +
    P  +C +D +E +G +H +I +N +O +S +U + TOP +

    +pausePlayback
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +
    S  +C +D +E +G +H +I +N +O +P +U + TOP +

    +setCallback +(Callback)
    +setControlsRow +(PlaybackControlsRow)
    +setDimLayer +(Drawable)
    +setDuration +(int)
    +setEditingMode +(ViewHolder, GuidedAction, boolean)
    +setExpandedViewHolder +(ViewHolder)
    +setExtraVisibility +(int)
    +setFadingEnabled +(boolean)
    +setInputEventHandler
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlayFragment +
    +  type  +(InputEventHandler) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment +
    +setOnItemViewClickedListener +(OnItemViewClickedListener)
    +setSupportMediaController +(MediaControllerCompat)
    +show +()
    +skipToNext
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +skipToPrevious
    +  type  +() in android.support.v17.leanback.app.MediaControllerGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +() in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    +startExpandedTransition +(ViewHolder)
    +startPlayback
    +  type  +(int) in android.support.v17.leanback.app.MediaControllerGlue +
    +  type  +(int) in android.support.v17.leanback.app.PlaybackControlGlue +
    +  type  +(int) in android.support.v17.leanback.app.PlaybackControlSupportGlue +
    + +
    U  +C +D +E +G +H +I +N +O +P +S + TOP +

    +updateProgress +()
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_removals.html b/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_removals.html new file mode 100644 index 000000000000..76fb90c4eefe --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/methods_index_removals.html @@ -0,0 +1,72 @@ + + + + + + + + + +Method Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Methods +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    + +
    H  + TOP +

    +handleInputEvent
    +  type  +(InputEvent) in android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler +
    +  type  +(InputEvent) in android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_additions.html b/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_additions.html new file mode 100644 index 000000000000..1776064fe6a9 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_additions.html @@ -0,0 +1,63 @@ + + + + + + + + + +Package Additions Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Packages +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_all.html b/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_all.html new file mode 100644 index 000000000000..d849651acdea --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_all.html @@ -0,0 +1,78 @@ + + + + + + + + + +Package Differences Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +Packages +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    +
    +
    + +android.support.design.widget
    +android.support.graphics.drawable
    +android.support.v17.leanback.app
    +android.support.v17.leanback.widget
    +android.support.v17.preference
    +android.support.v4.app
    +android.support.v4.media.session
    +android.support.v4.os
    +android.support.v4.provider
    +android.support.v4.util
    +android.support.v7.app
    +android.support.v7.media
    +android.support.v7.preference
    +android.support.v7.widget
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_changes.html b/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_changes.html new file mode 100644 index 000000000000..82a93996bb4a --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_changes.html @@ -0,0 +1,78 @@ + + + + + + + + + +Package Changes Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Packages +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    +
    +
    + +android.support.design.widget
    +android.support.graphics.drawable
    +android.support.v17.leanback.app
    +android.support.v17.leanback.widget
    +android.support.v17.preference
    +android.support.v4.app
    +android.support.v4.media.session
    +android.support.v4.os
    +android.support.v4.provider
    +android.support.v4.util
    +android.support.v7.app
    +android.support.v7.media
    +android.support.v7.preference
    +android.support.v7.widget
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_removals.html b/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_removals.html new file mode 100644 index 000000000000..9fd0f7e9a8e7 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/packages_index_removals.html @@ -0,0 +1,63 @@ + + + + + + + + + +Package Removals Index + + + + + + + + + + + + + + + +
    + Filter the Index: +
    +All Packages +
    +Removals +
    +Additions +
    +Changes +
    +
    +Listed as: Added, Removed, Changed +
    +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.design.widget.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.design.widget.html new file mode 100644 index 000000000000..f59e04defbda --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.design.widget.html @@ -0,0 +1,162 @@ + + + + + + + + + +android.support.design.widget + + + + + + + + + + +
    +
    +
    +

    +Package android.support.design.widget +

    +

    + + + + + + + + + + + + + + + + +
    Added Classes and Interfaces +
    + + BaseTransientBottomBar +  
    + + BaseTransientBottomBar.
    BaseCallback
    +
     
    + + BaseTransientBottomBar.
    ContentViewCallback
    +
     
    +  +

    + + + + + + + + + + + + + + + + +
    Changed Classes +
    + + Snackbar +  
    + + Snackbar.Callback +  
    + + TextInputLayout +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.graphics.drawable.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.graphics.drawable.html new file mode 100644 index 000000000000..75a6568641c0 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.graphics.drawable.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.graphics.drawable + + + + + + + + + + +
    +
    +
    +

    +Package android.support.graphics.drawable +

    +

    + + + + + + + + +
    Added Classes +
    + + AnimatedVectorDrawableCompat +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v17.leanback.app.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v17.leanback.app.html new file mode 100644 index 000000000000..5fdcd9429ad2 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v17.leanback.app.html @@ -0,0 +1,344 @@ + + + + + + + + + +android.support.v17.leanback.app + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v17.leanback.app +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Added Classes and Interfaces +
    + + PlaybackControlGlue.InputEventHandler +  
    + + PlaybackFragment +  
    + + PlaybackFragment.OnFadeCompleteListener +  
    + + PlaybackFragmentGlueHost +  
    + + PlaybackGlue +  
    + + PlaybackGlue.HostLifecycleCallback +  
    + + PlaybackGlue.PlaybackGlueHost +  
    + + PlaybackGlue.PlayerCallback +  
    + + PlaybackSupportFragment +  
    + + PlaybackSupportFragment.
    OnFadeCompleteListener
    +
     
    + + PlaybackSupportFragmentGlueHost +  
    + + SurfaceHolderGlueHost +  
    +  +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Changed Classes and Interfaces +
    + + BackgroundManager +  
    + + BaseRowFragment +  
    + + BaseRowSupportFragment +  
    + + BrowseFragment +  
    + + BrowseFragment.MainFragmentRowsAdapter +  
    + + BrowseSupportFragment +  
    + + BrowseSupportFragment.
    MainFragmentRowsAdapter
    +
     
    + + GuidedStepFragment +  
    + + GuidedStepSupportFragment +  
    + + MediaControllerGlue +  
    + + PlaybackControlGlue +  
    + + PlaybackControlSupportGlue +  
    + + PlaybackOverlayFragment +  
    + + PlaybackOverlayFragment.
    InputEventHandler
    +
     
    + + PlaybackOverlaySupportFragment +  
    + + PlaybackOverlaySupportFragment.
    InputEventHandler
    +
     
    + + RowsFragment +  
    + + RowsSupportFragment +  
    + + SearchFragment +  
    + + SearchSupportFragment +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v17.leanback.widget.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v17.leanback.widget.html new file mode 100644 index 000000000000..328fb784ee8b --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v17.leanback.widget.html @@ -0,0 +1,218 @@ + + + + + + + + + +android.support.v17.leanback.widget + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v17.leanback.widget +

    +

    + + + + + + + + + + + + +
    Added Classes +
    + + PlaybackRowPresenter +  
    + + PlaybackRowPresenter.
    ViewHolder
    +
     
    +  +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Changed Classes +
    + + BaseCardView +  
    + + BrowseFrameLayout +  
    + + GuidedActionsStylist +  
    + + HeaderItem +  
    + + ObjectAdapter +  
    + + OnChildViewHolderSelectedListener +  
    + + PlaybackControlsRow +  
    + + PlaybackControlsRowPresenter +  
    + + PlaybackControlsRowPresenter.
    ViewHolder
    +
     
    + + RowPresenter.ViewHolder +  
    + + SearchBar +  
    + + SpeechOrbView +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v17.preference.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v17.preference.html new file mode 100644 index 000000000000..6fef89033218 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v17.preference.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v17.preference + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v17.preference +

    +

    + + + + + + + + +
    Changed Classes +
    + + LeanbackPreferenceFragment +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.app.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.app.html new file mode 100644 index 000000000000..11fdf224dd01 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.app.html @@ -0,0 +1,155 @@ + + + + + + + + + +android.support.v4.app + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.app +

    +

    + + + + + + + + +
    Added Classes +
    + + FragmentManager.FragmentLifecycleCallbacks +  
    +  +

    + + + + + + + + + + + + + + + + + + + + +
    Changed Classes +
    + + Fragment +  
    + + FragmentActivity +  
    + + FragmentManager +  
    + + FragmentTransaction +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.media.session.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.media.session.html new file mode 100644 index 000000000000..a8a5cef924a3 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.media.session.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v4.media.session + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.media.session +

    +

    + + + + + + + + +
    Changed Classes +
    + + MediaControllerCompat +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.os.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.os.html new file mode 100644 index 000000000000..33a5f1c5d4c4 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.os.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v4.os + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.os +

    +

    + + + + + + + + +
    Changed Classes +
    + + BuildCompat +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.provider.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.provider.html new file mode 100644 index 000000000000..6c3acd5debd6 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.provider.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v4.provider + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.provider +

    +

    + + + + + + + + +
    Changed Classes +
    + + DocumentFile +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.util.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.util.html new file mode 100644 index 000000000000..144adda16428 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v4.util.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v4.util + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v4.util +

    +

    + + + + + + + + +
    Added Classes +
    + + ArraySet +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.app.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.app.html new file mode 100644 index 000000000000..83e0d6b29e1a --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.app.html @@ -0,0 +1,119 @@ + + + + + + + + + +android.support.v7.app + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v7.app +

    +

    + + + + + + + + +
    Changed Classes +
    + + MediaRouteChooserDialog +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.media.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.media.html new file mode 100644 index 000000000000..efb3815cd8d1 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.media.html @@ -0,0 +1,126 @@ + + + + + + + + + +android.support.v7.media + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v7.media +

    +

    + + + + + + + + + + + + +
    Changed Classes +
    + + MediaRouter +  
    + + MediaRouter.RouteInfo +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.preference.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.preference.html new file mode 100644 index 000000000000..0bbdc1ea1690 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.preference.html @@ -0,0 +1,148 @@ + + + + + + + + + +android.support.v7.preference + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v7.preference +

    +

    + + + + + + + + + + + + + + + + +
    Added Classes +
    + + PreferenceManager.PreferenceComparisonCallback +  
    + + PreferenceManager.SimplePreferenceComparisonCallback +  
    + + SeekBarPreference +  
    +  +

    + + + + + + + + +
    Changed Classes +
    + + PreferenceManager +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.widget.html b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.widget.html new file mode 100644 index 000000000000..e4fcc866d3e8 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/changes/pkg_android.support.v7.widget.html @@ -0,0 +1,155 @@ + + + + + + + + + +android.support.v7.widget + + + + + + + + + + +
    +
    +
    +

    +Package android.support.v7.widget +

    +

    + + + + + + + + +
    Added Classes +
    + + PagerSnapHelper +  
    +  +

    + + + + + + + + + + + + + + + + + + + + +
    Changed Classes +
    + + LinearLayoutCompat +  
    + + RecyclerView +  
    + + RecyclerView.RecycledViewPool +  
    + + SnapHelper +  
    +  +

    + +
    +
    + + + + diff --git a/docs/html/sdk/support_api_diff/25.1.0/missingSinces.txt b/docs/html/sdk/support_api_diff/25.1.0/missingSinces.txt new file mode 100644 index 000000000000..e0e20f1c4b64 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/missingSinces.txt @@ -0,0 +1,98 @@ +NO DOC BLOCK: android.support.graphics.drawable.AnimatedVectorDrawableCompat Class +NO DOC BLOCK: android.support.v4.util.ArraySet Class +NO DOC BLOCK: android.support.design.widget.BaseTransientBottomBar Class +NO DOC BLOCK: android.support.design.widget.BaseTransientBottomBar.BaseCallback Class +NO DOC BLOCK: android.support.design.widget.BaseTransientBottomBar.ContentViewCallback Interface +NO DOC BLOCK: android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks Class +NO DOC BLOCK: android.support.v7.widget.PagerSnapHelper Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler Interface +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackFragment Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackFragment.OnFadeCompleteListener Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackFragmentGlueHost Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackGlue Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackGlue.HostLifecycleCallback Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackGlue.PlaybackGlueHost Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackGlue.PlayerCallback Class +NO DOC BLOCK: android.support.v17.leanback.widget.PlaybackRowPresenter Class +NO DOC BLOCK: android.support.v17.leanback.widget.PlaybackRowPresenter.ViewHolder Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackSupportFragment Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackSupportFragment.OnFadeCompleteListener Class +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackSupportFragmentGlueHost Class +NO DOC BLOCK: android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback Class +NO DOC BLOCK: android.support.v7.preference.PreferenceManager.SimplePreferenceComparisonCallback Class +NO DOC BLOCK: android.support.v7.preference.SeekBarPreference Class +NO DOC BLOCK: android.support.v17.leanback.app.SurfaceHolderGlueHost Interface +NO DOC BLOCK: android.support.v17.leanback.app.MediaControllerGlue Constructor (android.content.Context, android.support.v17.leanback.app.PlaybackGlue.PlaybackGlueHost, int[], int[]) +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackControlGlue Constructor (android.content.Context, android.support.v17.leanback.app.PlaybackGlue.PlaybackGlueHost, int[], int[]) +NO DOC BLOCK: android.support.v17.leanback.app.BackgroundManager Method attachToView(android.view.View) +NO DOC BLOCK: android.support.v17.leanback.app.BackgroundManager Method clearDrawable() +NO DOC BLOCK: android.support.v17.leanback.app.GuidedStepFragment Method collapseAction(boolean) +NO DOC BLOCK: android.support.v17.leanback.app.GuidedStepSupportFragment Method collapseAction(boolean) +NO DOC BLOCK: android.support.v17.leanback.widget.GuidedActionsStylist Method collapseAction(boolean) +NO DOC BLOCK: android.support.v7.widget.SnapHelper Method createSnapScroller(android.support.v7.widget.RecyclerView.LayoutManager) +NO DOC BLOCK: android.support.v17.leanback.app.GuidedStepFragment Method expandAction(android.support.v17.leanback.widget.GuidedAction, boolean) +NO DOC BLOCK: android.support.v17.leanback.app.GuidedStepSupportFragment Method expandAction(android.support.v17.leanback.widget.GuidedAction, boolean) +NO DOC BLOCK: android.support.v17.leanback.widget.GuidedActionsStylist Method expandAction(android.support.v17.leanback.widget.GuidedAction, boolean) +NO DOC BLOCK: android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter Method findRowViewHolderByPosition(int) +NO DOC BLOCK: android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter Method findRowViewHolderByPosition(int) +NO DOC BLOCK: android.support.v17.leanback.app.RowsFragment Method findRowViewHolderByPosition(int) +NO DOC BLOCK: android.support.v17.leanback.app.RowsSupportFragment Method findRowViewHolderByPosition(int) +NO DOC BLOCK: android.support.v7.media.MediaRouter Method getBluetoothRoute() +NO DOC BLOCK: android.support.v17.leanback.widget.PlaybackControlsRow Method getBufferedProgressLong() +NO DOC BLOCK: android.support.v17.leanback.widget.PlaybackControlsRow Method getCurrentTimeLong() +NO DOC BLOCK: android.support.v17.leanback.widget.HeaderItem Method getDescription() +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackOverlayFragment Method getEventHandler() +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackOverlaySupportFragment Method getEventHandler() +NO DOC BLOCK: android.support.v7.widget.LinearLayoutCompat Method getGravity() +NO DOC BLOCK: android.support.v17.leanback.app.BrowseFragment Method getMainFragment() +NO DOC BLOCK: android.support.v17.leanback.app.BrowseSupportFragment Method getMainFragment() +NO DOC BLOCK: android.support.v4.media.session.MediaControllerCompat Method getMediaController(android.app.Activity) +NO DOC BLOCK: android.support.v7.preference.PreferenceManager Method getPreferenceComparisonCallback() +NO DOC BLOCK: android.support.v7.widget.RecyclerView.RecycledViewPool Method getRecycledViewCount(int) +NO DOC BLOCK: android.support.v17.leanback.widget.RowPresenter.ViewHolder Method getSelectedItem() +NO DOC BLOCK: android.support.v17.leanback.widget.RowPresenter.ViewHolder Method getSelectedItemViewHolder() +NO DOC BLOCK: android.support.v17.leanback.app.BrowseFragment Method getSelectedRowViewHolder() +NO DOC BLOCK: android.support.v17.leanback.app.BrowseSupportFragment Method getSelectedRowViewHolder() +NO DOC BLOCK: android.support.v17.leanback.widget.PlaybackControlsRow Method getTotalTimeLong() +NO DOC BLOCK: android.support.v17.leanback.app.BaseRowFragment Method getVerticalGridView() +NO DOC BLOCK: android.support.v17.leanback.app.BaseRowSupportFragment Method getVerticalGridView() +NO DOC BLOCK: android.support.v4.os.BuildCompat Method isAtLeastO() +NO DOC BLOCK: android.support.v17.leanback.app.BackgroundManager Method isAutoReleaseOnStop() +NO DOC BLOCK: android.support.v17.leanback.widget.GuidedActionsStylist Method isBackKeyToCollapseActivatorView() +NO DOC BLOCK: android.support.v17.leanback.widget.GuidedActionsStylist Method isBackKeyToCollapseSubActions() +NO DOC BLOCK: android.support.v7.media.MediaRouter.RouteInfo Method isBluetooth() +NO DOC BLOCK: android.support.v7.media.MediaRouter.RouteInfo Method isDeviceSpeaker() +NO DOC BLOCK: android.support.v17.leanback.app.GuidedStepFragment Method isExpanded() +NO DOC BLOCK: android.support.v17.leanback.app.GuidedStepSupportFragment Method isExpanded() +NO DOC BLOCK: android.support.v17.leanback.widget.GuidedActionsStylist Method isExpanded() +NO DOC BLOCK: android.support.v4.provider.DocumentFile Method isVirtual() +NO DOC BLOCK: android.support.v17.leanback.widget.OnChildViewHolderSelectedListener Method onChildViewHolderSelectedAndPositioned(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int) +NO DOC BLOCK: android.support.v17.leanback.widget.GuidedActionsStylist Method onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean, boolean) +NO DOC BLOCK: android.support.v4.app.Fragment Method postponeEnterTransition() +NO DOC BLOCK: android.support.v4.app.FragmentManager Method registerFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks, boolean) +NO DOC BLOCK: android.support.v4.app.FragmentTransaction Method setAllowOptimization(boolean) +NO DOC BLOCK: android.support.v17.leanback.app.BackgroundManager Method setAutoReleaseOnStop(boolean) +NO DOC BLOCK: android.support.v17.leanback.widget.GuidedActionsStylist Method setBackKeyToCollapseActivatorView(boolean) +NO DOC BLOCK: android.support.v17.leanback.widget.GuidedActionsStylist Method setBackKeyToCollapseSubActions(boolean) +NO DOC BLOCK: android.support.v17.leanback.widget.PlaybackControlsRow Method setBufferedProgressLong(long) +NO DOC BLOCK: android.support.v17.leanback.widget.PlaybackControlsRow Method setCurrentTimeLong(long) +NO DOC BLOCK: android.support.v17.leanback.widget.HeaderItem Method setDescription(java.lang.CharSequence) +NO DOC BLOCK: android.support.design.widget.TextInputLayout Method setErrorTextAppearance(int) +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackOverlayFragment Method setEventHandler(android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler) +NO DOC BLOCK: android.support.v17.leanback.app.PlaybackOverlaySupportFragment Method setEventHandler(android.support.v17.leanback.app.PlaybackControlGlue.InputEventHandler) +NO DOC BLOCK: android.support.v17.leanback.widget.SpeechOrbView Method setListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors) +NO DOC BLOCK: android.support.v4.media.session.MediaControllerCompat Method setMediaController(android.app.Activity, android.support.v4.media.session.MediaControllerCompat) +NO DOC BLOCK: android.support.v17.leanback.widget.SpeechOrbView Method setNotListeningOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors) +NO DOC BLOCK: android.support.v17.leanback.widget.BrowseFrameLayout Method setOnDispatchKeyListener(android.view.View.OnKeyListener) +NO DOC BLOCK: android.support.v7.preference.PreferenceManager Method setPreferenceComparisonCallback(android.support.v7.preference.PreferenceManager.PreferenceComparisonCallback) +NO DOC BLOCK: android.support.v17.leanback.app.SearchFragment Method setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors) +NO DOC BLOCK: android.support.v17.leanback.app.SearchSupportFragment Method setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors) +NO DOC BLOCK: android.support.v17.leanback.widget.SearchBar Method setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors) +NO DOC BLOCK: android.support.v17.leanback.app.SearchFragment Method setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors) +NO DOC BLOCK: android.support.v17.leanback.app.SearchSupportFragment Method setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors) +NO DOC BLOCK: android.support.v17.leanback.widget.SearchBar Method setSearchAffordanceColorsInListening(android.support.v17.leanback.widget.SearchOrbView.Colors) +NO DOC BLOCK: android.support.v17.preference.LeanbackPreferenceFragment Method setTitle(java.lang.CharSequence) +NO DOC BLOCK: android.support.v17.leanback.widget.PlaybackControlsRow Method setTotalTimeLong(long) +NO DOC BLOCK: android.support.v7.widget.RecyclerView Method smoothScrollBy(int, int, android.view.animation.Interpolator) +NO DOC BLOCK: android.support.v4.app.Fragment Method startPostponedEnterTransition() +NO DOC BLOCK: android.support.v4.app.FragmentManager Method unregisterFragmentLifecycleCallbacks(android.support.v4.app.FragmentManager.FragmentLifecycleCallbacks) diff --git a/docs/html/sdk/support_api_diff/25.1.0/stylesheet-jdiff.css b/docs/html/sdk/support_api_diff/25.1.0/stylesheet-jdiff.css new file mode 100644 index 000000000000..edafaa3da3e5 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/stylesheet-jdiff.css @@ -0,0 +1,44 @@ + +/* (http://www.jdiff.org) */ + +div.and-diff-id {border: 1px solid #eee;position:relative;float:right;clear:both;padding:0px;} +table.diffspectable {border:1px;padding:0px;margin:0px;} +.diffspechead {background-color:#eee;} +.diffspectable tr {border:0px;padding:0px;} +.diffspectable td {background-color:eee;border:0px;font-size:90%;font-weight:normal;padding:0px;padding-left:1px;padding-right:1px;text-align:center;color:777;} +td.diffvalueold {color:orange;background-color:white;border:0px;font-size:80%;font-style:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;} +td.diffvaluenew {color:green;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;} +td.diffvalue {color:444;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;} +td.diffspec {background-color:white;border:0px;font-size:80%;font-weight:normal;padding:1px;color:444;text-align:right;padding-right:.5em;line-height:.95em;} +tt {font-size:11pt;font-family:monospace;} +.indexHeader { + font-size:96%; + line-height:.8em;} +.jdiffIndex td { + font-size:96%; + xline-height:.8em; + padding:2px; + padding-left:1em;} +.indexText { + font-size:100%; + padding-left:1em;} +#indexTableCaption { + font-size:96%; + margin-top:.25em; + margin-bottom:0; + } +.hiddenlink { + font-size:96%; + line-height:.8em; + text-decoration:none;} +a { + text-decoration:none;} +a:hover { + text-decoration:underline;} +.indexBox { + border: 1px solid red; + margin:1em 0 0 0;} +.letterIndexHead { + font-size: 1.5em;font-weight:9; + margin:0 0 0em 0; + border: 1px solid red;} diff --git a/docs/html/sdk/support_api_diff/25.1.0/user_comments_for_25.0.0_to_25.1.0.xml b/docs/html/sdk/support_api_diff/25.1.0/user_comments_for_25.0.0_to_25.1.0.xml new file mode 100644 index 000000000000..b3dcd6798212 --- /dev/null +++ b/docs/html/sdk/support_api_diff/25.1.0/user_comments_for_25.0.0_to_25.1.0.xml @@ -0,0 +1,1459 @@ + + + + + + + + + + + + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + + + InsertCommentsHere + + + + diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index 447a4c4e8345..4afe438c686f 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -49,8 +49,8 @@ public Options() { /** * If set, decode methods that take the Options object will attempt to * reuse this bitmap when loading content. If the decode operation - * cannot use this bitmap, the decode method will return - * null and will throw an IllegalArgumentException. The + * cannot use this bitmap, the decode method will throw an + * {@link java.lang.IllegalArgumentException}. The * current implementation necessitates that the reused bitmap be * mutable, and the resulting reused bitmap will continue to remain * mutable even when decoding a resource which would normally result in diff --git a/graphics/java/android/graphics/Outline.java b/graphics/java/android/graphics/Outline.java index aa81b9196fe1..c6ef76a2180d 100644 --- a/graphics/java/android/graphics/Outline.java +++ b/graphics/java/android/graphics/Outline.java @@ -112,7 +112,7 @@ public boolean isEmpty() { * Currently, only Outlines that can be represented as a rectangle, circle, * or round rect support clipping. * - * @see {@link android.view.View#setClipToOutline(boolean)} + * @see android.view.View#setClipToOutline(boolean) */ public boolean canClip() { return mMode != MODE_CONVEX_PATH; diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index cfbe672a4cd6..cac9537ab023 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -1404,7 +1404,7 @@ public void setElegantTextHeight(boolean elegant) { /** * Return the paint's text size. * - * @return the paint's text size. + * @return the paint's text size in pixel units. */ public float getTextSize() { return nGetTextSize(mNativePaint); @@ -1415,7 +1415,7 @@ public float getTextSize() { /** * Set the paint's text size. This value must be > 0 * - * @param textSize set the paint's text size. + * @param textSize set the paint's text size in pixel units. */ public void setTextSize(float textSize) { nSetTextSize(mNativePaint, textSize); diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index c24d31334be0..659725ef59f6 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -15,14 +15,14 @@ package android.graphics.drawable; import android.animation.Animator; +import android.animation.Animator.AnimatorListener; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; -import android.animation.Animator.AnimatorListener; +import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; -import android.animation.ObjectAnimator; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread; @@ -55,8 +55,8 @@ import android.view.View; import com.android.internal.R; - import com.android.internal.util.VirtualRefBasePtr; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -88,9 +88,77 @@ * *
  • XML for the VectorDrawable containing properties to be animated

    *

    - * Animations can be performed on both group and path attributes, which requires groups and paths to - * have unique names in the same VectorDrawable. Groups and paths without animations do not need to - * be named. + * Animations can be performed on the animatable attributes in + * {@link android.graphics.drawable.VectorDrawable}. These attributes will be animated by + * {@link android.animation.ObjectAnimator}. The ObjectAnimator's target can be the root element, + * a group element or a path element. The targeted elements need to be named uniquely within + * the same VectorDrawable. Elements without animation do not need to be named. + *

    + *

    + * Here are all the animatable attributes in {@link android.graphics.drawable.VectorDrawable}: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Element NameAnimatable attribute name
    <vector>alpha
    <group>rotation
    pivotX
    pivotY
    scaleX
    scaleY
    translateX
    translateY
    <path>pathData
    fillColor
    strokeColor
    strokeWidth
    strokeAlpha
    fillAlpha
    trimPathStart
    trimPathOffset
    <clip-path>pathData
    *

    * Below is an example of a VectorDrawable defined in vectordrawable.xml. This VectorDrawable is * referred to by its file name (not including file suffix) in the @@ -118,9 +186,8 @@ *
  • XML for AnimatedVectorDrawable

    *

    * An AnimatedVectorDrawable element has a VectorDrawable attribute, and one or more target - * element(s). The target elements can be the path or group to be animated. Each target element - * contains a name attribute that references a property (of a path or a group) to animate, and an - * animation attribute that points to an ObjectAnimator or an AnimatorSet. + * element(s). The target element can specify its target by android:name attribute, and link the + * target with the proper ObjectAnimator or AnimatorSet by android:animation attribute. *

    * The following code sample defines an AnimatedVectorDrawable. Note that the names refer to the * groups and paths in the VectorDrawable XML above. @@ -173,7 +240,8 @@ * merge the XML files from the previous examples into one XML file: *

    *
    - * <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" >
    + * <animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    + *                  xmlns:aapt="http://schemas.android.com/aapt" >
      *     <aapt:attr name="android:drawable">
      *         <vector
      *             android:height="64dp"
    diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
    index c2e302e184c9..bf32e4277d20 100644
    --- a/graphics/java/android/graphics/drawable/Drawable.java
    +++ b/graphics/java/android/graphics/drawable/Drawable.java
    @@ -1315,7 +1315,7 @@ public static abstract class ConstantState {
              * provide an appropriate Resources object.
              *
              * @return a new drawable object based on this constant state
    -         * @see {@link #newDrawable(Resources)}
    +         * @see #newDrawable(Resources)
              */
             public abstract @NonNull Drawable newDrawable();
     
    diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
    index 1ca15525c8a1..d644beeb7d37 100644
    --- a/graphics/java/android/graphics/drawable/VectorDrawable.java
    +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
    @@ -76,36 +76,27 @@
      * 
    *
    android:name
    *
    Defines the name of this vector drawable.
    - *
    Animatable : No.
    *
    android:width
    *
    Used to define the intrinsic width of the drawable. * This support all the dimension units, normally specified with dp.
    - *
    Animatable : No.
    *
    android:height
    *
    Used to define the intrinsic height the drawable. * This support all the dimension units, normally specified with dp.
    - *
    Animatable : No.
    *
    android:viewportWidth
    *
    Used to define the width of the viewport space. Viewport is basically * the virtual canvas where the paths are drawn on.
    - *
    Animatable : No.
    *
    android:viewportHeight
    *
    Used to define the height of the viewport space. Viewport is basically * the virtual canvas where the paths are drawn on.
    - *
    Animatable : No.
    *
    android:tint
    *
    The color to apply to the drawable as a tint. By default, no tint is applied.
    - *
    Animatable : No.
    *
    android:tintMode
    - *
    The Porter-Duff blending mode for the tint color. The default value is src_in.
    - *
    Animatable : No.
    + *
    The Porter-Duff blending mode for the tint color. Default is src_in.
    *
    android:autoMirrored
    *
    Indicates if the drawable needs to be mirrored when its layout direction is - * RTL (right-to-left).
    - *
    Animatable : No.
    + * RTL (right-to-left). Default is false.
  • *
    android:alpha
    - *
    The opacity of this drawable.
    - *
    Animatable : Yes.
    + *
    The opacity of this drawable. Default is 1.0.
    *
    * * @@ -117,32 +108,24 @@ *
    *
    android:name
    *
    Defines the name of the group.
    - *
    Animatable : No.
    *
    android:rotation
    - *
    The degrees of rotation of the group.
    - *
    Animatable : Yes.
    + *
    The degrees of rotation of the group. Default is 0.
    *
    android:pivotX
    *
    The X coordinate of the pivot for the scale and rotation of the group. - * This is defined in the viewport space.
    - *
    Animatable : Yes.
    + * This is defined in the viewport space. Default is 0. *
    android:pivotY
    *
    The Y coordinate of the pivot for the scale and rotation of the group. - * This is defined in the viewport space.
    - *
    Animatable : Yes.
    + * This is defined in the viewport space. Default is 0. *
    android:scaleX
    - *
    The amount of scale on the X Coordinate.
    - *
    Animatable : Yes.
    + *
    The amount of scale on the X Coordinate. Default is 1.
    *
    android:scaleY
    - *
    The amount of scale on the Y coordinate.
    - *
    Animatable : Yes.
    + *
    The amount of scale on the Y coordinate. Default is 1.
    *
    android:translateX
    *
    The amount of translation on the X coordinate. - * This is defined in the viewport space.
    - *
    Animatable : Yes.
    + * This is defined in the viewport space. Default is 0. *
    android:translateY
    *
    The amount of translation on the Y coordinate. - * This is defined in the viewport space.
    - *
    Animatable : Yes.
    + * This is defined in the viewport space. Default is 0. *
    * * @@ -152,58 +135,44 @@ *
    *
    android:name
    *
    Defines the name of the path.
    - *
    Animatable : No.
    *
    android:pathData
    *
    Defines path data using exactly same format as "d" attribute * in the SVG's path data. This is defined in the viewport space.
    - *
    Animatable : Yes.
    *
    android:fillColor
    *
    Specifies the color used to fill the path. May be a color or, for SDK 24+, a color state list * or a gradient color (See {@link android.R.styleable#GradientColor} * and {@link android.R.styleable#GradientColorItem}). * If this property is animated, any value set by the animation will override the original value. * No path fill is drawn if this property is not specified.
    - *
    Animatable : Yes.
    *
    android:strokeColor
    *
    Specifies the color used to draw the path outline. May be a color or, for SDK 24+, a color * state list or a gradient color (See {@link android.R.styleable#GradientColor} * and {@link android.R.styleable#GradientColorItem}). * If this property is animated, any value set by the animation will override the original value. * No path outline is drawn if this property is not specified.
    - *
    Animatable : Yes.
    *
    android:strokeWidth
    - *
    The width a path stroke.
    - *
    Animatable : Yes.
    + *
    The width a path stroke. Default is 0.
    *
    android:strokeAlpha
    - *
    The opacity of a path stroke.
    - *
    Animatable : Yes.
    + *
    The opacity of a path stroke. Default is 1.
    *
    android:fillAlpha
    - *
    The opacity to fill the path with.
    - *
    Animatable : Yes.
    + *
    The opacity to fill the path with. Default is 1.
    *
    android:trimPathStart
    - *
    The fraction of the path to trim from the start, in the range from 0 to 1.
    - *
    Animatable : Yes.
    + *
    The fraction of the path to trim from the start, in the range from 0 to 1. Default is 0.
    *
    android:trimPathEnd
    - *
    The fraction of the path to trim from the end, in the range from 0 to 1.
    - *
    Animatable : Yes.
    + *
    The fraction of the path to trim from the end, in the range from 0 to 1. Default is 1.
    *
    android:trimPathOffset
    *
    Shift trim region (allows showed region to include the start and end), in the range - * from 0 to 1.
    - *
    Animatable : Yes.
    + * from 0 to 1. Default is 0. *
    android:strokeLineCap
    - *
    Sets the linecap for a stroked path: butt, round, square.
    - *
    Animatable : No.
    + *
    Sets the linecap for a stroked path: butt, round, square. Default is butt.
    *
    android:strokeLineJoin
    - *
    Sets the lineJoin for a stroked path: miter,round,bevel.
    - *
    Animatable : No.
    + *
    Sets the lineJoin for a stroked path: miter,round,bevel. Default is miter.
    *
    android:strokeMiterLimit
    - *
    Sets the Miter limit for a stroked path.
    - *
    Animatable : No.
    + *
    Sets the Miter limit for a stroked path. Default is 4.
    *
    android:fillType
    - *
    Sets the fillType for a path. The types can be either "evenOdd" or "nonZero". They behave the - * same as SVG's "fill-rule" properties. For more details, see + *
    For SDK 24+, sets the fillType for a path. The types can be either "evenOdd" or "nonZero". They behave the + * same as SVG's "fill-rule" properties. Default is nonZero. For more details, see * FillRuleProperty
    - *
    Animatable : No.
    *
    * * diff --git a/include/androidfw/AssetManager.h b/include/androidfw/AssetManager.h index 651765b0ce99..64bdcc263526 100644 --- a/include/androidfw/AssetManager.h +++ b/include/androidfw/AssetManager.h @@ -72,6 +72,12 @@ class AssetManager : public AAssetManager { static const char* RESOURCES_FILENAME; static const char* IDMAP_BIN; static const char* OVERLAY_DIR; + /* + * If OVERLAY_THEME_DIR_PROPERTY is set, search for runtime resource overlay + * APKs in OVERLAY_DIR/ in addition to + * OVERLAY_DIR. + */ + static const char* OVERLAY_THEME_DIR_PROPERTY; static const char* TARGET_PACKAGE_NAME; static const char* TARGET_APK_PATH; static const char* IDMAP_DIR; diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java index 70e4b6ff2e59..00d786a93626 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -626,6 +626,16 @@ public int attestKey( } } + /** + * Notify keystore that the device went off-body. + */ + public void onDeviceOffBody() { + try { + mBinder.onDeviceOffBody(); + } catch (RemoteException e) { + Log.w(TAG, "Cannot connect to keystore", e); + } + } /** * Returns a {@link KeyStoreException} corresponding to the provided keystore/keymaster error diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index 7fe96f060bba..12b1748112d7 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -77,6 +77,7 @@ static volatile int32_t gCount = 0; const char* AssetManager::RESOURCES_FILENAME = "resources.arsc"; const char* AssetManager::IDMAP_BIN = "/system/bin/idmap"; const char* AssetManager::OVERLAY_DIR = "/vendor/overlay"; +const char* AssetManager::OVERLAY_THEME_DIR_PROPERTY = "ro.boot.vendor.overlay.theme"; const char* AssetManager::TARGET_PACKAGE_NAME = "android"; const char* AssetManager::TARGET_APK_PATH = "/system/framework/framework-res.apk"; const char* AssetManager::IDMAP_DIR = "/data/resource-cache"; diff --git a/libs/androidfw/LocaleData.cpp b/libs/androidfw/LocaleData.cpp index 038ef5839fe2..889d166d853b 100644 --- a/libs/androidfw/LocaleData.cpp +++ b/libs/androidfw/LocaleData.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include #include #include #include @@ -121,6 +122,16 @@ inline bool isRepresentative(uint32_t language_and_region, const char* script) { return (REPRESENTATIVE_LOCALES.count(packed_locale) != 0); } +const uint32_t US_SPANISH = 0x65735553lu; // es-US +const uint32_t MEXICAN_SPANISH = 0x65734D58lu; // es-MX +const uint32_t LATIN_AMERICAN_SPANISH = 0x6573A424lu; // es-419 + +// The two locales es-US and es-MX are treated as special fallbacks for es-419. +// If there is no es-419, they are considered its equivalent. +inline bool isSpecialSpanish(uint32_t language_and_region) { + return (language_and_region == US_SPANISH || language_and_region == MEXICAN_SPANISH); +} + int localeDataCompareRegions( const char* left_region, const char* right_region, const char* requested_language, const char* requested_script, @@ -129,18 +140,30 @@ int localeDataCompareRegions( if (left_region[0] == right_region[0] && left_region[1] == right_region[1]) { return 0; } - const uint32_t left = packLocale(requested_language, left_region); - const uint32_t right = packLocale(requested_language, right_region); + uint32_t left = packLocale(requested_language, left_region); + uint32_t right = packLocale(requested_language, right_region); const uint32_t request = packLocale(requested_language, requested_region); + // If one and only one of the two locales is a special Spanish locale, we + // replace it with es-419. We don't do the replacement if the other locale + // is already es-419, or both locales are special Spanish locales (when + // es-US is being compared to es-MX). + const bool leftIsSpecialSpanish = isSpecialSpanish(left); + const bool rightIsSpecialSpanish = isSpecialSpanish(right); + if (leftIsSpecialSpanish && !rightIsSpecialSpanish && right != LATIN_AMERICAN_SPANISH) { + left = LATIN_AMERICAN_SPANISH; + } else if (rightIsSpecialSpanish && !leftIsSpecialSpanish && left != LATIN_AMERICAN_SPANISH) { + right = LATIN_AMERICAN_SPANISH; + } + uint32_t request_ancestors[MAX_PARENT_DEPTH+1]; ssize_t left_right_index; // Find the parents of the request, but stop as soon as we saw left or right - const uint32_t left_and_right[] = {left, right}; + const std::array left_and_right = {{left, right}}; const size_t ancestor_count = findAncestors( request_ancestors, &left_right_index, request, requested_script, - left_and_right, sizeof(left_and_right)/sizeof(left_and_right[0])); + left_and_right.data(), left_and_right.size()); if (left_right_index == 0) { // We saw left earlier return 1; } diff --git a/libs/androidfw/tests/ConfigLocale_test.cpp b/libs/androidfw/tests/ConfigLocale_test.cpp index 2bf9b12b6ce5..10f4d46058ec 100644 --- a/libs/androidfw/tests/ConfigLocale_test.cpp +++ b/libs/androidfw/tests/ConfigLocale_test.cpp @@ -469,16 +469,81 @@ TEST(ConfigLocaleTest, isLocaleBetterThan_regionComparison) { EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); + fillIn("es", "AR", NULL, NULL, &request); + fillIn("es", "US", NULL, NULL, &config1); + fillIn("es", NULL, NULL, NULL, &config2); + // Special case for Latin American Spanish: es-MX and es-US are + // pseudo-parents of all Latin Ameircan Spanish locales. + EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); + EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); + + fillIn("es", "MX", NULL, NULL, &request); + fillIn("es", "US", NULL, NULL, &config1); + fillIn("es", NULL, NULL, NULL, &config2); + // Special case for Latin American Spanish: es-MX and es-US are + // pseudo-parents of all Latin Ameircan Spanish locales. + EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); + EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); + + fillIn("es", "AR", NULL, NULL, &request); + fillIn("es", "MX", NULL, NULL, &config1); + fillIn("es", NULL, NULL, NULL, &config2); + // Special case for Latin American Spanish: es-MX and es-US are + // pseudo-parents of all Latin Ameircan Spanish locales. + EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); + EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); + + fillIn("es", "US", NULL, NULL, &request); + fillIn("es", "MX", NULL, NULL, &config1); + fillIn("es", NULL, NULL, NULL, &config2); + // Special case for Latin American Spanish: es-MX and es-US are + // pseudo-parents of all Latin Ameircan Spanish locales. + EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); + EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); + + fillIn("es", "AR", NULL, NULL, &request); + fillIn("es", "419", NULL, NULL, &config1); + fillIn("es", "MX", NULL, NULL, &config2); + // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan + // Spanish locales, es-419 is a closer parent. + EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); + EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); + + fillIn("es", "US", NULL, NULL, &request); + fillIn("es", "419", NULL, NULL, &config1); + fillIn("es", "MX", NULL, NULL, &config2); + // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan + // Spanish locales, es-419 is a closer parent. + EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); + EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); + + fillIn("es", "MX", NULL, NULL, &request); + fillIn("es", "419", NULL, NULL, &config1); + fillIn("es", "US", NULL, NULL, &config2); + // Even though es-MX and es-US are pseudo-parents of all Latin Ameircan + // Spanish locales, es-419 is a closer parent. + EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); + EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); + fillIn("es", "AR", NULL, NULL, &request); fillIn("es", "MX", NULL, NULL, &config1); fillIn("es", "BO", NULL, NULL, &config2); - // A representative locale is better if they are equidistant. + // Special case for Latin American Spanish: es-MX and es-US are + // pseudo-parents of all Latin Ameircan Spanish locales. EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); fillIn("es", "AR", NULL, NULL, &request); fillIn("es", "US", NULL, NULL, &config1); fillIn("es", "BO", NULL, NULL, &config2); + // Special case for Latin American Spanish: es-MX and es-US are + // pseudo-parents of all Latin Ameircan Spanish locales. + EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); + EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); + + fillIn("es", "IC", NULL, NULL, &request); + fillIn("es", "ES", NULL, NULL, &config1); + fillIn("es", "GQ", NULL, NULL, &config2); // A representative locale is better if they are equidistant. EXPECT_TRUE(config1.isLocaleBetterThan(config2, &request)); EXPECT_FALSE(config2.isLocaleBetterThan(config1, &request)); diff --git a/libs/hwui/Interpolator.cpp b/libs/hwui/Interpolator.cpp index cc47f0052b73..bddb01b97865 100644 --- a/libs/hwui/Interpolator.cpp +++ b/libs/hwui/Interpolator.cpp @@ -97,7 +97,8 @@ LUTInterpolator::~LUTInterpolator() { } float LUTInterpolator::interpolate(float input) { - float lutpos = input * mSize; + // lut position should only be at the end of the table when input is 1f. + float lutpos = input * (mSize - 1); if (lutpos >= (mSize - 1)) { return mValues[mSize - 1]; } diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index aeee66106fb3..223605fa34ed 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -576,7 +576,7 @@ bool Tree::allocateBitmapIfNeeded(SkBitmap* outCache, int width, int height) { } bool Tree::canReuseBitmap(const SkBitmap& bitmap, int width, int height) { - return width == bitmap.width() && height == bitmap.height(); + return width <= bitmap.width() && height <= bitmap.height(); } void Tree::onPropertyChanged(TreeProperties* prop) { diff --git a/libs/hwui/VectorDrawable.h b/libs/hwui/VectorDrawable.h index a0c3d9db8ae1..54cd06504920 100644 --- a/libs/hwui/VectorDrawable.h +++ b/libs/hwui/VectorDrawable.h @@ -622,10 +622,15 @@ class ANDROID_API Tree : public VirtualLightRefBase { } void setScaledSize(int width, int height) { - if (mNonAnimatableProperties.scaledWidth != width - || mNonAnimatableProperties.scaledHeight != height) { - mNonAnimatableProperties.scaledWidth = width; - mNonAnimatableProperties.scaledHeight = height; + // If the requested size is bigger than what the bitmap was, then + // we increase the bitmap size to match. The width and height + // are bound by MAX_CACHED_BITMAP_SIZE. + if (mNonAnimatableProperties.scaledWidth < width + || mNonAnimatableProperties.scaledHeight < height) { + mNonAnimatableProperties.scaledWidth = std::max(width, + mNonAnimatableProperties.scaledWidth); + mNonAnimatableProperties.scaledHeight = std::max(height, + mNonAnimatableProperties.scaledHeight); mNonAnimatablePropertiesDirty = true; mTree->onPropertyChanged(this); } diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 203eefefdedd..f9af9228cb40 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -3954,7 +3954,9 @@ private static boolean checkTypes(AudioDevicePort port) { * currently connected to the system and meeting the criteria specified in the * flags parameter. * @param flags A set of bitflags specifying the criteria to test. - * @see {@link GET_DEVICES_OUTPUTS}, {@link GET_DEVICES_INPUTS} and {@link GET_DEVICES_ALL}. + * @see #GET_DEVICES_OUTPUTS + * @see #GET_DEVICES_INPUTS + * @see #GET_DEVICES_ALL * @return A (possibly zero-length) array of AudioDeviceInfo objects. */ public AudioDeviceInfo[] getDevices(int flags) { @@ -4025,7 +4027,9 @@ private static AudioDeviceInfo[] calcListDeltas( * parameter. * This is an internal function. The public API front is getDevices(int). * @param flags A set of bitflags specifying the criteria to test. - * @see {@link GET_DEVICES_OUTPUTS}, {@link GET_DEVICES_INPUTS} and {@link GET_DEVICES_ALL}. + * @see #GET_DEVICES_OUTPUTS + * @see #GET_DEVICES_INPUTS + * @see #GET_DEVICES_ALL * @return A (possibly zero-length) array of AudioDeviceInfo objects. * @hide */ @@ -4071,7 +4075,7 @@ public void registerAudioDeviceCallback(AudioDeviceCallback callback, * Unregisters an {@link AudioDeviceCallback} object which has been previously registered * to receive notifications of changes to the set of connected audio devices. * @param callback The {@link AudioDeviceCallback} object that was previously registered - * with {@link AudioManager#registerAudioDeviceCallback) to be unregistered. + * with {@link AudioManager#registerAudioDeviceCallback} to be unregistered. */ public void unregisterAudioDeviceCallback(AudioDeviceCallback callback) { synchronized (mDeviceCallbacks) { diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 47cbd7d7aefb..c5a16c03e13f 100755 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -874,7 +874,7 @@ public void prepare() throws IllegalStateException, IOException * not start another recording session during recording. * * @throws IllegalStateException if it is called before - * prepare(). + * prepare() or when the camera is already in use by another app. */ public native void start() throws IllegalStateException; diff --git a/media/java/android/media/MediaSyncEvent.java b/media/java/android/media/MediaSyncEvent.java index 31af6b512b31..04448f04ef5c 100644 --- a/media/java/android/media/MediaSyncEvent.java +++ b/media/java/android/media/MediaSyncEvent.java @@ -36,7 +36,7 @@ public class MediaSyncEvent { * The corresponding action is triggered only when the presentation is completed * (meaning the media has been presented to the user) on the specified session. * A synchronization of this type requires a source audio session ID to be set via - * {@link #setAudioSessionId(int) method. + * {@link #setAudioSessionId(int)} method. */ public static final int SYNC_EVENT_PRESENTATION_COMPLETE = AudioSystem.SYNC_EVENT_PRESENTATION_COMPLETE; diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java index 79412d43af45..00bdc69b5759 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -368,6 +368,7 @@ public void stop() { private void destroyLocalPlayer() { if (mLocalPlayer != null) { + mLocalPlayer.setOnCompletionListener(null); mLocalPlayer.reset(); mLocalPlayer.release(); mLocalPlayer = null; @@ -464,8 +465,8 @@ protected void finalize() { } class MyOnCompletionListener implements MediaPlayer.OnCompletionListener { - public void onCompletion(MediaPlayer mp) - { + @Override + public void onCompletion(MediaPlayer mp) { synchronized (sActiveRingtones) { sActiveRingtones.remove(Ringtone.this); } diff --git a/media/java/android/media/audiopolicy/AudioMixingRule.java b/media/java/android/media/audiopolicy/AudioMixingRule.java index e197141e0214..5f12742128bf 100644 --- a/media/java/android/media/audiopolicy/AudioMixingRule.java +++ b/media/java/android/media/audiopolicy/AudioMixingRule.java @@ -224,7 +224,7 @@ public Builder() { * {@link AudioMixingRule#RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET}. * @return the same Builder instance. * @throws IllegalArgumentException - * @see {@link #excludeRule(AudioAttributes, int)} + * @see #excludeRule(AudioAttributes, int) */ @SystemApi public Builder addRule(AudioAttributes attrToMatch, int rule) @@ -253,7 +253,7 @@ public Builder addRule(AudioAttributes attrToMatch, int rule) * {@link AudioMixingRule#RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET}. * @return the same Builder instance. * @throws IllegalArgumentException - * @see {@link #addRule(AudioAttributes, int)} + * @see #addRule(AudioAttributes, int) */ @SystemApi public Builder excludeRule(AudioAttributes attrToMatch, int rule) @@ -275,7 +275,7 @@ public Builder excludeRule(AudioAttributes attrToMatch, int rule) * {@link AudioAttributes} or an {@link java.lang.Integer}). * @return the same Builder instance. * @throws IllegalArgumentException - * @see {@link #excludeMixRule(int, Object)} + * @see #excludeMixRule(int, Object) */ @SystemApi public Builder addMixRule(int rule, Object property) throws IllegalArgumentException { diff --git a/media/mca/effect/java/android/media/effect/package.html b/media/mca/effect/java/android/media/effect/package.html index 8a210fd89f03..1d297ef8dd62 100644 --- a/media/mca/effect/java/android/media/effect/package.html +++ b/media/mca/effect/java/android/media/effect/package.html @@ -24,7 +24,7 @@ android.media.effect.EffectContext#getFactory EffectContext.getFactory()}, which returns an instance of {@link android.media.effect.EffectFactory}.
  • Call {@link android.media.effect.EffectFactory#createEffect createEffect()}, passing it an -effect name from @link android.media.effect.EffectFactory}, such as {@link +effect name from {@link android.media.effect.EffectFactory}, such as {@link android.media.effect.EffectFactory#EFFECT_FISHEYE} or {@link android.media.effect.EffectFactory#EFFECT_VIGNETTE}.
  • diff --git a/opengl/java/android/opengl/GLU.java b/opengl/java/android/opengl/GLU.java index ed6455689e44..ef9bf16747a4 100644 --- a/opengl/java/android/opengl/GLU.java +++ b/opengl/java/android/opengl/GLU.java @@ -203,8 +203,8 @@ public static int gluProject(float objX, float objY, float objZ, * @param view the current view, {x, y, width, height} * @param viewOffset the offset into the view array where the view vector * data starts. - * @param obj the output vector {objX, objY, objZ}, that returns the - * computed object coordinates. + * @param obj the output vector {objX, objY, objZ, objW}, that returns the + * computed homogeneous object coordinates. * @param objOffset the offset into the obj array where the obj vector data * starts. * @return A return value of GL10.GL_TRUE indicates success, a return value 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 @@ "একটি সংযুক্ত ডেস্কটপ কম্পিউটার থেকে সমস্ত ডেটার সম্পূর্ণ ব্যাকআপ নেওয়ার অনুরোধ করা হয়েছে৷ আপনি কি এটি করার অনুমতি দিতে চান?\n\nযদি আপনি নিজের থেকে এই ব্যাকআপ নেওয়ার অনুরোধ না করে থাকেন, তবে এই প্রক্রিয়াটিতে অনুমতি প্রদান করবেন না৷ এটি বর্তমানে ডিভাইসটিতে থাকা সমস্ত ডেটাকে প্রতিস্থাপন করবে!" "আমার ডেটা পুনরুদ্ধার করুন" "পুনরুদ্ধার করবেন না" - "দয়া করে নীচে আপনার বর্তমান ব্যাকআপের পাসওয়ার্ড দিন:" - "দয়া করে নীচে আপনার ডিভাইসের এনক্রিপশান পাসওয়ার্ড লিখুন৷" - "দয়া করে নীচে আপানার ডিভাইসের এনক্রিপশান পাসওয়ার্ড লিখুন৷ এছাড়াও ব্যাকআপ সংরক্ষণাগার এনক্রিপ্ট করতে এটি ব্যবহার করা হবে৷" + "দয়া করে নিচে আপনার বর্তমান ব্যাকআপের পাসওয়ার্ড দিন:" + "দয়া করে নিচে আপনার ডিভাইসের এনক্রিপশান পাসওয়ার্ড লিখুন৷" + "দয়া করে নিচে আপানার ডিভাইসের এনক্রিপশান পাসওয়ার্ড লিখুন৷ এছাড়াও ব্যাকআপ সংরক্ষণাগার এনক্রিপ্ট করতে এটি ব্যবহার করা হবে৷" "সম্পূর্ণ ব্যাকআপ ডেটা এনক্রিপ্ট করতে দয়া করে একটি পাসওয়ার্ড লিখুন৷ যদি এটি খালি রেখে দেওয়া হয় তবে আপনার বর্তমান ব্যাকআপ পাসওয়ার্ডটি ব্যবহার করা হবে:" - "আপনি যদি সম্পূর্ণ ব্যাকআপ ডেটা এনক্রিপ্ট করতে চান তাহলে নীচে একটি পাসওয়ার্ড লিখুন:" - "আপনার ডিভাইস এনক্রিপ্ট হয়ে থাকার কারণে আপনার ব্যাকআপকে এনক্রিপ্ট করতে হবে। দয়া করে নীচে একটি পাসওয়ার্ড দিন:" - "যদি পুনরুদ্ধার করা ডেটা এনক্রিপ্ট করা থাকে, তবে দয়া করে নীচে পাসওয়ার্ডটি লিখুন:" + "আপনি যদি সম্পূর্ণ ব্যাকআপ ডেটা এনক্রিপ্ট করতে চান তাহলে নিচে একটি পাসওয়ার্ড লিখুন:" + "আপনার ডিভাইস এনক্রিপ্ট হয়ে থাকার কারণে আপনার ব্যাকআপকে এনক্রিপ্ট করতে হবে। দয়া করে নিচে একটি পাসওয়ার্ড দিন:" + "যদি পুনরুদ্ধার করা ডেটা এনক্রিপ্ট করা থাকে, তবে দয়া করে নিচে পাসওয়ার্ডটি লিখুন:" "ব্যাকআপ নেওয়া শুরু হয়েছে..." "ব্যাকআপ নেওয়া সম্পূর্ণ হয়েছে" "পুনরুদ্ধার করা শুরু হচ্ছে..." diff --git a/packages/BackupRestoreConfirmation/res/values-it/strings.xml b/packages/BackupRestoreConfirmation/res/values-it/strings.xml index b84edbc65ddc..1cbb770583a8 100644 --- a/packages/BackupRestoreConfirmation/res/values-it/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-it/strings.xml @@ -30,7 +30,7 @@ "Inserisci una password da utilizzare per la crittografia dei dati di backup completi. Se non ne inserisci una, verrà utilizzata la tua password di backup corrente:" "Se desideri crittografare tutti i dati di backup, inserisci una password qui di seguito:" "Il dispositivo è criptato, quindi devi criptare il backup. Inserisci una password di seguito:" - "Se i dati di ripristino sono crittografati, inserisci la password qui di seguito:" + "Se i dati di ripristino sono criptati, inserisci la password qui di seguito:" "Avvio del backup..." "Backup terminato" "Avvio del ripristino..." diff --git a/packages/BackupRestoreConfirmation/res/values-si-rLK/strings.xml b/packages/BackupRestoreConfirmation/res/values-si-rLK/strings.xml index aaeaf04498f1..cbc130df9c9a 100644 --- a/packages/BackupRestoreConfirmation/res/values-si-rLK/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-si-rLK/strings.xml @@ -29,7 +29,7 @@ "කරුණාකර ඔබගේ උපාංගයේ සංකේතන මුරපදය පහත ඇතුලත් කරන්න. සංරක්ෂිත උපස්ථ සංකේතනය කිරීමට මෙය භාවිත කළ හැක." "කරුණාකර සියලු උපස්ථ දත්ත සංකේතනය කිරීම සඳහා භාවිතයට මුරපදයක් ඇතුළත් කරන්න. මෙය හිස්ව තැබුවොත්, ඔබගේ වර්තමාන උපස්ථ මුරපදය භාවිත වෙයි:" "සියලු උපස්ථ දත්ත සංකේතනය කිරීමට ඔබ අදහස් කරන්නේ නම්, මුරපදය පහලින් ඇතුලත් කරන්න:" - "ඔබගේ උපාංගය සංකේතනය කර තිබෙන නිසා, ඔබගේ උපස්ථය සංකේතනය ඔබට අවශ්‍ය වී තිබේ. කරුණාකර මුරපදය පහළින් එකතු කරන්න:" + "ඔබගේ උපාංගය සංකේතනය කර තිබෙන නිසා, ඔබගේ උපස්ථය සංකේතනය ඔබට අවශ්‍ය වී තිබේ. මුරපදය පහළින් එක් කරන්න:" "යළි පිහිටුවන දත්ත සංකේතනය කරන ලද ඒවානම්, කරුණාකර මුරපදය පහලින් ඇතුල් කරන්න:" "උපස්ථ කිරීම ආරම්භ කරමින්..." "උපස්ථය අවසන්" 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 @@ "Úplná záloha" "Úplné obnovenie" "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." - "Zálohovať dáta" + "Zálohovať moje dáta" "Nezálohovať" "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í." "Obnoviť údaje" diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index bb8eb2cd0797..23a8655a3bb6 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -55,12 +55,15 @@ import java.util.Random; public class CaptivePortalLoginActivity extends Activity { - private static final String TAG = "CaptivePortalLogin"; + private static final String TAG = CaptivePortalLoginActivity.class.getSimpleName(); + private static final boolean DBG = true; + private static final int SOCKET_TIMEOUT_MS = 10000; private enum Result { DISMISSED, UNWANTED, WANTED_AS_IS }; - private URL mURL; + private URL mUrl; + private String mUserAgent; private Network mNetwork; private CaptivePortal mCaptivePortal; private NetworkCallback mNetworkCallback; @@ -72,17 +75,20 @@ private enum Result { DISMISSED, UNWANTED, WANTED_AS_IS }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mCm = ConnectivityManager.from(this); - String url = getIntent().getStringExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_URL); - if (url == null) url = mCm.getCaptivePortalServerUrl(); - try { - mURL = new URL(url); - } catch (MalformedURLException e) { - // System misconfigured, bail out in a way that at least provides network access. - Log.e(TAG, "Invalid captive portal URL, url=" + url); - done(Result.WANTED_AS_IS); - } mNetwork = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_NETWORK); mCaptivePortal = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL); + mUserAgent = getIntent().getParcelableExtra( + ConnectivityManager.EXTRA_CAPTIVE_PORTAL_USER_AGENT); + mUrl = getUrl(); + if (mUrl == null) { + // getUrl() failed to parse the url provided in the intent: bail out in a way that + // at least provides network access. + done(Result.WANTED_AS_IS); + return; + } + if (DBG) { + Log.d(TAG, String.format("onCreate for %s", mUrl.toString())); + } // Also initializes proxy system properties. mCm.bindProcessToNetwork(mNetwork); @@ -149,6 +155,9 @@ private void setWebViewProxy() { } private void done(Result result) { + if (DBG) { + Log.d(TAG, String.format("Result %s for %s", result.name(), mUrl.toString())); + } if (mNetworkCallback != null) { mCm.unregisterNetworkCallback(mNetworkCallback); mNetworkCallback = null; @@ -185,22 +194,31 @@ public void onBackPressed() { @Override public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - if (id == R.id.action_use_network) { - done(Result.WANTED_AS_IS); - return true; + final Result result; + final String action; + final int id = item.getItemId(); + switch (id) { + case R.id.action_use_network: + result = Result.WANTED_AS_IS; + action = "USE_NETWORK"; + break; + case R.id.action_do_not_use_network: + result = Result.UNWANTED; + action = "DO_NOT_USE_NETWORK"; + break; + default: + return super.onOptionsItemSelected(item); } - if (id == R.id.action_do_not_use_network) { - done(Result.UNWANTED); - return true; + if (DBG) { + Log.d(TAG, String.format("onOptionsItemSelect %s for %s", action, mUrl.toString())); } - return super.onOptionsItemSelected(item); + done(result); + return true; } @Override public void onDestroy() { super.onDestroy(); - if (mNetworkCallback != null) { mCm.unregisterNetworkCallback(mNetworkCallback); mNetworkCallback = null; @@ -215,11 +233,29 @@ public void onDestroy() { } catch (InterruptedException e) { } } - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(mURL.toString()))); + final String url = mUrl.toString(); + if (DBG) { + Log.d(TAG, "starting activity with intent ACTION_VIEW for " + url); + } + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + } + } + + private URL getUrl() { + String url = getIntent().getStringExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_URL); + if (url == null) { + url = mCm.getCaptivePortalServerUrl(); + } + try { + return new URL(url); + } catch (MalformedURLException e) { + Log.e(TAG, "Invalid captive portal URL " + url); } + return null; } private void testForCaptivePortal() { + // TODO: reuse NetworkMonitor facilities for consistent captive portal detection. new Thread(new Runnable() { public void run() { // Give time for captive portal to open. @@ -230,11 +266,14 @@ public void run() { HttpURLConnection urlConnection = null; int httpResponseCode = 500; try { - urlConnection = (HttpURLConnection) mURL.openConnection(); + urlConnection = (HttpURLConnection) mNetwork.openConnection(mUrl); urlConnection.setInstanceFollowRedirects(false); urlConnection.setConnectTimeout(SOCKET_TIMEOUT_MS); urlConnection.setReadTimeout(SOCKET_TIMEOUT_MS); urlConnection.setUseCaches(false); + if (mUserAgent != null) { + urlConnection.setRequestProperty("User-Agent", mUserAgent); + } urlConnection.getInputStream(); httpResponseCode = urlConnection.getResponseCode(); } catch (IOException e) { @@ -292,7 +331,7 @@ public void onPageFinished(WebView view, String url) { // settings. Now prompt the WebView read the Network-specific proxy settings. setWebViewProxy(); // Load the real page. - view.loadUrl(mURL.toString()); + view.loadUrl(mUrl.toString()); return; } else if (mPagesLoaded == 2) { // Prevent going back to empty first page. diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml index a3edae35cc2b..053755719c47 100644 --- a/packages/DocumentsUI/AndroidManifest.xml +++ b/packages/DocumentsUI/AndroidManifest.xml @@ -11,13 +11,13 @@ + android:icon="@drawable/picker_icon"> @@ -45,7 +45,7 @@ @@ -56,7 +56,7 @@ diff --git a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml index 75b0d861ec1a..1c6a23d0117a 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 @@ "Kopiraj" "Premesti" "Odbaci" - "Pokušaj ponovo" + "Probaj ponovo" "Prema imenu" "Prema datumu izmene" "Prema veličini" @@ -119,7 +119,7 @@ "Neke datoteke su konvertovane" "Želite li da aplikaciji ^1 odobrite pristup direktorijumu ^2 na memorijskom prostoru ^3?" "Želite da dozvolite da ^1 pristupa direktorijumu ^2?" - "Želite da li da dozvolite da aplikacija ^1 pristupa podacima, uključujući slike i video snimke, na lokaciji ^2?" + "Želite da li da dozvolite da aplikacija ^1 pristupa podacima, uključujući slike i video, na lokaciji ^2?" "Ne pitaj ponovo" "Dozvoli" "Odbij" diff --git a/packages/DocumentsUI/res/values-bs-rBA/strings.xml b/packages/DocumentsUI/res/values-bs-rBA/strings.xml index 42c8e9e12cec..f49bbaa92962 100644 --- a/packages/DocumentsUI/res/values-bs-rBA/strings.xml +++ b/packages/DocumentsUI/res/values-bs-rBA/strings.xml @@ -23,7 +23,7 @@ "Nova fascikla" "Prikaz u vidu mreže" "Prikaz u vidu liste" - "Sortiraj po" + "Poredano po" "Traži" "Postavke pohrane" "Otvori" diff --git a/packages/DocumentsUI/res/values-eu-rES/strings.xml b/packages/DocumentsUI/res/values-eu-rES/strings.xml index e2214be0a846..042ead1e56e2 100644 --- a/packages/DocumentsUI/res/values-eu-rES/strings.xml +++ b/packages/DocumentsUI/res/values-eu-rES/strings.xml @@ -59,7 +59,7 @@ "Lasterbideak" "Gailuak" "Aplikazio gehiago" - "Ez dago elementurik" + "Ez dago ezer" "Ez da aurkitu ezer %1$s atalean" "Ezin da ireki fitxategia" "Ezin izan dira dokumentu batzuk ezabatu" 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 @@ "پنجره جدید" "کپی" "جای‌گذاری" - "نمایش فضای ذخیره‌سازی داخلی" - "پنهان کردن فضای ذخیره‌سازی داخلی" + "نمایش حافظه داخلی" + "پنهان کردن حافظه داخلی" "نمایش اندازه فایل" "پنهان کردن اندازه فایل" "انتخاب" @@ -112,7 +112,7 @@ "بعضی از فایل‌ها تبدیل شدند" "به ^1 اجازه داده شود به فهرست راهنمای ^2 در ^3 دسترسی داشته باشد؟" "به ^1 اجازه دسترسی به دایرکتوری ^2 داده شود؟" - "به ^1 اجازه می‌دهید به داده‌هایتان دسترسی پیدا کند، از جمله عکس‌ها و ویدیوهایتان در ^2؟" + "به ^1 اجازه می‌دهید به داده‌هایتان دسترسی پیدا کند، از جمله عکس‌ها و ویدئوهایتان در ^2؟" "دوباره سؤال نشود" "ارزیابی‌شده" "اجازه ندارد" diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml index fb9fed62ad07..bae677ce7f5c 100644 --- a/packages/DocumentsUI/res/values-in/strings.xml +++ b/packages/DocumentsUI/res/values-in/strings.xml @@ -17,7 +17,7 @@ "File" - "Unduhan" + "Download" "Buka dari" "Simpan ke" "Folder baru" 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 @@ "Жаңа қалта" "Торлы көрініс" "Тізім көрінісі" - "Белгіге қарай сұрыптау" + "Сұрыптау" "Іздеу" "Жад параметрлері" "Ашу" @@ -53,7 +53,7 @@ "Құжатты сақтау орындалмады" "Қалта жасақтау іске аспады" "Қазір мазмұнды жүктеу мүмкін емес" - "Жуықта қолданылған" + "Соңғы" "%1$s бос" "Жад қызметтері" "Төте пернелер" 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 @@ "ಗ್ರಿಡ್ ವೀಕ್ಷಣೆ" "ಪಟ್ಟಿ ವೀಕ್ಷಣೆ" "ಈ ಪ್ರಕಾರ ವಿಂಗಡಿಸು" - "ಹುಡುಕು" + "ಹುಡುಕಿ" "ಸಂಗ್ರಹಣೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ತೆರೆ" "ಉಳಿಸು" 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 @@ %1$d item "%1$s verwijderen?" - "Map %1$s en de bijbehorende inhoud verwijderen?" + "Map %1$s en de bijbehorende content verwijderen?" %1$d bestanden verwijderen? %1$d bestand verwijderen? - %1$d mappen en de bijbehorende inhoud verwijderen? - %1$d map en de bijbehorende inhoud verwijderen? + %1$d mappen en de bijbehorende content verwijderen? + %1$d map en de bijbehorende content verwijderen? %1$d items verwijderen? diff --git a/packages/DocumentsUI/res/values-pa-rIN/strings.xml b/packages/DocumentsUI/res/values-pa-rIN/strings.xml index 178e3b4fd709..9b1a7b3fd4c9 100644 --- a/packages/DocumentsUI/res/values-pa-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-pa-rIN/strings.xml @@ -112,7 +112,7 @@ "ਕੁਝ ਫ਼ਾਈਲਾਂ ਤਬਦੀਲ ਕੀਤੀਆਂ ਗਈਆਂ ਸਨ" "ਕੀ ^1 ਨੂੰ ^3 \'ਤੇ ^2 ਡਾਇਰੈਕਟਰੀ \'ਤੇ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?" "ਕੀ ^1 ਨੂੰ ^2 ਡਾਇਰੈਕਟਰੀ \'ਤੇ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?" - "ਕੀ ^1 ਨੂੰ ^2 \'ਤੇ ਫੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਸਮੇਤ, ਤੁਹਾਡੇ ਡੈਟੇ \'ਤੇ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?" + "ਕੀ ^1 ਨੂੰ ^2 \'ਤੇ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਸਮੇਤ, ਤੁਹਾਡੇ ਡੈਟੇ \'ਤੇ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?" "ਦੁਬਾਰਾ ਨਾ ਪੁੱਛੋ" "ਆਗਿਆ ਦਿਓ" "ਅਸਵੀਕਾਰ ਕਰੋ" diff --git a/packages/DocumentsUI/res/values-si-rLK/strings.xml b/packages/DocumentsUI/res/values-si-rLK/strings.xml index d43f5f3544eb..d06abedafe5c 100644 --- a/packages/DocumentsUI/res/values-si-rLK/strings.xml +++ b/packages/DocumentsUI/res/values-si-rLK/strings.xml @@ -54,13 +54,13 @@ "ෆෝල්ඩරය සැදීම අසාර්ථක විය" "මේ මොහොතේ අන්තර්ගතය පූරණය කිරීමට නොහැකිය" "මෑත" - "%1$s ඉතිරියි" + "%1$s නිදහස්" "ආචයන සේවා" "කෙටිමං" "උපාංග" "තවත් යෙදුම්" "අයිතම නැත" - "%1$s හි තරඟ නැත" + "%1$s හි ගැළපුම් නැත" "ගොනුව විවෘත කළ නොහැකිය" "සමහර ලේඛන මැකීමට නොහැකි විය" "හරහා බෙදාගන්න" diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index 393573985ab4..e9dd8c2eec7a 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -44,7 +44,7 @@ "Копирај" "Премести" "Одбаци" - "Покушај поново" + "Пробај поново" "Према имену" "Према датуму измене" "Према величини" @@ -119,7 +119,7 @@ "Неке датотеке су конвертоване" "Желите ли да апликацији ^1 одобрите приступ директоријуму ^2 на меморијском простору ^3?" "Желите да дозволите да ^1 приступа директоријуму ^2?" - "Желите да ли да дозволите да апликација ^1 приступа подацима, укључујући слике и видео снимке, на локацији ^2?" + "Желите да ли да дозволите да апликација ^1 приступа подацима, укључујући слике и видео, на локацији ^2?" "Не питај поново" "Дозволи" "Одбиј" 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 @@ "Välj" "Kopiera" "Flytta" - "Ta bort permanent" + "Avvisa" "Försök igen" "Efter namn" "Efter ändringsdatum" 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 @@ %1$d dosya silinemedi %1$d dosya silinemedi - "Ayrıntıları görmek için hafifçe dokunun" + "Ayrıntıları görmek için dokunun" "Kapat" "Şu dosyalar kopyalanamadı: %1$s" "Şu dosyalar taşınamadı: %1$s" 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 @@ "^1 ilovasiga ^2 xotirasidagi ma’lumotlardan, jumladan, rasmlar va videolardan foydalanishiga ruxsat berilsinmi?" "Boshqa so‘ralmasin" "Ruxsat berish" - "Rad qilish" + "Rad etish" %1$d ta belgilandi %1$d ta belgilandi diff --git a/packages/DocumentsUI/res/values/drawables.xml b/packages/DocumentsUI/res/values/drawables.xml new file mode 100644 index 000000000000..1c720e0b28e0 --- /dev/null +++ b/packages/DocumentsUI/res/values/drawables.xml @@ -0,0 +1,22 @@ + + + + + @mipmap/ic_app_icon + @mipmap/ic_launcher_downloads + @mipmap/ic_launcher_downloads + + diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java index 46e7fe0b3053..a04a930d48e7 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java @@ -387,6 +387,12 @@ public final void refreshCurrentRootAndDirectory(int anim) { } mNavigator.update(); + // Causes talkback to announce the activity's new title + if (mState.stack.isRecents()) { + setTitle(mRoots.getRecentsRoot().title); + } else { + setTitle(mState.stack.getTitle()); + } invalidateOptionsMenu(); } @@ -612,13 +618,23 @@ public void onBackPressed() { return; } - if (popDir()) { + if (!mState.hasLocationChanged()) { + super.onBackPressed(); + return; + } + + if (onBeforePopDir() || popDir()) { return; } super.onBackPressed(); } + boolean onBeforePopDir() { + // Files app overrides this with some fancy logic. + return false; + } + public void onStackPicked(DocumentStack stack) { try { // Update the restored stack to ensure we have freshest data diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java index 3b1ca77b680a..233380e70a0d 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java @@ -60,6 +60,12 @@ public class FilesActivity extends BaseActivity { public static final String TAG = "FilesActivity"; + // See comments where this const is referenced for details. + private static final int DRAWER_NO_FIDDLE_DELAY = 1500; + + // Track the time we opened the drawer in response to back being pressed. + // We use the time gap to figure out whether to close app or reopen the drawer. + private long mDrawerLastFiddled; private DocumentClipper mClipper; public FilesActivity() { @@ -186,7 +192,7 @@ public String getDrawerTitle() { Intent intent = getIntent(); return (intent != null && intent.hasExtra(Intent.EXTRA_TITLE)) ? intent.getStringExtra(Intent.EXTRA_TITLE) - : getTitle().toString(); + : getString(R.string.downloads_label); } @Override @@ -389,6 +395,34 @@ public boolean onKeyShortcut(int keyCode, KeyEvent event) { } } + // Do some "do what a I want" drawer fiddling, but don't + // do it if user already hit back recently and we recently + // did some fiddling. + @Override + boolean onBeforePopDir() { + int size = mState.stack.size(); + + if (mDrawer.isPresent() + && (System.currentTimeMillis() - mDrawerLastFiddled) > DRAWER_NO_FIDDLE_DELAY) { + // Close drawer if it is open. + if (mDrawer.isOpen()) { + mDrawer.setOpen(false); + mDrawerLastFiddled = System.currentTimeMillis(); + return true; + } + + // Open the Close drawer if it is closed and we're at the top of a root. + if (size <= 1) { + mDrawer.setOpen(true); + // Remember so we don't just close it again if back is pressed again. + mDrawerLastFiddled = System.currentTimeMillis(); + return true; + } + } + + return false; + } + // Turns out only DocumentsActivity was ever calling saveStackBlocking. // There may be a case where we want to contribute entries from // Behavior here in FilesActivity, but it isn't yet obvious. diff --git a/packages/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 @@ "Pogrešan šablon" "Pogrešna lozinka" "Pogrešan PIN" - "Pokušajte ponovo za %d sekunde(i)." + "Probajte ponovo za %d sekunde(i)." "Nacrtajte šablon" "Unesite PIN SIM kartice" "Unesite PIN za SIM „%1$s“" @@ -72,9 +72,9 @@ "Ponovo unesite ispravni PUK kôd. Ponovljeni pokušaji će trajno onemogućiti SIM." "PIN kodovi se ne podudaraju" "Previše pokušaja unosa šablona" - "Uneli ste netačni PIN %1$d puta. \n\nPokušajte ponovo za %2$d sekunde(i)." - "Uneli ste netačnu lozinku %1$d puta. \n\nPokušajte ponovo za %2$d sekunde(i)." - "Nacrtali ste šablon za otključavanje netačno %1$d puta. \n\nPokušajte ponovo za %2$d sekunde(i)." + "Uneli ste netačni PIN %1$d puta. \n\nProbajte ponovo za %2$d sekunde(i)." + "Uneli ste netačnu lozinku %1$d puta. \n\nProbajte ponovo za %2$d sekunde(i)." + "Nacrtali ste šablon za otključavanje netačno %1$d puta. \n\nProbajte ponovo za %2$d sekunde(i)." "Pogrešno ste pokušali da otključate tablet %1$d put(a). Imate još %2$d pokušaj(a), nakon čega se tablet resetuje i svi podaci sa njega brišu." "Pogrešno ste pokušali da otključate telefon %1$d put(a). Imate još %2$d pokušaj(a), nakon čega se telefon resetuje i svi podaci sa njega brišu." "Pogrešno ste pokušali da otključate tablet %d put(a). Tablet će biti resetovan i svi podaci sa njega će biti izbrisani." @@ -87,8 +87,8 @@ "Pogrešno ste pokušali da otključate telefon %1$d put(a). Imate još %2$d pokušaj(a), nakon čega se poslovni profil uklanja i svi podaci sa profila brišu." "Pogrešno ste pokušali da otključate tablet %d put(a). Poslovni profil će biti uklonjen i svi podaci sa njega će biti izbrisani." "Pogrešno ste pokušali da otključate telefon %d put(a). Poslovni profil će biti uklonjen i svi podaci sa njega će biti izbrisani." - "Nacrtali ste šablon za otključavanje netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću naloga e-pošte.\n\nPokušajte ponovo za %3$d sekunde(i)." - "Nacrtali ste šablon za otključavanje netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću naloga e-pošte.\n\nPokušajte ponovo za %3$d sekunde(i)." + "Nacrtali ste šablon za otključavanje netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću naloga e-pošte.\n\nProbajte ponovo za %3$d sekunde(i)." + "Nacrtali ste šablon za otključavanje netačno %1$d puta. Posle još %2$d neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću naloga e-pošte.\n\nProbajte ponovo za %3$d sekunde(i)." "Netačan SIM PIN kôd. Sada morate da kontaktirate mobilnog operatera da biste otključali uređaj." Netačan SIM PIN kôd. Imate još %d pokušaj. diff --git a/packages/Keyguard/res/values-bn-rBD/strings.xml b/packages/Keyguard/res/values-bn-rBD/strings.xml index 1a2a8dde99c1..64c01bb356e7 100644 --- a/packages/Keyguard/res/values-bn-rBD/strings.xml +++ b/packages/Keyguard/res/values-bn-rBD/strings.xml @@ -47,8 +47,8 @@ "সিম কার্ডটি PUK কোড দিয়ে লক করা আছে৷" "সিম কার্ড আনলক করা হচ্ছে…" "পিন অঞ্চল" - "SIM পিন অঞ্চল" - "SIM PUK অঞ্চল" + "সিম পিন অঞ্চল" + "সিম PUK অঞ্চল" "%1$s এ পরবর্তী অ্যালার্ম সেট করা হয়েছে" "মুছুন" "Enter" @@ -59,11 +59,11 @@ "%d সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷" "আপনার প্যাটার্ন আঁকুন" "সিম পিন লিখুন" - "\"%1$s\" এর জন্য SIM পিন লিখুন" + "\"%1$s\" এর জন্য সিম পিন লিখুন" "পিন লিখুন" "পাসওয়ার্ড লিখুন" "সিম এখন অক্ষম করা হয়েছে৷ অবিরত থাকতে PUK কোডটি লিখুন৷ বিশদ বিবরণের জন্য ক্যারিয়ারের সাথে যোগাযোগ করুন৷" - "SIM \"%1$s\" এখন অক্ষম করা হয়েছে৷ চালিয়ে যেতে PUK কোড লিখুন৷ বিস্তারিত জানার জন্য ক্যারিয়ারের সাথে যোগাযোগ করুন৷" + "সিম \"%1$s\" এখন অক্ষম করা হয়েছে৷ চালিয়ে যেতে PUK কোড লিখুন৷ বিস্তারিত জানার জন্য ক্যারিয়ারের সাথে যোগাযোগ করুন৷" "কাঙ্ক্ষিত পিন কোড লিখুন" "কাঙ্ক্ষিত পিন কোড নিশ্চিত করুন" "সিম কার্ড আনলক করা হচ্ছে…" @@ -91,13 +91,13 @@ "আপনি আপনার আনলকের প্যাটার্ন আঁকার ক্ষেত্রে %1$d বার ভুল করেছেন৷ আর %2$d বার অসফল প্রচেষ্টা করা হলে আপনাকে একটি ইমেল অ্যাকাউন্ট মারফত আপনার ফোন আনলক করতে বলা হবে৷\n\n %3$d সেকেন্ডের মধ্যে আবার চেষ্টা করুন৷" "ভুল সিম পিন কোড, আপনার ডিভাইসটি আনলক করতে এখন আপনাকে অবশ্যই আপনার ক্যারিয়ারের সাথে যোগাযোগ করতে হবে৷" - ভুল SIM পিন কোড, আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে৷ - ভুল SIM পিন কোড, আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে৷ + ভুল সিম পিন কোড, আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে৷ + ভুল সিম পিন কোড, আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে৷ "SIMটি ব্যবহারের অযোগ্য৷ আপনার ক্যারিয়ারের সাথে যোগাযোগ করুন৷" - ভুল SIM PUK কোড, আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে এটির পরেই আপনার SIM স্থায়ীভাবে অব্যবহারযোগ্য হবে৷ - ভুল SIM PUK কোড, আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে এটির পরেই আপনার SIM স্থায়ীভাবে অব্যবহারযোগ্য হবে৷ + ভুল সিম PUK কোড, আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে এটির পরেই আপনার সিম স্থায়ীভাবে অব্যবহারযোগ্য হবে৷ + ভুল সিম PUK কোড, আপনার কাছে আর %dটি প্রচেষ্টা বাকি রয়েছে এটির পরেই আপনার সিম স্থায়ীভাবে অব্যবহারযোগ্য হবে৷ "সিম পিন ক্রিয়াকলাপটি ব্যর্থ হয়েছে!" "সিম PUK ক্রিয়াকলাপটি ব্যর্থ হয়েছে!" diff --git a/packages/Keyguard/res/values-da/strings.xml b/packages/Keyguard/res/values-da/strings.xml index ebea6eeb1989..0fb741684e0c 100644 --- a/packages/Keyguard/res/values-da/strings.xml +++ b/packages/Keyguard/res/values-da/strings.xml @@ -58,7 +58,7 @@ "Forkert pinkode" "Prøv igen om %d sekunder." "Tegn dit mønster" - "Indtast pinkode til SIM" + "Indtast pinkode til SIM-kort" "Indtast SIM-pinkoden for \"%1$s\"" "Indtast pinkode" "Angiv adgangskode" @@ -105,13 +105,13 @@ "Ingen dækning." "Skift indtastningsmetode" "Flytilstand" - "Du skal indtaste et mønster efter genstart af enheden" + "Du skal angive et mønster efter genstart af enheden" "Der skal indtaste en pinkode efter genstart af enheden" "Du skal indtaste en adgangskode efter genstart af enheden" "Der kræves et mønster som ekstra beskyttelse" "Der kræves en pinkode som ekstra beskyttelse" "Der kræves en adgangskode som ekstra beskyttelse" - "Du skal indtaste et mønster, når du skifter profil" + "Du skal angive et mønster, når du skifter profil" "Du skal indtaste en pinkode, når du skifter profil" "Du skal indtaste en adgangskode, når du skifter profil" "Enhedsadministratoren har låst enheden" @@ -128,5 +128,5 @@ Enheden blev sidst låst op for %d timer siden. Bekræft adgangskoden. Enheden blev sidst låst op for %d timer siden. Bekræft adgangskoden. - "Kan ikke genkendes" + "Ikke genkendt" diff --git a/packages/Keyguard/res/values-hy-rAM/strings.xml b/packages/Keyguard/res/values-hy-rAM/strings.xml index 4aacf8fb927a..ae92f6b4b84e 100644 --- a/packages/Keyguard/res/values-hy-rAM/strings.xml +++ b/packages/Keyguard/res/values-hy-rAM/strings.xml @@ -79,10 +79,10 @@ "Դուք կատարել եք հեռախոսն ապակողպելու %1$d անհաջող փորձ: Եվս %2$d անհաջող փորձից հետո այս հեռախոսը կվերակայվի և բոլոր տվյալները կջնջվեն:" "Դուք կատարել եք գրասալիկն ապակողպելու %d անհաջող փորձ: Այս պլանշետը կվերակայվի և բոլոր տվյալները կջնջվեն:" "Դուք կատարել եք հեռախոսն ապակողպելու %d անհաջող փորձ: Այս հեռախոսը կվերակայվի և բոլոր տվյալները կջնջվեն:" - "Դուք կատարել եք գրասալիկն ապակողպելու %1$d անհաջող փորձ: Եվս %2$d անհաջող փորձից հետո այս օգտվողը կհեռացվի և օգտվողի բոլոր տվյալները կջնջվեն:" - "Դուք կատարել եք հեռախոսն ապակողպելու %1$d անհաջող փորձ: Եվս %2$d անհաջող փորձից հետո այս օգտվողը կհեռացվի և օգտվողի բոլոր տվյալները կջնջվեն:" - "Դուք կատարել եք գրասալիկն ապակողպելու %d անհաջող փորձ: Օգտվողը կհեռացվի և օգտվողի բոլոր տվյալները կջնջվեն:" - "Դուք կատարել եք հեռախոսն ապակողպելու %d անհաջող փորձ: Օգտվողը կհեռացվի և օգտվողի բոլոր տվյալները կջնջվեն:" + "Դուք կատարել եք գրասալիկն ապակողպելու %1$d անհաջող փորձ: Եվս %2$d անհաջող փորձից հետո այս օգտատերը կհեռացվի և օգտատիրոջ բոլոր տվյալները կջնջվեն:" + "Դուք կատարել եք հեռախոսն ապակողպելու %1$d անհաջող փորձ: Եվս %2$d անհաջող փորձից հետո այս օգտատերը կհեռացվի և օգտատիրոջ բոլոր տվյալները կջնջվեն:" + "Դուք կատարել եք գրասալիկն ապակողպելու %d անհաջող փորձ: Օգտատերը կհեռացվի և օգտատիրոջ բոլոր տվյալները կջնջվեն:" + "Դուք կատարել եք հեռախոսն ապակողպելու %d անհաջող փորձ: Օգտատերը կհեռացվի և օգտատիրոջ բոլոր տվյալները կջնջվեն:" "Դուք կատարել եք գրասալիկն ապակողպելու %1$d անհաջող փորձ: Եվս %2$d անհաջող փորձից հետո աշխատանքային պրոֆիլը կհեռացվի և պրոֆիլի բոլոր տվյալները կջնջվեն:" "Դուք կատարել եք հեռախոսն ապակողպելու %1$d անհաջող փորձ: Եվս %2$d անհաջող փորձից հետո աշխատանքային պրոֆիլը կհեռացվի և պրոֆիլի բոլոր տվյալները կջնջվեն:" "Դուք կատարել եք գրասալիկն ապակողպելու %d անհաջող փորձ: Աշխատանքային պրոֆիլը կհեռացվի և պրոֆիլի բոլոր տվյալները կջնջվեն:" diff --git a/packages/Keyguard/res/values-nl/strings.xml b/packages/Keyguard/res/values-nl/strings.xml index c44381efc817..fe87df8e5f5d 100644 --- a/packages/Keyguard/res/values-nl/strings.xml +++ b/packages/Keyguard/res/values-nl/strings.xml @@ -44,7 +44,7 @@ "Onbruikbare simkaart." "Je simkaart is permanent uitgeschakeld.\n Neem contact op met je mobiele serviceprovider voor een nieuwe simkaart." "Simkaart is vergrendeld." - "Simkaart is vergrendeld met PUK-code." + "Simkaart is vergrendeld met pukcode." "Simkaart ontgrendelen…" "Gebied voor pincode" "Gebied voor sim-pincode" @@ -62,14 +62,14 @@ "Voer de pincode in voor de simkaart van \'%1$s\'" "Pincode opgeven" "Wachtwoord invoeren" - "De simkaart is nu uitgeschakeld. Geef de PUK-code op om door te gaan. Neem contact op met de provider voor informatie." - "Simkaart van \'%1$s\' is nu uitgeschakeld. Voer de PUK-code in om door te gaan. Neem contact op met je provider voor meer informatie." + "De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie." + "Simkaart van \'%1$s\' is nu uitgeschakeld. Voer de pukcode in om door te gaan. Neem contact op met je provider voor meer informatie." "Gewenste pincode opgeven" "Gewenste pincode bevestigen" "Simkaart ontgrendelen..." "Voer een pincode van 4 tot 8 cijfers in." - "De PUK-code is minimaal acht nummers lang." - "Geef de juiste PUK-code opnieuw op. Bij herhaalde pogingen wordt de simkaart permanent uitgeschakeld." + "De pukcode is minimaal acht nummers lang." + "Geef de juiste pukcode opnieuw op. Bij herhaalde pogingen wordt de simkaart permanent uitgeschakeld." "Pincodes komen niet overeen" "Te veel patroonpogingen" "Je hebt je pincode %1$d keer onjuist getypt. \n\nProbeer het opnieuw over %2$d seconden." 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 @@ "Погрешан шаблон" "Погрешна лозинка" "Погрешан PIN" - "Покушајте поново за %d секунде(и)." + "Пробајте поново за %d секунде(и)." "Нацртајте шаблон" "Унесите PIN SIM картице" "Унесите PIN за SIM „%1$s“" @@ -72,9 +72,9 @@ "Поново унесите исправни PUK кôд. Поновљени покушаји ће трајно онемогућити SIM." "PIN кодови се не подударају" "Превише покушаја уноса шаблона" - "Унели сте нетачни PIN %1$d пута. \n\nПокушајте поново за %2$d секунде(и)." - "Унели сте нетачну лозинку %1$d пута. \n\nПокушајте поново за %2$d секунде(и)." - "Нацртали сте шаблон за откључавање нетачно %1$d пута. \n\nПокушајте поново за %2$d секунде(и)." + "Унели сте нетачни PIN %1$d пута. \n\nПробајте поново за %2$d секунде(и)." + "Унели сте нетачну лозинку %1$d пута. \n\nПробајте поново за %2$d секунде(и)." + "Нацртали сте шаблон за откључавање нетачно %1$d пута. \n\nПробајте поново за %2$d секунде(и)." "Погрешно сте покушали да откључате таблет %1$d пут(а). Имате још %2$d покушај(а), након чега се таблет ресетује и сви подаци са њега бришу." "Погрешно сте покушали да откључате телефон %1$d пут(а). Имате још %2$d покушај(а), након чега се телефон ресетује и сви подаци са њега бришу." "Погрешно сте покушали да откључате таблет %d пут(а). Таблет ће бити ресетован и сви подаци са њега ће бити избрисани." @@ -87,8 +87,8 @@ "Погрешно сте покушали да откључате телефон %1$d пут(а). Имате још %2$d покушај(а), након чега се пословни профил уклања и сви подаци са профила бришу." "Погрешно сте покушали да откључате таблет %d пут(а). Пословни профил ће бити уклоњен и сви подаци са њега ће бити избрисани." "Погрешно сте покушали да откључате телефон %d пут(а). Пословни профил ће бити уклоњен и сви подаци са њега ће бити избрисани." - "Нацртали сте шаблон за откључавање нетачно %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште.\n\nПокушајте поново за %3$d секунде(и)." - "Нацртали сте шаблон за откључавање нетачно %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште.\n\nПокушајте поново за %3$d секунде(и)." + "Нацртали сте шаблон за откључавање нетачно %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште.\n\nПробајте поново за %3$d секунде(и)." + "Нацртали сте шаблон за откључавање нетачно %1$d пута. После још %2$d неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште.\n\nПробајте поново за %3$d секунде(и)." "Нетачан SIM PIN кôд. Сада морате да контактирате мобилног оператера да бисте откључали уређај." Нетачан SIM PIN кôд. Имате још %d покушај. 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 @@ "Laddas snabbt" "Laddas långsamt" "Anslut din laddare." - "Tryck på Meny om du vill låsa upp." + "Tryck på Meny för att låsa upp." "Nätverk låst" "Inget SIM-kort" "Inget SIM-kort i surfplattan." diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml index 2d27162103b5..ebdc83947cc7 100755 --- a/packages/Keyguard/res/values-zh-rCN/strings.xml +++ b/packages/Keyguard/res/values-zh-rCN/strings.xml @@ -36,7 +36,7 @@ "请连接充电器。" "按“菜单”键解锁。" "网络已锁定" - "无 SIM 卡" + "没有 SIM 卡" "平板电脑中没有SIM卡。" "手机中没有SIM卡。" "请插入SIM卡。" 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 @@ "Host MTP" "Descargas" "%2$s de %1$s" - "Accedendo aos ficheiros de %1$s" + "Accedendo aos ficheiros do dispositivo %1$s" "O outro dispositivo está ocupado. Non podes transferir ficheiros ata que estea dispoñible." "Non se atopou ningún ficheiro. Se o outro dispositivo está bloqueado, desbloquéao e téntao de novo." diff --git a/packages/MtpDocumentsProvider/res/values-in/strings.xml b/packages/MtpDocumentsProvider/res/values-in/strings.xml index 905daec931e6..6f65337a1d61 100644 --- a/packages/MtpDocumentsProvider/res/values-in/strings.xml +++ b/packages/MtpDocumentsProvider/res/values-in/strings.xml @@ -17,7 +17,7 @@ "Host MTP" - "Unduhan" + "Download" "%1$s %2$s" "Mengakses file dari %1$s" "Perangkat lainnya sedang sibuk. Anda dapat mentransfer file jika telah tersedia." diff --git a/packages/MtpDocumentsProvider/res/values-ml-rIN/strings.xml b/packages/MtpDocumentsProvider/res/values-ml-rIN/strings.xml index f357f96822b2..49eb847b1173 100644 --- a/packages/MtpDocumentsProvider/res/values-ml-rIN/strings.xml +++ b/packages/MtpDocumentsProvider/res/values-ml-rIN/strings.xml @@ -17,7 +17,7 @@ "MTP ഹോസ്റ്റ്" - "ഡൗൺലോഡുകൾ" + "ഡൗണ്‍ലോഡുകൾ" "%1$s %2$s" "%1$s ഉപകരണത്തിൽ നിന്ന് ഫയലുകൾ ആക്സസ്സ് ചെയ്യുന്നു" "രണ്ടാമത്തെ ഉപകരണം തിരക്കിലാണ്. അത് ലഭ്യമാകുന്നത് വരെ നിങ്ങൾക്ക് ഫയലുകൾ കൈമാറാൻ കഴിയില്ല." diff --git a/packages/MtpDocumentsProvider/res/values-uz-rUZ/strings.xml b/packages/MtpDocumentsProvider/res/values-uz-rUZ/strings.xml index dea4cffb3ded..c511172076c0 100644 --- a/packages/MtpDocumentsProvider/res/values-uz-rUZ/strings.xml +++ b/packages/MtpDocumentsProvider/res/values-uz-rUZ/strings.xml @@ -17,7 +17,7 @@ "MTP Host" - "Yuklanishlar" + "Yuklanmalar" "%1$s%2$s" "%1$s qurilmasidan fayllar o‘qilmoqda" "Ulangan qurilma band. U bo‘shamaguncha fayllarni o‘tkazib bo‘lmaydi." diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java index 1823711acd59..f1e24b80fad9 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java @@ -349,6 +349,34 @@ record = getDeviceToolkit(parentId.mDeviceId).mDeviceRecord; throw new UnsupportedOperationException( "Writing operation is not supported by the device."); } + + final int parentObjectHandle; + final int storageId; + switch (parentId.mDocumentType) { + case MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE: + final String[] storageDocumentIds = + mDatabase.getStorageDocumentIds(parentId.mDocumentId); + if (storageDocumentIds.length == 1) { + final String newDocumentId = + createDocument(storageDocumentIds[0], mimeType, displayName); + notifyChildDocumentsChange(parentDocumentId); + return newDocumentId; + } else { + throw new UnsupportedOperationException( + "Cannot create a file under the device."); + } + case MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE: + storageId = parentId.mStorageId; + parentObjectHandle = -1; + break; + case MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT: + storageId = parentId.mStorageId; + parentObjectHandle = parentId.mObjectHandle; + break; + default: + throw new IllegalArgumentException("Unexpected document type."); + } + pipe = ParcelFileDescriptor.createReliablePipe(); int objectHandle = -1; MtpObjectInfo info = null; @@ -359,8 +387,8 @@ record = getDeviceToolkit(parentId.mDeviceId).mDeviceRecord; MtpConstants.FORMAT_ASSOCIATION : MediaFile.getFormatCode(displayName, mimeType); info = new MtpObjectInfo.Builder() - .setStorageId(parentId.mStorageId) - .setParent(parentId.mObjectHandle) + .setStorageId(storageId) + .setParent(parentObjectHandle) .setFormat(formatCode) .setName(displayName) .build(); @@ -414,6 +442,24 @@ record = getDeviceToolkit(parentId.mDeviceId).mDeviceRecord; } } + @Override + public boolean isChildDocument(String parentDocumentId, String documentId) { + try { + Identifier identifier = mDatabase.createIdentifier(documentId); + while (true) { + if (parentDocumentId.equals(identifier.mDocumentId)) { + return true; + } + if (identifier.mDocumentType == MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE) { + return false; + } + identifier = mDatabase.getParentIdentifier(identifier.mDocumentId); + } + } catch (FileNotFoundException error) { + return false; + } + } + void openDevice(int deviceId) throws IOException { synchronized (mDeviceListLock) { if (mDeviceToolkits.containsKey(deviceId)) { diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java index d19b46083f91..8831ae292fe6 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java @@ -34,6 +34,8 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; +import java.util.LinkedList; +import java.util.Queue; import java.util.concurrent.TimeoutException; import static com.android.mtp.MtpDatabase.strings; @@ -546,7 +548,7 @@ MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException { public void testOpenDocument_writing() throws Exception { setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 0, "Storage", 0, 0, "") + new MtpRoot(0, 100, "Storage", 0, 0, "") }); final String documentId = mProvider.createDocument("2", "text/plain", "test.txt"); { @@ -688,6 +690,29 @@ public void testMappingDisconnectedDocuments() throws Exception { } } + public void testCreateDocument() throws Exception { + setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); + setupRoots(0, new MtpRoot[] { + new MtpRoot(0, 100, "Storage A", 100, 100, null) + }); + final String documentId = mProvider.createDocument("1", "text/plain", "note.txt"); + final Uri deviceUri = DocumentsContract.buildChildDocumentsUri( + MtpDocumentsProvider.AUTHORITY, "1"); + final Uri storageUri = DocumentsContract.buildChildDocumentsUri( + MtpDocumentsProvider.AUTHORITY, "2"); + mResolver.waitForNotification(storageUri, 1); + mResolver.waitForNotification(deviceUri, 1); + try (final Cursor cursor = mProvider.queryDocument(documentId, null)) { + assertTrue(cursor.moveToNext()); + assertEquals( + "note.txt", + cursor.getString(cursor.getColumnIndex(Document.COLUMN_DISPLAY_NAME))); + assertEquals( + "text/plain", + cursor.getString(cursor.getColumnIndex(Document.COLUMN_MIME_TYPE))); + } + } + public void testCreateDocument_noWritingSupport() throws Exception { setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); mMtpManager.addValidDevice(new MtpDeviceRecord( @@ -769,6 +794,18 @@ public void testObjectSizeLong() throws Exception { assertEquals(0x400000000L, cursor.getLong(0)); } + public void testIsChildDocument() throws Exception { + setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); + setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); + setupHierarchyDocuments("1"); + assertTrue(mProvider.isChildDocument("1", "1")); + assertTrue(mProvider.isChildDocument("1", "14")); + assertTrue(mProvider.isChildDocument("2", "14")); + assertTrue(mProvider.isChildDocument("5", "14")); + assertFalse(mProvider.isChildDocument("3", "14")); + assertFalse(mProvider.isChildDocument("6", "14")); + } + private void setupProvider(int flag) { mDatabase = new MtpDatabase(getContext(), flag); mProvider = new MtpDocumentsProvider(); @@ -822,4 +859,63 @@ private String[] setupDocuments( return getStrings(mProvider.queryChildDocuments( parentDocumentId, strings(DocumentsContract.Document.COLUMN_DOCUMENT_ID), null)); } + + static class HierarchyDocument { + int depth; + String documentId; + int objectHandle; + int parentHandle; + + HierarchyDocument createChildDocument(int newHandle) { + final HierarchyDocument doc = new HierarchyDocument(); + doc.depth = depth - 1; + doc.objectHandle = newHandle; + doc.parentHandle = objectHandle; + return doc; + } + + MtpObjectInfo toObjectInfo() { + return new MtpObjectInfo.Builder() + .setName("doc_" + documentId) + .setFormat(depth > 0 ? + MtpConstants.FORMAT_ASSOCIATION : MtpConstants.FORMAT_TEXT) + .setObjectHandle(objectHandle) + .setParent(parentHandle) + .build(); + } + } + + private void setupHierarchyDocuments(String documentId) throws Exception { + final Queue ids = new LinkedList<>(); + final HierarchyDocument firstDocument = new HierarchyDocument(); + firstDocument.depth = 3; + firstDocument.documentId = documentId; + firstDocument.objectHandle = MtpManager.OBJECT_HANDLE_ROOT_CHILDREN; + ids.add(firstDocument); + + int objectHandle = 100; + while (!ids.isEmpty()) { + final HierarchyDocument document = ids.remove(); + final HierarchyDocument[] children = new HierarchyDocument[] { + document.createChildDocument(objectHandle++), + document.createChildDocument(objectHandle++), + document.createChildDocument(objectHandle++), + }; + final String[] childDocIds = setupDocuments( + 0, 0, document.objectHandle, document.documentId, new MtpObjectInfo[] { + children[0].toObjectInfo(), + children[1].toObjectInfo(), + children[2].toObjectInfo(), + }); + children[0].documentId = childDocIds[0]; + children[1].documentId = childDocIds[1]; + children[2].documentId = childDocIds[2]; + + if (children[0].depth > 0) { + ids.add(children[0]); + ids.add(children[1]); + ids.add(children[2]); + } + } + } } diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java index 9a81489544cb..4dba64848d4e 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import junit.framework.Assert; public class TestMtpManager extends MtpManager { public static final int CREATED_DOCUMENT_HANDLE = 1000; @@ -151,6 +152,9 @@ void importFile(int deviceId, int objectHandle, ParcelFileDescriptor target) @Override int createDocument(int deviceId, MtpObjectInfo objectInfo, ParcelFileDescriptor source) throws IOException { + Assert.assertNotSame(0, objectInfo.getStorageId()); + Assert.assertNotSame(-1, objectInfo.getStorageId()); + Assert.assertNotSame(0, objectInfo.getParent()); final String key = pack(deviceId, CREATED_DOCUMENT_HANDLE); if (mObjectInfos.containsKey(key)) { throw new IOException(); 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 @@ "اختر طابعة" "جميع الصفحات وعددها %1$s" "النطاق %1$s" - "مثلاً، ۱—۵،‏۹،۷—۱۰" + "مثلاً، ١—٥،‏٨،‏١١—١٣" "معاينة قبل الطباعة" "‏تثبيت برنامج عرض PDF للمعاينة" "تعطّل تطبيق الطباعة" 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 @@ "Vodoravno" "Upisivanje u datoteku nije moguće" - "Žao nam je, ovo nije uspelo. Pokušajte ponovo." - "Pokušajte ponovo" + "Žao nam je, ovo nije uspelo. Probajte ponovo." + "Probajte ponovo" "Ovaj štampač trenutno nije dostupan." "Nije uspeo prikaz pregleda" "Priprema pregleda..." diff --git a/packages/PrintSpooler/res/values-bs-rBA/strings.xml b/packages/PrintSpooler/res/values-bs-rBA/strings.xml index cc04d6646278..42b8f90b5ae5 100644 --- a/packages/PrintSpooler/res/values-bs-rBA/strings.xml +++ b/packages/PrintSpooler/res/values-bs-rBA/strings.xml @@ -32,7 +32,7 @@ "Opseg od %1$s" "npr. 1—5,8,11—13" "Pregled prije štampanja" - "Instaliraj PDF preglednik za prikaz" + "Instaliraj PDF pregledavač za prikaz" "Aplikacija za štampanje je prestala raditi" "Kreiranje zadatka za štampu" "Sačuvaj kao PDF" diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml index 8095f0fab92e..009076468dc1 100644 --- a/packages/PrintSpooler/res/values-hi/strings.xml +++ b/packages/PrintSpooler/res/values-hi/strings.xml @@ -26,10 +26,10 @@ "रंग" "दो-तरफ़ा" "अभिविन्‍यास" - "पृष्ठ" + "पेज" "कोई प्रिंटर चुनें" "सभी %1$s" - "पृष्ठ संख्या %1$s" + "पेज संख्या %1$s" "उदा. 1—5,8,11—13" "प्रिंट पूर्वावलोकन" "पूर्वावलोकन के लिए PDF व्यूअर इंस्टॉल करें" @@ -39,7 +39,7 @@ "सभी प्रिंटर..." "प्रिंट डॉयलॉग" "%1$d /%2$d" - "%2$d में से पृष्ठ %1$d" + "%2$d में से पेज %1$d" "सारांश, प्रतियां %1$s, काग़ज़ का आकार %2$s" "हैंडल विस्तृत करें" "हैंडल संक्षिप्त करें" 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 @@ "ページ" "プリンタを選択" "%1$sページすべて" - "%1$sページ分" + "範囲選択(%1$sページ内)" "例: 1-5,8,11-13" "印刷プレビュー" "プレビュー用PDFビューアをインストール" 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 @@ "PDF ಗೆ ಉಳಿಸು" "ಪ್ರಿಂಟ್ ಆಯ್ಕೆಗಳನ್ನು ವಿಸ್ತರಿಸಲಾಗಿದೆ" "ಪ್ರಿಂಟ್ ಆಯ್ಕೆಗಳನ್ನು ಮುಚ್ಚಲಾಗಿದೆ" - "ಹುಡುಕು" + "ಹುಡುಕಿ" "ಎಲ್ಲಾ ಪ್ರಿಂಟರ್‌ಗಳು" "ಸೇವೆಯನ್ನು ಸೇರಿಸು" "ಹುಡುಕಾಟ ಪೆಟ್ಟಿಗೆಯನ್ನು ತೋರಿಸಲಾಗಿದೆ" @@ -81,10 +81,10 @@ "%1$s ರದ್ದು ಮಾಡಲಾಗುತ್ತಿದೆ" "ಮುದ್ರಕ ದೋಷ %1$s" "ಮುದ್ರಕವು %1$s ನಿರ್ಬಂಧಿಸಿದೆ" - "ರದ್ದುಮಾಡು" + "ರದ್ದುಮಾಡಿ" "ಮರುಪ್ರಾರಂಭಿಸು" "ಮುದ್ರಕಕ್ಕೆ ಸಂಪರ್ಕವಿಲ್ಲ" - "ಅಜ್ಞಾತ" + "ಅಪರಿಚಿತ" "%1$s ಬಳಸುವುದೇ?" "ನಿಮ್ಮ ಡಾಕ್ಯುಮೆಂಟ್‌ ಪ್ರಿಂಟರ್‌ಗೆ ಹೋಗುವ ಸಂದರ್ಭದಲ್ಲಿ ಒಂದು ಅಥವಾ ಅದಕ್ಕಿಂತ ಹೆಚ್ಚು ಸರ್ವರ್‌ಗಳ ಮೂಲಕ ಹಾದು ಹೋಗಬಹುದು." diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml index 7e1f37e554a3..743ab6069c27 100644 --- a/packages/PrintSpooler/res/values-nl/strings.xml +++ b/packages/PrintSpooler/res/values-nl/strings.xml @@ -97,8 +97,8 @@ "Korte zijde" - "Portret" - "Landschap" + "Staand" + "Liggend" "Kan niet naar bestand schrijven" "Dat werkte niet. Probeer het opnieuw." diff --git a/packages/PrintSpooler/res/values-si-rLK/strings.xml b/packages/PrintSpooler/res/values-si-rLK/strings.xml index c3597a740f78..da1509d9f741 100644 --- a/packages/PrintSpooler/res/values-si-rLK/strings.xml +++ b/packages/PrintSpooler/res/values-si-rLK/strings.xml @@ -52,7 +52,7 @@ "සේවාව එක් කිරීම" "සෙවීම් කොටුව පෙන්වන ලදී" "සෙවීම් කොටුව සඟවන ලදී" - "මුද්‍රණ යන්ත්‍ර එකතු කරන්න" + "මුද්‍රණ යන්ත්‍ර එක් කරන්න" "මුද්‍රකය තේරීම" "මුද්‍රකය අමතක කිරීම" 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 @@ "Водоравно" "Уписивање у датотеку није могуће" - "Жао нам је, ово није успело. Покушајте поново." - "Покушајте поново" + "Жао нам је, ово није успело. Пробајте поново." + "Пробајте поново" "Овај штампач тренутно није доступан." "Није успео приказ прегледа" "Припрема прегледа..." diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml index 1944a4b3dc83..e9e9458e32f8 100644 --- a/packages/PrintSpooler/res/values-sw/strings.xml +++ b/packages/PrintSpooler/res/values-sw/strings.xml @@ -32,7 +32,7 @@ "Mfululizo wa %1$s" "k.m. 1–5, 8, 11–13" "Chungulia kwanza kabla ya kuchapisha" - "Sakinisha kitazamaji cha PDF kwa onyesho la kuchungulia" + "Sakinisha Kifungua PDF ili uweze kuchungulia" "Programu ya kuchapisha imeacha kufanya kazi" "Inaleta kazi ya kuchapisha" "Hifadhi kama PDF" diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 66f2f87fa31e..9379f27e6a11 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -341,4 +341,7 @@ "Gepasmaak (%d)" "Hulp en terugvoer" "Kieslys" + "Voer wagwoord in om fabriekterugstelling in demonstrasiemodus uit te voer" + "Volgende" + "Wagwoord word benodig" diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index cfda4ab177d9..ed12c5d5c65e 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -341,4 +341,7 @@ "ብጁ (%d)" "እገዛ እና ግብረመልስ" "ምናሌ" + "የፋብሪካ ዳግም ማስጀመር በማሳያ ሁነታ ውስጥ ለማከናወን የይለፍ ቃል ያስገቡ" + "ቀጣይ" + "የይለፍ ቃል ያስፈልጋል" diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index e65feff40590..4714e70a0778 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -341,4 +341,7 @@ "مخصص (%d)" "المساعدة والتعليقات" "القائمة" + "إدخال كلمة المرور لإعادة الضبط بحسب بيانات المصنع في الوضع التجريبي" + "التالي" + "يلزم توفر كلمة مرور" diff --git a/packages/SettingsLib/res/values-az-rAZ/strings.xml b/packages/SettingsLib/res/values-az-rAZ/strings.xml index 5aac49e14443..29f6be1966bc 100644 --- a/packages/SettingsLib/res/values-az-rAZ/strings.xml +++ b/packages/SettingsLib/res/values-az-rAZ/strings.xml @@ -341,4 +341,7 @@ "Fərdi (%d)" "Yardım və rəy" "Menyu" + "Demo rejimində sıfırlamaq üçün parol daxil edin" + "Növbəti" + "Parol tələb olunur" diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 345c0bb5adcf..071a481b9ec4 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -341,4 +341,7 @@ "Prilagođeni (%d)" "Pomoć i povratne informacije" "Meni" + "Unesite lozinku da biste obavili resetovanje na fabrička podešavanja u režimu demonstracije" + "Dalje" + "Potrebna je lozinka" diff --git a/packages/SettingsLib/res/values-be-rBY/strings.xml b/packages/SettingsLib/res/values-be-rBY/strings.xml index 52077fb7c481..75533ee440ae 100644 --- a/packages/SettingsLib/res/values-be-rBY/strings.xml +++ b/packages/SettingsLib/res/values-be-rBY/strings.xml @@ -341,4 +341,7 @@ "Карыстальніцкі (%d)" "Даведка і водгукі" "Меню" + "Каб выканаць скід да заводскіх налад у дэманстрацыйным рэжыме, увядзіце пароль" + "Далей" + "Патрабуецца пароль" diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index eba51b37dc79..088ed1bd70ea 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -341,4 +341,7 @@ "Персонализирано (%d)" "Помощ и отзиви" "Меню" + "Въведете парола за възст. на фабр. настройки в демонстр. режим" + "Напред" + "Изисква се парола" diff --git a/packages/SettingsLib/res/values-bn-rBD/strings.xml b/packages/SettingsLib/res/values-bn-rBD/strings.xml index 4ad361bd39b9..cf25afa8c8a2 100644 --- a/packages/SettingsLib/res/values-bn-rBD/strings.xml +++ b/packages/SettingsLib/res/values-bn-rBD/strings.xml @@ -53,7 +53,7 @@ "পরিচিতি শেয়ার করার কাজে ব্যবহার করুন" "ইন্টারনেট সংযোগ শেয়ার করা হচ্ছে" "বার্তা অ্যাক্সেস" - "SIM -এর অ্যাক্সেস" + "সিম -এর অ্যাক্সেস" "মিডিয়া অডিওতে সংযুক্ত রয়েছে" "ফোন অডিওতে সংযুক্ত" "ফাইল স্থানান্তর সার্ভারের সঙ্গে সংযুক্ত" @@ -65,7 +65,7 @@ "ডিভাইসের সাথে স্থানীয় ইন্টারনেট সংযোগ ভাগ করছে" "ইন্টারনেট অ্যাক্সেসের জন্য ব্যবহার করুন" "মানচিত্রের জন্য ব্যবহার করুন" - "SIM -এর অ্যাক্সেসের জন্য ব্যবহার করুন" + "সিম -এর অ্যাক্সেসের জন্য ব্যবহার করুন" "মিডিয়া অডিওয়ের জন্য ব্যবহার করুন" "ফোন অডিওয়ের জন্য ব্যবহার করুন" "ফাইল স্থানান্তরের জন্য ব্যবহার করুন" @@ -341,4 +341,7 @@ "কাস্টম (%d)" "সহায়তা ও মতামত" "মেনু" + "ডেমো মোডে ফ্যাক্টরি রিসেট করতে পাসওয়ার্ড দিন" + "পরবর্তী" + "পাসওয়ার্ড আবশ্যক" diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml index 8c7c4e0df94e..6d86f48d7efb 100644 --- a/packages/SettingsLib/res/values-bs-rBA/strings.xml +++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml @@ -341,4 +341,7 @@ "Prilagodi (%d)" "Pomoć i povratne informacije" "Meni" + "Unesite lozinku da izvršite vraćanje na fabričke postavke u načinu demonstracije" + "Naprijed" + "Potrebna je lozinka" diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 20ae6b0ce23a..5e4f1551f1be 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -341,4 +341,7 @@ "Personalitzat (%d)" "Ajuda i suggeriments" "Menú" + "Introdueix la contrasenya per restablir les dades de fàbrica en mode de demostració" + "Següent" + "Contrasenya obligatòria" diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index bbc1266cd554..f975d921385c 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -341,4 +341,7 @@ "Vlastní (%d)" "Nápověda a zpětná vazba" "Nabídka" + "Chcete-li v ukázkovém režimu obnovit zařízení do továrního nastavení, zadejte heslo" + "Další" + "Je třeba zadat heslo" diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 108d8dccd419..9a549f2f1beb 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -191,7 +191,7 @@ "Vil du ophæve adgangen til USB-fejlfinding for alle computere, du tidligere har godkendt?" "Vil du tillade udviklingsindstillinger?" "Disse indstillinger er kun beregnet til brug i forbindelse med udvikling. De kan forårsage, at din enhed og dens applikationer går ned eller ikke fungerer korrekt." - "Kontrollér apps via USB" + "Verificer apps via USB" "Kontrollér apps, der er installeret via ADB/ADT, for skadelig adfærd." "Deaktiverer funktionen til absolut lydstyrke via Bluetooth i tilfælde af problemer med lydstyrken på eksterne enheder, f.eks. uacceptabel høj lyd eller manglende kontrol." "Lokal terminal" @@ -341,4 +341,7 @@ "Tilpasset (%d)" "Hjælp og feedback" "Menu" + "Angiv adgangskode for at gendanne fabriksdata i demotilstand" + "Næste" + "Angiv en adgangskode" diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index d93dbac8965d..b6a96c887f77 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -341,4 +341,7 @@ "Benutzerdefiniert (%d)" "Hilfe & Feedback" "Menü" + "Passwort eingeben, um Gerät im Demomodus auf Werkseinstellungen zurückzusetzen" + "Weiter" + "Passwort erforderlich" diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 6bbc11c73d28..6db0608331fc 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -341,4 +341,7 @@ "Προσαρμοσμένη (%d)" "Βοήθεια και σχόλια" "Μενού" + "Εισαγάγετε κωδικό πρόσβασης για επαναφορά εργοστασιακών ρυθμίσεων στη λειτουργία επίδειξης" + "Επόμενο" + "Απαιτείται κωδικός πρόσβασης" diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index a571affde077..2fecfea48cb3 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -341,4 +341,7 @@ "Custom (%d)" "Help & feedback" "Menu" + "Enter password to perform factory reset in demo mode" + "Next" + "Password required" diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index a571affde077..2fecfea48cb3 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -341,4 +341,7 @@ "Custom (%d)" "Help & feedback" "Menu" + "Enter password to perform factory reset in demo mode" + "Next" + "Password required" diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index a571affde077..2fecfea48cb3 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -341,4 +341,7 @@ "Custom (%d)" "Help & feedback" "Menu" + "Enter password to perform factory reset in demo mode" + "Next" + "Password required" diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 924c18ad92fd..c55aabe15705 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -341,4 +341,7 @@ "Personalizado (%d)" "Ayuda y comentarios" "Menú" + "Ingresa contraseña y restablece en demo" + "Siguiente" + "Contraseña obligatoria" diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 782494907222..0062154ef638 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -31,7 +31,7 @@ "No se ha detectado acceso a Internet, por lo que no se volverá a conectar automáticamente." "No se ha detectado acceso a Internet." "Guardadas por %1$s" - "Conectado a través de asistente Wi‑Fi" + "Conectado a través del asistente de Wi‑Fi" "Conectado a través de %1$s" "Disponible a través de %1$s" "Conexión sin Internet" @@ -341,4 +341,7 @@ "Personalizado (%d)" "Ayuda y sugerencias" "Menú" + "Escribe una contraseña para restablecer datos de fábrica en modo demostración" + "Siguiente" + "Contraseña obligatoria" diff --git a/packages/SettingsLib/res/values-et-rEE/strings.xml b/packages/SettingsLib/res/values-et-rEE/strings.xml index 5f76b9fd9723..09170614cb00 100644 --- a/packages/SettingsLib/res/values-et-rEE/strings.xml +++ b/packages/SettingsLib/res/values-et-rEE/strings.xml @@ -341,4 +341,7 @@ "Kohandatud (%d)" "Abi ja tagasiside" "Menüü" + "Sisestage parool, et demorežiimis tehaseseadetele lähtestada" + "Järgmine" + "Parool on kohustuslik" diff --git a/packages/SettingsLib/res/values-eu-rES/strings.xml b/packages/SettingsLib/res/values-eu-rES/strings.xml index abcf2828e2c0..d3251fe39566 100644 --- a/packages/SettingsLib/res/values-eu-rES/strings.xml +++ b/packages/SettingsLib/res/values-eu-rES/strings.xml @@ -341,4 +341,7 @@ "Pertsonalizatua (%d)" "Laguntza eta iritziak" "Menua" + "Idatzi pasahitza jatorrizko ezarpenak demo moduan berrezartzeko" + "Hurrengoa" + "Pasahitza behar da" diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index c573b687967e..e87a3e98af89 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -341,4 +341,7 @@ "سفارشی (%d)" "راهنما و بازخورد" "منو" + "برای انجام بازنشانی کارخانه‌ای در حالت نمایشی، گذرواژه را وارد کنید" + "بعدی" + "وارد کردن گذرواژه الزامی است" diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 05f786addec2..f610fe4e2d4b 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -341,4 +341,7 @@ "Muokattu (%d)" "Ohje ja palaute" "Valikko" + "Palauta tehdasasetukset antamalla salasana" + "Seuraava" + "Salasana vaaditaan" diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 25384434313c..4b4413f9c2fb 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -91,7 +91,7 @@ "Point d\'accès Wi-Fi mobile" "Via Bluetooth" "Partage de connexion" - "Partage de connexion et point d\'accès mobile" + "Partage de connexion" "Toutes les applis profess." "Invité" "Inconnu" @@ -341,4 +341,7 @@ "Personnalisée (%d)" "Aide et commentaires" "Menu" + "Entrez m. passe pour réinit. en mode démo" + "Suivant" + "Mot de passe obligatoire" diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 3b5491f5ca33..44dc8f894533 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -341,4 +341,7 @@ "Personnalisé (%d)" "Aide et commentaires" "Menu" + "Saisir mot de passe pour rétablir conf. d\'usine en mode démo." + "Suivant" + "Veuillez saisir le mot de passe" diff --git a/packages/SettingsLib/res/values-gl-rES/strings.xml b/packages/SettingsLib/res/values-gl-rES/strings.xml index dcd45a85dd30..a8ba929c5425 100644 --- a/packages/SettingsLib/res/values-gl-rES/strings.xml +++ b/packages/SettingsLib/res/values-gl-rES/strings.xml @@ -341,4 +341,7 @@ "Personalizado (%d)" "Axuda e suxestións" "Menú" + "Insire contrasinal para restablec. en demostración" + "Seguinte" + "O contrasinal é obrigatorio" diff --git a/packages/SettingsLib/res/values-gu-rIN/strings.xml b/packages/SettingsLib/res/values-gu-rIN/strings.xml index 554ca40a751b..43f930e5e5e3 100644 --- a/packages/SettingsLib/res/values-gu-rIN/strings.xml +++ b/packages/SettingsLib/res/values-gu-rIN/strings.xml @@ -341,4 +341,7 @@ "કસ્ટમ (%d)" "સહાય અને પ્રતિસાદ" "મેનુ" + "ડેમો મોડમાં ફેક્ટરી રીસેટ પાસવર્ડ દાખલ કરો" + "આગલું" + "પાસવર્ડ આવશ્યક છે" diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index fb6f181e6b20..5580580fdeb6 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -79,7 +79,7 @@ "%1$s से संचार नहीं कर सकता." "%1$s द्वारा युग्‍मन अस्‍वीकृत किया गया." "वाई-फ़ाई बंद है." - "वाई-फ़ाई डिस्कनेक्ट है." + "वाई-फ़ाई डिसकनेक्ट है." "वाई-फ़ाई का एक बार है." "वाई-फ़ाई की दो पट्टी मिल रही हैं." "वाई-फ़ाई की एक पट्टी मिल रही है." @@ -341,4 +341,7 @@ "कस्टम (%d)" "सहायता और फ़ीडबैक" "मेनू" + "डेमो मोड में फ़ैक्टरी रीसेट के लिए पासवर्ड डालें" + "आगे" + "पासवर्ड आवश्यक" diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 619826d274f4..a92d87b4b491 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -341,4 +341,7 @@ "Prilagođeno (%d)" "Pomoć i povratne informacije" "Izbornik" + "Unesite zaporku za resetiranje u demo načinu" + "Dalje" + "Potrebna je zaporka" diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index e389c0093a9e..07ed9234b41b 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -341,4 +341,7 @@ "Egyéni (%d)" "Súgó és visszajelzés" "Menü" + "Írja be a jelszót a visszaállításhoz" + "Következő" + "Jelszó szükséges" diff --git a/packages/SettingsLib/res/values-hy-rAM/arrays.xml b/packages/SettingsLib/res/values-hy-rAM/arrays.xml index e93cbfcdf547..9a08bd9faa77 100644 --- a/packages/SettingsLib/res/values-hy-rAM/arrays.xml +++ b/packages/SettingsLib/res/values-hy-rAM/arrays.xml @@ -25,7 +25,7 @@ "Սկանավորում…" "Միանում է..." "Նույնականացում…" - "IP հասցեն գտնվում է...." + "IP հասցեի ստացում…" "Միացված է" "Կասեցված է" "Անջատվում է…" @@ -43,7 +43,7 @@ "Միացված է %1$s-ին" "Անջատված" "Անջատվում է %1$s-ից…" - "Անջատված" + "Անջատած է" "Անհաջող" "Արգելափակված" "Վատ ցանցից ժամանակավոր խուսափում" diff --git a/packages/SettingsLib/res/values-hy-rAM/strings.xml b/packages/SettingsLib/res/values-hy-rAM/strings.xml index 8d2d78efc45c..3f3d2d071dcc 100644 --- a/packages/SettingsLib/res/values-hy-rAM/strings.xml +++ b/packages/SettingsLib/res/values-hy-rAM/strings.xml @@ -30,7 +30,7 @@ "Ընդգրկույթից դուրս է" "Ինտերնետ կապ չկա, ինչի պատճառով ավտոմատ վերամիացում չի կատարվի:" "Ինտերնետ կապ չկա:" - "Պահել է հետևյալ օգտվողը՝ %1$s" + "Պահել է հետևյալ օգտատերը՝ %1$s" "Կապակցված է Wi‑Fi Օգնականի միջոցով" "Կապակցված է %1$s-ի միջոցով" "Հասանելի է %1$s-ի միջոցով" @@ -86,7 +86,7 @@ "Wi-Fi-ի ազդանշանը ուժեղ է:" "Android OS" "Հեռացված ծրագրեր" - "Հեռացված հավելվածներն ու օգտվողները" + "Հեռացված հավելվածներն ու օգտատերերը" "USB միացում" "Դյուրակիր թեժ կետ" "Bluetooth-ը կապվում է" @@ -95,7 +95,7 @@ "Բոլոր աշխատանքային հավելվածները" "Հյուր" "Անհայտ" - "Օգտվող՝ %1$s" + "Օտատեր՝ %1$s" "Որոշ կանխադրված կարգավորումներ կան" "Կանխադրված կարգավորումներ չկան" "Տեքստից-խոսք կարգավորումներ" @@ -143,10 +143,10 @@ "Ծրագրավորողի ընտրանքներ" "Միացնել մշակողի ընտրանքները" "Կարգավորել ընտրանքները ծրագրի ծրագրավորման համար" - "Ծրագրավորման ընտրանքներն այլևս հասանելի չեն այս օգտվողի համար" - "VPN-ի կարգավորումները հասանելի չեն այս օգտվողին" - "Միակցման կարգավորումները հասանելի չեն այս օգտվողին" - "Մատչման կետի անվան կարգավորումները հասանելի չեն այս օգտվողին" + "Ծրագրավորման ընտրանքներն այլևս հասանելի չեն այս օգտատիրոջ" + "VPN-ի կարգավորումները հասանելի չեն այս օգտատիրոջը" + "Միակցման կարգավորումները հասանելի չեն այս օգտատիրոջը" + "Մատչման կետի անվան կարգավորումները հասանելի չեն այս օգտատիրոջը" "USB վրիպազերծում" "Կարգաբերել ռեժիմը, երբ USB-ն միացված է" "Չեղարկել USB վրիպազերծման լիազորումները" @@ -170,7 +170,7 @@ "Միշտ թույլատրել Wi‑Fi ռոումինգի որոնումը" "Բջջային տվյալները՝ միշտ ակտիվացրած" "Անջատել ձայնի բացարձակ ուժգնությունը" - "Ցույց տալ անլար էկրանի վկայագրման ընտրանքները" + "Ցույց տալ անլար էկրանի հավաստագրման ընտրանքները" "Բարձրացնել մակարդակը, Wi‑Fi ընտրիչում ամեն մի SSID-ի համար ցույց տալ RSSI" "Եթե այս գործառույթը միացված է, Wi‑Fi-ի թույլ ազդանշանի դեպքում Wi‑Fi ինտերնետից անցումը բջջային ինտերնետին ավելի կտրուկ կլինի" "Թույլատրել/արգելել Wi‑Fi ռոումինգի որոնումը՝ կախված միջերեսում տվյալների երթևեկի ծավալից" @@ -246,7 +246,7 @@ "Կրկնաստեղծել երկրորդական էկրան" "Հավելվածներ" "Պետք չէ պահել գործողությունները" - "Ոչնչացնել ցանացած գործունեություն օգտվողի հեռացումից հետո" + "Ոչնչացնել ցանացած գործունեություն օգտատիրոջ հեռացումից հետո" "Հետնաշերտի գործընթացի սահմանաչափ" "Ցույց տալ բոլոր ANR-երը" "Ցուցադրել այն ծրագիրը, որը չի արձագանքում երկխոսությունը հետնաշերտի ծրագրերի համար" @@ -341,4 +341,7 @@ "Հատուկ (%d)" "Օգնություն և հետադարձ կապ" "Ընտրացանկ" + "Մուտքագրեք գաղտնաբառը՝ ցուցադրական ռեժիմում գործարանային վերակայում կատարելու համար" + "Հաջորդը" + "Պահանջվում է գաղտնաբառ" diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 0e0d32f0065d..6fe3ae259d18 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -140,10 +140,10 @@ "Pilih Profil" "Pribadi" "Kantor" - "Opsi pengembang" - "Aktifkan opsi pengembang" + "Opsi developer" + "Aktifkan opsi developer" "Menyetel opsi untuk pengembangan apl" - "Opsi pengembang tidak tersedia untuk pengguna ini" + "Opsi developer tidak tersedia untuk pengguna ini" "Setelan VPN tidak tersedia untuk pengguna ini" "Setelan Penambatan tidak tersedia untuk pengguna ini" "Setelan Nama Titik Akses tidak tersedia untuk pengguna ini" @@ -341,4 +341,7 @@ "(%d) khusus" "Bantuan & masukan" "Menu" + "Masukkan sandi untuk mengembalikan ke setelan pabrik dalam mode demo" + "Berikutnya" + "Perlu sandi" diff --git a/packages/SettingsLib/res/values-is-rIS/strings.xml b/packages/SettingsLib/res/values-is-rIS/strings.xml index d1c177bcd44d..f588300534f0 100644 --- a/packages/SettingsLib/res/values-is-rIS/strings.xml +++ b/packages/SettingsLib/res/values-is-rIS/strings.xml @@ -341,4 +341,7 @@ "Sérsniðið (%d)" "Hjálp og ábendingar" "Valmynd" + "Sláðu inn aðgangsorð til að framkvæma núllstillingu í sýnisútgáfu" + "Áfram" + "Aðgangsorðs krafist" diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index c566e79a7f0a..f60352d4e456 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -341,4 +341,7 @@ "Personalizzato (%d)" "Guida e feedback" "Menu" + "Inserisci la password per eseguire il ripristino dei dati di fabbrica in modalità demo" + "Avanti" + "Password obbligatoria" diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 4523380ca447..567f1ab5cdd2 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -341,4 +341,7 @@ "מותאם אישית (%d)" "עזרה ומשוב" "תפריט" + "הזן סיסמה כדי לבצע איפוס להגדרות היצרן במצב הדגמה" + "הבא" + "דרושה סיסמה" diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 1761adb503d8..06ab96c1f1c6 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -343,4 +343,7 @@ "カスタム(%d)" "ヘルプとフィードバック" "メニュー" + "デモモードで初期状態にリセットするには、パスワードを入力してください" + "次へ" + "パスワード必須" diff --git a/packages/SettingsLib/res/values-ka-rGE/strings.xml b/packages/SettingsLib/res/values-ka-rGE/strings.xml index a39d4b2ce0ec..97cc334f61ee 100644 --- a/packages/SettingsLib/res/values-ka-rGE/strings.xml +++ b/packages/SettingsLib/res/values-ka-rGE/strings.xml @@ -341,4 +341,7 @@ "მორგებული (%d)" "დახმარება და გამოხმაურება" "მენიუ" + "შეიყვანეთ პაროლი დემო-რეჟიმში ქარხნულ მდგომარეობაზე დასაბრუნებლად" + "შემდეგი" + "საჭიროა პაროლი" diff --git a/packages/SettingsLib/res/values-kk-rKZ/strings.xml b/packages/SettingsLib/res/values-kk-rKZ/strings.xml index c636feb73aa6..4bc9bd608410 100644 --- a/packages/SettingsLib/res/values-kk-rKZ/strings.xml +++ b/packages/SettingsLib/res/values-kk-rKZ/strings.xml @@ -341,4 +341,7 @@ "Арнаулы (%d)" "Анықтама және пікір" "Mәзір" + "Демо режимде зауыттық мәндерге қайтару үшін құпия сөзді енгізу" + "Келесі" + "Құпия сөз қажет" diff --git a/packages/SettingsLib/res/values-km-rKH/strings.xml b/packages/SettingsLib/res/values-km-rKH/strings.xml index 94ce5f159640..3a0857d6b12e 100644 --- a/packages/SettingsLib/res/values-km-rKH/strings.xml +++ b/packages/SettingsLib/res/values-km-rKH/strings.xml @@ -341,4 +341,7 @@ "ផ្ទាល់ខ្លួន (%d)" "ជំនួយ និងមតិស្ថាបនា" "ម៉ឺនុយ" + "បញ្ចូល​ពាក្យ​សម្ងាត់ ដើម្បី​កំណត់ឧបករណ៍​​ឡើង​វិញ​ដូចពេលចេញ​ពី​រោងចក្រ នៅក្នុង​មុខងារ​សាកល្បង" + "បន្ទាប់" + "តម្រូវ​ឲ្យ​មានពាក្យ​សម្ងាត់" diff --git a/packages/SettingsLib/res/values-kn-rIN/arrays.xml b/packages/SettingsLib/res/values-kn-rIN/arrays.xml index 5f6d69976932..bf2cc75163d5 100644 --- a/packages/SettingsLib/res/values-kn-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-kn-rIN/arrays.xml @@ -51,7 +51,7 @@ "ಎಂದಿಗೂ ಪರಿಶೀಲಿಸದಿರು" "DRM ವಿಷಯಗಳಿಗಾಗಿ ಮಾತ್ರ ಪರಿಶೀಲಿಸಿ" - "ಯಾವಾಗಲೂ ಪರಿಶೀಲಿಸು" + "ಯಾವಾಗಲೂ ಪರಿಶೀಲಿಸಿ" "HDCP ಪರಿಶೀಲನೆಯನ್ನು ಎಂದಿಗೂ ಬಳಸದಿರು" diff --git a/packages/SettingsLib/res/values-kn-rIN/strings.xml b/packages/SettingsLib/res/values-kn-rIN/strings.xml index ce10d356a2d3..8f726e5ea915 100644 --- a/packages/SettingsLib/res/values-kn-rIN/strings.xml +++ b/packages/SettingsLib/res/values-kn-rIN/strings.xml @@ -72,7 +72,7 @@ "ಇನ್‌ಪುಟ್‌ಗಾಗಿ ಬಳಸು" "ಜೋಡಿ" "ಜೋಡಿ ಮಾಡು" - "ರದ್ದುಮಾಡು" + "ರದ್ದುಮಾಡಿ" "ಸಂಪರ್ಕಪಡಿಸಿದಾಗ, ಜೋಡಿಸುವಿಕೆಯು ನಿಮ್ಮ ಸಂಪರ್ಕಗಳು ಮತ್ತು ಕರೆ ಇತಿಹಾಸಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುತ್ತದೆ." "%1$s ಜೊತೆಗೆ ಜೋಡಣೆ ಮಾಡಲಾಗಲಿಲ್ಲ." "ತಪ್ಪಾಗಿರುವ ಪಿನ್‌ ಅಥವಾ ಪಾಸ್‌ಕೀ ಕಾರಣದಿಂದಾಗಿ %1$s ಜೊತೆಗೆ ಜೋಡಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ." @@ -155,7 +155,7 @@ "ಎಚ್ಚರವಾಗಿರು" "ಚಾರ್ಜ್ ಮಾಡುವಾಗ ಪರದೆಯು ಎಂದಿಗೂ ನಿದ್ರಾವಸ್ಥೆಗೆ ಹೋಗುವುದಿಲ್ಲ" "ಬ್ಲೂಟೂತ್‌‌ HCI ಸ್ನೂಪ್‌ಲಾಗ್" - "ಫೈಲ್‌ನಲ್ಲಿ ಎಲ್ಲ bluetooth HCI ಪ್ಯಾಕೆಟ್‌ಗಳನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ" + "ಫೈಲ್‌ನಲ್ಲಿ ಎಲ್ಲ ಬ್ಲೂಟೂತ್ HCI ಪ್ಯಾಕೆಟ್‌ಗಳನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ" "OEM ಅನ್‌ಲಾಕ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ" "ಬೂಟ್‌ಲೋಡರ್‌ ಅನ್‌ಲಾಕ್‌ ಮಾಡಲು ಅನುಮತಿಸಿ" "OEM ಅನ್‌ಲಾಕ್‌ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದೇ?" @@ -341,4 +341,7 @@ "ಕಸ್ಟಮ್ (%d)" "ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ" "ಮೆನು" + "ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್‌ಗೆ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ" + "ಮುಂದೆ" + "ಪಾಸ್‌ವರ್ಡ್ ಅಗತ್ಯವಿದೆ" diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 6910b375d7a0..105f9703ae02 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -341,4 +341,7 @@ "맞춤(%d)" "고객센터" "메뉴" + "데모 모드에서 초기화하려면 비밀번호 입력" + "다음" + "비밀번호 입력 필요" diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml index 711551b01c74..2f71bd9ef512 100644 --- a/packages/SettingsLib/res/values-ky-rKG/strings.xml +++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml @@ -341,4 +341,7 @@ "Ыңгайлаштырылган (%d)" "Жардам жана жооп пикир" "Меню" + "Демо режиминде демейки жөндөөлөргө кайтаруу үчүн сырсөздү киргизиңиз" + "Кийинки" + "Сырсөз талап кылынат" diff --git a/packages/SettingsLib/res/values-lo-rLA/strings.xml b/packages/SettingsLib/res/values-lo-rLA/strings.xml index abf36e35891a..6dcedfe7ec60 100644 --- a/packages/SettingsLib/res/values-lo-rLA/strings.xml +++ b/packages/SettingsLib/res/values-lo-rLA/strings.xml @@ -341,4 +341,7 @@ "ປັບແຕ່ງເອງ (%d)" "ຊ່ວຍເຫຼືອ & ຄຳຕິຊົມ" "ເມນູ" + "Enter password to perform factory reset in demo mode" + "ຕໍ່ໄປ" + "​ຕ້ອງ​ໃສ່​ລະ​ຫັດ​ຜ່ານ" diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index cab29de0f6a1..69a1df4009c5 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -341,4 +341,7 @@ "Tinkintas (%d)" "Pagalba ir atsiliepimai" "Meniu" + "Įv. slapt. ir atk. gam. nust. dem. rež." + "Kitas" + "Būtina nurodyti slaptažodį" diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 90bf867403d0..4297af9e1d7a 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -341,4 +341,7 @@ "Pielāgots (%d)" "Palīdzība un atsauksmes" "Izvēlne" + "Iev. paroli, lai atiest. rūpnīcas iest. dem. režīmā" + "Tālāk" + "Nepieciešama parole" diff --git a/packages/SettingsLib/res/values-mk-rMK/strings.xml b/packages/SettingsLib/res/values-mk-rMK/strings.xml index 725a39d0a362..850a6551019a 100644 --- a/packages/SettingsLib/res/values-mk-rMK/strings.xml +++ b/packages/SettingsLib/res/values-mk-rMK/strings.xml @@ -341,4 +341,7 @@ "Приспособен (%d)" "Помош и повратни информации" "Мени" + "Внесете лозинка за фаб. ресет. во демо" + "Следно" + "Потребна е лозинка" diff --git a/packages/SettingsLib/res/values-ml-rIN/strings.xml b/packages/SettingsLib/res/values-ml-rIN/strings.xml index 01565acd2ceb..56b185cc82b7 100644 --- a/packages/SettingsLib/res/values-ml-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ml-rIN/strings.xml @@ -341,4 +341,7 @@ "ഇഷ്ടാനുസൃതം ( %d )" "സഹായവും പ്രതികരണവും" "മെനു" + "ഡെമോ ‌മോഡിൽ ഫാക്ടറി റീസെറ്റിന് പാസ്‌വേഡ് നൽകുക" + "അടുത്തത്" + "പാസ്‌വേഡ് ആവശ്യമാണ്" diff --git a/packages/SettingsLib/res/values-mn-rMN/strings.xml b/packages/SettingsLib/res/values-mn-rMN/strings.xml index 5121f4460ac3..1fe98c86471e 100644 --- a/packages/SettingsLib/res/values-mn-rMN/strings.xml +++ b/packages/SettingsLib/res/values-mn-rMN/strings.xml @@ -341,4 +341,7 @@ "Тогтмол утга (%d)" "Тусламж, санал хүсэлт" "Цэс" + "Үйлдвэрийн тохиргоог демо горимд ажиллуулахын тулд нууц үг оруулна уу" + "Дараагийн" + "Нууц үг шаардлагатай" diff --git a/packages/SettingsLib/res/values-mr-rIN/strings.xml b/packages/SettingsLib/res/values-mr-rIN/strings.xml index 5ee18d54dc09..789f16935244 100644 --- a/packages/SettingsLib/res/values-mr-rIN/strings.xml +++ b/packages/SettingsLib/res/values-mr-rIN/strings.xml @@ -341,4 +341,7 @@ "सानुकूल करा (%d)" "मदत आणि अभिप्राय" "मेनू" + "डेमो मोडमध्ये फॅक्टरी रीसेट करण्यासाठी संकेतशब्द प्रविष्ट करा" + "पुढील" + "संकेतशब्द आवश्यक" diff --git a/packages/SettingsLib/res/values-ms-rMY/strings.xml b/packages/SettingsLib/res/values-ms-rMY/strings.xml index fabfd637c6ed..0f7eba6ba68b 100644 --- a/packages/SettingsLib/res/values-ms-rMY/strings.xml +++ b/packages/SettingsLib/res/values-ms-rMY/strings.xml @@ -341,4 +341,7 @@ "Tersuai (%d)" "Bantuan & maklum balas" "Menu" + "Mskkn kta laluan utk ttpn sml kilang dlm mod demo" + "Seterusnya" + "Kata laluan diperlukan" diff --git a/packages/SettingsLib/res/values-my-rMM/strings.xml b/packages/SettingsLib/res/values-my-rMM/strings.xml index 571a93133677..fae52cde8177 100644 --- a/packages/SettingsLib/res/values-my-rMM/strings.xml +++ b/packages/SettingsLib/res/values-my-rMM/strings.xml @@ -341,4 +341,7 @@ "စိတ်ကြိုက် (%d)" "အကူအညီနှင့် အကြံပြုချက်" "မီနူး" + "ဒီမိုမုဒ်၌မူလဆက်တင်ထားရန် စကားဝှက်ထည့်ပါ" + "ရှေ့သို့" + "စကားဝှက် လိုအပ်သည်" diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 834c849a227f..8b23f4846450 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -341,4 +341,7 @@ "Egendefinert (%d)" "Hjelp og tilbakemelding" "Meny" + "Skriv inn passordet for å tilbakestille til fabrikkstandard i demomodus" + "Neste" + "Passord er obligatorisk" diff --git a/packages/SettingsLib/res/values-ne-rNP/strings.xml b/packages/SettingsLib/res/values-ne-rNP/strings.xml index 01b39a0308fb..a4af10aaa5dd 100644 --- a/packages/SettingsLib/res/values-ne-rNP/strings.xml +++ b/packages/SettingsLib/res/values-ne-rNP/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "सञ्जालका लागि स्क्यान गर्न सक्दैन" "कुनै पनि होइन" - "बचत गरियो" + "सुरक्षित गरियो" "असक्षम पारियो" "IP विन्यास असफल" "वाईफाई जडान असफल" @@ -338,7 +338,10 @@ "ठूलो" "अझ ठूलो" "सबैभन्दा ठूलो" - "अनुकूलन (%d)" + "आफू अनुकूल (%d)" "मद्दत र प्रतिक्रिया" "मेनु" + "डेमो मोडमा फ्याक्ट्री रिसेट गर्न पासवर्ड प्रविष्ट गर्नुहोस्" + "अर्को" + "पासवर्ड आवश्यक छ" 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 @@ "Nooit controleren" - "Alleen controleren op DRM-inhoud" + "Alleen controleren op DRM-content" "Altijd controleren" "HDCP-controle nooit gebruiken" - "HDCP-controle alleen voor DRM-inhoud gebruiken" + "HDCP-controle alleen voor DRM-content gebruiken" "HDCP-controle altijd gebruiken" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index feb78df79078..7d7da84d155f 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -132,10 +132,10 @@ "Normaal" "Snel" "Sneller" - "Zeer snel" - "Vlug" - "Zeer vlug" - "Snelst" + "Nog sneller" + "Heel erg snel" + "Snelst" + "Allerallersnelst" "Profiel kiezen" "Persoonlijk" @@ -168,7 +168,7 @@ "Uitgebreide wifi-logregistratie insch." "Agressieve handover van wifi naar mobiel" "Altijd roamingscans voor wifi toestaan" - "Mobiele gegevens altijd actief" + "Mobiele data altijd actief" "Absoluut volume uitschakelen" "Opties weergeven voor certificering van draadloze weergave" "Logniveau voor wifi verhogen, weergeven per SSID RSSI in wifi-kiezer" @@ -325,7 +325,7 @@ "Ingesteld door beheerder" "Ingeschakeld door beheerder" "Uitgeschakeld door beheerder" - "Startpagina voor instellingen" + "Homepage voor instellingen" "0%" "50%" @@ -341,4 +341,7 @@ "Aangepast (%d)" "Help en feedback" "Menu" + "Geef wachtwoord op om terug te zetten op fabrieksinstellingen in demomodus" + "Volgende" + "Wachtwoord vereist" diff --git a/packages/SettingsLib/res/values-pa-rIN/strings.xml b/packages/SettingsLib/res/values-pa-rIN/strings.xml index f21ee6df9385..052e45bc9c43 100644 --- a/packages/SettingsLib/res/values-pa-rIN/strings.xml +++ b/packages/SettingsLib/res/values-pa-rIN/strings.xml @@ -341,4 +341,7 @@ "ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ (%d)" "ਮਦਦ ਅਤੇ ਪ੍ਰਤੀਕਰਮ" "ਮੀਨੂ" + "ਡੈਮੋ ਮੋਡ \'ਚ ਫੈਕਟਰੀ ਰੀਸੈੱਟ ਲਈ ਪਾਸਵਰਡ ਦਿਓ" + "ਅੱਗੇ" + "ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੈ" diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index bcdf81293e2d..b2a8fccdeef8 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -341,4 +341,7 @@ "Niestandardowe (%d)" "Pomoc i opinie" "Menu" + "Wpisz hasło, by przywrócić ustawienia fabryczne w trybie demonstracyjnym" + "Dalej" + "Wymagane hasło" diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index ef4ec778ee04..54563c141296 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -341,4 +341,7 @@ "Personalizada (%d)" "Ajuda e feedback" "Menu" + "Digite a senha para redef. p/ configuração original em modo demo" + "Próxima" + "Senha necessária" diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index b6e9b4f35a97..77aa19b97cb2 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -341,4 +341,7 @@ "Personalizado (%d)" "Ajuda e comentários" "Menu" + "Introduzir palavra-passe para efetuar a reposição de fábrica no modo demo" + "Próximo" + "Palavra-passe obrigatória" diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index ef4ec778ee04..54563c141296 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -341,4 +341,7 @@ "Personalizada (%d)" "Ajuda e feedback" "Menu" + "Digite a senha para redef. p/ configuração original em modo demo" + "Próxima" + "Senha necessária" diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index a5ee78ae2c2c..2730406d707e 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -341,4 +341,7 @@ "Personalizat (%d)" "Ajutor și feedback" "Meniu" + "Introduceți parola pentru a reveni la setările din fabrică în modul demo" + "Înainte" + "Trebuie să introduceți o parolă" diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index b24a705ba106..dcd335020414 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -341,4 +341,7 @@ "Другой (%d)" "Справка/отзыв" "Меню" + "Чтобы сбросить настройки в деморежиме, введите пароль." + "Далее" + "Требуется пароль" diff --git a/packages/SettingsLib/res/values-si-rLK/strings.xml b/packages/SettingsLib/res/values-si-rLK/strings.xml index e3acfaee3fe8..0d5ef4d9aa48 100644 --- a/packages/SettingsLib/res/values-si-rLK/strings.xml +++ b/packages/SettingsLib/res/values-si-rLK/strings.xml @@ -341,4 +341,7 @@ "අභිරුචි (%d)" "උදව් සහ ප්‍රතිපෝෂණ" "මෙනුව" + "ආදර්ශන ප්‍රකාර කර්මාන්තශාලා යළි සැකසීමට මුරපදය ඇ. ක." + "ඊළඟ" + "මුරපදය අවශ්‍යයි" diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 74a2b4693eb0..3880dbfc1afd 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -341,4 +341,7 @@ "Vlastné (%d)" "Pomocník a spätná väzba" "Ponuka" + "Zadajte heslo na obnovenie továrenských nastavení v režime ukážky" + "Ďalej" + "Vyžaduje sa heslo" diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 788b97ce5714..f74a2e23681f 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -341,4 +341,7 @@ "Po meri (%d)" "Pomoč in povratne informacije" "Meni" + "Geslo za tovar. nast. v predstav. načinu" + "Naprej" + "Vnesite geslo" diff --git a/packages/SettingsLib/res/values-sq-rAL/strings.xml b/packages/SettingsLib/res/values-sq-rAL/strings.xml index d6419ddabc5a..1b5c4a2f9528 100644 --- a/packages/SettingsLib/res/values-sq-rAL/strings.xml +++ b/packages/SettingsLib/res/values-sq-rAL/strings.xml @@ -341,4 +341,7 @@ "I personalizuar (%d)" "Ndihma dhe komentet" "Menyja" + "Fut fjalëkalimin për të kryer rivendosje në gjendje fabrike në modalitetin e demonstrimit" + "Përpara" + "Kërkohet fjalëkalimi" diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index f8b3b4bccd3c..ccb6517276b7 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -341,4 +341,7 @@ "Прилагођени (%d)" "Помоћ и повратне информације" "Мени" + "Унесите лозинку да бисте обавили ресетовање на фабричка подешавања у режиму демонстрације" + "Даље" + "Потребна је лозинка" diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 389e03a82889..e7feb03b865f 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -341,4 +341,7 @@ "Anpassad (%d)" "Hjälp och feedback" "Meny" + "Ange lösenord och utför fabriksåterställning i demoläge" + "Nästa" + "Lösenord krävs" diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index ff6687cc78f4..466eb7605395 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -341,4 +341,7 @@ "Kiwango maalum (%d)" "Usaidizi na maoni" "Menyu" + "Weka nenosiri ili urejeshe mipangilio ya kiwandani ikiwa katika hali ya onyesho." + "Inayofuata" + "Nenosiri linahitajika" diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml index 86f58fc83e61..6c5d34e9bb4b 100644 --- a/packages/SettingsLib/res/values-ta-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml @@ -341,4 +341,7 @@ "தனிப்பயன் (%d)" "உதவி & கருத்து" "மெனு" + "டெமோ பயன்முறையில் ஆரம்பநிலை மீட்டமைவைச் செயல்படுத்த, கடவுச்சொல்லை உள்ளிடவும்" + "அடுத்து" + "கடவுச்சொல் தேவை" diff --git a/packages/SettingsLib/res/values-te-rIN/strings.xml b/packages/SettingsLib/res/values-te-rIN/strings.xml index 13265760eaf9..00d818b021be 100644 --- a/packages/SettingsLib/res/values-te-rIN/strings.xml +++ b/packages/SettingsLib/res/values-te-rIN/strings.xml @@ -341,4 +341,7 @@ "అనుకూలం (%d)" "సహాయం & అభిప్రాయం" "మెను" + "డెమో మోడ్‌లో ఫ్యాక్టరీ రీసెట్‌ను నిర్వహించడానికి పాస్‌వర్డ్‌ను నమోదు చేయండి" + "తదుపరి" + "పాస్‌వర్డ్ అవసరం" diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 5d302d08e89c..6fecb2caffc6 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -341,4 +341,7 @@ "กำหนดเอง (%d)" "ความช่วยเหลือและความคิดเห็น" "เมนู" + "ป้อนรหัสผ่านเพื่อรีเซ็ตค่าในโหมดสาธิต" + "ถัดไป" + "ต้องป้อนรหัสผ่าน" diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index c2232ee76e96..aa0c66792917 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -341,4 +341,7 @@ "Custom (%d)" "Tulong at feedback" "Menu" + "Ilagay ang password upang mag-factory reset sa demo mode" + "Susunod" + "Kinakailangan ang password" diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 2541a3f6bc31..06e0f2b40ef3 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -341,4 +341,7 @@ "Özel (%d)" "Yardım ve geri bildirim" "Menü" + "Demo modunda sıfırlamak için şifreyi girin" + "Sonraki" + "Şifre gerekli" diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 1829677eaf9d..dd45ec618a5c 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -341,4 +341,7 @@ "Спеціальний масштаб (%d)" "Довідка й відгуки" "Меню" + "Введіть пароль, щоб скинути налаштування в демо-режимі" + "Далі" + "Потрібен пароль" diff --git a/packages/SettingsLib/res/values-ur-rPK/strings.xml b/packages/SettingsLib/res/values-ur-rPK/strings.xml index 8bcf20b241d2..3299db84b5a5 100644 --- a/packages/SettingsLib/res/values-ur-rPK/strings.xml +++ b/packages/SettingsLib/res/values-ur-rPK/strings.xml @@ -341,4 +341,7 @@ "حسب ضرورت (%d)" "مدد اور تاثرات" "مینو" + "ڈیمو موڈ میں فیکٹری ری سیٹ کیلئے پاس ورڈ درج کریں" + "اگلا" + "پاس ورڈ درکار ہے" diff --git a/packages/SettingsLib/res/values-uz-rUZ/strings.xml b/packages/SettingsLib/res/values-uz-rUZ/strings.xml index a0c72a09e184..4fd51ee3574a 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/strings.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/strings.xml @@ -230,7 +230,7 @@ "OpenGL trassasini yoqish" "Audio uzatishni o‘ch. qo‘yish (USB)" "Tashqi USB qurilmaga avto-yo‘naltirishni o‘ch. qo‘yish" - "Elementlar chegarasini ko‘rsatish" + "Elementlar hoshiyasi" "Klip, maydon va h.k. chegaralarini ko‘rsatish" "O‘ngdan chapga qarab yozish" "Barcha tillarda o‘ngdan chapga qarab yozish" @@ -341,4 +341,7 @@ "Moslashtirilgan (%d)" "Yordam va fikr-mulohaza" "Menyu" + "Demo rejimda zavod holatiga qaytarish uchun parolni kiriting" + "Keyingisi" + "Parolni kiritish zarur" diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index b99117768d33..77192c31829f 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -341,4 +341,7 @@ "Tùy chỉnh (%d)" "Trợ giúp và phản hồi" "Menu" + "Nhập mật khẩu để tiến hành khôi phục cài đặt gốc ở chế độ trình diễn" + "Tiếp theo" + "Yêu cầu mật khẩu" diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 29c4c7313c6f..516e634ce639 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -341,4 +341,7 @@ "自定义 (%d)" "帮助和反馈" "菜单" + "输入密码即可在演示模式下恢复出厂设置" + "下一步" + "需要输入密码" diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index c77b7864ace6..f64acfe52761 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -339,6 +339,9 @@ "較大" "最大" "自訂 (%d)" - "說明與意見反映" + "說明和意見反映" "選單" + "輸入密碼即可在示範模式下重設原廠設定" + "下一步" + "請輸入密碼" diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index fb180ff59659..ae2f5e08b07f 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -341,4 +341,7 @@ "自訂 (%d)" "說明與意見回饋" "選單" + "如要在示範模式中恢復原廠設定,請輸入密碼" + "下一步" + "請輸入密碼" diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 2f9d4282386d..dcf7c3d51f2c 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -341,4 +341,7 @@ "Ngokwezifiso (%d)" "Usizo nempendulo" "Imenyu" + "Faka iphasiwedi ukuze wenze ukusetha kwefekthri kumodi yedemo" + "Okulandelayo" + "Iphasiwedi iyadingeka" diff --git a/packages/SettingsLib/res/values/config.xml b/packages/SettingsLib/res/values/config.xml index 0aa76a024d5b..64f21b50c0bc 100755 --- a/packages/SettingsLib/res/values/config.xml +++ b/packages/SettingsLib/res/values/config.xml @@ -38,6 +38,12 @@ + + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index bc6a226e59ee..02530e0db5eb 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -869,4 +869,10 @@ Menu + + Enter password to perform factory reset in demo mode + + Next + + Password required diff --git a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java index 381f903a9701..e7c8c0b975b0 100644 --- a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java @@ -185,12 +185,18 @@ public static void addIntentParameters(Context context, Intent intent, String ba {resources.getString(R.string.config_helpPackageNameKey)}; String[] packageNameValue = {resources.getString(R.string.config_helpPackageNameValue)}; - String intentExtraKey = + String helpIntentExtraKey = resources.getString(R.string.config_helpIntentExtraKey); - String intentNameKey = + String helpIntentNameKey = resources.getString(R.string.config_helpIntentNameKey); - intent.putExtra(intentExtraKey, packageNameKey); - intent.putExtra(intentNameKey, packageNameValue); + String feedbackIntentExtraKey = + resources.getString(R.string.config_feedbackIntentExtraKey); + String feedbackIntentNameKey = + resources.getString(R.string.config_feedbackIntentNameKey); + intent.putExtra(helpIntentExtraKey, packageNameKey); + intent.putExtra(helpIntentNameKey, packageNameValue); + intent.putExtra(feedbackIntentExtraKey, packageNameKey); + intent.putExtra(feedbackIntentNameKey, packageNameValue); } intent.putExtra(EXTRA_THEME, 1 /* Light, dark action bar */); TypedArray array = context.obtainStyledAttributes(new int[]{android.R.attr.colorPrimary}); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java index 8dc48b3394c7..657f33949bec 100755 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java @@ -270,16 +270,16 @@ public void onReceive(Context context, Intent intent, if (cachedDevice == null) { Log.w(TAG, "CachedBluetoothDevice for device " + device + " not found, calling readPairedDevices()."); - if (!readPairedDevices()) { - Log.e(TAG, "Got bonding state changed for " + device + - ", but we have no record of that device."); - return; + if (readPairedDevices()) { + cachedDevice = mDeviceManager.findDevice(device); } - cachedDevice = mDeviceManager.findDevice(device); + if (cachedDevice == null) { - Log.e(TAG, "Got bonding state changed for " + device + - ", but device not added in cache."); - return; + Log.w(TAG, "Got bonding state changed for " + device + + ", but we have no record of that device."); + + cachedDevice = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, device); + dispatchDeviceAdded(cachedDevice); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java new file mode 100644 index 000000000000..ca8edf5513fd --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/PrivateStorageInfo.java @@ -0,0 +1,81 @@ +/* + * 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.settingslib.deviceinfo; + +import android.os.storage.StorageManager; +import android.os.storage.VolumeInfo; +import android.util.Log; + +import java.io.File; +import java.util.Objects; + +/** + * PrivateStorageInfo provides information about the total and free storage on the device. + */ +public class PrivateStorageInfo { + private static final String TAG = "PrivateStorageInfo"; + public final long freeBytes; + public final long totalBytes; + + private PrivateStorageInfo(long freeBytes, long totalBytes) { + this.freeBytes = freeBytes; + this.totalBytes = totalBytes; + } + + public static PrivateStorageInfo getPrivateStorageInfo(StorageVolumeProvider sm) { + long totalInternalStorage = sm.getPrimaryStorageSize(); + long privateFreeBytes = 0; + long privateTotalBytes = 0; + for (VolumeInfo info : sm.getVolumes()) { + final File path = info.getPath(); + if (info.getType() != VolumeInfo.TYPE_PRIVATE || path == null) { + continue; + } + privateTotalBytes += getTotalSize(info, totalInternalStorage); + privateFreeBytes += path.getFreeSpace(); + } + return new PrivateStorageInfo(privateFreeBytes, privateTotalBytes); + } + + /** + * Returns the total size in bytes for a given volume info. + * @param info Info of the volume to check. + * @param totalInternalStorage Total number of bytes in the internal storage to use if the + * volume is the internal disk. + */ + public static long getTotalSize(VolumeInfo info, long totalInternalStorage) { + // Device could have more than one primary storage, which could be located in the + // internal flash (UUID_PRIVATE_INTERNAL) or in an external disk. + // If it's internal, try to get its total size from StorageManager first + // (totalInternalStorage), because that size is more precise because it accounts for + // the system partition. + if (info.getType() == VolumeInfo.TYPE_PRIVATE + && Objects.equals(info.getFsUuid(), StorageManager.UUID_PRIVATE_INTERNAL) + && totalInternalStorage > 0) { + return totalInternalStorage; + } else { + final File path = info.getPath(); + if (path == null) { + // Should not happen, caller should have checked. + Log.e(TAG, "info's path is null on getTotalSize(): " + info); + return 0; + } + return path.getTotalSpace(); + } + } + +} diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java new file mode 100644 index 000000000000..de762791a0a9 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageManagerVolumeProvider.java @@ -0,0 +1,44 @@ +/* + * 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.settingslib.deviceinfo; + +import android.os.storage.StorageManager; +import android.os.storage.VolumeInfo; + +import java.util.List; + +/** + * StorageManagerVolumeProvider is a thin wrapper around the StorageManager to provide insight into + * the storage volumes on a device. + */ +public class StorageManagerVolumeProvider implements StorageVolumeProvider { + private StorageManager mStorageManager; + + public StorageManagerVolumeProvider(StorageManager sm) { + mStorageManager = sm; + } + + @Override + public long getPrimaryStorageSize() { + return mStorageManager.getPrimaryStorageSize(); + } + + @Override + public List getVolumes() { + return mStorageManager.getVolumes(); + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java new file mode 100644 index 000000000000..95bb18d19188 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageVolumeProvider.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.deviceinfo; + +import android.os.storage.VolumeInfo; + +import java.util.List; + +/** + * StorageVolumeProvider provides access to the storage volumes on a device for free space + * calculations. + */ +public interface StorageVolumeProvider { + /** + * Returns the number of bytes of total storage on the primary storage. + */ + long getPrimaryStorageSize(); + + /** + * Returns a list of VolumeInfos for the device. + */ + List getVolumes(); +} diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 234ae712c49e..28575a9c6dec 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -790,16 +790,19 @@ public static String getSummary(Context context, String ssid, DetailedState stat if (state == DetailedState.CONNECTED) { IWifiManager wifiManager = IWifiManager.Stub.asInterface( ServiceManager.getService(Context.WIFI_SERVICE)); - Network nw; + NetworkCapabilities nc = null; try { - nw = wifiManager.getCurrentNetwork(); - } catch (RemoteException e) { - nw = null; - } - NetworkCapabilities nc = cm.getNetworkCapabilities(nw); - if (nc != null && !nc.hasCapability(nc.NET_CAPABILITY_VALIDATED)) { - return context.getString(R.string.wifi_connected_no_internet); + nc = cm.getNetworkCapabilities(wifiManager.getCurrentNetwork()); + } catch (RemoteException e) {} + + if (nc != null) { + if (nc.hasCapability(nc.NET_CAPABILITY_CAPTIVE_PORTAL)) { + return context.getString( + com.android.internal.R.string.network_available_sign_in); + } else if (!nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { + return context.getString(R.string.wifi_connected_no_internet); + } } } if (state == null) { diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/HelpUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/HelpUtilsTest.java new file mode 100644 index 000000000000..5d843c1a80ca --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/HelpUtilsTest.java @@ -0,0 +1,130 @@ +/* + * 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.settingslib; + +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.content.res.TypedArray; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.when; + +/** + * Tests for {@link HelpUtils}. + */ +@RunWith(RobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class HelpUtilsTest { + private static final String PACKAGE_NAME_KEY = "package-name-key"; + private static final String PACKAGE_NAME_VALUE = "package-name-value"; + private static final String HELP_INTENT_EXTRA_KEY = "help-intent-extra"; + private static final String HELP_INTENT_NAME_KEY = "help-intent-name"; + private static final String FEEDBACK_INTENT_EXTRA_KEY = "feedback-intent-extra"; + private static final String FEEDBACK_INTENT_NAME_KEY = "feedback-intent-name"; + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Context mContext; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mContext.getResources().getString(R.string.config_helpPackageNameKey)) + .thenReturn(PACKAGE_NAME_KEY); + when(mContext.getResources().getString(R.string.config_helpPackageNameValue)) + .thenReturn(PACKAGE_NAME_VALUE); + when(mContext.getResources().getString(R.string.config_helpIntentExtraKey)) + .thenReturn(HELP_INTENT_EXTRA_KEY); + when(mContext.getResources().getString(R.string.config_helpIntentNameKey)) + .thenReturn(HELP_INTENT_NAME_KEY); + when(mContext.getResources().getString(R.string.config_feedbackIntentExtraKey)) + .thenReturn(FEEDBACK_INTENT_EXTRA_KEY); + when(mContext.getResources().getString(R.string.config_feedbackIntentNameKey)) + .thenReturn(FEEDBACK_INTENT_NAME_KEY); + + } + + @Test + public void addIntentParameters_configTrue_argumentTrue() { + when(mContext.getResources().getBoolean(R.bool.config_sendPackageName)).thenReturn(true); + Intent intent = new Intent(); + + HelpUtils.addIntentParameters( + mContext, intent, null /* backupContext */, true /* sendPackageName */); + + assertThat(intent.getStringArrayExtra(HELP_INTENT_EXTRA_KEY)).asList() + .containsExactly(PACKAGE_NAME_KEY); + assertThat(intent.getStringArrayExtra(HELP_INTENT_NAME_KEY)).asList() + .containsExactly(PACKAGE_NAME_VALUE); + assertThat(intent.getStringArrayExtra(FEEDBACK_INTENT_EXTRA_KEY)).asList() + .containsExactly(PACKAGE_NAME_KEY); + assertThat(intent.getStringArrayExtra(FEEDBACK_INTENT_NAME_KEY)).asList() + .containsExactly(PACKAGE_NAME_VALUE); + } + + @Test + public void addIntentParameters_configTrue_argumentFalse() { + when(mContext.getResources().getBoolean(R.bool.config_sendPackageName)).thenReturn(true); + Intent intent = new Intent(); + + HelpUtils.addIntentParameters( + mContext, intent, null /* backupContext */, false /* sendPackageName */); + + assertThat(intent.hasExtra(HELP_INTENT_EXTRA_KEY)).isFalse(); + assertThat(intent.hasExtra(HELP_INTENT_NAME_KEY)).isFalse(); + assertThat(intent.hasExtra(FEEDBACK_INTENT_EXTRA_KEY)).isFalse(); + assertThat(intent.hasExtra(FEEDBACK_INTENT_NAME_KEY)).isFalse(); + } + + @Test + public void addIntentParameters_configFalse_argumentTrue() { + when(mContext.getResources().getBoolean(R.bool.config_sendPackageName)).thenReturn(false); + Intent intent = new Intent(); + + HelpUtils.addIntentParameters( + mContext, intent, null /* backupContext */, true /* sendPackageName */); + + assertThat(intent.hasExtra(HELP_INTENT_EXTRA_KEY)).isFalse(); + assertThat(intent.hasExtra(HELP_INTENT_NAME_KEY)).isFalse(); + assertThat(intent.hasExtra(FEEDBACK_INTENT_EXTRA_KEY)).isFalse(); + assertThat(intent.hasExtra(FEEDBACK_INTENT_NAME_KEY)).isFalse(); + } + + @Test + public void addIntentParameters_configFalse_argumentFalse() { + when(mContext.getResources().getBoolean(R.bool.config_sendPackageName)).thenReturn(false); + Intent intent = new Intent(); + + HelpUtils.addIntentParameters( + mContext, intent, null /* backupContext */, false /* sendPackageName */); + + assertThat(intent.hasExtra(HELP_INTENT_EXTRA_KEY)).isFalse(); + assertThat(intent.hasExtra(HELP_INTENT_NAME_KEY)).isFalse(); + assertThat(intent.hasExtra(FEEDBACK_INTENT_EXTRA_KEY)).isFalse(); + assertThat(intent.hasExtra(FEEDBACK_INTENT_NAME_KEY)).isFalse(); + } +} diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 1a22e882b86b..5bd4a3bf0d24 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -69,6 +69,7 @@ 1 /system/media/audio/ui/LowBattery.ogg 0 + 0 /system/media/audio/ui/Dock.ogg /system/media/audio/ui/Undock.ogg /system/media/audio/ui/Dock.ogg @@ -155,6 +156,9 @@ 400 + + 300 + false diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 379e334ac381..4b25d05ab0c5 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -2678,6 +2678,8 @@ private void loadGlobalSettings(SQLiteDatabase db) { R.string.def_low_battery_sound); loadIntegerSetting(stmt, Settings.Global.DOCK_SOUNDS_ENABLED, R.integer.def_dock_sounds_enabled); + loadIntegerSetting(stmt, Settings.Global.DOCK_SOUNDS_ENABLED_WHEN_ACCESSIBILITY, + R.integer.def_dock_sounds_enabled_when_accessibility); loadStringSetting(stmt, Settings.Global.DESK_DOCK_SOUND, R.string.def_desk_dock_sound); loadStringSetting(stmt, Settings.Global.DESK_UNDOCK_SOUND, diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index cae6451ae6b9..faf18078d7ab 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2107,7 +2107,7 @@ public void handleMessage(Message msg) { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 131; + private static final int SETTINGS_VERSION = 132; private final int mUserId; @@ -2623,6 +2623,22 @@ private int onUpgradeLocked(int userId, int oldVersion, int newVersion) { currentVersion = 131; } + if (currentVersion == 131) { + // Initialize new multi-press timeout to default value + final SettingsState systemSecureSettings = getSecureSettingsLocked(userId); + final String oldValue = systemSecureSettings.getSettingLocked( + Settings.Secure.MULTI_PRESS_TIMEOUT).getValue(); + if (TextUtils.equals(null, oldValue)) { + systemSecureSettings.insertSettingLocked( + Settings.Secure.MULTI_PRESS_TIMEOUT, + String.valueOf(getContext().getResources().getInteger( + R.integer.def_multi_press_timeout_millis)), + SettingsState.SYSTEM_PACKAGE_NAME); + } + + currentVersion = 132; + } + if (currentVersion != newVersion) { Slog.wtf("SettingsProvider", "warning: upgrading settings database to version " + newVersion + " left it at " diff --git a/packages/Shell/res/values-da/strings.xml b/packages/Shell/res/values-da/strings.xml index 3675eebd6b40..801b40e4cc9c 100644 --- a/packages/Shell/res/values-da/strings.xml +++ b/packages/Shell/res/values-da/strings.xml @@ -23,8 +23,8 @@ "Vent et øjeblik…" "Fejlrapporten vises på telefonen om et øjeblik" "Tryk for at dele din fejlrapport" - "Tryk for at dele din fejlrapport uden et skærmbillede, eller vent på, at skærmbilledet fuldføres" - "Tryk for at dele din fejlrapport uden et skærmbillede, eller vent på, at skærmbilledet fuldføres" + "Tryk for at dele din fejlrapport uden et screenshot, eller vent på, at screenshott fuldføres" + "Tryk for at dele din fejlrapport uden et screenshot, eller vent på, at screenshott fuldføres" "Fejlrapporter indeholder data fra systemets forskellige logfiler, som kan være data, du mener er følsomme, f.eks. appforbrug og placeringsdata. Del kun fejlrapporter med personer og apps, du har tillid til." "Vis ikke igen" "Fejlrapporter" @@ -32,9 +32,9 @@ "Oplysningerne i fejlrapporten kunne ikke føjes til zip-filen" "ikke navngivet" "Oplysninger" - "Skærmbillede" - "Der blev taget et skærmbillede." - "Der kunne ikke tages et skærmbillede." + "Screenshot" + "Der blev taget et screenshot." + "Der kunne ikke tages et screenshot." "Oplysninger om fejlrapporten #%d" "Filnavn" "Fejlrapportens titel" 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 @@ "Hata raporuna ayrıntılar ekleniyor" "Lütfen bekleyin…" "Hata raporu kısa süre içinde telefonda görüntülenecektir" - "Hata raporunuzu paylaşmak için hafifçe dokunun" + "Hata raporunuzu paylaşmak için dokunun" "Hata raporunu ekran görüntüsüz paylaşmak için dokunun veya bitirmek için ekran görüntüsünü bekleyin" "Hata raporunu ekran görüntüsüz paylaşmak için dokunun veya bitirmek için ekran görüntüsünü bekleyin" "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." diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index ef9712e66662..75cf95312dd0 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -257,7 +257,7 @@ android:resumeWhilePausing="true" android:screenOrientation="behind" android:resizeableActivity="true" - android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout" + android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|keyboard|keyboardHidden" android:theme="@style/RecentsTheme.Wallpaper"> diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-hdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-hdpi/ic_sysbar_back.png new file mode 100644 index 000000000000..74f9256340c3 Binary files /dev/null and b/packages/SystemUI/res/drawable-ldrtl-sw900dp-hdpi/ic_sysbar_back.png differ diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-mdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-mdpi/ic_sysbar_back.png new file mode 100644 index 000000000000..4de10b6dc5d7 Binary files /dev/null and b/packages/SystemUI/res/drawable-ldrtl-sw900dp-mdpi/ic_sysbar_back.png differ diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back.png new file mode 100644 index 000000000000..965d2f5f4063 Binary files /dev/null and b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xhdpi/ic_sysbar_back.png differ diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxhdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxhdpi/ic_sysbar_back.png new file mode 100644 index 000000000000..a123262566a0 Binary files /dev/null and b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxhdpi/ic_sysbar_back.png differ diff --git a/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxxhdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxxhdpi/ic_sysbar_back.png new file mode 100644 index 000000000000..0a95ddda616a Binary files /dev/null and b/packages/SystemUI/res/drawable-ldrtl-sw900dp-xxxhdpi/ic_sysbar_back.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back.png new file mode 100644 index 000000000000..1e2c75196c42 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_ime.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_ime.png new file mode 100644 index 000000000000..fac2da82faba Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_back_ime.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..63739b9dec30 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_home.png new file mode 100644 index 000000000000..bb24c8bbe10a Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_home.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_menu.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_menu.png new file mode 100644 index 000000000000..711fd7a5db48 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_menu.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_recent.png new file mode 100644 index 000000000000..bbb00a0c986e Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-hdpi/ic_sysbar_recent.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-land-hdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-land-hdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..43f77c0456c0 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-land-hdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-land-mdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-land-mdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..872af0933db3 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-land-mdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..ea7ac9361471 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-land-xhdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-land-xxhdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-land-xxhdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..fe07f814e3d2 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-land-xxhdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-land-xxxhdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-land-xxxhdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..4193b218219a Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-land-xxxhdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back.png new file mode 100644 index 000000000000..56c26383c36c Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_ime.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_ime.png new file mode 100644 index 000000000000..c3aa434e945c Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_back_ime.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..41a7209d28f9 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_home.png new file mode 100644 index 000000000000..faaef603d947 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_home.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_menu.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_menu.png new file mode 100644 index 000000000000..c8e40d086072 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_menu.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_recent.png new file mode 100644 index 000000000000..26124850f62e Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-mdpi/ic_sysbar_recent.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back.png new file mode 100644 index 000000000000..3b831a3cd619 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_ime.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_ime.png new file mode 100644 index 000000000000..3c377827f516 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_back_ime.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..b2baa099aca6 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home.png new file mode 100644 index 000000000000..37590a5381b6 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_home.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_menu.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_menu.png new file mode 100644 index 000000000000..4940d5c4f78b Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_menu.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent.png new file mode 100644 index 000000000000..7ad2a29cce6a Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xhdpi/ic_sysbar_recent.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_ime.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_ime.png new file mode 100644 index 000000000000..6fb19aedf5ba Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_ime.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_light_old.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_light_old.png new file mode 100644 index 000000000000..b336ccd2b5a1 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_back_light_old.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..49d2c3a3cde1 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_home.png new file mode 100644 index 000000000000..216f2c77dd9f Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_home.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_menu.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_menu.png new file mode 100644 index 000000000000..a8c2786cb348 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_menu.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_recent.png new file mode 100644 index 000000000000..ca35888dec13 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxhdpi/ic_sysbar_recent.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back.png new file mode 100644 index 000000000000..4d239564a5f5 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_ime.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_ime.png new file mode 100644 index 000000000000..74abc313b89c Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_back_ime.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_docked.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_docked.png new file mode 100644 index 000000000000..89bed92dd17c Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_docked.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_home.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_home.png new file mode 100644 index 000000000000..8d4f5f3048e7 Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_home.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_menu.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_menu.png new file mode 100644 index 000000000000..83e96a2f095c Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_menu.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_recent.png b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_recent.png new file mode 100644 index 000000000000..636c0c15f76b Binary files /dev/null and b/packages/SystemUI/res/drawable-sw900dp-xxxhdpi/ic_sysbar_recent.png differ diff --git a/packages/SystemUI/res/drawable-sw900dp/ic_ime_switcher_default.xml b/packages/SystemUI/res/drawable-sw900dp/ic_ime_switcher_default.xml new file mode 100644 index 000000000000..bcf9cacc45ae --- /dev/null +++ b/packages/SystemUI/res/drawable-sw900dp/ic_ime_switcher_default.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/packages/SystemUI/res/drawable/ic_device_thermostat_24.xml b/packages/SystemUI/res/drawable/ic_device_thermostat_24.xml new file mode 100644 index 000000000000..1972f6e4427c --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_device_thermostat_24.xml @@ -0,0 +1,25 @@ + + + + diff --git a/packages/SystemUI/res/drawable/ic_qs_network_logging.xml b/packages/SystemUI/res/drawable/ic_qs_network_logging.xml new file mode 100644 index 000000000000..2cce5325a48c --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_network_logging.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_r.xml b/packages/SystemUI/res/drawable/ic_qs_signal_r.xml deleted file mode 100644 index 66f64c918329..000000000000 --- a/packages/SystemUI/res/drawable/ic_qs_signal_r.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - diff --git a/packages/SystemUI/res/drawable/recents_grid_task_view_focus_frame_background.xml b/packages/SystemUI/res/drawable/recents_grid_task_view_focus_frame_background.xml new file mode 100644 index 000000000000..4987f9bcf610 --- /dev/null +++ b/packages/SystemUI/res/drawable/recents_grid_task_view_focus_frame_background.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml b/packages/SystemUI/res/drawable/stat_sys_roaming.xml similarity index 95% rename from packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml rename to packages/SystemUI/res/drawable/stat_sys_roaming.xml index 363e231cf03c..4baa472acb88 100644 --- a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml +++ b/packages/SystemUI/res/drawable/stat_sys_roaming.xml @@ -14,10 +14,10 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> + android:viewportHeight="12.0"> diff --git a/packages/SystemUI/res/layout/data_usage.xml b/packages/SystemUI/res/layout/data_usage.xml index c943f3d2a616..fdc6f146f93f 100644 --- a/packages/SystemUI/res/layout/data_usage.xml +++ b/packages/SystemUI/res/layout/data_usage.xml @@ -59,6 +59,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:textAppearance="@style/TextAppearance.QS.DataUsage" /> + - \ No newline at end of file + + + diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml index a20ec8e7623d..8b1007497468 100644 --- a/packages/SystemUI/res/layout/mobile_signal_group.xml +++ b/packages/SystemUI/res/layout/mobile_signal_group.xml @@ -43,4 +43,15 @@ android:layout_height="wrap_content" android:layout_width="wrap_content" /> + diff --git a/packages/SystemUI/res/layout/qs_detail.xml b/packages/SystemUI/res/layout/qs_detail.xml index 967db261fab1..50ee64a321b8 100644 --- a/packages/SystemUI/res/layout/qs_detail.xml +++ b/packages/SystemUI/res/layout/qs_detail.xml @@ -42,6 +42,8 @@ android:background="@color/qs_detail_progress_track" android:layout_width="match_parent" android:layout_height="wrap_content" + android:scaleType="fitXY" + android:translationY="8dp" /> - \ No newline at end of file + + + + diff --git a/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml b/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml new file mode 100644 index 000000000000..2ba04fd31c0f --- /dev/null +++ b/packages/SystemUI/res/layout/quick_settings_footer_dialog.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/layout/recents_grid_task_view.xml b/packages/SystemUI/res/layout/recents_grid_task_view.xml new file mode 100644 index 000000000000..1c9b9ac5f5f2 --- /dev/null +++ b/packages/SystemUI/res/layout/recents_grid_task_view.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/layout/recents_task_view.xml b/packages/SystemUI/res/layout/recents_task_view.xml index c8e5b6124196..015e4a2006bb 100644 --- a/packages/SystemUI/res/layout/recents_task_view.xml +++ b/packages/SystemUI/res/layout/recents_task_view.xml @@ -4,9 +4,9 @@ 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. @@ -26,35 +26,10 @@ - - - + - + diff --git a/packages/SystemUI/res/layout/recents_task_view_incompatible_app_toast.xml b/packages/SystemUI/res/layout/recents_task_view_incompatible_app_toast.xml new file mode 100644 index 000000000000..d573d6b881d2 --- /dev/null +++ b/packages/SystemUI/res/layout/recents_task_view_incompatible_app_toast.xml @@ -0,0 +1,26 @@ + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/recents_task_view_lock_to_app.xml b/packages/SystemUI/res/layout/recents_task_view_lock_to_app.xml new file mode 100644 index 000000000000..8cece1149ce7 --- /dev/null +++ b/packages/SystemUI/res/layout/recents_task_view_lock_to_app.xml @@ -0,0 +1,34 @@ + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/remote_input.xml b/packages/SystemUI/res/layout/remote_input.xml index 73f26e2bb57c..e4ea08edbc89 100644 --- a/packages/SystemUI/res/layout/remote_input.xml +++ b/packages/SystemUI/res/layout/remote_input.xml @@ -42,7 +42,7 @@ android:singleLine="true" android:ellipsize="start" android:inputType="textShortMessage|textAutoCorrect|textCapSentences" - android:imeOptions="actionNone|flagNoExtractUi|flagNoFullscreen" /> + android:imeOptions="actionSend|flagNoExtractUi|flagNoFullscreen" /> + android:paddingEnd="@dimen/screen_pinning_request_frame_padding" + android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent"> + + + + + android:layout_weight="0" + android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent"> + + + + "Toestelmonitering" "Profielmonitering" "Netwerkmonitering" + "VPN" + "Netwerkloglêers" "Deaktiveer VPN" "Ontkoppel VPN" - "Jou toestel word bestuur deur %1$s.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word, en jou toestel se ligginginligting monitor en bestuur. Kontak jou administrateur vir meer inligting." + "Jou toestel word deur %1$s bestuur.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur. Kontak jou administrateur vir meer inligting." + "Jy is gekoppel aan %1$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." + " " + "Maak VPN-instellings oop" + "Jou administrateur het netwerkloglêers aangeskakel wat verkeer op jou toestel monitor.\n\nKontak jou administrateur vir meer inligting." "Jy het \'n program toestemming gegee om \'n VPN-verbinding op te stel.\n\nHierdie program kan jou toestel- en netwerkaktiwiteit monitor, insluitend e-posse, programme en webwerwe." - "Jou toestel word bestuur deur %1$s.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word, en jou toestel se ligginginligting monitor en bestuur.\n\nJy is aan \'n VPN gekoppel wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nKontak jou administrateur vir meer inligting." - "Jou werkprofiel word deur %1$s bestuur.\n\nJou administrateur is in staat om jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, te monitor.\n\nKontak jou administrateur vir meer inligting.\n\nJy is ook aan \'n VPN gekoppel wat jou netwerkaktiwiteit kan monitor." + "Jou toestel word deur %1$s bestuur.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nJy is aan \'n VPN gekoppel wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nKontak jou administrateur vir meer inligting." + "Jou werkprofiel word deur %1$s bestuur.\n\nJou administrateur kan jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, bestuur.\n\nKontak jou administrateur vir meer inligting.\n\nJy is ook aan \'n VPN gekoppel, wat jou netwerkaktiwiteit kan monitor." "VPN" "Jy is gekoppel aan %1$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." "Jy is gekoppel aan %1$s, wat jou persoonlike netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." "Jy is gekoppel aan %1$s, wat jou persoonlike netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor." - "Jou werkprofiel word deur %1$s bestuur. Dit is gekoppel aan %2$s, wat jou werknetwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nKontak jou administrateur vir meer inligting." + "Jou werkprofiel word deur %1$s bestuur. Dit is gekoppel aan %2$s wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nKontak jou administrateur vir meer inligting." "Jou werkprofiel word deur %1$s bestuur. Dit is gekoppel aan %2$s, wat jou werknetwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nJy is ook gekoppel aan %3$s, wat jou persoonlike netwerkaktiwiteit kan monitor." - "Jou toestel word bestuur deur %1$s\n\nJou administrateur kan instelings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nJy is gekoppel aan %2$s, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nVir meer inligting, kontak jou administrateur." + "Jou toestel word deur %1$s bestuur.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nJy is aan %2$s gekoppel wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nKontak jou administrateur vir meer inligting." "Toestel sal gesluit bly totdat jy dit handmatig ontsluit" "Kry kennisgewings vinniger" "Sien hulle voordat jy ontsluit" @@ -431,7 +437,8 @@ "Vou uit" "Vou in" "Skerm is vasgespeld" - "Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug om dit te ontspeld." + "Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Oorsig om dit te ontspeld." + "Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Oorsig om dit te ontspeld." "Het dit" "Nee, dankie" "Versteek %1$s?" @@ -652,4 +659,7 @@ "Wysig volgorde van instellings." "Bladsy %1$d van %2$d" "Kennisgewings kan nie stilgemaak of geblokkeer word nie" + "Foon raak warm" + "Sommige kenmerke is beperk terwyl foon afkoel" + "Jou foon sal outomaties probeer om af te koel. Jy kan steeds jou foon gebruik, maar dit sal dalk stadiger wees.\n\nJou foon sal normaalweg werk nadat dit afgekoel het." diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 98f09f4e5d51..47216edb3962 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -408,19 +408,25 @@ "የመሣሪያ ክትትል" "መገለጫን መከታተል" "የአውታረ መረብ ክትትል" + "VPN" + "የአውታረ መረብ ምዝግብ ማስታወሻ መያዝ" "VPN አሰናክል" "የVPN ግንኙነት አቋርጥ" - "የእርስዎ መሣሪያ የሚቀናበረው በ%1$s ነው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻ፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን፣ እና የመሣሪያዎ የአካባቢ መረጃን መከታተል እና ማቀናበር ይችላሉ። ተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" + "የእርስዎ መሣሪያ በ%1$s ነው የሚተዳደረው።\n\nየእርስዎ አስተዳዳሪ ከመሣሪያዎ ጋር የተጎዳኙ ቅንብሮችን፣ የኮርፖሬት መዳረሻን እና ውሂብን እና የመሣሪያዎን አካባቢ መረጃ መከታተል እና ማቀናበር ይችላሉ። ተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" + "እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %1$s ጋር ተገናኝተዋል።" + " " + "የVPN ቅንብሮችን ይክፈቱ" + "የእርስዎ አስተዳዳሪ የአውታረ መረብ ምዝግብ ማስታወሻ መያዝን አብርተዋል፣ ይህም በመሣሪያዎ ላይ ያለውን ትራፊክ ይከታተላል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" "አንድ መተግበሪያ የVPN ግንኙነት እንዲያዋቅር ፍቃድ ሰጥተውታል።\n\nይህ መተግበሪያ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የመሣሪያዎን እና የአውታረ መረብ እንቅስቃሴዎን መከታተል ይችላል።" - "የእርስዎ መሣሪያ የሚቀናበረው በ%1$s ነው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻ፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን እና የመሣሪያዎን የአካባቢ መረጃ መከታተል እና ማቀናበር ይችላል።\n\nከአንድ VPN ጋር ተገናኝተዋል፣ ይሄ ደግሞ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብዎን እንቅስቃሴ መከታተል ይችላል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" - "የስራ መገለጫዎ በ%1$s ነው የሚተዳደረው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻን፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን እና የመሣሪያዎ የአካባቢ መረጃን መከታተል እና ማቀናበር ይችላል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።\n\nእንዲሁም የአውታረ መረብ ግንኙነትዎን መከታተል ከሚችል አንድ VPN ጋር ተገናኝተዋል።" + "የእርስዎ መሣሪያ በ%1$s ነው የሚተዳደረው።\n\nየእርስዎ አስተዳዳሪ ከመሣሪያዎ ጋር የተጎዳኙ ቅንብሮችን፣ የኮርፖሬት መዳረሻን እና ውሂብን እና የመሣሪያዎን አካባቢ መረጃ መከታተል እና ማቀናበር ይችላሉ።\n\nእርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችል ቪፒኤን ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" + "የእርስዎ የስራ መገለጫ በ%1$s ነው የሚቀናበረው።\n\nየእርስዎ አስተዳዳሪ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ይችላል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።\n\nእርስዎ እንዲሁም የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችል ቪፒኤን ጋር ተገናኝተዋል።" "VPN" "እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %1$s ጋር ተገናኝተዋል።" "እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %1$s ጋር ተገናኝተዋል።" "እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን ከሚከታተለው ከ%1$s ጋር ተገናኝተዋል።" - "የስራ መገለጫዎ በ%1$s ነው እየተዳደረ ያለው። ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %2$s ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" + "የእርስዎ የስራ መገለጫ በ%1$s ነው የሚቀናበረው። ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %2$s ጋር ተገናጥቷል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" "የስራ መገለጫዎ በ%1$s ነው እየተዳደረ ያለው። ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %2$s ጋር ተገናኝተዋል።\n\nእንዲሁም የግል አውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %3$s ጋርም ተገናኝተዋል።" - "የእርስዎ መሣሪያ በ%1$s ነው የሚተዳደረው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻን፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን እና የመሣሪያዎ የአካባቢ መረጃን መከታተል እና ማቀናበር ይችላል።\n\nእርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %2$s ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" + "የእርስዎ መሣሪያ በ%1$s ነው የሚተዳደረው።\n\nየእርስዎ አስተዳዳሪ ከመሣሪያዎ ጋር የተጎዳኙ ቅንብሮችን፣ የኮርፖሬት መዳረሻን እና ውሂብን እና የመሣሪያዎን አካባቢ መረጃ መከታተል እና ማቀናበር ይችላሉ።\n\nእርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው %2$s ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።" "እራስዎ እስኪከፍቱት ድረስ መሣሪያ እንደተቆለፈ ይቆያል" "ማሳወቂያዎችን ፈጥነው ያግኙ" "ከመክፈትዎ በፊት ይመልከቷቸው" @@ -431,7 +437,8 @@ "አስፋ" "ሰብስብ" "ማያ ገጽ ተሰክቷል" - "ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል ተጭነው ይያዙ።" + "ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል ተመለስ እና አጠቃላይ ዕይታ የሚለውን ይጫኑ እና ይያዙ።" + "ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል አጠቃላይ ዕይታ ተጭነው ይያዙ።" "ገባኝ" "አይ፣ አመሰግናለሁ" "%1$s ይደበቅ?" @@ -652,4 +659,7 @@ "የቅንብሮድ ቅደም-ተከተል አርትዕ።" "ገጽ %1$d%2$d" "ማሳወቂያዎች ላይ ድምጸ-ከል ማድረግ ወይም ማገድ አይቻልም" + "ስልኩ እየሞቀ ነው" + "ስልኩ እየቀዘቀዘ ሳለ አንዳንድ ባህሪዎች ይገደባሉ" + "የእርስዎ ስልክ በራስ-ሰር ለመቀዝቀዝ ይሞክራል። አሁንም ስልክዎን መጠቀም ይችላሉ፣ ነገር ግን ሊንቀራፈፍ ይችላል።\n\nአንዴ ስልክዎ ከቀዘቀዘ በኋላ በመደበኝነት ያሄዳል።" diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index c954e41107c8..88be6be1ab6b 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -199,13 +199,13 @@ "تشغيل وضع الطائرة." "تم إيقاف وضع الطائرة." "تم تشغيل وضع الطائرة." - "تم تشغيل الرجاء عدم الإزعاج، الأولوية فقط." - "تم تشغيل الرجاء عدم الإزعاج، كتم الصوت تمامًا." - "تم تشغيل الرجاء عدم الإزعاج، التنبيهات فقط." + "تم تشغيل \"عدم الإزعاج، الأولوية فقط\"." + "تم تشغيل \"عدم الإزعاج، كتم الصوت تمامًا\"." + "تم تشغيل \"عدم الإزعاج، التنبيهات فقط\"." "الرجاء عدم الإزعاج." "تم تعطيل \"الرجاء عدم الإزعاج\"." "تم تعطيل \"الرجاء عدم الإزعاج\"." - "تم تشغيل \"الرجاء عدم الإزعاج\"." + "تم تشغيل \"عدم الإزعاج\"." "البلوتوث." "إيقاف البلوتوث." "تشغيل البلوتوث." @@ -416,19 +416,25 @@ "مراقبة الأجهزة" "مراقبة الملف الشخصي" "مراقبة الشبكات" + "‏شبكة ظاهرية خاصة (VPN)" + "تسجيل بيانات الشبكة" "تعطيل الشبكة الظاهرية الخاصة" "‏قطع الاتصال بشبكة VPN" - "تتم إدارة جهازك عن طريق %1$s.\n\nيمكن للمشرف مراقبة وإدارة كل من الإعدادات والدخول إلى الشركة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع لجهازك. للمزيد من المعلومات، اتصل بالمشرف." + "جهازك يديره %1$s.\n\nيستطيع المشرف متابعة كلٍّ من الإعدادات وحق الوصول إلى بيانات الشركة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع على جهازك، وإدارة كل هذه العناصر. يُرجى التواصل مع المشرف للاطلاع على المزيد من المعلومات." + "لقد اتصلت بتطبيق %1$s، الذي يمكن أن يراقب نشاط الشبكة، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية." + " " + "‏فتح إعدادات الشبكة الظاهرية الخاصة (VPN)" + "شغَّل المشرف ميزة تسجيل بيانات الشبكة، والتي يتم من خلالها مراقبة حركة البيانات على جهازك.\n\nللحصول على المزيد من المعلومات، اتصل بالمشرف." "‏لقد منحت تطبيقًا الإذن لإعداد اتصال شبكة ظاهرية خاصة (VPN).\n\nيمكن لهذا التطبيق مراقبة أنشطتك على الجهاز والشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب." - "‏تتم إدارة جهازك عن طريق %1$s.\n\nيمكن للمشرف مراقبة وإدارة كل من الإعدادات والدخول إلى الشركة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع لجهازك.\n\nأنت متصل بشبكة ظاهرية خاصة (VPN)، يمكنها مراقبة أنشطة الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nللمزيد من المعلومات، اتصل بالمشرف." - "‏تتم إدارة ملفك الشخصي للعمل عن طريق %1$s.\n\nبإمكان المشرف مراقبة أنشطتك على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nللمزيد من المعلومات، اتصل بالمشرف.\n\nأنت متصل أيضًا بشبكة ظاهرية خاصة (VPN)، يمكنها مراقبة أنشطتك على الشبكة." + "‏جهازك يديره %1$s.\n\nيستطيع المشرف متابعة كلٍّ من الإعدادات وحق الوصول إلى بيانات الشركة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع على جهازك، وإدارة كل هذه العناصر.\n\nجهازك متصل بشبكة ظاهرية خاصة (VPN)، التي يمكنها متابعة أنشطتك على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية.\n\nيُرجى التواصل مع المشرف للاطلاع على المزيد من المعلومات." + "تتم إدارة ملفك الشخصي للعمل بواسطة %1$s.\n\nويمكن للمشرف مراقبة نشاط الشبكة، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية.\n\nللحصول على المزيد من المعلومات، اتصل بالمشرف.\n\nوتجدر الإشارة إلى أنك متصل أيضًا بشبكة ظاهرية خاصة يمكن أن تراقب نشاط الشبكة." "شبكة ظاهرية خاصة" "أنت متصل بـ %1$s، الذي يمكنه مراقبة أنشطتك على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب." "أنت متصل بـ %1$s، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب." "أنت متصل بـ %1$s، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب." - "تتم إدارة ملفك الشخصي للعمل عن طريق %1$s. وهذا الملف الشخصي للعمل متصل بـ %2$s، الذي يمكنه مراقبة أنشطتك على شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nللمزيد من المعلومات، اتصل بالمشرف." + "تتم إدارة ملفك الشخصي للعمل بواسطة %1$s، وهو متصل بتطبيق %2$s، الذي يمكن أن يراقب نشاطك على شبكة العمل، بما في ذلك رسائل البريد الإلكتروني والتطبيقات والمواقع الإلكترونية.\n\nللحصول على المزيد من المعلومات، اتصل بالمشرف." "تتم إدارة ملفك الشخصي للعمل عن طريق %1$s. وهذا الملف الشخصي للعمل متصل بـ %2$s، الذي يمكنه مراقبة أنشطتك على شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nأنت متصل أيضًا بـ %3$s، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة." - "تتم إدارة جهازك عن طريق %1$s.\n\nيمكن للمشرف مراقبة وإدارة كل من الإعدادات والوصول إلى الشركة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع لجهازك.\n\nأنت متصل بـ %2$s، الذي يمكنه مراقبة أنشطتك على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nللمزيد من المعلومات، اتصل بالمشرف." + "جهازك يديره %1$s.\n\nيستطيع المشرف متابعة كلٍّ من الإعدادات وحق الوصول إلى بيانات الشركة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع على جهازك، وإدارة كل هذه العناصر.\n\nجهازك متصل بتطبيق %2$s، الذي يمكنه متابعة أنشطتك على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات والمواقع الإلكترونية.\n\nيُرجى التواصل مع المشرف للاطلاع على المزيد من المعلومات." "سيظل الجهاز مقفلاً إلى أن يتم إلغاء قفله يدويًا" "الحصول على الإشعارات بشكل أسرع" "الاطلاع عليها قبل إلغاء القفل" @@ -439,7 +445,8 @@ "توسيع" "تصغير" "تم تثبيت الشاشة" - "يؤدي هذا إلى استمرار العرض إلى أن يتم إزالة التثبيت. ويمكنك لمس \"رجوع\" مع الاستمرار لإزالة التثبيت." + "يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"نظرة عامة\" لإزالة التثبيت." + "يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار زر \"نظرة عامة\" لإزالة التثبيت." "حسنًا" "لا، شكرًا" "هل تريد إخفاء %1$s؟" @@ -660,4 +667,7 @@ "تعديل ترتيب الإعدادات." "الصفحة %1$d من %2$d" "لا يمكن كتم صوت الإشعارات أو حظرها" + "تزداد درجة حرارة الهاتف" + "يتم تقييد عمل بعض الميزات إلى أن تنخفض درجة حرارة الهاتف" + "سيحاول الهاتف تخفيض درجة حرارته تلقائيًا. سيظل بإمكانك استخدام هاتفك، ولكن قد يعمل بشكل أبطأ.\n\nبعد أن تنخفض درجة حرارة الهاتف، سيستعيد سرعته المعتادة." diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml index d2f93d2fc7c7..564eb01d2802 100644 --- a/packages/SystemUI/res/values-az-rAZ/strings.xml +++ b/packages/SystemUI/res/values-az-rAZ/strings.xml @@ -408,19 +408,25 @@ "Cihaza nəzarət" "Profil izlənməsi" "Şəbəkə monitorinqi" + "VPN (Virtual Şəxsi Şəbəkələr)" + "Şəbəkə Girişi" "VPN-i deaktiv edin" "VPN-i bağlantıdan ayırın" - "Cihazınız %1$s tərəfindən idarə olunur.\n\nAdministratorunuz cihazınız ilə əlaqədar ayarlar, korporativ giriş, tətbiqlər, data və cihaz yeri məlumatına nəzarət və idarə edə bilər. Ətraflı məlumat üçün, administratorunuz ilə əlaqə saxlayın." + "Cihazınız %1$s tərəfindən idarə olunur. \n\nAdministrator cihazınızla əlaqəli ayarlar, korporativ giriş, tətbiqlər, data və cihaz məkanı məlumatını nəzarətdə saxlaya və idarə edə bilər. Ətraflı məlumat üçün administrator ilə əlaqə saxlayın." + "%1$s tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinizə nəzarət edə bilər." + " (" + "VPN Ayarlarını açın" + "Admin, cihazdakı trafikə nəzarət edən şəbəkə loqlarını aktiv etdi.\n\nƏtraflı məlumat üçün administrator ilə əlaqə saxlayın." "VPN bağlantısı quraşdırmağa icazə vermisiniz.\n\nBu tətbiq cihazınızı və şəbəkə fəaliyyətinizi, həmçinin, e-məktubları, tətbiq və veb saytları izləyə bilər." - "Cihazınız %1$s tərəfindən idarə olunur.\n\nAdministratorunuz cihazınız ilə əlaqədar ayarlar, korporativ giriş, tətbiqlər, data və cihaz yeri məlumatına nəzarət və idarə edə bilər.\n\nSiz, həmçinin, e-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinizi yoxlaya bilən VPN şəbəkəsinə qoşulmusunuz..\n\nƏtraflı məlumat üçün, administratorunuz ilə əlaqə saxlayın." - "Sizin iş profile tərəfindən idarə olunur %1$s . \n\n Sizin administrator e-poçt, apps, və web o cümlədən şəbəkə fəaliyyəti monitorinq qadirdir. \n\n Daha ətraflı məlumat üçün, administratora müraciət. \n\n Siz həmçinin şəbəkə fəaliyyətinə nəzarət edə bilərsiniz bir VPN, bağlı olduğunuz." + "Cihazınız %1$s tərəfindən idarə olunur. \n\nAdministrator cihazınızla əlaqəli ayarlar, korporativ giriş, tətbiqlər, data və cihaz məkanı məlumatını nəzarətdə saxlaya və idarə edə bilər.\n\nQoşulu olduğunuz VPN e-poçt, tətbiq və veb saytlar da daxil olmaqla, şəbəkə faliyyətinə nəzarət edə bilər.\n\nƏtraflı məlumat üçün administrator ilə əlaqə saxlayın." + "İş profiliniz %1$s tərəfindən idarə olunur.\n\nAdmin e-poçt, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyətinizə nəzarət etməyə qadirdir.\n\nƏtraflı məlumat üçün administrator ilə əlaqə saxlayın.\n\nEyni zamanda, şəbəkə fəaliyyətinizə nəzarət edən VPN\'ə qoşulusunuz." "VPN (Virtual Şəxsi Şəbəkələr)" "%1$s tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinizə nəzarət edə bilər." "%1$s tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər." "%1$s tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər." - "İş profiliniz %1$s tərəfindən idarə olunur. %2$s tətbiqinə qoşuludur və iş şəbəkə fəaliyyətinizə nəzarət edə bilər, bura e-məktubıar, tətbiq və veb saytlar daxildir.\n\nƏtraflı məlumat üçün administratorunuz ilə əlaqə saxlayın." + "İş profiliniz %1$s tərəfindən idarə olunur və e-poçt, tətbiq, veb saytlar daxil olmaqla iş şəbəkə fəaliyyətinizə nəzarət edən %2$s tətbiqinə qoşuludur.\n\nƏtraflı məlumat üçün admin ilə əlaqə saxlayın." "İş profiliniz %1$s tərəfindən idarə olunur. %2$s tətbiqinə qoşuludur və iş şəbəkə fəaliyyətinizi idarə edə bilər, bura e-məktubıar, tətbiq və veb saytlar daxildir\n\nSiz, həmçinin, %3$s tətbiqinə də qoşulsunuz və o, şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər." - "Sizin cihaz tərəfindən idarə olunur %1$s . \n\n Sizin administrator nəzarət və parametrləri, korporativ giriş, apps, sizin cihaz ilə bağlı məlumat və cihaz yer məlumat idarə edə bilərsiniz. \n\n Siz bağlı olduğunuz %2$s , E-poçt, apps, və web o cümlədən, şəbəkə fəaliyyətinə nəzarət edə bilər. \n\n Daha ətraflı məlumat üçün, administratora müraciət." + "Cihazınız %1$s tərəfindən idarə olunur. \n\nAdministrator cihazınızla əlaqəli ayarlar, korporativ giriş, tətbiqlər, datanı və cihaz yeri məlumatını nəzarətdə saxlaya və idarə edə bilər.\n\nQoşulu olduğunuz %2$s e-poçt, tətbiq və veb saytlar da daxil olmaqla, şəbəkə faliyyətinə nəzarət edə bilər.\n\nƏtraflı məlumat üçün administrator ilə əlaqə saxlayın." "Device will stay locked until you manually unlock" "Bildirişləri daha sürətlə əldə edin" "Kiliddən çıxarmadan öncə onları görün" @@ -431,7 +437,8 @@ "Genişləndirin" "Yığcamlaşdırın" "Ekrana sancaq taxıldı" - "Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri düyməsinə toxunun və saxlayın." + "Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın." + "Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri düyməsinə basıb saxlayın." "Anladım!" "Yox, çox sağ olun" "%1$s gizlədilsin?" @@ -652,4 +659,7 @@ "Ayarların sıralanmasını redaktə edin." "%2$d səhifədən %1$d səhifə" "Bildirişlər susdurula və ya blok edilə bilməz" + "Telefon qızmağa başlayır" + "Telefon soyuyana kimi bəzi funksiyalar məhdudlaşdırılır" + "Telefonunuz avtomatik olaraq soyumağa başlayacaq. Telefon istifadəsinə davam edə bilərsiniz, lakin sürəti yavaşlaya bilər.\n\nTelefonunuz soyuduqdan sonra normal işləyəcək." diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 19d58d520780..f90693b4770b 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -410,19 +410,25 @@ "Nadgledanje uređaja" "Nadgledanje profila" "Nadgledanje mreže" + "VPN" + "Evidentiranje mreže" "Onemogući VPN" "Prekini vezu sa VPN-om" - "Uređajem upravlja %1$s.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima. Više informacija potražite od administratora." + "Uređajem upravlja %1$s.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima. Kontaktirajte administratora za više informacija." + "Povezani ste sa aplikacijom %1$s, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove." + " " + "Otvorite podešavanja VPN-a" + "Administrator je uključio evidentiranje mreže, koje prati saobraćaj na uređaju.\n\nKontaktirajte administratora za više informacija." "Dali ste dozvolu aplikaciji da podešava VPN vezu.\n\nTa aplikacija može da nadgleda aktivnosti na uređaju i mreži, uključujući imejlove, aplikacije i veb-sajtove." - "Uređajem upravlja %1$s.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nPovezani ste na VPN, koji može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i bezbedne veb-sajtove.\n\nViše informacija potražite od administratora." - "Profilom za Work upravlja %1$s.\n\nAdministrator može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nViše informacija potražite od administratora.\n\nPovezani ste i na VPN, koji može da nadgleda aktivnosti na ličnoj mreži." + "Uređajem upravlja %1$s.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nPovezani ste sa VPN-om, koji može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nKontaktirajte administratora za više informacija." + "%1$s upravlja profilom za Work.\n\nAdministrator može da prati aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nKontaktirajte administratora za više informacija.\n\nPovezani ste i sa VPN-om, koji može da prati aktivnosti na mreži." "VPN" "Povezani ste sa aplikacijom %1$s, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove." "Povezani ste sa aplikacijom %1$s, koja može da nadgleda aktivnosti na ličnoj mreži, uključujući imejlove, aplikacije i veb-sajtove." "Povezani ste sa aplikacijom %1$s, koja može da nadgleda aktivnosti na ličnoj mreži, uključujući imejlove, aplikacije i veb-sajtove." - "Profilom za Work upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može da nadgleda aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nViše informacija potražite od administratora." + "%1$s upravlja profilom za Work. On je povezan sa aplikacijom %2$s, koja može da prati aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nKontaktirajte administratora za više informacija." "Profilom za Work upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može da nadgleda aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nPovezani ste i sa aplikacijom %3$s, koja može da nadgleda aktivnosti na ličnoj mreži." - "Uređajem upravlja %1$s.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nPovezani ste sa aplikacijom %2$s, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nViše informacija potražite od administratora." + "Uređajem upravlja %1$s.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nPovezani ste sa aplikacijom %2$s, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nKontaktirajte administratora za više informacija." "Uređaj će ostati zaključan dok ga ne otključate ručno" "Brže dobijajte obaveštenja" "Pregledajte ih pre otključavanja" @@ -433,7 +439,8 @@ "Proširi" "Skupi" "Ekran je zakačen" - "Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad da biste ga otkačili." + "Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad i Pregled da biste ga otkačili." + "Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Pregled da biste ga otkačili." "Važi" "Ne, hvala" "Želite li da sakrijete %1$s?" @@ -654,4 +661,7 @@ "Izmeni redosled podešavanja." "%1$d. strana od %2$d" "Zvuk obaveštenja ne može da se isključi niti ona mogu da se blokiraju" + "Telefon se zagrejao" + "Neke funkcije su ograničene dok se telefon ne ohladi" + "Telefon će automatski pokušati da se ohladi. I dalje ćete moći da koristite telefon, ali će sporije reagovati.\n\nKada se telefon ohladi, normalno će raditi." diff --git a/packages/SystemUI/res/values-be-rBY/strings.xml b/packages/SystemUI/res/values-be-rBY/strings.xml index 7538a9a06f4e..c20e2fd54b58 100644 --- a/packages/SystemUI/res/values-be-rBY/strings.xml +++ b/packages/SystemUI/res/values-be-rBY/strings.xml @@ -414,19 +414,25 @@ "Маніторынг прылад" "Маніторынг профіляў" "Маніторынг сеткі" + "VPN" + "Журнал сеткі" "Адключыць VPN" "Адлучыць VPN" - "Ваша прылада знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць і кіраваць наладамі, карпаратыўным доступам, праграмамі, данымі, звязанымі з вашай прыладай, і звесткамі пра месцазнаходжанне вашай прылады. Для атрымання дадатковай інфармацыі звярніцеся да адміністратара." + "Ваша прылада знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць за наладамі, карпаратыўным доступам, праграмамі, данымі, звязанымі з вашай прыладай, і звесткамі пра месцазнаходжанне вашай прылады, а таксама кіраваць усім гэтым. Для атрымання дадатковай інфармацыі звярніцеся да адміністратара." + "Вы падключаны да праграмы %1$s, якая можа сачыць за вашай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." + " ," + "Адкрыйце налады VPN" + "Ваш адміністратар уключыў вядзенне журнала сеткі, з дапамогай якога адсочваецца трафік на вашай прыладзе.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." "Вы далі праграме дазвол на наладжванне злучэння VPN.\n\nГэта праграма можа сачыць за актыўнасцю вашай прылады і вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." - "Ваша прылада знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць і кіраваць наладамі, доступам да карпаратыўных рэсурсаў, праграмамі, данымі, звязанымі з вашай прыладай, і звесткамі пра месцазнаходжанне прылады.\n\nВы падлучаны да VPN, які можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." - "Ваш працоўны профіль знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць і кіраваць наладамі, доступам да карпаратыўных рэсурсаў, праграмамі, данымі, звязанымі з вашай прыладай, і звесткамі пра месцазнаходжанне прылады.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара.\n\nВы таксама падключаны да VPN, які можа сачыць за вашай сеткавай актыўнасцю." + "Ваша прылада знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць за наладамі, карпарат. доступам, праграмами, данымі, звяз. з вашай прыладай, і звесткамі пра месцазнах. вашай прылады, а таксама кіраваць усім гэтым. \n\nВы падключаны да сеткі VPN, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы эл. пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інф-цыі звярніцеся да адміністратара." + "Ваш працоўны профіль знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць за вашай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара.\n\nВы таксама падключаны да сеткі VPN, якая можа сачыць за вашай сеткавай дзейнасцю." "VPN" "Вы падлучаны да праграмы %1$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." "Вы падлучаны да праграмы %1$s, якая сачыць за вашай асабістай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." "Вы падключаны да праграмы %1$s, якая можа сачыць за вашай асабістай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты." - "Ваш працоўны профіль знаходзіцца пад кіраваннем %1$s. Ён падлучаны да праграмы %2$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." + "Ваш працоўны профіль знаходзіцца пад кіраваннем %1$s. Ён падключаны да праграмы %2$s, якая можа сачыць за вашай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." "Ваш працоўны профіль знаходзіцца пад кіраваннем %1$s. Ён падлучаны да праграмы %2$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nВы таксама падлучаны да праграмы %3$s, якая можа сачыць за вашай асабістай сеткавай актыўнасцю." - "Ваша прылада знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць і кіраваць наладамі, доступам да карпаратыўных рэсурсаў, праграмамі, данымі, звязанымі з вашай прыладай, і звесткамі пра месцазнаходжанне прылады.\n\nВы падлучаны да праграмы %2$s, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара." + "Ваша прылада знаходзіцца пад кіраваннем %1$s.\n\nВаш адміністратар можа сачыць за наладамі, карпарат. доступам, праграмамі, данымі, звяз. з вашай прыладай, і звесткамі пра месцазнах. вашай прылады, а таксама кіраваць усім гэтым.\n\nВы падключаны да праграмы %2$s, якая можа сачыць за вашай сеткавай дзейнасцю, уключаючы эл. пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інф-цыі звярніцеся да адміністратара." "Прылада будзе заставацца заблакіраванай, пакуль вы не разблакіруеце яе ўручную" "Атрымлівайце апавяшчэнні хутчэй" "Праглядайце іх перад разблакіроўкай" @@ -437,7 +443,8 @@ "Разгарнуць" "Згарнуць" "Экран замацаваны" - "Будзе паказвацца, пакуль не адмацуеце. Дакраніцеся і ўтрымлівайце кнопку \"Назад\", каб адмацаваць." + "Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, краніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\"." + "Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, краніце і ўтрымлівайце кнопку \"Агляд\"." "Зразумела" "Не, дзякуй" "Схаваць %1$s?" @@ -658,4 +665,7 @@ "Змяніць парадак налад." "Старонка %1$d з %2$d" "Гук паведамленняў нельга адключыць, і іх нельга заблакіраваць" + "Тэлефон награваецца" + "Некаторыя функцыі абмежаваны, пакуль тэлефон астывае" + "Ваш тэлефон аўтаматычна паспрабуе астыць. Вы можаце па-ранейшаму карыстацца сваім тэлефонам, але ён можа працаваць больш павольна.\n\nПасля таго як ваш тэлефон астыне, ён будзе працаваць у звычайным рэжыме." diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index b1841429807d..3012a0c4eda8 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -408,19 +408,25 @@ "Наблюдение на устройството" "Наблюдаване на потр. профил" "Наблюдение на мрежата" + "VPN" + "Регистриране на мрежовата активност" "Деактивиране на VPN" "Прекратяване на връзката с VPN" - "Устройството ви се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му. За още подробности се свържете с администратора си." + "Устройството ви се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му. За още подробности се свържете с администратора си." + "Установена е връзка с приложението %1$s, което може да наблюдава активността ви в мрежата, вкл. имейли, приложения и уебсайтове." + " " + "Отваряне на настройките за VPN" + "Администраторът ви е включил функцията за регистриране на мрежовата активност, която следи трафика на устройството ви.\n\nЗа повече информация се свържете с администратора си." "Разрешихте на приложение да настрои връзка с виртуална частна мрежа (VPN).\n\nТова приложение може да наблюдава активността ви на устройството и в мрежата, включително имейли, приложения и уебсайтове." - "Устройството ви се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му.\n\nСвързани сте с виртуална частна мрежа (VPN) и активността ви в нея може да се наблюдава, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си." - "Служебният ви потребителски профил се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си.\n\nСъщо така е установена връзка с виртуална частна мрежа (VPN) и активността ви в нея може да се наблюдава." + "У-вото ви се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с у-вото ви, вкл. информацията за местоположението му.\n\nУстановена е връзка с виртуална частна мрежа (VPN), която може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още подробности се свържете с администратора си." + "Служебният ви потребителски профил се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа повече информация се свържете с администратора си.\n\nСъщо така е установена връзка с виртуална частна мрежа (VPN) и активността ви в нея може да се наблюдава." "VPN" "Установена е връзка с приложението %1$s, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове." "Установена е връзка с приложението %1$s, което може да наблюдава личната ви активност в мрежата, включително имейли, приложения и уебсайтове." "Установена е връзка с приложението %1$s, което може да наблюдава личната ви активност в мрежата, включително имейли, приложения и уебсайтове." - "Служебният ви потребителски профил се управлява от %1$s. Той е свързан с приложението %2$s, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си." + "Служебният ви потребителски профил се управлява от %1$s. Той е свързан с приложението %2$s, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа повече информация се свържете с администратора си." "Служебният ви потребителски профил се управлява от %1$s. Той е свързан с приложението %2$s, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nУстановена е връзка и с приложението %3$s, което може да наблюдава личната ви активност в мрежата." - "Устройството ви се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му.\n\nУстановена е връзка с приложението %2$s, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си." + "Устройството ви се управлява от %1$s.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му.\n\nУстановена е връзка с приложението %2$s, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още подробности се свържете с администратора си." "Устройството ще остане заключено, докато не го отключите ръчно" "Получавайте известия по-бързо" "Вижте известията, преди да отключите" @@ -431,7 +437,8 @@ "Разгъване" "Свиване" "Екранът е фиксиран" - "Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад." + "Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад и този за общ преглед." + "Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за общ преглед." "Разбрах" "Не, благодаря" "Да се скрие ли „%1$s“?" @@ -652,4 +659,7 @@ "Редактиране на подредбата на настройките." "Страница %1$d от %2$d" "Известията не могат да бъдат заглушавани, нито блокирани" + "Телефонът загрява" + "Някои функции са ограничени, докато телефонът се охлажда" + "Телефонът ви автоматично ще направи опит за охлаждане. Пак можете да го използвате, но той може да работи по-бавно.\n\nСлед като се охлади, ще работи нормално." diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 2cd7b0450107..577196ee7e1c 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -156,7 +156,7 @@ "সেলুলার ডেটা বন্ধ আছে" "ব্লুটুথ টিথারিং৷" "বিমান মোড৷" - "কোনো SIM কার্ড নেই।" + "কোনো সিম কার্ড নেই।" "পরিষেবা প্রদানকারীর নেটওয়ার্ক পরিবর্তিত হচ্ছে।" "ব্যাটারির বিশদ বিবরণ খুলুন" "%d শতাংশ ব্যাটারি রয়েছে৷" @@ -344,7 +344,7 @@ "নেটওয়ার্ক নিরীক্ষণ\nকরা হতে পারে" "অনুসন্ধান করুন" "%s এর জন্য উপরের দিকে স্লাইড করুন৷" - "%s এর জন্য বাম দিকে স্লাইড করুন৷" + "%s এর জন্য বাঁ দিকে স্লাইড করুন৷" "আপনার নির্দিষ্ট অ্যালার্ম, অনুস্মারক, ইভেন্ট, এবং কলারগুলি ব্যতীত আপনাকে শব্দ এবং কম্পনগুলির দ্বারা বিরক্ত করা হবে না৷" "কাস্টমাইজ করুন" "এটি অ্যালার্ম, সংগীত, ভিডিও এবং গেমগুলি থেকে আসা সমস্ত রকমের ধ্বনি এবং কম্পনগুলিকে বন্ধ করে৷ আপনি এখনও ফোন কলগুলি করতে পারবেন৷" @@ -408,19 +408,25 @@ "ডিভাইস নিরীক্ষণ" "প্রোফাইল দেখরেখ করা" "নেটওয়ার্ক নিরীক্ষণ" + "VPN" + "নেটওয়ার্ক লগিং" "VPN অক্ষম করুন" "VPN এর সংযোগ বিচ্ছিন্ন করুন" - "%1$s আপনার ডিভাইস পরিচালনা করে৷\n\nআপনার প্রশাসক আপনার ডিভাইসের সাথে সম্পর্কিত সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্লিকেশানগুলি, ডেটা এবং ডিভাইসের অবস্থান সম্পর্কিত তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন৷ আরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷" + "আপনার ডিভাইসটি %1$s দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক আপনার ডিভাইসের অবস্থান তথ্য সহ এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্স, ডেটা নিরীক্ষণ ও পরিচালনা করতে পারেন। আরো তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।" + "আপনি %1$s এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করবে৷" + " " + "VPN সেটিংস খুলুন" + "আপনার প্রশাসক নেটওয়ার্ক লগিং চালু করেছেন, যা আপনার ডিভাইসের ট্রাফিক নিরীক্ষণ করে।\n\nআরো তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।" "আপনি VPN সংযোগ সেট আপ করার জন্য একটি অ্যাপ্লিকেশানকে অনুমতি দিন৷\n\nএই অ্যাপ্লিকেশানটি ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার ডিভাইস এবং নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে।" - "%1$s আপনার ডিভাইস পরিচালনা করে৷\n\nআপনার প্রশাসক আপনার ডিভাইসের সাথে সম্পর্কিত সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্লিকেশান ডেটা এবং ডিভাইসের অবস্থান সম্পর্কিত তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন৷\n\nআপনি একটি VPN এর সাথে সংযুক্ত রয়েছেন যা ইমেল, অ্যাপ্লিকেশান ও নিরাপদ ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷" - "%1$s আপনার কাজের প্রোফাইল পরিচালনা করে৷\n\nআপনার প্রশাসক ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে সক্ষম৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷\n\nএছাড়াও আপনি একটি VPN, এর সাথে সংযুক্ত রয়েছেন যা আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷" + "আপনার ডিভাইসটি %1$s দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক আপনার ডিভাইসের অবস্থান তথ্য সহ এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্স, ডেটা নিরীক্ষণ ও পরিচালনা করতে পারেন।\n\nআপনি VPN এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্স এবং ওয়েবসাইটগুলি সমেত আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে।\n\nআরো তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।" + "আপনার কর্মস্থলের প্রোফাইলটি %1$s দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক আপনার ইমেল, অ্যাপ্স ও ওয়েবসাইট সহ কর্মস্থলের নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারেন।\n\nআরো তথ্যের জন্য আপনার প্রশাসকের সঙ্গে যোগাযোগ করুন।\n\nএছাড়া আপনি একটি VPN এর সাথেও সংযুক্ত যা আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে।" "VPN" "আপনি %1$s -এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷" "আপনি %1$s -এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার ব্যক্তিগত নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷" "আপনি %1$s এর সাথে সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করবে৷" - "%1$s আপনার কাজের প্রোফাইল পরিচালনা করে৷ এটি %2$s -এ সংযুক্ত রয়েছে যা আপনার ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার কাজের নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷" + "আপনার কর্মস্থলের প্রোফাইলটি %1$s দ্বারা পরিচালিত হয়। সেটি %2$s এর সাথে সংযুক্ত যা আপনার ইমেল, অ্যাপ্স ও ওয়েবসাইট সহ কর্মস্থলের নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে।\n\nআরো তথ্যের জন্য আপনার প্রশাসকের সঙ্গে যোগাযোগ করুন।" "%1$s আপনার কাজের প্রোফাইল পরিচালনা করে৷ এটি %2$s -এ সংযুক্ত রয়েছে যা আপনার ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার কাজের নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nএছাড়াও আপনি %3$s এর সাথে সংযুক্ত রয়েছেন যা আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷" - "%1$s আপনার ডিভাইস পরিচালনা করে৷\n\nআপনার প্রশাসক আপনার ডিভাইসের সাথে সম্পর্কিত সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্লিকেশান ডেটা এবং ডিভাইসের অবস্থান সম্পর্কিত তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন৷\n\nআপনি %2$s এর সাথে সংযুক্ত রয়েছেন যা ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷" + "আপনার ডিভাইসটি %1$s দ্বারা পরিচালিত হয়।\n\nআপনার প্রশাসক আপনার ডিভাইসের অবস্থান তথ্য সহ এই ডিভাইসের সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্স, ডেটা নিরীক্ষণ ও পরিচালনা করতে পারেন।\n\nআপনি %2$s এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্স এবং ওয়েবসাইটগুলি সমেত আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে।\n\n আরো তথ্যের জন্য আপনার প্রশাসকের সাথে যোগাযোগ করুন।" "আপনি নিজে আনলক না করা পর্যন্ত ডিভাইসটি লক হয়ে থাকবে" "বিজ্ঞপ্তিগুলি আরো দ্রুত পান" "আপনি আনলক করার আগে ওগুলো দেখুন" @@ -431,7 +437,8 @@ "প্রসারিত করুন" "সঙ্কুচিত করুন" "স্ক্রীন পিন করা হয়েছে" - "এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে \'ফিরুন\' এ স্পর্শ করে ধরে রাখুন৷" + "এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে ফিরুন এবং ওভারভিউ স্পর্শ করে ধরে থাকুন।" + "এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে ওভারভিউ স্পর্শ করে ধরে থাকুন৷" "বুঝেছি" "না থাক" "%1$s লুকাবেন?" @@ -531,8 +538,8 @@ "হোম" "ফিরুন" "উপরে" - "নীচে" - "বাম" + "নিচে" + "বাঁ" "ডান" "কেন্দ্র" "ট্যাব" @@ -619,7 +626,7 @@ "অন্যান্য" "বিভক্ত-স্ক্রীন বিভাজক" - "বাম দিকের অংশ নিয়ে পূর্ণ স্ক্রীন" + "বাঁ দিকের অংশ নিয়ে পূর্ণ স্ক্রীন" "৭০% বাকি আছে" "৫০% বাকি আছে" "৩০% বাকি আছে" @@ -652,4 +659,7 @@ "ক্রম বা সেটিংস সম্পাদনা করুন৷" "%2$dটির মধ্যে %1$d নং পৃষ্ঠা" "বিজ্ঞপ্তিগুলিকে নীরব বা অবরুদ্ধ করা যাবে না" + "ফোনটি গরম হচ্ছে" + "ফোনটি ঠান্ডা হওয়ার সময় কিছু বৈশিষ্ট্য সীমিত হতে পারে" + "আপনার ফোনটি নিজে থেকেই ঠান্ডা হওয়ার চেষ্টা করবে৷ আপনি তবুও আপনার ফোন ব্যবহার করতে পারেন, কিন্তু এটি একটু ধীরে চলতে পারে৷\n\nআপনার ফোনটি পুরোপুরি ঠান্ডা হয়ে গেলে এটি স্বাভাবিকভাবে চলবে৷" diff --git a/packages/SystemUI/res/values-bs-rBA/strings.xml b/packages/SystemUI/res/values-bs-rBA/strings.xml index 3fc98fd0d0b4..59c4a0d82cb2 100644 --- a/packages/SystemUI/res/values-bs-rBA/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA/strings.xml @@ -410,19 +410,25 @@ "Praćenje uređaja" "Praćenje profila" "Praćenje mreže" + "VPN mreža" + "Zapisivanje na mreži" "Isključi VPN" "Prekini VPN vezu" - "Vašim uređajem upravlja %1$s.\n\nVaš administrator može pratiti postavke, korporativni pristup, aplikacije, podatke povezane sa vašim uređajem i informacije o lokaciji uređaja, kao i upravljati njima. Za više informacija kontaktirajte svog administratora." + "Vašim uređajem upravlja %1$s.\n\nVaš administrator može pratiti postavke, korporativni pristup, aplikacije, podatke povezane s vašim uređajem i informacije o lokaciji uređaja, te njima upravljati. Za više informacija obratite se svom administratoru." + "Povezani ste s aplikacijom %1$s, koja može pratiti vašu aktivnost na mreži, uključujući e-poruke i web lokacije." + " " + "Postavke otvorene VPN mreže" + "Vaš administrator je uključio zapisivanje na mreži, čime se prati saobraćaj na vašem uređaju.\n\nZa više informacija, obratite se administratoru." "Jednoj aplikaciji ste dali odobrenje da uspostavi VPN vezu.\n\nTa aplikacija može pratiti vašu aktivnost na uređaju i mreži, uključujući e-poštu, aplikacije i web-lokacije." - "Vašim uređajem upravlja %1$s.\n\nVaš administrator može pratiti postavke, korporativni pristup, aplikacije, podatke povezane sa vašim uređajem i informacije o lokaciji uređaja, kao i upravljati njima.\n\nPovezani ste na VPN, koji može pratiti vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nZa više informacija kontaktirajte svog administratora." - "Vašim profilom za posao upravlja %1$s.\n\nVaš administrator može pratiti vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nZa više informacija kontaktirajte svog administratora.\n\nPovezani ste i na VPN, koji može pratiti vašu aktivnost na mreži." + "Vašim uređajem upravlja %1$s.\n\nVaš administrator može pratiti postavke, korporativni pristup, aplikacije, podatke povezane s vašim uređajem i informacije o lokaciji uređaja, te njima upravljati.\n\nPovezani ste na VPN koji može pratiti vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web lokacije.\n\nZa više informacija, obratite se svom administratoru." + "Vašim radnim profilom upravlja %1$s.\n\nVaš administrator može pratiti vašu aktivnost na radnoj mreži, uključujući e-poruke, aplikacije i web lokacije.\n\nZa više informacija, obratite se administratoru.\n\nPovezani ste i na VPN, koji može pratiti vašu aktivnost na mreži." "VPN" "Povezani ste sa aplikacijom %1$s, koja može pratiti vašu aktivnost na mreži, uključujući e-mailove, aplikacije i web-lokacije." "Povezani ste sa aplikacijom %1$s, koja može pratiti vašu aktivnost na privatnoj mreži, uključujući e-mailove, aplikacije i web-lokacije." "Povezani ste na aplikaciju %1$s, koja može pratiti vaše privatne aktivnosti na mreži, uključujući e-poštu, aplikacije i web stranice." - "Profilom za posao upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može pratiti vašu aktivnost na radnoj mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nZa više informacija kontaktirajte svog administratora." + "Vašim radnim profilom upravlja %1$s. Povezan je s aplikacijom %2$s, koja može pratiti vašu aktivnost na radnoj mreži, uključujući e-poruke, aplikacije i web lokacije.\n\nZa više informacija, obratite se svom administratoru." "Profilom za posao upravlja %1$s. Povezan je sa aplikacijom %2$s, koja može pratiti vašu aktivnost na radnoj mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nPovezani ste i sa aplikacijom %3$s, koja može pratiti vašu aktivnost na privatnoj mreži." - "Vašim uređajem upravlja %1$s.\n\nVaš administrator može pratiti postavke, korporativni pristup, aplikacije, podatke povezane sa vašim uređajem i informacije o lokaciji uređaja, kao i upravljati njima.\n\nPovezani ste sa aplikacijom %2$s, koja može pratiti vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nZa više informacija kontaktirajte svog administratora." + "Vašim uređajem upravlja %1$s.\n\nVaš administrator može pratiti postavke, korporativni pristup, aplikacije, podatke povezane s vašim uređajem i informacije o lokaciji uređaja, te njima upravljati.\n\nPovezani ste na aplikaciju %2$s, koja može pratiti vašu aktivnost na mreži, uključujući e-poruke, aplikacije i web lokacije.\n\nZa više informacija, obratite se svom administratoru." "Uređaj će ostati zaključan dok ga ručno ne otključate" "Brže primaj obavještenja" "Vidi ih prije otključavanja" @@ -433,7 +439,8 @@ "Proširi" "Skupi" "Ekran je prikačen" - "Ovim ekran ostaje prikazan dok ga ne otkačite. Da biste ga otkačili dodirnite i držite Nazad." + "Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Nazad." + "Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Pregled." "Jasno mi je" "Ne, hvala" "Želite li sakriti %1$s?" @@ -656,4 +663,7 @@ "Urediti raspored postavki." "Stranica %1$d od %2$d" "Obavještenja nije moguće prigušiti ili blokirati" + "Telefon se pregrijava" + "Neke funkcije su ograničene dok se telefon hladi" + "Vaš telefon će se automatski pokušati ohladiti. I dalje možete koristi telefon, ali će možda raditi sporije.\n\nNakon što se ohladi, telefon će normalno raditi." diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 483f766f4f46..28e1bdd10ebc 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -367,7 +367,7 @@ "Càrrega ràpida (%s per completar-se)" "Càrrega lenta (%s per completar-se)" "Canvia d\'usuari" - "Canvia l\'usuari. Usuari actual: %s" + "Canvia d\'usuari. Usuari actual: %s" "Usuari actual: %s" "Mostra el perfil" "Afegeix un usuari" @@ -408,19 +408,25 @@ "Supervisió del dispositiu" "Supervisió del perfil" "Supervisió de la xarxa" + "VPN" + "Registre de xarxa" "Desactiva la VPN" "Desconnecta la VPN" - "Administrador del dispositiu: %1$s.\n\nL\'administrador pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions i les dades associades amb aquest dispositiu, inclosa la informació d\'ubicació. Per obtenir més informació, contacta amb l\'administrador." + "%1$s gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions i les dades associades amb el dispositiu, inclosa la informació d\'ubicació. Per obtenir més informació, contacta amb l\'administrador." + "Estàs connectat a %1$s, que pot supervisar la teva activitat a la xarxa, com els correus electrònics, les aplicacions i els llocs web." + " " + "Obre la configuració de la VPN" + "L\'administrador ha activat el registre de xarxa, que supervisa el trànsit del teu dispositiu.\n\nPer obtenir més informació, contacta amb l\'administrador." "Has donat permís a una aplicació per configurar una connexió VPN.\n\nAquesta aplicació pot supervisar el dispositiu i l\'activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." - "Administrador del dispositiu: %1$s.\n\nL\'administrador pot supervisar i gestionar el següent: configuració, accés corporatiu, aplicacions i dades associades amb aquest dispositiu, inclosa la seva informació d\'ubicació.\n\nEstàs connectat a una VPN, que pot supervisar l\'activitat de la xarxa, com ara els correus, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador." - "%1$s gestiona el perfil de Work.\n\nL\'administrador pot supervisar l\'activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador.\n\nA més, estàs connectat a una VPN, que pot supervisar l\'activitat a la xarxa." + "%1$s gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions i les dades associades amb el dispositiu, inclosa la informació d\'ubicació.\n\nEstàs connectat a una VPN, que pot supervisar l\'activitat de la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador." + "%1$s gestiona el teu perfil professional.\n\nL\'administrador pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador.\n\nA més, estàs connectat a una VPN, que també pot supervisar la teva activitat a la xarxa." "VPN" "Estàs connectat a %1$s, que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "Estàs connectat a %1$s, que pot supervisar la teva activitat personal a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." "Estàs connectat a %1$s, que pot supervisar la teva activitat personal a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web." - "%1$s gestiona el teu perfil professional. Aquest perfil està connectat a %2$s, que pot supervisar la teva activitat professional a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador." + "%1$s gestiona el teu perfil professional. Aquest perfil està connectat a %2$s, que pot supervisar la teva activitat professional a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador." "%1$s gestiona el teu perfil professional. Aquest perfil està connectat a %2$s, que pot supervisar la teva activitat professional a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nA més, estàs connectat a %3$s, que també pot supervisar la teva activitat personal a la xarxa." - "%1$s gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar el següent: configuració, accés corporatiu, aplicacions i dades associades amb el dispositiu, inclosa la informació d\'ubicació.\n\nEstàs connectat a %2$s, que pot supervisar l\'activitat a la xarxa, com ara els correus, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador." + "%1$s gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions i les dades associades amb el dispositiu, inclosa la informació d\'ubicació.\n\nEstàs connectat a %2$s, que pot supervisar l\'activitat de la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador." "El dispositiu continuarà bloquejat fins que no el desbloquegis manualment." "Obtén notificacions més ràpidament" "Mostra-les abans de desbloquejar" @@ -431,7 +437,8 @@ "Amplia" "Replega" "La pantalla està fixada" - "Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premut el botó Enrere." + "Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premudes les opcions Enrere i Visió general." + "Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premuda l\'opció Visió general." "D\'acord" "No, gràcies" "Vols amagar %1$s?" @@ -475,7 +482,7 @@ "Mode d\'avió" "Afegeix un mosaic" "Mosaic d\'emissió" - "Si no desactives aquesta opció abans, %1$s no sentiràs la pròxima alarma" + "Si no desactives aquesta opció abans, no sentiràs la pròxima alarma (%1$s)" "%1$s no sentiràs la pròxima alarma" "Hora: %1$s" "Dia: %1$s" @@ -652,4 +659,7 @@ "Edita l\'ordre de la configuració." "Pàgina %1$d (%2$d en total)" "Les notificacions no es poden silenciar ni bloquejar" + "El telèfon s\'està escalfant" + "Algunes funcions estaran limitades mentre el telèfon es refreda" + "El telèfon provarà de refredar-se automàticament. Podràs continuar utilitzant-lo, però és possible que funcioni més lentament.\n\nUn cop s\'hagi refredat, funcionarà amb normalitat." diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 6adcde3d34e2..69bbcc012c97 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -414,19 +414,25 @@ "Sledování zařízení" "Monitoring profilu" "Sledování sítě" + "VPN" + "Protokolování sítě" "Deaktivovat VPN" "Odpojit VPN" - "Toto zařízení spravuje organizace %1$s.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu. O další informace požádejte svého administrátora." + "Toto zařízení spravuje organizace %1$s.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu. Další informace vám poskytne administrátor." + "Jste připojeni k aplikaci %1$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů." + " " + "Otevřít nastavení VPN" + "Administrátor zapnul protokolování sítě, které monitoruje síťový provoz v zařízení.\n\nDalší informace vám poskytne administrátor." "Udělili jste aplikaci oprávnění k nastavení připojení VPN.\n\nTato aplikace může sledovat vaši aktivitu v zařízení a v síti, včetně e-mailů, aplikací a webů." - "Toto zařízení spravuje organizace %1$s.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu.\n\nJste připojeni k síti VPN, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora." - "Váš pracovní profil spravuje organizace %1$s.\n\nAdministrátor může monitorovat vaši síťovou aktivitu, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora.\n\nJste také připojeni k síti VPN, která může sledovat vaši aktivitu v síti." + "Toto zařízení spravuje organizace %1$s.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu.\n\nJste připojeni k síti VPN, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nDalší informace vám poskytne administrátor." + "Váš pracovní profil spravuje organizace %1$s.\n\nAdministrátor může monitorovat vaši síťovou aktivitu, včetně e-mailů, aplikací a webů.\n\nDalší informace vám poskytne administrátor.\n\nJste také připojeni k síti VPN, která může sledovat vaši aktivitu v síti." "VPN" "Jste připojeni k aplikaci %1$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů." "Jste připojeni k aplikaci %1$s, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů." "Jste připojeni k aplikaci %1$s, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů." - "Váš pracovní profil spravuje organizace %1$s. Je připojen k aplikaci %2$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora." + "Váš pracovní profil spravuje organizace %1$s. Je připojen k aplikaci %2$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nDalší informace vám poskytne administrátor." "Váš pracovní profil spravuje organizace %1$s. Je připojen k aplikaci %2$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nTaké jste připojeni k aplikaci %3$s, která může sledovat vaši osobní aktivitu v síti." - "Toto zařízení spravuje organizace %1$s.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a informace o jeho poloze.\n\nJste připojeni k aplikaci %2$s, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora." + "Toto zařízení spravuje organizace %1$s.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu.\n\nJste připojeni k aplikaci %2$s, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nDalší informace vám poskytne administrátor." "Zařízení zůstane uzamčeno, dokud je ručně neodemknete" "Čtěte si oznámení rychleji" "Můžete si je přečíst před odemčením obrazovky." @@ -437,7 +443,8 @@ "Rozbalit" "Sbalit" "Obrazovka je připnuta" - "Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítka Zpět." + "Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítek Zpět a Přehled." + "Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítka Přehled." "Rozumím" "Ne, děkuji" "Skrýt %1$s?" @@ -658,4 +665,7 @@ "Upravit pořadí nastavení." "Stránka %1$d%2$d" "Oznámení nelze ztlumit ani blokovat" + "Telefon se zahřívá" + "Některé funkce jsou při chladnutí omezeny" + "Telefon se automaticky pokusí vychladnout. Lze jej nadále používat, ale může být pomalejší.\n\nAž telefon vychladne, bude fungovat normálně." diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 7de602a2f1f0..2135bba74e35 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -67,15 +67,15 @@ "Den bruger, der i øjeblikket er logget ind på denne enhed, kan ikke aktivere USB-fejlretning. Skift til en administratorbruger for at bruge denne funktion." "Zoom til fuld skærm" "Stræk til fuld skærm" - "Gemmer skærmbillede..." - "Gemmer skærmbillede..." - "Skærmbilledet gemmes." - "Skærmbilledet er gemt." - "Tryk for at se dit skærmbillede." - "Skærmbilledet kunne ikke tages." - "Der opstod et problem ved lagringen af skærmbilledet." - "Skærmbilledet kan ikke gemmes pga. begrænset lagerplads." - "Appen eller din organisation tillader ikke, at du tager skærmbilleder." + "Gemmer screenshot..." + "Gemmer screenshot..." + "Screenshottet gemmes." + "Screenshottet er gemt." + "Tryk for at se dit screenshot." + "Screenshottet kunne ikke tages." + "Der opstod et problem ved lagringen af screenshottet." + "Screenshottet kan ikke gemmes pga. begrænset lagerplads." + "Appen eller din organisation tillader ikke, at du tager screenshots." "Muligheder for USB-filoverførsel" "Isæt som en medieafspiller (MTP)" "Isæt som et kamera (PTP)" @@ -264,7 +264,7 @@ "Ethernet" "Forstyr ikke" "Kun prioritet" - "Kun Alarmer" + "Kun alarmer" "Total stilhed" "Bluetooth" "Bluetooth (%d enheder)" @@ -359,7 +359,7 @@ "Helt lydløs. Denne handling slukker også skærmlæsere." "Total stilhed" "Kun prioritet" - "Kun Alarmer" + "Kun alarmer" "Total\nstilhed" "Kun\nprioritet" "Kun\nalarmer" @@ -408,19 +408,25 @@ "Overvågning af enhed" "Profilovervågning" "Overvågning af netværk" + "VPN" + "Netværksregistrering" "Deaktiver VPN" "Afbryd VPN-forbindelse" - "Din enhed administreres af %1$s.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds stedoplysninger. Kontakt din administrator, hvis du vil have flere oplysninger." + "Din enhed administreres af %1$s.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds placeringsoplysninger. Kontakt din administrator for at få flere oplysninger." + "Du har forbindelse til %1$s, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites." + " " + "Åbn VPN-indstillinger" + "Din administrator har aktiveret netværksregistrering, som overvåger trafik på din enhed.\n\nKontakt din administrator for at få flere oplysninger." "Du gav en app tilladelse til at konfigurere en VPN-forbindelse.\n\nDenne app kan overvåge din enhed og netværksaktivitet, bl.a. e-mails, apps og websites." - "Din enhed administreres af %1$s.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds stedoplysninger.\n\nDu har forbindelse til et VPN, som kan overvåge din netværksaktivitet, herunder e-mails, apps og websites.\n\nKontakt din administrator, hvis du vil have flere oplysninger." - "Din arbejdsprofil administreres af %1$s.\n\nDin administrator kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger.\n\nDu er også forbundet til en VPN-forbindelse, som kan overvåge din netværksaktivitet." + "Din enhed administreres af %1$s.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds placeringsoplysninger.\n\nDu har forbindelse til et VPN, der kan overvåge din netværksaktivitet, herunder e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger." + "Din arbejdsprofil administreres af %1$s.\n\nDin administrator kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger.\n\nDu har også forbindelse til et VPN, som kan overvåge din netværksaktivitet." "VPN" "Du har forbindelse til %1$s, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites." "Du har forbindelse til %1$s, som kan overvåge din private netværksaktivitet, bl.a. e-mails, apps og websites." "Du har forbindelse til %1$s, som kan overvåge din private netværksaktivitet, bl.a. e-mails, apps og websites." - "Din arbejdsprofil administreres af %1$s. Den er forbundet til %2$s, som kan overvåge din arbejdsrelaterede netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger." + "Din arbejdsprofil administreres af %1$s. Den er forbundet med %2$s, som kan overvåge din aktivitet på arbejdsnetværket, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger." "Din arbejdsprofil administreres af %1$s. Den er forbundet til %2$s, som kan overvåge din arbejdsrelaterede netværksaktivitet, bl.a. e-mails, apps og websites.\n\nDu er også forbundet til %3$s, som kan overvåge din private netværksaktivitet." - "Din enhed administreres af %1$s.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedens adgang, data tilknyttet din enhed og enhedens stedoplysninger.\n\nDu er forbundet til %2$s, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger." + "Din enhed administreres af %1$s.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds placeringsoplysninger.\n\nDu har forbindelse til %2$s, som kan overvåge din netværksaktivitet, herunder e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger." "Enheden vil forblive låst, indtil du manuelt låser den op" "Modtag underretninger hurtigere" "Se dem, før du låser op" @@ -431,7 +437,8 @@ "Udvid" "Skjul" "Skærmen er fastgjort" - "Dette fastholder skærmen i visningen, indtil du frigør den. Tryk på Tilbage, og hold fingeren nede for at frigøre skærmen." + "Dette fastholder skærmen i visningen, indtil du frigør den. Tryk på Tilbage og Overblik, og hold fingeren nede for at frigøre skærmen." + "Dette fastholder skærmen i visningen, indtil du frigør den. Tryk på Tilbage, og hold fingeren nede for at frigøre skærmen." "OK, det er forstået" "Nej tak" "Vil du skjule %1$s?" @@ -479,7 +486,7 @@ "Du vil ikke kunne høre din næste alarm %1$s" "kl. %1$s" "på %1$s" - "Hurtigindstillinger %s." + "Hurtige indstillinger %s." "Hotspot" "Arbejdsprofil" "Sjovt for nogle, men ikke for alle" @@ -652,4 +659,7 @@ "Rediger rækkefølgen af indstillinger." "Side %1$d af %2$d" "Underretninger kan ikke ignoreres eller blokeres" + "Telefonen er ved at blive varm" + "Nogle funktioner er begrænsede, mens telefonen køler ned" + "Din telefon forsøger automatisk at køle ned. Du kan stadig bruge telefonen, men den kører muligvis langsommere.\n\nNår din telefon er kølet ned, fungerer den normalt igen." diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index fc6d9a07303f..19b2643536dc 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -331,7 +331,7 @@ "Suche" "%s konnte nicht gestartet werden." "%s ist im abgesicherten Modus deaktiviert." - "Alle löschen" + "Alle schließen" "Das Teilen des Bildschirms wird in dieser App nicht unterstützt" "Hierher ziehen, um den Bildschirm zu teilen" "Geteilte Schaltfläche – horizontal" @@ -410,19 +410,25 @@ "Geräteüberwachung" "Profilüberwachung" "Netzwerküberwachung" + "VPN" + "Netzwerkprotokollierung" "VPN deaktivieren" "VPN-Verbindung trennen" - "Dein Gerät wird verwaltet von %1$s.\n\nDein Administrator kann die zu deinem Gerät gehörigen Einstellungen, Unternehmenszugriffsrechte, Apps und Daten überwachen und verwalten, einschließlich der Standortinformationen deines Geräts. Weitere Informationen erhältst du bei deinem Administrator." + "Dein Gerät wird von %1$s verwaltet.\n\nDein Administrator kann Einstellungen, Zugriffsrechte, Apps und Daten deines Geräts und dessen Standortinformationen überwachen und verwalten. Weitere Informationen erhältst du von deinem Administrator." + "Du bist mit %1$s verbunden. Die VPN-App kann deine Netzwerkaktivitäten (E-Mails, Apps und Websites) erfassen." + " " + "VPN-Einstellungen öffnen" + "Dein Administrator hat die Netzwerkprotokollierung aktiviert. Damit wird der Verkehr auf deinem Gerät erfasst.\n\nWeitere Informationen erhältst du von deinem Administrator." "Du hast einer App gestattet, eine VPN-Verbindung einzurichten.\n\nDiese App kann dein Gerät und deine Netzwerkaktivitäten überwachen, einschließlich E-Mails, Apps und Websites." - "Dein Gerät wird von %1$s verwaltet.\n\nDein Administrator kann die zu deinem Gerät gehörigen Einstellungen, Unternehmenszugriffsrechte, Apps und Daten überwachen und verwalten, einschließlich der Standortinformationen deines Geräts.\n\nDu bist außerdem mit einem VPN verbunden, das deine persönliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du bei deinem Administrator." - "Dein Arbeitsprofil wird von %1$s verwaltet.\n\nDein Administrator kann deine Netzwerkaktivität überwachen, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du bei deinem Administrator.\n\nDu bist außerdem mit einem VPN verbunden, das deine persönliche Netzwerkaktivität überwachen kann." + "Dein Gerät wird von %1$s verwaltet.\n\nDein Administrator kann Einstellungen, Zugriffsrechte, Apps und Daten deines Geräts und dessen Standortinformationen überwachen und verwalten.\n\nDu bist mit einem VPN verbunden, das deine Netzwerkaktivität erfassen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du von deinem Administrator." + "Dein Arbeitsprofil wird von %1$s verwaltet.\n\nDein Administrator kann deine Netzwerkaktivitäten einschließlich E-Mails, Apps und Websites überwachen.\n\nWeitere Informationen erhältst du von deinem Administrator.\n\nAußerdem bist du mit einem VPN verbunden, das deine Netzwerkaktivitäten erfassen kann." "VPN" "Du bist mit der App %1$s verbunden, die deine Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites." "Du bist mit der App %1$s verbunden, die deine persönliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites." "Du bist mit der App \"%1$s\" verbunden. Diese kann deine persönlichen Netzwerkaktivitäten erfassen, einschließlich E-Mails, Apps und Websites." - "Dein Arbeitsprofil wird von %1$s verwaltet. Das Profil ist mit der App %2$s verbunden, die deine geschäftlichen Netzwerkaktivitäten überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du von deinem Administrator." + "Dein Arbeitsprofil wird von %1$s verwaltet. Es ist mit der App %2$s verbunden, die deine berufliche Netzwerkaktivitäten einschließlich E-Mails, Apps und Websites erfassen kann.\n\nWeitere Informationen erhältst du von deinem Administrator." "Dein Arbeitsprofil wird von %1$s verwaltet. Das Profil ist mit der App %2$s verbunden, die deine geschäftliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nDu bist außerdem mit der App %3$s verbunden, die deine persönliche Netzwerkaktivität überwachen kann." - "Dein Gerät wird von %1$s verwaltet.\n\nDein Administrator kann die zu deinem Gerät gehörigen Einstellungen, Unternehmenszugriffsrechte, Apps und Daten überwachen und verwalten, einschließlich der Standortinformationen deines Geräts.\n\nDu bist außerdem mit der App %2$s verbunden, die deine persönliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du bei deinem Administrator." + "Dein Gerät wird von %1$s verwaltet.\n\nDein Administrator kann Einstellungen, Zugriffsrechte, Apps und Daten deines Geräts und dessen Standortinformationen überwachen und verwalten.\n\nDu bist mit der App %2$s verbunden, die deine Netzwerkaktivität erfassen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du von deinem Administrator." "Das Gerät bleibt gesperrt, bis du es manuell entsperrst." "Benachrichtigungen schneller erhalten" "Vor dem Entsperren anzeigen" @@ -433,7 +439,8 @@ "Maximieren" "Minimieren" "Bildschirm ist fixiert" - "Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre & halte \"Zurück\", um die Fixierung aufzuheben." + "Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Übersicht\"." + "Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Übersicht\"." "OK" "Nein danke" "%1$s ausblenden?" @@ -654,4 +661,7 @@ "Reihenfolge der Einstellungen bearbeiten." "Seite %1$d von %2$d" "Benachrichtigungen können nicht stummgeschaltet oder blockiert werden" + "Smartphone wird warm" + "Einige Funktionen sind während der Abkühlphase des Smartphones eingeschränkt" + "Dein Smartphone kühlt sich automatisch ab. Du kannst dein Smartphone weiterhin nutzen, aber es reagiert möglicherweise langsamer.\n\nSobald dein Smartphone abgekühlt ist, funktioniert es wieder normal." diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index a9b8bb506afe..11eeb3ef3b61 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -408,19 +408,25 @@ "Παρακολούθηση συσκευής" "Παρακολούθηση προφίλ" "Παρακολούθηση δικτύου" + "VPN" + "Καταγραφή δικτύου" "Απενεργοποίηση VPN" "Αποσύνδεση VPN" - "Η διαχείριση αυτής της συσκευής γίνεται από %1$s.\n\nΟ διαχειριστής σας έχει τη δυνατότητα να παρακολουθεί και να διαχειρίζεται τις ρυθμίσεις, την εταιρική πρόσβαση, τις εφαρμογές και τα δεδομένα που σχετίζονται με αυτήν τη συσκευή, συμπεριλαμβανομένων των πληροφοριών τοποθεσίας της συσκευής σας. Για περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή σας." + "Η διαχείριση της συσκευής σας γίνεται από τον οργανισμό %1$s.\n\nΟ διαχειριστής σας μπορεί να παρακολουθεί και να διαχειρίζεται τις ρυθμίσεις, την εταιρική πρόσβαση, τις εφαρμογές και τα δεδομένα που σχετίζονται με τη συσκευή σας και τις πληροφορίες τοποθεσίας της συσκευής σας. Για περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας." + "Έχετε συνδεθεί στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων." + " " + "Άνοιγμα Ρυθμίσεων VPN" + "Ο διαχειριστής σας έχει ενεργοποιήσει την καταγραφή δικτύου, η οποία παρακολουθεί την επισκεψιμότητα στη συσκευή σας.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας." "Παραχωρήσατε σε μια εφαρμογή άδεια για τη ρύθμιση σύνδεσης VPN.\n\nΑυτή η εφαρμογή μπορεί να παρακολουθεί τη δραστηριότητα της συσκευής και του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων." - "Η διαχείριση αυτής της συσκευής γίνεται από %1$s.\n\nΟ διαχειριστής σας έχει τη δυνατότητα να παρακολουθεί και να διαχειρίζεται τις ρυθμίσεις, την εταιρική πρόσβαση, τις εφαρμογές και τα δεδομένα που σχετίζονται με αυτήν τη συσκευή, συμπεριλαμβανομένων των πληροφοριών τοποθεσίας της συσκευής σας.\n\nΕίστε επίσης συνδεδεμένοι σε ένα VPN, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή σας." - "Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό %1$s.\n\nΟ διαχειριστής έχει τη δυνατότητα παρακολούθησης της δραστηριότητας του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή.\n\nΕπίσης, είστε συνδεδεμένοι σε VPN, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας." + "Η διαχείριση της συσκευής γίνεται από τον οργανισμό %1$s.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται τις ρυθμίσεις, την εταιρική πρόσβαση, τις εφαρμογές και τα δεδομένα που σχετίζονται με τη συσκευή σας και τις πληροφορίες τοποθεσίας της.\n\nΕίστε συνδεδεμένοι σε ένα δίκτυο VPN, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας." + "Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό %1$s.\n\nΟ διαχειριστής έχει τη δυνατότητα παρακολούθησης της δραστηριότητας του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή.\n\nΕπίσης, είστε συνδεδεμένοι σε VPN, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας." "VPN" "Έχετε συνδεθεί στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων." "Έχετε συνδεθεί στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων." "Έχετε συνδεθεί στην εφαρμογή %1$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων." - "Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό %1$s. Είναι συνδεδεμένο στην εφαρμογή %2$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή." + "Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό %1$s. Είναι συνδεδεμένο στην εφαρμογή %2$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή." "Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό %1$s. Είναι συνδεδεμένο στην εφαρμογή %2$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΕπίσης, είστε συνδεδεμένοι στην εφαρμογή %3$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου." - "Η διαχείριση της συσκευής γίνεται από %1$s.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται ρυθμίσεις, εταιρική πρόσβαση, εφαρμογές, δεδομένα σχετικά με τη συσκευή και πληρ. τοποθεσίας της συσκευής.\n\nΕίστε συνδεδ. σε %2$s που μπορεί να παρακολουθεί τη δραστηρ. του δικτύου εργασίας, όπως μηνύματα ηλεκτρ. ταχυδρομείου, εφαρμογές και ιστότοπους.\n\nΓια περισ. πληροφορίες, επικοινωνήστε με το διαχειριστή." + "Η διαχείριση της συσκευής γίνεται από τον οργανισμό %1$s.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται τις ρυθμίσεις, την εταιρική πρόσβαση, τις εφαρμογές και τα δεδομένα που σχετίζονται με τη συσκευή σας και τις πληροφορίες τοποθεσίας της.\n\nΕίστε συνδεδεμένοι στην εφαρμογή %2$s, η οποία μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας." "Η συσκευή θα παραμείνει κλειδωμένη έως ότου την ξεκλειδώσετε μη αυτόματα" "Λάβετε ειδοποιήσεις γρηγορότερα" "Εμφάνιση πριν το ξεκλείδωμα" @@ -431,7 +437,8 @@ "Ανάπτυξη" "Σύμπτυξη" "Η οθόνη καρφιτσώθηκε" - "Με αυτόν τον τρόπο παραμένει σε προβολή έως ότου την ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα το στοιχείο επιστροφής για να την ξεκαρφιτσώσετε." + "Με αυτόν τον τρόπο παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα τα στοιχεία \"Επιστροφή\" και \"Επισκόπηση\" για ξεκαρφίτσωμα." + "Με αυτόν τον τρόπο παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα την \"Επισκόπηση\" για ξεκαρφίτσωμα." "Το κατάλαβα" "Όχι" "Απόκρυψη %1$s;" @@ -652,4 +659,7 @@ "Επεξεργασία σειράς ρυθμίσεων." "Σελίδα %1$d από %2$d" "Δεν είναι δυνατή η σίγαση ή ο αποκλεισμός των ειδοποιήσεων" + "Αύξηση θερμοκρασίας τηλεφώνου" + "Ορισμένες λειτουργίες περιορίζονται κατά τη μείωση της θερμοκρασίας" + "Το τηλέφωνό σας θα προσπαθήσει να μειώσει αυτόματα τη θερμοκρασία. Μπορείτε να εξακολουθήσετε να το χρησιμοποιείτε, αλλά είναι πιθανό να λειτουργεί πιο αργά.\n\nΜόλις μειωθεί η θερμοκρασία του τηλεφώνου σας, θα λειτουργεί ξανά κανονικά." diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index bed0f5c431a4..1f5e22708a0e 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -408,19 +408,25 @@ "Device monitoring" "Profile monitoring" "Network monitoring" + "VPN" + "Network Logging" "Disable VPN" "Disconnect VPN" - "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information. For more information, contact your administrator." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information. For more information, contact your admin." + "You\'re connected to %1$s, which can monitor your network activity, including emails, apps and websites." + " " + "Open VPN Settings" + "Your admin has turned on network logging, which monitors traffic on your device.\n\nFor more information, contact your admin." "You gave an app permission to set up a VPN connection.\n\nThis app can monitor your device and network activity, including emails, apps and websites." - "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps and websites.\n\nFor more information, contact your administrator." - "Your work profile is managed by %1$s.\n\nYour administrator is capable of monitoring your network activity including emails, apps, and websites.\n\nFor more information, contact your administrator.\n\nYou\'re also connected to a VPN, which can monitor your network activity." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps and websites.\n\nFor more information, contact your admin." + "Your work profile is managed by %1$s.\n\nYour admin is capable of monitoring your network activity including emails, apps and websites.\n\nFor more information, contact your admin.\n\nYou\'re also connected to a VPN, which can monitor your network activity." "VPN" "You\'re connected to %1$s, which can monitor your network activity including emails, apps and websites." "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." - "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator." + "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your admin." "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity." - "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps and websites.\n\nFor more information, contact your admin." "Device will stay locked until you manually unlock" "Get notifications faster" "See them before you unlock" @@ -431,7 +437,8 @@ "Expand" "Collapse" "Screen is pinned" - "This keeps it in view until you unpin. Touch & hold Back to unpin." + "This keeps it in view until you unpin. Touch & hold Back and Overview to unpin." + "This keeps it in view until you unpin. Touch & hold Overview to unpin." "Got it" "No, thanks" "Hide %1$s?" @@ -652,4 +659,7 @@ "Edit order of settings." "Page %1$d of %2$d" "Notifications can\'t be silenced or blocked" + "Phone is getting warm" + "Some features limited while phone cools down" + "Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally." diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index bed0f5c431a4..1f5e22708a0e 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -408,19 +408,25 @@ "Device monitoring" "Profile monitoring" "Network monitoring" + "VPN" + "Network Logging" "Disable VPN" "Disconnect VPN" - "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information. For more information, contact your administrator." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information. For more information, contact your admin." + "You\'re connected to %1$s, which can monitor your network activity, including emails, apps and websites." + " " + "Open VPN Settings" + "Your admin has turned on network logging, which monitors traffic on your device.\n\nFor more information, contact your admin." "You gave an app permission to set up a VPN connection.\n\nThis app can monitor your device and network activity, including emails, apps and websites." - "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps and websites.\n\nFor more information, contact your administrator." - "Your work profile is managed by %1$s.\n\nYour administrator is capable of monitoring your network activity including emails, apps, and websites.\n\nFor more information, contact your administrator.\n\nYou\'re also connected to a VPN, which can monitor your network activity." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps and websites.\n\nFor more information, contact your admin." + "Your work profile is managed by %1$s.\n\nYour admin is capable of monitoring your network activity including emails, apps and websites.\n\nFor more information, contact your admin.\n\nYou\'re also connected to a VPN, which can monitor your network activity." "VPN" "You\'re connected to %1$s, which can monitor your network activity including emails, apps and websites." "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." - "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator." + "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your admin." "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity." - "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps and websites.\n\nFor more information, contact your admin." "Device will stay locked until you manually unlock" "Get notifications faster" "See them before you unlock" @@ -431,7 +437,8 @@ "Expand" "Collapse" "Screen is pinned" - "This keeps it in view until you unpin. Touch & hold Back to unpin." + "This keeps it in view until you unpin. Touch & hold Back and Overview to unpin." + "This keeps it in view until you unpin. Touch & hold Overview to unpin." "Got it" "No, thanks" "Hide %1$s?" @@ -652,4 +659,7 @@ "Edit order of settings." "Page %1$d of %2$d" "Notifications can\'t be silenced or blocked" + "Phone is getting warm" + "Some features limited while phone cools down" + "Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally." diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index bed0f5c431a4..1f5e22708a0e 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -408,19 +408,25 @@ "Device monitoring" "Profile monitoring" "Network monitoring" + "VPN" + "Network Logging" "Disable VPN" "Disconnect VPN" - "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information. For more information, contact your administrator." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information. For more information, contact your admin." + "You\'re connected to %1$s, which can monitor your network activity, including emails, apps and websites." + " " + "Open VPN Settings" + "Your admin has turned on network logging, which monitors traffic on your device.\n\nFor more information, contact your admin." "You gave an app permission to set up a VPN connection.\n\nThis app can monitor your device and network activity, including emails, apps and websites." - "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps and websites.\n\nFor more information, contact your administrator." - "Your work profile is managed by %1$s.\n\nYour administrator is capable of monitoring your network activity including emails, apps, and websites.\n\nFor more information, contact your administrator.\n\nYou\'re also connected to a VPN, which can monitor your network activity." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps and websites.\n\nFor more information, contact your admin." + "Your work profile is managed by %1$s.\n\nYour admin is capable of monitoring your network activity including emails, apps and websites.\n\nFor more information, contact your admin.\n\nYou\'re also connected to a VPN, which can monitor your network activity." "VPN" "You\'re connected to %1$s, which can monitor your network activity including emails, apps and websites." "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." "You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps and websites." - "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator." + "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your admin." "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity." - "Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps and websites.\n\nFor more information, contact your admin." "Device will stay locked until you manually unlock" "Get notifications faster" "See them before you unlock" @@ -431,7 +437,8 @@ "Expand" "Collapse" "Screen is pinned" - "This keeps it in view until you unpin. Touch & hold Back to unpin." + "This keeps it in view until you unpin. Touch & hold Back and Overview to unpin." + "This keeps it in view until you unpin. Touch & hold Overview to unpin." "Got it" "No, thanks" "Hide %1$s?" @@ -652,4 +659,7 @@ "Edit order of settings." "Page %1$d of %2$d" "Notifications can\'t be silenced or blocked" + "Phone is getting warm" + "Some features limited while phone cools down" + "Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally." diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 485d2e0ffa17..45b09557e15a 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -410,19 +410,25 @@ "Supervisión del dispositivo" "Supervisión del perfil" "Supervisión de red" + "VPN" + "Registro de red" "Inhabilitar VPN" "Desconectar VPN" - "%1$s administra tu dispositivo.\n\nEl administrador puede supervisar y administrar la configuración, el acceso corporativo, las aplicaciones, los datos asociados a este dispositivo y la información de ubicación del dispositivo. Para obtener más información, comunícate con el administrador." + "%1$s administra tu dispositivo.\n\nTu administrador puede controlar las opciones de configuración, el acceso corporativo, las apps, los datos asociados con tu dispositivo y la información de ubicación. Para obtener más detalles, comunícate con él." + "Estás conectado a %1$s, que puede controlar la actividad de tu red, incluidos los correos electrónicos, las apps y los sitios web." + " " + "Abrir configuración de VPN" + "Tu administrador activó el registro de red, que controla el tráfico en tu dispositivo.\n\nComunícate con él para obtener más información." "Permitiste que una aplicación configurara una conexión VPN.\n\nEsta aplicación puede supervisar la actividad de la red y del dispositivo, incluidos los correos electrónicos, las aplicaciones y los sitios web." - "%1$s administra tu dispositivo.\n\nEl administrador puede supervisar y administrar la configuración, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo y la información de ubicación.\n\nTambién tienes una conexión VPN, que puede supervisar la actividad de la red (correo electrónico, aplicaciones y sitios web).\n\nPara obtener más información, comunícate con el administrador." - "%1$s administra tu perfil de trabajo.\n\nEl administrador puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador.\n\nTambién tienes conexión a una VPN, que puede supervisar la actividad de tu red." + "%1$s administra tu dispositivo.\n\nTu administrador puede controlar las opciones de configuración, el acceso corporativo, las apps, los datos asociados con tu dispositivo y la información de ubicación.\n\nTe conectaste a una VPN que puede controlar tu actividad en la red, incluidos los correos electrónicos, las apps y los sitios web.\n\nPara obtener más información, comunícate con tu administrador." + "%1$s administra tu perfil de trabajo.\n\nTu administrador puede controlar tu actividad en la red, como los correos electrónicos, las apps y los sitios web.\n\nComunícate con él para obtener más información.\n\nTambién estás conectado a una VPN, que puede controlar tu actividad en la red." "VPN" "Tienes conexión a la aplicación %1$s, que puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web." "Tienes conexión a la aplicación %1$s, que puede supervisar la actividad de la red personal, incluidos los correos electrónicos, las aplicaciones y los sitios web." "Te conectaste a %1$s, que puede supervisar la actividad de tu red personal, incluidos los correos electrónicos, las apps y los sitios web." - "%1$s administra tu perfil de trabajo. Tiene conexión a %2$s, que puede supervisar la actividad de tu red de trabajo, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador." + "%1$s administra tu perfil de trabajo. Está conectado a %2$s, que puede controlar la actividad de tu red laboral, como los correos electrónicos, las apps y los sitios web.\n\nPara obtener más información, comunícate con tu administrador." "%1$s administra tu perfil de trabajo. Tiene conexión a %2$s, que puede supervisar la actividad de tu red de trabajo, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nTambién tienes conexión a %3$s, que puede supervisar la actividad de la red personal." - "%1$s administra tu dispositivo.\n\nEl administrador puede supervisar y administrar la configuración, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo y la información de la ubicación.\n\nTienes conexión a %2$s, que puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador." + "%1$s administra tu dispositivo.\n\nTu administrador puede controlar las opciones de configuración, el acceso corporativo, las apps, los datos asociados con tu dispositivo y la información de ubicación.\n\nTe conectaste a %2$s, que puede controlar tu actividad en la red, incluidos los correos electrónicos, las apps y los sitios web.\n\nPara obtener más información, comunícate con tu administrador." "El dispositivo permanecerá bloqueado hasta que lo desbloquees manualmente." "Recibe notificaciones más rápido" "Ver antes de desbloquear" @@ -433,7 +439,8 @@ "Expandir" "Contraer" "Pantalla fija" - "Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionado el botón Atrás." + "Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionados los botones Atrás y Recientes." + "Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionado el botón Recientes." "Entendido" "No, gracias" "¿Ocultar %1$s?" @@ -654,4 +661,7 @@ "Editar orden de configuración" "Página %1$d de %2$d" "Las notificaciones no se pueden silenciar ni bloquear" + "El teléfono se está calentando" + "Se limitarán algunas funciones mientras se enfría el teléfono" + "Tu teléfono intentará enfriarse automáticamente. Podrás usarlo, pero es posible que funcione más lento.\n\nUna vez que se haya enfriado, volverá a funcionar correctamente." diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 0e0f412459f5..0745e595243b 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -211,10 +211,10 @@ "Bluetooth conectado." "Bluetooth desactivado." "Bluetooth activado." - "Informes de Ubicación desactivados." - "Informes de Ubicación activados." - "Informes de Ubicación desactivados." - "Informes de Ubicación activados." + "Informes de ubicación desactivados." + "Informes de ubicación activados." + "Informes de ubicación desactivados." + "Informes de ubicación activados." "La alarma sonará a la(s) %s." "Cerrar panel." "Más tiempo." @@ -410,19 +410,25 @@ "Supervisión de dispositivo" "Supervisión del perfil" "Supervisión de red" + "VPN" + "Registro de red" "Inhabilitar VPN" "Desconectar VPN" - "Administrador de tu dispositivo: %1$s.\n\nEl administrador puede controlar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo e información de su ubicación. Para obtener más información, ponte en contacto con el administrador." + "%1$s administra tu dispositivo.\n\nTu administrador puede supervisar y administrar la configuración, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo y la información sobre la ubicación de este. Para obtener más información, contacta con el administrador." + "Te has conectado a %1$s, que puede controlar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web." + " " + "Abrir Ajustes de red VPN" + "Tu administrador ha activado el registro de la red para supervisar el tráfico en tu dispositivo.\n\nPonte en contacto con él para obtener más información." "Has concedido permiso a una aplicación para configurar una conexión VPN.\n\nEsta aplicación puede controlar tu dispositivo y tu actividad de red, como correos electrónicos, aplicaciones y sitios web." - "Administrador del dispositivo: %1$s.\n\nEl administrador puede controlar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo e información de su ubicación.\n\nEstás conectado a una red VPN que puede controlar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con el administrador." - "El administrador de tu perfil de trabajo es %1$s.\n\nTu administrador puede supervisar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con tu administrador.\n\nTambién estás conectado a una red VPN que puede supervisar tu actividad de red." + "%1$s administra tu dispositivo.\n\nTu administrador puede supervisar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo y la información sobre la ubicación de este.\n\nEstás conectado a una red VPN, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web que visitas.\n\nPara obtener más información, contacta con el administrador." + "El administrador de tu perfil de trabajo es %1$s,\n\n que puede supervisar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con tu administrador.\n\nTambién estás conectado a una red VPN, que puede supervisar tu actividad de red." "VPN" "Estás conectado a %1$s, que puede controlar tu actividad de red, como correos electrónicos, aplicaciones y sitios web." "Estas conectado a %1$s, que puede controlar tu actividad de red personal, como correos electrónicos, aplicaciones y sitios web." "Estas conectado a %1$s, que puede controlar tu actividad de red personal, como correos electrónicos, aplicaciones y sitios web." - "El administrador de tu perfil de trabajo es %1$s y está conectado a %2$s, que puede controlar tu actividad de red del trabajo, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con el administrador." + "El administrador de tu perfil de trabajo es %1$s y está conectado a %2$s, que puede supervisar tu actividad de red en el trabajo, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con tu administrador." "El administrador de tu perfil de trabajo es %1$s y está conectado a %2$s, que puede controlar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nTú también estás conectado a %3$s, que puede controlar tu actividad de red personal." - "El administrador de tu dispositivo es %1$s.\n\nTu administrador puede supervisar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo e información de su ubicación.\n\nEstás conectado a %2$s, que puede supervisar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con tu administrador." + "%1$s administra tu dispositivo.\n\nTu administrador puede supervisar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo y la información sobre la ubicación de este.\n\nEstás conectado a %2$s, que puede supervisar tu actividad de red, como los correos electrónicos, las aplicaciones y los sitios web que visitas.\n\nPara obtener más información, contacta con el administrador." "El dispositivo permanecerá bloqueado hasta que se desbloquee manualmente" "Recibe notificaciones más rápido" "Ver antes de desbloquear" @@ -433,7 +439,8 @@ "Mostrar" "Ocultar" "Pantalla fijada" - "La pantalla se mantiene visible hasta que dejes de fijarla (para ello, mantén pulsado el botón Atrás)." + "La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsados los botones Atrás y Aplicaciones recientes." + "La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsado el botón Aplicaciones recientes." "Entendido" "No, gracias" "¿Ocultar %1$s?" @@ -494,8 +501,8 @@ "La aplicación no está instalada en tu dispositivo" "Mostrar los segundos del reloj" "Muestra los segundos del reloj en la barra de estado. Puede afectar a la duración de la batería." - "Reorganizar Ajustes rápidos" - "Mostrar brillo en Ajustes rápidos" + "Reorganizar ajustes rápidos" + "Mostrar brillo en ajustes rápidos" "Experimental" "¿Activar Bluetooth?" "Para poder conectar tu teclado a tu tablet, debes activar el Bluetooth." @@ -654,4 +661,7 @@ "Cambiar el orden de los ajustes." "Página %1$d de %2$d" "Las notificaciones no se pueden silenciar ni bloquear" + "El teléfono se está calentando" + "Se limitan algunas funciones mientras el teléfono se enfría" + "El teléfono intentará enfriarse. Puedes seguir utilizándolo, pero es posible que funcione con mayor lentitud.\n\nUna vez que se haya enfriado, funcionará con normalidad." diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index 0cdf8d20a18e..468404f7d01b 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -410,19 +410,25 @@ "Seadme jälgimine" "Profiili jälgimine" "Võrgu jälgimine" + "VPN" + "Võrgu logimine" "Keela VPN" "Katkesta VPN-i ühendus" - "Teie seadet haldab %1$s.\n\nAdministraator saab jälgida ja hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet. Lisateabe saamiseks võtke ühendust administraatoriga." + "Teie seadet haldab %1$s.\n\nAdministraator saab jälgida ning hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet. Lisateabe saamiseks võtke ühendust administraatoriga." + "Olete ühendatud rakendusega %1$s, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite." + " " + "Ava VPN-i seaded" + "Teie administraator on sisse lülitanud võrgu logimise funktsiooni, mis jälgib teie seadmes liiklust.\n\nLisateabe saamiseks võtke ühendust administraatoriga." "Andsite rakendusele loa VPN-i ühenduse seadistamiseks.\n\nSee rakendus võib jälgida teie seadet ja võrgutegevusi, sh meile, rakendusi ja veebisaite." - "Teie seadet haldab %1$s.\n\nAdministraator saab jälgida ja hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nTeil on ühendus VPN-iga, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga." - "Teie tööprofiili haldab organisatsioon %1$s.\n\nAdministraator saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga.\n\nTeil on ühendus ka VPN-iga, mis saab jälgida teie võrgutegevusi." + "Teie seadet haldab %1$s.\n\nAdministraator saab jälgida ning hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nTeil on ühendus VPN-iga, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga." + "Teie tööprofiili haldab %1$s.\n\nAdministraator saab jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga.\n\nTeil on ühendus ka VPN-iga, mis saab teie võrgutegevusi jälgida." "VPN" "Teie seade on ühendatud rakendusega %1$s, mis võib jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite." "Teie seade on ühendatud rakendusega %1$s, mis võib jälgida teie isiklikke võrgutegevusi, sh meile, rakendusi ja veebisaite." "Olete ühendatud rakendusega %1$s, mis võib jälgida teie isiklikke võrgutegevusi, sh meile, rakendusi ja veebisaite." - "Teie tööprofiili haldab organisatsioon %1$s. See on ühendatud rakendusega %2$s, mis võib jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga." + "Teie tööprofiili haldab %1$s. See on ühendatud rakendusega %2$s, mis võib jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga." "Teie tööprofiili haldab organisatsioon %1$s. See on ühendatud rakendusega %2$s, mis võib jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nTeie seade on ühendatud ka rakendusega %3$s, mis võib jälgida teie isiklikke võrgutegevusi." - "Teie seadet haldab organisatsioon %1$s.\n\nAdministraator saab jälgida ja hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nOlete ühendatud rakendusega %2$s, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga." + "Teie seadet haldab %1$s.\n\nAdministraator saab jälgida ning hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nTeil on ühendus rakendusega %2$s, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga." "Seade jääb lukku, kuni selle käsitsi avate" "Saate märguandeid kiiremini" "Näete neid enne avamist" @@ -433,7 +439,8 @@ "Laiendamine" "Ahendamine" "Ekraan on kinnitatud" - "See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Tagasi." + "See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade." + "See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Ülevaade." "Selge" "Tänan, ei" "Kas peita %1$s?" @@ -654,4 +661,7 @@ "Muuda seadete järjestust." "Leht %1$d/%2$d" "Märguandeid ei saa vaigistada ega blokeerida" + "Telefon soojeneb" + "Mõned funktsioonid on piiratud, kuni telefon jahtub" + "Teie telefon proovib automaatselt maha jahtuda. Saate telefoni ikka kasutada, kuid see võib olla aeglasem.\n\nKui telefon on jahtunud, töötab see tavapäraselt." diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index 94941104f021..d48f480e49d9 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -410,19 +410,25 @@ "Gailuen kontrola" "Profila kontrolatzeko aukera" "Sareen kontrola" + "VPN" + "Sare-erregistroak" "Desgaitu VPN konexioa" "Deskonektatu VPN sarea" - "Gailuaren kudeatzailea:%1$s.\n\nAdministratzaileak gailua eta sareko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webgune seguruak barne. Informazio gehiago lortzeko, jarri administratzailearekin harremanetan." + "%1$s erakundeak kudeatzen du gailua.\n\nGailuko ezarpenak, enpresa-sarbidea, aplikazioak eta datuak gainbegira eta kudea ditzake administratzaileak, baita gailuaren kokapen-informazioa ere. Informazio gehiago lortzeko, jarri administratzailearekin harremanetan." + "%1$s aplikaziora konektatuta zaude eta hark sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." + " " + "Ireki VPN ezarpenak" + "Administratzaileak sare-erregistroak aktibatu ditu; horrela, zure gailuko trafikoa gainbegira dezake.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." "Aplikazio bati VPN konexio bat konfiguratzeko baimena eman diozu.\n\nAplikazio horrek gailuko eta sareko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." - "Gailuaren kudeatzailea:%1$s.\n\nAdministratzaileak ezarpenak, enpresako sarbidea, aplikazioak, gailuarekin lotutako datuak eta gailuaren kokapenari buruzko informazioa kontrola eta kudea ditzake.\n\nSareko jarduerak (mezu elektronikoak, aplikazioak eta webguneak barne) kontrola ditzakeen VPN batera konektatuta zaude.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." - "%1$s da laneko profilaren kudeatzailea.\n\nAdministratzaileak sareko jarduerak (mezu elektronikoak, aplikazioak eta webguneak barne) kontrola ditzake.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan.\n\nHorrez gain, sareko jarduerak kontrola ditzakeen VPN batera konektatuta zaude." + "%1$s erakundeak kudeatzen du gailua.\n\nGailuko ezarpenak, enpresa-sarbidea, aplikazioak eta datuak gainbegira eta kudea ditzake administratzaileak, baita gailuaren kokapen-informazioa ere.\n\nVPN batera konektatuta zaude, eta hark sarean egiten duzuna gainbegira ditzake; besteak beste, mezu elektronikoak, aplikazioak eta webguneak.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." + "%1$s erakundeak kudeatzen du zure laneko profila.\n\nAdministratzaileak sareko jarduerak kontrola diezazkizuke, besteak beste, posta elektronikoa, aplikazioak eta webguneak.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan.\n\nHorrez gain, VPN batera zaude konektatuta, eta hark ere kontrola ditzake zure sareko jarduerak." "VPN konexioa" "%1$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduera pertsonalak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." "%1$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduera pertsonalak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne." - "%1$s da laneko profilaren kudeatzailea, eta profila %2$s aplikaziora konektatuta dago. Aplikazio horrek sarean egiten dituzun laneko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." + "%1$s erakundeak kudeatzen du zure laneko profila. Erakundea %2$s aplikaziora dago konektatuta, bera arduratzen baita laneko sareko jarduerak kontrolatzeaz, besteak beste, posta elektronikoa, aplikazioak eta webguneak.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." "%1$s da laneko profilaren kudeatzailea, eta profila %2$s aplikaziora konektatuta dago. Aplikazio horrek sarean egiten dituzun laneko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nHorrez gain, sarean egiten dituzun jarduera pertsonalak kontrola ditzakeen %3$s aplikaziora konektatuta zaude." - "%1$s da gailuaren kudeatzailea.\n\nAdministratzaileak ezarpenak, enpresako sarbidea, aplikazioak, gailuarekin lotutako datuak eta gailuaren kokapenari buruzko informazioa kontrola eta kudea ditzake.\n\n%2$s aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." + "%1$s erakundeak kudeatzen du gailua.\n\nGailuko ezarpenak, enpresa-sarbidea, aplikazioak eta datuak gainbegira eta kudea ditzake administratzaileak, baita gailuaren kokapen-informazioa ere.\n\n%2$s aplikaziora konektatuta zaude, eta hark sarean egiten duzuna gainbegira ditzake; besteak beste, mezu elektronikoak, aplikazioak eta webguneak.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan." "Gailua blokeatuta egongo da eskuz desblokeatu arte" "Eskuratu jakinarazpenak azkarrago" "Ikusi desblokeatu baino lehen" @@ -433,7 +439,8 @@ "Zabaldu" "Tolestu" "Pantaila ainguratuta dago" - "Horrela, ikusgai egongo da aingura kendu arte. Aingura kentzeko, eduki sakatuta \"Atzera\" botoia." + "Horrela, ikusgai egongo da aingura kendu arte. Aingura kentzeko, eduki sakatuta \"Atzera\" eta \"Ikuspegi orokorra\" botoiak." + "Horrela, ikusgai egongo da aingura kendu arte. Aingura kentzeko, eduki sakatuta \"Ikuspegi orokorra\" botoia." "Ados" "Ez, eskerrik asko" "%1$s ezkutatu nahi duzu?" @@ -654,4 +661,7 @@ "Editatu ezarpenen ordena." "%1$d/%2$d orria" "Jakinarazpenak ezin dira ezkutatu edo blokeatu" + "Berotzen ari da telefonoa" + "Eginbide batzuk ezingo dira erabili telefonoa hoztu arte" + "Telefonoa automatikoki saiatuko da hozten. Hoztu bitartean, telefonoa erabiltzen jarrai dezakezu, baina mantsoago funtziona lezake.\n\nTelefonoaren tenperatura jaitsi bezain laster, ohi bezala funtzionatzen jarraituko du." diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index abb7e1ee51f3..e28f33282930 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -408,19 +408,25 @@ "کنترل دستگاه" "کنترل نمایه" "کنترل شبکه" + "VPN" + "گزارش‌گیری شبکه" "‏غیرفعال کردن VPN" "‏قطع اتصال VPN" - "مدیریت دستگاه شما توسط %1$s.\n\nسرپرستتان می‌تواند تنظیمات، دسترسی شرکت، برنامه‌ها داده‌های مرتبط با دستگاهتان و اطلاعات مکان دستگاهتان را کنترل و مدیریت کند. برای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید." + "دستگاهتان توسط %1$s مدیریت می‌شود.\n\nسرپرست شما می‌تواند تنظیمات، دسترسی شرکتی، برنامه‌ها، داده‌های مرتبط با دستگاه و اطلاعات مکان دستگاه شما را مدیریت کند و بر آن‌ها نظارت داشته باشد. برای اطلاعات بیشتر، با سرپرست خود تماس بگیرید." + "به %1$s وصل شده‌اید، که می‌تواند فعالیت شبکه شما را (ازجمله رایانامه‌‌ها، برنامه‌‌ها و وب‌سایت‌ها) کنترل کند." + " " + "‏باز کردن تنظیمات VPN" + "سرپرست سیستم شما گزارش‌گیری شبکه را (که بر ترافیک دستگاهتان نظارت می‌کند) روشن کرده است.\n\nبرای اطلاعات بیشتر، با سرپرست خود تماس بگیرید." "‏شما به برنامه‌ای برای تنظیم اتصال VPN اجازه دادید.\n\n این برنامه می‌تواند دستگاه و فعالیت شبکه‌تان را کنترل کند، از جمله رایانامه‌، برنامه‌ و وب‌سایت‌ها." - "‏دستگاهتان توسط %1$s مدیریت می‌شود.\n\nسرپرستتان می‌تواند تنظیمات، دسترسی شرکت، برنامه‌ها، داده‌های مرتبط با دستگاهتان و اطلاعات مکان دستگاهتان را کنترل و مدیریت کند.\n\nشما به یک VPN وصل هستید که می‌تواند فعالیت شبکه شما را کنترل کند، از جمله ایمیل‌ها، برنامه‌ها و وب‌سایت‌ها.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید." - "‏نمایه کاری شما توسط %1$s مدیریت می‌شود.\n\nسرپرستتان می‌تواند فعالیت شبکه‌تان از جمله رایانامه‌، برنامه‌ و وب‌‌سایت‌ها را کنترل کند.\n\nبرای دریافت اطلاعات بیشتر با سرپرستتان تماس بگیرید.\n\nهمچنین به یک VPN وصل هستید که می‌تواند فعالیت شبکه شما را کنترل کند." + "‏دستگاهتان توسط %1$s مدیریت می‌شود.\n\nسرپرست شما می‌تواند تنظیمات، دسترسی شرکتی، برنامه‌ها، داده‌های مرتبط با دستگاه و اطلاعات مکان دستگاه شما را مدیریت کند و بر آن‌ها نظارت داشته باشد.\n\nشما با یک VPN مرتبط هستید که می‌تواند بر فعالیت شبکه شما (ازجمله رایانامه‌ها، برنامه‌ها و وب‌سایت‌ها) نظارت داشته باشد.\n\nبرای اطلاعات بیشتر، با سرپرست خود تماس بگیرید." + "‏نمایه کاری شما توسط %1$s مدیریت می‌شود.\n\nسرپرست سیستم شما می‌تواند بر فعالیت شبکه شما (ازجمله رایانامه‌ها، برنامه‌ها و وب‌سایت‌ها) نظارت داشته باشد.\n\nبرای اطلاعات بیشتر، با سرپرست خود تماس بگیرید.\n\nهمچنین به VPN متصل هستید که می‌تواند بر فعالیت شبکه شما نظارت داشته باشد." "VPN" "شما به %1$s وصل شده‌اید، که می‌تواند فعالیت شبکه شما از جمله رایانامه‌، برنامه‌ و وب‌سایت‌ها را کنترل کند." "شما به %1$s وصل شده‌اید، که می‌تواند فعالیت شبکه شخصی شما از جمله رایانامه‌، برنامه‌ و وب‌سایت‌ها را کنترل کند." "به %1$s وصل شده‌اید، که می‌تواند فعالیت شبکه شخصی شما را (ازجمله رایانامه‌‌ها، برنامه‌‌ها و وب‌سایت‌ها) کنترل کند." - "نمایه کاری‌تان توسط %1$s مدیریت می‌شود. این به %2$s وصل است که فعالیت شبکه کاری‌تان از جمله رایانامه، برنامه و وب‌سایت‌ها را کنترل می‌کند.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید." + "نمایه کاری شما توسط %1$s مدیریت می‌شود. این نمایه با %2$s مرتبط است که می‌تواند بر فعالیت شبکه شما (ازجمله رایانامه‌ها، برنامه‌ها و وب‌سایت‌ها) نظارت داشته باشد.\n\nبرای اطلاعات بیشتر، با سرپرست سیستم خود تماس بگیرید." "نمایه کاری شما توسط %1$s مدیریت می‌شود. این به %2$s متصل است که می‌تواند فعالیت شبکه کاری‌تان از جمله رایانامه، برنامه و وب‌سایت‌ها را کنترل کند.\n\nشما همچنین به %3$s متصل هستید که می‌تواند فعالیت شبکه شخصی‌تان را کنترل کند." - "دستگاهتان توسط %1$s مدیریت می‌شود.\n\nسرپرستتان می‌تواند تنظیمات، دسترسی شرکت، برنامه‌ها، داده‌های مرتبط با دستگاهتان و اطلاعات مکان دستگاهتان را کنترل و مدیریت کند.\n\nشما به %2$s وصل هستید که می‌تواند فعالیت شبکه شما را کنترل کند، از جمله رایانامه‌، برنامه‌ و وب‌سایت‌ها.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید." + "دستگاهتان توسط %1$s مدیریت می‌شود.\n\nسرپرست شما می‌تواند تنظیمات، دسترسی شرکتی، برنامه‌ها، داده‌های مرتبط با دستگاه و اطلاعات مکان دستگاه شما را مدیریت کند و بر آن‌ها نظارت داشته باشد.\n\nشما با %2$s مرتبط هستید که می‌تواند بر فعالیت شبکه شما (ازجمله رایانامه‌ها، برنامه‌ها و وب‌سایت‌ها) نظارت داشته باشد.\n\nبرای اطلاعات بیشتر، با سرپرست خود تماس بگیرید." "دستگاه قفل باقی می‌ماند تا زمانی که قفل آن را به صورت دستی باز کنید" "دریافت سریع‌تر اعلان‌ها" "قبل از باز کردن قفل آنها را مشاهده کنید" @@ -431,7 +437,8 @@ "بزرگ کردن" "کوچک کردن" "صفحه نمایش پین شد" - "تا زمانی که پین را بردارید، در نما نگه‌داشته می‌شود. برای برداشتن پین، «برگشت» را لمس کنید و نگه‌دارید." + "تا زمانی که پین را بردارید، در نما نگه‌داشته می‌شود. برای برداشتن پین، «برگشت» و «نمای کلی» را لمس کنید و نگه‌دارید." + "تا زمانی که پین را بردارید، در نما نگه‌داشته می‌شود. برای برداشتن پین، «نمای کلی» را لمس کنید و نگه‌دارید." "متوجه شدم" "نه متشکرم" "%1$s مخفی شود؟" @@ -652,4 +659,7 @@ "ویرایش ترتیب تنظیمات." "صفحه %1$d از %2$d" "نمی‌توان اعلان‌ها را بی‌صدا یا مسدود کرد" + "تلفن درحال گرم شدن است" + "وقتی تلفن درحال خنک شدن است، بعضی از قابلیت‌ها محدود می‌شوند" + "تلفنتان به‌طور خودکار سعی می‌کند خنک شود. همچنان می‌توانید از تلفنتان استفاده کنید، اما ممکن است کندتر عمل کند.\n\nوقتی تلفن خنک شد، عملکرد عادی‌اش از سرگرفته می‌شود." diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 910ac29b7b05..a68e733f3175 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -408,19 +408,25 @@ "Laitteiden valvonta" "Profiilin valvonta" "Verkon valvonta" + "VPN" + "Lokitiedostojen tallennus" "Poista VPN käytöstä" "Katkaise VPN-yhteys" - "Tätä laitetta hallinnoi %1$s.\n\nJärjestelmänvalvoja voi tarkkailla ja hallinnoida asetuksiasi, yrityskäyttöä, sovelluksia, laitteeseesi yhdistettyjä tietoja sekä laitteesi sijaintitietoja. Saat lisätietoja järjestelmänvalvojalta." + "Laitettasi hallitsee %1$s.\n\nJärjestelmänvalvoja voi valvoa ja hallita asetuksia, yrityskäyttöä, sovelluksia, laitteeseen yhdistettyjä tietoja ja laitteen sijaintitietoja. Pyydä lisätietoja järjestelmänvalvojalta." + "Olet yhteydessä sovellukseen %1$s, joka voi valvoa verkkotoimintaasi, esimerkiksi sähköposteja, sovelluksia ja verkkosivustoja." + " " + "Avaa VPN-asetukset" + "Järjestelmänvalvoja on ottanut käyttöön verkkolokitietojen tallentamisen. Sen avulla seurataan laitteellasi tapahtuvaa liikennettä.\n\nPyydä lisätietoja järjestelmänvalvojalta." "Olet myöntänyt sovellukselle oikeuden VPN-yhteyden muodostamiseen.\n\nSovellus voi valvoa laitettasi ja toimintaasi verkossa, esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja." - "Tätä laitetta hallinnoi %1$s.\n\nJärjestelmänvalvoja voi tarkkailla ja hallinnoida asetuksiasi, yrityskäyttöä, sovelluksia, laitteeseesi yhdistettyjä tietoja sekä laitteesi sijaintitietoja.\n\nKäytät VPN-yhteyttä, joka voi valvoa toimiasi verkossa, esimerkiksi sähköpostin, sovellusten ja verkkosivustojen käyttöä.\n\nSaat lisätietoja järjestelmänvalvojalta." - "Työprofiiliasi hallinnoi %1$s.\n\nJärjestelmänvalvojasi voi valvoa toimintaasi verkossa. Hän voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisätietoja saat järjestelmänvalvojaltasi.\n\nLisäksi olet muodostanut yhteyden VPN-palveluun, joka voi valvoa toimintaasi verkossa." + "Laitettasi hallitsee %1$s.\n\nJärjestelmänvalvoja voi valvoa ja hallita asetuksia, yrityskäyttöä, sovelluksia, laitteeseen yhdistettyjä tietoja ja laitteen sijaintitietoja.\n\nOlet yhteydessä VPN:ään, joka voi valvoa sähköpostin, sovellusten ja verkkosivustojen käyttöä sekä muuta toimintaasi verkossa.\n\nPyydä lisätietoja järjestelmänvalvojalta." + "Työprofiiliasi hallitsee %1$s.\n\nJärjestelmänvalvoja voi valvoa sähköpostin, sovellusten ja verkkosivustojen käyttöä sekä muuta toimintaasi verkossa.\n\nPyydä lisätietoja järjestelmänvalvojalta.\n\nOlet myös yhteydessä VPN:ään, joka voi valvoa toimintaasi verkossa." "VPN" "Olet muodostanut yhteyden sovellukseen %1$s, joka voi valvoa toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja." "Olet muodostanut yhteyden sovellukseen %1$s, joka voi valvoa henkilökohtaista toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja." "Olet muodostanut yhteyden sovellukseen %1$s, joka voi valvoa henkilökohtaista toimintaasi verkossa. Sovellus voi esimerkiksi seurata avaamiasi sähköposteja, sovelluksia ja verkkosivustoja." - "Työprofiiliasi hallinnoi %1$s. Se on yhteydessä sovellukseen %2$s, joka voi valvoa työhön liittyvää toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nSaat lisätietoja järjestelmänvalvojaltasi." + "Työprofiiliasi hallitsee %1$s. Profiili on yhteydessä sovellukseen %2$s, joka voi valvoa sähköpostin, sovellusten ja verkkosivustojen käyttöä sekä muuta toimintaasi verkossa.\n\nPyydä lisätietoja järjestelmänvalvojalta." "Työprofiiliasi hallinnoi %1$s. Se on yhteydessä sovellukseen %2$s, joka voi valvoa työhön liittyvää toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisäksi olet yhteydessä sovellukseen %3$s, joka voi valvoa henkilökohtaista toimintaasi verkossa." - "Laitettasi hallinnoi %1$s.\n\nJärjestelmänvalvojasi voi valvoa ja hallinnoida laitteesi asetuksia, yrityskäyttöä, sovelluksia, laitteeseesi liittyviä tietoja ja laitteen sijaintitietoja.\n\nOlet yhteydessä sovellukseen %2$s, joka voi valvoa toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisätietoja saat järjestelmänvalvojaltasi." + "Laitettasi hallitsee %1$s.\n\nJärjestelmänvalvoja voi valvoa ja hallita asetuksia, yrityskäyttöä, sovelluksia, laitteeseen yhdistettyjä tietoja ja laitteen sijaintitietoja.\n\nOlet yhteydessä sovellukseen %2$s, joka voi valvoa sähköpostin, sovellusten ja verkkosivustojen käyttöä sekä muuta toimintaasi verkossa.\n\nPyydä lisätietoja järjestelmänvalvojalta." "Laite pysyy lukittuna, kunnes se avataan käsin" "Näe ilmoitukset nopeammin" "Näytä ennen lukituksen avaamista" @@ -431,7 +437,8 @@ "Laajenna." "Tiivistä." "Näyttö on kiinnitetty" - "Tämä pitää sen näkyvissä, kunnes peruutat kiinnityksen. Peruuta kiinnitys koskettamalla Edellinen-kohtaa pitkään." + "Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Viimeisimmät." + "Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Viimeisimmät." "Selvä" "Ei kiitos" "Piilotetaanko %1$s?" @@ -652,4 +659,7 @@ "Muokkaa asetusten järjestystä." "Sivu %1$d/%2$d" "Ilmoituksia ei voi mykistää tai estää" + "Puhelin lämpenee" + "Joidenkin ominaisuuksien käyttöä on rajoitettu puhelimen jäähtymisen aikana." + "Puhelimesi yrittää automaattisesti jäähdyttää itsensä. Voit silti käyttää puhelinta, mutta se voi toimia hitaammin.\n\nKun puhelin on jäähtynyt, se toimii normaalisti." diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 8c5e46f747a0..e99aa43fc332 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -410,19 +410,25 @@ "Surveillance d\'appareils" "Contrôle de profil" "Surveillance réseau" + "RPV" + "Journalisation réseau" "Désactiver le RPV" "Déconnecter le RPV" - "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les données de localisation de celui-ci. Pour en savoir plus, communiquez avec votre administrateur." + "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données et le service de localisation associés à votre appareil. Pour en savoir plus, communiquez avec votre administrateur." + "Vous êtes connecté à %1$s, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web." + " " + "Paramètres RPV ouverts" + "Votre administrateur a activé la journalisation réseau, qui surveille le trafic sur votre appareil.\n\nPour en savoir plus, communiquez avec lui." "Vous avez autorisé une application à configurer une connexion RPV.\n\nCette application peut contrôler l\'activité de votre appareil et votre activité sur le réseau, y compris les courriels, les applications et les sites Web." - "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les données de localisation de celui-ci.\n\nVous êtes connecté à un RPV qui peut contrôler votre activité sur le réseau (courriels, applications et sites Web).\n\nPour en savoir plus, communiquez avec votre administrateur." - "Votre profil professionnel est géré par %1$s.\n\nVotre administrateur peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur.\n\nVous êtes également connecté à un RPV qui peut contrôler votre activité sur le réseau." + "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données et le service de localisation associés à votre appareil.\n\nVous êtes connecté à un RPV, qui peut surveiller votre activité réseau, y compris vos courriels, vos applications et les sites Web que vous visitez.\n\nPour en savoir plus, communiquez avec votre administrateur." + "Votre profil professionnel est géré par %1$s.\n\nVotre administrateur peut surveiller votre activité sur le réseau, y compris les courriels que vous échangez, les applications que vous utilisez et les sites Web que vous visitez.\n\nPour en savoir plus, communiquez avec votre administrateur.\n\nVous êtes aussi connecté à un RPV, qui peut surveiller votre activité sur le réseau." "RPV" "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web." "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les courriels, les applications et les sites Web." "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les courriels, les applications et les sites Web." - "Votre profil professionnel est géré par %1$s. Il est connecté à %2$s. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur." + "Votre profil professionnel est géré par %1$s. Il est connecté à %2$s, qui peut surveiller votre activité professionnelle sur le réseau, y compris les courriels que vous échangez, les applications que vous utilisez et les sites Web que vous visitez.\n\nPour en savoir plus, communiquez avec votre administrateur." "Votre profil professionnel est géré par %1$s. Il est connecté à %2$s. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web.\n\nVous êtes également connecté à %3$s. Cette application peut contrôler votre activité personnelle sur le réseau." - "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et ses données de localisation.\n\nVous êtes connecté à %2$s, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur." + "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux données d\'entreprise, les applications, les données et le service de localisation associés à votre appareil.\n\nVous êtes connecté à %2$s, qui peut surveiller votre activité réseau, y compris vos courriels, vos applications et les sites Web que vous visitez.\n\nPour en savoir plus, communiquez avec votre administrateur." "L\'appareil restera verrouillé jusqu\'à ce que vous le déverrouilliez manuellement" "Voir les notifications plus rapidement" "Afficher les notifications avant de déverrouiller l\'appareil" @@ -433,7 +439,8 @@ "Développer" "Réduire" "L\'écran est épinglé" - "Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Retour »." + "Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Retour » et « Aperçu »." + "Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Aperçu »." "OK" "Non, merci" "Masquer %1$s?" @@ -654,4 +661,7 @@ "Modifier l\'ordre des paramètres." "Page %1$d sur %2$d" "Impossible de désactiver ou de bloquer les notifications" + "Le téléphone commence à chauffer" + "Les fonctionnalités sont limitées pendant que le téléphone refroidit" + "Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement." diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 4b58a6d376df..ffb2ecd536e5 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -410,19 +410,25 @@ "Contrôle des appareils" "Contrôle du profil" "Contrôle du réseau" + "VPN" + "Journalisation réseau" "Désactiver le VPN" "Déconnecter le VPN" - "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les informations de localisation de celui-ci. Pour en savoir plus, contactez votre administrateur." + "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus d\'entreprise, les applications, les données et les informations de localisation associées à votre appareil. Pour en savoir plus, contactez-le." + "Vous êtes connecté à %1$s, qui peut contrôler votre activité sur le réseau, y compris les e-mails, les applications et les sites Web." + " " + "Ouvrir les paramètres VPN" + "Votre administrateur a activé la journalisation réseau, qui surveille le trafic sur votre appareil.\n\nPour en savoir plus, contactez-le." "Vous avez autorisé une application à configurer une connexion VPN.\n\nCette application peut contrôler l\'activité de votre appareil et votre activité sur le réseau, y compris votre activité relative aux e-mails, aux applications et aux sites Web." - "Votre appareil géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les informations de localisation de celui-ci.\n\nVous êtes connecté à un VPN qui peut contrôler votre activité sur le réseau (e-mails, applications et sites Web).\n\nPour en savoir plus, contactez votre administrateur." - "Votre profil professionnel est géré par %1$s.\n\nVotre administrateur peut contrôler votre activité sur le réseau (e-mails, applications et sites Web).\n\nPour en savoir plus, contactez votre administrateur.\n\nVous êtes également connecté à un VPN qui peut contrôler votre activité sur le réseau." + "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus d\'entreprise, applications, données et informations de localisation associées à cet appareil.\n\nVous êtes connecté à un VPN qui peut contrôler votre activité sur le réseau, dont l\'activité relative aux e-mails, applications et sites Web.\n\nPour en savoir plus, contactez votre administrateur." + "Votre profil professionnel est géré par %1$s.\n\nVotre administrateur peut contrôler votre activité sur le réseau, y compris au niveau des e-mails, des applications et des sites Web.\n\nPour en savoir plus, contactez-le.\n\nVous êtes également connecté à un VPN qui peut contrôler votre activité sur le réseau." "VPN" "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web." "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris votre activité relative aux e-mails, aux applications et aux sites Web." "Vous êtes connecté à %1$s. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les e-mails, les applications et les sites Web." - "Votre profil professionnel est géré par %1$s. Il est connecté à %2$s. Cette application peut contrôler l\'activité de ce profil sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web.\n\nPour en savoir plus, contactez votre administrateur." + "Votre profil professionnel est géré par %1$s et associé à %2$s. Cette application peut contrôler l\'activité de ce profil sur le réseau, y compris au niveau des e-mails, des applications et des sites Web.\n\nPour en savoir plus, contactez votre administrateur." "Votre profil professionnel est géré par %1$s. Il est connecté à %2$s. Cette application peut contrôler l\'activité de ce profil sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web.\n\nVous êtes également connecté à %3$s. Cette application peut surveiller votre activité personnelle sur le réseau." - "Votre appareil géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les informations de localisation de celui-ci.\n\nVous êtes connecté à %2$s qui peut contrôler votre activité sur le réseau (e-mails, applications et sites Web).\n\nPour en savoir plus, contactez votre administrateur." + "Votre appareil est géré par %1$s.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus d\'entreprise, les applications, les données et les informations de localisation associées à cet appareil.\n\nVous êtes connecté à %2$s, qui peut contrôler votre activité sur le réseau, dont celle relative aux e-mails, applications et sites Web.\n\nPour en savoir plus, contactez votre administrateur." "L\'appareil restera verrouillé jusqu\'à ce que vous le déverrouilliez manuellement." "Recevoir les notifications plus vite" "Afficher les notifications avant de déverrouiller l\'appareil" @@ -433,7 +439,8 @@ "Développer" "Réduire" "Écran épinglé" - "Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur \"Retour\"." + "Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur les boutons Retour et Aperçu." + "Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur le bouton Aperçu." "OK" "Non, merci" "Masquer %1$s ?" @@ -654,4 +661,7 @@ "Modifier l\'ordre des paramètres." "Page %1$d sur %2$d" "Impossible d\'ignorer ou de bloquer les notifications" + "Le téléphone chauffe" + "Fonctionnalités limitées pendant le refroidissement du téléphone" + "Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement." diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 449c747814d5..da2d5ca95852 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -410,19 +410,25 @@ "Supervisión de dispositivos" "Supervisión do perfil" "Supervisión de rede" + "VPN" + "Rexistro na rede" "Desactivar VPN" "Desconectar VPN" - "O teu dispositivo está xestionado por %1$s.\n\nO teu administrador pode supervisar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co teu dispositivo e a información de localización do teu dispositivo. Para obter máis información, ponte en contacto co teu administrador." + "%1$s xestiona o teu dispositivo.\n\nO teu administrador pode controlar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co teu dispositivo e a información sobre a súa localización. Para obter máis información, contacta co administrador." + "Estás conectado a %1$s, que pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web." + " " + "Abrir configuración da VPN" + "O administrador activou o rexistro na rede, que controla o tráfico do teu dispositivo.\n\nPara obter máis información, contacta co administrador." "Outorgaches permiso a unha aplicación para configurar unha conexión VPN.\n\nEsta aplicación pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web." - "O teu dispositivo está xestionado por %1$s.\n\nO teu administrador pode supervisar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co teu dispositivo e a información de localización do teu dispositivo.\n\nEstás conectado a unha VPN, que pode supervisar a túa actividade de rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co teu administrador." - "O teu perfil de traballo está xestionado por %1$s.\n\nO teu administrador é capaz de supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co teu administrador.\n\nTamén estás conectado a unha VPN, que pode supervisar a túa actividade na rede." + "%1$s xestiona o teu dispositivo.\n\nO teu administrador pode controlar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co teu dispositivo e a información sobre a súa localización.\n\nEstás conectado a unha VPN, que pode controlar a túa actividade da rede, mesmo os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, contacta co administrador." + "%1$s xestiona o teu perfil de traballo.\n\nO administrador pode controlar a túa actividade na rede, mesmo os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co administrador.\n\nTamén estás conectado a unha VPN, que pode controlar a túa actividade na rede." "VPN" "Estás conectado a %1$s, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web." "Estás conectado a %1$s, que pode supervisar a túa actividade persoal na rede, incluídos os correos electrónicos, as aplicacións e os sitios web." "Estás conectado a %1$s, que pode supervisar a túa actividade persoal na rede, incluídos os correos electrónicos, as aplicacións e os sitios web." - "O teu perfil de traballo está xestionado por %1$s. Está conectado a %2$s, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co teu administrador." + "%1$s xestiona o teu perfil de traballo. Este está conectado coa aplicación %2$s, que pode controlar a túa actividade na rede de traballo, mesmo os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co administrador." "O teu perfil de traballo está xestionado por %1$s. Está conectado a %2$s, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nTamén estás conectado a %3$s, que pode supervisar a túa actividade persoal na rede." - "O dispositivo está xestionado por %1$s.\n\nO teu administrador pode supervisar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co dispositivo e a información de localización do dispositivo.\n\nEstás conectado a %2$s, que pode supervisar a túa actividade na rede: os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, contacta co teu administrador." + "%1$s xestiona o teu dispositivo.\n\nO teu administrador pode controlar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co teu dispositivo e a información sobre a súa localización.\n\nEstás conectado a %2$s, que pode controlar a túa actividade da rede, mesmo os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, contacta co administrador." "O dispositivo permanecerá bloqueado ata que o desbloquees manualmente" "Recibir notificacións máis rápido" "Consúltaas antes de desbloquear" @@ -433,7 +439,8 @@ "Ampliar" "Contraer" "A pantalla está fixada" - "A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Atrás." + "A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Atrás e Visión xeral." + "A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Visión xeral." "De acordo" "Non, grazas" "Queres ocultar %1$s?" @@ -654,4 +661,7 @@ "Editar a orde das opcións de configuración." "Páxina %1$d de %2$d" "As notificacións non se poden silenciar nin bloquear" + "O teléfono está quentando" + "O uso dalgunhas funcións é limitado mentres o teléfono arrefría" + "O teléfono tentará arrefriar automaticamente. Podes utilizalo, pero é probable que funcione máis lento.\n\nUnha vez que arrefríe, funcionará con normalidade." diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index 5287576dfdee..2884505ff22a 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -408,19 +408,25 @@ "ઉપકરણ નિરીક્ષણ" "પ્રોફાઇલ નિરીક્ષણ" "નેટવર્ક મૉનિટરિંગ" + "VPN" + "નેટવર્ક લૉગિંગ" "VPN અક્ષમ કરો" "VPN ડિસ્કનેક્ટ કરો" - "તમારું ઉપકરણ %1$s દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતી મોનિટર અને સંચાલિત કરી શકે છે. વધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." + "તમારા ઉપકરણનું સંચાલન %1$s દ્વારા કરવામાં આવે છે. \n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કૉર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીનું નિરીક્ષણ અને સંચાલન કરી શકે છે. વધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." + "તમે %1$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિત તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." + " " + "VPN સેટિંગ્સ ખોલો" + "તમારા વ્યવસ્થાપકે નેટવર્ક લૉગિંગ ચાલુ કર્યુ છે, જે તમારા ઉપકરણ પર ટ્રાફિકનું નિરીક્ષણ કરે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." "તમે VPN કનેક્શન સેટ કરવા માટે ઍપ્લિકેશન પરવાનગી આપી.\n\nઆ ઍપ્લિકેશન ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિત તમારા ઉપકરણ અને નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." - "તમારું ઉપકરણ %1$s દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતી મોનિટર અને સંચાલિત કરી શકે છે.\n\nતમે VPN સાથે કનેક્ટ થયેલા છો જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની, તમારી નેટવર્ક પ્રવૃત્તિ મોનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." - "તમારી કાર્ય પ્રોફાઇલ %1$s દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરવામાં સમર્થ છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.\n\nતમે VPN સાથે પણ કનેક્ટ છો, જે તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." + "તમારા ઉપકરણનું સંચાલન %1$s દ્વારા કરવામાં આવે છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કૉર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીનું નિરીક્ષણ અને સંચાલન કરી શકે છે.\n\nતમે VPN સાથે કનેક્ટ કરેલ છે, જે ઇમેઇલો, ઍપ્લિકેશનો અને વેબસાઇટો સહિત, તમારી નેટવર્ક પ્રવૃત્તિઓનું નિરીક્ષણ કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." + "તમારી કાર્ય પ્રોફાઇલનું સંચાલન %1$s દ્વારા કરવામાં આવે છે.\n\n તમારા વ્યવસ્થાપક ઇમેઇલ, ઍપ્લિકેશનો, અને વેબસાઇટો સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરવામાં સક્ષમ છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.\n\nતમે VPN સાથે પણ કનેક્ટ કરેલ છે, જે તમારી નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરી શકે છે." "VPN" "તમે %1$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." "તમે %1$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." "તમે %1$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિત તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." - "તમારી કાર્ય પ્રોફાઇલ %1$s દ્વારા સંચાલિત થાય છે. તે %2$s સાથે કનેક્ટ થયેલ છે, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." + "તમારી કાર્ય પ્રોફાઇલનું સંચાલન %1$s દ્વારા કરવામાં આવે છે. તેને %2$s સાથે કનેક્ટ કરેલ છે, જે ઇમેઇલ, ઍપ્લિકેશનો અને વેબસાઇટો સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરી શકે છે. \n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." "તમારી કાર્ય પ્રોફાઇલ %1$s દ્વારા સંચાલિત થાય છે. તે %2$s સાથે કનેક્ટ થયેલ છે, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nતમે %3$s સાથે પણ કનેક્ટ થયેલ છો, જે તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે." - "તમારું ઉપકરણ %1$s દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક, સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીને મૉનિટર કરી અને સંચાલિત કરી શકે છે.\n\nતમે %2$s સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." + "તમારા ઉપકરણનું સંચાલન %1$s દ્વારા કરવામાં આવે છે. \n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કૉર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીનું નિરીક્ષણ અને સંચાલન કરી શકે છે.\n\nતમે %2$s સાથે કનેક્ટ કરેલ છે, જે ઇમેઇલો, ઍપ્લિકેશનો અને વેબસાઇટો સહિત, તમારી નેટવર્ક પ્રવૃત્તિઓનું નિરીક્ષણ કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો." "તમે ઉપકરણને મેન્યુઅલી અનલૉક કરશો નહીં ત્યાં સુધી તે લૉક રહેશે" "વધુ ઝડપથી સૂચનાઓ મેળવો" "તમે અનલૉક કરો તે પહેલાં તેમને જુઓ" @@ -431,7 +437,8 @@ "વિસ્તૃત કરો" "સંકુચિત કરો" "સ્ક્રીન પિન કરેલ છે" - "તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળને ટચ કરો અને પકડી રાખો." + "તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળ અને વિહંગાવલોકન ટચ કરો અને પકડી રાખો." + "તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે વિહંગાવલોકન ટચ કરો અને પકડી રાખો." "સમજાઈ ગયું" "નહીં આભાર" "%1$s ને છુપાવીએ?" @@ -652,4 +659,7 @@ "સેટિંગ્સનો ક્રમ સંપાદિત કરો." "%2$d માંથી %1$d પૃષ્ઠ" "સૂચનાઓ શાંત અથવા અવરોધિત કરી શકાતી નથી" + "ફોન ગરમ થઈ રહ્યો છે" + "ફોન ઠંડો થાય ત્યાં સુધી કેટલીક સુવિધાઓ મર્યાદિત હોય છે" + "તમારો ફોન આપમેળે ઠંડો થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ફોનનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડો ધીમો ચાલે.\n\nતમારો ફોન ઠંડો થઈ જવા પર, તે સામાન્ય રીતે ચાલશે." diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 5c24fe2cf3a9..d1c0b3837607 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -345,7 +345,7 @@ "खोजें" "%s के लिए ऊपर स्‍लाइड करें." "%s के लिए बाएं स्‍लाइड करें." - "आपको आपके द्वारा निर्दिष्ट किए गए अलार्म, रिमाइंडर्स, ईवेंट और कॉलर को छोड़कर अन्य ध्वनियों और कंपनों के द्वारा परेशान नहीं किया जाएगा." + "आपको आपके द्वारा निर्दिष्ट किए गए अलार्म, रिमाइंडर्स, इवेंट और कॉलर को छोड़कर अन्य ध्वनियों और कंपनों के द्वारा परेशान नहीं किया जाएगा." "कस्टमाइज़ करें" "इससे अलार्म, संगीत, वीडियो और गेम सहित सभी ध्‍वनियां और कंपन अवरुद्ध हो जाते हैं. आप अभी भी फ़ोन काॅल कर सकेंगे." "इससे अलार्म, संगीत, वीडियो और गेम सहित सभी ध्वनियां और कंपन अवरुद्ध हो जाते हैं." @@ -408,19 +408,25 @@ "डिवाइस को मॉनीटर करना" "प्रोफ़ाइल को मॉनीटर करना" "नेटवर्क को मॉनीटर करना" + "VPN" + "नेटवर्क लॉगिंग" "VPN अक्षम करें" "VPN डिस्‍कनेक्‍ट करें" - "आपका डिवाइस %1$s के द्वारा प्रबंधित है.\n\nआपका नियंत्रक सेटिंग, कॉर्पोरेट ऐक्‍सेस, ऐप्स, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्‍थान जानकारी की निगरानी और उसका प्रबंधन कर सकता है. अधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें." + "%1$s आपका डिवाइस प्रबंधित करता है.\n\nआपका व्यवस्थापक सेटिंग, कॉर्पोरेट एक्‍सेस, ऐप्लिकेशन, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्‍थान जानकारी की निगरानी और उनका प्रबंधन कर सकता है. अधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें." + "आप %1$s से कनेक्‍ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइट सहित आपकी नेटवर्क गतिविधि को मॉनिटर कर सकता है." + " " + "VPN सेटिंग खोलें" + "आपके व्‍यवस्‍थापक ने नेटवर्क लॉग करना चालू कर दिया है, जो आपके डिवाइस पर ट्रैफ़िक की निगरानी करता है.\n\nअधिक जानकारी के लिए अपने व्‍यवस्‍थापक से संपर्क करें." "आपने किसी ऐप को VPN कनेक्‍शन सेट करने की अनुमति दी है.\n\nयह ऐप ईमेल, ऐप्‍स और सुरक्षित वेबसाइटों सहित आपके डिवाइस और नेटवर्क की गतिविधि की निगरानी कर सकता है." - "आपका डिवाइस %1$s के द्वारा प्रबंधित है.\n\nआपका नियंत्रक सेटिंग, कॉर्पोरेट ऐक्‍सेस, ऐप्स, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्‍थान जानकारी की निगरानी और उसका प्रबंधन कर सकता है.\n\nआप एक VPN से कनेक्‍ट हैं, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें." - "आपकी कार्य प्रोफ़ाइल %1$s के द्वारा प्रबंधित है.\n\nआपका नियंत्रक ईमेल, ऐप्‍स और सुरक्षित वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी करने में सक्षम है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें.\n\nआप एक ऐसे VPN से भी कनेक्‍ट हैं, जो आपकी नेटवर्क गतिविधि की निगरानी कर सकता है." + "%1$s आपका डिवाइस प्रबंधित करता है.\n\nआपका व्यवस्थापक सेटिंग, कॉर्पोरेट एक्‍सेस, ऐप्लिकेशन, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्‍थान जानकारी की निगरानी और उनका प्रबंधन कर सकता है.\n\nआप ऐसे VPN से कनेक्ट हैं, जो आपकी नेटवर्क गतिविधि, जिसमें ईमेल, ऐप्लिकेशन और वेबसाइटें शामिल हैं, की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें." + "%1$s आपकी कार्य प्रोफ़ाइल को प्रबंधित करता है.\n\nआपका व्‍यवस्‍थापक ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए अपने व्‍यवस्‍थापक से संपर्क करें.\n\nआप ऐसे VPN से भी कनेक्‍ट हैं, जो आपकी नेटवर्क गतिविधि की निगरानी कर सकता है." "VPN" "आप %1$s से कनेक्‍ट हैं, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है." "आप %1$s से कनेक्‍ट हैं, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी व्‍यक्‍तिगत नेटवर्क गतिविधि की निगरानी कर सकता है." "आप %1$s से कनेक्‍ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइट सहित आपकी व्‍यक्‍तिगत नेटवर्क गतिविधि को मॉनिटर कर सकता है." - "आपकी कार्य प्रोफ़ाइल %1$s के द्वारा प्रबंधित है. वह %2$s से कनेक्‍ट है, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी कार्य नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें." + "%1$s आपकी कार्य प्रोफ़ाइल को प्रबंधित करता है. वह ऐसे %2$s से कनेक्‍ट है, जो ईमेल, ऐप्लिकेशन और वेबसाइटों सहित आपकी कार्य नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए अपने व्यवस्थापक से संपर्क करें." "आपकी कार्य प्रोफ़ाइल %1$s के द्वारा प्रबंधित है. वह %2$s से कनेक्‍ट है, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी कार्य नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nआप %3$s से भी कनेक्‍ट हैं, जो आपकी व्‍यक्‍तिगत नेटवर्क गतिविधि की निगरानी कर सकता है." - "आपका डिवाइस %1$s के द्वारा प्रबंधित है.\n\nआपका नियंत्रक सेटिंग, कॉर्पोरेट ऐक्‍सेस, ऐप्स, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्‍थान जानकारी की निगरानी और उसका प्रबंधन कर सकता है.\n\nआप %2$s से कनेक्‍ट हैं, जो ईमेल, ऐप्‍स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें." + "%1$s आपका डिवाइस प्रबंधित करता है.\n\nआपका व्यवस्थापक सेटिंग, कॉर्पोरेट एक्‍सेस, ऐप्लिकेशन, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्‍थान जानकारी की निगरानी और उनका प्रबंधन कर सकता है.\n\nआप ऐसे %2$s से कनेक्ट हैं, जो आपकी नेटवर्क गतिविधि, जिसमें ईमेल, ऐप्लिकेशन और वेबसाइटें शामिल हैं, की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें." "जब तक कि आप मैन्‍युअल रूप से अनलॉक नहीं करते तब तक डिवाइस लॉक रहेगा" "सूचनाएं अधिक तेज़ी से प्राप्त करें" "आपके द्वारा उन्हें अनलॉक किए जाने से पहले देखें" @@ -431,7 +437,8 @@ "विस्तृत करें" "संक्षिप्त करें" "स्‍क्रीन पिन कर दी गई है" - "इससे वह तब तक दृश्‍य में बना रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए वापस जाएं को स्‍पर्श करके रखें." + "इससे वह तब तक दृश्य में बना रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, वापस जाएं और अवलोकन को स्पर्श करके रखें." + "इससे वह तब तक दृश्य में बना रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, अवलोकन को स्पर्श करके रखें." "समझ लिया" "नहीं, रहने दें" "%1$s को छिपाएं?" @@ -650,6 +657,9 @@ "विवरण खोलें." "%s सेटिंग खोलें." "सेटिंग का क्रम संपादित करें." - "पृष्ठ %2$d में से %1$d" + "पेज %2$d में से %1$d" "नोटिफ़िकेशन मौन या अवरुद्ध नहीं किए जा सकते हैं" + "फ़ोन गर्म हो रहा है" + "फ़ोन के ठंडा होने के दौरान कुछ सुविधाएं सीमित होती हैं" + "आपका फ़ोन अपने आप ठंडा होने की कोशिश करेगा. आप अभी भी अपने फ़ोन का उपयोग कर सकते हैं, लेकिन हो सकता है कि यह धीमी गति से चले.\n\nठंडा हो जाने पर आपका फ़ोन सामान्य रूप से चलेगा." diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index df3ccf1e5fc1..8dc10aefc693 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -410,19 +410,25 @@ "Nadzor uređaja" "Nadzor profila" "Nadzor mreže" + "VPN" + "Mrežni zapisnik" "Onemogući VPN" "Prekini vezu s VPN-om" - "Vašim uređajem upravlja %1$s.\n\nVaš administrator može nadzirati postavke, pristup tvrtki, aplikacije, podatke povezane s vašim uređajem i podatke o lokaciji uređaja, kao i upravljati svim prethodno navedenim. Više informacija možete saznati od administratora." + "Vašim uređajem upravlja %1$s.\n\nVaš administrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke povezane s vašim uređajem i podatke o lokaciji vašeg uređaja te upravljati njima. Više informacija zatražite od administratora." + "Povezani ste s aplikacijom %1$s koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije." + " " + "Otvorite postavke VPN-a" + "Administrator je uključio mrežni zapisnik koji prati promet na vašem uređaju.\n\nViše informacija možete saznati od administratora." "Dali ste dopuštenje aplikaciji za postavljanje VPN veze.\n\nTa aplikacija može nadzirati vašu aktivnost na uređaju i mreži, uključujući e-poštu, aplikacije i web-lokacije." - "Vašim uređajem upravlja %1$s.\n\nVaš administrator može nadzirati postavke, pristup tvrtki, aplikacije, podatke povezane s vašim uređajem i podatke o lokaciji uređaja, kao i upravljati svim prethodno navedenim.\n\nPovezani ste s VPN-om koji može nadzirati vaše aktivnosti u mreži, uključujući e-poruke, aplikacije i web-lokacije.\n\n Više informacija možete saznati od administratora." - "Vašim poslovnim profilom upravlja %1$s.\n\nVaš administrator može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se administratoru za više informacija.\n\nPovezani ste i s VPN-om koji može nadzirati vašu aktivnost na mreži." + "Vašim uređajem upravlja %1$s.\n\nVaš administrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke povezane s vašim uređajem i podatke o lokaciji vašeg uređaja te upravljati njima.\n\nPovezani ste s VPN-om koji može nadzirati vaše aktivnosti na mreži, uključujući e-poruke, aplikacije i web-lokacije.\n\nViše informacija zatražite od administratora." + "Vašim radnim profilom upravlja %1$s.\n\nVaš administrator može nadzirati vašu mrežnu aktivnost, uključujući e-poštu, aplikacije i web-lokacije.\n\nViše informacija možete saznati od administratora.\n\nPovezani ste i s VPN-om koji može nadzirati vašu mrežnu aktivnost." "VPN" "Povezani ste s aplikacijom %1$s koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije." "Povezani ste s aplikacijom %1$s koja može nadzirati vašu osobnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije." "Povezani ste s aplikacijom %1$s koja može nadzirati vašu osobnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije." - "Vašim poslovnim profilom upravlja %1$s. Povezan je s aplikacijom %2$s koja može nadzirati vašu poslovnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se svojem administratoru za više informacija." + "Vašim radnim profilom upravlja %1$s. Profil je povezan s aplikacijom %2$s koja može nadzirati vašu poslovnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nViše informacija možete saznati od administratora." "Vašim poslovnim profilom upravlja %1$s. Povezan je s aplikacijom %2$s koja može nadzirati vašu poslovnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nPovezani ste i s aplikacijom %3$s koja može nadzirati vašu osobnu aktivnost na mreži." - "Vašim uređajem upravlja %1$s.\n\nVaš administrator može nadzirati postavke, poslovni pristup, aplikacije, podatke povezane s uređajem i podatke o lokaciji uređaja te upravljati njima.\n\nPovezani ste s aplikacijom %2$s koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se svojem administratoru za više informacija." + "Vašim uređajem upravlja %1$s.\n\nVaš administrator može nadzirati postavke, korporacijski pristup, aplikacije, podatke povezane s vašim uređajem i podatke o lokaciji vašeg uređaja te upravljati njima.\n\nPovezani ste s aplikacijom %2$s koja može nadzirati vaše aktivnosti na mreži, uključujući e-poruke, aplikacije i web-lokacije.\n\nViše informacija zatražite od administratora." "Uređaj će ostati zaključan dok ga ručno ne otključate" "Primajte obavijesti brže" "Pogledajte ih prije otključavanja" @@ -433,7 +439,8 @@ "Proširivanje" "Sažimanje" "Zaslon je prikvačen" - "Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Natrag da biste ga otkvačili." + "Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Natrag i Pregled da biste ga otkvačili." + "Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Pregled da biste ga otkvačili." "Shvaćam" "Ne, hvala" "Želite li sakriti pločicu %1$s?" @@ -654,4 +661,7 @@ "Uređivanje redoslijeda postavki." "Stranica %1$d od %2$d" "Obavijesti se ne mogu utišati niti blokirati" + "Telefon se zagrijava" + "Neke su značajke ograničene dok se telefon hladi" + "Telefon će se automatski pokušati ohladiti. Možete ga nastaviti koristiti, no mogao bi raditi sporije.\n\nKad se ohladi, radit će normalno." diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 425212a56186..0e29ed01813a 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -408,19 +408,25 @@ "Eszközfigyelés" "Profilfelügyelet" "Hálózatfigyelés" + "VPN" + "Hálózati naplózás" "VPN letiltása" "VPN-kapcsolat bontása" - "Az eszközt a következő felügyeli:%1$s.\n\nRendszergazdája ellenőrizheti és módosíthatja a beállításokat, vállalati hozzáféréseket, alkalmazásokat, az eszközéhez társított adatokat és eszköze helyadatait. További tájékoztatásért forduljon rendszergazdájához." + "Az eszközt a(z) %1$s kezeli.\n\nA rendszergazda felügyelheti és kezelheti az eszközzel kapcsolatos beállításokat, vállalati hozzáférést, alkalmazásokat, adatokat és helyadatokat. Ha további információra van szüksége, vegye fel a kapcsolatot a rendszergazdával." + "Ön kapcsolódik ehhez: %1$s, amely figyelheti hálózati tevékenységét, köztük a levelezést, az alkalmazás- és webhelyhasználatot." + " " + "VPN-beállítások megnyitása" + "A rendszergazda bekapcsolta az eszköz forgalmát figyelő hálózati naplózást.\n\nHa további információra van szüksége, forduljon a rendszergazdához." "Engedélyezte egy alkalmazásnak, hogy VPN-kapcsolatot létesítsen.\n\nEz az alkalmazás (az e-mailekre, alkalmazásokra és a webhelyekre is kiterjedően) figyelemmel kísérheti az Ön eszközét és hálózati tevékenységét." - "Eszközét a következő felügyeli: %1$s.\n\nRendszergazdája figyelemmel kísérheti és módosíthatja beállításait, vállalati hozzáféréseit, alkalmazásait, az eszközéhez társított adatokat és eszköze helyadatait.\n\n Ön egy VPN-hez is kapcsolódik, amely (az e-mailekre, alkalmazásokra és webhelyekre is kiterjedően) figyelemmel kísérheti hálózati tevékenységét.\n\nTovábbi tájékoztatásért forduljon rendszergazdájához." - "Munkaprofilját a következő felügyeli: %1$s.\n\nA rendszergazda (az e-mailekre, alkalmazásokra és a webhelyekre is kiterjedően) figyelemmel kísérheti hálózati tevékenységét.\n\nTovábbi információért forduljon a rendszergazdához.\n\nÖn egy VPN-hez is csatlakozik, amely szintén figyelemmel kísérheti hálózati tevékenységét." + "Az eszközt a(z) %1$s kezeli.\n\nA rendszergazda felügyelheti és kezelheti az eszközzel kapcsolatos beállításokat, vállalati hozzáférést, alkalmazásokat, adatokat és helyadatokat.\n\nÖn VPN-hez csatlakozott, amely figyelheti az Ön hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket.\n\nHa további információra van szüksége, vegye fel a kapcsolatot a rendszergazdával." + "Munkaprofilját a(z) %1$s kezeli.\n\nA rendszergazda figyelheti hálózati tevékenységét, köztük az e-maileket, az alkalmazásokat és a webhelyeket.\n\nHa további információra van szüksége, forduljon a rendszergazdához.\n\nVPN-hez is kapcsolódik, amely szintén figyelheti hálózati tevékenységét." "VPN" "Csatlakoztatta a(z) %1$s alkalmazást, amely figyelheti hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket." "Csatlakoztatta a(z) %1$s alkalmazást, amely figyelheti személyes hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket." "Ön a(z) %1$s alkalmazáshoz csatlakozik, amely figyelheti személyes hálózati tevékenységét, beleértve az e-maileket, alkalmazásokat és webhelyeket." - "Munkaprofilját a(z) %1$s felügyeli. Csatlakoztatva van hozzá a(z) %2$s alkalmazás, amely figyelheti az Ön hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket.\n\nTovábbi információért forduljon a rendszergazdájához." + "Munkaprofilját a(z) %1$s kezeli. A munkaprofil össze van kapcsolva a(z) %2$s alkalmazással, amely figyelheti az Ön munkahelyi hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket.\n\nHa további információra van szüksége, forduljon a rendszergazdához." "Munkaprofilját a(z) %1$s felügyeli. Csatlakoztatva van hozzá a(z) %2$s alkalmazás, amely figyelheti az Ön hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket.\n\nCsatlakoztatta továbbá a(z) %3$s alkalmazást, amely szintén figyelemmel kísérheti személyes hálózati tevékenységét." - "Eszközét a következő felügyeli: %1$s.\n\nA rendszergazda figyelemmel kísérheti és módosíthatja beállításait, vállalati hozzáféréseit, alkalmazásait, az eszközéhez társított adatokat és eszköze helyadatait.\n\nÖn a következőhöz csatlakozik: %2$s, amely (az e-mailekre, alkalmazásokra és webhelyekre is kiterjedően) figyelemmel kísérheti hálózati tevékenységét.\n\nTovábbi információért forduljon a rendszergazdához." + "Az eszközt a(z) %1$s kezeli.\n\nA rendszergazda felügyelheti és kezelheti az eszközzel kapcsolatos beállításokat, vállalati hozzáférést, alkalmazásokat, adatokat és helyadatokat.\n\nÖn kapcsolódott a(z) %2$s alkalmazáshoz, amely figyelheti az Ön hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket.\n\nHa további információra van szüksége, vegye fel a kapcsolatot a rendszergazdával." "Az eszköz addig zárolva marad, amíg kézileg fel nem oldja" "Gyorsabban megkaphatja az értesítéseket" "Már a képernyőzár feloldása előtt megtekintheti őket" @@ -431,7 +437,8 @@ "Kibontás" "Összecsukás" "A képernyő rögzítve van" - "Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza lehetőséget." + "Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza és az Áttekintés lehetőséget." + "Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva az Áttekintés lehetőséget." "Értem" "Nem, köszönöm" "Elrejti ezt: %1$s?" @@ -652,4 +659,7 @@ "Beállítások sorrendjének szerkesztése." "%1$d. oldal, összesen: %2$d" "Az értesítéseket nem lehet elnémítani vagy letiltani" + "A telefon melegszik" + "Bizonyos funkciók korlátozottan működnek a telefon hűlése közben" + "A telefon automatikusan megpróbál lehűlni. Továbbra is tudja használni a telefont, de elképzelhető, hogy működése lelassul.\n\nAmint a telefon lehűl, újra a szokásos módon működik majd." diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 77b1c824a7f4..4ff11d189ab7 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -64,7 +64,7 @@ "Համակարգչի RSA-ի բանալի մատնահետքն է`\n%1$s" "Միշտ թույլատրել այս համակարգչից" "USB վրիպազերծումը արգելված է" - "Սարքի վրա այս պահին մուտք գործած օգտվողը չի կարող միացնել USB վրիպազերծումը: Այս գործառույթից օգտվելու համար մուտք գործեք ադմինիստրատորի հաշվով:" + "Սարքի վրա այս պահին մուտք գործած օգտատերը չի կարող միացնել USB վրիպազերծումը: Այս գործառույթից օգտվելու համար մուտք գործեք ադմինիստրատորի հաշվով:" "Խոշորացնել` էկրանը լցնելու համար" "Ձգել` էկրանը լցնելու համար" "Պահում է էկրանի հանույթը…" @@ -185,7 +185,7 @@ "Կարգավորումներ" "Համատեսք" "Փակել" - "Օգտվող %s:" + "Օտատեր %s:" "%1$s:" "Wifi-ն անջատվեց:" "Wifi-ը միացավ:" @@ -286,8 +286,8 @@ "Կարգավորումներ" "Ժամանակը" "Ես" - "Օգտվող" - "Նոր օգտվող" + "Օտատեր" + "Նոր օգտատեր" "Wi-Fi" "Միացված չէ" "Ցանց չկա" @@ -367,11 +367,11 @@ "Արագ լիցքավորում (%s՝ մինչև ավարտ)" "Դանդաղ լիցքավորում (%s՝ մինչև ավարտ)" "Անջատել օգտվողին" - "Փոխել օգտվողին. ներկայիս օգտվողն է՝ %s" - "Ընթացիկ օգտվողը՝ %s" + "Փոխել օգտատիրոջը. ներկայիս օգտատերն է՝ %s" + "Ընթացիկ օգտատերը՝ %s" "Ցույց տալ դիտարկումը" - "Ավելացնել օգտվող" - "Նոր օգտվող" + "Ավելացնել օգտատեր" + "Նոր օգտատեր" "Հյուր" "Հյուր ավելացնել" "Հեռացնել հյուրին" @@ -385,13 +385,13 @@ "Հյուր" "Հավելվածները և տվյալները ջնջելու համար հեռացրեք հյուրին" "ՀԵՌԱՑՆԵԼ ՀՅՈՒՐԻՆ" - "Ընթացիկ օգտվողի դուրս գրում" - "Ընթացիկ օգտվողի դուրս գրում" + "Ընթացիկ օգտատիրոջ դուրս գրում" + "Ընթացիկ օգտատիրոջ դուրս գրում" "ԸՆԹԱՑԻԿ ՕԳՏՎՈՂԻ ԴՈՒՐՍ ԳՐՈՒՄ" "Ավելացնե՞լ նոր պրոֆիլ:" - "Երբ նոր օգտվող եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:\n\nՑանկացած օգտվող կարող է թարմացնել հավելվածները մյուս բոլոր հաշիվների համար:" - "Հեռացնե՞լ օգտվողին:" - "Այս օգտվողի բոլոր հավելվածներն ու տվյալները կջնջվեն:" + "Երբ նոր օգտատեր եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:\n\nՑանկացած օգտատեր կարող է թարմացնել հավելվածները մյուս բոլոր հաշիվների համար:" + "Հեռացնե՞լ օգտատիրոջը:" + "Այս օգտատիրոջ բոլոր հավելվածներն ու տվյալները կջնջվեն:" "Հեռացնել" "Մարտկոցի տնտեսումը միացված է" "Նվազեցնում է ծանրաբեռնվածությունը և ֆոնային տվյալները" @@ -408,32 +408,39 @@ "Սարքի մշտադիտարկում" "Պրոֆիլի վերահսկում" "Ցանցի մշտադիտարկում" + "VPN" + "Ցանցային իրադարձությունների գրանցում" "Անջատել VPN-ը" "Անջատել VPN-ը" - "Սարքի կառավարիչն է՝ %1$s:\n\nԱդմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ հաշիվը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները: Լրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" + "Սարքի կառավարիչն է՝ %1$s։\n\nՁեր ադմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ մուտքը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները: Լրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" + "Դուք կապակցված եք %1$s հավելվածին, որը կարող է վերահսկել ձեր ցանցային գործողությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը:" + " " + "Բացել VPN-ի կարգավորումները" + "Ձեր ադմինիստրատորը միացրել է ցանցային իրադարձությունների գրանցումը, որը վերահսկում է ձեր սարքի թրաֆիկը։\n\nԼրացուցիչ տեղեկություններ ստանալու համար դիմեք ձեր ադմինիստրատորին։" "Ինչ-որ հավելվածի թույլ եք տվել հաստատել VPN կապակցում:\n\nԱյդ հավելվածը կարող է վերահսկել ձեր սարքի և ցանցի գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:" - "Սարքի կառավարիչն է՝ %1$s:\n\nԱդմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ հաշիվը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները:\n\nՆաև ունեք VPN կապակցում, ինչը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև՝ էլեկտրոնային նամակները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" - "Աշխատանքային պրոֆիլի կառավարիչն է՝ %1$s:\n\nԱդմինիստրատորը կարող է վերահսկել ցանցում ունեցած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:\n\nՆաև ունեք VPN կապակցում, ինչը կարող է վերահսկել ձեր ցանցում կատարած գործողությունները:" + "Սարքի կառավարիչն է՝ %1$s։\n\nՁեր ադմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ մուտքը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները:\n\nԴուք կապակցված եք VPN-ին, որը կարող է վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը։\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" + "Ձեր աշխատանքային պրոֆիլի կառավարիչն է %1$s կազմակերպությունը։\n\nԱդմինիստրատորը կարող է վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը։\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին։\n\nԴուք կապակցված են նաև VPN ցանցին, որը կարող է վերահսկել ձեր ցանցային գործունեությունը։" "VPN" "Դուք կապակցված եք %1$s հավելվածին, որը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:" "Դուք կապակցված եք %1$s հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:" "Դուք կապակցված եք %1$s հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:" - "Աշխատանքային պրոֆիլի կառավարիչն է՝ %1$s: Այն կապակցված է %2$s հավելվածին, որը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" + "Ձեր աշխատանքային պրոֆիլի կառավարիչն է %1$s կազմակերպությունը։ Այն կապակցված է %2$s հավելվածին, որը կարող է վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը։\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" "Աշխատանքային պրոֆիլի կառավարիչն է՝ %1$s: Այն կապակցված է %2$s հավելվածին, որը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԴուք նույնպես կապակցված եք %3$s հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները:" - "Սարքի կառավարիչն է՝ %1$s:\n\nԱդմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ հաշիվը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները:\n\nՆաև կապակցված եք %2$s հավելվածին, ինչը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև՝ էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" + "Սարքի կառավարիչն է՝ %1$s։\n\nՁեր ադմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ մուտքը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները:\n\nԴուք կապակցված եք %2$s հավելվածին, որը կարող է վերահսկել ձեր ցանցային գործունեությունը, այդ թվում նաև էլփոստը, հավելվածները և կայքերը։\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:" "Սարքը կմնա արգելափակված՝ մինչև ձեռքով չբացեք" "Ավելի արագ ստացեք ծանուցումները" "Տեսեք դրանք մինչև ապակողպելը" - "Ոչ, շնորհակալություն" + "Ոչ" "Կարգավորել" "%1$s. %2$s" "Ավարտել" "Ընդարձակել" "Կոծկել" "Էկրանն ամրացված է" - "Էկրանը կմնա տեսադաշտում, մինչև այն ապամրացնեք: Ապամրացնելու համար հպեք և պահեք Հետ կոճակը:" + "Էկրանը կմնա տեսադաշտում, մինչև այն ապամրացնեք: Ապամրացնելու համար հպեք և պահեք Հետ և Համատեսք կոճակները:" + "Էկրանը կմնա տեսադաշտում, մինչև այն ապամրացնեք: Ապամրացնելու համար հպեք և պահեք Համատեսք կոճակը:" "Եղավ" - "Ոչ, շնորհակալություն" + "Ոչ" "Թաքցնե՞լ %1$s-ը:" "Այն դարձյալ կհայտնվի, երբ նորից միացնեք կարգավորումներում:" "Թաքցնել" @@ -483,7 +490,7 @@ "Թեժ կետ" "Աշխատանքային պրոֆիլ" "Զվարճանք մեկ՝ որոշակի մարդու համար" - "Համակարգի ՕՄ-ի ընդունիչը հնարավորություն է տալիս հարմարեցնել Android-ի օգտվողի միջերեսը: Այս փորձնական գործառույթները կարող են հետագա թողարկումների մեջ փոփոխվել, խափանվել կամ ընդհանրապես չհայտնվել: Եթե շարունակում եք, զգուշացեք:" + "Համակարգի ՕՄ-ի ընդունիչը հնարավորություն է տալիս հարմարեցնել Android-ի օգտատիրոջ միջերեսը: Այս փորձնական գործառույթները կարող են հետագա թողարկումների մեջ փոփոխվել, խափանվել կամ ընդհանրապես չհայտնվել: Եթե շարունակում եք, զգուշացեք:" "Այս փորձնական գործառույթները կարող են հետագա թողարկումների մեջ փոփոխվել, խափանվել կամ ընդհանրապես չհայտնվել: Եթե շարունակում եք, զգուշացեք:" "Եղավ" "Համակարգի ՕՄ-ի ընդունիչը ավելացվել է կարգավորումներին" @@ -652,4 +659,7 @@ "Խմբագրել կարգավորումների հերթականությունը:" "Էջ %1$d / %2$d" "Հնարավոր չէ արգելափակել ծանուցումները կամ անջատել դրանց ձայնը" + "Հեռախոսը տաքանում է" + "Հովանալու ընթացքում հեռախոսի որոշ գործառույթներ սահմանափակ են" + "Ձեր հեռախոսն ավտոմատ կերպով կփորձի hովանալ: Կարող եք շարունակել օգտագործել հեռախոսը, սակայն հնարավոր է, որ այն ավելի դանդաղ աշխատի:\n\nՀովանալուց հետո հեռախոսը կաշխատի կանոնավոր կերպով:" diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index d006addad516..ea8a166d92bc 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -408,19 +408,25 @@ "Pemantauan perangkat" "Pemantauan profil" "Pemantauan jaringan" + "VPN" + "Pencatatan Log Jaringan" "Nonaktifkan VPN" "Putuskan sambungan VPN" - "Perangkat dikelola oleh %1$s.\n\nAdministrator dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat. Untuk informasi selengkapnya, hubungi administrator." + "Perangkat dikelola oleh %1$s.\n\nAdmin dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat. Untuk informasi selengkapnya, hubungi admin." + "Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web." + " " + "Buka Setelan VPN" + "Admin telah mengaktifkan pencatatan log jaringan, yang memantau traffic di perangkat.\n\nUntuk informasi selengkapnya, hubungi admin." "Anda memberikan izin kepada aplikasi untuk menyiapkan sambungan VPN.\n\nAplikasi ini ini dapat memantau aktivitas perangkat dan jaringan, termasuk email, aplikasi, dan situs web." - "Perangkat dikelola oleh %1$s.\n\nAdministrator dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat.\n\nAnda tersambung ke VPN yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator." - "Profil kerja dikelola oleh %1$s.\n\nAdministrator dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator.\n\nAnda juga tersambung ke VPN yang dapat memantau aktivitas jaringan." + "Perangkat dikelola oleh %1$s.\n\nAdmin dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat.\n\nAnda terhubung ke VPN, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi admin." + "Profil kerja dikelola oleh %1$s.\n\nAdmin dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi admin.\n\nAnda juga tersambung ke VPN, yang dapat memantau aktivitas jaringan." "VPN" "Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web." "Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web." "Anda tersambung ke %1$s, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web.." - "Profil kerja dikelola oleh %1$s dan tersambung ke %2$s, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator." + "Profil kerja dikelola oleh %1$s. Profil ini terhubung ke %2$s, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi admin." "Profil kerja dikelola oleh %1$s dan tersambung ke %2$s, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs web.\n\nAnda juga tersambung ke %3$s, yang dapat memantau aktivitas jaringan pribadi." - "Perangkat dikelola oleh %1$s.\n\nAdministrator dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat.\n\nAnda tersambung ke %2$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator." + "Perangkat dikelola oleh %1$s.\n\nAdmin dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat.\n\nAnda terhubung ke %2$s, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi admin." "Perangkat akan tetap terkunci hingga Anda membukanya secara manual" "Dapatkan pemberitahuan lebih cepat" "Lihat sebelum membuka kunci" @@ -431,7 +437,8 @@ "Luaskan" "Ciutkan" "Layar dipasangi pin" - "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Kembali untuk melepas pin." + "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh & tahan tombol Kembali dan Ringkasan untuk melepas pin." + "Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Ringkasan untuk melepas pin." "Mengerti" "Lain kali" "Sembunyikan %1$s?" @@ -652,4 +659,7 @@ "Edit urutan setelan." "Halaman %1$d dari %2$d" "Notifikasi tidak dapat disenyapkan atau diblokir" + "Ponsel menjadi hangat" + "Beberapa fitur dibatasi saat ponsel mendingin" + "Ponsel akan otomatis mencoba mendingin. Anda tetap dapat menggunakan ponsel, tetapi mungkin berjalan lebih lambat.\n\nSetelah dingin, ponsel akan berjalan seperti biasa." diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index 26b1e74b0cfc..03c56ce4b634 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -408,19 +408,25 @@ "Tækjaeftirlit" "Fylgst með sniði" "Neteftirlit" + "VPN" + "Eftirlit netkerfa" "Slökkva á VPN" "Aftengja VPN-net" - "Tækinu er stjórnað af %1$s.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengd eru tækinu og staðsetningarupplýsingum tækisins. Hafðu samband við kerfisstjórann til að fá frekari upplýsingar." + "Tækið þitt er í umsjón %1$s.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum þínum, fyrirtækisaðgangi, forritum, gögnum sem tengjast tækinu og staðsetningarupplýsingum tækisins. Hafðu samband við kerfisstjórann til að fá frekari upplýsingar." + "Þú ert með tengingu við %1$s, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." + " " + "Opna VPN-stillingar" + "Kerfisstjóri hefur kveikt á eftirliti netkerfa, sem fylgist með netumferð á tækinu þínu.\n\nHafðu samband við kerfisstjóra til að fá frekari upplýsingar." "Þú veittir forriti heimild til að koma á VPN-tengingu.\n\nÞetta forrit getur fylgst með virkni þinni í tækinu og á netinu, þar á meðal tölvupósti, forritum og vefsvæðum." - "Tækinu er stjórnað af %1$s.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengd eru tækinu og staðsetningarupplýsingum tækisins.\n\nÞú ert með tengingu við VPN-net sem getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar." - "Vinnusniðinu þínu er stjórnað af %1$s.\n\nKerfisstjórinn þinn getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar.\n\nÞú ert einnig með tengingu við VPN-net sem getur fylgst með netnotkun þinni." + "Tækið þitt er í umsjón %1$s.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum þínum, fyrirtækisaðgangi, forritum, gögnum sem tengjast tækinu og staðsetningarupplýsingum tækisins.\n\nÞú ert tengd(ur) við VPN, en það getur fylgst með netvirkni þinni, þ.m.t. tölvupósti, forritum og vefsíðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar." + "%1$s stýrir vinnusniðinu þínu.\n\nKerfisstjórinn getur fylgst með virkni þinni á netinu, þ.m.t. tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar.\n\nÞú ert einnig með VPN-tengingu, sem getur fylgst með virkni þinni á netinu." "VPN" "Þú ert með tengingu við %1$s, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." "Þú ert með tengingu við %1$s, sem getur fylgst með persónulegri netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." "Þú ert með tengingu við %1$s, sem getur fylgst með persónulegri netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum." - "Vinnusniðinu þínu er stjórnað af %1$s. Það er tengt %2$s, sem getur fylgst með vinnutengdri netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar." + "%1$s stýrir vinnusniðinu þínu. Það er tengt við %2$s, sem getur fylgst með netvirkni þinni í vinnunni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjóra til að fá frekari upplýsingar." "Vinnusniðinu þínu er stjórnað af %1$s. Það er tengt %2$s, sem getur fylgst með vinnutengdri netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nÞú ert einnig með tengingu við %3$s, sem getur fylgst með persónulegri netnotkun þinni." - "Tækinu er stjórnað af %1$s.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengd eru tækinu og staðsetningarupplýsingum tækisins.\n\nÞú ert með tengingu við %2$s, sem getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar." + "Tækið þitt er í umsjón %1$s.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum þínum, fyrirtækisaðgangi, forritum, gögnum sem tengjast tækinu og staðsetningarupplýsingum tækisins.\n\nÞú ert tengd(ur) við %2$s, en það getur fylgst með netvirkni þinni, þ.m.t. tölvupósti, forritum og vefsíðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar." "Tækið verður læst þar til þú opnar það handvirkt" "Fáðu tilkynningar hraðar" "Sjáðu þær áður en þú opnar" @@ -431,7 +437,8 @@ "Stækka" "Minnka" "Skjárinn er festur" - "Þetta heldur þessu opnu þangað til þú losar það. Haltu fingri á „Til baka“ til að losa." + "Þetta heldur þessu opnu þangað til þú losar það. Haltu fingri á „Til baka“ og „Yfirlit“ til að losa." + "Þetta heldur þessu opnu þangað til þú losar það. Haltu fingri á „Yfirlit“ til að losa." "Ég skil" "Nei, takk" "Fela %1$s?" @@ -652,4 +659,7 @@ "Breyta röð stillinga." "Blaðsíða %1$d af %2$d" "Ekki er hægt að þagga eða loka á tilkynningar" + "Síminn er að hitna" + "Sumir eiginleikar eru takmarkaðir þegar síminn kælir sig" + "Síminn reynir sjálfkrafa að kæla sig. Þú getur enn notað símann en hann gæti verið hægvirkari.\n\nEftir að síminn hefur kælt sig niður virkar hann eðlilega." diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index d056637fe93b..f7b022a57c29 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -410,19 +410,25 @@ "Monitoraggio del dispositivo" "Monitoraggio del profilo" "Monitoraggio rete" + "VPN" + "Log di rete" "Disattiva VPN" "Scollega VPN" - "Il tuo dispositivo è gestito da %1$s.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo. Per ulteriori informazioni, contatta l\'amministratore." + "Il tuo dispositivo è gestito da %1$s.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo. Per ulteriori informazioni, contatta l\'amministratore." + "Sei connesso a %1$s, che consente di monitorare le attività di rete, inclusi siti web, email e app." + " " + "Apri impostazioni VPN" + "L\'amministratore ha attivato i log di rete, che consentono di monitorare il traffico sul dispositivo.\n\nPer ulteriori informazioni, contatta l\'amministratore." "Hai autorizzato l\'app a configurare una connessione VPN.\n\nQuesta app può monitorare il tuo dispositivo e l\'attività di rete, inclusi email, app e siti web." - "Il tuo dispositivo è gestito da %1$s.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo.\n\nSei connesso a una rete VPN da cui è possibile monitorare la tua attività di rete, inclusi siti web, email e app.\n\nPer ulteriori informazioni, contatta l\'amministratore." - "Il tuo profilo di lavoro è gestito da %1$s.\n\nL\'amministratore può monitorare l\'attività di rete, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta l\'amministratore.\n\nSei connesso anche a VPN, da cui è possibile monitorare la tua attività di rete." + "Il tuo dispositivo è gestito da %1$s.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo.\n\nSei connesso a una VPN, da cui è possibile monitorare le attività di rete, inclusi siti web, email e app.\n\nPer ulteriori informazioni, contatta l\'amministratore." + "Il tuo profilo di lavoro è gestito da %1$s.\n\nL\'amministratore può monitorare la tua attività di rete, inclusi siti web, email e app.\n\nPer ulteriori informazioni, contatta l\'amministratore.\n\nSei inoltre connesso a una VPN, da cui è possibile monitorare la tua attività di rete." "VPN" "Sei connesso a %1$s, da cui è possibile monitorare la tua attività di rete, inclusi email, app e siti web." "Sei connesso a %1$s, da cui è possibile monitorare la tua attività di rete personale, inclusi email, app e siti web." "Sei collegato a %1$s, che consente di monitorare la tua attività di rete personale, inclusi siti web, email e app." - "Il tuo profilo di lavoro è gestito da %1$s. È connesso a %2$s, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta il tuo amministratore." + "Il tuo profilo di lavoro è gestito da %1$s. È connesso a %2$s, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi siti web, email e app.\n\nPer ulteriori informazioni, contatta l\'amministratore." "Il tuo profilo di lavoro è gestito da %1$s. È connesso a %2$s, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi email, app e siti web.\n\nSei connesso anche a %3$s, da cui è possibile monitorare la tua attività di rete personale." - "Il tuo dispositivo è gestito da %1$s.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo.\n\nSei connesso a %2$s, da cui è possibile monitorare la tua attività di rete, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta l\'amministratore." + "Il tuo dispositivo è gestito da %1$s.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo.\n\nSei connesso a %2$s, da cui è possibile monitorare le attività di rete, inclusi siti web, email e app.\n\nPer ulteriori informazioni, contatta l\'amministratore." "Il dispositivo resterà bloccato fino allo sblocco manuale" "Ricevi notifiche più velocemente" "Visualizza prima di sbloccare" @@ -433,7 +439,8 @@ "Espandi" "Comprimi" "La schermata è bloccata" - "La schermata rimane visibile finché non la sblocchi. Tieni premuto Indietro per sbloccare." + "La schermata rimane visibile finché non viene disattivato il blocco su schermo. Per disattivarlo, tieni premuto Indietro e Panoramica." + "La schermata rimane visibile finché non viene disattivato il blocco su schermo. Per disattivarlo, tieni premuto Panoramica." "OK" "No, grazie" "Nascondere %1$s?" @@ -654,4 +661,7 @@ "Modifica l\'ordine delle impostazioni." "Pagina %1$d di %2$d" "Le notifiche non possono essere disattivate o bloccate" + "Il telefono si sta scaldando" + "Alcune funzioni limitate durante il raffreddamento del telefono" + "Il telefono cercherà automaticamente di raffreddarsi. Puoi comunque usarlo, ma potrebbe essere più lento.\n\nUna volta raffreddato, il telefono funzionerà normalmente." diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 19a94a3c53e3..7c3e5394d165 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -412,19 +412,25 @@ "מעקב אחר מכשיר" "מעקב אחר פרופיל" "מעקב אחר פעילות ברשת" + "VPN" + "רישום התנועה ברשת" "‏השבת VPN" "‏נתק את ה-VPN" - "המכשיר מנוהל על ידי %1$s.\n\nמנהל המערכת יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר, ולנהל אותם. למידע נוסף, פנה אל מנהל המערכת." + "המכשיר שלך מנוהל על ידי %1$s.\n\nמנהל המערכת יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר, ולנהל אותם. למידע נוסף, פנה אל מנהל המערכת." + "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." + " " + "‏פתח את הגדרות ה-VPN" + "מנהל המערכת הפעיל את תכונת רישום התנועה ברשת, שמנטרת את תנועת הנתונים במכשיר.\n\nלמידע נוסף, צור קשר עם מנהל המערכת." "‏נתת לאפליקציה כלשהי הרשאה להגדיר חיבור ‏VPN‏.\n\nהאפליקציה הזו יכולה לעקוב אחר הפעילות שלך ברשת ובמכשיר, כולל הודעות אימייל, אפליקציות ואתרים." - "‏המכשיר מנוהל על ידי %1$s.\n\nמנהל המערכת יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר, ולנהל אותם.\n\nאתה מחובר ל-VPN שיכול לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת." - "‏פרופיל העבודה שלך מנוהל על ידי %1$s.\n\nמנהל המערכת שלך יכול לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך.\n\nאתה מחובר גם לרשת VPN, שיכולה לעקוב אחר הפעילות שלך ברשת." + "‏המכשיר שלך מנוהל על ידי %1$s.\n\nמנהל המערכת יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר, ולנהל אותם.\n\nאתה מחובר לרשת VPN, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה אל מנהל המערכת." + "‏פרופיל העבודה שלך מנוהל על-ידי %1$s.\n\n מנהל המערכת שלך יכול לעקוב אחרי הפעילות שלך ברשת, כולל פעילות באימייל, באפליקציות ובאתרים.\n\n למידע נוסף, צור קשר עם מנהל המערכת.\n\nבנוסף, אתה מחובר ל-VPN, שגם באמצעותו ניתן לעקוב אחרי הפעילות שלך ברשת." "VPN" "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים." "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים." "אתה מחובר לאפליקציה %1$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים." - "פרופיל העבודה שלך מנוהל על ידי %1$s. הוא מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת העסקית, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך." + "פרופיל העבודה שלך מנוהל על-ידי %1$s. הוא מחובר ל-%2$s, אפליקציה שיכולה לעקוב אחרי הפעילות שלך ברשת, כולל פעילות באימייל, באפליקציות ובאתרים.\n\nלמידע נוסף, צור קשר עם מנהל המערכת." "פרופיל העבודה שלך מנוהל על ידי %1$s. הוא מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת העסקית, כולל הודעות אימייל, אפליקציות ואתרים.\n\nאתה מחובר גם לאפליקציה %3$s, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית." - "המכשיר שלך מנוהל על ידי %1$s.\n\nמנהל המערכת שלך יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר שלך ומידע על מיקום המכשיר, ולנהל אותם.\n\nאתה מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך." + "המכשיר שלך מנוהל על ידי %1$s.\n\nמנהל המערכת יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר, ולנהל אותם.\n\nאתה מחובר לאפליקציה %2$s, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה אל מנהל המערכת." "המכשיר יישאר נעול עד שתבטל את נעילתו באופן ידני" "קבל התראות מהר יותר" "צפה בהן לפני שתבטל נעילה" @@ -435,7 +441,8 @@ "הרחב" "כווץ" "המסך מוצמד" - "שומר בתצוגה עד לביטול ההצמדה. גע והחזק בו-זמנית בלחצן \'הקודם\' כדי לבטל הצמדה." + "נשאר בתצוגה עד לביטול ההצמדה. גע בלחצנים \'הקודם\' ו\'סקירה\' והחזק כדי לבטל את ההצמדה." + "נשאר בתצוגה עד לביטול ההצמדה. גע בלחצן \'סקירה\' והחזק כדי לבטל את ההצמדה." "הבנתי" "לא, תודה" "להסתיר%1$s?" @@ -656,4 +663,7 @@ "עריכת סדר ההגדרות." "דף %1$d מתוך %2$d" "לא ניתן להשתיק או לחסום הודעות" + "הטלפון מתחמם" + "חלק מהתכונות מוגבלות כל עוד הטלפון מתקרר" + "קירור הטלפון ייעשה באופן אוטומטי. תוכל עדיין להשתמש בטלפון, אבל ייתכן שהוא יפעל לאט יותר.\n\nהטלפון יחזור לפעול כרגיל לאחר שיתקרר." diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 8d51fe635aa7..f5e71fb78e51 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -410,19 +410,25 @@ "端末の監視" "プロファイルの監視" "ネットワーク監視" + "VPN" + "ネットワーク ログ" "VPNを無効にする" "VPNを切断" - "この端末は%1$sによって管理されています。\n\n管理者は設定、コーポレートアクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。詳しくは管理者にお問い合わせください。" + "この端末は%1$sによって管理されています。\n\n管理者は設定、コーポレート アクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。詳しくは管理者にお問い合わせください。" + "「%1$s」に接続しています。このアプリはあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" + " " + "VPN 設定を開く" + "管理者がネットワーク ログを有効にしているため、この端末のトラフィックは監視されています。\n\n詳しくは管理者にお問い合わせください。" "アプリにVPN接続の設定を許可しました。\n\nこのアプリはあなたの端末やネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" - "この端末は%1$sによって管理されています。\n\n管理者は設定、コーポレートアクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。\n\nVPNに接続しているため、VPNもネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。" - "この仕事用プロファイルは%1$sによって管理されています。\n\n管理者はあなたのネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。\n\nVPNにも接続しているため、VPNもネットワークアクティビティを監視できます。" + "この端末は%1$sによって管理されています。\n\n管理者は設定、コーポレート アクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。\n\nVPN に接続しています。VPN はあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。" + "この仕事用プロファイルは、%1$s により管理されています。\n\n管理者は、このプロファイルでのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。\n\nまた、VPN に接続しているため、このネットワークでのあなたのネットワーク アクティビティも監視されます。" "VPN" "%1$sに接続しています。このアプリはあなたのネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" "%1$sに接続しています。このアプリはあなたの個人のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" "「%1$s」に接続しています。このアプリはあなたの個人のネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。" - "この仕事用プロファイルは%1$sによって管理され、%2$sに接続しています。このアプリはあなたの仕事のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。" + "この仕事用プロファイルは、%1$s により管理され、仕事でのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できる %2$s に接続されています。\n\n詳しくは管理者にお問い合わせください。" "この仕事用プロファイルは%1$sによって管理され、%2$sに接続しています。このアプリはあなたの仕事のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n%3$sにも接続しているため、個人のネットワークアクティビティも監視できます。" - "この端末は%1$sによって管理されています。\n\n管理者は設定、コーポレートアクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。\n\n%2$sに接続しているため、このアプリもネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。" + "この端末は%1$sによって管理されています。\n\n管理者は設定、コーポレート アクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。\n\n%2$sに接続しています。このアプリはあなたのネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。" "手動でロックを解除するまでロックされたままとなります" "通知をすばやく確認できます" "ロックを解除する前にご確認ください" @@ -433,7 +439,8 @@ "展開" "折りたたむ" "画面が固定されました" - "固定を解除するまで画面が常に表示されるようになります。固定を解除するには [戻る] を押し続けます。" + "固定を解除するまで画面が常に表示されるようになります。[戻る] と [最近] を同時に押し続けると固定が解除されます。" + "固定を解除するまで画面が常に表示されるようになります。[最近] を押し続けると固定が解除されます。" "はい" "いいえ" "%1$sを非表示にしますか?" @@ -654,4 +661,7 @@ "設定の順序を編集します。" "ページ %1$d/%2$d" "通知のサイレント設定やブロックはできません" + "スマートフォンの温度が上昇中" + "スマートフォンのクールダウン中は一部の機能が制限されます" + "スマートフォンは自動的にクールダウンを行います。その間もスマートフォンを使用できますが、動作が遅くなる可能性があります。\n\nクールダウンが完了すると、通常どおり動作します。" diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 258c90450e48..290875582fe1 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -408,19 +408,25 @@ "მოწყობილობის მონიტორინგი" "პროფილის მონიტორინგი" "ქსელის მონიტორინგი" + "VPN" + "ქსელის ჟურნალირება" "VPN-ის გაუქმება" "VPN-ის გათიშვა" - "თქვენ მოწყობილობას მართავს %1$s.\n\nთქვენს ადმინისტრატორს შეუძლია ამ მოწყობილობასთან ასოცირებული პარამეტრების, კორპორატიული წვდომის, აპებისა და მონაცემების, მათ შორის, ქსელის აქტივობისა და თქვენი მოწყობილობის მდებარეობის ინფორმაციის მონიტორინგი და მართვა. დამატებითი ინფორმაციისათვის, დაუკავშირდით თქვენს ადმინისტრატორს." + "თქვენს მოწყობილობას მართავს %1$s.\n\nთქვენს ადმინისტრატორს შეუძლია ამ მოწყობილობასთან ასოცირებული პარამეტრების, კორპორაციული წვდომის, აპებისა და მონაცემების (მათ შორის, თქვენი მოწყობილობის მდებარეობის ინფორმაციის) მონიტორინგი და მართვა. დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს." + "თქვენ დაუკავშირდით %1$s-ს, რომელსაც თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების, მონიტორინგი შეუძლია." + " " + "VPN-ის პარამეტრების გახსნა" + "თქვენმა ადმინისტრატორმა ქსელის ჟურნალირება ჩართო, რომელიც თქვენი მოწყობილობის ტრაფიკის მონიტორინგს ახორციელებს.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს." "თქვენ მიეცით ნებართვა აპს, დააყენოს VPN კავშირი.\n\nამ აპს შეუძლია თქვენი მოწყობილობის და ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი." - "თქვენ მოწყობილობას მართავს %1$s.\n\nთქვენს ადმინისტრატორს შეუძლია ამ მოწყობილობასთან ასოცირებული პარამეტრების, კორპორატიული წვდომის, აპებისა და მონაცემების, და ასევე თქვენი მოწყობილობის მდებარეობის ინფორმაციის მონიტორინგი და მართვა.\n\nთქვენ ასევე დაკავშირებული ხართ VPN-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპების და ვებსაიტების მონიტორინგი.\n\nდამატებითი ინფორმაციისათვის, დაუკავშირდით თქვენს ადმინისტრატორს." - "თქვენს სამუშაო პროფილს მართავს %1$s.\n\nთქვენს ადმინისტრატორს შეუძლია თქვენი ქსელის აქტივობის მონიტორინგი, მათ შორის, ელფოსტის, აპებისა და ვებ-საიტების.\n\nდამატებითი ინფორმაციისთვის, დაუკავშირდით თქვენს ადმინისტრატორს.\n\nთქვენ ასევე დაკავშირებული ხართ VPN-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის მონიტორინგი." + "თქვენს მოწყობილობას მართავს %1$s.\n\nთქვენს ადმინისტრატორს შეუძლია ამ მოწყობილობასთან ასოცირებული პარამეტრების, კორპორაციული წვდომის, აპებისა და მონაცემების (მათ შორის, თქვენი მოწყობილობის მდებარეობის ინფორმაციის) მონიტორინგი და მართვა.\n\nთქვენ დაკავშირებული ხართ VPN-თან, რომელსაც თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი შეუძლია.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს." + "თქვენს სამსახურის პროფილს მართავს %1$s.\n\nთქვენს ადმინისტრატორს შეუძლია თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს.\n\nგარდა ამისა, თქვენ დაკავშირებული ხართ VPN-თან, რომელსაც ასევე შეუძლია თქვენი ქსელის აქტივობის მონიტორინგი." "VPN" "თქვენ დაუკავშირდით %1$s-ს, რომელსაც შეუძლია თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი." "თქვენ დაუკავშირდით %1$s-ს, რომელსაც შეუძლია თქვენი პირადი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი." "თქვენ დაუკავშირდით %1$s-ს, რომელსაც თქვენი პირადი ქსელის აქტივობის მონიტორინგი შეუძლია, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების." - "თქვენი სამუშაო პროფილი %1$s-ის მიერ იმართება. ის დაკავშირებულია %2$s-თან, რომელსაც შეუძლია თქვენი სამსახურის ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი.\n\nდამატებითი ინფორმაციისთვის მიმართეთ თქვენს ადმინისტრატორს." + "თქვენს სამსახურის პროფილს მართავს %1$s. ის დაკავშირებულია %2$s-თან, რომელსაც თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი შეუძლია.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს." "თქვენი სამუშაო პროფილი %1$s-ის მიერ იმართება. ის დაკავშირებულია %2$s-თან, რომელსაც შეუძლია თქვენი სამსახურის ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი.\n\nასევე, დაკავშირებული ხართ %3$s-თან, რომელსაც შეუძლია თქვენი პირადი ქსელის აქტივობის მონიტორინგი." - "თქვენს მოწყობილობას მართავს %1$s.\n\nადმინისტრატორს შეუძლია თქვენი მოწყობილობასთან ასოცირებული პარამეტრების, კორპორატიული წვდომის, აპებისა და მონაცემების, და ასევე მოწყობილობის მდებარეობის ინფორმაციის მონიტორინგი და მართვა.\n\nთქვენ დაკავშირებული ხართ %2$s-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებ-საიტების მონიტორინგი.\n\nდამატებითი ინფორმაციისათვის, დაუკავშირდით თქვენს ადმინისტრატორს." + "თქვენს მოწყობილობას მართავს %1$s.\n\nთქვენს ადმინისტრატორს შეუძლია ამ მოწყობილობასთან ასოცირებული პარამეტრების, კორპორაციული წვდომის, აპებისა და მონაცემების (მათ შორის, თქვენი მოწყობილობის მდებარეობის ინფორმაციის) მონიტორინგი და მართვა.\n\nთქვენ დაკავშირებული ხართ %2$s-თან, რომელსაც თქვენი ქსელის აქტივობის (მათ შორის, ელფოსტის, აპებისა და ვებსაიტების) მონიტორინგი შეუძლია.\n\nდამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს." "მოწყობილობის დარჩება ჩაკეტილი, სანამ ხელით არ გახსნით" "შეტყობინებების უფრო სწრაფად მიღება" "იხილეთ განბლოკვამდე" @@ -431,7 +437,8 @@ "გავრცობა" "ჩაკეცვა" "ეკრანი ჩამაგრებულია" - "ამით ის ხედში ჩამაგრების მოხსნამდე დარჩება. ჩამაგრების მოსახსნელად, ხანგრძლივად დააჭირეთ „უკან“-ს." + "ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „უკან და მიმოხილვა“-ს." + "ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „მიმოხილვა“-ს." "გასაგებია" "არა, გმადლობთ" "დაიმალოს %1$s?" @@ -652,4 +659,7 @@ "პარამეტრების მიმდევრობის რედაქტირება." "გვერდი %1$d / %2$d-დან" "შეტყობინებების გაჩუმება ან დაბლოკვა ვერ მოხერხდება" + "ტელეფონი ცხელდება" + "ზოგიერთი ფუნქცია შეზღუდული იქნება, სანამ ტელეფონი გაგრილდება" + "თქვენი ტელეფონი გაგრილებას ავტომატურად შეეცდება. შეგიძლიათ გააგრძელოთ მისით სარგებლობა, თუმცა ტელეფონმა შეიძლება უფრო ნელა იმუშაოს.\n\nგაგრილების შემდგომ ის ჩვეულებრივად იმუშავებს." diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index 25ede612d22d..eeb54dc86d79 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -408,19 +408,25 @@ "Құрылғыны бақылау" "Профильді бақылау" "Желіні бақылау" + "VPN (Виртуалды жеке желі)" + "Желі журналын жүргізу" "VPN функциясын өшіру" "VPN желісін ажырату" - "Құрылғыңызды басқаратын:%1$s.\n\nСіздің әкімшіңіз параметрлерді, корпоративтік мүмкіндікті, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғыңыздың орналасуы туралы ақпаратты қадағалай алады. Қосымша ақпарат алу үшін әкімшіге хабарласыңыз." + "Құрылғыңызды %1$s басқарады.\n\nӘкімші параметрлерді, корпоративтік рұқсатты, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғының орны туралы ақпаратты бақылай және басқара алады. Қосымша ақпарат алу үшін әкімшіге хабарласыңыз." + "Желідегі әрекеттерді, соның ішінде электрондық хабарларды, қолданбаларды және вебсайттарды бақылайтын %1$s қолданбасына қосылдыңыз." + " " + "VPN параметрлерін ашу" + "Әкімші құрылғыдағы трафикті қадағалау үшін желі журналын жүргізуді қосып қойған.\n\nТолығырақ ақпарат алу үшін әкімшімен хабарласыңыз." "Қолданбаға VPN байланысын орнату рұқсатын бердіңіз.\n\nБұл қолданба құрылғыңызды және желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алады." - "Құрылғыңызды басқаратын:%1$s.\n\nСіздің әкімшіңіз параметрлерді, корпоративтік мүмкіндікті, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғыңыздың орналасуы туралы ақпаратты қадағалай алады.\n\nСіз электрондық пошта, қолданбалар және сайттарды қосқандағы желілік әрекеттеріңізді бақылай алатын VPN желісіне қосылдыңыз.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." - "Жұмыс профиліңізді %1$s басқарады.\n\nӘкімші желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алады.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз.\n\nСондай-ақ сіз желідегі белсенділігіңізді бақылай алатын VPN желісіне қосылғансыз." + "Құрылғыңызды %1$s басқарады.\n\nӘкімші параметрлерді, корпоративтік рұқсатты, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғының орны туралы ақпаратты бақылай және басқара алады.\n\nСіз желідегі белсенділікті, соның ішінде электрондық пошталарды, қолданбаларды және вебсайттарды бақылай алатын VPN желісіне қосылғансыз.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." + "Жұмыс профиліңізді %1$s басқарады.\n\nӘкімші желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және вебсайттарды бақылай алады.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз.\n\nСондай-ақ сіз желідегі белсенділігіңізді бақылай алатын VPN желісіне қосылғансыз." "VPN" "Сіз желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын %1$s қолданбасына қосылғансыз." "Сіз жеке желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын %1$s қолданбасына қосылғансыз." "Жеке желідегі әрекеттеріңізді, соның ішінде электрондық пошта хабарларын, қолданбаларды және вебсайттарды бақылай алатын %1$s қолданбасына қосылғансыз." - "Жұмыс профиліңізді %1$s басқарады. Ол жұмыс кезінде желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын %2$s қолданбасына қосылған.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." + "Жұмыс профиліңізді %1$s басқарады. Ол жұмыс барысындағы желідегі белсенділігіңізді, соның ішінде электрондық хабарларды, қолданбаларды және вебсайттарды бақылай алатын %2$s қолданбасына қосылған.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." "Жұмыс профиліңізді %1$s басқарады. Ол желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын %2$s қолданбасына қосылған.\n\nСондай-ақ сіз желідегі жеке белсенділігіңізді бақылай алатын %3$s қолданбасына қосылғансыз." - "Құрылғыңызды %1$s басқарады.\n\nӘкімші параметрлерді, корпоративтік рұқсатты, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғының орны туралы ақпаратты бақылай және басқара алады.\n\nСіз желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және евб-сайттарды бақылай алатын %2$s қолданбасына қосылғансыз.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." + "Құрылғыңызды %1$s басқарады.\n\nӘкімші параметрлерді, корпоративтік рұқсатты, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғының орны туралы ақпаратты бақылай және басқара алады.\n\nСіз желідегі белсенділікті, соның ішінде электрондық пошталарды, қолданбаларды және вебсайттарды бақылай алатын %2$s қолданбасына қосылғансыз.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз." "Қолмен бекітпесін ашқанша құрылғы бекітілген күйде қалады" "Хабарландыруларды тезірек алу" "Бекітпесін ашу алдында оларды көру" @@ -431,7 +437,8 @@ "Жаю" "Жию" "Экран түйрелді" - "Бұл оны босатылғанға дейін көрсетіп тұрады. Босату үшін \"Кері\" түймесін басып тұрыңыз." + "Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Артқа\" және \"Шолу\" түймелерін басып тұрыңыз." + "Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Кері\" түймесін басып тұрыңыз." "Түсіндім" "Жоқ, рақмет" "%1$s жасыру керек пе?" @@ -652,4 +659,7 @@ "Параметрлер тәртібін өзгерту." "%2$d ішінен %1$d" "Хабарландыруды үнсіз режимге қою не бөгеу мүмкін емес" + "Телефон қызуда" + "Телефон толық суығанға дейін, кейбір функциялардың жұмысы шектеледі" + "Телефон автоматты түрде суи бастайды. Оны пайдалана бере аласыз, бірақ ол баяуырақ жұмыс істеуі мүмкін.\n\nТелефон суығаннан кейін, оның жұмысы қалпына келеді." diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index f839eb648181..ba6b7f524e79 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -408,19 +408,25 @@ "ការ​ត្រួតពិនិត្យ​ឧបករណ៍" "តាមដានប្រវត្ថិរូប" "ការ​ត្រួតពិនិត្យ​បណ្ដាញ" + "VPN" + "ការ​ធ្វើ​កំណត់ហេតុ​បណ្តាញ" "បិទ VPN" "ផ្ដាច់ VPN" - "ឧបករណ៍របស់អ្នកត្រូវបានគ្រប់គ្រងដោយ៖ %1$s.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចឃ្លាំមើល និងគ្រប់គ្រងការកំណត់ ការចូលដំណើរការជាក្រុម កម្មវិធី ទិន្នន័យដែលជាប់ទាក់ទងនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។ សម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។" + "ឧបករណ៍​របស់អ្នក​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​របស់ %1$s។\n\nអ្នក​គ្រប់គ្រង​របស់អ្នក​អាចត្រួត​ពិនិត្យ និង​គ្រប់គ្រង​ការកំណត់ ការចូល​ប្រើ​​ជា​លក្ខណៈក្រុមហ៊ុន កម្មវិធី ទិន្នន័យ​ដែលពាក់ព័ន្ធ​នឹង​ឧបករណ៍​របស់អ្នក និង​ព័ត៌មាន​ទីតាំង​នៃឧបករណ៍​របស់​អ្នក។ សម្រាប់​ព័ត៌មាន​បន្ថែម សូម​ទាក់ទង​អ្នក​គ្រប់គ្រង​របស់​អ្នក។" + "អ្នកបានភ្ជាប់ទៅ %1$s ដែលអាចតាមដានសកម្មភាពក្នុងបណ្តាញរបស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រផងដែរ។" + " " + "បើក​ការ​កំណត់​ VPN" + "អ្នក​គ្រប់គ្រង​របស់អ្នក​បាន​បើក​ការ​ធ្វើ​កំណត់ហេតុ​បណ្តាញ​ ដែល​នឹង​តាមដាន​ចរាចរណ៍​នៅលើ​ឧបករណ៍​របស់អ្នក។\n\nសម្រាប់​ព័ត៌មាន​បន្ថែម​ សូម​ទាក់ទង​អ្នក​គ្រប់គ្រង​របស់អ្នក។" "អ្នកបានអនុញ្ញាតឲ្យកម្មវិធីដំឡើងការតភ្ជាប់ VPN។\n\nកម្មវិធីនេះអាចឃ្លាំមើលឧបករណ៍ និងសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។" - "ឧបករណ៍របស់អ្នកត្រូវបានគ្រប់គ្រងដោយ %1$s.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចឃ្លាំមើល និងគ្រប់គ្រងការកំណត់ ការចូលដំណើរការជាក្រុម កម្មវិធី ទិន្នន័យដែលជាប់ទាក់ទងនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។\n\nអ្នកត្រូវបានភ្ជាប់ជាមួយ VPN ដែលវាអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។" - "ប្រវត្តិការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ %1$s.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកមានលទ្ធភាពអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។\n\nអ្នកក៏ត្រូវបានភ្ជាប់ជាមួួយ VPN ផងដែរ ដែលវាអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក។" + "ឧបករណ៍​របស់អ្នក​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​របស់ %1$s។\n\nអ្នក​គ្រប់គ្រង​របស់អ្នក​អាចត្រួតពិនិត្យ និង​គ្រប់គ្រង​ការកំណត់ ការចូល​ប្រើ​ជាលក្ខណៈក្រុមហ៊ុន កម្មវិធី ទិន្នន័យ​ដែល​ពាក់ព័ន្ធ​នឹង​ឧបករណ៍​របស់អ្នក និង​ព័ត៌មាន​ទីតាំង​នៃឧបករណ៍​របស់​អ្នក។\n\nអ្នក​ត្រូវបាន​ភ្ជាប់​ទៅ VPN ដែល​អាចត្រួតពិនិត្យ​​សកម្មភាព​បណ្ដាញ​របស់អ្នក រួម​ទាំង​អ៊ីមែល កម្មវិធី ​និង​គេហទំព័រ។\n\nសម្រាប់​ព័ត៌មាន​បន្ថែម សូម​ទាក់ទង​អ្នក​គ្រប់គ្រង​របស់​អ្នក។" + "កម្រង​ព័ត៌មាន​ការងារ​របស់អ្នក​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​របស់ %1$s ។\n\nអ្នក​គ្រប់គ្រង​របស់អ្នក​មាន​លទ្ធភាព​តាមដាន​សកម្មភាព​នៅលើ​បណ្តាញ​របស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។\n\nសម្រាប់​ព័ត៌មាន​បន្ថែម​ សូម​ទាក់ទង​អ្នក​គ្រប់គ្រង​របស់អ្នក។\n\nអ្នក​ក៏​ត្រូវ​បាន​ភ្ជាប់​ទៅ VPN ដែល​អាច​តាមដាន​សកម្មភាព​នៅលើ​បណ្តាញ​របស់អ្នក​ផងដែរ។" "VPN" "អ្នកត្រូវបានតភ្ជាប់ទៅ %1$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។" "អ្នកត្រូវបានតភ្ជាប់ទៅ %1$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។" "អ្នកត្រូវបានភ្ជាប់ទៅ %1$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។" - "ប្រវត្តិរូបការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ %1$s។ វាត្រូវបានតភ្ជាប់ទៅនឹង %2$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រប់របស់អ្នក។" + "កម្រង​ព័ត៌មាន​ការងារ​របស់អ្នក​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​របស់ %1$s ។ វា​ត្រូវ​បាន​ភា្ជប់​ទៅ %2$s ដែល​អាចតាមដាន​សកម្មភាព​នៅលើ​បណ្តាញ​ការងារ​របស់អ្នក រួមទាំងអ៊ីមែល កម្មវិធី និង​គេហទំព័រ។\n\nសម្រាប់​ព័ត៌មាន​បន្ថែម សូម​ទាក់ទង​អ្នក​គ្រប់គ្រង​របស់អ្នក។" "ប្រវត្តិរូបការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ %1$s។ វាត្រូវបានតភ្ជាប់ទៅនឹង %2$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nអ្នកក៏ត្រូវបានតភ្ជាប់ផងដែរទៅនឹង %3$s ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញផ្ទាល់ខ្លួនរបស់អ្នក។" - "ឧបករណ៍របស់អ្នកត្រូវបានគ្រប់គ្រងដោយ %1$s.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចឃ្លាំមើល និងគ្រប់គ្រងការកំណត់ ការចូលប្រើជាក្រុម កម្មវិធី ទិន្នន័យដែលជាប់ទាក់ទងនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។\n\nអ្នកត្រូវបានភ្ជាប់ជាមួយ %2$s ដែលវាអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។" + "ឧបករណ៍​របស់អ្នក​ស្ថិត​ក្រោម​ការ​គ្រប់គ្រង​របស់ %1$s។\n\nអ្នក​គ្រប់គ្រង​របស់អ្នក​អាចត្រួតពិនិត្យ និង​គ្រប់គ្រង​ការកំណត់ ការចូល​ប្រើ​ជាជា​លក្ខណៈក្រុមហ៊ុន កម្មវិធី ទិន្នន័យ​ដែល​ពាក់ព័ន្ធ​នឹង​ឧបករណ៍​របស់អ្នក និង​ព័ត៌មាន​ទីតាំង​នៃឧបករណ៍​របស់​អ្នក។\n\nអ្នកត្រូវ​បាន​ភ្ជាប់​ទៅ %2$s ដែល​អាចត្រួតពិនិត្យ​សកម្មភាព​បណ្ដាញ​របស់អ្នក រួម​ទាំង​អ៊ីមែល កម្មវិធី​ និង​គេហទំព័រ។\n\nសម្រាប់​ព័ត៌មាន​បន្ថែម សូម​ទាក់ទង​អ្នក​គ្រប់គ្រង​របស់​អ្នក។" "ឧបករណ៍​នឹង​ចាក់​សោ​រហូត​ដល់​អ្នក​ដោះ​សោ​ដោយ​ដៃ" "ទទួល​បាន​ការ​ជូន​ដំណឹង​កាន់តែ​លឿន" "ឃើញ​ពួកវា​មុន​ពេល​ដោះ​សោ" @@ -431,7 +437,8 @@ "ពង្រីក" "បង្រួម" "អេក្រង់​ត្រូវ​បាន​ភ្ជាប់" - "វានឹងផ្អាករហូតដល់អ្នកផ្តាច់។ ប៉ះ និងសង្កត់គ្រាប់ចុចថយក្រោយដើម្បីផ្តាច់។" + "វា​នឹង​នៅតែ​បង្ហាញ រហូត​ទាល់​តែ​អ្នក​ដក​ការដៅ។ សូម​សង្កត់​ប៊ូតុង​ថយ​ក្រោយ និង​ប៊ូតុង​ទិដ្ឋភាពរួម​ឲ្យ​ជាប់ ដើម្បី​ដក​ការ​ដៅ។" + "វា​នឹង​នៅតែ​បង្ហាញ រហូត​ទាល់​តែ​អ្នក​ដក​ការ​ដៅ។ សូម​សង្កត់​ប៊ូតុង​ទិដ្ឋភាពរួម​​ឲ្យ​ជាប់ ដើម្បី​ដក​ការ​ដៅ។" "យល់​ហើយ" "ទេ អរគុណ" "លាក់ %1$s?" @@ -652,4 +659,7 @@ "កែលំដាប់ការកំណត់" "ទំព័រ %1$d នៃ %2$d" "ការជូនដំណឹងមិនអាចបិទសំឡេង ឬរារាំងបានទេ" + "ទូរសព្ទ​នេះ​កំពុង​កើន​កម្តៅ" + "មុខងារ​មួយ​ចំនួន​នឹង​មិន​អាច​ប្រើ​បាន​ពេញលេញ​នោះ​ទេ ខណៈពេល​ដែល​ទូរសព្ទ​កំពុង​បញ្ចុះ​កម្តៅ" + "ទូរសព្ទ​របស់អ្នក​នឹង​ព្យាយាម​បញ្ចុះ​កម្តៅ​ដោយ​ស្វ័យប្រវត្តិ។ អ្នក​នៅតែ​អាច​ប្រើ​ទូរសព្ទ​របស់អ្នក​បាន​ដដែល​ ប៉ុន្តែ​វា​នឹង​ដំណើរ​ការ​យឺត​ជាង​មុន។\n\nបន្ទាប់​ពី​ទូរសព្ទ​របស់អ្នក​ត្រជាក់​ជាង​មុន​ហើយ វា​នឹង​ដំណើរការ​ដូច​ធម្មតា។" diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index 8d9b2dd546b5..33a8fddc2a28 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -96,7 +96,7 @@ "ಧ್ವನಿ ಸಹಾಯಕವನ್ನು ತೆರೆ" "ಕ್ಯಾಮರಾ ತೆರೆಯಿರಿ" "ಹೊಸ ಕಾರ್ಯ ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆಮಾಡಿ" - "ರದ್ದುಮಾಡು" + "ರದ್ದುಮಾಡಿ" "ಹೊಂದಾಣಿಕೆಯ ಝೂಮ್ ಬಟನ್." "ಚಿಕ್ಕ ಪರದೆಯಿಂದ ದೊಡ್ಡ ಪರದೆಗೆ ಝೂಮ್ ಮಾಡು." "ಬ್ಲೂಟೂತ್‌‌ ಸಂಪರ್ಕಗೊಂಡಿದೆ." @@ -408,19 +408,25 @@ "ಸಾಧನ ಪರಿವೀಕ್ಷಣೆ" "ಪ್ರೊಫೈಲ್ ಮೇಲ್ವಿಚಾರಣೆ" "ನೆಟ್‌ವರ್ಕ್‌ ಪರಿವೀಕ್ಷಣೆ" + "VPN" + "ನೆಟ್‌ವರ್ಕ್ ಲಾಗಿಂಗ್" "VPN ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ" "VPN ಸಂಪರ್ಕಕಡಿತಗೊಳಿಸಿ" - "ನಿಮ್ಮ ಸಾಧನವನ್ನು %1$s ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಾಗೂ ನಿಮ್ಮ ಸಾಧನದೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಮತ್ತು ನಿರ್ವಹಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಹೊಂದಿದ್ದಾರೆ." + "ನಿಮ್ಮ ಸಾಧನವನ್ನು %1$s ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು. ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." + "ನೀವು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ, %1$s ಗೆ ನೀವು ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." + " " + "VPN ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ" + "ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ನೆಟ್‌ವರ್ಕ್ ಲಾಗಿಂಗ್ ಆನ್ ಮಾಡಿದ್ದಾರೆ. ಇದು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿನ ಟ್ರಾಫಿಕ್ ಮೇಲೆ ನಿಗಾ ಇರಿಸುತ್ತದೆ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗೆ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." "ನೀವು VPN ಸಂಪರ್ಕ ಹೊಂದಿಸಲು ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅನುಮತಿ ನೀಡಿರುವಿರಿ.\n\nಈ ಅಪ್ಲಿಕೇಶನ್ ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು." - "ನಿಮ್ಮ ಸಾಧನವನ್ನು %1$s ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಾಗೂ ನಿಮ್ಮ ಸಾಧನದೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nನೀವು VPN ಗೆ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿರುವಿರಿ, ಅದು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿರ್ವಹಿಸಬಹುದು.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." - "ನಿಮ್ಮ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು %1$s ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಹೊಂದಿದ್ದಾರೆ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.\n\nನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ VPN ಗೆ ಕೂಡಾ ನೀವು ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." + "ನಿಮ್ಮ ಸಾಧನವನ್ನು %1$s ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಸೇರಿದಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ VPN ಜೊತೆ ಸಂಪರ್ಕಿಸಿರುವಿರಿ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." + "ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು %1$s ನಿರ್ವಹಿಸುತ್ತಿದೆ.\n\nಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳೂ ಸೇರಿದಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ ಚಟುವಟಿಕೆಯ ಮೇಲೆ ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಗಾ ಇರಿಸಬಲ್ಲರು.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.\n\nಅಲ್ಲದೇ, ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ ಚಟುವಟಿಕೆಯ ನಿಗಾ ವಹಿಸುವ VPN ಗೂ ಸಹ ನೀವು ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." "VPN" "ನೀವು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." "ನೀವು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." "ನೀವು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %1$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ." - "ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು %1$s ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಇದು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %2$s ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." + "ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು %1$s ನಿರ್ವಹಿಸುತ್ತಿದೆ. ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳೂ ಸೇರಿದಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲೆ ನಿಗಾ ಇರಿಸಬಲ್ಲ %2$s ಗೆ ಇದು ಸಂಪರ್ಕ ಹೊಂದಿದೆ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." "ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು %1$s ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಇದು ಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %2$s ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿದೆ.\n\nನೀವು ಕೂಡಾ ವೈಯಕ್ತಿಕ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %3$s ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರುವಿರಿ." - "ನಿಮ್ಮ ಸಾಧನವನ್ನು %1$s ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಹಾಗೂ ನಿಮ್ಮ ಸಾಧನದೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %2$s ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರುವಿರಿ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." + "ನಿಮ್ಮ ಸಾಧನವನ್ನು %1$s ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಇಮೇಲ್‌ಗಳು, ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಮತ್ತು ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಸೇರಿದಂತೆ ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ %2$s ಜೊತೆಗೆ ಸಂಪರ್ಕ ಹೊಂದಿರುವಿರಿ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ." "ನೀವಾಗಿಯೇ ಅನ್‌ಲಾಕ್‌ ಮಾಡುವವರೆಗೆ ಸಾಧನವು ಲಾಕ್‌ ಆಗಿಯೇ ಇರುತ್ತದೆ" "ವೇಗವಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಿ" "ನೀವು ಅನ್‌ಲಾಕ್‌ ಮಾಡುವ ಮೊದಲೇ ಅವುಗಳನ್ನು ನೋಡಿ" @@ -431,7 +437,8 @@ "ವಿಸ್ತರಿಸು" "ಸಂಕುಚಿಸು" "ಪರದೆಯನ್ನು ಪಿನ್ ಮಾಡಲಾಗಿದೆ" - "ನೀವು ಅನ್‌ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್‌ಪಿನ್ ಮಾಡಲು ಹಿಂದೆ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ." + "ನೀವು ಅನ್‌ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್‌ಪಿನ್ ಮಾಡಲು ಅವಲೋಕಿಸಿ." + "ನೀವು ಅನ್‌ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್‌ಪಿನ್ ಮಾಡಲು ಅವಲೋಕನವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ." "ತಿಳಿಯಿತು" "ಧನ್ಯವಾದಗಳು" "%1$s ಮರೆಮಾಡುವುದೇ?" @@ -652,4 +659,7 @@ "ಸೆಟ್ಟಿಂಗ್‌ಗಳ ಕ್ರಮವನ್ನು ಎಡಿಟ್ ಮಾಡಿ." "%2$d ರಲ್ಲಿ %1$d ಪುಟ" "ಸೂಚನೆಗಳನ್ನು ಮೌನವಾಗಿಸಲಾಗುವುದಿಲ್ಲ ಅಥವಾ ತಡೆಹಿಡಿಯಲಾಗುವುದಿಲ್ಲ" + "ಫೋನ್ ಬಿಸಿಯಾಗುತ್ತಿದೆ" + "ಫೋನ್ ತಣ್ಣಗಾಗುವವರೆಗೂ ಕೆಲವು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸೀಮಿತಗೊಳಿಸುತ್ತದೆ" + "ನಿಮ್ಮ ಫೋನ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತಣ್ಣಗಾಗಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ. ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೀವು ಈಗಲೂ ಬಳಸಬಹುದಾಗಿರುತ್ತದೆ, ಆದರೆ ಇದು ನಿಧಾನವಾಗಿರಬಹುದು.\n\nಒಮ್ಮೆ ನಿಮ್ಮ ಫೋನ್ ತಣ್ಣಗಾದ ನಂತರ ಇದು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ." diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index b3f121c359b5..3cfd7150193b 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -410,19 +410,25 @@ "기기 모니터링" "프로필 모니터링" "네트워크 모니터링" + "VPN" + "네트워크 로깅" "VPN 사용 중지" "VPN 연결 해제" - "이 기기는 %1$s에서 관리합니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 관련된 데이터, 기기의 위치 정보를 모니터링하고 관리할 수 있습니다. 자세한 내용은 관리자에게 문의하세요." + "%1$s에서 기기를 관리합니다.\n\n관리자가 설정, 기업 액세스, 앱, 기기와 연결된 데이터 및 기기의 위치 정보를 모니터링하고 관리할 수 있습니다. 자세한 내용은 관리자에게 문의하세요." + "%1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다." + " " + "공개 VPN 설정" + "관리자가 기기에서 발생하는 트래픽을 모니터링하는 네트워크 로깅을 사용 설정했습니다.\n\n자세한 정보는 관리자에게 문의하세요." "VPN 연결을 설정할 수 있는 권한을 앱에 부여했습니다.\n\n이 앱에서 이메일, 앱, 웹사이트와 같은 내 네트워크 활동 및 기기를 모니터링할 수 있습니다." - "이 기기는 %1$s에서 관리합니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 관련된 데이터, 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\nVPN에 연결되어 있으므로 VPN 업체에서 이메일, 앱, 웹사이트를 비롯한 내 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." - "직장 프로필은 %1$s에서 관리합니다.\n\n관리자는 이메일, 앱, 웹사이트와 같은 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요.\n\n또한 VPN에 연결되어 있으며 여기에서 내 네트워크 활동을 모니터링할 수 있습니다." + "%1$s에서 기기를 관리합니다.\n\n관리자가 설정, 기업 액세스, 앱, 기기와 연결된 데이터 및 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\nVPN에 연결된 상태이며, VPN에서 이메일, 앱, 웹사이트를 비롯한 내 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." + "%1$s에서 직장 프로필을 관리합니다.\n\n관리자가 이메일, 앱, 웹사이트를 비롯한 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 정보는 관리자에게 문의하세요.\n\n또한 VPN에 연결되어 있으며, VPN에서 네트워크 활동을 모니터링할 수 있습니다." "VPN" "%1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다." "%1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다." "%1$s에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 개인 네트워크 활동을 모니터링할 수 있습니다." - "직장 프로필은 %1$s에서 관리합니다. 이는 %2$s에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." + "%1$s에서 직장 프로필을 관리합니다. 직장 프로필은 %2$s에 연결되며, 이 애플리케이션에서 이메일, 앱, 웹사이트를 비롯한 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." "직장 프로필은 %1$s에서 관리합니다. 이는 %2$s에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n또한 %3$s에 연결되어 있으며, 여기에서 내 개인 네트워크 활동을 모니터링할 수 있습니다." - "%1$s에서 기기를 관리합니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 연결된 데이터, 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\n%2$s에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." + "%1$s에서 기기를 관리합니다.\n\n관리자가 설정, 기업 액세스, 앱, 기기와 연결된 데이터 및 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\n%2$s에 연결된 상태이며, 이 애플리케이션에서 이메일, 앱, 웹사이트를 비롯한 내 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요." "수동으로 잠금 해제할 때까지 기기가 잠금 상태로 유지됩니다." "알림을 더욱 빠르게 받기" "잠금 해제하기 전에 알림을 봅니다." @@ -433,7 +439,8 @@ "펼치기" "접기" "화면 고정됨" - "고정 해제될 때까지 계속 볼 수 있습니다. 고정 해제하려면 길게 터치하세요." + "고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 뒤로 및 최근 사용을 길게 터치하세요." + "고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 최근 사용을 길게 터치하세요." "확인" "거부" "%1$s을(를) 숨기시겠습니까?" @@ -654,4 +661,7 @@ "설정 순서 수정" "%2$d페이지 중 %1$d페이지" "알림을 무음으로 설정하거나 차단할 수 없습니다." + "휴대전화 온도가 높음" + "휴대전화 온도를 낮추는 동안 일부 기능이 제한됩니다." + "휴대전화 온도를 자동으로 낮추려고 시도합니다. 휴대전화를 계속 사용할 수는 있지만 작동이 느려질 수도 있습니다.\n\n휴대전화 온도가 낮아지면 정상적으로 작동됩니다." diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index cb404cb30a02..bc2ec413205d 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -408,19 +408,25 @@ "Түзмөккө көз салуу" "Профилди көзөмөлдөө" "Тармакка көз салуу" + "VPN" + "Тармактын таржымалы алынууда" "VPN\'ди өчүрүү" "VPN\'ди ажыратуу" - "Түзмөгүңүздү %1$s башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат. Көбүрөөк маалымат үчүн, администраторуңузга кайрылыңыз." + "Түзмөгүңүздү %1$s башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат. Көбүрөөк маалымат үчүн, администраторуңузга кайрылыңыз." + "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тескей турган %1$s колдонмосуна туташып турасыз." + " " + "VPN жөндөөлөрүн ачуу" + "Администраторуңуз тармактын таржымалын алууну иштетти, андыктан түзмөгүңүздөгү трафик көзөмөлгө алынды.\n\nКеңири маалымат алуу үчүн администраторуңузга кайрылыңыз." "Колдонмого VPN туташуусун орнотууга уруксат бердиңиз.\n\nБул колдонмо түзмөгүңүздү жана электрондук почталар, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди көзөмөлдөй алат." - "Түзмөгүңүздү %1$s башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nСиз тармактагы жеке аракетиңизди көзөмөлдөй турган VPN\'ге туташкансыз.\n\nКөбүрөөк маалымат үчүн, администраторуңузга кайрылыңыз." - "Жумуш профилиңизди %1$s башкарат.\n\nАдминистраторуңуз электрондук почталар, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тескей алат.\n\nКөбүрөөк маалымат алуу үчүн, администраторуңузга кайрылыңыз.\n\nМындан тышкары, тармактагы аракеттериңизди тескей турган VPN\'ге да туташып турасыз." + "Түзмөгүңүздү %1$s башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nСиз тармактагы жеке аракетиңизди көзөмөлдөй турган VPN\'ге туташкансыз.\n\nКөбүрөөк маалымат үчүн, администраторуңузга кайрылыңыз." + "Жумуш профилиңизди %1$s башкарат.\n\nАдминистраторуңуздун тармактагы аракетиңизди, анын ичинде электрондук почталар, колдонмолор жана вебсайттарды көзөмөлдөө мүмкүнчүлүгү бар.\n\nКөбүрөөк маалымат үчүн, администраторуңузга кайрылыңыз.\n\nСиз тармактагы жеке аракетиңизди көзөмөлдөй турган VPN\'ге да туташкансыз." "VPN" "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактык аракеттерди көзөмөлдөй турган %1$s колдонмосуна туташып турасыз." "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы жеке аракеттериңизди көзөмөлдөй турган %1$s колдонмосуна туташып турасыз." "Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы жеке аракеттериңизди тескей турган %1$s колдонмосуна туташып турасыз." - "Жумуш профилиңизди %1$s башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди көзөмөлдөй турган %2$s менен туташкан.\n\nКөбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз." + "Жумуш профилиңизди %1$s башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди көзөмөлдөй турган %2$s менен туташкан.\n\nКөбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз." "Жумуш профилиңизди %1$s башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди көзөмөлдөй турган %2$s менен туташкан.\n\nМындан тышкары, тармактагы жеке аракеттериңизди көзөмөлдөгөн %3$s колдонмосуна туташып турасыз." - "Түзмөгүңүздү %1$s башкарат.\nАдминистраторуңуз түзмөгүңүздөгү жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, дайындарды, ошону менен катар жайгашкан жер дайындарын башкарып, тийиштүү маалыматты карай алат.\n\nСиз электрондук почталар, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тармактагы аракетиңизди тескей турган APPLICATION колдонмосуна туташып турасыз.\n%2$sКөбүрөөк маалымат алуу үчүн, администраторуңузга кайрылыңыз.\n\n" + "Түзмөгүңүздү %1$s башкарат.\n\nАдминистраторуңуз түзмөгүңүздөгү жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, ошону менен катар жайгашкан жер дайындарын башкарып, тийиштүү маалыматты карай алат.\n\nСиз электрондук почталар, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тескей турган %2$s колдонмосуна туташып турасыз.\n\nКөбүрөөк маалымат алуу үчүн, администраторуңузга кайрылыңыз." "Түзмөктүн кулпусу кол менен ачылмайынча кулпуланган бойдон алат" "Эскертмелерди тезирээк алуу" "Аларды кулпудан чыгараардан мурун көрүңүз" @@ -431,7 +437,8 @@ "Жайып көрсөтүү" "Жыйнап коюу" "Экран кадалган" - "Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Артка\" баскычын басып, кармап туруңуз." + "Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Артка\" жана \"Карап чыгуу\" баскычтарын басып, кармап туруңуз." + "Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Карап чыгуу\" баскычын басып, кармап туруңуз." "Түшүндүм" "Жок, рахмат" "%1$s жашырылсынбы?" @@ -652,4 +659,7 @@ "Жөндөөлөрдүн иретин өзгөртүү." "%2$d ичинен %1$d-бет" "Эскертмелердин үнүн басууга же бөгөттөөгө болбойт" + "Телефонуңуз ысып баратат" + "Телефон сууганча айрым элементтердин иши чектелген" + "Телефонуңуз автоматтык түрдө сууйт. Аны колдоно берсеңиз болот, бирок ал жайыраак иштеп калат.\n\nТелефонуңуз суугандан кийин адаттагыдай эле иштеп баштайт." diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index 76350ccf56c7..f7f9fc74fa90 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -408,19 +408,25 @@ "ການກວດ​ສອບ​ຕິດ​ຕາມ​ອຸ​ປະ​ກອນ" "ການ​ຕິດ​ຕາມ​ໂປຣ​ໄຟລ໌" "ການກວດ​ສອບ​ຕິດ​ຕາມ​ເຄືອ​ຂ່າຍ" + "VPN" + "ການບັນທຶກເຄືອຂ່າຍ" "ປິດ​ການ​ໃຊ້ VPN" "ຕັດ​ການ​ເຊື່ອມ​ຕໍ່ VPN" - "ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​​ຖືກ​ຄຸ້ມ​ຄອງ​ໂດຍ %1$s . \n\n ຜູ້​ຄວບ​ຄຸມຂອງ​ທ່ານ​ສາ​ມາດ​ຕິດ​ຕາມ​ກວດ​ກາ ​ແລະ​ການ​ຄຸ້ມ​ຄອງ​ການຕັ້ງ​ຄ່າ, ແອັບ​ການ​ເຂົ້າ​ຫາ​ບໍ​ລິ​ສັດ, ຂໍ້​ມູນ​ທີ່​ກ່ຽວ​ຂ້ອງ​ກັບ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ, ແລະ​ຂໍ້​ມູນທີ່​ຕັ້ງ​ຂອງອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​. ສໍາ​ລັບ​ຂໍ້​ມູນ​ເພີ່ມ​ເຕີມ​, ຕິດ​ຕໍ່​ຜູ້ຄວບ​ຄຸມຂອງ​ທ່ານ​." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information. For more information, contact your admin." + "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍ, ຮວມທັງອີເມວ, ແອັບ ແລະ ເວັບໄຊຕ່າງໆໄດ້." + " " + "ເປີດການຕັ້ງຄ່າ VPN" + "Your admin has turned on network logging, which monitors traffic on your device.\n\nFor more information, contact your admin." "ທ່ານໄດ້ອະນຸຍາດໃຫ້ແອັບຕັ້ງການເຊື່ອມຕໍ່ VPN.\n\nແອັບນີ້ສາມາດຕິດຕາມການເຄື່ອນໄຫວຂອງອຸປະກອນ ແລະເຄືອຂ່າຍຂອງທ່ານ ເຊິ່ງລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌." - "ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ຖືກ​ຄຸ້ມ​ຄອງ​ໂດຍ %1$s.\n\nຜູ້​ຄວບ​ຄຸມຂອງ​ທ່ານ​ສາ​ມາດ​ຕິດ​ຕາມ​ກວດ​ກາ ​ແລະ​ການ​ຄຸ້ມ​ຄອງ​ການຕັ້ງ​ຄ່າ, ແອັບ​ການ​ເຂົ້າ​ຫາ​ບໍ​ລິ​ສັດ, ຂໍ້​ມູນ​ທີ່​ກ່ຽວ​ຂ້ອງ​ກັບ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ, ແລະ​ຂໍ້​ມູນທີ່​ຕັ້ງ​ຂອງອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​.\n\nທ່ານ​ຍັງ​ເຊື່ອມ​ຕໍ່​ກັບ VPN, ເຊິ່ງ​ສາ​ມາດ​ຕິດ​ຕາມ​ກິດ​ຈະ​ກຳ​ເຄືອ​ຂ່າຍ​ຂອງ​ທ່ານ, ລວມ​ທັງ​ອີ​ເມວ, ແອັບ, ແລະ​ເວັບ​ໄຊ​ທ໌.\n\nສໍາ​ລັບ​ຂໍ້​ມູນ​ເພີ່ມ​ເຕີມ​, ຕິດ​ຕໍ່​ຜູ້​ຄວບ​ຄຸມ​ຂອງ​ທ່ານ​." - "ໂປ​ຣ​ໄຟ​ລ໌​ວຽກ​ຂອງ​ທ່ານ​ຖືກ​ຄຸ້ມ​ຄອງ​ໂດຍ %1$s.\n\nຜູ້​ຄວບ​ຄຸມ​ຂອງ​ທ່ານ​ສາ​ມາດ​ຕິດ​ຕາມການ​ເຄື່ອນ​ໄຫວ​ເຄືອ​ຂ່າຍ​ຂອງ​ທ່ານ​ໄດ້​ ລວມ​ທັງ​ອີ​ເມວ, ແອັບ, ແລະ​ເວັບ​ໄຊ​ທ໌​.\n\nສຳ​ລັບ​ຂໍ້​ມູນ​ເພີ່ມ​ເຕີມ, ຕິດ​ຕໍ່​ຜູ້​ຄວບ​ຄຸມ​ຂອງ​ທ່ານ.\n\nທ່ານ​ຍັງ​ເຊື່ອມ​ຕໍ່​ກັບ VPN, ເຊິ່ງ​ສາ​ມາດ​ຕິດ​ຕາມ​ກິດ​ຈະ​ກຳ​ເຄືອ​ຂ່າຍ​​ຂອງ​ທ່ານ." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your admin." + "Your work profile is managed by %1$s.\n\nYour admin is capable of monitoring your network activity including emails, apps, and websites.\n\nFor more information, contact your admin.\n\nYou\'re also connected to a VPN, which can monitor your network activity." "VPN" "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານ ລວມທັງອີເມວ, ​ແອັບ ແລະເວັບໄຊທ໌." "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ ລວມທັງອີເມວ, ​ແອັບ ແລະເວັບໄຊທ໌." "ທ່ານເຊື່ອມຕໍ່ກັບ %1$s ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ ຮວມທັງອີເມວ, ​ແອັບ ແລະເວັບໄຊໄດ້." - "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານຖືກຄວບຄຸມໂດຍ %1$s. ມັນຖືກເຊື່ອມຕໍ່ກັບ %2$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍບ່ອນເຮັດວຽກຂອງທ່ານ ລວມທັງອີເມວ,​ ແອັບ ແລະເວັບໄຊທ໌.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ໃຫ້ຕິດຕໍ່ຜູ້ບໍລິຫານຂອງທ່ານ." + "Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps, and websites.\n\nFor more information, contact your admin." "ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານຖືກຈັດການໂດຍ %1$s. ມັນເຊື່ອມຕໍ່ກັບ %2$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍບ່ອນເຮັດວຽກຂອງທ່ານ ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌.\n\nທ່ານເຊື່ອມຕໍ່ກັບ %3$s, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ." - "ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ຖືກ​ຄຸ້ມ​ຄອງ​ໂດຍ %1$s.\n\nຜູ້​ຄວບ​ຄຸມຂອງ​ທ່ານ​ສາ​ມາດ​ຕິດ​ຕາມ​ກວດ​ກາ ​ແລະ​ການ​ຄຸ້ມ​ຄອງ​ການຕັ້ງ​ຄ່າ, ແອັບ​ການ​ເຂົ້າ​ຫາ​ບໍ​ລິ​ສັດ, ຂໍ້​ມູນ​ທີ່​ກ່ຽວ​ຂ້ອງ​ກັບ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ, ແລະ​ຂໍ້​ມູນທີ່​ຕັ້ງ​ຂອງອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ.\n\nທ່ານ​ເຊື່ອມ​ຕໍ່​ກັບ %2$s ແລ້ວ, ເຊິ່ງ​ສາ​ມາດ​ຕິດ​ຕາມການ​ເຄື່ອນ​ໄຫວ​ເຄືອ​ຂ່າຍ​ຂອງ​ທ່ານ, ລວມ​ທັງ​ອີ​ເມວ, ແອັບ, ແລະ​ເວັບ​ໄຊ​ທ໌.\n\nສຳ​ລັບ​ຂໍ້​ມູນ​ເພີ່ມ​ເຕີມ, ຕິດ​ຕໍ່​ຜູ້​ຄວບ​ຄຸມ​ຂອງ​ທ່ານ." + "Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your admin." "Device will stay locked until you manually unlock" "ຮັບເອົາການ​ແຈ້ງເຕືອນ​ໄວຂຶ້ນ" "ເບິ່ງພວກ​ມັນກ່ອນ​ທ່ານຈະ​ປົດລັອກ" @@ -431,7 +437,8 @@ "ຂະຫຍາຍ" "ຫຍໍ້ລົງ" "ປັກ​ໝຸດໜ້າ​ຈໍ​ແລ້ວ" - "ນີ້ຈະເຮັດໃຫ້ມັນຢູ່ໃນມຸມມອງຈົນກວ່າທ່ານຈະຍົກເລີກປັກໝຸດ. ໃຫ້ແຕະປຸ່ມກັບຄືນຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກໝຸດ." + "ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກມຸດ. ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກມຸດ." + "ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກມຸດ. ໃຫ້ແຕະປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກມຸດ." "ເຂົ້າໃຈແລ້ວ" "ບໍ່, ຂອບໃຈ" "ເຊື່ອງ %1$s ຫຼື​ບໍ່?" @@ -652,4 +659,7 @@ "ແກ້ໄຂລຳດັບການຕັ້ງຄ່າ." "%1$d ຈາກທັງໝົດ %2$d" "ບໍ່ສາມາດປິດສຽງ ຫຼື ບລັອກການແຈ້ງເຕືອນໄດ້" + "ໂທລະສັບກຳລັງຮ້ອນຂຶ້ນ" + "ຄຸນສົມບັດບາງຢ່າງຖືກຈຳກັດໄວ້ເນື່ອງໃນເວລາຫຼຸດອຸນຫະພູມຂອງໂທລະສັບ" + "ໂທລະສັບຂອງທ່ານຈະພະຍາຍາມລົດອຸນຫະພູມລົງ. ທ່ານຍັງຄົງສາມາດໃຊ້ໂທລະສັບຂອງທ່ານໄດ້ຢູ່, ແຕ່ມັນຈະເຮັດວຽກຊ້າລົງ.\n\nເມື່ອໂທລະສັບຂອງທ່ານບໍ່ຮ້ອນຫຼາຍແລ້ວ, ມັນຈະກັບມາເຮັດວຽກຕາມປົກກະຕິ." diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 480d88a2c09c..49164cf644ab 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -412,19 +412,25 @@ "Įrenginio stebėjimas" "Profilio stebėjimas" "Tinklo stebėjimas" + "VPN" + "Tinklo duomenų įrašymas į žurnalą" "Išjungti VPN" "Atjungti VPN" - "Jūsų įrenginį tvarko „%1$s“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės informacijos pasiekiamumo nustatymus, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją. Daugiau informacijos galite gauti susisiekę su administratoriumi." + "Įrenginį tvarko „%1$s“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės prieigą, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją. Daugiau informacijos galite gauti susisiekę su administratoriumi." + "Esate prisijungę prie programos „%1$s“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." + " " + "Atidaryti VPN nustatymus" + "Administratorius įjungė tinklo duomenų įrašymą į žurnalą. Įjungus šią funkciją stebimas srautas jūsų įrenginyje.\n\nJei reikia daugiau informacijos, susisiekite su administratoriumi." "Suteikėte programai leidimą nustatyti VPN ryšį.\n\nŠi programa gali stebėti įrenginio ir tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." - "Jūsų įrenginį tvarko „%1$s“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės informacijos pasiekiamumo nustatymus, programas, su įrenginiu susietus duomenis ir įrenginio vietos informaciją.\n\nEsate prisijungę prie VPN, kuris gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi." - "Jūsų darbo profilį tvarko „%1$s“.\n\nAdministratorius gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi.\n\nBe to, esate prisijungę prie VPN, kuris gali stebėti tinklo veiklą." + "Įrenginį tvarko „%1$s“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės prieigą, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nEsate prisijungę prie VPN, kuris gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi." + "Jūsų darbo profilį tvarko „%1$s“.\n\nJūsų administratorius gali stebėti jūsų tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nJei reikia daugiau informacijos, susisiekite su administratoriumi.\n\nTaip pat esate prisijungę prie VPN, kuris gali stebėti jūsų tinklo veiklą." "VPN" "Esate prisijungę prie programos „%1$s“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." "Esate prisijungę prie programos „%1$s“, kuri gali stebėti asmeninio profilio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." "Esate prisijungę prie programos „%1$s“, kuri gali stebėti asmeninio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines." - "Darbo profilį tvarko „%1$s“. Jis susietas su programa „%2$s“, kuri gali stebėti darbo profilio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi." + "Jūsų darbo profilį tvarko „%1$s“. Jis susietas su programa „%2$s“, kuri negali stebėti jūsų tinklo veiklos, įskaitant el. laiškus, programas ir svetaines.\n\nJei reikia daugiau informacijos, susisiekite su administratoriumi." "Darbo profilį tvarko „%1$s“. Jis susietas su programa „%2$s“, kuri gali stebėti darbo profilio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nTaip pat esate prisijungę prie programos „%3$s“, kuri gali stebėti asmeninio profilio tinklo veiklą." - "Jūsų įrenginį tvarko „%1$s“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės informacijos pasiekiamumo nustatymus, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nEsate prisijungę prie programos „%2$s“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi." + "Įrenginį tvarko „%1$s“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės prieigą, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nEsate prisijungę prie „%2$s“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi." "Įrenginys liks užrakintas, kol neatrakinsite jo neautomatiniu būdu" "Greičiau gaukite pranešimus" "Peržiūrėti prieš atrakinant" @@ -435,7 +441,8 @@ "Išskleisti" "Sutraukti" "Ekranas prisegtas" - "Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“, kad atsegtumėte." + "Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Apžvalga“, kad atsegtumėte." + "Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Apžvalga“, kad atsegtumėte." "Supratau" "Ne, ačiū" "Slėpti „%1$s“?" @@ -656,4 +663,7 @@ "Redaguoti nustatymų tvarką." "%1$d psl. iš %2$d" "Pranešimų negalima nutildyti arba užblokuoti" + "Telefonas kaista" + "Kai kurios funkcijos gali neveikti, kol telefonas vėsta" + "Telefonas automatiškai bandys atvėsti. Telefoną vis tiek galėsite naudoti, tačiau jis gali veikti lėčiau.\n\nKai telefonas atvės, jis veiks įprastai." diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 564a29c5f05d..3a3e792f615b 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -410,19 +410,25 @@ "Ierīces pārraudzība" "Profila pārraudzība" "Tīkla pārraudzība" + "VPN" + "Tīkla reģistrēšana" "Atspējot VPN" "Atvienot VPN tīklu" - "Jūsu ierīci pārvalda %1$s.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas ir saistīti ar šo ierīci, kā arī informāciju par jūsu ierīces atrašanās vietu. Lai iegūtu plašāku informāciju, sazinieties ar administratoru." + "Jūsu ierīci pārvalda %1$s.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas saistīti ar jūsu ierīci, kā arī informāciju par ierīces atrašanās vietu. Lai iegūtu plašāku informāciju, sazinieties ar administratoru." + "Ir izveidots savienojums ar lietotni %1$s, kas var pārraudzīt jūsu darbības tīklā, tostarp e-pasta ziņojumus, lietotnes un vietnes." + " " + "Atvērt VPN iestatījumus" + "Administrators ir ieslēdzis tīkla reģistrēšanu, kuru izmanto, lai pārraudzītu datplūsmu jūsu ierīcē.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." "Jūs piešķīrāt lietotnei atļauju izveidot savienojumu ar VPN tīklu.\n\nŠī lietotne var pārraudzīt jūsu ierīcē un tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes." - "Jūsu ierīci pārvalda %1$s.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas ir saistīti ar šo ierīci, kā arī informāciju par jūsu ierīces atrašanās vietu.\n\nIerīcē ir izveidots savienojums ar VPN tīklu, kurā var tikt pārraudzītas jūsu tīklā veiktās darbības, tostarp e-pasts, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." - "Jūsu darba profilu pārvalda %1$s.\n\nJūsu administrators var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru.\n\nIerīcē ir arī izveidots savienojums ar VPN tīklu, kurā var tikt pārraudzītas jūsu tīklā veiktās darbības." + "Jūsu ierīci pārvalda %1$s.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas saistīti ar jūsu ierīci, kā arī informāciju par ierīces atrašanās vietu.\n\nIr izveidots savienojums ar VPN tīklu, kurā var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." + "Jūsu darba profilu pārvalda %1$s.\n\nAdministrators var pārraudzīt jūsu darbības darba tīklā, tostarp e-pastu, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru.\n\nIr izveidots savienojums arī ar VPN, kurā var pārraudzīt jūsu darbības tīklā." "VPN" "Ir izveidots savienojums ar lietotni %1$s, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes." "Ir izveidots savienojums ar lietotni %1$s, kura var pārraudzīt jūsu tīklā veiktās privātās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes." "Ir izveidots savienojums ar lietotni %1$s, kas var pārraudzīt jūsu tīklā veiktās privātās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes." - "Jūsu darba profilu pārvalda %1$s. Tas ir saistīts ar lietojumprogrammu %2$s, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." + "Jūsu darba profilu pārvalda %1$s. Tas ir saistīts ar lietojumprogrammu %2$s, kurā var pārraudzīt jūsu darbības darba tīklā, tostarp e-pastu, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." "Jūsu darba profilu pārvalda %1$s. Tas ir saistīts ar lietojumprogrammu %2$s, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nIr piesaistīta arī lietojumprogramma %3$s, kas var pārraudzīt jūsu tīklā veiktās privātās darbības." - "Jūsu ierīci pārvalda %1$s.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas ir saistīti ar šo ierīci, kā arī informāciju par jūsu ierīces atrašanās vietu.\n\nIr piesaistīta lietojumprogramma %2$s, kas var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." + "Jūsu ierīci pārvalda %1$s.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas saistīti ar jūsu ierīci, kā arī informāciju par ierīces atrašanās vietu.\n\nIr izveidots savienojums ar %2$s, kurā var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru." "Ierīce būs bloķēta, līdz to manuāli atbloķēsiet." "Saņemiet paziņojumus ātrāk" "Skatiet tos pirms atbloķēšanas." @@ -433,7 +439,8 @@ "Izvērst" "Sakļaut" "Ekrāns ir piesprausts" - "Ekrāns tiek rādīts, kamēr tas nav atsprausts. Lai atspraustu, pieskarieties taustiņam Atpakaļ un turiet to." + "Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogām Atpakaļ un Pārskats un turiet tās." + "Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogai Pārskats un turiet to." "Sapratu!" "Nē, paldies" "Vai paslēpt vienumu %1$s?" @@ -654,4 +661,7 @@ "Rediģēt iestatījumu secību." "%1$d. lpp. no %2$d" "Nevar izslēgt paziņojumu signālu vai tos bloķēt" + "Tālrunis kļūst silts" + "Dažas funkcijas ir ierobežotas, kamēr tālrunis mēģina atdzist" + "Jūsu tālrunis automātiski mēģinās atdzist. Jūs joprojām varat izmantot tālruni, taču tas, iespējams, darbosies lēnāk.\n\nTiklīdz tālrunis būs atdzisis, tas darbosies normāli." diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index 602fdc9fb385..2173146172d3 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -408,19 +408,25 @@ "Следење на уредот" "Следење профил" "Следење на мрежата" + "VPN" + "Евиденција на мрежа" "Оневозможи ВПН" "Исклучи ВПН" - "Со вашиот уред управува %1$s.\n\nВашиот администратор може да ги следи и да управува со поставките, корпоративните пристапи, апликациите, податоците поврзани со вашиот уред и информациите за локација на уредот. За повеќе информации, контактирајте со администраторот." + "Со вашиот уред управува %1$s.\n\nВашиот администратор може да ги следи и да управува со поставките, корпоративниот пристап, апликациите, податоците поврзани со вашиот уред и информациите за локацијата на уредот. За повеќе информации, контактирајте со администраторот." + "Поврзани сте на %1$s, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-сајтовите." + " " + "Отворете „Поставки за VPN“" + "Вашиот администратор вклучил евиденција на мрежата, што подразбира следење на сообраќајот на вашиот уред.\n\nЗа повеќе информации, контактирајте со администраторот." "Дозволивте апликацијата да постави поврзување преку ВПН.\n\nАпликацијата може да го следи уредот и активноста на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите." - "Со вашиот уред управува %1$s.\n\nВашиот администратор може да ги следи и да управува со поставките, корпоративните пристапи, апликациите, податоците поврзани со вашиот уред и информациите за локација на уредот.\n\nПоврзани сте со VPN што може да ја следи вашата мрежна активност, вклучувајќи е-пошта, апликации и веб-локации.\n\nЗа повеќе информации, контактирајте со администраторот." - "%1$s управува со вашиот работен профил.\n\nАдминистратор е во можност да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот.\n\nИсто така, поврзани сте на ВПН, којашто може да ја следи вашата активност на мрежата." + "Со вашиот уред управува %1$s.\n\nВашиот администратор може да ги следи и да управува со поставките, корпоративниот пристап, апликациите, податоците поврзани со вашиот уред и информациите за локацијата на уредот.\n\nПоврзани сте на VPN што може да ја следи вашата активност на мрежата, што опфаќа и е-пораки, апликации и веб-сајтови.\n\nЗа повеќе информации, контактирајте со администраторот." + "%1$s управува со вашиот работен профил.\n\nАдминистратор е во можност да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот.\n\nYИсто така, поврзани сте на VPN којашто може да ја следи вашата активност на мрежата." "ВПН" "Поврзани сте на %1$s, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите." "Поврзани сте на %1$s, којашто може да ја следи вашата лична активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите." "Поврзани сте на %1$s, којашто може да ја следи вашата лична активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите." - "%1$s управува со вашиот работен профил. Истиот е поврзан на %2$s, којашто може да ја следи вашата работна активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот." + "%1$s управува со вашиот работен профил. Истиот е поврзан на %2$s, којашто може да ја следи вашата работна активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот." "%1$s управува со вашиот работен профил. Истиот е поврзан на %2$s, којашто може да ја следи вашата работна активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nВие исто така сте поврзани на %3$s, којашто може да ја следи вашата лична активност на мрежата." - "%1$s управува со вашиот уред.\n\nВашиот администратор може да ги следи и да управува со параметрите, корпоративниот пристап, апликациите, податоците поврзани со уредот и информациите за локацијата на уредот.\n\nПоврзани сте на %2$s, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот." + "Со вашиот уред управува %1$s.\n\nВашиот администратор може да ги следи и да управува со поставките, корпоративниот пристап, апликациите, податоците поврзани со вашиот уред и информациите за локацијата на уредот.\n\nПоврзани сте на %2$s што може да ја следи вашата активност на мрежата, што опфаќа и е-пораки, апликации и веб-сајтови.\n\nЗа повеќе информации, контактирајте со администраторот." "Уредот ќе остане заклучен додека рачно не го отклучите" "Добивајте известувања побрзо" "Видете ги пред да отклучите" @@ -431,7 +437,8 @@ "Прошири" "Собери" "Екранот е прикачен" - "Ќе се гледа сѐ додека не го откачите. Допрете и држете Назад за откачување." + "Ќе се гледа сѐ додека не го откачите. Допрете и држете „Назад“ и „Краток преглед“ за откачување." + "Ќе се гледа сѐ додека не го откачите. Допрете и држете „Краток преглед“ за откачување." "Сфатив" "Не, фала" "Сокриј %1$s?" @@ -528,7 +535,7 @@ "Штедач на батерија" "Ја намалува изведбата и податоците во заднина" "Копче %1$s" - "Почетна страница" + "Home-копче" "Назад" "Стрелка нагоре" "Стрелка надолу" @@ -548,7 +555,7 @@ "Страница нагоре" "Страница надолу" "Избриши" - "Почетна страница" + "Home-копче" "Крај" "Вметни" "Num Lock" @@ -652,4 +659,7 @@ "Уредете го редоследот на поставките." "Страница %1$d од %2$d" "Известувања не може да се стишат или блокираат" + "Телефонот се загрева" + "Некои функции се ограничени додека телефонот се лади" + "Телефонот автоматски ќе се обиде да се олади. Вие сепак ќе може да го користите, но тој може да работи побавно.\n\nОткако ќе се олади, ќе работи нормално." diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index ddabf900734c..523b8f799b29 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -44,7 +44,7 @@ "ബാറ്ററി സേവർ ഓണാക്കുക" "ക്രമീകരണം" "വൈഫൈ" - "സ്‌ക്രീൻ സ്വയമേതിരിക്കുക" + "സ്‌ക്രീൻ സ്വയമേ തിരിക്കുക" "മ്യൂട്ടുചെയ്യുക" "യാന്ത്രികം" "അറിയിപ്പുകൾ" @@ -408,19 +408,25 @@ "ഉപകരണം നിരീക്ഷിക്കൽ" "പ്രൊഫൈൽ നിരീക്ഷിക്കൽ" "നെറ്റ്‌വർക്ക് നിരീക്ഷിക്കൽ" + "VPN" + "നെറ്റ്‌വർക്ക് ലോഗിംഗ്" "VPN പ്രവർത്തനരഹിതമാക്കുക" "VPN വിച്‌ഛേദിക്കുക" - "നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് %1$s ആണ്.\n\nനിങ്ങളുടെ അഡ്‌മിനിസ്ട്രേറ്റർക്ക്, ഉപകരണവുമായി ബന്ധപ്പെട്ട ക്രമീകരണവും കോർപ്പറേറ്റ് ആക്സസ്സും അപ്ലിക്കേഷനുകളും വിവരവും ഒപ്പം ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരവും നിരീക്ഷിച്ച് നിയന്ത്രിക്കാനാകും. കൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്‌മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക." + "നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് %1$s ആണ്.\n\nക്രമീകരണം, കോർപ്പറേറ്റ് ആക്‌സസ്, ആപ്‌സ്, നിങ്ങളുടെ ഉപകരണവുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ‌വിവരങ്ങൾ എന്നിവ കൈകാര്യം ചെയ്യാനും നിരീക്ഷിക്കാനും നിങ്ങളുടെ അഡ്‌മിന് കഴിയും. കൂടുതൽ വിവരങ്ങൾക്ക് അഡ്‌മിനെ ബന്ധപ്പെടുക." + "നിങ്ങൾ %1$s ആപ്പിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്‌സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും." + " 5" + "VPN ക്രമീകരണം തുറക്കുക" + "നിങ്ങളുടെ ഉപകരണത്തിലെ ട്രാഫിക്ക് നിരീക്ഷിക്കുന്ന നെറ്റ്‌വർക്ക് ലോഗിംഗ് അഡ്‌മിൻ ഓണാക്കിയിട്ടുണ്ട്.\n\nകൂടുതൽ ‌വിവരങ്ങൾക്ക് അഡ്‌മിനുമായി‌ ബന്ധപ്പെടുക." "VPN കണക്ഷൻ സജ്ജീകരിക്കാൻ നിങ്ങൾ ഒരു ആപ്പിന് അനുമതി നൽകി.\n\nഈ ആപ്പിന് നിങ്ങളുടെ ഇമെയിലുകളും ആപ്സും വെബ്‌സൈറ്റുകളും ഉൾപ്പെടെ, ഉപകരണവും നെറ്റ്‌വർക്ക് പ്രവർത്തനവും നിരീക്ഷിക്കാൻ കഴിയും." - "നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് %1$s ആണ്.\n\nനിങ്ങളുടെ അഡ്‌മിനിസ്ട്രേറ്റർക്ക്, ഉപകരണവുമായി ബന്ധപ്പെട്ട ക്രമീകരണവും കോർപ്പറേറ്റ് ആക്സസ്സും അപ്ലിക്കേഷനുകളും വിവരവും ഒപ്പം ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരവും നിരീക്ഷിച്ച് നിയന്ത്രിക്കാനാകും.\n\nഇമെയിലുകളും അപ്ലിക്കേഷനുകളും വെബ്‌സൈറ്റുകളും ഉൾപ്പെടെയുള്ള നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന ഒരു VPN-ലേക്കും നിങ്ങൾ കണക്റ്റുചെയ്തിരിക്കുന്നു.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്‌മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക." - "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് %1$s ആണ്.\n\nനിങ്ങളുടെ അഡ്‌മിനിസ്ട്രേറ്റർക്ക് ഇമെയിലുകളും അപ്ലിക്കേഷനുകളും സുരക്ഷിത വെബ്‌സൈറ്റുകളും ഉൾപ്പെടെയുള്ള നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാൻ കഴിയും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്‌മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക.\n\nനിങ്ങളുടെ നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന ഒരു VPN-ലേക്കും നിങ്ങൾ കണക്റ്റുചെയ്തിരിക്കുന്നു." + "നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് %1$s ആണ്.\n\nക്രമീകരണം, കോർപ്പറേറ്റ് ആക്‌സസ്, ആപ്‌സ്, നിങ്ങളുടെ ഉപകരണവുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ‌വിവരങ്ങൾ എന്നിവ കൈകാര്യം ചെയ്യാനും നിരീക്ഷിക്കാനും നിങ്ങളുടെ അഡ്‌മിന് കഴിയും.\n\nഇമെയിലുകൾ, ആപ്‌സ്, വെബ്‌സൈറ്റുകൾ എന്നിവയടങ്ങുന്ന നിങ്ങളുടെ നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന ഒരു VPN-ലേയ്ക്ക് നിങ്ങൾ കണക്റ്റുചെയ്യപ്പെട്ടിരിക്കുന്നു.\n\nകൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെടുക." + "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് %1$s ആണ്.\n\nഇമെയിലുകൾ, ആപ്‌സ്, വെബ്‌സൈറ്റുകൾ എന്നിവയടങ്ങുന്ന നിങ്ങളുടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ അഡ്‌മിന് കഴിയും.\n\nകൂടുതൽ ‌വിവരങ്ങൾക്ക് അഡ്‌മിനുമായി‌ ബന്ധപ്പെടുക.\n\nനെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി ‌നിരീക്ഷിക്കാൻ സാധിക്കുന്ന ഒരു VPN-ലേക്ക് കൂടി നിങ്ങൾ കണക്റ്റ് ‌ചെയ്യപ്പെട്ടിരിക്കുന്നു." "VPN" "നിങ്ങൾ %1$s എന്നതിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും." "നിങ്ങൾ %1$s എന്നതിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ സ്വകാര്യ നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും." "നിങ്ങൾ %1$s ആപ്പിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്‌സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും." - "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് %1$s ആണ്. നിങ്ങൾ %2$s എന്നതിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുക." + "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് %1$s ആണ്. ഇമെയിൽ, ആപ്പുകൾ, ‌വെബ്‌സൈറ്റുകൾ എന്നിവയടങ്ങുന്ന നിങ്ങളുടെ നെറ്റ്‌വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ സാധിക്കുന്ന %2$s എന്നതിലേക്ക് ഇത് ‌കണക്റ്റ്‌ ചെയ്യപ്പെട്ടിരിക്കുന്നു.\n\nകൂടുതൽ ‌വിവരങ്ങൾക്ക് അഡ്‌മിനുമായി‌ ബന്ധപ്പെടുക." "നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് %1$s ആണ്. നിങ്ങൾ %2$s എന്നതിലേക്ക് കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്‌സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും.\n\nനിങ്ങൾ %3$s എന്നതിലേക്കും കണക്റ്റുചെയ്‌തിരിക്കുന്നു, അതിന് നിങ്ങളുടെ സ്വകാര്യ നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും." - "നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് %1$s ആണ്.\n\nനിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർക്ക്, ഉപകരണവുമായി ബന്ധപ്പെട്ട ക്രമീകരണവും കോർപ്പറേറ്റ് ആക്‌സസ്സും അപ്ലിക്കേഷനുകളും വിവരവും ഒപ്പം ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരവും നിരീക്ഷിച്ച് നിയന്ത്രിക്കാനാകും.\n\nഇമെയിലുകളും അപ്ലിക്കേഷനുകളും വെബ്‌സൈറ്റുകളും ഉൾപ്പെടെയുള്ള നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന ഒരു %2$s എന്നതിലേക്കും നിങ്ങൾ കണക്റ്റുചെയ്തിരിക്കുന്നു.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്‌മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക." + "നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് %1$s ആണ്.\n\nക്രമീകരണം, കോർപ്പറേറ്റ് ആക്‌സസ്, ആപ്‌സ്, നിങ്ങളുടെ ഉപകരണവുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ‌വിവരങ്ങൾ എന്നിവ കൈകാര്യം ചെയ്യാനും നിരീക്ഷിക്കാനും നിങ്ങളുടെ അഡ്‌മിന് കഴിയും.\n\nഇമെയിലുകൾ, ആപ്‌സ്, വെബ്‌സൈറ്റുകൾ എന്നിവയടങ്ങുന്ന നിങ്ങളുടെ നെറ്റ്‌വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന %2$s എന്ന ആപ്പിലേയ്ക്ക് നിങ്ങൾ കണക്റ്റുചെയ്യപ്പെട്ടിരിക്കുന്നു.\n\nകൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങളുടെ അഡ്‌മിനെ ബന്ധപ്പെടുക." "നിങ്ങൾ സ്വമേധയാ അൺലോക്കുചെയ്യുന്നതുവരെ ഉപകരണം ലോക്കുചെയ്‌തതായി തുടരും" "അറിയിപ്പുകൾ വേഗത്തിൽ സ്വീകരിക്കുക" "അൺലോക്കുചെയ്യുന്നതിന് മുമ്പ് അവ കാണുക" @@ -431,7 +437,8 @@ "വികസിപ്പിക്കുക" "ചുരുക്കുക" "സ്‌ക്രീൻ പിൻ ചെയ്‌തു" - "നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യുന്നതിന് \'മടങ്ങുക\' സ്‌പർശിച്ചുപിടിക്കുക." + "നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'തിരികെ\', \'ചുരുക്കവിവരണം\' എന്നിവ സ്‌പർശിച്ച് പിടിക്കുക." + "നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'ചുരുക്കവിവരണം\' സ്‌പർശിച്ച് പിടിക്കുക." "മനസ്സിലായി" "വേണ്ട, നന്ദി" "%1$s എന്നത് മറയ്‌ക്കണോ?" @@ -456,8 +463,8 @@ "%1$s. അൺമ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക." - "%1$s. വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക. പ്രവേശനക്ഷമതാ സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം." - "%1$s. മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക. പ്രവേശനക്ഷമതാ സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം." + "%1$s. വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം." + "%1$s. മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം." "%s വോളിയം നിയന്ത്രണങ്ങൾ കാണിച്ചിരിക്കുന്നു. ഡിസ്മിസ് ചെയ്യുന്നതിന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്യുക." "വോളിയം നിയന്ത്രണങ്ങൾ മറച്ചിരിക്കുന്നു" "സിസ്റ്റം UI ട്യൂണർ" @@ -652,4 +659,7 @@ "ക്രമീകരണ ക്രമം എഡിറ്റുചെയ്യുക." "പേജ് %1$d / %2$d" "അറിയിപ്പുകൾ നിശബ്ദമാക്കാനോ ബ്ലോക്കുചെയ്യാനോ കഴിയില്ല" + "ഫോൺ ചൂടായിക്കൊണ്ടിരിക്കുന്നു" + "ഫോൺ തണുത്തുകൊണ്ടിരിക്കുമ്പോൾ ചില ഫീച്ചറുകൾ പരിമിതപ്പെടുത്തപ്പെടും" + "നിങ്ങളുടെ ഫോൺ സ്വയമേവ തണുക്കാൻ ശ്രമിക്കും. നിങ്ങൾക്ക് അപ്പോഴും ഫോൺ ഉപയോഗിക്കാമെങ്കിലും പ്രവർത്തനം മന്ദഗതിയിലായിരിക്കും.\n\nതണുത്തുകഴിഞ്ഞാൽ, ഫോൺ സാധാരണ ഗതിയിൽ പ്രവർത്തിക്കും." diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index df9e7993ea7b..621ef7a47b1d 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -406,19 +406,25 @@ "Төхөөрөмжийн хяналт" "Профайл хяналт" "Сүлжээний хяналт" + "VPN" + "Сүлжээний лог" "VPN идэвхгүйжүүлэх" "VPN таслах" - "Таны төхөөрөмж удирдагч %1$s.\n\nТаны админ таны төхөөрөмжтэй холбоотой тохиргоо, байгууллагын хандалт, мэдээлэл болон байршлын мэдээллийг удирдан, хяналт тавих боломжтой." + "%1$s таны төхөөрөмжийг удирддаг\n\nТаны админ тохиргоо, байгууллагын хандалт, апп, таны төхөөрөмжтэй холбоотой өгөгдөл болон байршлын мэдээллийг хянаж, удирдах боломжтой. Дэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу." + "Таны имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой %1$s-д холбогдсон байна." + " " + "VPN тохиргоог нээх" + "Таны админ төхөөрөмжийн ачааллыг хянадаг сүлжээний логийг асаасан байна.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу." "Та апп-д VPN холболт хийхийг зөвшөөрсөн байна.\n\nЭнэхүү апп нь таны имэйл, апп, вэбсайт зэрэг төхөөрөмж болон сүлжээний үйл ажиллагааг хянах боломжтой." - "Таны төхөөрөмжийн удирдагч %1$s.\n\nТаны админ таны төхөөрөмжтэй холбоотой тохиргоо, байгууллагын хандалт, мэдээлэл болон байршлын мэдээллийг удирдан, хяналт тавих боломжтой.\n\nТа таны имэйл, апп, вэб сайтын үйл ажиллагааг хянах VPN-д холбогдсон байна.\n\nДэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу." - "Таны ажлын профайлыг %1$s удирддаг.\n\nАдмин нь таны имэйл,апп болон вэбсайт зэрэг сүлжээний үйл ажиллагааг хянадаг. \n\n Дэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу. \n\nМөн та VPN-д холбогдсон бөгөөд ингэснээр өөрийн сүлжээний үйл ажиллагааг хянах боломжтой байна." + "%1$s таны төхөөрөмжийг удирддаг\n\nТаны админ тохиргоо, байгууллагын хандалт, апп, таны төхөөрөмжтэй холбоотой өгөгдөл, болон байршлын мэдээллийг хянаж, удирдах боломжтой.\n\nТа имэйл, апп, вэб хуудас зэрэг таны сүлжээний үйл ажиллагааг хянах боломжтой VPN-д холбогдсон байна.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу." + "%1$s таны ажлын профайлыг удирддаг.\n\nТаны админ имэйл, апп болон вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу.\n\nТа сүлжээний үйл ажиллагааг хянах боломжтой VPN-д холбогдсон байна." "VPN" - "Та %1$s-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вебсайт зэрэг сүлжээний үйл ажиллагааг хянах боломжтой." - "Та %1$s-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вебсайт зэрэг сүлжээний хувийн үйл ажиллагааг хянах боломжтой." + "Та %1$s-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вэбсайт зэрэг сүлжээний үйл ажиллагааг хянах боломжтой." + "Та %1$s-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вэбсайт зэрэг сүлжээний хувийн үйл ажиллагааг хянах боломжтой." "Та имэйл, апп, вэб хуудас зэрэг хувийн сүлжээнийхээ үйл ажиллагааг хянах боломжтой %1$s-д холбогдсон байна." - "Таны ажлын профайлыг %1$s удирддаг. Энэ нь %2$s-тэй холбогдсон бөгөөд таны имэйл, апп, вебсайт зэрэг сүлжээний үйл ажиллагааг хянах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу." - "Таны ажлын профайлыг %1$s удирддаг. Энэ нь %2$s-тай холбогдсон бөгөөд таны имэйл, апп, вебсайт зэрэг ажлын сүлжээний үйл ажиллагааг хянах боломжтой.\n\nМөн та %3$s-д холбогдсон бөгөөд энэ нь таны сүлжээний хувийн үйл ажиллагааг хянаж чадна." - "Таны төхөөрөмжийг %1$s удирддаг.\n\n Танай админ төхөөрөмж, төхөөрөмжийн байршилтай холбоотой өгөгдлийг холбох, тохиргоог өөрчлөх болон хяналт тавих боломжтой.\n\nТа %2$s-тай холбогдсон бөгөөд ингэснээр таны имэйл,апп, аюулгүй вебсайт зэрэг сүлжээний үйл ажиллагаагаа хянах боломжтой.\n\n Дэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу." + "%1$s таны ажлын профайлыг удирддаг. Энэ нь таны имэйл, апп, вэб хуудас зэрэг ажлын сүлжээний үйл ажиллагааг хянах боломжтой %2$s-тэй холбогдсон.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу." + "Таны ажлын профайлыг %1$s удирддаг. Энэ нь %2$s-тай холбогдсон бөгөөд таны имэйл, апп, вэбсайт зэрэг ажлын сүлжээний үйл ажиллагааг хянах боломжтой.\n\nМөн та %3$s-д холбогдсон бөгөөд энэ нь таны сүлжээний хувийн үйл ажиллагааг хянаж чадна." + "%1$s таны төхөөрөмжийг удирддаг\n\nТаны админ тохиргоо, байгууллагын хандалт, апп, таны төхөөрөмжтэй холбоотой өгөгдөл болон байршлын мэдээллийг хянаж, удирдах боломжтой.\n\nТа имэйл, апп, вэб хуудас зэрэг таны сүлжээний үйл ажиллагааг хянах боломжтой %2$s-д холбогдсон байна.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу." "Таныг гараар онгойлгох хүртэл төхөөрөмж түгжээтэй байх болно" "Мэдэгдлийг хурдан авах" "Түгжээг тайлахын өмнө үзнэ үү" @@ -429,7 +435,8 @@ "Дэлгэх" "Хураах" "Дэлгэц эхэнд байрлуулагдсан" - "Таныг эхэнд нээхийг болиулах хүртэл харагдах болно. Эхэнд нээхийг болиулахын тулд Буцах товчлуурыг дараад, хүлээнэ үү." + "Таныг тогтоосныг болиулах хүртэл үүнийг харуулна. Тогтоосныг болиулахын тулд Буцах, Тоймыг дараад хүлээнэ үү." + "Таныг тогтоосныг болиулах хүртэл харагдах болно. Тогтоосныг болиулахын тулд Буцах товчлуурыг дараад, хүлээнэ үү." "Ойлголоо" "Үгүй" "%1$s-ийг нуух уу?" @@ -652,4 +659,7 @@ "Тохиргооны дарааллыг өөрчилнө үү." "%2$d%1$d-р хуудас" "Мэдэгдлийн дууг хаах, эсвэл блоклох боломжгүй" + "Утас халж эхэлж байна" + "Таны утас хөрж байх зуур зарим онцлогийг хязгаарласан" + "Таны утас автоматаар хөрөх болно. Та утсаа ашиглаж болох хэдий ч удаан ажиллаж болзошгүй.\n\nТаны утас хөрсний дараагаар хэвийн ажиллана." diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index 006b9bbd5605..f35531c81da0 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -408,19 +408,25 @@ "डिव्हाइस परीक्षण" "प्रोफाईल परीक्षण" "नेटवर्क परीक्षण" + "VPN" + "नेटवर्क लॉगिंग" "VPN अक्षम करा" "VPN डिस्कनेक्ट करा" - "आपले डिव्हाइस %1$s द्वारे व्यवस्थापित केलेले आहे.\n\nआपला प्रशासक आपल्या डिव्हाइसशी संबंधित सेटिंग्ज, कॉर्पोरेट प्रवेश, अॅप्स, डेटा आणि आपल्या डिव्हाइसच्या स्थान माहितीचे परीक्षण करू शकतो. अधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा." + "आपले डिव्हाइस %1$s द्वारे व्यवस्थापित केले जाते.\n\nआपला प्रशासक सेटिंग्ज, कॉर्पोरेट प्रवेश, अॅप्स, आपल्या डिव्हाइसशी संबंधित डेटा आणि आपल्या डिव्हाइसच्या स्थानाची माहिती यांचे निरीक्षण करू आणि व्यवस्थापित करू शकतो. अधिक माहितीसाठी आपल्या प्रशासकाशी संपर्क साधा." + "आपण %1$s शी कनेक्‍ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." + " " + "VPN सेटिंग्ज उघडा" + "आपल्या प्रशासकाने नेटवर्क लॉगिंग चालू केले आहे, जे आपल्या डिव्हाइसवरील रहदारीचे निरीक्षण करते.\n\nअधिक माहितीसाठी आपल्या प्रशासकाशी संपर्क साधा." "आपण VPN कनेक्शन सेट करण्यासाठी अ‍ॅपला परवानगी दिली.\n\nहा अ‍ॅप ईमेल, अ‍ॅप्स आणि वेबसाइटसह, आपल्या डिव्हाइस आणि नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." - "आपले डिव्हाइस %1$s द्वारे व्यवस्थापित केलेले आहे.\n\nआपला प्रशासक आपल्या डिव्हाइसशी संबंधित सेटिंग्ज, कॉर्पोरेट प्रवेश, अॅप्स, डेटा आणि आपल्या डिव्हाइसच्या स्थान माहितीचे परीक्षण करू शकतो. अधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा.\n\nआपण एका VPN शी देखील कनेक्ट केलेले आहे जो आपल्या ईमेल, अॅप्स आणि वेबसाइटसह आपल्या वैयक्तिक नेटवर्क क्रियाकलापाचे देखील परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा." - "आपले कार्य प्रोफाईल %1$s द्वारे व्यवस्थापित केले आहे.\n\nआपला प्रशासक ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करण्यास सक्षम आहे.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा.\n\nआपण एका VPN शी देखील कनेक्ट केले आहे, जो आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." + "आपले डिव्हाइस %1$s द्वारे व्यवस्थापित केले जाते.\n\nआपला प्रशासक सेटिंग्ज, कॉर्पोरेट प्रवेश, अॅप्स, आपल्या डिव्हाइसशी संबंधित डेटा आणि आपल्या डिव्हाइसच्या स्थानाची माहिती यांचे निरीक्षण करू आणि व्यवस्थापित करू शकतो.\n\nआपण VPN सह कनेक्ट आहात, जे ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापांचे निरीक्षण करू शकते.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा." + "आपले कार्य प्रोफाइल %1$s द्वारे व्यवस्थापित केले जाते.\n\nआपला प्रशासक ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे निरीक्षण करण्यास सक्षम आहे.\n\nअधिक माहितीसाठी आपल्या प्रशासकाशी संपर्क साधा.\n\nआपण VPN शी देखील कनेक्ट आहात, जे आपल्या नेटवर्क क्रियाकलापाचे निरीक्षण करू शकते." "VPN" "आपण %1$s शी कनेक्‍ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." "आपण %1$s शी कनेक्‍ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." "आपण %1$s शी कनेक्‍ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो." - "आपले कार्य प्रोफाईल %1$s द्वारे व्यवस्थापित केले आहे. ते %2$s शी कनेक्ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्‍या प्रशासकाशी संपर्क साधा." + "आपले कार्य प्रोफाइल %1$s द्वारे व्यवस्थापित केले जाते. ते %2$s शी कनेक्ट केलेले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसह आपल्या कार्य नेटवर्क क्रियाकलापाचे निरीक्षण करते. \n\nअधिक माहितीसाठी आपल्या प्रशासकाशी संपर्क साधा." "आपले कार्य प्रोफाईल %1$s द्वारे व्यवस्थापित केले आहे. ते %2$s शी कनेक्ट केले आहे, जे ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्‍या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकते.\n\nआपण %3$s शी देखील कनेक्‍ट केले आहे, जे आपल्‍या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकते." - "आपले डिव्हाइस %1$s द्वारे व्यवस्थापित केले आहे.\n\nआपला प्रशासक आपल्या डिव्हाइसशी संबद्ध सेटिंग्ज, कॉर्पोरेट प्रवेश, अ‍ॅप्स, डेटा आणि आपल्या डिव्हाइसच्या स्थान माहितीचे परीक्षण करू शकतो आणि व्‍यवस्थापित करू शकतो.\n\nआपण %2$s शी कनेक्ट केले आहे, जो ईमेल, अ‍ॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा." + "आपले डिव्हाइस %1$s द्वारे व्यवस्थापित केले जाते.\n\nआपला प्रशासक सेटिंग्ज, कॉर्पोरेट प्रवेश, अॅप्स, आपल्या डिव्हाइसशी संबंधित डेटा आणि आपल्या डिव्हाइसच्या स्थानाची माहिती यांचे निरीक्षण करू आणि व्यवस्थापित करू शकतो.\n\nआपण %2$s सह कनेक्ट आहात, जे ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापांचे निरीक्षण करू शकते.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा." "आपण व्यक्तिचलितपणे अनलॉक करेपर्यंत डिव्हाइस लॉक केलेले राहील" "सूचना अधिक जलद मिळवा" "आपण अनलॉक करण्‍यापूर्वी त्यांना पहा" @@ -431,7 +437,8 @@ "विस्तृत करा" "संकुचित करा" "स्क्रीन पिन केलेली आहे" - "आपण अनपिन करेपर्यंत हे त्यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी स्पर्श करा आणि परत धरून ठेवा." + "आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्‍यासाठी परत आणि विहंगावलोकनास स्पर्श करा आणि धरून ठेवा." + "आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्‍यासाठी विहंगावलोकनास स्पर्श करा आणि धरून ठेवा." "समजले" "नाही धन्यवाद" "%1$s लपवायचे?" @@ -483,8 +490,8 @@ "हॉटस्पॉट" "कार्य प्रोफाईल" "सर्वांसाठी नाही तर काहींसाठी मजेदार असू शकते" - "सिस्टीम UI ट्यूनर आपल्‍याला Android वापरकर्ता इंटरफेस ट्विक आणि सानुकूल करण्‍याचे अनेक प्रकार देते. ही प्रयोगात्मक वैशिष्‍ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्‍यातील रिलीझ मध्‍ये कदाचित दिसणार नाहीत. सावधगिरी बाळगून पुढे सुरु ठेवा." - "ही प्रयोगात्मक वैशिष्‍ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्‍यातील रिलीझ मध्‍ये कदाचित दिसणार नाहीत." + "सिस्टीम UI ट्यूनर आपल्‍याला Android वापरकर्ता इंटरफेस ट्विक आणि सानुकूल करण्‍याचे अनेक प्रकार देते. ही प्रयोगात्मक वैशिष्‍ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्‍यातील रिलीज मध्‍ये कदाचित दिसणार नाहीत. सावधगिरी बाळगून पुढे सुरु ठेवा." + "ही प्रयोगात्मक वैशिष्‍ट्ये बदलू शकतात, खंडित होऊ शकतात किंवा भविष्‍यातील रिलीज मध्‍ये कदाचित दिसणार नाहीत." "समजले" "अभिनंदन! सिस्टीम UI ट्यूनर सेटिंग्जमध्‍ये जोडले गेले आहे" "सेटिंग्ज मधून काढा" @@ -652,4 +659,7 @@ "सेटिंग्जचा क्रम संपादित करा." "पृष्ठ %2$d पैकी %1$d" "सूचना शांत किंवा अवरोधित केल्या जाऊ शकत नाहीत" + "फोन ऊष्ण होत आहे" + "फोन थंड होत असताना काही वैशिष्‍ट्ये मर्यादित असतात" + "आपला फोन स्वयंचलितपणे थंड होईल. आपण अद्यापही आपला फोन वापरू शकता परंतु तो कदाचित धीमेपणे कार्य करेल.\n\nआपला फोन एकदा थंड झाला की, तो सामान्यपणे कार्य करेल." diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index df0faeb287ee..5bbf9ec54a27 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -408,19 +408,25 @@ "Pemantauan peranti" "Pemantauan profil" "Pemantauan rangkaian" + "VPN" + "Pengelogan Rangkaian" "Lumpuhkan VPN" "Putuskan sambungan VPN" - "Peranti anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti serta maklumat lokasi peranti anda. Untuk mendapatkan maklumat lanjut, sila hubungi pentadbir anda." + "Peranti anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti dan maklumat lokasi peranti anda. Untuk mendapatkan maklumat lanjut, hubungi pentadbir anda." + "Anda disambungkan ke %1$s, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web." + " " + "Buka Tetapan VPN" + "Pentadbir anda telah menghidupkan pengelogan rangkaian yang memantau trafik pada peranti anda.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda." "Anda memberikan kebenaran kepada apl untuk menyediakan sambungan VPN.\n\nApl ini boleh memantau aktiviti peranti dan rangkaian anda, termasuk e-mel, apl dan tapak web." - "Peranti anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti serta maklumat lokasi peranti anda.\n\nAnda disambungkan ke VPN, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, sila hubungi pentadbir anda." - "Profil kerja anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda.\n\nAnda turut disambungkan ke VPN, yang boleh memantau aktiviti rangkaian anda." + "Peranti anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti dan maklumat lokasi peranti anda.\n\nAnda disambungkan ke VPN, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda." + "Profil kerja anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau aktiviti rangkaian, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda.\n\nAnda juga disambungkan ke VPN, yang boleh memantau aktiviti rangkaian." "VPN" "Anda disambungkan ke %1$s, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web." "Anda disambungkan ke %1$s, yang boleh memantau aktiviti rangkaian peribadi anda, termasuk e-mel, apl dan tapak web." "Anda disambungkan ke %1$s, yang boleh memantau aktiviti rangkaian peribadi anda, termasuk e-mel, apl dan tapak web." - "Profil kerja anda diurus oleh %1$s. Profil ini disambungkan ke %2$s, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, sila hubungi pentadbir anda." + "Profil kerja anda diurus oleh %1$s. Profil ini disambungkan ke %2$s, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda." "Profil kerja anda diurus oleh %1$s. Profil disambungkan ke %2$s, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nAnda turut disambungkan ke %3$s, yang boleh memantau aktiviti rangkaian peribadi anda." - "Peranti anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti anda serta maklumat lokasi peranti anda.\n\nAnda disambungkan ke %2$s, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda." + "Peranti anda diurus oleh %1$s.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti dan maklumat lokasi peranti anda.\n\nAda disambungkan ke %2$s, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda." "Peranti akan kekal terkunci sehingga anda membuka kunci secara manual" "Dapatkan pemberitahuan lebih cepat" "Lihat sebelum anda membuka kunci" @@ -431,7 +437,8 @@ "Kembangkan" "Runtuhkan" "Skrin telah disemat" - "Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali untuk menyahsemat." + "Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali dan Ikhtisar untuk menyahsemat." + "Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Ikhtisar untuk menyahsemat." "Faham" "Tidak" "Sembunyikan %1$s?" @@ -652,4 +659,7 @@ "Edit susunan tetapan." "Halaman %1$d daripada %2$d" "Pemberitahuan tidak boleh disenyapkan atau disekat" + "Telefon semakin panas" + "Sesetengah ciri adalah terhad semasa telefon menyejuk" + "Telefon anda akan cuba menyejuk secara automatik. Anda masih dapat menggunakan telefon itu tetapi telefon tersebut mungkin berjalan lebih perlahan.\n\nSetelah telefon anda sejuk, telefon itu akan berjalan seperti biasa." diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index 92ee06e0ef54..9a71701646d4 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -408,19 +408,25 @@ "ကိရိယာကို စောင့်ကြပ်ခြင်း" "ပရိုဖိုင် စောင့်ကြပ်မှု" "ကွန်ရက်ကို စောင့်ကြပ်ခြင်း" + "VPN" + "ကွန်ရက်မှတ်တမ်းတင်ခြင်း" "VPN ကို ပိတ်ထားရန်" "VPN ကို အဆက်ဖြတ်ရန်" - "သင့်စက်ကိရိယာကို%1$s\n\nမှစီမံခန့်ခွဲထားပါသည်။သင့်စီမံခန့်ခွဲသူသည် ကြိုတင်ပြင်ဆင်မှုများ၊စုပေါင်းဝင်ရောက်ခွင့်၊အက်ပလီကေးရှင်းများ၊သင့်စက်ကိရိယာနှင့်ဆက်နွယ်နေသောအချက်အလက်နှင့်သင့်စက်ကိရိယာ ရဲ့နေရာအချက်အလက်များကိုကြီးကြပ်စောင့်ကြည့်နိုင်ပါသည်။အသေးစိတ်သိရှိလိုပါကသင်၏စီမံခန့်ခွဲသူကိုဆက်သွယ်ပါ။" + "သင်၏စက်ပစ္စည်းကို %1$s က စီမံခန့်ခွဲထားပါသည်။\n\nစီမံခန့်ခွဲသူသည် ဆက်တင်များ၊ အဖွဲ့အစည်း အသုံးပြုခွင့်များ၊ အက်ပ်များ၊ စက်ပစ္စည်းနှင့် ဆက်စပ်နေသည့် ဒေတာများနှင့် စက်ပစ္စည်း၏ တည်နေရာ အချက်အလက်များကို စောင့်ကြည့် စီမံနိုင်ပါသည်။ နောက်ထပ် အချက်အလက်များအတွက် စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" + "အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် %1$s သို့ သင်သည် ချိတ်ဆက်ထားပါသည်။" + " " + "Open VPN ဆက်တင်များ" + "သင့်စီမံခန့်ခွဲသူသည် စက်ပစ္စည်းပေါ်ရှိ ဒေတာအသွားအလာကို စောင့်ကြည့်နိုင်သည့် ကွန်ရက်အတွက် မှတ်တမ်းတင်ခြင်းကို ဖွင့်ထားပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" "VPN ချိတ်ဆက်မှုပြုလုပ်ရန် အက်ပ်ကို သင်ခွင့်ပြုလိုက်သည်။ \n\n ဤအက်ပ်သည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည်။" - "သင့်စက်ကိရိယာကို%1$s\n \n မှစီမံခန့်ခွဲထားပါသည်။သင့်စီမံခန့်ခွဲသူသည် ကြိုတင်ပြင်ဆင်မှုများ၊စုပေါင်းဝင်ရောက်ခွင့်၊အက်ပလီကေးရှင်းများ၊သင့်စက်ကိရိယာနှင့်ဆက်နွယ်နေသောအချက်အလက်နှင့်သင့်စက်ကိရိယာ ရဲ့နေရာအချက်အလက်များကိုကြီးကြပ်စောင့်ကြည့်နိုင်ပါသည်။ \n\n အီးမေးလ်များ၊အက်ပလီကေးရှင်းများနှင့် ဝက်ဘ်ဆိုက်များအပါအဝင်သင့်ကွန်ယက်လုပ်ဆောင်ချက်ကိုစောင့်ကြည့်နိုင်သည့် VPN ကိုချိတ်ဆက်ထားပြီဖြစ် သည်။\n\n အသေးစိတ်သိရှိလိုပါကသင်၏စီမံခန့်ခွဲသူကိုဆက်သွယ်ပါ။" - "သင့်အလုပ်ပရိုဖိုင်ကို %1$sမှ စီမံခန့်ခွဲပါသည်။ \n\nသင့်စီမံခန့်ခွဲသူသည် အီးမေးလ်များ၊ အက်ပ်များ၊ နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောက်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\nအချက်အလက်များ ပိုမိုရယူရန် သင်၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။ \n\nသင်သည် VPN တစ်ခုသို့ပါ ချိတ်ဆက်ထားပြီး ၎င်းကပါ သင်၏ ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်ပါသည်။" + "သင်၏စက်ပစ္စည်းကို %1$s က စီမံခန့်ခွဲထားပါသည်။\n\nစီမံခန့်ခွဲသူသည် ဆက်တင်များ၊ အဖွဲ့အစည်း အသုံးပြုခွင့်များ၊ အက်ပ်များ၊ စက်ပစ္စည်းနှင့် ဆက်စပ်နေသည့် ဒေတာများနှင့် စက်ပစ္စည်း၏ တည်နေရာ အချက်အလက်များကို စောင့်ကြည့် စီမံနိုင်ပါသည်။\n\nအီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်တို့အပါအဝင် ကွန်ရက်အသုံးပြုမှုတို့ကို စောင့်ကြည့်နိုင်သည့် VPN သို့ သင်က ချိတ်ဆက်ထားပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" + "သင့်အလုပ်ပရိုဖိုင်ကို %1$s က စီမံခန့်ခွဲထားပါသည်။\n\nသင့်စီမံခန့်ခွဲသူသည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်ပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။\n\nသင်သည် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည့် VPN သို့လည်း ချိတ်ဆက်ထားပါသေးသည်။" "VPN" "သင်သည် %1$s သို့ ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးများ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည်။" "သင်သည် %1$s သို့ ချိတ်ဆက်ထားသည်။ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။" "သင်သည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကိုယ်ရေးကိုယ်တာ ကွန်ရက်အသုံးပြုမှုကို စောင့်ကြည့်နိုင်သည့် %1$s သို့ ချိတ်ဆက်ထားပါသည်။" - "သင့်အလုပ်ပရိုဖိုင်ကို %1$s မှစီမံခန့်ခွဲသည်။ ၎င်းကို %2$s သို့ ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်အလုပ်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\nအချက်အလက်များ ပိုမိုရယူရန် သင်၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" + "သင့်အလုပ်ပရိုဖိုင်ကို %1$s က စီမံခန့်ခွဲထားပါသည်။ ၎င်းသည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည့် %2$s သို့ ချိတ်ဆက်ထားပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" "သင့်အလုပ် ပရိုဖိုင်ကို %1$s မှစီမံခန့်ခွဲသည်။ ၎င်းကို %2$s သို့ ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်အလုပ်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\n သင်သည်%3$s ကိုလည်း ချိတ်ဆက်ထားသည်၊ ၎င်းသည် သင့်ကိုယ်ပိုင်ကွန်ရက်လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည်။" - "သင့်စက်ကိရိယာကို %1$s မှစီမံခန့်ခွဲပါသည်။ \n\n စီမံခန့်ခွဲသူသည် ကြိုတင်ပြင်ဆင်မှုများ၊ စုပေါင်းဝင်ရောက်ခွင့်၊ အက်ပ်များ၊ သင့်ကိရိယာနှင့်သက်ဆိုင်သော ဒေတာနှင့် သင့်ကိရိယာ၏ တည်နေရာအချက်အလက်များကို စောင့်ကြည့်ပြီး စီမံခန့်ခွဲနိုင်သည်။ \n\nသင်သည် %2$s သို့ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များ၊ နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\nအချက်အလက်များ ပိုမိုရယူရန် သင်၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" + "သင်၏စက်ပစ္စည်းကို %1$s က စီမံခန့်ခွဲထားပါသည်။\n\nစီမံခန့်ခွဲသူသည် ဆက်တင်များ၊ အဖွဲ့အစည်း အသုံးပြုခွင့်များ၊ အက်ပ်များ၊ စက်ပစ္စည်းနှင့် ဆက်စပ်နေသည့် ဒေတာများနှင့် စက်ပစ္စည်း၏ တည်နေရာ အချက်အလက်များကို စောင့်ကြည့် စီမံနိုင်ပါသည်။\n\nအီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်တို့အပါအဝင် ကွန်ရက်အသုံးပြုမှုတို့ကို စောင့်ကြည့်နိုင်သည့် %2$s သို့ သင်ကချိတ်ဆက်ထားပါသည်။\n\nနောက်ထပ် အချက်အလက်များအတွက် စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။" "သင်က လက်ဖြင့် သော့မဖွင့်မချင်း ကိရိယာမှာ သော့ပိတ်လျက် ရှိနေမည်" "အကြောင်းကြားချက်များ မြန်မြန်ရရန်" "မဖွင့်ခင် ၎င်းတို့ကို ကြည့်ပါ" @@ -431,7 +437,8 @@ "တိုးချဲ့ရန်" "ခေါက်သိမ်းရန်..." "မျက်နှာပြင် ပင်ထိုးပြီးပါပြီ" - "သင်က ပင်မဖြုတ်မချင်း ၎င်းကိုပြသထားပါမည်။ ပင်ဖြုတ်ရန် \'နောက်သို့\' ကိုထိပြီး ဖိထားပါ။" + "သင်ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် Back နှင့် Overview ကို ထိ၍ဖိထားပါ။" + "သင်ပင်မဖြုတ်မချင်း ၎င်းကိုပြသထားပါမည်။ ပင်ဖြုတ်ရန် Overview ကိုထိပြီး ဖိထားပါ။" "အဲဒါ ရပါပြီ" "မလိုတော့ပါ" "%1$s ဝှက်မည်လား?" @@ -652,4 +659,7 @@ "ဆက်တင်များ၏ အစီအစဉ်ကို တည်းဖြတ်ပါ။" "စာမျက်နှာ %2$d အနက်မှ စာမျက်နှာ %1$d" "အကြောင်းကြားချက်များကို အသံတိတ်ခြင်း သို့မဟုတ် ပိတ်ဆို့ခြင်းများ ပြုလုပ်၍ မရပါ" + "ဖုန်း ပူနွေးလာပါပြီ" + "ဖုန်းကို အေးအောင်ပြုလုပ်နေစဉ်တွင် အချို့ဝန်ဆောင်မှုများကို ကန့်သတ်ထားပါသည်" + "သင့်ဖုန်းသည် အလိုအလျောက် ပြန်အေးသွားပါလိမ့်မည်။ ဖုန်းကို အသုံးပြုနိုင်ပါသေးသည် သို့သော် ပိုနှေးနိုင်ပါသည်။\n\nသင့်ဖုန်း အေးသွားသည်နှင့် ပုံမှန်အတိုင်း ပြန်အလုပ်လုပ်ပါလိမ့်မည်။" diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 02cb082305a9..6cf88b0cdf6b 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -408,19 +408,25 @@ "Enhetsovervåking" "Profilovervåking" "Nettverksovervåking" + "VPN" + "Loggføring av nettverk" "Deaktiver VPN" "Koble fra VPN" - "Enheten din administreres av %1$s.\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data tilknyttet enheten din og enhetens posisjonsinformasjon. Hvis du vil har mer informasjon, kan du ta kontakt med administratoren." + "Enheten din administreres av %1$s.\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data som er tilknyttet denne enheten, og enhetens posisjonsinformasjon. Kontakt administratoren for mer informasjon." + "Enheten er koblet til %1$s, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder." + " " + "Åpne VPN-innstillingene" + "Administratoren din har slått på loggføring av nettverk, som overvåker trafikken på enheten din.\n\nKontakt administratoren for mer informasjon." "Du ga en app tillatelse til å konfigurere en VPN-tilkobling.\n\nDenne appen kan overvåke enheten og nettverksaktiviteten din, inkludert e-post, apper og nettsteder." - "Enheten din administreres av %1$s\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data tilknyttet enheten din og enhetens posisjonsinformasjon.\n\nDu er koblet til et VPN, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nHvis du vil ha mer informasjon, kan du ta kontakt med administratoren." - "Work-profilen din administreres av %1$s.\n\nAdministratoren din kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nFor mer informasjon, ta kontakt med administratoren.\n\nDu er også koblet til et VPN, som kan overvåke nettverksaktiviteten din." + "Enheten din administreres av %1$s.\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data som er tilknyttet denne enheten, og enhetens posisjonsinformasjon.\n\nDu er koblet til et VPN, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nKontakt administratoren for mer informasjon." + "Jobbprofilen din administreres av %1$s.\n\nAdministratoren din kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nKontakt administratoren for mer informasjon.\n\nDu er også tilkoblet en VPN som kan overvåke nettverksaktiviteten din." "VPN" "Enheten er koblet til %1$s, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder." "Enheten er koblet til %1$s, som kan overvåke den personlige nettverksaktiviteten din, inkludert e-post, apper og nettsteder." "Enheten er koblet til %1$s, som kan overvåke den personlige nettverksaktiviteten din, inkludert e-post, apper og nettsteder." - "Work-profilen din administreres av %1$s. Den er koblet til %2$s, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-post, apper og nettsteder.\n\nFor å få mer informasjon, ta kontakt med administratoren." + "Jobbprofilen din administreres av %1$s. Den er koblet til %2$s, som kan overvåke nettverksaktiviteten din, inkludert e-poster, apper og nettsteder.\n\nKontakt administratoren din for mer informasjon." "Work-profilen din administreres av %1$s. Den er koblet til %2$s, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-post, apper og nettsteder.\n\nDu er også koblet til %3$s, som kan overvåke den personlige nettverksaktiviteten din." - "Enheten din administreres av %1$s.\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data tilknyttet enheten din og enhetens posisjonsinformasjon.\n\nDu er koblet til %2$s, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nFor mer informasjon, ta kontakt med administratoren." + "Enheten din administreres av %1$s.\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data som er tilknyttet denne enheten, og enhetens posisjonsinformasjon.\n\nDu er koblet til %2$s, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nKontakt administratoren for mer informasjon." "Enheten forblir låst til du låser den opp manuelt" "Motta varsler raskere" "Se dem før du låser opp" @@ -431,7 +437,8 @@ "Utvid" "Skjul" "Skjermen er låst" - "På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Tilbake for å løsne den." + "På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Tilbake og Oversikt for å løsne den." + "På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Oversikt for å løsne den." "Skjønner" "Nei takk" "Vil du skjule %1$s?" @@ -652,4 +659,7 @@ "Endre rekkefølgen på innstillingene." "Side %1$d av %2$d" "Varslinger kan ikke ignoreres eller blokkeres" + "Telefonen begynner å bli varm" + "Enkelte funksjoner er begrenset mens telefonen kjøles ned" + "Telefonen din kommer til å prøve å kjøle seg ned automatisk. Du kan fremdeles bruke telefonen, men den kjører muligens saktere.\n\nTelefonen kommer til å kjøre som normalt, når den har kjølt seg ned." diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 79d4b846464b..9298cdc73e5b 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -334,7 +334,7 @@ "विभाजित स्क्रिनको प्रयोग गर्नका लागि यहाँ तान्नुहोस्" "तेर्सो रूपमा विभाजन गर्नुहोस्" "ठाडो रूपमा विभाजन गर्नुहोस्" - "अनुकूलन विभाजन गर्नुहोस्" + "आफू अनुकूल विभाजन गर्नुहोस्" "चार्ज भयो" @@ -346,7 +346,7 @@ "%sको लागि माथि धिसार्नुहोस्" "स्लाइड %sको लागि बायाँ।" "अलार्म, रिमाइन्डर, घटना, र तपाईँले निर्दिष्ट गर्नुहुने कलरहरू देखि बाहेक, आवाज र कम्पनले तपाईँ लाई वाधा गर्ने छैन।" - "अनुकूलन गर्नुहोस्" + "आफू अनुकूल बनाउनुहोस्" "यसले अलार्म, संगीत, भिडियो, र खेलहरू लगायतका सबै ध्वनि र कम्पन रोक्छ। तपाईँ अझै पनि फोन कल गर्न सक्षम हुनुहुन्छ।" "यसले अलार्म, संगीत, भिडियोहरू र खेलहरूसहित सबै ध्वनिहरू र कम्पनहरूलाई रोक्छ।" "+%d" @@ -408,19 +408,25 @@ "उपकरण अनुगमन" "प्रोफाइल अनुगमन गर्दै" "सञ्जाल अनुगमन" + "VPN" + "नेटवर्कको लगिङ" "VPN असक्षम गर्नुहोस्" "विच्छेद VPN" - "तपाईँको यन्त्र %1$s द्वारा व्यवस्थापन गरिन्छ।\n\n तपाईँको प्रशासकले सेटिङहरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, आफ्नो उपकरण सम्बन्धित डेटा, र उपकरणको स्थानीय जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्छ। थप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।" + "तपाईँको यन्त्रलाई %1$s ले व्यवस्थापन गर्दछ।\n\nतपाईँको प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोग, तपाईँको यन्त्रसँग सम्बन्धित डेटा र तपाईँको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ। थप जानकारीका लागि, आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।" + "तपाईं %1$s मा जोडिनुभएको छ जसले इमेल, अनुप्रयोग र वेबसाइटहरू लगायत तपाईंको नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।" + " " + "VPN सम्बन्धी सेटिङहरू खोल्नुहोस्" + "तपाईँको प्रशासकले तपाईँको यन्त्रमा ट्राफिकको अनुगमन गर्ने नेटवर्कको लगिङलाई सक्रिय पार्नुभएको छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।" "तपाईँले VPN जडान गर्न अनुप्रयोगलाई अनुमति दिनुभयो।\n\nयो अनुप्रयोगले तपाईँका यन्त्र र नेटवर्क गतिविधि लगायत इमेल, अनुप्रयोग र वेबसाइटहरू अनुगमन गर्न सक्छ।" - "तपाईँको यन्त्र %1$s द्वारा व्यवस्थापन गरिन्छ।\n\n तपाईँको प्रशासकले सेटिङ्हरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, आफ्नो उपकरण सम्बन्धित डेटा, र उपकरणको स्थानीय जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्छ।\n\nतपाईँ VPN सँग जडित हुनुहुन्छ, जसले तपाईँको इमेल, अनुप्रयोगहरू, र वेबसाइटहरू सहित आफ्नो सञ्जाल गतिविधि अनुगमन गर्न सक्छ। \n\nथप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।" - "तपाईँको कार्य प्रोफाइल %1$sद्वारा व्यवस्थापन गरिन्छ।.\n\nतपाईँको प्रशासक इमेल, अनुप्रयोगहरू, र सुरक्षित वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्षम छ।\n\nथप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।\n\nतपाईँ VPN सँग पनि जडित हुनुहुन्छ, जसले तपाईँको नेटवर्क गतिविधि अनुगमन गर्न सक्छ।" + "तपाईँको यन्त्रलाई %1$s ले व्यवस्थापन गर्दछ।\n\nतपाईँको प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोग, तपाईँको यन्त्रसँग सम्बन्धित डेटा र तपाईँको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\nतपाईँ एउटा VPN मा जडित हुनुहुन्छ। यस VPN ले तपाईँको इमेल, अनुप्रयोग र वेबसाइटहरू सहित नेटवर्कमा तपाईँको गतिविधिको अनुगमन गर्न सक्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।" + "तपाईँको कार्य प्रोफाइल %1$s ले व्यवस्थापन गर्दछ।\n\nतपाईँको प्रशासकले तपाईँको इमेल, अनुप्रयोग र वेबसाइट सहित नेटवर्कमा तपाईँको गतिविधिको अनुगमन गर्न सक्नुहुन्छ। \n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।\n\n तपाईँ एउटा VPN मा जडित हुनुहुन्छ। यस VPN ले नेटवर्कमा तपाईँको गतिविधिको अनुगमन गर्न सक्छ।" "VPN" "तपाईँ %1$s सँग जडित हुनुहुन्छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईँका नेटवर्क गतिविधिको अनुगमन गर्न सक्छ।" "तपाईँ %1$s सँग जडित हुनुहुन्छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईँको निजी नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।" "तपाईं %1$s मा जोडिनुभएको छ जसले इमेल, अनुप्रयोग र वेबसाइटहरू लगायतको तपाईंको व्यक्तिगत नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।" - "तपाईँको कार्य प्रोफाइल %1$s द्वारा व्यवस्थापन गरिन्छ। यो %2$s सँग जोडिएको छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्छ।\n\nथप जानकारीको लागि, आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।" + "तपाईँको कार्य प्रोफाइल %1$s ले व्यवस्थापन गर्दछ। तपाईँको कार्य प्रोफाइल %2$s मा जोडिएको छ। यो अनुप्रयोगले तपाईँको इमेल, अन्य अनुप्रयोग र वेबसाइटहरू सहित नेटवर्कमा तपाईँको गतिविधिको अनुगमन गर्न सक्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।" "तपाईँको कार्य प्रोफाइल %1$s द्वारा व्यवस्थापन गरिन्छ। यो %2$s सँग जोडिएको छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्छ।\n\nतपाईँ %3$s सँग पनि जडित हुनुहुन्छ, जसले तपाईँको व्यक्तिगत नेटवर्क गतिविधि अनुगमन गर्न सक्छ।" - "तपाईँको उपकरण %1$s द्वारा व्यवस्थित गरिन्छ।\n\nतपाईँको प्रशासकले तपाईँको यन्त्र र त्यसको स्थान जानकारीमार्फत सेटिङहरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, तपाईँको यन्त्रसँग सम्बद्ध डेटा र तपाईँको यन्त्रको स्थान जानकारीको अनुगमन र व्यवस्थापन गर्न सक्छ।\n\nतपाईँ %2$s सँग जडित हुनुहुन्छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।\n\nथप जानकारीको लागि तपाईको प्रशासकलाई सम्पर्क गर्नुहोस्।" + "तपाईँको यन्त्रलाई %1$s ले व्यवस्थापन गर्दछ।\n\nतपाईँको प्रशासकले सेटिङहरू, संस्थागत पहुँच, अनुप्रयोग, तपाईँको यन्त्रसँग सम्बन्धित डेटा र तपाईँको यन्त्रको स्थान सम्बन्धी जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्नुहुन्छ।\n\n तपाईँ %2$s मा जडित हुनुहुन्छ। यस अनुप्रयोगले तपाईँको इमेल, अनुप्रयोग र वेबसाइटहरू सहित नेटवर्कमा तपाईँको गतिविधिको अनुगमन गर्न सक्छ।\n\nथप जानकारीका लागि आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।" "तपाईँले नखोले सम्म उपकरण बन्द रहनेछ" "छिटो सूचनाहरू प्राप्त गर्नुहोस्" "तपाईँले अनलक गर्नअघि तिनीहरूलाई हेर्नुहोस्" @@ -431,7 +437,8 @@ "विस्तार गर्नुहोस्" "संक्षिप्त पार्नुहोस्" "पर्दा राखेका छ" - "तपाईँले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि बटनलाई छोइराख्नुहोस्।" + "तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई छोइराख्नुहोस्।" + "तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न परिदृश्य बटनलाई छोइराख्नुहोस्।" "बुझेँ" "धन्यवाद पर्दैन" "लुकाउनुहुन्छ %1$s?" @@ -483,7 +490,7 @@ "Hotspot" "कार्य प्रोफाइल" "केहीका लागि रमाइलो हुन्छ तर सबैका लागि होइन" - "प्रणाली UI ट्युनरले तपाईँलाई Android प्रयोगकर्ता इन्टरफेस अनुकूलन गर्न र ट्विक गर्न थप तरिकाहरू प्रदान गर्छ। यी प्रयोगात्मक सुविधाहरू भावी विमोचनमा परिवर्तन हुन, बिग्रिन वा हराउन सक्ने छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।" + "प्रणाली UI ट्युनरले तपाईँलाई Android प्रयोगकर्ता इन्टरफेस आफू अनुकूल गर्न र ट्विक गर्न थप तरिकाहरू प्रदान गर्छ। यी प्रयोगात्मक सुविधाहरू भावी विमोचनमा परिवर्तन हुन, बिग्रिन वा हराउन सक्ने छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।" "यी प्रयोगात्मक सुविधाहरू भावी विमोचनहरूमा परिवर्तन हुन, बिग्रन वा हराउन सक्छन्। सावधानीपूर्वक अगाडि बढ्नुहोस्।" "बुझेँ" "बधाईँ छ! सेटिङहरूमा प्रणाली UI ट्युनर थप गरिएको छ" @@ -652,4 +659,7 @@ "सेटिङहरूको क्रमलाई सम्पादन गर्नुहोस्।" "%2$d मध्ये पृष्ठ %1$d" "सूचनाहरूलाई मौन गर्न वा यसमाथि रोक लगाउन मिल्दैन" + "फोन तातो भइरहेको छ" + "फोन चिसो हुँदै गर्दा केही विशेषताहरूलाई सीमित गरिन्छ" + "तपाईंको फोन स्वतः चिसो हुने प्रयास गर्नेछ। तपाईं अझै पनि आफ्नो फोनको प्रयोग गर्न सक्नुहुन्छ तर त्यो अझ ढिलो चल्न सक्छ।\n\nचिसो भएपछि तपाईंको फोन सामान्य गतिमा चल्नेछ।" diff --git a/packages/SystemUI/res/values-nl-land/strings.xml b/packages/SystemUI/res/values-nl-land/strings.xml index d762d07736d5..48624ebaa676 100644 --- a/packages/SystemUI/res/values-nl-land/strings.xml +++ b/packages/SystemUI/res/values-nl-land/strings.xml @@ -19,5 +19,5 @@ - "Het scherm is nu vergrendeld in liggende (landschap) stand." + "Het scherm is nu vergrendeld in liggende stand." diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index a2a43650dcdf..d858accdbc03 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -81,7 +81,7 @@ "Koppelen als camera (PTP)" "AFT-app voor Mac installeren" "Terug" - "Startpagina" + "Homepage" "Menu" "Overzicht" "Zoeken" @@ -164,8 +164,8 @@ "Systeeminstellingen." "Meldingen." "Melding wissen" - "GPS ingeschakeld." - "Verbinding maken met GPS." + "gps ingeschakeld." + "Verbinding maken met gps." "TeleTypewriter ingeschakeld." "Belsoftware trilt." "Belsoftware stil." @@ -236,14 +236,14 @@ "Helderheid van het scherm" "2G/3G-data zijn onderbroken" "4G-data zijn onderbroken" - "Mobiele gegevens zijn onderbroken" + "Mobiele data zijn onderbroken" "Gegevens zijn onderbroken" "De ingestelde datalimiet is bereikt. Je gebruikt geen mobiele data meer.\n\nAls je hervat, kunnen er kosten voor datagebruik in rekening worden gebracht." "Hervatten" "Geen internetverbinding" "Verbonden via wifi" - "Zoeken naar GPS" - "Locatie bepaald met GPS" + "Zoeken naar gps" + "Locatie bepaald met gps" "Locatieverzoeken actief" "Alle meldingen wissen." "+ %s" @@ -275,8 +275,8 @@ "Scherm automatisch draaien" "Instellen op %s" "Rotatie vergrendeld" - "Portret" - "Landschap" + "Staand" + "Liggend" "Invoermethode" "Locatie" "Locatie uit" @@ -311,7 +311,7 @@ "Hotspot" "Meldingen" "Zaklamp" - "Mobiele gegevens" + "Mobiele data" "Datagebruik" "Resterende gegevens" "Limiet overschreden" @@ -379,7 +379,7 @@ "Alle apps en gegevens in deze sessie worden verwijderd." "Verwijderen" "Welkom terug, gast!" - "Wilt u doorgaan met je sessie?" + "Wil je doorgaan met je sessie?" "Opnieuw starten" "Ja, doorgaan" "Gastgebruiker" @@ -408,19 +408,25 @@ "Apparaatcontrole" "Profielcontrole" "Netwerkcontrole" + "VPN" + "Netwerkregistratie" "VPN uitschakelen" "Verbinding met VPN verbreken" - "Je apparaat wordt beheerd door %1$s.\n\nJe beheerder kan instellingen, bedrijfstoegang, apps, gegevens voor je apparaat en locatiegegevens voor je apparaat controleren en beheren. Neem voor meer informatie contact op met je beheerder." + "Je apparaat wordt beheerd door %1$s.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, gegevens voor je apparaat en de locatiegegevens voor je apparaat controleren en beheren. Neem voor meer informatie contact op met je beheerder." + "Je bent verbonden met %1$s, waarmee je netwerkactiviteit (waaronder e-mails, apps en websites) kan worden gecontroleerd." + " " + "VPN-instellingen openen" + "Je beheerder heeft netwerkregistratie ingeschakeld, waarmee verkeer op je apparaat wordt bijgehouden.\n\nNeem contact op met je beheerder voor meer informatie." "Je hebt een app toestemming gegeven voor het instellen van een VPN-verbinding.\n\nMet deze app kan je apparaat- en netwerkactiviteit worden gecontroleerd, inclusief e-mails, apps en websites." - "Je apparaat wordt beheerd door %1$s.\n\nJe beheerder kan instellingen, bedrijfstoegang, apps, gegevens voor je apparaat en locatiegegevens voor je apparaat controleren en beheren.\n\nU bent verbonden met een VPN, die je netwerkactiviteit kan controleren, waaronder e-mails, apps en websites.\n\nNeem voor meer informatie contact op met je beheerder." - "Je werkprofiel wordt beheerd door %1$s.\n\nJe beheerder kan je netwerkactiviteit controleren, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie.\n\nU bent ook verbonden met een VPN waarmee je netwerkactiviteit kan worden gecontroleerd." + "Je apparaat wordt beheerd door %1$s.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, gegevens voor je apparaat en de locatiegegevens voor je apparaat controleren en beheren.\n\nJe hebt verbinding met een VPN, dat je netwerkactiviteit kan bijhouden (waaronder e-mails, apps en websites).\n\nNeem voor meer informatie contact op met je beheerder." + "Je werkprofiel wordt beheerd door %1$s.\n\nJe beheerder kan je netwerkactiviteit controleren, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie.\n\nJe bent ook verbonden met een VPN, waarmee je netwerkactiviteit kan worden gecontroleerd." "VPN" "U bent verbonden met %1$s, waarmee je netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites." "U bent verbonden met %1$s, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites." "Je bent verbonden met %1$s, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites." - "Je werkprofiel wordt beheerd door %1$s. Deze is verbonden met %2$s, waarmee je werkgerelateerde netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie." + "Je werkprofiel wordt beheerd door %1$s. Het is gekoppeld aan %2$s, waarmee je werkgerelateerde netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie." "Je werkprofiel wordt beheerd door %1$s. Deze is verbonden met %2$s, waarmee je werkgerelateerde netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nU bent ook verbonden met %3$s, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd." - "Je apparaat wordt beheerd door %1$s.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, gekoppelde apparaatgegevens en locatiegegevens voor je apparaat controleren en beheren.\n\nU bent verbonden met %2$s waarmee je netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie." + "Je apparaat wordt beheerd door %1$s.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, gegevens voor je apparaat en de locatiegegevens voor je apparaat controleren en beheren.\n\nJe bent gekoppeld aan %2$s. Deze app kan je netwerkactiviteit bijhouden (waaronder e-mails, apps en websites).\n\nNeem voor meer informatie contact op met je beheerder." "Het apparaat blijft vergrendeld totdat u het handmatig ontgrendelt" "Sneller meldingen ontvangen" "Weergeven voordat u ontgrendelt" @@ -431,7 +437,8 @@ "Uitvouwen" "Samenvouwen" "Scherm is vastgezet" - "Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en houd vast om het scherm los te maken." + "Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Overzicht en houd deze vast om het scherm los te maken." + "Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Overzicht en houd dit vast om het scherm los te maken." "Ik snap het" "Nee, bedankt" "%1$s verbergen?" @@ -554,7 +561,7 @@ "Num Lock" "%1$s op numeriek toetsenblok" "Systeem" - "Startpagina" + "Homepage" "Recent" "Terug" "Meldingen" @@ -652,4 +659,7 @@ "Volgorde van instellingen bewerken." "Pagina %1$d van %2$d" "Meldingen kunnen niet op stil worden gezet of worden geblokkeerd" + "De telefoon wordt warm" + "Bepaalde functies zijn beperkt terwijl de telefoon afkoelt" + "Je telefoon probeert automatisch af te koelen. Je kunt je telefoon nog steeds gebruiken, maar deze kan langzamer werken.\n\nZodra de telefoon is afgekoeld, werkt deze weer normaal." diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index e000541ed10e..2a9b3c7d8dea 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -70,7 +70,7 @@ "ਸਕ੍ਰੀਨਸ਼ੌਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…" "ਸਕ੍ਰੀਨਸ਼ੌਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…" "ਸਕ੍ਰੀਨਸ਼ੌਟ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।" - "ਸਕ੍ਰੀਨਸ਼ੌਟ ਕੈਪਚਰ ਕੀਤਾ।" + "ਸਕ੍ਰੀਨਸ਼ਾਟ ਕੈਪਚਰ ਕੀਤਾ।" "ਆਪਣਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਵੇਖਣ ਲਈ ਟੈਪ ਕਰੋ।" "ਸਕ੍ਰੀਨਸ਼ੌਟ ਕੈਪਚਰ ਨਹੀਂ ਕਰ ਸਕਿਆ।" "ਸਕ੍ਰੀਨਸ਼ਾਟ ਰੱਖਿਅਤ ਕਰਨ ਦੌਰਾਨ ਸਮੱਸਿਆ ਆਈ।" @@ -398,7 +398,7 @@ "ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਕਰੋ" "%s ਉਹ ਸਭ ਕੁਝ ਕੈਪਚਰ ਕਰਨਾ ਸ਼ੁਰੂ ਕਰ ਦੇਵੇਗਾ, ਜੋ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਤੇ ਡਿਸਪਲੇ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।" "ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ" - "ਸਾਰੇ ਹਟਾਓ" + "ਸਭ ਸਾਫ਼ ਕਰੋ" "ਹੁਣ ਚਾਲੂ ਕਰੋ" "ਕੋਈ ਸੂਚਨਾਵਾਂ ਨਹੀਂ" "ਡੀਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ" @@ -408,19 +408,25 @@ "ਡੀਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ" "ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ" "ਨੈੱਟਵਰਕ ਨਿਰੀਖਣ ਕਰ ਰਿਹਾ ਹੈ" + "VPN" + "ਨੈੱਟਵਰਕ ਲੌਗਿੰਗ" "VPN ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ" "VPN ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰੋ" - "ਤੁਹਾਡੀ ਡੀਵਾਈਸ %1$s ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡੈਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।" + "ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ %1$s ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਡੈਟੇ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" + "ਤੁਸੀਂ %1$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।" + " " + "VPN ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ" + "ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਨੈੱਟਵਰਕ ਲੌਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਹੋਇਆ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਡੀਵਾਈਸ \'ਤੇ ਟ੍ਰੈਫਿਕ ਦੀ ਨਿਗਰਾਨੀ ਕਰਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" "ਤੁਸੀਂ ਇੱਕ ਐਪ ਨੂੰ ਇੱਕ VPN ਕਨੈਕਸ਼ਨ ਸੈਟ ਅਪ ਕਰਨ ਦੀ ਅਨੁਮਤੀ ਦਿੱਤੀ ਹੈ।\n\nਇਹ ਐਪ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਅਤੇ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।" - "ਤੁਹਾਡੀ ਡੀਵਾਈਸ %1$sਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡੈਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਕੀਤਾ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।" - "ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ %1$s ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਈਮੇਲ, ਐਪਸ, ਅਤੇ ਵੈੱਬਪੰਨੇ ਸੰਤੇ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੇ ਸਮਰੱਥ ਹੈ।\n\nਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।\n\nਤੁਸੀਂ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋ, ਜੋ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।" + "ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ %1$s ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਜੁੜੇ ਡੈਟੇ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" + "ਤੁਹਾਡੇ ਕਾਰਜ-ਸਥਾਨ ਪ੍ਰੋਫ਼ਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ %1$s ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਈਮੇਲ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੇ ਸਮਰੱਥ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋਂ, ਜੋ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।" "VPN" "ਤੁਸੀਂ %1$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।" "ਤੁਸੀਂ %1$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।" "ਤੁਸੀਂ %1$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।" - "ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ %1$s ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ %2$s ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।" + "ਤੁਹਾਡੇ ਕਾਰਜ-ਸਥਾਨ ਪ੍ਰੋਫ਼ਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ %1$s ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਹ %2$s ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੇ ਕਾਰਜ-ਸਥਾਨ ਨੈੱਟਵਰਕ ਦੀ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" "ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ %1$s ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ %2$s ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਤੁਸੀਂ %3$s ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ।" - "ਤੁਹਾਡੀ ਡੀਵਾਈਸ %1$s ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡੈਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ %2$s ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।" + "ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ %1$s ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਡੀ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਾਂ, ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨਾਲ ਸਬੰਧਿਤ ਡੈਟੇ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਦੀ ਨਿਗਰਾਨੀ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ %2$s ਐਪ ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।" "ਡੀਵਾਈਸ ਲੌਕ ਰਹੇਗੀ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਮੈਨੂਅਲੀ ਅਨਲੌਕ ਨਹੀਂ ਕਰਦੇ" "ਤੇਜ਼ੀ ਨਾਲ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ" "ਅਨਲੌਕ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਉਹਨਾਂ ਨੂੰ ਦੇਖੋ" @@ -431,7 +437,8 @@ "ਵਿਸਤਾਰ ਕਰੋ" "ਨਸ਼ਟ ਕਰੋ" "ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ" - "ਇਹ ਇਸ ਨੂੰ ਤੁਹਾਡੇ ਵੱਲੋਂ ਅਨਪਿੰਨ ਨਾ ਕੀਤੇ ਜਾਣ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ ਵਾਪਸ ਜਾਓ ਨੂੰ ਸਪਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।" + "ਇਹ ਇਸ ਨੂੰ ਤਦ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿੰਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਪਿੱਛੇ\' ਅਤੇ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।" + "ਇਹ ਇਸ ਨੂੰ ਤਦ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿੰਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।" "ਸਮਝ ਲਿਆ" "ਨਹੀਂ ਧੰਨਵਾਦ" "ਕੀ %1$s ਨੂੰ ਲੁਕਾਉਣਾ ਹੈ?" @@ -652,4 +659,7 @@ "ਸੈਟਿੰਗਾਂ ਦੇ ਕ੍ਰਮ ਦਾ ਸੰਪਾਦਨ ਕਰੋ।" "%2$d ਦਾ %1$d ਪੰਨਾ" "ਸੂਚਨਾਵਾਂ ਨੂੰ ਖਾਮੋਸ਼ ਜਾਂ ਬਲੌਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" + "ਫ਼ੋਨ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ" + "ਫ਼ੋਨ ਦੇ ਠੰਡਾ ਹੋਣ ਦੇ ਦੌਰਾਨ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸੀਮਿਤ ਹੁੰਦੀਆਂ ਹਨ" + "ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਵੈਚਲਿਤ ਰੂਪ ਵਿੱਚ ਠੰਡਾ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ, ਪਰੰਤੂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ ਵਧੇਰੇ ਹੌਲੀ ਚੱਲੇ।\n\nਇੱਕ ਵਾਰ ਠੰਡਾ ਹੋਣ ਤੋਂ ਬਾਅਦ ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਧਾਰਨ ਤੌਰ \'ਤੇ ਚੱਲੇਗਾ।" diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 46ab85badcab..ea281c1a846d 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -402,7 +402,7 @@ "Wyłącz oszczędzanie baterii" "%s będzie zapisywać wszystko, co wyświetli się na ekranie." "Nie pokazuj ponownie" - "Usuń wszystkie" + "Ukryj wszystkie" "Rozpocznij teraz" "Brak powiadomień" "Urządzenie może być monitorowane" @@ -412,19 +412,25 @@ "Monitorowanie urządzeń" "Monitorowanie profilu" "Monitorowanie sieci" + "VPN" + "Rejestrowanie sieciowe" "Wyłącz VPN" "Rozłącz z VPN" - "Urządzeniem zarządza %1$s.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane powiązane z tym urządzeniem i informacje o lokalizacji urządzenia oraz nimi zarządzać. Skontaktuj się z nim, by dowiedzieć się więcej." + "Twoim urządzeniem zarządza %1$s.\n\nAdministrator może monitorować ustawienia, dostęp do zasobów firmowych, aplikacje, dane powiązane z tym urządzeniem i informacje o lokalizacji urządzenia oraz nimi zarządzać. Aby dowiedzieć się więcej, skontaktuj się z administratorem." + "Łączysz się z aplikacją %1$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." + "  " + "Otwórz ustawienia VPN" + "Administrator włączył rejestrowanie sieciowe, które pozwala monitorować ruch na Twoim urządzeniu.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." "Aplikacja otrzymała od Ciebie uprawnienia do konfigurowania połączenia VPN.\n\nMoże ona monitorować Twoją aktywność na urządzeniu i w sieci, w tym e-maile, aplikacje i strony internetowe." - "Urządzeniem zarządza %1$s.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane powiązane z tym urządzeniem i informacje o lokalizacji urządzenia oraz nimi zarządzać.\n\nMasz połączenie z siecią VPN, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nAby uzyskać więcej informacji, skontaktuj się z administratorem." - "Twoim profilem do pracy zarządza %1$s.\n\nAdministrator może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nSkontaktuj się z nim, by dowiedzieć się więcej.\n\nMasz też połączenie z siecią VPN, która może monitorować Twoją aktywność w sieci." + "Twoim urządzeniem zarządza %1$s.\n\nAdministrator może monitorować ustawienia, dostęp do zasobów firmowych, aplikacje, dane powiązane z tym urządzeniem i informacje o lokalizacji urządzenia oraz nimi zarządzać.\n\nŁączysz się z siecią VPN, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." + "Twoim profilem do pracy zarządza %1$s.\n\nAdministrator może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem.\n\nŁączysz się też z siecią VPN, która może monitorować Twoją aktywność w sieci." "VPN" "Masz połączenie z aplikacją %1$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." "Masz połączenie z aplikacją %1$s, która może monitorować Twoją prywatną aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." "Masz połączenie z aplikacją %1$s, która może monitorować Twoją prywatną aktywność w sieci, w tym e-maile, aplikacje i strony internetowe." - "Twoim profilem do pracy zarządza %1$s. Profil jest połączony z aplikacją %2$s, która może monitorować Twoją aktywność w sieci związaną z pracą, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." + "Twoim profilem do pracy zarządza %1$s. Profil jest połączony z aplikacją %2$s, która może monitorować Twoją aktywność w sieci związaną z pracą, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." "Twoim profilem do pracy zarządza %1$s. Profil jest połączony z aplikacją %2$s, która może monitorować Twoją aktywność w sieci związaną z pracą, w tym e-maile, aplikacje i strony internetowe.\n\nMasz też połączenie z aplikacją %3$s, która może monitorować Twoją prywatną aktywność w sieci." - "Twoim urządzeniem zarządza %1$s.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane powiązane z urządzeniem i informacje o jego lokalizacji oraz nimi zarządzać.\n\nMasz połączenie z aplikacją %2$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." + "Twoim urządzeniem zarządza %1$s.\n\nAdministrator może monitorować ustawienia, dostęp do zasobów firmowych, aplikacje, dane powiązane z tym urządzeniem i informacje o lokalizacji urządzenia oraz nimi zarządzać.\n\nŁączysz się z aplikacją %2$s, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem." "Urządzenie pozostanie zablokowane, aż odblokujesz je ręcznie" "Szybszy dostęp do powiadomień" "Zobacz powiadomienia, jeszcze zanim odblokujesz ekran" @@ -435,7 +441,8 @@ "Rozwiń" "Zwiń" "Ekran jest przypięty" - "Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Wstecz." + "Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Wstecz oraz Przegląd." + "Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Przegląd." "OK" "Nie, dziękuję" "Ukryć %1$s?" @@ -656,4 +663,7 @@ "Edytuj kolejność ustawień." "Strona %1$d z %2$d" "Nie można wyciszyć ani zablokować powiadomień" + "Telefon się nagrzewa" + "Podczas obniżania temperatury telefonu niektóre funkcje są ograniczone" + "Telefon automatycznie podejmie próbę obniżenia temperatury. Możesz go wciąż używać, ale telefon może działać wolniej.\n\nGdy temperatura się obniży, telefon będzie działał normalnie." diff --git a/packages/SystemUI/res/values-pl/strings_car.xml b/packages/SystemUI/res/values-pl/strings_car.xml index d6e02d6c0454..dbb0373e161f 100644 --- a/packages/SystemUI/res/values-pl/strings_car.xml +++ b/packages/SystemUI/res/values-pl/strings_car.xml @@ -20,5 +20,5 @@ "Jedź bezpiecznie" - "Uważnie obserwuj warunki na drodze i zawsze przestrzegaj obowiązującego prawa. Wskazówki mogą być niedokładne, niekompletne, niebezpieczne, nieprzydatne lub niezgodne z prawem, mogą też obejmować przekraczanie obszarów administracyjnych. Informacje o firmach również mogą być niedokładne lub niekompletne. Dane nie są podawane w czasie rzeczywistym. Nie ma gwarancji, że dane o lokalizacji są dokładne. Podczas prowadzenia samochodu nie obsługuj urządzenia mobilnego ani nie używaj aplikacji nieprzeznaczonych na Android Auto." + "Uważnie obserwuj warunki na drodze i zawsze przestrzegaj obowiązującego prawa. Wskazówki mogą być niedokładne, niekompletne, niebezpieczne, nieprzydatne lub niezgodne z prawem, mogą też obejmować przekraczanie obszarów administracyjnych. Informacje o firmach również mogą być niedokładne lub niekompletne. Dane nie są podawane w czasie rzeczywistym. Nie ma gwarancji, że dane o lokalizacji są dokładne. Podczas prowadzenia samochodu nie obsługuj urządzenia mobilnego ani nie używaj aplikacji nieprzeznaczonych na Androida Auto." diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 25aeb5fbfb5c..5d0459e9a994 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -410,19 +410,25 @@ "Monitoramento de dispositivos" "Monitoramento de perfis" "Monitoramento de rede" + "VPN" + "Registro de rede" "Desativar VPN" "Desconectar VPN" - "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações sobre a localização do dispositivo. Para mais informações, entre em contato com o administrador." + "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e as informações de local do dispositivo. Para ver mais detalhes, entre em contato com o administrador." + "Você está conectado a %1$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites." + " " + "Abrir configurações de VPN" + "Seu administrador ativou o registro de rede, que monitora o tráfego no seu dispositivo.\n\nPara ver mais informações, entre em contato com o administrador." "Você deu permissão para um app configurar uma conexão VPN.\n\nEsse app pode monitorar seu dispositivo e a atividade na rede, incluindo e-mails, apps e websites." - "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a uma VPN, a qual pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara mais informações, entre em contato com seu administrador." - "Seu perfil de trabalho é gerenciado por %1$s.\n\nSeu administrador pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara mais informações, entre em contato com seu administrador.\n\nVocê também está conectado a uma VPN, a qual pode monitorar suas atividades de rede." + "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e as informações de local do dispositivo.\n\nVocê está conectado a uma VPN, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites.\n\nPara ver mais detalhes, entre em contato com o administrador." + "Seu perfil de trabalho é gerenciado por %1$s.\n\nSeu administrador pode monitorar sua atividade de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com o administrador.\n\nVocê também está conectado a uma VPN, que pode monitorar sua atividade de rede." "VPN" "Você está conectado a %1$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites." "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." - "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado a %2$s, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador." + "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado ao app %2$s, que pode monitorar sua atividade profissional de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com o administrador." "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado a %2$s, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a %3$s, que pode monitorar sua atividade pessoal na rede." - "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a %2$s, que pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador." + "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e as informações de local do dispositivo.\n\nVocê está conectado a %2$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites.\n\nPara ver mais detalhes, entre em contato com o administrador." "O dispositivo permanecerá bloqueado até que você o desbloqueie manualmente" "Receba notificações mais rápido" "Veja-as antes de desbloquear" @@ -433,7 +439,8 @@ "Expandir" "Recolher" "A tela está fixada" - "Ela é mantida à vista até que seja liberada. Toque em \"Voltar\" e mantenha essa opção pressionada para liberar." + "Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar." + "Ela é mantida à vista até que seja liberada. Toque em Visão geral e mantenha essa opção pressionada para liberar." "Entendi" "Não, obrigado" "Esconder %1$s?" @@ -654,4 +661,7 @@ "Editar ordem das configurações." "Página %1$d de %2$d" "Não é possível silenciar ou bloquear as notificações" + "O smartphone está esquentando" + "Alguns recursos ficam limitados enquanto o smartphone é resfriado" + "Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal." diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 79f1c7d87226..2375ca9bb8e8 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -408,19 +408,25 @@ "Monitorização de dispositivos" "Monitorização de perfis" "Monitorização da rede" + "VPN" + "Registos de rede" "Desativar a VPN" "Desligar VPN" - "O seu dispositivo é gerido por %1$s.\n\nO seu administrador pode monitorizar e gerir as definições, o acesso empresarial, as aplicações, os dados associados ao dispositivo e as informações de localização do dispositivo. Para obter mais informações, contacte o administrador." + "O seu dispositivo é gerido pela %1$s.\n\nO seu administrador pode monitorizar e gerir definições, o acesso empresarial, aplicações, dados associados ao dispositivo e informações da localização do dispositivo. Para obter mais informações, contacte o administrador." + "Está ligado à rede %1$s, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites." + " " + "Abrir as definições de VPN" + "O seu administrador ativou os registos de rede, que monitorizam o tráfego no seu dispositivo.\n\nPara obter mais informações, contacte o administrador." "Concedeu autorização a uma aplicação para configurar uma ligação VPN.\n\nEsta aplicação pode monitorizar a atividade do dispositivo e da rede, incluindo emails, aplicações e Websites." - "O seu dispositivo é gerido por %1$s.\n\nO seu administrador pode monitorizar e gerir as definições, o acesso empresarial, as aplicações, os dados associados ao dispositivo e as informações de localização do dispositivo.\n\nEncontra-se ligado a uma VPN, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador." - "O seu perfil de trabalho é gerido por %1$s.\n\nO seu administrador pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador.\n\nAlém disso, está ligado a uma VPN, que pode monitorizar a atividade da rede." + "O seu dispositivo é gerido pela %1$s.\n\nO seu administrador pode monitorizar e gerir definições, o acesso empresarial, aplicações, dados associados ao dispositivo e informações da localização do dispositivo.\n\nEstá ligado a uma VPN, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador." + "O seu perfil de trabalho é gerido por %1$s.\n\nO seu administrador tem a capacidade de monitorizar a sua atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador.\n\nAlém disso, está ligado a uma VPN, que pode monitorizar a sua atividade da rede." "VPN" "Está ligado a %1$s, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites." "Está ligado a %1$s, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites." "Está ligado ao %1$s, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites." - "O seu perfil de trabalho é gerido por %1$s. Está ligado a %2$s, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador." + "O seu perfil de trabalho é gerido por %1$s. Está associado à aplicação %2$s, que pode monitorizar a sua atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador." "O seu perfil de trabalho é gerido por %1$s. Está ligado a %2$s, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nTambém está ligado a %3$s, que pode monitorizar a atividade da rede pessoal." - "O seu dispositivo é gerido por %1$s.\n\nO seu administrador pode monitorizar e gerir as definições, o acesso empresarial, as aplicações, os dados associados ao dispositivo e as informações de localização do dispositivo.\n\nEstá ligado a %2$s, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador." + "O seu dispositivo é gerido pela %1$s.\n\nO seu administrador pode monitorizar e gerir definições, o acesso empresarial, aplicações, dados associados ao dispositivo e informações da localização do dispositivo.\n\nEstá associado a %2$s, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador." "O dispositivo permanecerá bloqueado até ser desbloqueado manualmente" "Receber notificações mais rapidamente" "Ver antes de desbloquear" @@ -431,7 +437,8 @@ "Expandir" "Reduzir" "O ecrã está fixado" - "Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior para soltar." + "Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Vista geral para soltar." + "Esta opção mantém o item visível até o soltar. Toque sem soltar em Vista geral para soltar." "Compreendi" "Não, obrigado" "Pretende ocultar %1$s?" @@ -652,4 +659,7 @@ "Editar a ordem das definições." "Página %1$d de %2$d" "Não é possível silenciar ou bloquear as notificações" + "O telemóvel está a aquecer" + "Algumas funcionalidades são limitadas enquanto o telemóvel arrefece" + "O telemóvel tenta arrefecer automaticamente. Pode continuar a utilizá-lo, mas este poderá funcionar mais lentamente.\n\nAssim que o telemóvel tiver arrefecido, funcionará normalmente." diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 25aeb5fbfb5c..5d0459e9a994 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -410,19 +410,25 @@ "Monitoramento de dispositivos" "Monitoramento de perfis" "Monitoramento de rede" + "VPN" + "Registro de rede" "Desativar VPN" "Desconectar VPN" - "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações sobre a localização do dispositivo. Para mais informações, entre em contato com o administrador." + "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e as informações de local do dispositivo. Para ver mais detalhes, entre em contato com o administrador." + "Você está conectado a %1$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites." + " " + "Abrir configurações de VPN" + "Seu administrador ativou o registro de rede, que monitora o tráfego no seu dispositivo.\n\nPara ver mais informações, entre em contato com o administrador." "Você deu permissão para um app configurar uma conexão VPN.\n\nEsse app pode monitorar seu dispositivo e a atividade na rede, incluindo e-mails, apps e websites." - "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a uma VPN, a qual pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara mais informações, entre em contato com seu administrador." - "Seu perfil de trabalho é gerenciado por %1$s.\n\nSeu administrador pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara mais informações, entre em contato com seu administrador.\n\nVocê também está conectado a uma VPN, a qual pode monitorar suas atividades de rede." + "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e as informações de local do dispositivo.\n\nVocê está conectado a uma VPN, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites.\n\nPara ver mais detalhes, entre em contato com o administrador." + "Seu perfil de trabalho é gerenciado por %1$s.\n\nSeu administrador pode monitorar sua atividade de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com o administrador.\n\nVocê também está conectado a uma VPN, que pode monitorar sua atividade de rede." "VPN" "Você está conectado a %1$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites." "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." "Você está conectado a %1$s, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites." - "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado a %2$s, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador." + "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado ao app %2$s, que pode monitorar sua atividade profissional de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com o administrador." "Seu perfil de trabalho é gerenciado por %1$s. Ele está conectado a %2$s, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a %3$s, que pode monitorar sua atividade pessoal na rede." - "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a %2$s, que pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador." + "Seu dispositivo é gerenciado por %1$s.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e as informações de local do dispositivo.\n\nVocê está conectado a %2$s, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites.\n\nPara ver mais detalhes, entre em contato com o administrador." "O dispositivo permanecerá bloqueado até que você o desbloqueie manualmente" "Receba notificações mais rápido" "Veja-as antes de desbloquear" @@ -433,7 +439,8 @@ "Expandir" "Recolher" "A tela está fixada" - "Ela é mantida à vista até que seja liberada. Toque em \"Voltar\" e mantenha essa opção pressionada para liberar." + "Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar." + "Ela é mantida à vista até que seja liberada. Toque em Visão geral e mantenha essa opção pressionada para liberar." "Entendi" "Não, obrigado" "Esconder %1$s?" @@ -654,4 +661,7 @@ "Editar ordem das configurações." "Página %1$d de %2$d" "Não é possível silenciar ou bloquear as notificações" + "O smartphone está esquentando" + "Alguns recursos ficam limitados enquanto o smartphone é resfriado" + "Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal." diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 408edf318920..09921c290168 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -412,19 +412,25 @@ "Monitorizarea dispozitivului" "Monitorizarea profilului" "Monitorizarea rețelei" + "VPN" + "Înregistrarea în jurnal pentru rețea" "Dezactivați conexiunea prin VPN" "Deconectați rețeaua VPN" - "Dispozitivul este gestionat de %1$s.\n\nAdministratorul poate monitoriza și gestiona setările, accesul la rețeaua companiei, aplicațiile, datele asociate cu dispozitivul și informațiile privind locația dispozitivului. Pentru mai multe informații, contactați administratorul." + "Dispozitivul dvs. este gestionat de %1$s.\n\nAdministratorul dvs. poate monitoriza și gestiona setările, accesul la nivelul companiei, aplicațiile, datele asociate cu dispozitivul dvs. și informațiile despre locația dispozitivului. Pentru mai multe informații, contactați administratorul." + "V-ați conectat la aplicația %1$s, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate." + " " + "Deschideți Setări VPN" + "Administratorul dvs. a activat înregistrarea în jurnal pentru rețea, funcție ce monitorizează traficul de pe dispozitivul dvs.\n\nPentru mai multe informații, contactați administratorul." "Ați acordat unei aplicații permisiunea de a configura o conexiune VPN.\n\nAceastă aplicație poate monitoriza activitatea de pe dispozitiv și în rețea, inclusiv e-mailurile, aplicațiile și site-urile." - "Dispozitivul este gestionat de %1$s.\n\nAdministratorul poate monitoriza și gestiona setările, accesul la rețeaua companiei, aplicațiile, datele asociate cu dispozitivul și informațiile privind locația dispozitivului.\n\nSunteți conectat(ă) la o rețea VPN, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul." - "Profilul de serviciu este gestionat de %1$s.\n\nAdministratorul poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul.\n\nDe asemenea, sunteți conectat(ă) la o rețea VPN, care vă poate monitoriza activitatea în rețea." + "Dispozitivul dvs. este gestionat de %1$s.\n\nAdministratorul dvs. poate monitoriza și gestiona setările, accesul la nivelul companiei, aplicațiile, datele asociate cu dispozitivul dvs. și informațiile despre locația dispozitivului.\n\nSunteți conectat(ă) la o rețea VPN, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru informații, contactați administratorul." + "Profilul dvs. de serviciu este gestionat de %1$s.\n\nAdministratorul dvs. vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul.\n\nDe asemenea, sunteți conectat(ă) la o rețea VPN care vă poate monitoriza activitatea în rețea." "VPN" "Sunteți conectat(ă) la %1$s, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile." "Sunteți conectat(ă) la %1$s, care vă poate monitoriza activitatea în rețeaua personală, inclusiv e-mailurile, aplicațiile și site-urile." "V-ați conectat la aplicația %1$s, care vă poate monitoriza activitatea personală în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate." - "Profilul de serviciu este gestionat de %1$s. Este conectat la %2$s, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul." + "Profilul dvs. de serviciu este gestionat de %1$s. Acesta este conectat la %2$s, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul." "Profilul de serviciu este gestionat de %1$s. Este conectat la %2$s, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile.\n\nDe asemenea, sunteți conectat(ă) la %3$s, care vă poate monitoriza activitatea în rețeaua personală." - "Dispozitivul este gestionat de %1$s.\n\nAdministratorul poate monitoriza și gestiona setările, accesul la rețeaua companiei, aplicațiile, datele asociate cu dispozitivul și informațiile privind locația dispozitivului.\n\nSunteți conectat(ă) la %2$s, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul." + "Dispozitivul dvs. este gestionat de %1$s.\n\nAdministratorul dvs. poate monitoriza și gestiona setările, accesul la nivelul companiei, aplicațiile, datele asociate cu dispozitivul dvs. și informațiile despre locația dispozitivului.\n\nSunteți conectat(ă) la %2$s, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul." "Dispozitivul va rămâne blocat până când îl deblocați manual" "Obțineți notificări mai rapid" "Doresc să se afișeze înainte de deblocare" @@ -435,7 +441,8 @@ "Extindeți" "Restrângeți" "Ecranul este fixat" - "Ecranul este afișat până anulați fixarea. Atingeți lung opțiunea Înapoi pentru a anula fixarea." + "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea." + "Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Recente pentru a anula fixarea." "Am înțeles" "Nu, mulțumesc" "Ascundeți %1$s?" @@ -656,4 +663,7 @@ "Editați ordinea setărilor." "Pagina %1$d din %2$d" "Notificările nu pot fi dezactivate sau blocate" + "Telefonul se încălzește" + "Anumite funcții sunt limitate în timp ce telefonul se răcește" + "Telefonul va încerca automat să se răcească. Puteți folosi telefonul în continuare, dar este posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal." diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 7efd8fa63a2f..2deffa821b07 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -414,19 +414,25 @@ "Отслеживание устройств" "Мониторинг профиля" "Отслеживание сетей" + "Настройки VPN" + "Сетевой журнал" "Отключить VPN" "Отключить VPN" - "Этим устройством управляет %1$s.\n\nАдминистратор может управлять настройками, корпоративным доступом, приложениями, данными на вашем устройстве, в том числе геоданными, а также просматривать соответствующие сведения. За дополнительной информацией обратитесь к администратору." + "Вашим устройством управляет организация \"%1$s\".\n\nАдминистратор может контролировать настройки, приложения и параметры доступа к корпоративным ресурсам на этом устройстве, а также связанные с ним данные (например, сведения о местоположении). За подробной информацией обращайтесь к администратору." + "Запущено приложение \"%1$s\". Оно может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и сайтами." + " " + "Открыть настройки VPN" + "Администратор включил ведение сетевого журнала, чтобы отслеживать трафик на вашем устройстве.\n\nДля получения подробной информации обращайтесь к администратору." "Вы разрешили приложению подключаться к сети VPN.\n\nОно может отслеживать ваши действия на устройстве и в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами." - "Этим устройством управляет %1$s.\n\nАдминистратор может управлять настройками, корпоративным доступом, приложениями, данными на вашем устройстве, в том числе геоданными, а также просматривать соответствующие сведения.\n\nВы подключены к сети VPN, поэтому возможно отслеживание ваших действий в Интернете, включая работу с электронной почтой, приложениями и защищенными веб-сайтами.\n\nЗа дополнительной информацией обратитесь к администратору." - "Вашим корпоративным профилем управляет %1$s.\n\nАдминистратор может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа подробностями обратитесь к нему.\n\nУстройство также подключено к сети VPN, в которой возможно отслеживание ваших действий." + "Вашим устройством управляет организация \"%1$s\".\n\nАдминистратор может контролировать настройки, приложения и параметры доступа к корпоративным ресурсам на этом устройстве, а также связанные с ним данные (например, сведения о местоположении).\n\nВы подключены к сети VPN, поэтому ваши действия в Интернете (включая работу с электронной почтой, приложениями и веб-сайтами) могут отслеживаться.\n\nЗа подробной информацией обращайтесь к администратору." + "Вашим рабочим профилем управляет %1$s.\n\nАдминистратор может отслеживать ваши действия в сети, в том числе работу с электронной почтой, приложениями и веб-сайтами.\n\nДля получения подробной информации обращайтесь к администратору.\n\nВы также подключены к сети VPN, в которой можно отслеживать ваши действия." "Сеть VPN" "Запущено приложение \"%1$s\", которое может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами." "Запущено приложение \"%1$s\", которое может отслеживать ваши действия в Интернете (выполняемые в личном профиле), включая работу с электронной почтой, приложениями и веб-сайтами." "Запущено приложение \"%1$s\", которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами." - "Вашим рабочим профилем управляет \"%1$s\". Приложение \"%2$s\" может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа дополнительной информацией обратитесь к своему администратору." + "Вашим рабочим профилем управляет %1$s. Приложение %2$s может отслеживать ваши действия в корпоративной сети, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа подробностями обратитесь к своему администратору." "Вашим рабочим профилем управляет \"%1$s\". Приложение \"%2$s\" может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nПриложение \"%3$s\" может отслеживать ваши действия в Интернете, выполняемые в личном профиле." - "Вашим корпоративным профилем управляет %1$s.\n\nАдминистратор может управлять настройками, корпоративным доступом, приложениями, данными на вашем устройстве, в том числе геоданными, а также просматривать соответствующие сведения.\n\nПриложение %2$s также может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа подробностями обратитесь к своему администратору." + "Вашим устройством управляет организация \"%1$s\".\n\nАдминистратор может контролировать настройки, приложения и параметры доступа к корпоративным ресурсам на этом устройстве, а также связанные с ним данные (например, сведения о местоположении).\n\nВы подключены к приложению \"%2$s\". Оно может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа подробной информацией обращайтесь к администратору." "Устройство необходимо будет разблокировать вручную" "Быстрый доступ к уведомлениям" "Просматривайте уведомления на заблокированном экране." @@ -437,7 +443,8 @@ "Развернуть" "Свернуть" "Блокировка в приложении включена" - "Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопку \"Назад\"." + "Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопки \"Назад\" и \"Обзор\"." + "Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопку \"Обзор\"." "ОК" "Нет, спасибо" "Скрыть параметр \"%1$s\"?" @@ -658,4 +665,7 @@ "Изменить порядок быстрых настроек." "Страница %1$d из %2$d" "Уведомления нельзя блокировать и показывать без звука" + "Телефон нагревается" + "Пока телефон не остынет, некоторые функции могут быть недоступны." + "Ваш телефон остынет автоматически.\n\nОбратите внимание, что до тех пор он может работать медленнее, чем обычно." diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 749231d54782..eb98025f2daa 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -188,7 +188,7 @@ "පරිශීලකයා %s." "%1$s." "Wifi අක්‍රියයි." - "Wifi සක්‍රියයි." + "Wifi ක්‍රියාත්මකයි." "ජංගම %1$s. %2$s. %3$s." "බැටරිය %s." "අහස්යානා අකාරය අක්‍රියයි." @@ -204,15 +204,15 @@ "බාධා නොකරන්න ක්‍රියාත්මක කරන ලදි" "බ්ලූටූත්." "බ්ලූටූත් අක්‍රියයි." - "බ්ලූටූත් සක්‍රියයි." + "බ්ලූටූත් ක්‍රියාත්මකයි." "බ්ලූටූත් සම්බන්ධවෙමින්." "බ්ලූටූත් සම්බන්ධිතයි." "බ්ලූටූත් අක්‍රියයි." - "බ්ලූටූත් සක්‍රියයි." + "බ්ලූටූත් ක්‍රියාත්මක කෙරිණි." "ස්ථානය වාර්තාකරණය අක්‍රියයි." - "ස්ථානය වාර්තාකරණය සක්‍රියයි." + "ස්ථානය වාර්තාකරණය ක්‍රියාත්මකයි." "ස්ථානය වාර්තාකරණය අක්‍රියයි." - "ස්ථානය වාර්තාකරණය සක්‍රියයි." + "ස්ථානය වාර්තාකරණය ක්‍රියාත්මක කෙරිණි." "%s සඳහා සීනුව සකස් කර ඇත." "පැනලය වහන්න." "වේලාව වැඩියෙන්." @@ -233,7 +233,7 @@ "වැඩ ප්‍රකාරය ක්‍රියාත්මක කරන ලදී." "දත්ත සුරැකුම ක්‍රියාවිරහිත කරන ලදී." "දත්ත සුරැකුම ක්‍රියාත්මක කරන ලදී." - "දීප්තිය දර්ශනය කරන්න" + "සංදර්ශක දීප්තිය" "2G-3G දත්ත විරාම කර ඇත" "4G දත්ත විරාම කර ඇත" "සෙලියුලර් දත්ත විරාම කර ඇත" @@ -264,7 +264,7 @@ "ඊතර නෙට්" "බාධා නොකරන්න" "ප්‍රමුඛතාව පමණයි" - "ඇඟවීම් පමණි" + "එලාම පමණි" "සම්පූර්ණ නිහඬතාව" "බ්ලූටූත්" "බ්ලූටූත් (උපාංග %d)" @@ -345,10 +345,10 @@ "සෙවීම" "%s සඳහා උඩට සර්පණය කරන්න." "%s සඳහා වමට සර්පණය කරන්න." - "එලාම, සිහි කැඳවීම්, සිදුවීම් සහ ඔබ සඳහන් කරන අමතන්නන් වෙතින් හැර, වෙනත් ශබ්ද සහ කම්පනවලින් ඔබට බාධා නොවනු ඇත." + "එලාම, සිහිකැඳවීම්, සිදුවීම් සහ ඔබ සඳහන් කරන අමතන්නන් වෙතින් හැර, ශබ්ද සහ කම්පනවලින් ඔබට බාධා නොවනු ඇත." "අභිරුචිකරණය" - "මෙය සීනු, සංගීතය, වීඩියෝ, සහ ක්‍රීඩා ඇතුළු, සියලු ශබ්ද සහ කම්පන අවහිර කරයි. ඔබට තවමත් දුරකථන ඇමතුම් සිදු කිරීමේ හැකියාව ඇත." - "මෙය සීනු, සංගීතය, වීඩියෝ, සහ ක්‍රීඩා ඇතුළු, සියලු ශබ්ද සහ කම්පන අවහිර කරයි." + "මෙය එලාම්, සංගීතය, වීඩියෝ, සහ ක්‍රීඩා ඇතුළු, සියලු ශබ්ද සහ කම්පන අවහිර කරයි. ඔබට තවමත් දුරකථන ඇමතුම් ගැනීමට හැකියාව ඇත." + "මෙය එලාම්, සංගීතය, වීඩියෝ, සහ ක්‍රීඩා ඇතුළු, සියලු ශබ්ද සහ කම්පන අවහිර කරයි." "+%d" "හදිසිය අඩු දැනුම් දීම් පහත" "විවෘත කිරීමට නැවත තට්ටු කරන්න" @@ -359,7 +359,7 @@ "සම්පූර්ණ නිහඬතාව. මෙය තිර කියවන්නන්ද නිහඬ කරනු ඇත." "සම්පූර්ණ නිහඬතාව" "ප්‍රමුඛතාව පමණයි" - "ඇඟවීම් පමණි" + "එලාම පමණි" "සම්පූර්ණ\nනිහඬතාව" "ප්‍රමුඛතා\nපමණි" "ඇඟවීම්\nපමණි" @@ -373,8 +373,8 @@ "පරිශීලකයෙක් එක් කරන්න" "නව පරිශීලකයා" "අමුත්තා" - "ආගන්තුකයා එකතු කරන්න" - "අමුත්තාන් ඉවත් කරන්න" + "අමුත්තා එක් කරන්න" + "අමුත්තා ඉවත් කරන්න" "අමුත්තාන් ඉවත් කරන්නද?" "මෙම සැසියේ සියළුම යෙදුම් සහ දත්ත මකාවී." "ඉවත් කරන්න" @@ -388,7 +388,7 @@ "පරිශීලකයා වරන්න" "වත්මන් පරිශීලක වරන්න" "පරිශීලකයා වරන්න" - "අලුත් පරිශීලකයෙක් එකතු කරන්නද?" + "අලුත් පරිශීලකයෙක් එක් කරන්නද?" "ඔබ අලුත් පරිශීලකයෙක් එකතු කරන විට, එම පුද්ගලයා ඔහුගේ වැඩ කරන ඉඩ සකසා ගත යුතුය.\n\nසියළුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යාවත්කාලීන කළ හැක." "පරිශීලකයා ඉවත් කරන්නද?" "මෙම පරිශීලකයාගේ සියලු යෙදුම් සහ දත්ත මකනු ඇත." @@ -408,19 +408,25 @@ "උපාංගය නිරීක්ෂණය" "පැතිකඩ නිරීක්ෂණය කිරීම" "ජාල නිරීක්ෂණය" + "VPN" + "ජාල ඇතුළු වීම" "VPN අබල කරන්න." "VPN විසන්ධි කරන්න" - "ඔබේ උපාංගය කළමනාකරණය කරනු ලබන්නේ %1$s විසිනි.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්‍රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංගය තිබෙන ස්ථානයේ තොරතුරු නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට හැකිය. වැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." + "ඔබේ උපාංගය කළමනාකරණය කරන්නේ %1$s මගිනි.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්‍රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංගය තිබෙන ස්ථානයේ තොරතුරු නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට හැකිය. වැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." + "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි %1$s, වෙත ඔබ සම්බන්ධ වී ඇත." + " " + "VPN සැකසීම් විවෘත කරන්න" + "ඔබගේ පරිපාලක ඔබගේ උපාංගය මත තදබදය නිරීක්ෂණය කරන, ජාල ඇතුළු වීම ක්‍රියාත්මක කර ඇත.\n\nවැඩිදුර තොරතුරු සඳහා ඔබේ පරිපාලක අමතන්න." "ඔබ VPN සම්බන්ධතාවක් පිහිටුවීමට යෙදුමකට අවසරයක් දී ඇත.\n\nමෙම යෙදුමට ඔබේ ඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු, ඔබගේ උපාංග සහ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කිරීමට හැකිය." - "ඔබේ උපාංගය කළමනාකරණය කරනු ලබන්නේ %1$s විසිනි.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්‍රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංගය තිබෙන ස්ථානයේ තොරතුරු නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට හැකිය.\n\nඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කිරීමට හැකි VPN සම්බන්ධතාවයකටද, ඔබ සම්බන්ධව ඇත.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." - "ඔබේ කාර්ය පැතිකඩ කළමනාකරණය කරන්නේ %1$s විසිනි.\n\nඔබේ පරිපාලකට ඔබේ ඊ-තැපැල්, යෙදුම්, සහ ආරක්ෂාකාරී වෙබ් අඩවි ඇතුළු, ඔබගේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කිරීමට හැකියාව ඇත.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න.\n\nඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කිරීමට හැකි VPN සම්බන්ධතාවයකටද, ඔබ සම්බන්ධව ඇත." + "ඔබේ උපාංගය කළමනාකරණය කරන්නේ %1$s මගිනි.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්‍රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංගය තිබෙන ස්ථානයේ තොරතුරු නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට හැකිය.\n\nඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු, ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, VPN එකකට ඔබ සබැඳී ඇත.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." + "ඔබේ කාර්ය පැතිකඩ කළමනාකරණය කරන්නේ %1$s.\n\nඔබේ පරිපාලකට ඔබේ ඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු, ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකිය.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න.\n\nඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, VPN එකකටද ඔබ සබැඳී ඇත" "VPN" "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %1$s වෙත ඔබ සම්බන්ධ වී ඇත." "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ පෞද්ගලික ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %1$s වෙත ඔබ සම්බන්ධ වී ඇත." "ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ පෞද්ගලික ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %1$s වෙත ඔබ සම්බන්ධ වී ඇත." - "ඔබේ කාර්යාල පැතිකඩ කළමනාකරණය කරන්නේ %1$s විසිනි. එය ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ කාර්යාල ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %2$s වෙත ඔබ සම්බන්ධ වී ඇත.\n\nවැඩිදුර විස්තර සඳහා, ඔබේ පරිපාලක අමතන්න." + "ඔබේ කාර්ය පැතිකඩ කළමනාකරණය කරන්නේ %1$s මගිනි. එය ඔබේ ඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු, ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %2$s වෙත සම්බන්ධය.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." "ඔබේ කාර්යාල පැතිකඩ කළමනාකරණය කරන්නේ %1$s විසිනි. එය ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ කාර්යාල ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %2$s, වෙත ඔබ සම්බන්ධ වී ඇත.\n\nඔබ ඔබේ පෞද්ගලික ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %3$s වෙතද සම්බන්ධ වී ඇත." - "ඔබේ උපාංගය කළමනාකරණය කරන්නේ %1$s විසිනි.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්‍රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංගය තිබෙන ස්ථානයේ තොරතුරු නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට හැකිය.\n\nඔබ ඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කිරීමට හැකි %2$s, වෙතද සම්බන්ධව ඇත.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." + "ඔබේ උපාංගය කළමනාකරණය කරන්නේ %1$s මගිනි.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්‍රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංගය තිබෙන ස්ථානයේ තොරතුරු නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට හැකිය.\n\nඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු, ඔබේ ජාල ක්‍රියාකාරකම් නිරීක්ෂණය කළ හැකි, %2$s වෙත ඔබ සබැඳී ඇත.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න." "ඔබ අතින් අගුළු අරින තුරු උපකරණය අගුළු වැටි තිබේ" "දැනුම්දීම් ඉක්මනින් ලබාගන්න" "ඔබ අඟුළු හැරීමට කලින් ඒවා බලන්න" @@ -431,7 +437,8 @@ "දිග හරින්න" "හකුළන්න" "තීරය අමුණන ලදි" - "මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට ස්පර්ශ කර ආපසු අල්ලාගෙන සිටින්න." + "මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ශ කර ආපසු අල්ලාගෙන සිටින්න." + "මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ශ කර අල්ලාගෙන සිටින්න." "හරි, තේරුණා" "එපා ස්තූතියි" "%1$s සඟවන්නද?" @@ -605,7 +612,7 @@ "පෙරදසුන" "ටයිල් එක් කිරීමට අදින්න" "ඉවත් කිරීමට මෙතැනට අදින්න" - "සංස්කරණය කරන්න" + "සංස්කරණය" "වේලාව" "පැය, මිනිත්තු, සහ තත්පර පෙන්වන්න" @@ -652,4 +659,7 @@ "සැකසීම්වල අනුපිළිවෙළ සංංස්කරණය කරන්න." "%2$d න් %1$d" "දැනුම්දීම් නිහඬ හෝ අවහිර කළ නොහැකිය" + "දුරකථනය උණුසුම් වෙමින්" + "දුරකථනය සිසිල් වන අතරතුර සමහර විශේෂාංග සීමිත විය හැකිය" + "ඔබගේ දුරකථනය ස්වයංක්‍රියව සිසිල් වීමට උත්සාහ කරනු ඇත. ඔබට තවම ඔබේ දුරකථනය භාවිත කළ හැකිය, නමුත් එය සෙමින් ධාවනය විය හැකිය.\n\nඔබේ දුරකථනය සිසිල් වූ පසු, එය සාමාන්‍ය ලෙස ධාවනය වනු ඇත." diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 8dd25693fa58..a514b49d8263 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -414,19 +414,25 @@ "Sledovanie zariadenia" "Monitorovanie profilu" "Sledovanie siete" + "VPN" + "Zapisovanie do denníka siete" "Deaktivovať VPN" "Odpojiť sieť VPN" - "Vaše zariadenie spravuje organizácia %1$s.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje priradené k vášmu zariadeniu a informácie o polohe zariadenia. Ďalšie informácie získate od svojho správcu." + "Vaše zariadenie spravuje organizácia %1$s.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje súvisiace s týmto zariadením vrátane informácií o polohe vášho zariadenia. Ďalšie informácie vám poskytne správca." + "Ste pripojený/-á k aplikácii %1$s, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok." + " " + "Otvoriť Nastavenia pripojenia VPN" + "Správca aktivoval zapisovanie do denníka siete, ktoré sleduje premávku na vašom zariadení.\n\nĎalšie informácie vám poskytne správca." "Určitej aplikácii ste udelili povolenie nastaviť pripojenie VPN.\n\nTáto aplikácia môže sledovať vaše zariadenie a aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok." - "Vaše zariadenie spravuje organizácia %1$s.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje priradené k vášmu zariadeniu a informácie o polohe zariadenia.\n\nSte tiež pripojený/-á k sieti VPN, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácii a webových stránok.\n\nĎalšie informácie získate od svojho správcu." - "Váš pracovný profil spravuje organizácia %1$s.\n\nSprávca môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nĎalšie informácie získate od svojho správcu.\n\nSte tiež pripojený/-á k sieti VPN, ktorá môže sledovať vašu aktivitu v sieti." + "Vaše zariadenie spravuje organizácia %1$s.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje súvisiace s týmto zariadením vrátane informácií o polohe vášho zariadenia.\n\nSte pripojený/-á k sieti VPN, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nĎalšie informácie vám poskytne správca." + "Váš pracovný profil spravuje organizácia %1$s.\n\nSprávca môže sledovať vašu aktivitu v sieti vrátane e-mailov, aplikácií a webov.\n\nĎalšie informácie vám poskytne správca.\n\nMáte tiež aktívne pripojenie k sieti VPN, ktorá môže sledovať vašu aktivitu v rámci siete." "VPN" "Ste pripojený/-á k aplikácii %1$s, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok." "Ste pripojený/-á k aplikácii %1$s, ktorá môže sledovať vašu osobnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok." "Ste pripojený/-á k aplikácii %1$s, ktorá môže sledovať vašu osobnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok." - "Váš pracovný profil spravuje organizácia %1$s. Je pripojený k aplikácii %2$s, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nĎalšie informácie získate od svojho správcu." + "Váš pracovný profil spravuje organizácia %1$s. Je pripojený k aplikácii %2$s, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webov.\n\nĎalšie informácie vám poskytne správca." "Váš pracovný profil spravuje organizácia %1$s. Je pripojený k aplikácii %2$s, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nSte tiež pripojený/-á k aplikácii %3$s, ktorá môže sledovať vašu osobnú aktivitu v sieti." - "Vaše zariadenie spravuje organizácia %1$s.\n\nSprávca môže sledovať a spravovať nastavenia, podnikový prístup, aplikácie a údaje priradené k vášmu účtu, ako aj informácie o polohe zariadenia.\n\nSte pripojený/-á k aplikácii %2$s, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácii a webových stránok.\n\nĎalšie informácie získate od svojho správcu." + "Vaše zariadenie spravuje organizácia %1$s.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje súvisiace s týmto zariadením vrátane informácií o polohe vášho zariadenia.\n\nSte pripojený/-á k aplikácii %2$s, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nĎalšie informácie vám poskytne správca." "Zariadenie zostane uzamknuté, dokým ho ručne neodomknete." "Získavať upozornenia rýchlejšie" "Zobraziť pred odomknutím" @@ -437,7 +443,8 @@ "Rozbaliť" "Zbaliť" "Obrazovka je pripnutá" - "Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidla Späť." + "Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidiel Späť a Prehľad." + "Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidla Prehľad." "Dobre" "Nie, vďaka" "Skryť %1$s?" @@ -658,4 +665,7 @@ "Upraviť poradie nastavení" "Strana %1$d%2$d" "Upozornenia nie je možné stlmiť ani blokovať" + "Teplota telefónu stúpa" + "Niektoré funkcie budú obmedzené, dokým neklesne teplota telefónu" + "Váš telefón sa automaticky pokúsi schladiť. Môžete ho naďalej používať, ale môže fungovať pomalšie.\n\nPo poklese teploty bude telefón fungovať ako normálne." diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index fc81a23b8abf..64270aeb90ee 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -414,19 +414,25 @@ "Nadzor naprave" "Nadzor nad profilom" "Nadzor omrežja" + "VPN" + "Beleženje omrežnega prometa" "Onemogoči VPN" "Prekini povezavo z VPN-jem" - "Napravo upravlja: %1$s.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave. Če želite več informacij, se obrnite na skrbnika." + "Napravo upravlja %1$s.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave. Če želite več informacij, se obrnite na skrbnika." + "Povezani ste z aplikacijo %1$s, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." + " " + "Odpri nastavitve omrežja VPN" + "Skrbnik je vklopil beleženje omrežnega prometa, ki nadzoruje promet v napravi.\n\nČe želite več informacij, se obrnite na skrbnika." "Aplikaciji ste dovolili vzpostavitev povezave VPN.\n\nTa aplikacija lahko nadzira napravo in omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." - "Napravo upravlja: %1$s.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave.\n\nPovezani ste z omrežjem VPN, ki lahko nadzira vašo omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika." - "Delovni profil upravlja organizacija %1$s.\n\nSkrbnik lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika.\n\nPovezani ste tudi z omrežjem VPN, ki lahko nadzira omrežno dejavnost." + "Napravo upravlja %1$s.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave.\n\nPovezani ste v omrežje VPN, ki lahko nadzira vašo omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika." + "Delovni profil upravlja %1$s.\n\nSkrbnik lahko nadzira vašo omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika.\n\nPovezani ste tudi z omrežjem VPN, ki lahko nadzira vašo omrežno dejavnost." "VPN" "Povezani ste z aplikacijo %1$s, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." "Povezani ste z aplikacijo %1$s, ki lahko nadzira vašo osebno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." "Povezani ste z aplikacijo %1$s, ki lahko nadzira vašo osebno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti." - "Delovni profil upravlja organizacija %1$s. Povezan je z aplikacijo %2$s, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika." + "Delovni profil upravlja %1$s. Povezan je z aplikacijo %2$s, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika." "Delovni profil upravlja organizacija %1$s. Povezan je z aplikacijo %2$s, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nPovezani ste tudi z aplikacijo %3$s, ki lahko nadzira vašo osebno omrežno dejavnost." - "Napravo upravlja organizcija %1$s.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave.\n\nPovezani ste z aplikacijo %2$s, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika." + "Napravo upravlja %1$s.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave.\n\nPovezani ste z aplikacijo %2$s, ki lahko nadzira vašo omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika." "Naprava bo ostala zaklenjena, dokler je ročno ne odklenete." "Hitrejše prejemanje obvestil" "Oglejte si jih pred odklepanjem" @@ -437,7 +443,8 @@ "Razširi" "Strni" "Zaslon je pripet" - "S tem ostane zaslon v pogledu, dokler ga ne odpnete. Pridržite tipko za nazaj, če ga želite odpeti." + "S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, hkrati pridržite gumba za nazaj in pregled." + "S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, pridržite gumb za pregled." "Razumem" "Ne, hvala" "Želite skriti %1$s?" @@ -658,4 +665,7 @@ "Uredi vrstni red nastavitev." "%1$d. stran od %2$d" "Obvestil ni mogoče utišati ali blokirati" + "Telefon se segreva" + "Nekatere funkcije bodo med ohlajanjem omejene." + "Telefon se bo samodejno poskusil ohladiti. Še naprej ga lahko uporabljate, vendar bo morda deloval počasneje.\n\nKo se telefon ohladi, bo zopet deloval kot običajno." diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index 68f56852d98d..5ca33bf964f6 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -408,19 +408,25 @@ "Monitorimi i pajisjes" "Monitorimi i profilit" "Monitorimi i rrjetit" + "VPN" + "Regjistrimi i rrjetit" "Çaktivizo VPN-në" "Shkëput VPN-në" - "Pajisja jote menaxhohet nga %1$s.\n\nAdministratori yt mund të monitorojë dhe të menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat e lidhura me pajisjen tënde, si dhe informacionet e vendndodhjes së pajisjes tënde. Për më shumë informacione, kontakto me administratorin tënd." + "Pajisja jote menaxhohet nga %1$s.\n\nAdministratori yt mund të monitorojë dhe të menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat e lidhura me pajisjen tënde, si dhe informacionet e vendndodhjes së pajisjes tënde. Për më shumë informacione, kontakto me administratorin tënd." + "Je i lidhur me aplikacionin %1$s, i cili mund të monitorojë aktivitetin tënd në rrjet, duke përfshirë mail-et, aplikacionet dhe sajtet e uebit." + " " + "Hap cilësimet e VPN-së" + "Administratori yt ka aktivizuar regjistrimin e rrjetit, i cili monitoron trafikun në pajisjen tënde.\n\nPër më shumë informacione, kontakto me administratorin." "I dhe leje një aplikacioni që të konfigurojë një lidhje VPN.\n\nKy aplikacion mund të monitorojë pajisjen tënde dhe aktivitetin e rrjetit, përfshirë mailet, aplikacionet dhe sajtet e uebit." - "Pajisja jote menaxhohet nga %1$s.\n\nAdministratori yt mund të monitorojë dhe të menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat e lidhura me pajisjen dhe informacionet e vendndodhjes së pajisjes.\n\nJe i lidhur me një rrjet VPN që mund të monitorojë aktivitetin tënd të rrjetit, duke përfshirë emailet, aplikacionet dhe sajtet e uebit.\n\nPër më shumë informacione, kontakto me administratorin." - "Profili yt i punës menaxhohet nga %1$s.\n\nAdministratori yt mund të monitorojë aktivitetin tënd të rrjetit, duke përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nPër më shumë informacion, kontakto me administratorin tënd.\n\nJe i lidhur edhe me një VPN, që mund të monitorojë aktivitetin tënd të rrjetit." + "Pajisja jote menaxhohet nga %1$s.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat që shoqërojnë pajisjen tënde si dhe informacionin e vendndodhjes së pajisjes.\n\nJe i lidhur me një VPN, që mund të monitorojë aktivitetin tënd të punës në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nPër më shumë informacion, kontakto me administratorin tënd." + "Profili yt i punës menaxhohet nga %1$s.\n\nAdministratori yt mund të monitorojë aktivitetin tënd të rrjetit, duke përfshirë email-et, aplikacionet dhe sajtet e uebit.\n\nPër më shumë informacion, kontakto me administratorin tënd.\n\nJe i lidhur edhe me një VPN, që mund të monitorojë aktivitetin tënd të rrjetit." "VPN" "Je i lidhur me aplikacionin %1$s, i cili mund të monitorojë aktivitetin tënd në rrjet përfshirë mailet, aplikacionet dhe sajtet e uebit." "Je i lidhur me aplikacionin %1$s, i cili mund të monitorojë aktivitetin tënd personal në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit." "Je i lidhur me aplikacionin %1$s, i cili mund të monitorojë aktivitetin tënd personal në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit." - "Profili yt i punës menaxhohet nga %1$s. Ai është i lidhur me %2$s, i cili mund të monitorojë aktivitetin tënd të punës në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit.\n\nPër më shumë informacione, kontakto me administratorin tënd." + "Profili yt i punës menaxhohet nga %1$s. Ai është i lidhur me %2$s, i cili mund të monitorojë aktivitetin tënd të punës në rrjet, përfshirë email-et, aplikacionet dhe sajtet e uebit.\n\nPër më shumë informacione, kontakto me administratorin tënd." "Profili yt i punës menaxhohet nga %1$s. Ai është i lidhur me %2$s, i cili mund të monitorojë aktivitetin tënd të punës në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit.\n\nJe lidhur gjithashtu edhe me %3$s, i cili mund të monitorojë aktivitetin tënd personal në rrjet." - "Pajisja jote menaxhohet nga %1$s.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat që shoqërojnë pajisjen tënde si dhe informacionin e vendndodhjes së pajisjes.\n\nJe i lidhur me %2$s, që mund të monitorojë aktivitetin tënd të punës në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nPër më shumë informacion, kontakto me administratorin tënd." + "Pajisja jote menaxhohet nga %1$s.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat që shoqërojnë pajisjen tënde si dhe informacionin e vendndodhjes së pajisjes.\n\nJe i lidhur me %2$s, që mund të monitorojë aktivitetin tënd të punës në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nPër më shumë informacion, kontakto me administratorin tënd." "Pajisje do të qëndrojë e kyçur derisa ta shkyçësh manualisht" "Merr njoftime më shpejt" "Shikoji para se t\'i shkyçësh" @@ -431,7 +437,8 @@ "Zgjeroje" "Mbylle" "Ekrani u gozhdua" - "Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" për ta hequr nga gozhdimi." + "Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" dhe \"Përmbledhje\" për ta hequr nga gozhdimi." + "Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Përmbledhje\" për ta hequr nga gozhdimi." "E kuptova!" "Jo, faleminderit!" "Të fshihet %1$s?" @@ -652,4 +659,7 @@ "Modifiko rendin e cilësimeve." "Faqja %1$d nga %2$d" "Njoftimet nuk mund të vendosen në heshtje ose të bllokohen" + "Telefoni po bëhet i ngrohtë" + "Disa funksione janë të kufizuara kur telefoni është duke u ftohur" + "Telefoni yt do të përpiqet automatikisht që të ftohet. Mund ta përdorësh përsëri telefonin, por ai mund të punojë më ngadalë.\n\nPasi telefoni të jetë ftohur, ai do të punojë si normalisht." diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index d31305495669..29150ca991c9 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -410,19 +410,25 @@ "Надгледање уређаја" "Надгледање профила" "Надгледање мреже" + "VPN" + "Евидентирање мреже" "Онемогући VPN" "Прекини везу са VPN-ом" - "Уређајем управља %1$s.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима. Више информација потражите од администратора." + "Уређајем управља %1$s.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима. Контактирајте администратора за више информација." + "Повезани сте са апликацијом %1$s, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове." + " " + "Отворите подешавања VPN-а" + "Администратор је укључио евидентирање мреже, које прати саобраћај на уређају.\n\nКонтактирајте администратора за више информација." "Дали сте дозволу апликацији да подешава VPN везу.\n\nТа апликација може да надгледа активности на уређају и мрежи, укључујући имејлове, апликације и веб-сајтове." - "Уређајем управља %1$s.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nПовезани сте на VPN, који може да надгледа активности на мрежи, укључујући имејлове, апликације и безбедне веб-сајтове.\n\nВише информација потражите од администратора." - "Профилом за Work управља %1$s.\n\nАдминистратор може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора.\n\nПовезани сте и на VPN, који може да надгледа активности на личној мрежи." + "Уређајем управља %1$s.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nПовезани сте са VPN-ом, који може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nКонтактирајте администратора за више информација." + "%1$s управља профилом за Work.\n\nАдминистратор може да прати активности на мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nКонтактирајте администратора за више информација.\n\nПовезани сте и са VPN-ом, који може да прати активности на мрежи." "VPN" "Повезани сте са апликацијом %1$s, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове." "Повезани сте са апликацијом %1$s, која може да надгледа активности на личној мрежи, укључујући имејлове, апликације и веб-сајтове." "Повезани сте са апликацијом %1$s, која може да надгледа активности на личној мрежи, укључујући имејлове, апликације и веб-сајтове." - "Профилом за Work управља %1$s. Повезан је са апликацијом %2$s, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора." + "%1$s управља профилом за Work. Он је повезан са апликацијом %2$s, која може да прати активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nКонтактирајте администратора за више информација." "Профилом за Work управља %1$s. Повезан је са апликацијом %2$s, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nПовезани сте и са апликацијом %3$s, која може да надгледа активности на личној мрежи." - "Уређајем управља %1$s.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nПовезани сте са апликацијом %2$s, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора." + "Уређајем управља %1$s.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nПовезани сте са апликацијом %2$s, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nКонтактирајте администратора за више информација." "Уређај ће остати закључан док га не откључате ручно" "Брже добијајте обавештења" "Прегледајте их пре откључавања" @@ -433,7 +439,8 @@ "Прошири" "Скупи" "Екран је закачен" - "На овај начин се ово стално приказује док га не откачите. Додирните и задржите Назад да бисте га откачили." + "На овај начин се ово стално приказује док га не откачите. Додирните и задржите Назад и Преглед да бисте га откачили." + "На овај начин се ово стално приказује док га не откачите. Додирните и задржите Преглед да бисте га откачили." "Важи" "Не, хвала" "Желите ли да сакријете %1$s?" @@ -654,4 +661,7 @@ "Измени редослед подешавања." "%1$d. страна од %2$d" "Звук обавештења не може да се искључи нити она могу да се блокирају" + "Телефон се загрејао" + "Неке функције су ограничене док се телефон не охлади" + "Телефон ће аутоматски покушати да се охлади. И даље ћете моћи да користите телефон, али ће спорије реаговати.\n\nКада се телефон охлади, нормално ће радити." diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 8176422c8a7a..a277c12db79a 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -408,19 +408,25 @@ "Enhetsövervakning" "Profilövervakning" "Nätverksövervakning" + "VPN" + "Nätverksloggning" "Inaktivera VPN" "Koppla från VPN" - "Enheten hanteras av %1$s.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data som är kopplad till enheten och enhetens platsinformation. Kontakta administratören om du vill veta mer." + "Enheten hanteras av %1$s.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data med koppling till enheten och enhetens plats. Kontakta administratören om du vill veta mer." + "Du är ansluten till %1$s som kan övervaka din aktivitet på nätverket, inklusive e-postmeddelanden, appar och webbplatser." + " " + "Öppna VPN-inställningar" + "Administratören har aktiverat nätverksloggning som övervakar trafik på enheten.\n\nKontakta administratören om du vill veta mer." "Du har gett en app behörighet att upprätta en VPN-anslutning.\n\nAppen kan bevaka aktivitet på enheten och nätverket, inklusive e-post, appar och webbplatser." - "Enheten hanteras av %1$s.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data som är kopplad till enheten och enhetens platsinformation.\n\nDu är ansluten till ett VPN-nätverk som kan övervaka dina nätverksaktiviteter, inklusive e-post, appar och webbplatser.\n\nKontakta administratören om du vill veta mer." - "Jobbprofilen hanteras av %1$s.\n\nAdministratören kan bevaka aktiviteten på nätverket, inklusive e-post, appar och webbplatser.\n\nKontakta administratören för mer information.\n\nDu är även ansluten till ett VPN-nätverk som kan bevaka aktiviteten på nätverket." + "Enheten hanteras av %1$s.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data med koppling till enheten och enhetens plats.\n\nDu är ansluten till ett VPN som kan bevaka aktivitet på nätverket, exempelvis e-post, appar och webbplatser.\n\nKontakta administratören om du vill veta mer." + "Jobbprofilen hanteras av %1$s.\n\nAdministratören kan övervaka nätverksaktivitet, till exempel e-postmeddelanden, appar och webbplatser.\n\nKontakta administratören om du vill veta mer.\n\nDu är även ansluten till ett VPN som kan övervaka nätverksaktivitet." "VPN" "Du är ansluten till %1$s, som kan bevaka aktivitet på nätverket, inklusive e-post, appar och webbplatser." "Du är ansluten till %1$s, som kan bevaka din privata aktivitet på nätverket, inklusive e-post, appar och webbplatser." "Du är ansluten till %1$s som kan övervaka din privata aktivitet på nätverket, inklusive e-postmeddelanden, appar och webbplatser." - "Jobbprofilen hanteras av %1$s. Den är ansluten till %2$s, som kan hantera aktivitet på arbetsplatsens nätverk, inklusive e-post, appar och webbplatser.\n\nKontakta administratören för mer information." + "Jobbprofilen hanteras av %1$s. Den är ansluten till %2$s, som kan övervaka nätverksaktivitet på jobbet, till exempel e-postmeddelanden, appar och webbplatser.\n\nKontakta administratören om du vill veta mer." "Jobbprofilen hanteras av %1$s. Den är ansluten till %2$s, som kan hantera aktivitet på arbetsplatsens nätverk, inklusive e-post, appar och webbplatser.\n\nDu är även ansluten till %3$s, som kan hantera privat aktivitet på nätverket." - "Enheten hanteras av %1$s.\n\nAdministratören kan bevaka och hantera inställningar, företagsåtkomst, appar, data som är kopplad till enheten och enhetens platsuppgifter.\n\nDu är ansluten till %2$s, som kan övervaka aktivitet på nätverket, inklusive e-post. appar och webbplatser .\n\nKontakta administratören för mer information." + "Enheten hanteras av %1$s.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data med koppling till enheten och enhetens plats.\n\nDu är ansluten till %2$s som kan bevaka aktivitet på nätverket, exempelvis e-post, appar och webbplatser.\n\nKontakta administratören om du vill veta mer." "Enheten förblir låst tills du låser upp den manuellt" "Få aviseringar snabbare" "Visa dem innan du låser upp" @@ -431,7 +437,8 @@ "Utöka" "Komprimera" "Skärmen har fästs" - "Detta visar skärmen tills du lossar den. Tryck länge på Tillbaka om du vill lossa skärmen." + "Skärmen visas tills du lossar den. Tryck länge på Tillbaka och Översikt om du vill lossa skärmen." + "Skärmen visas tills du lossar den. Tryck länge på Översikt om du vill lossa skärmen." "OK" "Nej tack" "Vill du dölja %1$s?" @@ -652,4 +659,7 @@ "Ändra ordning på inställningarna." "Sida %1$d av %2$d" "Det går inte att tysta eller blockera aviseringar" + "Mobilen börjar bli varm" + "Vissa funktioner är begränsade medan mobilen svalnar" + "Mobilen försöker svalna automatiskt. Du kan fortfarande använda mobilen, men den kan vara långsammare än vanligt.\n\nMobilen fungerar som vanligt när den har svalnat." diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index f8b825ad868b..a716a786b58f 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -408,19 +408,25 @@ "Ufuatiliaji wa kifaa" "Ufuatiliaji wasifu" "Ufuatiliaji wa mtandao" + "VPN" + "Kumbukumbu ya Kuingia Mtandaoni" "Zima VPN" "Ondoa VPN" - "Kifaa chako kinasimamiwa na %1$s.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa kampuni, programu, data inayohusiana na kifaa chako, na maelezo ya mahali kilipo kifaa chako. Kwa maelezo zaidi, wasiliana na msimamizi wako." + "Kifaa chako kinadhibitiwa na %1$s.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa mashirika, programu, data inayohusiana na kifaa chako na maelezo ya eneo la kifaa chako. Kwa maelezo zaidi, wasiliana na msimamizi wako." + "Umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." + " " + "Fungua Mipangilio ya VPN" + "Msimamizi wako amewasha kumbukumbu ya kuingia mtandaoni ambayo hufuatilia shughuli kwenye kifaa chako.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako." "Uliruhusu programu iweke muunganisho wa VPN.\n\nProgramu hii inaweza kufuatilia shughuli za kifaa na mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." - "Kifaa chako kinasimamiwa na %1$s.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa kampuni, programu, data inayohusiana na kifaa chako, na maelezo ya mahali kilipo kifaa chako.\n\nUmeuganishwa kwenye VPN, ambayo inaweza kufuatilia shughuli ya mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti.\n\n Kwa maelezo zaidi, wasiliana na msimamizi wako." - "Wasifu wako wa kazini unasimamiwa na %1$s. \n\nMsimamizi wako ana uwezo wa kufuatilia shughuli ya mtandao wako ikiwa ni pamoja na barua pepe, programu, na tovuti. \n\nKwa maelezo zaidi, wasiliana na msimamizi wako.\n\nUmeunganishwa pia kwenye VPN, ambayo inaweza kufuatilia shughuli za mtandao wako." + "Kifaa chako kinadhibitiwa na %1$s.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa mashirika, programu, data inayohusiana na kifaa chako na maelezo ya eneo la kifaa chako.\n\nUmeunganishwa kwenye VPN, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako." + "Wasifu wako wa kazini unadhibitiwa na %1$s.\n\nMsimamizi wako anaweza kufuatilia shughuli za mtandaoni, ikiwa ni pamoja na barua pepe, programu na tovuti.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako.\n\nUmeunganishwa pia kwenye VPN, ambayo inaweza kufuatilia shughuli zako mtandaoni." "VPN" "Umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." "Umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." "Umeunganishwa kwenye %1$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti." - "Wasifu wako wa kazini unasimamiwa na %1$s. Wasifu huu umeunganishwa kwenye %2$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti. \n\nKwa maelezo zaidi, wasiliana na msimamizi wako." + "Wasifu wako wa kazini unadhibitiwa na %1$s. Umeunganishwa kwenye %2$s, ambayo inaweza kufuatilia shughuli zako za mtandaoni, ikiwa ni pamoja na barua pepe, programu na tovuti.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako." "Wasifu wako wa kazini unasimamiwa na %1$s. Wasifu huu umeunganishwa kwenye %2$s, ambayo inaweza kufuatilia mtandao wako wa kazini, ikiwa ni pamoja na barua pepe, programu na tovuti. \n\n Wewe pia umeunganishwa kwenye %3$s, ambayo inaweza kufuatilia shughuli za mtandao wako kibinafsi." - "Kifaa chako kinasimamiwa na %1$s. \n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa kampuni, programu, data inayohusiana na kifaa chako, na maelezo ya mahali kilipo kifaa chako. \n\n Umeuganishwa kwenye %2$s, ambayo inaweza kufuatilia shughuli ya mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti. \n\n Kwa maelezo zaidi, wasiliana na msimamizi wako." + "Kifaa chako kinadhibitiwa na %1$s.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa mashirika, programu, data inayohusiana na kifaa chako na maelezo ya eneo la kifaa chako.\n\nUmeunganishwa kwenye %2$s, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako." "Kifaa kitaendelea kuwa katika hali ya kufungwa hadi utakapokifungua mwenyewe" "Pata arifa kwa haraka" "Zitazame kabla hujafungua" @@ -431,7 +437,8 @@ "Panua" "Kunja" "Skrini imebandikwa" - "Utaendelea kuona hali hii hadi utakapobandua. Gusa na ushikilie kipengele cha Nyuma ili kubandua." + "Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Nyuma na Muhtasari ili ubandue." + "Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Muhtasari ili ubandue." "Nimeelewa" "Hapana, asante" "Ungependa kuficha %1$s?" @@ -460,7 +467,7 @@ "%1$s. Gonga ili ukomeshe. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia." "Inaonyesha %s ya vidhibiti vya sauti. Telezesha kidole juu ili uondoe." "Imeficha vidhibiti vya sauti" - "Kipokea Ishara cha SystemUI" + "Kirekebishi cha kiolesura cha mfumo" "Onyesha asilimia ya betri iliyopachikwa" "Onyesha asilimia ya kiwango cha betri ndani ya aikoni ya sehemu ya arifa inapokuwa haichaji" "Mipangilio ya Haraka" @@ -483,12 +490,12 @@ "Mtandao-hewa" "Wasifu wa kazini" "Kinafurahisha kwa baadhi ya watu lakini si wote" - "Kipokea Ishara cha System UI kinakupa njia zaidi za kugeuza na kubadilisha kiolesura cha Android ili kikufae. Vipengele hivi vya majaribio vinaweza kubadilika, kuharibika, au kupotea katika matoleo ya siku zijazo. Endelea kwa uangalifu." + "Kirekebishi cha kiolesura cha mfumo kinakupa njia zaidi za kugeuza na kubadilisha kiolesura cha Android ili kikufae. Vipengele hivi vya majaribio vinaweza kubadilika, kuharibika au kupotea katika matoleo ya siku zijazo. Endelea kwa uangalifu." "Vipengele hivi vya majaribio vinaweza kubadilika, kuharibika, au kupotea katika matoleo ya siku zijazo. Endelea kwa uangalifu." "Nimeelewa" - "Hongera! Kipokea Ishara cha System UI kimeongezwa kwenye Mipangilio" + "Hongera! Kirekebishi cha kiolesura cha mfumo kimeongezwa kwenye mipangilio" "Ondoa kwenye Mipangilio" - "Je, ungependa kuondoa Kipokea ishara cha SystemUI kwenye Mipangilio na uache kutumia vipengele vyake vyote?" + "Je, ungependa kuondoa Kirekebishi cha kiolesura cha mfumo kwenye mipangilio na uache kutumia vipengele vyake vyote?" "Programu haijasakinishwa kwenye kifaa chako" "Onyesha sekunde za saa" "Onyesha sekunde za saa katika sehemu ya arifa. Inaweza kuathiri muda wa matumizi ya betri." @@ -652,4 +659,7 @@ "Badilisha orodha ya mipangilio." "Ukurasa wa %1$d kati ya %2$d" "Huwezi kuzima wala kuzuia arifa" + "Joto la simu linaongezeka" + "Baadhi ya vipengele havitatumika kwenye simu wakati inapoa" + "Simu yako itajaribu kupoa kiotomatiki. Bado unaweza kutumia simu yako, lakini huenda ikafanya kazi polepole. \n\nPindi simu yako itakapopoa, itaendelea kufanya kazi kama kawaida." diff --git a/packages/SystemUI/res/values-sw900dp/config.xml b/packages/SystemUI/res/values-sw900dp/config.xml new file mode 100644 index 000000000000..d8f9ef4e9b2f --- /dev/null +++ b/packages/SystemUI/res/values-sw900dp/config.xml @@ -0,0 +1,24 @@ + + + + + + back,home;space;menu_ime,recent + + diff --git a/packages/SystemUI/res/values-sw900dp/dimens.xml b/packages/SystemUI/res/values-sw900dp/dimens.xml new file mode 100644 index 000000000000..2cff97692d9d --- /dev/null +++ b/packages/SystemUI/res/values-sw900dp/dimens.xml @@ -0,0 +1,31 @@ + + + + + 80dp + @dimen/button_size + @dimen/button_size + @dimen/button_size + + + 76dp + + + 0dp + + diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 0080f8e5301e..3b2c5d28c88f 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -408,19 +408,25 @@ "சாதனத்தைக் கண்காணித்தல்" "சுயவிவரத்தைக் கண்காணித்தல்" "நெட்வொர்க்கைக் கண்காணித்தல்" + "VPN" + "நெட்வொர்க் பதிவெடுத்தல்" "VPNஐ முடக்கு" "VPNஐத் துண்டி" - "சாதனத்தை நிர்வகிப்பவர்: %1$s.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும். கூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்." + "உங்கள் சாதனத்தை %1$s நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், பெருநிறுவன அணுகல், பயன்பாடுகள், உங்கள் சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவலைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும். மேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்." + "%1$s உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால் மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்." + " " + "VPN அமைப்புகளைத் திற" + "உங்கள் நிர்வாகி நெட்வொர்க் பதிவெடுத்தலை இயக்கியுள்ளார், இது சாதனத்தில் ட்ராஃபிக்கைக் கண்காணிக்கும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்." "VPN இணைப்பை அமைக்க, பயன்பாட்டிற்கு அனுமதி வழங்கியுள்ளீர்கள்.\n\nஇந்தப் பயன்பாட்டால் மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட, உங்கள் சாதனத்தையும் நெட்வொர்க் செயல்பாட்டையும் கண்காணிக்க முடியும்." - "சாதனத்தை நிர்வகிப்பவர்: %1$s.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nVPN இல் இணைக்கப்பட்டுள்ளதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் பாதுகாப்பான இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டை கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்." - "உங்கள் பணி சுயவிவரத்தை நிர்வகிப்பது: %1$s.\n\nமின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டை நிர்வாகியால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்.\n\nஉங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய VPN இலும் இணைக்கப்பட்டுள்ளீர்கள்." + "உங்கள் சாதனத்தை %1$s நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், பெருநிறுவன அணுகல், பயன்பாடுகள், உங்கள் சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனங்களின் இருப்பிடத் தகவலைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட, உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய VPN உடன் இணைக்கப்பட்டுள்ளீர்கள்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்." + "உங்கள் பணி விவரத்தை %1$s நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்.\n\nஉங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய VPN உடனும் இணைக்கப்பட்டுள்ளீர்கள்." "VPN" "%1$s உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்." "%1$s உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்." "%1$s உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால் மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்." - "உங்கள் பணி சுயவிவரத்தை %1$s நிர்வகிக்கிறது. %2$s உடன் இணைக்கப்பட்டதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் பணியிட நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்." + "உங்கள் பணி விவரத்தை %1$s நிர்வகிக்கிறது. மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய %2$s உடன் அது இணைக்கப்பட்டது.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்." "உங்கள் பணி சுயவிவரத்தை %1$s நிர்வகிக்கிறது. %2$s உடன் இணைக்கப்பட்டுள்ளதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் பணியிட நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nமேலும் %3$s உடன் இணைக்கப்பட்டுள்ளதால், உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டையும் அதனால் கண்காணிக்க முடியும்." - "சாதனத்தை நிர்வகிப்பது: %1$s.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\n%2$s உடன் இணைக்கப்பட்டதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்." + "உங்கள் சாதனத்தை %1$s நிர்வகிக்கிறது.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், பெருநிறுவன அணுகல், பயன்பாடுகள், உங்கள் சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவலைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nமின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட, உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய %2$s உடன் இணைக்கப்பட்டுள்ளீர்கள்.\n\nமேலும் தகவலுக்கு, உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்." "நீங்கள் கைமுறையாகத் திறக்கும் வரை, சாதனம் பூட்டப்பட்டிருக்கும்" "விரைவாக அறிவிப்புகளைப் பெறுதல்" "திறக்கும் முன் அவற்றைப் பார்க்கவும்" @@ -431,7 +437,8 @@ "விரிவாக்கு" "சுருக்கு" "திரை பொருத்தப்பட்டது" - "பொருத்தியதை விலக்கும் வரை இதைக் காட்சியில் வைக்கும். விலக்க, முந்தையது என்பதைத் தொட்டுப் பிடிக்கவும்." + "பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்." + "பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்." "புரிந்தது" "வேண்டாம்" "%1$sஐ மறைக்கவா?" @@ -652,4 +659,7 @@ "அமைப்புகளின் வரிசை முறையைத் திருத்து." "பக்கம் %1$d / %2$d" "அறிவிப்புகளை ஒலியடக்க அல்லது தடுக்க முடியவில்லை" + "மொபைல் சூடாகிறது" + "மொபைலின் வெப்ப அளவு குறையும் போது, சில அம்சங்களைப் பயன்படுத்த முடியாது" + "உங்கள் மொபைலின் வெப்ப அளவு தானாகவே குறையும். தொடர்ந்து நீங்கள் மொபைலைப் பயன்படுத்தலாம், ஆனால் அதன் வேகம் குறைவாக இருக்கக்கூடும்.\n\nமொபைலின் வெப்ப அளவு குறைந்தவுடன், அது இயல்பு நிலையில் இயங்கும்." diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index a1a85fc3ffc2..9fb732bbb96a 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -408,19 +408,25 @@ "పరికర పర్యవేక్షణ" "ప్రొఫైల్ పర్యవేక్షణ" "నెట్‌వర్క్ పర్యవేక్షణ" + "VPN" + "నెట్‌వర్క్ లాగింగ్‌" "VPNని నిలిపివేయి" "VPNను డిస్‌కనెక్ట్ చేయి" - "మీ పరికరం %1$s నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకుడు సెట్టింగ్‌లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, మీ పరికరంతో అనుబంధించబడిన డేటా మరియు మీ పరికరం స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు. మరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి." + "మీ పరికరం %1$s నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకులు మీ పరికరం అనుబంధిత సెట్టింగ్‌లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, డేటా మరియు స్థాన సమాచారం పర్యవేక్షించగలరు మరియు నిర్వహించగలరు. మరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి." + "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." + " " + "VPN సెట్టింగ్‌లను తెరవండి" + "మీ నిర్వాహకులు మీ పరికరంలోని ట్రాఫిక్‌ని పర్యవేక్షించగల నెట్‌వర్క్ లాగింగ్‌ని ఆన్ చేసారు.\n\nమరింత సమాచారం కావాలంటే, మీ నిర్వాహకులను సంప్రదించండి." "మీరు VPN కనెక్షన్ సెటప్ చేయడానికి ఒక అనువర్తనానికి అనుమతి ఇచ్చారు.\n\nఈ అనువర్తనం ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ పరికరం మరియు నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." - "మీ పరికరం %1$s నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకుడు సెట్టింగ్‌లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, మీ పరికరంతో అనుబంధించబడిన డేటా మరియు పరికరం స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమీరు VPNకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి." - "మీ కార్యాలయ ప్రొఫైల్‌ను %1$s నిర్వహిస్తోంది.\n\nమీ నిర్వాహకుడు ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలరు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి.\n\nమీరు VPNకి కూడా కనెక్ట్ చేయబడ్డారు, ఇది మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." + "మీ పరికరం %1$s నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకులు మీ పరికరం అనుబంధిత సెట్టింగ్‌లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, డేటా మరియు స్థాన సమాచారం పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమీరు VPNకు కనెక్ట్ చేయబడ్డారు, ఇది మీ ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో పాటు నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి." + "%1$s ద్వారా మీ కార్యాలయ ప్రొఫైల్ నిర్వహించబడుతోంది.\n\nఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగల సామర్థ్యం మీ నిర్వాహకులకు ఉంది.\n\nమరింత సమాచారం కావాలంటే, మీ నిర్వాహకులను సంప్రదించండి.\n\nమీరు VPNకి కూడా కనెక్ట్ అయ్యారు, ఇది మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." "VPN" "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌‍సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." "మీరు %1$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." - "మీ కార్యాలయ ప్రొఫైల్‌ను %1$s నిర్వహిస్తోంది. అలాగే, మీ కార్యాలయ ప్రొఫైల్ %2$sకి కనెక్ట్ చేయబడింది, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి." + "%1$s ద్వారా మీ కార్యాలయ ప్రొఫైల్ నిర్వహించబడుతోంది. ఇది %2$sకు కనెక్ట్ చేయబడింది, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కావాలంటే, మీ నిర్వాహకులను సంప్రదించండి." "మీ కార్యాలయ ప్రొఫైల్‌ను %1$s నిర్వహిస్తోంది. అలాగే, మీ కార్యాలయ ప్రొఫైల్ %2$sకి కనెక్ట్ చేయబడింది, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ కార్యాలయ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమీరు %3$sకి కూడా కనెక్ట్ చేయబడ్డారు, ఇది మీ వ్యక్తిగత నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు." - "మీ పరికరాన్ని %1$s నిర్వహిస్తోంది.\n\nమీ నిర్వాహకుడు సెట్టింగ్‌లను, కార్పొరేట్ ప్రాప్యతను, అనువర్తనాలను, మీ పరికరంతో అనుబంధించిన డేటాను మరియు మీ పరికర స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమీరు %2$sకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో సహా మీ నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి." + "మీ పరికరం %1$s నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకులు మీ పరికరం అనుబంధిత సెట్టింగ్‌లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, డేటా మరియు స్థాన సమాచారం పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమీరు %2$sకు కనెక్ట్ చేయబడ్డారు, ఇది మీ ఇమెయిల్‌లు, అనువర్తనాలు మరియు వెబ్‌సైట్‌లతో పాటు నెట్‌వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి." "మీరు మాన్యువల్‌గా అన్‌లాక్ చేస్తే మినహా పరికరం లాక్ చేయబడి ఉంటుంది" "నోటిఫికేషన్‌లను వేగంగా పొందండి" "వీటిని మీరు అన్‌లాక్ చేయకముందే చూడండి" @@ -431,7 +437,8 @@ "విస్తరింపజేయండి" "కుదించండి" "స్క్రీన్ పిన్ చేయబడింది" - "ఇలా చేయడం వలన మీరు అన్‌పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్‌పిన్ చేయడానికి వెనుకకు తాకి, అలాగే పట్టుకోండి." + "దీని వలన మీరు అన్‌పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్‌పిన్ చేయడానికి వెనుకకు మరియు స్థూలదృష్టి తాకి & అలాగే పట్టుకోండి." + "దీని వలన మీరు అన్‌పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్‌పిన్ చేయడానికి స్థూలదృష్టిని తాకి & అలాగే పట్టుకోండి." "అర్థమైంది" "వద్దు, ధన్యవాదాలు" "%1$sని దాచాలా?" @@ -652,4 +659,7 @@ "సెట్టింగ్‌ల క్రమాన్ని సవరించండి." "%2$dలో %1$dవ పేజీ" "నోటిఫికేషన్‌లను నిశ్శబ్దంగా ఉంచలేరు లేదా బ్లాక్ చేయలేరు" + "ఫోన్ వేడెక్కుతోంది" + "ఫోన్‌ను చల్లబరిచే క్రమంలో కొన్ని లక్షణాలు పరిమితం చేయబడ్డాయి" + "మీ ఫోన్ స్వయంచాలకంగా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్‌ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది." diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 805431d51258..7d8e9eeafddb 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -408,19 +408,25 @@ "การตรวจสอบอุปกรณ์" "การตรวจสอบโปรไฟล์" "การตรวจสอบเครือข่าย" + "VPN" + "การทำบันทึกเครือข่าย" "ปิดใช้ VPN" "ยกเลิกการเชื่อมต่อ VPN" - "อุปกรณ์ของคุณได้รับการจัดการโดย %1$s\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ของคุณ และข้อมูลตำแหน่งของอุปกรณ์ สำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ" + "อุปกรณ์ของคุณได้รับการจัดการโดย %1$s\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงขององค์กร แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์ โปรดติดต่อผู้ดูแลระบบสำหรับข้อมูลเพิ่มเติม" + "คุณเชื่อมต่อกับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้" + " " + "เปิดการตั้งค่า VPN" + "ผู้ดูแลระบบได้เปิดการทำบันทึกเครือข่าย ซึ่งจะติดตามดูการรับส่งข้อมูลบนอุปกรณ์ของคุณ\n\nโปรดติดต่อผู้ดูแลระบบสำหรับข้อมูลเพิ่มเติม" "คุณได้ให้สิทธิ์แอปในการตั้งค่าการเชื่อมต่อ VPN\n\nแอปนี้จะสามารถตรวจสอบอุปกรณ์และกิจกรรมในเครือข่าย รวมถึงอีเมล แอป และเว็บไซต์ได้" - "อุปกรณ์ของคุณได้รับการจัดการโดย %1$s\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ของคุณ และข้อมูลตำแหน่งของอุปกรณ์\n\nคุณยังได้เชื่อมต่อกับ VPN ซึ่งสามารถตรวจสอบกิจกรรมเครือข่ายของคุณ รวมถึง อีเมล แอป และเว็บไซต์\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ" - "โปรไฟล์งานได้รับการจัดการโดย %1$s\n\nผู้ดูแลระบบของคุณสามารถตรวจสอบกิจกรรมในเครือข่ายรวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ\n\nนอกจากนี้คุณยังมีการเชื่อมต่อ VPN ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ" + "อุปกรณ์ของคุณได้รับการจัดการโดย %1$s\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงขององค์กร แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์\n\nขณะนี้คุณเชื่อมต่อกับ VPN ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ ซึ่งรวมถึงอีเมล แอป และเว็บไซต์ต่างๆ\n\nโปรดติดต่อผู้ดูแลระบบสำหรับข้อมูลเพิ่มเติม" + "โปรไฟล์งานของคุณได้รับการจัดการโดย %1$s\n\nผู้ดูแลระบบสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ ซึ่งรวมถึงอีเมล แอป และเว็บไซต์ต่างๆ\n\nโปรดติดต่อผู้ดูแลระบบสำหรับข้อมูลเพิ่มเติม\n\nนอกจากนี้คุณยังเชื่อมต่อกับ VPN ซึ่งตรวจสอบกิจกรรมในเครือข่ายของคุณได้" "VPN" "คุณเชื่อมต่อกับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้" "คุณเชื่อมต่อกับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้" "คุณเชื่อมต่อกับ %1$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้" - "โปรไฟล์งานได้รับการจัดการโดย %1$s โดยมีการเชื่อมต่อกับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่าย รวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ" + "โปรไฟล์งานของคุณได้รับการจัดการโดย %1$s โปรไฟล์ดังกล่าวเชื่อมโยงกับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายงานของคุณ ซึ่งรวมถึงอีเมล แอป และเว็บไซต์ต่างๆ\n\nโปรดติดต่อผู้ดูแลระบบสำหรับข้อมูลเพิ่มเติม" "โปรไฟล์งานได้รับการจัดการโดย %1$s โดยมีการเชื่อมต่อกับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่าย รวมถึงอีเมล แอป และเว็บไซต์ได้\n\nนอกจากนี้ คุณยังเชื่อมต่อกับ %3$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวได้" - "อุปกรณ์ได้รับการจัดการโดย %1$s\n\nผู้ดูและรบบของคุณสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์ได้\n\nคุณมีการเชื่อมต่อกับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายรวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ" + "อุปกรณ์ของคุณได้รับการจัดการโดย %1$s\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงขององค์กร แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์\n\nขณะนี้คุณเชื่อมต่อกับ %2$s ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ ซึ่งรวมถึงอีเมล แอป และเว็บไซต์ต่างๆ\n\nโปรดติดต่อผู้ดูแลระบบสำหรับข้อมูลเพิ่มเติม" "อุปกรณ์จะล็อกจนกว่าคุณจะปลดล็อกด้วยตนเอง" "รับการแจ้งเตือนเร็วขึ้น" "ดูก่อนปลดล็อก" @@ -431,7 +437,8 @@ "ขยาย" "ยุบ" "ตรึงหน้าจอแล้ว" - "การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" ค้างไว้เพื่อเลิกตรึง" + "การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง" + "การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง" "รับทราบ" "ไม่เป็นไร ขอบคุณ" "ซ่อน %1$s ไหม" @@ -652,4 +659,7 @@ "แก้ไขลำดับการตั้งค่า" "หน้า %1$d จาก %2$d" "ไม่สามารถปิดเสียงหรือบล็อกการแจ้งเตือน" + "โทรศัพท์เริ่มเครื่องร้อน" + "คุณลักษณะบางอย่างจะใช้งานได้จำกัดขณะโทรศัพท์ลดอุณหภูมิลง" + "โทรศัพท์จะพยายามลดอุณหภูมิลงโดยอัตโนมัติ คุณยังสามารถใช้โทรศัพท์ได้ แต่โทรศัพท์อาจทำงานช้าลง\n\nโทรศัพท์จะทำงานตามปกติเมื่อเย็นลงแล้ว" diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 89af1894a798..c38a08cabe40 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -408,19 +408,25 @@ "Pagsubaybay sa device" "Pagsubaybay sa Profile" "Pagsubaybay sa network" + "VPN" + "Pag-log sa Network" "I-disable ang VPN" "Idiskonekta ang VPN" - "Pinapamahalaan ang iyong device ng %1$s.\n\nMagagawa ng iyong administrator na subaybayan at pamahalaan ang iyong mga setting, corporate na access, mga app, data na nauugnay sa iyong device at ang impormasyon ng lokasyon ng iyong device. Para sa higit pang impormasyon, makipag-ugnayan sa iyong administrator." + "Pinamamahalaan ng %1$s ang iyong device.\n\nMasusubaybayan at mapapamahalaan ng iyong admin ang mga setting, access ng kumpanya, mga app, data na nauugnay sa device mo at impormasyon ng lokasyon ng iyong device. Para sa higit pang impormasyon, makipag-ugnayan sa iyong admin." + "Kumonekta ka sa %1$s, na maaaring sumubaybay sa iyong aktibidad sa network, kasama ang mga email, app at website." + " " + "Buksan ang Mga Setting ng VPN" + "Na-on ng iyong admin ang pag-log sa network, na sumusubaybay sa trapiko ng device mo.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong admin." "Nagbigay ka ng pahintulot sa app upang mag-set up ng VPN na koneksyon.\n\nMaaaring subaybayan ng app na ito ang iyong aktibidad sa device at network, kabilang ang mga email, app at website." - "Pinapamahalaan ang iyong device ng %1$s.\n\nMagagawa ng iyong administrator na subaybayan at pamahalaan ang iyong mga setting, corporate na access, mga app, data na nauugnay sa iyong device at ang impormasyon ng lokasyon ng iyong device.\n\nNakakonekta ka sa isang VPN, na maaaring subaybayan ang iyong aktibidad sa network, kasama ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator." - "Pinapamahalaan ang iyong profile ng %1$s.\n\nMay kakayahan ang iyong administrator sa pagsubaybay ng iyong aktibidad sa network kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator.\n\nNakakonekta ka rin sa isang VPN, na maaaring sumubaybay sa iyong aktibidad sa network." + "Pinamamahalaan ng %1$s ang iyong device.\n\nMasusubaybayan at mapapamahalaan ng iyong admin ang mga setting, access ng kumpanya, mga app, data na nauugnay sa device mo at impormasyon ng lokasyon ng iyong device.\n\nNakakonekta ka sa isang VPN, na magagawang sumubaybay sa aktibidad mo sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong admin." + "Pinamamahalaan ng %1$s ang iyong profile sa trabaho.\n\nMay kakayahan ang admin mo na subaybayan ang iyong aktibidad sa network, kasama ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa admin mo.\n\nNakakonekta ka rin sa isang VPN, na may kakayahang subaybayan ang iyong aktibidad sa network." "VPN" "Nakakonekta ka sa %1$s, na maaaring sumubaybay sa iyong aktibidad sa network kabilang ang mga email, app at website." "Nakakonekta ka sa %1$s, na maaaring sumubaybay sa iyong personal na aktibidad sa network, kabilang ang mga email, app at website." "Nakakonekta ka sa %1$s, na maaaring sumubaybay sa aktibidad sa iyong personal na network, kabilang ang mga email, app at website." - "Ang iyong profile sa trabaho ay pinapamahalaan ng %1$s. Nakakonekta ito sa %2$s, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator." + "Pinamamahalaan ng %1$s ang iyong profile sa trabaho. Nakakonekta ito sa %2$s, na may kakayahang subaybayan ang aktibidad mo sa network sa trabaho, kasama ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong admin." "Ang iyong profile sa trabaho ay pinapamahalaan ng %1$s. Nakakonekta ito sa %2$s, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nNakakonekta ka rin sa %3$s, na maaaring sumubaybay sa iyong personal na aktibidad sa network." - "Pinapamahalaan ang iyong device ng %1$s.\n\nMaaaring subaybayan at pamahalaan ng iyong administrator ang mga setting, corporate na access, app, data na nauugnay sa iyong device at ang impormasyon ng lokasyon ng iyong device.\n\nNakakonekta ka sa %2$s, na maaaring subaybayan ang iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator." + "Pinamamahalaan ng %1$s ang iyong device.\n\nMasusubaybayan at mapapamahalaan ng iyong admin ang mga setting, access ng kumpanya, mga app, data na nauugnay sa device mo at impormasyon ng lokasyon ng iyong device.\n\nNakakonekta ka sa %2$s, na magagawang subaybayan ang aktibidad mo sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong admin." "Mananatiling naka-lock ang device hanggang sa manu-mano mong i-unlock" "Kunin ang notification nang mas mabilis" "Tingnan ang mga ito bago ka mag-unlock" @@ -431,7 +437,8 @@ "Palawakin" "I-collapse" "Naka-pin ang screen" - "Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik upang mag-unpin." + "Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Overview upang mag-unpin." + "Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Overview upang mag-unpin." "Nakuha ko" "Hindi, salamat na lang" "Itago ang %1$s?" @@ -652,4 +659,7 @@ "I-edit ang pagkakasunud-sunod ng mga setting." "Page %1$d ng %2$d" "Hindi maaaring i-silent o i-block ang mga notification" + "Umiinit ang telepono" + "Limitado ang ilang feature habang nagku-cool down ang telepono" + "Awtomatikong susubukan ng iyong telepono na mag-cool down. Magagamit mo pa rin ang iyong telepono, ngunit maaaring mas mabagal ang paggana nito.\n\nKapag nakapag-cool down na ang iyong telepono, gagana na ito nang normal." diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index c17e9fc3cbe8..9023038afac1 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -408,19 +408,25 @@ "Cihaz izleme" "Profil izleme" "Ağ izleme" + "VPN" + "Ağ Günlük Kaydı" "VPN\'yi devre dışı bırak" "VPN bağlantısını kes" - "Cihazınız %1$s tarafından yönetiliyor.\n\nYöneticiniz; cihazınızla ilişkilendirilen ayarları, şirket erişimini, uygulamaları, verileri izleyebilir ve yönetebilir. Daha fazla bilgi için yöneticinize başvurun." + "Cihazınız %1$s tarafından yönetiliyor.\n\nYöneticiniz ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkili verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir. Daha fazla bilgi için yöneticinizle iletişim kurun." + "E-postalarınız, uygulamalarınız ve web siteleriniz de dahil olmak üzere ağ etkinliğinizi takip edebilen %1$s ağına bağlısınız." + " " + "VPN Ayarlarını aç" + "Yöneticiniz,cihazınızdaki trafiği izleyen ağ günlük kaydını açtı.\n\nDaha fazla bilgi için yöneticinizle iletişim kurun." "VPN bağlantısı kurması için bir uygulamaya izin verdiniz.\n\nBu uygulama, cihazınızın yanı sıra e-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilir." - "Cihazınız %1$s tarafından yönetiliyor.\n\nYöneticiniz cihazınızla ilişkilendirilen ayarları, şirket erişimini, uygulamaları, verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nE-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilen bir VPN\'ye bağlısınız.\n\nDaha fazla bilgi için lütfen yöneticinize başvurun." - "Cihazınız %1$s tarafından yönetiliyor.\n\nYöneticiniz; e-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilir.\n\nDaha fazla bilgi edinmek için yöneticinizle iletişim kurun.\n\nAyrıca ağ etkinliğinizi izleyebilen bir VPN\'ye bağlısınız." + "Cihazınız %1$s tarafından yönetiliyor.\n\nYöneticiniz ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkili verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nE-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilen bir VPN\'ye bağlısınız.\n\nDaha fazla bilgi için yöneticinizle iletişim kurun." + "İş profiliniz %1$s tarafından yönetiliyor.\n\nYöneticiniz e-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilir.\n\nDaha fazla bilgi için yöneticinizle iletişim kurun.\n\nAyrıca, ağ etkinliğinizi izleyebilen bir VPN\'ye de bağlısınız." "VPN" "E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen %1$s uygulamasına bağlısınız." "E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere kişisel ağ etkinliğinizi izleyebilen %1$s uygulamasına bağlısınız." "E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere kişisel ağ etkinliğinizi izleyebilen %1$s uygulamasına bağlısınız." - "İş profiliniz %1$s tarafından yönetiliyor. E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen %2$s uygulamasına bağlı.\n\nDaha fazla bilgi için yöneticinizle iletişim kurun." + "İş profiliniz %1$s tarafından yönetiliyor. Profiliniz e-postalar, uygulamalar ve web siteleri dahil olmak üzere ağ etkinliğinizi izleyebilen %2$s uygulamasına bağlı.\n\nDaha fazla bilgi için yöneticinizle iletişim kurun." "İş profiliniz %1$s tarafından yönetiliyor. E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen %2$s uygulamasına bağlı.\n\n Ayrıca kişisel ağ etkinliğinizi izleyebilen %3$s uygulamasına bağlısınız." - "Cihazınız %1$s tarafından yönetiliyor.\n\nYöneticiniz; ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkilendirilmiş verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nE-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen %2$s uygulamasına bağlısınız.\n\nDaha fazla bilgi edinmek için yöneticinizle iletişim kurun." + "Cihazınız %1$s tarafından yönetiliyor.\n\nYöneticiniz ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkili verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nE-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilen %2$s uygulamasına bağlısınız.\n\nDaha fazla bilgi için yöneticinizle iletişim kurun." "Cihazınızın kilidini manuel olarak açmadıkça cihaz kilitli kalacak" "Bildirimleri daha hızlı alın" "Kilidi açmadan bildirimleri görün" @@ -431,7 +437,8 @@ "Genişlet" "Daralt" "Ekran sabitlendi" - "Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye dokunun ve basılı tutun." + "Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Genel Bakış\'a dokunup basılı tutun." + "Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Genel bakış\'a dokunup basılı tutun." "Anladım" "Hayır, teşekkürler" "%1$s gizlensin mi?" @@ -652,4 +659,7 @@ "Ayarların sırasını düzenle." "Sayfa %1$d / %2$d" "Bildirimler engellenemez veya sesi kapatılamaz" + "Telefon ısınıyor" + "Telefon soğurken bazı özellikler sınırlı olarak kullanılabilir" + "Telefonunuz otomatik olarak soğumaya çalışacak. Bu sırada telefonunuzu kullanmaya devam edebilirsiniz ancak uygulamalar daha yavaş çalışabilir.\n\nTelefonunuz soğuduktan sonra normal şekilde çalışacaktır." diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 92f137211f86..c023a4ddb62e 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -414,19 +414,25 @@ "Відстеження дій на пристрої" "Відстеження профілю" "Відстеження дій у мережі" + "Мережа VPN" + "Реєстрація в мережі" "Вимкнути VPN" "Від’єднатися від мережі VPN" - "Вашим пристроєм керує %1$s.\n\nАдміністратор може відстежувати та контролювати налаштування, корпоративний доступ, додатки й дані, пов’язані з вашим пристроєм, а також геодані пристрою. Зв’яжіться з адміністратором, щоб дізнатися більше." + "Вашим пристроєм керує адміністратор організації %1$s.\n\nВін може відстежувати та контролювати налаштування, корпоративний доступ, додатки й дані, зв’язані з цим пристроєм, зокрема інформацію про його місцезнаходження. Щоб дізнатися більше, зв’яжіться з адміністратором." + "Під’єднано додаток %1$s, який може відстежувати вашу активність у мережі, як-от доступ до електронної пошти, додатків і веб-сайтів." + " " + "Відкрити налаштування мережі VPN" + "Ваш адміністратор увімкнув реєстрацію в мережі, під час якої на вашому пристрої відстежується трафік.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором." "Ви дозволили додатку під’єднуватися до мережі VPN.\n\nЦей додаток може відстежувати вашу активність на пристрої та в мережі, зокрема в електронній пошті, додатках і на веб-сайтах." - "Вашим пристроєм керує %1$s.\n\nАдміністратор може відстежувати та контролювати налаштування, корпоративний доступ, додатки й дані, пов’язані з вашим пристроєм, а також геодані пристрою.\n\nПристрій під’єднано до мережі VPN, постачальник послуг якої може відстежувати вашу активність у мережі, зокрема листування, роботу в додатках і на сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше." - "Вашим пристроєм керує організація %1$s.\n\nАдміністратор може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше.\n\nПристрій під’єднано до мережі VPN, у якій ваша активність може відстежуватись." + "Вашим пристроєм керує адміністратор організації %1$s.\n\nВін може відстежувати та контролювати налаштування, корпоративний доступ, додатки й дані, зв’язані з цим пристроєм, зокрема інформацію про його місцезнаходження.\n\nПристрій під’єднано до мережі VPN, у якій можна відстежувати активність у мережі, зокрема електронні листи, додатки та веб-сайти.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором." + "Вашим робочим профілем керує адміністратор організації %1$s.\n\nВін може відстежувати ваші дії в мережі, зокрема електронні листи, додатки та веб-сайти.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором.\n\nВаш пристрій також під’єднано до мережі VPN, у якій можна відстежувати ваші дії в мережі." "VPN" "Ваш профіль під’єднано до додатка %1$s, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах." "Ваш профіль під’єднано до додатка %1$s, який може відстежувати вашу особисту активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах." "Ваш профіль під’єднано до додатка %1$s, який може відстежувати вашу особисту активність у мережі, зокрема доступ до електронної пошти, додатків і веб-сайтів." - "Вашим робочим профілем керує %1$s. Профіль під’єднано до додатка %2$s, який може відстежувати вашу робочу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше." + "Вашим робочим профілем керує адміністратор організації %1$s. Профіль зв’язано з додатком %2$s, у якому можна відстежувати ваші дії в мережі, зокрема електронні листи, додатки та веб-сайти.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором." "Вашим робочим профілем керує %1$s. Профіль під’єднано до додатка %2$s, який може відстежувати вашу робочу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nВаш профіль також під’єднано до додатка %3$s, який може відстежувати вашу особисту активність у мережі." - "Вашим пристроєм керує організація %1$s.\n\nАдміністратор може відстежувати та контролювати налаштування, корпоративний доступ, додатки, геодані й інші дані, пов’язані з вашим пристроєм.\n\nВаш профіль під’єднано до додатка %2$s, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше." + "Вашим пристроєм керує адміністратор організації %1$s.\n\nВін може відстежувати та контролювати налаштування, корпоративний доступ, додатки й дані, зв’язані з цим пристроєм, зокрема інформацію про його місцезнаходження.\n\nПристрій під’єднано до додатка %2$s, у якому можна відстежувати активність у мережі, зокрема електронні листи, додатки та веб-сайти.\n\nЩоб дізнатися більше, зв’яжіться з адміністратором." "Пристрій залишатиметься заблокованим, доки ви не розблокуєте його вручну" "Швидше отримуйте сповіщення" "Переглядайте сповіщення, перш ніж розблокувати екран" @@ -437,7 +443,8 @@ "Розгорнути" "Згорнути" "Екран закріплено" - "Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і утримуйте кнопку \"Назад\"." + "Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопки \"Назад\" та \"Огляд\"." + "Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопку \"Огляд\"." "Зрозуміло" "Ні, дякую" "Сховати %1$s?" @@ -658,4 +665,7 @@ "Змінити порядок налаштувань." "Сторінка %1$d з %2$d" "Сповіщення не можна вимкнути або заблокувати" + "Телефон нагрівається" + "Під час охолодження деякі функції обмежуються" + "Ваш телефон охолоджуватиметься автоматично. Ви можете далі користуватися телефоном, але він може працювати повільніше.\n\nКоли телефон охолоне, він працюватиме належним чином." diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index b7b87eb29902..3a1cafb97a2f 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -408,19 +408,25 @@ "آلہ کو مانیٹر کرنا" "پروفائل کو مانیٹر کرنا" "نیٹ ورک کو مانیٹر کرنا" + "VPN" + "نیٹ ورک لاگنگ" "‏VPN کو غیر فعال کریں" "‏VPN کو غیر منسلک کریں" - "آپ کے آلہ کا نظم کیا جاتا ہے بذریعہ %1$s۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔ مزید معلومات کیلئے، اپنے منتظم سے رابطہ کریں۔" + "آپ کا آلہ %1$s کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلے سے وابستہ ڈیٹا اور آپ کے آلے کے مقام کی معلومات کی نگرانی اور ان کا نظم کر سکتا ہے۔ مزید معلومات کیلئے، اپنے منتظم سے رابطہ کریں۔" + "آپ %1$s سے منسلک ہیں جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" + " " + "‏VPN کی ترتیبات کھولیں" + "آپ کے ایڈمن نے نیٹ ورک لاگنگ آن کر دی ہے، جو آپ کے آلہ پر ٹریفک کو مانیٹر کرتی ہے۔\n\nمزید معلومات کیلئے اپنے ایڈمن سے رابطہ کریں۔" "‏آپ نے ایک ایپ کو VPN کنکشن ترتیب دینے کی اجازت دی ہے۔\n\nیہ ایپ ای میلز، ایپس اور ویب سائٹس سمیت آپ کے آلہ اور نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" - "‏آپ کے آلہ کا نظم کیا جاتا ہے بذریعہ %1$s۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nآپ ایک VPN سے منسلک ہیں، جو ای میلز، ایپس اور محفوظ ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتا ہے۔\n\nمزید معلومات کیلئے، اپنے منتظم سے رابطہ کریں۔" - "‏آپ کا دفتری پروفائل %1$s کے زیر انتظام ہے۔\n\nآپ کا منتظم ای میلز، ایپس اور ویب سائٹس سیمت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتا ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔\n\nآپ ایک VPN سے بھی منسلک ہیں، جو آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتا ہے۔" + "‏آپ کا آلہ %1$s کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلے سے وابستہ ڈیٹا اور آپ کے آلے کے مقام کی معلومات کی نگرانی اور ان کا نظم کر سکتا ہے۔\n\nآپ ایک VPN سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی کی نگرانی کر سکتا ہے۔\n\nمزید معلومات کیلئے، اپنے منتظم سے رابطہ کریں۔" + "‏آپ کی دفتری پروفائل %1$s کے زیر نظم ہے۔\n\nآپ کا ایڈمن بشمول ای میلز، ایپس، اور ویب سائٹس، آپ کے نیٹ ورک کی سرگرمی کو مانیٹر کرنے کا اہل ہے۔\n\nمزید معلومات کے لیے اپنے ایڈمن سے رابطہ کریں۔\n\nآپ ایک VPN سے بھی منسلک ہیں، جو آپ کے نیٹ ورک کی سرگرمی کو مانیٹر کر سکتا ہے۔" "VPN" "آپ %1$s سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" "آپ %1$s سے منسلک ہیں، جو آپ کے نجی نیٹ ورک کی سرگرمی سمیت ای میلز، ایپس اور ویب سائٹس مانیٹر کر سکتی ہے۔" "آپ %1$s سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نجی نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔" - "آپ کا دفتری پروفائل %1$s کے زیر انتظام ہے۔ یہ %2$s سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔" + "آپ کی دفتری پروفائل %1$s کے زیر نظم ہے۔ یہ %2$s سے منسلک ہے، جو بشمول ای میلز، ایپس اور ویب سائٹس، آپ کے دفتری نیٹ ورک کی سرگرمی کو مانیٹر کر سکتی ہے۔ \n\nمزید معلومات کے لیے، اپنے ایڈمن سے رابطہ کریں۔" "آپ کا دفتری پروفائل %1$s کے زیر انتظام ہے۔ یہ %2$s سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nآپ %3$s سے بھی منسلک ہیں، جو آپ کے نجی نیٹ ورک کی سرگرمی کو مانیٹر کر سکتی ہے۔" - "آپ کا آلہ %1$s کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nآپ %2$s سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔" + "آپ کا آلہ %1$s کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلے سے وابستہ ڈیٹا اور آپ کے آلے کے مقام کی معلومات کی نگرانی اور ان کا نظم کر سکتا ہے۔\n\nآپ %2$s سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی کی نگرانی کر سکتی ہے۔\n\nمزید معلومات کیلئے، اپنے منتظم سے رابطہ کریں۔" "آلہ اس وقت تک مقفل رہے گا جب تک آپ دستی طور پر اسے غیر مقفل نہ کریں" "تیزی سے اطلاعات حاصل کریں" "غیر مقفل کرنے سے پہلے انہیں دیکھیں" @@ -431,7 +437,8 @@ "پھیلائیں" "سکیڑیں" "اسکرین پن کردہ ہے" - "یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے پیچھے بٹن کو ٹچ کریں اور دبائے رکھیں۔" + "یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے پیچھے اور مجموعی جائزہ بٹنز کو ٹچ کریں اور دبائے رکھیں۔" + "یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے مجموعی جائزہ بٹن کو ٹچ کریں اور دبائے رکھیں۔" "سمجھ آ گئی" "نہیں شکریہ" "%1$s کو چھپائیں؟" @@ -456,8 +463,8 @@ "‏‎%1$s۔ آواز چالو کرنے کیلئے تھپتھپائیں۔" - "‏‎%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔ Accessibility سروسز شاید خاموش ہوں۔" - "‏‎%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔ Accessibility سروسز شاید خاموش ہوں۔" + "‏‎%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔" + "‏‎%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔" "‏%s والیوم کے کنٹرولز دکھائے جا رہے ہیں۔ برخاست کرنے کیلئے سوائپ کریں۔" "والیوم کے کنٹرولز مخفی ہیں" "‏سسٹم UI ٹیونر" @@ -652,4 +659,7 @@ "ترتیبات کی ترتیب میں ترمیم کریں۔" "صفحہ %1$d از %2$d" "اطلاعات کو خاموش یا مسدود نہیں کیا جا سکتا" + "فون گرم ہو رہا ہے" + "فون کے ٹھنڈے ہو جانے تک کچھ خصوصیات محدود ہیں" + "آپ کا فون خودکار طور پر ٹھنڈا ہونے کی کوشش کرے گا۔ آپ ابھی بھی اپنا فون استعمال کر سکتے ہیں، مگر ہو سکتا ہے یہ سست چلے۔\n\nایک بار آپ کا فون ٹھنڈا ہوجائے تو یہ معمول کے مطابق چلے گا۔" diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 61195c587bc0..5b0806ed803c 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -410,19 +410,25 @@ "Qurilmalarni kuzatish" "Profilni kuzatish" "Tarmoqlarni kuzatish" + "VPN" + "Tarmoq jurnali" "VPN tarmog‘ini o‘chirish" "VPN ulanishini uzish" - "Qurilmangiz %1$s tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlari hamda unga bog‘liq boshqa ma’lumotlarni boshqarishi mumkin. Ko‘proq ma’lumot olish uchun administrator bilan bog‘laning." + "Qurilmangiz %1$s tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlari hamda unga bog‘liq boshqa ma’lumotlarni boshqarishi mumk. Ko‘proq ma’lumot olish uchun administrator bilan bog‘laning." + "%1$s ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." + " " + "VPN sozlamalarini ochish" + "Administrator qurilmangizdagi trafikni nazorat qiluvchi tarmoq jurnalini yoqdi.\n\nBatafsil ma’lumot olish uchun administratoringizga murojaat qiling." "Siz ilovaga VPN tarmog‘iga ulanishga ruxsat bergansiz.\n\nUshbu ilova qurilmangiz va internetdagi harakatlaringizni, jumladan, e-pochta, ilovalar va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." - "Qurilmangiz %1$s tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlarini boshqarishi mumkin.\n\nShuningdek, siz Internetdagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlar bilan ishlashingizni kuzata oladigan VPN tarmog‘iga ham ulangansiz.\n\nKo‘proq ma’lumot olish uchun administrator bilan bog‘laning." - "Sizning ishchi profilingiz %1$s tomonidan boshqariladi.\n\nAdministrator internetdagi harakatlaringizni, jumladan, e-pochta, ilova va xavfsiz veb-saytlar bilan ishlashingizni kuzatishi mumkin.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning.\n\nShuningdek, siz VPN tarmog‘iga ham ulangansiz. U internetdagi harakatlaringizni kuzatishi mumkin." + "Qurilmangiz %1$s tomonidan boshqariladi.\n\nYAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlarini boshqarishi mumkin.\n\nShuningdek, siz Internetdagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlar bilan ishlashingizni kuzata oladigan VPN tarmog‘iga ham ulangansiz.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning." + "Sizning ishchi profilingiz %1$s tomonidan boshqariladi.\n\nAdministrator internetdagi harakatlaringizni, jumladan, e-pochta, ilova va xavfsiz veb-saytlar bilan ishlashingizni kuzatishi mumkin.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning.\n\nShuningdek, siz VPN tarmog‘iga ham ulangansiz. U internetdagi harakatlaringizni kuzatishi mumkin." "VPN" "%1$s ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." "%1$s ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." "%1$s ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin." - "Sizning ishchi profilingiz %1$s tomonidan boshqariladi. %2$s ilovasi ish tarmog‘idagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning." + "Sizning ishchi profilingiz %1$s tomonidan boshqariladi. %2$s ilovasi ish tarmog‘idagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning." "Sizning ishchi profilingiz %1$s tomonidan boshqariladi. %2$s ilovasi ish tarmog‘idagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nShuningdek, %3$s ilovasi ham shaxsiy tarmoqdagi harakatlaringizni kuzatishi mumkin." - "Qurilmangiz %1$s tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlarini boshqarishi mumkin.\n\nShuningdek, siz %2$s ilovasiga ham ulangansiz. Ushbu ilova internetdagi harakatlaringizni, jumladan, e-pochta, ilovalar va veb-saytlar bilan ishlashingizni kuzata oladi.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning." + "Qurilmangiz %1$s tomonidan boshqariladi.\n\nYAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlarini boshqarishi mumkin.\n\nShuningdek, siz Internetdagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlar bilan ishlashingizni kuzata oladigan %2$s tarmog‘iga ham ulangansiz.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning." "Qurilma qo‘lda qulfdan chiqarilmaguncha qulflangan holatda qoladi" "Bildirishnomalarni tezroq oling" "Ularni qulfdan chiqarishdan oldin ko‘ring" @@ -433,7 +439,8 @@ "Yoyish" "Yig‘ish" "Ekran qadaldi" - "Ekran yechilmaguncha u o‘zgarmas holatda qoladi. Uni yechish uchun “Orqaga” tugmasini bosib turing." + "Ekran yechilmaguncha u o‘zgarmas holatda qoladi. Uni yechish uchun “Orqaga” va “Umumiy ma’lumot” tugmalarini bosib turing." + "Ekran yechilmaguncha u o‘zgarmas holatda qoladi. Uni yechish uchun “Umumiy ma’lumot” tugmasini bosib turing." "OK" "Yo‘q, kerakmas" "%1$s berkitilsinmi?" @@ -654,4 +661,7 @@ "Sozlamalar tartibini o‘zgartirish." "%1$d-sahifa, jami: %2$d ta sahifa" "Bildirishnomalarni bloklab yoki ovozsiz ko‘rinadigan qilib bo‘lmaydi" + "Telefon qizib ketdi" + "Telefon sovish paytida ayrim funksiyalar ishlamasligi mumkin" + "Telefon avtomatik ravishda o‘zini sovitadi. Telefoningizdan foydalanishda davom etishingiz mumkin, lekin u sekinroq ishlashi mumkin.\n\nTelefon sovishi bilan normal holatda ishlashni boshlaydi." diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 6aaab66f2c45..8e237458c7d3 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -408,19 +408,25 @@ "Giám sát thiết bị" "Giám sát hồ sơ" "Giám sát mạng" + "VPN" + "Ghi nhật ký mạng" "Tắt VPN" "Ngắt kết nối VPN" - "Thiết bị của bạn được quản lý bởi %1$s.\n\nQuản trị viên của bạn có thể giám sát và quản lý cài đặt, quyền truy cập của công ty, ứng dụng và dữ liệu được liên kết với thiết bị của bạn và thông tin về vị trí của thiết bị. Để biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." + "Thiết bị của bạn do %1$s quản lý.\n\nQuản trị viên của bạn có thể giám sát và quản lý cài đặt, quyền truy cập dữ liệu công ty, ứng dụng, dữ liệu được liên kết với thiết bị và thông tin vị trí thiết bị. Để biết thêm thông tin, hãy liên hệ với quản trị viên." + "Bạn đang kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web." + " " + "Mở cài đặt VPN" + "Quản trị viên đã bật tính năng ghi nhật ký mạng. Tính năng này giám sát lưu lượng truy cập trên thiết bị của bạn.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." "Bạn đã cấp cho ứng dụng quyền thiết lập kết nối VPN.\n\nỨng dụng này có thể giám sát hoạt động mạng và thiết bị của bạn, bao gồm email, ứng dụng và trang web." - "Thiết bị của bạn được quản lý bởi %1$s.\n\nQuản trị viên của bạn có thể giám sát và quản lý cài đặt, quyền truy cập của công ty, ứng dụng, dữ liệu được liên kết với thiết bị của bạn và thông tin về vị trí của thiết bị.\n\nBạn được kết nối với VPN, mạng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." - "Hồ sơ Android Work của bạn được quản lý bởi %1$s.\n\nQuản trị viên có thể giám sát hoạt động mạng của bạn bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn.\n\nBạn cũng được kết nối với VPN, có thể giám sát hoạt động mạng của bạn." + "Thiết bị của bạn do %1$s quản lý.\n\nQuản trị viên của bạn có thể giám sát và quản lý cài đặt, quyền truy cập dữ liệu công ty, ứng dụng, dữ liệu được liên kết với thiết bị và thông tin vị trí thiết bị.\n\nBạn đang kết nối với VPN. VPN có thể giám sát hoạt động mạng của bạn bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên." + "Hồ sơ công việc của bạn do %1$s quản lý.\n\nQuản trị viên có thể giám sát hoạt động mạng của bạn bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn.\n\nBạn cũng được kết nối với VPN. Dịch vụ này có thể giám sát hoạt động mạng của bạn." "VPN" "Bạn đang kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng của bạn bao gồm email, ứng dụng và trang web." "Bạn đang kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng cá nhân của bạn bao gồm email, ứng dụng và trang web." "Bạn đang kết nối với %1$s. Ứng dụng này có thể giám sát hoạt động mạng cá nhân của bạn bao gồm email, ứng dụng và trang web." - "Hồ sơ công việc của bạn được quản lý bởi %1$s. Hồ sơ được kết nối với %2$s, ứng dụng này có thể giám sát hoạt động mạng cơ quan của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." + "Hồ sơ công việc của bạn do %1$s quản lý. Hồ sơ này được kết nối với %2$s, ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." "Hồ sơ công việc của bạn được quản lý bởi %1$s. Hồ sơ được kết nối với %2$s, ứng dụng này có thể giám sát hoạt động mạng cơ quan của bạn, bao gồm email, ứng dụng và trang web.\n\nBạn cũng được kết nối với %3$s, có thể giám sát hoạt động mạng cá nhân của bạn." - "Thiết bị của bạn được quản lý bởi %1$s.\n\nQuản trị viên có thể giám sát và quản lý cài đặt, quyền truy cập của công ty, ứng dụng, dữ liệu được liên kết với thiết bị của bạn và thông tin về vị trí của thiết bị.\n\nBạn được kết nối với %2$s. Ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn." + "Thiết bị của bạn do %1$s quản lý.\n\nQuản trị viên của bạn có thể giám sát và quản lý cài đặt, quyền truy cập dữ liệu công ty, ứng dụng, dữ liệu được liên kết với thiết bị và thông tin vị trí thiết bị.\n\nBạn đang kết nối với %2$s. Ứng dụng này có thể giám sát hoạt động mạng của bạn bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên." "Thiết bị sẽ vẫn bị khóa cho tới khi bạn mở khóa theo cách thủ công" "Nhận thông báo nhanh hơn" "Xem thông báo trước khi bạn mở khóa" @@ -431,7 +437,8 @@ "Mở rộng" "Thu gọn" "Màn hình được ghim" - "Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Chạm và giữ Quay lại để bỏ ghim." + "Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Quay lại và Tổng quan để bỏ ghim." + "Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Tổng quan để bỏ ghim." "Ok" "Không, cảm ơn" "Ẩn %1$s?" @@ -654,4 +661,7 @@ "Chỉnh sửa thứ tự cài đặt." "Trang %1$d / %2$d" "Không thể chặn hoặc tắt tiếng thông báo" + "Điện thoại đang nóng lên" + "Một số tính năng bị hạn chế trong khi điện thoại nguội dần" + "Điện thoại của bạn sẽ tự động nguội dần. Bạn vẫn có thể sử dụng điện thoại, nhưng điện thoại có thể chạy chậm hơn. \n\nSau khi đã nguội, điện thoại sẽ chạy bình thường." diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index f10d53868325..edf438bb1bb2 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -408,19 +408,25 @@ "设备监测" "资料监控" "网络监控" + "VPN" + "网络日志" "关闭VPN" "断开VPN连接" - "您的设备由以下单位管理:%1$s。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据以及设备位置信息。若要了解详情,请与您单位的管理员联系。" + "您的设备由以下单位管理:%1$s。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据,以及您设备的位置信息。若要了解详情,请与您单位的管理员联系。" + "您已连接到%1$s,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。" + " " + "打开 VPN 设置" + "您的管理员已开启网络日志功能,该功能会监控您设备上的流量。\n\n如需更多信息,请与您的管理员联系。" "您已授权应用设置 VPN 连接。\n\n该应用可以监控您的设备和网络活动,包括收发电子邮件、使用应用和浏览网站。" - "您的设备由以下单位管理:%1$s。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据以及设备位置信息。\n\n您已连接到 VPN,此 VPN 也可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。" - "您的工作资料由以下单位管理:%1$s。\n\n您单位的管理员可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。\n\n此外,您还连接到了 VPN,此 VPN 也可以监控您的网络活动。" + "您的设备由以下单位管理:%1$s。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据,以及您设备的位置信息。\n\n您已连接到 VPN,该 VPN 可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。" + "您的工作资料由“%1$s”管理。\n\n您的管理员能够监控您的网络活动,其中包括收发电子邮件、使用应用和访问网站。\n\n如需更多信息,请与您的管理员联系。\n\n此外,您还连接到了 VPN,它同样可以监控您的网络活动。" "VPN" "您已连接到%1$s,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。" "您已连接到%1$s,该应用可以监控您的个人网络活动,包括收发电子邮件、使用应用和浏览网站。" "您已连接到%1$s,该应用可以监控您的个人网络活动,包括收发电子邮件、使用应用和浏览网站。" - "您的工作资料由以下单位管理:%1$s。您已连接到%2$s,该应用可以监控您的工作网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。" + "您的工作资料由“%1$s”管理,并已关联到%2$s(该应用能够监控您的工作网络活动,其中包括收发电子邮件、使用应用和访问网站)。\n\n如需更多信息,请与您的管理员联系。" "您的工作资料由以下单位管理:%1$s。您已连接到%2$s,该应用可以监控您的工作网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n此外,您还连接到了%3$s,该应用可以监控您的个人网络活动。" - "您的设备由以下单位管理:%1$s。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据以及设备位置信息。\n\n您已连接到%2$s,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。" + "您的设备由以下单位管理:%1$s。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据,以及您设备的位置信息。\n\n您已连接到%2$s,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。" "在您手动解锁之前,设备会保持锁定状态" "更快捷地查看通知" "无需解锁即可查看通知" @@ -431,7 +437,8 @@ "展开" "收起" "已固定屏幕" - "这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”即可取消固定屏幕。" + "这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”和“概览”即可取消固定屏幕。" + "这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“概览”即可取消固定屏幕。" "知道了" "不用了" "要隐藏“%1$s”吗?" @@ -652,4 +659,7 @@ "修改设置顺序。" "第 %1$d 页,共 %2$d 页" "无法将通知静音或屏蔽" + "手机温度上升中" + "手机降温时,部分功能的使用会受限制" + "您的手机将自动尝试降温。您依然可以使用您的手机,但是手机运行速度可能会更慢。\n\n手机降温后,就会恢复正常的运行速度。" diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 8405fe509bc3..6b61a5d4726b 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -410,19 +410,25 @@ "裝置監控" "個人檔案監控" "網絡監控" + "VPN" + "網絡記錄" "停用 VPN" "中斷 VPN 連線" - "您的裝置由 %1$s 管理。\n\n您的管理員可以監控及管理您裝置的設定、企業存取、應用程式、資料及位置資訊。如需更多資訊,請聯絡您的管理員。" + "您的裝置由%1$s管理。\n\n您的管理員可以監控和管理設定、公司存取權、應用程式、與您裝置相關的資料,以及裝置的位置資料。如需瞭解詳情,請聯絡您的管理員。" + "您已連接至「%1$s」,此應用程式可以監控您的網絡活動,包括電郵、應用程式及網站。" + " " + "開啟 VPN 設定" + "您的管理員已開啟網絡記錄功能,以監控您裝置上的流量。\n\n如需瞭解詳情,請聯絡您的管理員。" "您已授權應用程式設定 VPN 連線。\n\n這個應用程式能夠監控您的裝置和網絡活動,包括電郵、應用程式和網站。" - "您的裝置由 %1$s 管理。\n\n您的管理員可以監控及管理您裝置的設定、企業存取、應用程式、資料及位置資訊。\n\n此外,由於您的裝置連至 VPN,因此 VPN 服務供應商也能監控您的個人網絡活動,包括電郵、應用程式及網站。\n\n如需更多資訊,請聯絡您的管理員。" - "您的裝置由 %1$s 管理。\n\n您的管理員可以監控您的網絡活動,包括電郵、應用程式及網站。\n\n如需瞭解更多資訊,請聯絡管理員。\n\n由於您的裝置連至 VPN,因此 VPN 服務供應商也可監控您的網絡活動。" + "您的裝置由%1$s管理。\n\n您的管理員可以監控和管理設定、公司存取權、應用程式、與您裝置相關聯的資料,以及您裝置的位置資料。\n\n您已連接至 VPN,此 VPN 可監控您的網絡活動,包括收發電郵、使用應用程式和瀏覽網站。\n\n如需瞭解詳情,請聯絡您的管理員。" + "您的工作設定檔由%1$s管理。\n\n您的管理員可以監控您的網絡活動,包括收發電郵、使用應用程式和瀏覽網站。\n\n如需瞭解詳情,請聯絡您的管理員。\n\n此外,由於您已連接至 VPN,因此 VPN 可監控您的網絡活動。" "VPN" "您已連結至%1$s ,它能夠監控您的網絡活動,包括電郵、應用程式和網站。" "您已連結至%1$s,它能夠監控您的個人網絡活動,包括電郵、應用程式和網站。" "您已連接至「%1$s」,此應用程式可以監控您的個人網絡活動,包括電郵、應用程式及網站。" - "您的工作設定檔由%1$s管理。它已連結至%2$s,能夠監控您的工作網絡活動,包括電郵、應用程式和網站。\n\n如需進一步資訊,請聯絡您的管理員。" + "您的工作設定檔由%1$s管理。工作設定檔已連接至「%2$s」,此應用程式可監控您的工作網絡活動,包括收發電郵、使用應用程式和瀏覽網站。\n\n如需瞭解詳情,請聯絡您的管理員。" "您的工作設定檔由%1$s管理。它已連結至%2$s,能夠監控您的工作網絡活動,包括電郵、應用程式和網站。\n\n此外,您亦連結至%3$s,因此它亦能夠監控您的個人網絡活動。" - "您的裝置由 %1$s 管理。\n\n您的管理員可以監控及管理您裝置的設定、企業存取、應用程式、資料及位置資訊。\n\n此外,您的裝置連至 %2$s,它能監控您的網絡活動,包括電郵、應用程式及網站。\n\n如需更多資訊,請聯絡您的管理員。" + "您的裝置由%1$s管理。\n\n您的管理員可以監控和管理設定、公司存取權、應用程式、與您裝置相關的資料,以及裝置的位置資料。\n\n您已連接至「%2$s」,此應用程式可監控您的網絡活動,包括收發電郵、使用應用程式和瀏覽網站。\n\n如需瞭解詳情,請聯絡您的管理員。" "裝置將保持上鎖,直到您手動解鎖" "更快取得通知" "解鎖前顯示" @@ -433,7 +439,8 @@ "展開" "收合" "螢幕已固定" - "畫面將會繼續顯示,直至您取消固定。按住 [返回] 即可取消固定。" + "畫面將會繼續顯示,直至您取消固定。按住 [返回] 和 [概覽] 即可取消固定。" + "畫面將會繼續顯示,直至您取消固定。按住 [概覽] 即可取消固定。" "知道了" "不用了,謝謝" "隱藏 %1$s?" @@ -654,4 +661,7 @@ "編輯設定次序。" "第 %1$d 頁 (共 %2$d 頁)" "通知無法設為靜音或封鎖" + "手機溫度正在上升" + "手機降溫時,部分功能會受限制" + "手機會自動嘗試降溫。您仍可以使用手機,但手機的運作速度可能較慢。\n\n手機降溫後便會恢復正常。" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index b4f2b27dc7eb..0c8b514fc097 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -408,19 +408,25 @@ "裝置監控" "設定檔監控" "網路監控" + "VPN" + "網路紀錄" "停用 VPN" "中斷 VPN 連線" - "您的裝置由下列機構管理:%1$s。\n\n您的管理員可以監控及管理與裝置相關的設定、企業網路存取權、應用程式和資料,以及裝置的位置資訊。如需詳細資訊,請洽您的管理員。" + "你的裝置由下列機構管理:%1$s。\n\n你的管理員可以監控及管理與裝置相關聯的設定、企業存取權、應用程式和資料,以及裝置的位置資訊。如需詳細資訊,請與你的管理員聯絡。" + "由於你已連結至「%1$s」,你的網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。" + " " + "開啟 VPN 設定" + "你的管理員已啟用網路紀錄功能,可監控你裝置的流量。\n\n如需詳細資訊,請與你的管理員聯絡。" "您已授權一個應用程式設定 VPN 連線。\n\n這個應用程式可以監控您的裝置和網路活動,包括收發電子郵件、使用應用程式和瀏覽網站。" - "您的裝置由下列機構管理:%1$s。\n\n您的管理員可以監控及管理與裝置相關的設定、企業網路存取權、應用程式和資料,以及裝置的位置資訊。\n\n由於您的裝置已連線至 VPN,您的網路活動也會受到 VPN 監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n如需詳細資訊,請洽您的管理員。" - "您的 Work 設定檔由下列機構管理:%1$s。\n\n您的管理員可以監控您的網路活動,包括收發電子郵件、使用應用程式及瀏覽網站。\n\n如需詳細資訊,請洽您的管理員。\n\n同時,由於您的裝置已連線至 VPN,您的網路活動也會受到 VPN 監控。" + "你的裝置由下列機構管理:%1$s。\n\n你的管理員可以監控及管理與裝置相關聯的設定、企業存取權、應用程式和資料,以及裝置的位置資訊。\n\n你的裝置已連線至 VPN,因此你的網路活動也會受到 VPN 監控,包括收發電子郵件、使用應用程式及瀏覽網站。\n\n如需詳細資訊,請與你的管理員聯絡。" + "你的 Work 設定檔是由下列機構管理:%1$s。\n\n你的管理員可以監控你的網路活動,包括收發電子郵件、使用應用程式及瀏覽網站。\n\n如需詳細資訊,請與你的管理員聯絡。\n\n此外,由於你已連線至 VPN,因此你的網路活動也會受到 VPN 監控。" "VPN" "由於您已連線至 %1$s,您的網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。" "由於您已連線至 %1$s,您的個人網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。" "由於你已連結至「%1$s」,你的個人網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。" - "您的 Work 設定檔是由下列機構管理:%1$s。由於設定檔已連線至 %2$s,您的工作網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n詳情請洽您的管理員。" + "你的 Work 設定檔是由下列機構管理:%1$s。你的 Work 設定檔已連線至 %2$s,因此該應用程式可以監控你的 Work 網路活動,包括收發電子郵件、使用應用程式及瀏覽網站。\n\n如需詳細資訊,請與你的管理員聯絡。" "您的 Work 設定檔是由下列機構管理:%1$s。由於設定檔已連線至 %2$s,您的工作網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n同時由於您也連線至%3$s,您的個人網路活動也會受到這個應用程式監控。" - "您的裝置由下列機構管理:%1$s。\n\n您的管理員可以監控及管理與裝置相關的設定、企業網路存取權、應用程式和資料,以及裝置的位置資訊。\n\n由於您的裝置已連線至 %2$s,您的網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n如需詳細資訊,請洽您的管理員。" + "你的裝置由下列機構管理:%1$s。\n\n你的管理員可以監控及管理與裝置相關聯的設定、企業存取權、應用程式和資料,以及裝置的位置資訊。\n\n你的裝置已連線至 %2$s,因此你的網路活動也會受到該應用程式監控,包括收發電子郵件、使用應用程式及瀏覽網站。\n\n如需詳細資訊,請與你的管理員聯絡。" "在您手動解鎖前,裝置將保持鎖定狀態" "更快取得通知" "解鎖前顯示" @@ -431,7 +437,8 @@ "展開" "收合" "螢幕已固定" - "這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住「返回」按鈕即可取消固定。" + "這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [返回] 按鈕和 [總覽] 按鈕即可取消固定。" + "這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [總覽] 按鈕即可取消固定。" "知道了" "不用了,謝謝" "隱藏%1$s?" @@ -652,4 +659,7 @@ "編輯設定順序。" "第 %1$d 頁,共 %2$d 頁" "無法關閉通知音效或封鎖通知" + "手機變熱" + "手機降溫時,部分功能會受限" + "手機會自動嘗試降溫。你仍可繼續使用手機,但是手機的運作速度可能會較慢。\n\n手機降溫完畢後,就會恢復正常的運作速度。" diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index c6e40444b845..b1e81b93ecc4 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -408,19 +408,25 @@ "Ukwengamela idivayisi" "Ukuqapha iphrofayela" "Ukuqashwa kwenethiwekhi" + "I-VPN" + "Ukungena kwenethiwekhi" "Khubaza i-VPN" "Nqamula i-VPN" - "Idivayisi yakho iphethwe yi-%1$s.\n\nUmlawuli wakho angaqapha aphinde aphathe izilungiselelo, ukufinyelela kwenkampani, izinhlelo zokusebenza, idatha ehlotshaniswa nedivayisi yakho, kanye nolwazi lwendawo yedivayisi yakho. Ukuze uthole olunye ulwazi xhumana nomlawuli wakho." + "Idivayisi yakho iphethwe ngu-%1$s.\n\nUmlawuli wakho angangamela futhi aphathe izilungiselelo, ukufinyelela kwebhizinisi, izinhlelo zokusebenza, idatha ephathelene nedivayisi yakho, nolwazi lendawo ledivayisi yakho. Ngolwazi olubanzi, xhumana nomlawuli wakho." + "Uxhumeke ku-%1$s, engaqapha umsebenzi wenethiwekhi yakho, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." + " " + "Vula izilungiselelo ze-VPN" + "Umlawuli wakho uvule ukungena kwenethiwekhi, okuhlola ithrafikhi kudivayisi yakho.\n\nNgolwazi olubanzi xhumana nomlawuli wakho." "Unikeze uhlelo lokusebenza imvume yokusetha ukuxhumana kwe-VPN.\n\nLolu hlelo lokusebenza lungahlola idivayisi yakho nomsebenzi wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." - "Idivayisi yakho iphethwe yi-%1$s.\n\nUmlawuli wakho angaqapha aphinde aphathe izilungiselelo, ukufinyelela kwezinkampani, izinhlelo zokusebenza, idatha ehlotshaniswa nedivayisi yakho, kanye nolwazi lwendawo yedivayisi yakho.\n\nUxhumeke ku-VPN, engaqapha umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nUkuze uthole olunye ulwazi, xhumana nomlawuli wakho." - "Iphrofayela yakho yomsebenzi iphethwe yi-%1$s.\n\nUmqondisi wakho unamandla wokuqaphela umsebenzi wenethiwekhi yakho ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nUkuze uthole olunye ulwazi, xhumana nomqondisi wakho.\n\nFuthi uxhumeke ku-VPN, engaqaphela umsebenzi wenethiwekhi yakho." + "Idivayisi yakho iphethwe ngu-%1$s.\n\nUmlawuli wakho angangamela futhi aphathe izilungiselelo, ukufinyelela kwebhizinisi, izinhlelo zokusebenza, idatha ephathelene nedivayisi yakho, nolwazi lendawo ledivayisi yakho.\n\nUxhumeke ku-VPN, engangamela umsebenzi wakho wenethiwekhi, kufaka phakathi ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nNgolwazi olubanzi, xhumana nomlawuli wakho." + "Iphrofayela yakho yomsebenzi iphethwe ngu-%1$s.\n\nUmlawuli wakho uyakwazi ukwengamela umsebenzi wakho wenethiwekhi kufaka phakathi ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nNgolwazi olubanzi, xhumana nomlawuli wakho.\n\nFuthi uxhumekile ku-VPN, engangamela umsebenzi wakho wenethiwekhi." "I-VPN" "Uxhumeke ku-%1$s, engahlola umsebenzi wakho wenethiwekhi ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." "Uxhumeke ku-%1$s, engahlola umsebenzi wenethiwekhi yakho yomuntu siqu, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." "Uxhumeke ku-%1$s, engaqapha umsebenzi wakho womuntu siqu wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi." - "Iphrofayela yakho yomsebenzi iphethwe yi-%1$s. Ixhumeke ku-%2$s, engahlola umsebenzi wenethiwekhi yakho yokusebenza, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nUkuze uthole olunye ulwazi, xhumana nomqondisi wakho." + "Iphrofayela yakho yomsebenzi iphethwe ngu-%1$s. Ixhumeke ku-%2$s, engangamela umsebenzi wakho wenethiwekhi, kufaka phakathi ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nNgolwazi olubanzi, xhumana nomlawuli wakho." "Iphrofayela yakho yomsebenzi iphethwe yi-%1$s. Ixhumeke ku-%2$s, engahlola umsebenzi wenethiwekhi yakho yomsebenzi, ofaka ama-imeyili, izinhlelo zokusebenza namawebhusayithi.\n\nFuthi uxhumeke ku-%3$s, engahlola umsebenzi wenethiwekhi yakho yomuntu siqu." - "Idivayisi yakho iphethwe yi-%1$s.\n\nUmqondisi wakho angaqaphela aphinde aphathe izilungiselelo, ukufinyelela kwezinkampani, izinhlelo zokusebenza, idatha ehlotshaniswa nedivayisi yakho, nolwazi lendawo yedivayisi yakho.\n\nUxhumeke ku-%2$s, engaqaphela umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza namawebhusayithi.\n\nUkuze uthole olunye ulwazi, xhumana nomqondisi wakho." + "Idivayisi yakho iphethwe ngu-%1$s.\n\nUmlawuli wakho angangamela futhi aphathe izilungiselelo, ukufinyelela kwebhizinisi, izinhlelo zokusebenza, idatha ephathelene nedivayisi yakho, nolwazi lendawo ledivayisi yakho.\n\nUxhumeke ku-%2$s, engangamela umsebenzi wakho wenethiekhi, kufaka phakathi ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nNgolwazi olubanzi, xhumana nomlawuli wakho." "Idivayisi izohlala ikhiyekile uze uyivule ngokwenza" "Thola izaziso ngokushesha" "Ibone ngaphambi kokuthi uyivule" @@ -431,7 +437,8 @@ "Nweba" "Goqa" "Isikrini siphiniwe" - "Lokhu kuyigcina ekubukekeni uze ususe ukuphinda. Thinta uphinde ubambe okuthi Emuva ukuze ususe ukuphina." + "Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe okuthi Emuva Nokubuka konke ukuze ususe ukuphina." + "Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe Ukubuka konke ukuze ususe ukuphina." "Ngiyitholile" "Cha ngiyabonga" "Fihla i-%1$s?" @@ -652,4 +659,7 @@ "Hlela uhlelo lwezilungiselelo." "Ikhasi %1$d kwangu-%2$d" "Izaziso azikwazi ukuthuliswa noma ukuvinjelwa" + "Ifoni iyafudumala" + "Ezinye izici zikhawulelwe ngenkathi ifoni iphola" + "Ifoni yakho izozama ngokuzenzakalela ukuphola. Ungasasebenzisa ifoni yakho, kodwa ingasebenza ngokungasheshi.\n\nUma ifoni yakho isipholile, izosebenza ngokuvamile." diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index c75025bc87cb..49ca76255487 100755 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -295,4 +295,12 @@ false false + + + 0 + + + -1 + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index cc3082f657c3..43c89babddd3 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -104,9 +104,6 @@ 0dp - 162dp - 42dp - 36dp @@ -215,6 +212,13 @@ 0dp + + 24sp + + 8sp + + 0.3 + 8dp @@ -453,6 +457,9 @@ 2dp + + 32dp + 10.5% diff --git a/packages/SystemUI/res/values/dimens_grid.xml b/packages/SystemUI/res/values/dimens_grid.xml new file mode 100644 index 000000000000..febf65b834ee --- /dev/null +++ b/packages/SystemUI/res/values/dimens_grid.xml @@ -0,0 +1,28 @@ + + + + 32dp + 150dp + 20dp + 44dp + 8dp + 8dp + 4dp + 8dp + + diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 94d79f27e67f..ac1d4424da0f 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -40,9 +40,6 @@ - - - diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 2ea475a1166b..4a51329215e0 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1013,6 +1013,12 @@ Network monitoring + + VPN + + + Network Logging + Disable VPN @@ -1020,16 +1026,29 @@ Disconnect VPN - Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information. For more information, contact your administrator. + Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information. For more information, contact your admin. + + + You\'re connected to %1$s, which can monitor your network activity, including emails, apps, and websites. + + + " " + + + Open VPN Settings + + + Your admin has turned on network logging, which monitors traffic on your device.\n\nFor more information, contact your admin. + You gave an app permission to set up a VPN connection.\n\nThis app can monitor your device and network activity, including emails, apps, and websites. - Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator. + Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to a VPN, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your admin. - Your work profile is managed by %1$s.\n\nYour administrator is capable of monitoring your network activity including emails, apps, and websites.\n\nFor more information, contact your administrator.\n\nYou\'re also connected to a VPN, which can monitor your network activity. + Your work profile is managed by %1$s.\n\nYour admin is capable of monitoring your network activity including emails, apps, and websites.\n\nFor more information, contact your admin.\n\nYou\'re also connected to a VPN, which can monitor your network activity. VPN @@ -1044,13 +1063,13 @@ You\'re connected to %1$s, which can monitor your personal network activity, including emails, apps, and websites. - Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator. + Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps, and websites.\n\nFor more information, contact your admin. Your work profile is managed by %1$s. It is connected to %2$s, which can monitor your work network activity, including emails, apps, and websites.\n\nYou\'re also connected to %3$s, which can monitor your personal network activity. - Your device is managed by %1$s.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator. + Your device is managed by %1$s.\n\nYour admin can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to %2$s, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your admin. Device will stay locked until you manually unlock @@ -1082,7 +1101,9 @@ Screen is pinned - This keeps it in view until you unpin. Touch & hold Back to unpin. + This keeps it in view until you unpin. Touch & hold Back and Overview to unpin. + + This keeps it in view until you unpin. Touch & hold Overview to unpin. Got it @@ -1672,4 +1693,12 @@ Notifications can\'t be silenced or blocked + + + Phone is getting warm + + Some features limited while phone cools down + + Your phone will automatically try to cool down. You can still use your phone, but it may run slower.\n\nOnce your phone has cooled down, it will run normally. + diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java index 7a5e32227db1..8141b288ddee 100644 --- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java +++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java @@ -326,7 +326,8 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: if (DEBUG) Log.d(TAG, "up/cancel"); - finishExpanding(false, getCurrentVelocity()); + finishExpanding(ev.getActionMasked() == MotionEvent.ACTION_CANCEL /* forceAbort */, + getCurrentVelocity()); clearView(); break; } @@ -390,7 +391,8 @@ private boolean isFullyExpanded(ExpandableView underFocus) { @Override public boolean onTouchEvent(MotionEvent ev) { - if (!isEnabled()) { + if (!isEnabled() && !mExpanding) { + // In case we're expanding we still want to finish the current motion. return false; } trackVelocity(ev); @@ -485,7 +487,8 @@ public boolean onTouchEvent(MotionEvent ev) { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (DEBUG) Log.d(TAG, "up/cancel"); - finishExpanding(false, getCurrentVelocity()); + finishExpanding(!isEnabled() || ev.getActionMasked() == MotionEvent.ACTION_CANCEL, + getCurrentVelocity()); clearView(); break; } @@ -526,28 +529,37 @@ private boolean startExpanding(ExpandableView v, int expandType) { return true; } - private void finishExpanding(boolean force, float velocity) { + /** + * Finish the current expand motion + * @param forceAbort whether the expansion should be forcefully aborted and returned to the old + * state + * @param velocity the velocity this was expanded/ collapsed with + */ + private void finishExpanding(boolean forceAbort, float velocity) { if (!mExpanding) return; if (DEBUG) Log.d(TAG, "scale in finishing on view: " + mResizedView); float currentHeight = mScaler.getHeight(); - float h = mScaler.getHeight(); final boolean wasClosed = (mOldHeight == mSmallSize); boolean nowExpanded; - int naturalHeight = mScaler.getNaturalHeight(); - if (wasClosed) { - nowExpanded = (force || currentHeight > mOldHeight && velocity >= 0); + if (!forceAbort) { + if (wasClosed) { + nowExpanded = currentHeight > mOldHeight && velocity >= 0; + } else { + nowExpanded = currentHeight >= mOldHeight || velocity > 0; + } + nowExpanded |= mNaturalHeight == mSmallSize; } else { - nowExpanded = !force && (currentHeight >= mOldHeight || velocity > 0); + nowExpanded = !wasClosed; } - nowExpanded |= mNaturalHeight == mSmallSize; if (mScaleAnimation.isRunning()) { mScaleAnimation.cancel(); } mCallback.expansionStateChanged(false); + int naturalHeight = mScaler.getNaturalHeight(); float targetHeight = nowExpanded ? naturalHeight : mSmallSize; - if (targetHeight != currentHeight) { + if (targetHeight != currentHeight && mEnabled) { mScaleAnimation.setFloatValues(targetHeight); mScaleAnimation.setupStartValues(); final View scaledView = mResizedView; @@ -575,6 +587,9 @@ public void onAnimationCancel(Animator animation) { mFlingAnimationUtils.apply(mScaleAnimation, currentHeight, targetHeight, velocity); mScaleAnimation.start(); } else { + if (targetHeight != currentHeight) { + mScaler.setHeight(targetHeight); + } mCallback.setUserExpandedChild(mResizedView, nowExpanded); mCallback.setUserLockedChild(mResizedView, false); } @@ -597,7 +612,7 @@ private void clearView() { * Use this to abort any pending expansions in progress. */ public void cancel() { - finishExpanding(true, 0f /* velocity */); + finishExpanding(true /* forceAbort */, 0f /* velocity */); clearView(); // reset the gesture detector diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java index 19ae2954bb2a..b9ae585c339c 100644 --- a/packages/SystemUI/src/com/android/systemui/Prefs.java +++ b/packages/SystemUI/src/com/android/systemui/Prefs.java @@ -49,6 +49,7 @@ private Prefs() {} // no instantation Key.QS_WORK_ADDED, }) public @interface Key { + @Deprecated String OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME = "OverviewLastStackTaskActiveTime"; String DEBUG_MODE_ENABLED = "debugModeEnabled"; String HOTSPOT_TILE_LAST_USED = "HotspotTileLastUsed"; diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index 9eceeacc3968..c965067126fb 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -31,6 +31,7 @@ import com.android.internal.app.AssistUtils; import com.android.internal.app.IVoiceInteractionSessionListener; import com.android.internal.app.IVoiceInteractionSessionShowCallback; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.CommandQueue; @@ -282,7 +283,7 @@ public void replaceDrawable(ImageView v, ComponentName component, String name, @Nullable private ComponentName getAssistInfo() { - return mAssistUtils.getAssistComponentForUser(UserHandle.USER_CURRENT); + return mAssistUtils.getAssistComponentForUser(KeyguardUpdateMonitor.getCurrentUser()); } public void showDisclosure() { diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingLog.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingLog.java index 1338d9d54793..71ddba5ffdcc 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingLog.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingLog.java @@ -84,6 +84,11 @@ public static void i(String tag, String s) { log("I", tag, s); } + public static void wLogcat(String tag, String s) { + Log.w(TAG, tag + "\t" + s); + log("W", tag, s); + } + public static void w(String tag, String s) { if (LOGCAT) { Log.w(TAG, tag + "\t" + s); @@ -133,7 +138,7 @@ public static synchronized void dump(PrintWriter pw) { pw.println(); } - public static synchronized void wtf(String tag, String s) { + public static synchronized void wtf(String tag, String s, Throwable here) { if (!ENABLED) { return; } @@ -161,6 +166,6 @@ public static synchronized void wtf(String tag, String s) { Log.e(TAG, "Unable to write log, build must be debuggable."); } - Log.wtf(TAG, tag + " " + s + "; " + fileMessage); + Log.wtf(TAG, tag + " " + s + "; " + fileMessage, here); } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java index 664e88676d9a..1abea37519e6 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java @@ -71,6 +71,7 @@ public class FalsingManager implements SensorEventListener { private boolean mSessionActive = false; private int mState = StatusBarState.SHADE; private boolean mScreenOn; + private Runnable mPendingWtf; protected final ContentObserver mSettingsObserver = new ContentObserver(mHandler) { @Override @@ -136,6 +137,7 @@ private void sessionExitpoint(boolean force) { private void onSessionStart() { if (FalsingLog.ENABLED) { FalsingLog.i("onSessionStart", "classifierEnabled=" + isClassiferEnabled()); + clearPendingWtf(); } mBouncerOn = false; mSessionActive = true; @@ -172,13 +174,35 @@ public boolean isFalseTouch() { if (FalsingLog.ENABLED) { // We're getting some false wtfs from touches that happen after the device went // to sleep. Only report missing sessions that happen when the device is interactive. - if (!mSessionActive && mContext.getSystemService(PowerManager.class).isInteractive()) { - FalsingLog.wtf("isFalseTouch", new StringBuilder() + if (!mSessionActive && mContext.getSystemService(PowerManager.class).isInteractive() + && mPendingWtf == null) { + int enabled = isEnabled() ? 1 : 0; + int screenOn = mScreenOn ? 1 : 0; + String state = StatusBarState.toShortString(mState); + Throwable here = new Throwable("here"); + FalsingLog.wLogcat("isFalseTouch", new StringBuilder() .append("Session is not active, yet there's a query for a false touch.") - .append(" enabled=").append(isEnabled() ? 1 : 0) - .append(" mScreenOn=").append(mScreenOn ? 1 : 0) - .append(" mState=").append(StatusBarState.toShortString(mState)) + .append(" enabled=").append(enabled) + .append(" mScreenOn=").append(screenOn) + .append(" mState=").append(state) + .append(". Escalating to WTF if screen does not turn on soon.") .toString()); + + // Unfortunately we're also getting false positives for touches that happen right + // after the screen turns on, but before that notification has made it to us. + // Unfortunately there's no good way to catch that, except to wait and see if we get + // the screen on notification soon. + mPendingWtf = () -> FalsingLog.wtf("isFalseTouch", new StringBuilder() + .append("Session did not become active after query for a false touch.") + .append(" enabled=").append(enabled) + .append('/').append(isEnabled() ? 1 : 0) + .append(" mScreenOn=").append(screenOn) + .append('/').append(mScreenOn ? 1 : 0) + .append(" mState=").append(state) + .append('/').append(StatusBarState.toShortString(mState)) + .append(". Look for warnings ~1000ms earlier to see root cause.") + .toString(), here); + mHandler.postDelayed(mPendingWtf, 1000); } } if (mAccessibilityManager.isTouchExplorationEnabled()) { @@ -189,6 +213,13 @@ public boolean isFalseTouch() { return mHumanInteractionClassifier.isFalseTouch(); } + private void clearPendingWtf() { + if (mPendingWtf != null) { + mHandler.removeCallbacks(mPendingWtf); + mPendingWtf = null; + } + } + @Override public synchronized void onSensorChanged(SensorEvent event) { mDataCollector.onSensorChanged(event); @@ -224,6 +255,7 @@ public void onScreenTurningOn() { FalsingLog.i("onScreenTurningOn", new StringBuilder() .append("from=").append(mScreenOn ? 1 : 0) .toString()); + clearPendingWtf(); } mScreenOn = true; if (sessionEntrypoint()) { @@ -313,7 +345,11 @@ public void onNotificationActive() { mDataCollector.onNotificationActive(); } - public void onNotificationDoubleTap() { + public void onNotificationDoubleTap(boolean accepted, float dx, float dy) { + if (FalsingLog.ENABLED) { + FalsingLog.i("onNotificationDoubleTap", "accepted=" + accepted + + " dx=" + dx + " dy=" + dy + " (px)"); + } mDataCollector.onNotificationDoubleTap(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 606c86942bbd..5d5fbdfa5a52 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -17,6 +17,8 @@ package com.android.systemui.keyguard; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; + +import static com.android.internal.telephony.IccCardConstants.State.ABSENT; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT; @@ -63,6 +65,8 @@ import android.view.animation.Animation; import android.view.animation.AnimationUtils; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.internal.policy.IKeyguardDrawnCallback; import com.android.internal.policy.IKeyguardExitCallback; import com.android.internal.policy.IKeyguardStateCallback; @@ -199,6 +203,7 @@ public class KeyguardViewMediator extends SystemUI { private boolean mSystemReady; private boolean mBootCompleted; private boolean mBootSendUserPresent; + private boolean mShuttingDown; /** High level access to the power manager for WakeLocks */ private PowerManager mPM; @@ -335,6 +340,7 @@ public class KeyguardViewMediator extends SystemUI { private boolean mWakeAndUnlocking; private IKeyguardDrawnCallback mDrawnCallback; + private boolean mLockWhenSimRemoved; private boolean mIsPerUserLock; @@ -429,7 +435,7 @@ public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simS case ABSENT: // only force lock screen in case of missing sim if user hasn't // gone through setup wizard - synchronized (this) { + synchronized (KeyguardViewMediator.this) { if (shouldWaitForProvisioning()) { if (!mShowing) { if (DEBUG_SIM_STATES) Log.d(TAG, "ICC_ABSENT isn't showing," @@ -440,11 +446,16 @@ public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simS resetStateLocked(); } } + if (simState == ABSENT) { + // MVNO SIMs can become transiently NOT_READY when switching networks, + // so we should only lock when they are ABSENT. + onSimAbsentLocked(); + } } break; case PIN_REQUIRED: case PUK_REQUIRED: - synchronized (this) { + synchronized (KeyguardViewMediator.this) { if (!mShowing) { if (DEBUG_SIM_STATES) Log.d(TAG, "INTENT_VALUE_ICC_LOCKED and keygaurd isn't " @@ -456,7 +467,7 @@ public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simS } break; case PERM_DISABLED: - synchronized (this) { + synchronized (KeyguardViewMediator.this) { if (!mShowing) { if (DEBUG_SIM_STATES) Log.d(TAG, "PERM_DISABLED and " + "keygaurd isn't showing."); @@ -466,21 +477,38 @@ public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simS + "show permanently disabled message in lockscreen."); resetStateLocked(); } + onSimAbsentLocked(); } break; case READY: - synchronized (this) { + synchronized (KeyguardViewMediator.this) { if (mShowing) { resetStateLocked(); } + mLockWhenSimRemoved = true; } break; default: - if (DEBUG_SIM_STATES) Log.v(TAG, "Ignoring state: " + simState); + if (DEBUG_SIM_STATES) Log.v(TAG, "Unspecific state: " + simState); + synchronized (KeyguardViewMediator.this) { + onSimAbsentLocked(); + } break; } } + private void onSimAbsentLocked() { + if (isSecure() && mLockWhenSimRemoved && !mShuttingDown) { + mLockWhenSimRemoved = false; + MetricsLogger.action(mContext, + MetricsEvent.ACTION_LOCK_BECAUSE_SIM_REMOVED, mShowing); + if (!mShowing) { + Log.i(TAG, "SIM removed, showing keyguard"); + doKeyguardLocked(null); + } + } + } + @Override public void onFingerprintAuthFailed() { final int currentUser = KeyguardUpdateMonitor.getCurrentUser(); @@ -638,9 +666,11 @@ private void setupLocked() { mShowKeyguardWakeLock = mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "show keyguard"); mShowKeyguardWakeLock.setReferenceCounted(false); - mContext.registerReceiver(mBroadcastReceiver, new IntentFilter(DELAYED_KEYGUARD_ACTION)); - mContext.registerReceiver( - mBroadcastReceiver, new IntentFilter(DELAYED_LOCK_PROFILE_ACTION)); + IntentFilter filter = new IntentFilter(); + filter.addAction(DELAYED_KEYGUARD_ACTION); + filter.addAction(DELAYED_LOCK_PROFILE_ACTION); + filter.addAction(Intent.ACTION_SHUTDOWN); + mContext.registerReceiver(mBroadcastReceiver, filter); mKeyguardDisplayManager = new KeyguardDisplayManager(mContext); @@ -1223,7 +1253,7 @@ private void doKeyguardLocked(Bundle options) { // if the setup wizard hasn't run yet, don't show final boolean requireSim = !SystemProperties.getBoolean("keyguard.no_require_sim", false); final boolean absent = SubscriptionManager.isValidSubscriptionId( - mUpdateMonitor.getNextSubIdForState(IccCardConstants.State.ABSENT)); + mUpdateMonitor.getNextSubIdForState(ABSENT)); final boolean disabled = SubscriptionManager.isValidSubscriptionId( mUpdateMonitor.getNextSubIdForState(IccCardConstants.State.PERM_DISABLED)); final boolean lockedOrMissing = mUpdateMonitor.isSimPinSecure() @@ -1397,6 +1427,10 @@ public void onReceive(Context context, Intent intent) { } } } + } else if (Intent.ACTION_SHUTDOWN.equals(intent.getAction())) { + synchronized (KeyguardViewMediator.this){ + mShuttingDown = true; + } } } }; @@ -1959,6 +1993,7 @@ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.print(" mBootCompleted: "); pw.println(mBootCompleted); pw.print(" mBootSendUserPresent: "); pw.println(mBootSendUserPresent); pw.print(" mExternallyEnabled: "); pw.println(mExternallyEnabled); + pw.print(" mShuttingDown: "); pw.println(mShuttingDown); pw.print(" mNeedToReshowWhenReenabled: "); pw.println(mNeedToReshowWhenReenabled); pw.print(" mShowing: "); pw.println(mShowing); pw.print(" mInputRestricted: "); pw.println(mInputRestricted); diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java index b831235d1179..367c51c21a91 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java @@ -37,6 +37,7 @@ import android.provider.Settings; import android.util.Slog; +import com.android.internal.messages.SystemMessageProto.SystemMessage; import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.statusbar.phone.PhoneStatusBar; @@ -49,7 +50,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { private static final String TAG = PowerUI.TAG + ".Notification"; private static final boolean DEBUG = PowerUI.DEBUG; - private static final String TAG_NOTIFICATION = "low_battery"; + private static final String TAG_BATTERY = "low_battery"; + private static final String TAG_TEMPERATURE = "high_temp"; private static final int SHOWING_NOTHING = 0; private static final int SHOWING_WARNING = 1; @@ -64,6 +66,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { private static final String ACTION_SHOW_BATTERY_SETTINGS = "PNW.batterySettings"; private static final String ACTION_START_SAVER = "PNW.startSaver"; private static final String ACTION_DISMISSED_WARNING = "PNW.dismissedWarning"; + private static final String ACTION_CLICKED_TEMP_WARNING = "PNW.clickedTempWarning"; + private static final String ACTION_DISMISSED_TEMP_WARNING = "PNW.dismissedTempWarning"; private static final AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) @@ -88,6 +92,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { private boolean mPlaySound; private boolean mInvalidCharger; private SystemUIDialog mSaverConfirmation; + private boolean mTempWarning; + private SystemUIDialog mHighTempDialog; public PowerNotificationWarnings(Context context, PhoneStatusBar phoneStatusBar) { mContext = context; @@ -103,6 +109,8 @@ public void dump(PrintWriter pw) { pw.print("mInvalidCharger="); pw.println(mInvalidCharger); pw.print("mShowing="); pw.println(SHOWING_STRINGS[mShowing]); pw.print("mSaverConfirmation="); pw.println(mSaverConfirmation != null ? "not null" : null); + pw.print("mTempWarning="); pw.println(mTempWarning); + pw.print("mHighTempDialog="); pw.println(mHighTempDialog != null ? "not null" : null); } @Override @@ -127,7 +135,8 @@ private void updateNotification() { showWarningNotification(); mShowing = SHOWING_WARNING; } else { - mNoMan.cancelAsUser(TAG_NOTIFICATION, R.id.notification_power, UserHandle.ALL); + mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_BAD_CHARGER, UserHandle.ALL); + mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_POWER_LOW, UserHandle.ALL); mShowing = SHOWING_NOTHING; } } @@ -146,7 +155,8 @@ private void showInvalidChargerNotification() { com.android.internal.R.color.system_notification_accent_color)); SystemUI.overrideNotificationAppName(mContext, nb); final Notification n = nb.build(); - mNoMan.notifyAsUser(TAG_NOTIFICATION, R.id.notification_power, n, UserHandle.ALL); + mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_POWER_LOW, UserHandle.ALL); + mNoMan.notifyAsUser(TAG_BATTERY, SystemMessage.NOTE_BAD_CHARGER, n, UserHandle.ALL); } private void showWarningNotification() { @@ -176,12 +186,9 @@ private void showWarningNotification() { mPlaySound = false; } SystemUI.overrideNotificationAppName(mContext, nb); - mNoMan.notifyAsUser(TAG_NOTIFICATION, R.id.notification_power, nb.build(), UserHandle.ALL); - } - - private PendingIntent pendingActivity(Intent intent) { - return PendingIntent.getActivityAsUser(mContext, - 0, intent, 0, null, UserHandle.CURRENT); + final Notification n = nb.build(); + mNoMan.cancelAsUser(TAG_BATTERY, SystemMessage.NOTE_BAD_CHARGER, UserHandle.ALL); + mNoMan.notifyAsUser(TAG_BATTERY, SystemMessage.NOTE_POWER_LOW, n, UserHandle.ALL); } private PendingIntent pendingBroadcast(String action) { @@ -202,6 +209,61 @@ public boolean isInvalidChargerWarningShowing() { return mInvalidCharger; } + @Override + public void dismissTemperatureWarning() { + if (!mTempWarning) { + return; + } + mTempWarning = false; + dismissTemperatureWarningInternal(); + } + + /** + * Internal only version of {@link #dismissTemperatureWarning()} that simply dismisses + * the notification. As such, the notification will not show again until + * {@link #dismissTemperatureWarning()} is called. + */ + private void dismissTemperatureWarningInternal() { + mNoMan.cancelAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_HIGH_TEMP, UserHandle.ALL); + } + + @Override + public void showTemperatureWarning() { + if (mTempWarning) { + return; + } + mTempWarning = true; + final Notification.Builder nb = new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_device_thermostat_24) + .setWhen(0) + .setShowWhen(false) + .setContentTitle(mContext.getString(R.string.high_temp_title)) + .setContentText(mContext.getString(R.string.high_temp_notif_message)) + .setPriority(Notification.PRIORITY_HIGH) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .setContentIntent(pendingBroadcast(ACTION_CLICKED_TEMP_WARNING)) + .setDeleteIntent(pendingBroadcast(ACTION_DISMISSED_TEMP_WARNING)) + .setColor(mContext.getColor( + com.android.internal.R.color.battery_saver_mode_color)); + SystemUI.overrideNotificationAppName(mContext, nb); + final Notification n = nb.build(); + mNoMan.notifyAsUser(TAG_TEMPERATURE, SystemMessage.NOTE_HIGH_TEMP, n, UserHandle.ALL); + + } + + private void showTemperatureDialog() { + if (mHighTempDialog != null) return; + final SystemUIDialog d = new SystemUIDialog(mContext); + d.setIconAttribute(android.R.attr.alertDialogIcon); + d.setTitle(R.string.high_temp_title); + d.setMessage(R.string.high_temp_dialog_message); + d.setPositiveButton(com.android.internal.R.string.ok, null); + d.setShowForAllUsers(true); + d.setOnDismissListener(dialog -> mHighTempDialog = null); + d.show(); + mHighTempDialog = d; + } + @Override public void updateLowBatteryWarning() { updateNotification(); @@ -315,6 +377,8 @@ public void init() { filter.addAction(ACTION_SHOW_BATTERY_SETTINGS); filter.addAction(ACTION_START_SAVER); filter.addAction(ACTION_DISMISSED_WARNING); + filter.addAction(ACTION_CLICKED_TEMP_WARNING); + filter.addAction(ACTION_DISMISSED_TEMP_WARNING); mContext.registerReceiverAsUser(this, UserHandle.ALL, filter, android.Manifest.permission.STATUS_BAR_SERVICE, mHandler); } @@ -331,6 +395,11 @@ public void onReceive(Context context, Intent intent) { showStartSaverConfirmation(); } else if (action.equals(ACTION_DISMISSED_WARNING)) { dismissLowBatteryWarning(); + } else if (ACTION_CLICKED_TEMP_WARNING.equals(action)) { + dismissTemperatureWarningInternal(); + showTemperatureDialog(); + } else if (ACTION_DISMISSED_TEMP_WARNING.equals(action)) { + dismissTemperatureWarningInternal(); } } } diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java index 109a45660754..13b8bd64c425 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java @@ -21,16 +21,20 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.res.Resources; import android.database.ContentObserver; import android.os.BatteryManager; import android.os.Handler; +import android.os.HardwarePropertiesManager; import android.os.PowerManager; import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; +import android.text.format.DateUtils; import android.util.Log; import android.util.Slog; - +import com.android.internal.logging.MetricsLogger; +import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.statusbar.phone.PhoneStatusBar; @@ -41,11 +45,15 @@ public class PowerUI extends SystemUI { static final String TAG = "PowerUI"; static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + private static final long TEMPERATURE_INTERVAL = 30 * DateUtils.SECOND_IN_MILLIS; + private static final long TEMPERATURE_LOGGING_INTERVAL = DateUtils.HOUR_IN_MILLIS; + private static final int MAX_RECENT_TEMPS = 125; // TEMPERATURE_LOGGING_INTERVAL plus a buffer private final Handler mHandler = new Handler(); private final Receiver mReceiver = new Receiver(); private PowerManager mPowerManager; + private HardwarePropertiesManager mHardwarePropertiesManager; private WarningsUI mWarnings; private int mBatteryLevel = 100; private int mBatteryStatus = BatteryManager.BATTERY_STATUS_UNKNOWN; @@ -57,8 +65,15 @@ public class PowerUI extends SystemUI { private long mScreenOffTime = -1; + private float mThresholdTemp; + private float[] mRecentTemps = new float[MAX_RECENT_TEMPS]; + private int mNumTemps; + private long mNextLogTime; + public void start() { mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); + mHardwarePropertiesManager = (HardwarePropertiesManager) + mContext.getSystemService(Context.HARDWARE_PROPERTIES_SERVICE); mScreenOffTime = mPowerManager.isScreenOn() ? -1 : SystemClock.elapsedRealtime(); mWarnings = new PowerNotificationWarnings(mContext, getComponent(PhoneStatusBar.class)); @@ -74,6 +89,8 @@ public void onChange(boolean selfChange) { false, obs, UserHandle.USER_ALL); updateBatteryWarningLevels(); mReceiver.init(); + + initTemperatureWarning(); } void updateBatteryWarningLevels() { @@ -209,6 +226,107 @@ public void onReceive(Context context, Intent intent) { } }; + private void initTemperatureWarning() { + ContentResolver resolver = mContext.getContentResolver(); + Resources resources = mContext.getResources(); + if (Settings.Global.getInt(resolver, Settings.Global.SHOW_TEMPERATURE_WARNING, + resources.getInteger(R.integer.config_showTemperatureWarning)) == 0) { + return; + } + + mThresholdTemp = Settings.Global.getFloat(resolver, Settings.Global.WARNING_TEMPERATURE, + resources.getInteger(R.integer.config_warningTemperature)); + + if (mThresholdTemp < 0f) { + // Get the throttling temperature. No need to check if we're not throttling. + float[] throttlingTemps = mHardwarePropertiesManager.getDeviceTemperatures( + HardwarePropertiesManager.DEVICE_TEMPERATURE_SKIN, + HardwarePropertiesManager.TEMPERATURE_THROTTLING); + if (throttlingTemps == null + || throttlingTemps.length == 0 + || throttlingTemps[0] == HardwarePropertiesManager.UNDEFINED_TEMPERATURE) { + return; + } + mThresholdTemp = throttlingTemps[0]; + } + setNextLogTime(); + + // We have passed all of the checks, start checking the temp + updateTemperatureWarning(); + } + + private void updateTemperatureWarning() { + float[] temps = mHardwarePropertiesManager.getDeviceTemperatures( + HardwarePropertiesManager.DEVICE_TEMPERATURE_SKIN, + HardwarePropertiesManager.TEMPERATURE_CURRENT); + if (temps.length != 0) { + float temp = temps[0]; + mRecentTemps[mNumTemps++] = temp; + + PhoneStatusBar phoneStatusBar = getComponent(PhoneStatusBar.class); + if (phoneStatusBar != null && !phoneStatusBar.isDeviceInVrMode() + && temp >= mThresholdTemp) { + logAtTemperatureThreshold(temp); + mWarnings.showTemperatureWarning(); + } else { + mWarnings.dismissTemperatureWarning(); + } + } + + logTemperatureStats(); + + mHandler.postDelayed(this::updateTemperatureWarning, TEMPERATURE_INTERVAL); + } + + private void logAtTemperatureThreshold(float temp) { + StringBuilder sb = new StringBuilder(); + sb.append("currentTemp=").append(temp) + .append(",thresholdTemp=").append(mThresholdTemp) + .append(",batteryStatus=").append(mBatteryStatus) + .append(",recentTemps="); + for (int i = 0; i < mNumTemps; i++) { + sb.append(mRecentTemps[i]).append(','); + } + Slog.i(TAG, sb.toString()); + } + + /** + * Calculates and logs min, max, and average + * {@link HardwarePropertiesManager#DEVICE_TEMPERATURE_SKIN} over the past + * {@link #TEMPERATURE_LOGGING_INTERVAL}. + */ + private void logTemperatureStats() { + if (mNextLogTime > System.currentTimeMillis() && mNumTemps != MAX_RECENT_TEMPS) { + return; + } + + if (mNumTemps > 0) { + float sum = mRecentTemps[0], min = mRecentTemps[0], max = mRecentTemps[0]; + for (int i = 1; i < mNumTemps; i++) { + float temp = mRecentTemps[i]; + sum += temp; + if (temp > max) { + max = temp; + } + if (temp < min) { + min = temp; + } + } + + float avg = sum / mNumTemps; + Slog.i(TAG, "avg=" + avg + ",min=" + min + ",max=" + max); + MetricsLogger.histogram(mContext, "device_skin_temp_avg", (int) avg); + MetricsLogger.histogram(mContext, "device_skin_temp_min", (int) min); + MetricsLogger.histogram(mContext, "device_skin_temp_max", (int) max); + } + setNextLogTime(); + mNumTemps = 0; + } + + private void setNextLogTime() { + mNextLogTime = System.currentTimeMillis() + TEMPERATURE_LOGGING_INTERVAL; + } + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.print("mLowBatteryAlertCloseLevel="); pw.println(mLowBatteryAlertCloseLevel); @@ -235,6 +353,10 @@ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { Settings.Global.LOW_BATTERY_SOUND_TIMEOUT, 0)); pw.print("bucket: "); pw.println(Integer.toString(findBatteryLevelBucket(mBatteryLevel))); + pw.print("mThresholdTemp="); + pw.println(Float.toString(mThresholdTemp)); + pw.print("mNextLogTime="); + pw.println(Long.toString(mNextLogTime)); mWarnings.dump(pw); } @@ -246,6 +368,8 @@ public interface WarningsUI { void showInvalidChargerWarning(); void updateLowBatteryWarning(); boolean isInvalidChargerWarningShowing(); + void dismissTemperatureWarning(); + void showTemperatureWarning(); void dump(PrintWriter pw); void userSwitched(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index a172e19ff750..cab2608e2317 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -189,8 +189,8 @@ private void updateAnimators() { translationXBuilder.addFloat(label, "translationX", -xDiff, 0); translationYBuilder.addFloat(label, "translationY", -yDiff, 0); - mTopFiveQs.add(tileIcon); - mAllViews.add(tileIcon); + mTopFiveQs.add(tileView.getIcon()); + mAllViews.add(tileView.getIcon()); mAllViews.add(quickTileView); } else if (mFullRows && isIconInAnimatedRow(count)) { // TODO: Refactor some of this, it shares a lot with the above block. diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java index ccb28e95802e..03c7588bca9c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java @@ -24,9 +24,14 @@ import android.os.Looper; import android.os.Message; import android.os.UserHandle; +import android.provider.Settings; +import android.text.SpannableStringBuilder; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; import android.util.Log; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.TextView; @@ -46,6 +51,7 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene private final View mRootView; private final TextView mFooterText; private final ImageView mFooterIcon; + private final ImageView mFooterIcon2; private final Context mContext; private final Callback mCallback = new Callback(); @@ -57,8 +63,10 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene private boolean mIsVisible; private boolean mIsIconVisible; + private boolean mIsIcon2Visible; private int mFooterTextId; private int mFooterIconId; + private int mFooterIcon2Id; public QSFooter(QSPanel qsPanel, Context context) { mRootView = LayoutInflater.from(context) @@ -66,7 +74,9 @@ public QSFooter(QSPanel qsPanel, Context context) { mRootView.setOnClickListener(this); mFooterText = (TextView) mRootView.findViewById(R.id.footer_text); mFooterIcon = (ImageView) mRootView.findViewById(R.id.footer_icon); + mFooterIcon2 = (ImageView) mRootView.findViewById(R.id.footer_icon2); mFooterIconId = R.drawable.ic_qs_vpn; + mFooterIcon2Id = R.drawable.ic_qs_network_logging; mContext = context; mMainHandler = new Handler(); } @@ -103,6 +113,10 @@ public void onClick(View v) { } private void handleClick() { + showDeviceMonitoringDialog(); + } + + public void showDeviceMonitoringDialog() { mHost.collapsePanels(); // TODO: Delay dialog creation until after panels are collapsed. createDialog(); @@ -113,17 +127,29 @@ public void refreshState() { } private void handleRefreshState() { - mIsIconVisible = mSecurityController.isVpnEnabled(); // If the device has device owner, show "Device may be monitored", but -- // TODO See b/25779452 -- device owner doesn't actually have monitoring power. + boolean isVpnEnabled = mSecurityController.isVpnEnabled(); + boolean isNetworkLoggingEnabled = mSecurityController.isNetworkLoggingEnabled(); + mIsIconVisible = isVpnEnabled || isNetworkLoggingEnabled; + mIsIcon2Visible = isVpnEnabled && isNetworkLoggingEnabled; if (mSecurityController.isDeviceManaged()) { mFooterTextId = R.string.device_owned_footer; mIsVisible = true; + int footerIconId = isVpnEnabled + ? R.drawable.ic_qs_vpn + : R.drawable.ic_qs_network_logging; + if (mFooterIconId != footerIconId) { + mFooterIconId = footerIconId; + mMainHandler.post(mUpdateIcon); + } } else { boolean isBranded = mSecurityController.isVpnBranded(); mFooterTextId = isBranded ? R.string.branded_vpn_footer : R.string.vpn_footer; // Update the VPN footer icon, if needed. - int footerIconId = isBranded ? R.drawable.ic_qs_branded_vpn : R.drawable.ic_qs_vpn; + int footerIconId = isVpnEnabled + ? (isBranded ? R.drawable.ic_qs_branded_vpn : R.drawable.ic_qs_vpn) + : R.drawable.ic_qs_network_logging; if (mFooterIconId != footerIconId) { mFooterIconId = footerIconId; mMainHandler.post(mUpdateIcon); @@ -142,24 +168,65 @@ public void onClick(DialogInterface dialog, int which) { } private void createDialog() { - String deviceOwner = mSecurityController.getDeviceOwnerName(); - String profileOwner = mSecurityController.getProfileOwnerName(); - String primaryVpn = mSecurityController.getPrimaryVpnName(); - String profileVpn = mSecurityController.getProfileVpnName(); - boolean managed = mSecurityController.hasProfileOwner(); - boolean isBranded = deviceOwner == null && mSecurityController.isVpnBranded(); + final String deviceOwnerPackage = mSecurityController.getDeviceOwnerName(); + final String profileOwnerPackage = mSecurityController.getProfileOwnerName(); + final boolean isNetworkLoggingEnabled = mSecurityController.isNetworkLoggingEnabled(); + final String primaryVpn = mSecurityController.getPrimaryVpnName(); + final String profileVpn = mSecurityController.getProfileVpnName(); + boolean hasProfileOwner = mSecurityController.hasProfileOwner(); + boolean isBranded = deviceOwnerPackage == null && mSecurityController.isVpnBranded(); mDialog = new SystemUIDialog(mContext); if (!isBranded) { - mDialog.setTitle(getTitle(deviceOwner)); + mDialog.setTitle(getTitle(deviceOwnerPackage)); } - mDialog.setMessage(getMessage(deviceOwner, profileOwner, primaryVpn, profileVpn, managed, - isBranded)); - mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(isBranded), this); - if (mSecurityController.isVpnEnabled() && !mSecurityController.isVpnRestricted()) { - mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getSettingsButton(), this); + CharSequence msg = getMessage(deviceOwnerPackage, profileOwnerPackage, primaryVpn, + profileVpn, hasProfileOwner, isBranded); + if (deviceOwnerPackage == null) { + mDialog.setMessage(msg); + if (mSecurityController.isVpnEnabled() && !mSecurityController.isVpnRestricted()) { + mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getSettingsButton(), this); + } + } else { + View dialogView = LayoutInflater.from(mContext) + .inflate(R.layout.quick_settings_footer_dialog, null, false); + mDialog.setView(dialogView); + TextView deviceOwnerWarning = + (TextView) dialogView.findViewById(R.id.device_owner_warning); + deviceOwnerWarning.setText(msg); + // Make the link "learn more" clickable. + deviceOwnerWarning.setMovementMethod(new LinkMovementMethod()); + if (primaryVpn == null) { + dialogView.findViewById(R.id.vpn_icon).setVisibility(View.GONE); + dialogView.findViewById(R.id.vpn_subtitle).setVisibility(View.GONE); + dialogView.findViewById(R.id.vpn_warning).setVisibility(View.GONE); + } else { + final SpannableStringBuilder message = new SpannableStringBuilder(); + message.append(mContext.getString(R.string.monitoring_description_do_body_vpn, + primaryVpn)); + if (!mSecurityController.isVpnRestricted()) { + message.append(mContext.getString( + R.string.monitoring_description_vpn_settings_separator)); + message.append(mContext.getString(R.string.monitoring_description_vpn_settings), + new VpnSpan(), 0); + } + + TextView vpnWarning = (TextView) dialogView.findViewById(R.id.vpn_warning); + vpnWarning.setText(message); + // Make the link "Open VPN Settings" clickable. + vpnWarning.setMovementMethod(new LinkMovementMethod()); + } + if (!isNetworkLoggingEnabled) { + dialogView.findViewById(R.id.network_logging_icon).setVisibility(View.GONE); + dialogView.findViewById(R.id.network_logging_subtitle).setVisibility(View.GONE); + dialogView.findViewById(R.id.network_logging_warning).setVisibility(View.GONE); + } } + + mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(isBranded), this); mDialog.show(); + mDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); } private String getSettingsButton() { @@ -170,22 +237,15 @@ private String getPositiveButton(boolean isBranded) { return mContext.getString(isBranded ? android.R.string.ok : R.string.quick_settings_done); } - private String getMessage(String deviceOwner, String profileOwner, String primaryVpn, - String profileVpn, boolean primaryUserIsManaged, boolean isBranded) { - // Show a special warning when the device has device owner, but -- - // TODO See b/25779452 -- device owner doesn't actually have monitoring power. - if (deviceOwner != null) { - if (primaryVpn != null) { - return mContext.getString(R.string.monitoring_description_vpn_app_device_owned, - deviceOwner, primaryVpn); - } else { - return mContext.getString(R.string.monitoring_description_device_owned, - deviceOwner); - } + protected CharSequence getMessage(String deviceOwnerPackage, String profileOwnerPackage, + String primaryVpn, String profileVpn, boolean hasProfileOwner, boolean isBranded) { + if (deviceOwnerPackage != null) { + return mContext.getString(R.string.monitoring_description_device_owned, + deviceOwnerPackage); } else if (primaryVpn != null) { if (profileVpn != null) { return mContext.getString(R.string.monitoring_description_app_personal_work, - profileOwner, profileVpn, primaryVpn); + profileOwnerPackage, profileVpn, primaryVpn); } else { if (isBranded) { return mContext.getString(R.string.branded_monitoring_description_app_personal, @@ -197,10 +257,10 @@ private String getMessage(String deviceOwner, String profileOwner, String primar } } else if (profileVpn != null) { return mContext.getString(R.string.monitoring_description_app_work, - profileOwner, profileVpn); - } else if (profileOwner != null && primaryUserIsManaged) { + profileOwnerPackage, profileVpn); + } else if (profileOwnerPackage != null && hasProfileOwner) { return mContext.getString(R.string.monitoring_description_device_owned, - profileOwner); + profileOwnerPackage); } else { // No device owner, no personal VPN, no work VPN, no user owner. Why are we here? return null; @@ -219,6 +279,7 @@ private int getTitle(String deviceOwner) { @Override public void run() { mFooterIcon.setImageResource(mFooterIconId); + mFooterIcon2.setImageResource(mFooterIcon2Id); } }; @@ -230,6 +291,7 @@ public void run() { } mRootView.setVisibility(mIsVisible ? View.VISIBLE : View.GONE); mFooterIcon.setVisibility(mIsIconVisible ? View.VISIBLE : View.INVISIBLE); + mFooterIcon2.setVisibility(mIsIcon2Visible ? View.VISIBLE : View.INVISIBLE); } }; @@ -267,4 +329,13 @@ public void handleMessage(Message msg) { } } + protected class VpnSpan extends ClickableSpan { + @Override + public void onClick(View widget) { + final Intent intent = new Intent(Settings.ACTION_VPN_SETTINGS); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + mDialog.dismiss(); + mContext.startActivity(intent); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index a0a6a7c175aa..61812b6d2a26 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -514,6 +514,10 @@ public QSFooter getFooter() { return mFooter; } + public void showDeviceMonitoringDialog() { + mFooter.showDeviceMonitoringDialog(); + } + private class H extends Handler { private static final int SHOW_DETAIL = 1; private static final int SET_TILE_VISIBILITY = 2; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java index 2fda6eac6e0b..f743a4bf1a82 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java @@ -486,10 +486,19 @@ public DrawableIcon(Drawable drawable) { public Drawable getDrawable(Context context) { return mDrawable; } + } + + public static class DrawableIconWithRes extends DrawableIcon { + private final int mId; + + public DrawableIconWithRes(Drawable drawable, int id) { + super(drawable); + mId = id; + } @Override - public Drawable getInvisibleDrawable(Context context) { - return mDrawable; + public boolean equals(Object o) { + return o instanceof DrawableIconWithRes && ((DrawableIconWithRes) o).mId == mId; } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java index 2fd62f1ebf26..dfd2b77f7e79 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java @@ -17,11 +17,14 @@ import android.app.ActivityManager; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Binder; import android.os.IBinder; @@ -60,6 +63,7 @@ public class CustomTile extends QSTile implements TileChangeListen private final IQSTileService mService; private final TileServiceManager mServiceManager; private final int mUser; + private Context mAppContext; private android.graphics.drawable.Icon mDefaultIcon; private boolean mListening; @@ -77,6 +81,10 @@ private CustomTile(QSTileHost host, String action) { mService = mServiceManager.getTileService(); mServiceManager.setTileChangeListener(this); mUser = ActivityManager.getCurrentUser(); + try { + mAppContext = mContext.createPackageContext(mComponent.getPackageName(), 0); + } catch (NameNotFoundException e) { + } } private void setTileIcon() { @@ -282,16 +290,20 @@ protected void handleUpdateState(State state, Object arg) { tileState = Tile.STATE_UNAVAILABLE; } Drawable drawable; + boolean mHasRes = false; + android.graphics.drawable.Icon icon = mTile.getIcon(); try { - drawable = mTile.getIcon().loadDrawable(mContext); + drawable = icon.loadDrawable(mAppContext); + mHasRes = icon.getType() == android.graphics.drawable.Icon.TYPE_RESOURCE; } catch (Exception e) { Log.w(TAG, "Invalid icon, forcing into unavailable state"); tileState = Tile.STATE_UNAVAILABLE; - drawable = mDefaultIcon.loadDrawable(mContext); + drawable = mDefaultIcon.loadDrawable(mAppContext); } int color = mContext.getColor(getColor(tileState)); drawable.setTint(color); - state.icon = new DrawableIcon(drawable); + state.icon = mHasRes ? new DrawableIconWithRes(drawable, icon.getResId()) + : new DrawableIcon(drawable); state.label = mTile.getLabel(); if (tileState == Tile.STATE_UNAVAILABLE) { state.label = new SpannableStringBuilder().append(state.label, diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 0de5105485dc..b34e881c1708 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -35,7 +35,7 @@ import com.android.systemui.qs.SignalTileView; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.IconState; -import com.android.systemui.statusbar.policy.SignalCallbackAdapter; +import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; /** Quick settings tile: Cellular **/ public class CellularTile extends QSTile { @@ -183,9 +183,10 @@ private static final class CallbackInfo { String enabledDesc; boolean noSim; boolean isDataTypeIconWide; + boolean roaming; } - private final class CellSignalCallback extends SignalCallbackAdapter { + private final class CellSignalCallback implements SignalCallback { private final CallbackInfo mInfo = new CallbackInfo(); @Override public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, @@ -197,7 +198,7 @@ public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState q @Override public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId) { + String description, boolean isWide, int subId, boolean roaming) { if (qsIcon == null) { // Not data sim, don't display. return; @@ -211,6 +212,7 @@ public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int mInfo.activityOut = activityOut; mInfo.enabledDesc = description; mInfo.isDataTypeIconWide = qsType != 0 && isWide; + mInfo.roaming = roaming; refreshState(mInfo); } @@ -280,6 +282,8 @@ public View createDetailView(Context context, View convertView, ViewGroup parent final DataUsageController.DataUsageInfo info = mDataController.getDataUsageInfo(); if (info == null) return v; v.bind(info); + v.findViewById(R.id.roaming_text).setVisibility(mSignalCallback.mInfo.roaming + ? View.VISIBLE : View.INVISIBLE); return v; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index 9ce1f316c23f..2e922e9f7bd3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -39,7 +39,7 @@ import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; import com.android.systemui.statusbar.policy.NetworkController.IconState; -import com.android.systemui.statusbar.policy.SignalCallbackAdapter; +import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import java.util.List; @@ -245,7 +245,7 @@ public String toString() { } } - protected final class WifiSignalCallback extends SignalCallbackAdapter { + protected final class WifiSignalCallback implements SignalCallback { final CallbackInfo mInfo = new CallbackInfo(); @Override diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index 5b25f0525d92..ba50c663a6bd 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -61,6 +61,8 @@ import com.android.systemui.stackdivider.Divider; import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; /** @@ -77,6 +79,12 @@ 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 RECENTS_ACTIVITIES = new HashSet<>(); + static { + RECENTS_ACTIVITIES.add(RecentsImpl.RECENTS_ACTIVITY); + RECENTS_ACTIVITIES.add(RecentsTvImpl.RECENTS_TV_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"; diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index 70642edde3ef..764397b93881 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -31,6 +31,7 @@ import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; +import android.provider.Settings.Secure; import android.util.Log; import android.view.KeyEvent; import android.view.View; @@ -42,7 +43,6 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.systemui.Interpolators; -import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent; @@ -74,6 +74,8 @@ import com.android.systemui.recents.events.ui.focus.DismissFocusedTaskViewEvent; import com.android.systemui.recents.events.ui.focus.FocusNextTaskViewEvent; import com.android.systemui.recents.events.ui.focus.FocusPreviousTaskViewEvent; +import com.android.systemui.recents.events.ui.focus.NavigateTaskViewEvent; +import com.android.systemui.recents.events.ui.focus.NavigateTaskViewEvent.Direction; import com.android.systemui.recents.misc.DozeTrigger; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.misc.Utilities; @@ -177,8 +179,10 @@ public void onReceive(Context ctx, Intent intent) { // is still valid. Otherwise, we need to reset the lastStackactiveTime to the // currentTime and remove the old tasks in between which would not be previously // visible, but currently would be in the new currentTime - long oldLastStackActiveTime = Prefs.getLong(RecentsActivity.this, - Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, -1); + int currentUser = SystemServicesProxy.getInstance(RecentsActivity.this) + .getCurrentUser(); + long oldLastStackActiveTime = Settings.Secure.getLongForUser(getContentResolver(), + Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, -1, currentUser); if (oldLastStackActiveTime != -1) { long currentTime = System.currentTimeMillis(); if (currentTime < oldLastStackActiveTime) { @@ -196,8 +200,8 @@ public void onReceive(Context ctx, Intent intent) { Recents.getSystemServices().removeTask(task.persistentId); } } - Prefs.putLong(RecentsActivity.this, - Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, currentTime); + Settings.Secure.putLongForUser(RecentsActivity.this.getContentResolver(), + Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, currentTime, currentUser); } } } @@ -590,13 +594,12 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { } return true; } - case KeyEvent.KEYCODE_DPAD_UP: { - EventBus.getDefault().send( - new FocusNextTaskViewEvent(0 /* timerIndicatorDuration */)); - return true; - } - case KeyEvent.KEYCODE_DPAD_DOWN: { - EventBus.getDefault().send(new FocusPreviousTaskViewEvent()); + case KeyEvent.KEYCODE_DPAD_UP: + case KeyEvent.KEYCODE_DPAD_DOWN: + case KeyEvent.KEYCODE_DPAD_LEFT: + case KeyEvent.KEYCODE_DPAD_RIGHT: { + final Direction direction = NavigateTaskViewEvent.getDirectionFromKeyCode(keyCode); + EventBus.getDefault().send(new NavigateTaskViewEvent(direction)); return true; } case KeyEvent.KEYCODE_DEL: @@ -824,8 +827,9 @@ public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] Recents.getTaskLoader().dump(prefix, writer); String id = Integer.toHexString(System.identityHashCode(this)); - long lastStackActiveTime = Prefs.getLong(this, - Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, -1); + long lastStackActiveTime = Settings.Secure.getLongForUser(getContentResolver(), + Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, -1, + SystemServicesProxy.getInstance(this).getCurrentUser()); writer.print(prefix); writer.print(TAG); writer.print(" visible="); writer.print(mIsVisible ? "Y" : "N"); diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java index 914035bc525c..a7f6b70d281e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivityLaunchState.java @@ -50,7 +50,7 @@ public void reset() { /** * Returns the task to focus given the current launch state. */ - public int getInitialFocusTaskIndex(int numTasks) { + public int getInitialFocusTaskIndex(int numTasks, boolean useGridLayout) { RecentsDebugFlags debugFlags = Recents.getDebugFlags(); RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState(); if (launchedFromApp) { @@ -66,6 +66,11 @@ public int getInitialFocusTaskIndex(int numTasks) { return numTasks - 1; } + if (useGridLayout) { + // If coming from another app to the grid layout, focus the front most task + return numTasks - 1; + } + // If coming from another app, focus the next task return Math.max(0, numTasks - 2); } else { diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java index 73c6e6e89c58..711f0c679b6d 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java @@ -20,6 +20,7 @@ import android.content.res.Resources; import android.graphics.Rect; +import android.os.SystemProperties; import com.android.systemui.R; import com.android.systemui.recents.misc.SystemServicesProxy; @@ -58,6 +59,10 @@ public class RecentsConfiguration { public boolean fakeShadows; public int svelteLevel; + // Whether this product supports Grid-based Recents. If this is field is set to true, then + // Recents will layout task views in a grid mode when there's enough space in the screen. + public boolean isGridEnabled; + public RecentsConfiguration(Context context) { // Load only resources that can not change after the first load either through developer // settings or via multi window @@ -66,6 +71,7 @@ public RecentsConfiguration(Context context) { Resources res = appContext.getResources(); fakeShadows = res.getBoolean(R.bool.config_recents_fake_shadows); svelteLevel = res.getInteger(R.integer.recents_svelte_level); + isGridEnabled = SystemProperties.getBoolean("ro.recents.grid", false); float screenDensity = context.getResources().getDisplayMetrics().density; smallestWidth = ssp.getDeviceSmallestWidth(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index 42d1b61a4add..d34f5c4c2b98 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -50,6 +50,7 @@ import com.android.systemui.recents.events.activity.EnterRecentsWindowLastAnimationFrameEvent; import com.android.systemui.recents.events.activity.HideRecentsEvent; import com.android.systemui.recents.events.activity.IterateRecentsEvent; +import com.android.systemui.recents.events.activity.LaunchMostRecentTaskRequestEvent; import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent; import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; import com.android.systemui.recents.events.activity.ToggleRecentsEvent; @@ -71,6 +72,7 @@ import com.android.systemui.recents.views.TaskStackViewScroller; import com.android.systemui.recents.views.TaskViewHeader; import com.android.systemui.recents.views.TaskViewTransform; +import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm; import com.android.systemui.stackdivider.DividerView; import com.android.systemui.statusbar.BaseStatusBar; import com.android.systemui.statusbar.phone.NavigationBarGestureHelper; @@ -180,10 +182,7 @@ public RecentsImpl(Context context) { ssp.registerTaskStackListener(mTaskStackListener); // Initialize the static configuration resources - LayoutInflater inflater = LayoutInflater.from(mContext); mDummyStackView = new TaskStackView(mContext); - mHeaderBar = (TaskViewHeader) inflater.inflate(R.layout.recents_task_view_header, - null, false); reloadResources(); } @@ -204,14 +203,6 @@ public void onConfigurationChanged() { Resources res = mContext.getResources(); reloadResources(); mDummyStackView.reloadOnConfigurationChange(); - // Update the header bar direction directly as it is not attached to anything and does not - // layout except in updateHeaderBarLayout() - mHeaderBar.setLayoutDirection(res.getConfiguration().getLayoutDirection()); - mHeaderBar.onConfigurationChanged(); - mHeaderBar.forceLayout(); - mHeaderBar.measure( - MeasureSpec.makeMeasureSpec(mHeaderBar.getMeasuredWidth(), MeasureSpec.EXACTLY), - MeasureSpec.makeMeasureSpec(mHeaderBar.getMeasuredHeight(), MeasureSpec.EXACTLY)); } /** @@ -314,15 +305,23 @@ public void toggleRecents(int growTarget) { RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); if (!launchState.launchedWithAltTab) { - // If the user taps quickly - if (!debugFlags.isPagingEnabled() || - (ViewConfiguration.getDoubleTapMinTime() < elapsedTime && - elapsedTime < ViewConfiguration.getDoubleTapTimeout())) { - // Launch the next focused task - EventBus.getDefault().post(new LaunchNextTaskRequestEvent()); + // Has the user tapped quickly? + boolean isQuickTap = ViewConfiguration.getDoubleTapMinTime() < elapsedTime && + elapsedTime < ViewConfiguration.getDoubleTapTimeout(); + if (Recents.getConfiguration().isGridEnabled) { + if (isQuickTap) { + EventBus.getDefault().post(new LaunchNextTaskRequestEvent()); + } else { + EventBus.getDefault().post(new LaunchMostRecentTaskRequestEvent()); + } } else { - // Notify recents to move onto the next task - EventBus.getDefault().post(new IterateRecentsEvent()); + if (!debugFlags.isPagingEnabled() || isQuickTap) { + // Launch the next focused task + EventBus.getDefault().post(new LaunchNextTaskRequestEvent()); + } else { + // Notify recents to move onto the next task + EventBus.getDefault().post(new IterateRecentsEvent()); + } } } else { // If the user has toggled it too quickly, then just eat up the event here (it's @@ -582,7 +581,13 @@ private void reloadResources() { R.dimen.recents_task_view_header_height, R.dimen.recents_task_view_header_height_tablet_land, R.dimen.recents_task_view_header_height, - R.dimen.recents_task_view_header_height_tablet_land); + R.dimen.recents_task_view_header_height_tablet_land, + R.dimen.recents_grid_task_view_header_height); + + LayoutInflater inflater = LayoutInflater.from(mContext); + mHeaderBar = (TaskViewHeader) inflater.inflate(R.layout.recents_task_view_header, + null, false); + mHeaderBar.setLayoutDirection(res.getConfiguration().getLayoutDirection()); } /** @@ -623,13 +628,28 @@ private void updateHeaderBarLayout(TaskStack stack, Rect windowRectOverride) { stackLayout.initialize(displayRect, windowRect, mTaskStackBounds, TaskStackLayoutAlgorithm.StackState.getStackStateForStack(stack)); mDummyStackView.setTasks(stack, false /* allowNotifyStackChanges */); + // Get the width of a task view so that we know how wide to draw the header bar. + int taskViewWidth = 0; + if (mDummyStackView.useGridLayout()) { + TaskGridLayoutAlgorithm gridLayout = mDummyStackView.getGridAlgorithm(); + gridLayout.initialize(windowRect); + taskViewWidth = (int) gridLayout.getTransform(0 /* taskIndex */, + stack.getTaskCount(), new TaskViewTransform(), stackLayout).rect.width(); + } else { + Rect taskViewBounds = stackLayout.getUntransformedTaskViewBounds(); + if (!taskViewBounds.isEmpty()) { + taskViewWidth = taskViewBounds.width(); + } + } - Rect taskViewBounds = stackLayout.getUntransformedTaskViewBounds(); - if (!taskViewBounds.isEmpty()) { - int taskViewWidth = taskViewBounds.width(); + if (taskViewWidth > 0) { synchronized (mHeaderBarLock) { if (mHeaderBar.getMeasuredWidth() != taskViewWidth || mHeaderBar.getMeasuredHeight() != mTaskBarHeight) { + if (mDummyStackView.useGridLayout()) { + mHeaderBar.setShouldDarkenBackgroundColor(true); + mHeaderBar.setNoUserInteractionState(); + } mHeaderBar.forceLayout(); mHeaderBar.measure( MeasureSpec.makeMeasureSpec(taskViewWidth, MeasureSpec.EXACTLY), @@ -739,7 +759,7 @@ private ActivityOptions getThumbnailTransitionActivityOptions( TaskViewTransform toTransform = getThumbnailTransitionTransform(stackView, toTask, windowOverrideRect); Bitmap thumbnail = drawThumbnailTransitionBitmap(toTask, toTransform, - mThumbTransitionBitmapCache); + mThumbTransitionBitmapCache); if (thumbnail != null) { RectF toTaskRect = toTransform.rect; return ActivityOptions.makeThumbnailAspectScaleDownAnimation(mDummyStackView, diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java index b961055c6fed..2e78ac0c29f8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java +++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java @@ -230,10 +230,12 @@ private void inflateView(boolean isLandscape) { .setVisibility(View.INVISIBLE); } + boolean touchExplorationEnabled = mAccessibilityService.isTouchExplorationEnabled(); ((TextView) mLayout.findViewById(R.id.screen_pinning_description)) - .setText(R.string.screen_pinning_description); - final int backBgVisibility = - mAccessibilityService.isEnabled() ? View.INVISIBLE : View.VISIBLE; + .setText(touchExplorationEnabled + ? R.string.screen_pinning_description_accessible + : R.string.screen_pinning_description); + final int backBgVisibility = touchExplorationEnabled ? View.INVISIBLE : View.VISIBLE; mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility); mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility); diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/LaunchMostRecentTaskRequestEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/LaunchMostRecentTaskRequestEvent.java new file mode 100644 index 000000000000..24913a4c2ca6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/events/activity/LaunchMostRecentTaskRequestEvent.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2017 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.events.activity; + +import com.android.systemui.recents.events.EventBus; + +/** + * This event is sent to request that the most recent task is launched. + */ +public class LaunchMostRecentTaskRequestEvent extends EventBus.Event { + // Simple event +} diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/ui/focus/NavigateTaskViewEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/ui/focus/NavigateTaskViewEvent.java new file mode 100644 index 000000000000..5508d269f03f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/events/ui/focus/NavigateTaskViewEvent.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2017 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.events.ui.focus; + +import android.view.KeyEvent; +import com.android.systemui.recents.events.EventBus; + +/** + * Navigates the task view by arrow keys. + */ +public class NavigateTaskViewEvent extends EventBus.Event { + public enum Direction { + UNDEFINED, UP, DOWN, LEFT, RIGHT; + } + + public Direction direction; + public NavigateTaskViewEvent(Direction direction) { + this.direction = direction; + } + + public static Direction getDirectionFromKeyCode(int keyCode) { + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_UP: + return Direction.UP; + case KeyEvent.KEYCODE_DPAD_DOWN: + return Direction.DOWN; + case KeyEvent.KEYCODE_DPAD_LEFT: + return Direction.LEFT; + case KeyEvent.KEYCODE_DPAD_RIGHT: + return Direction.RIGHT; + default: + return Direction.UNDEFINED; + } + } +} 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 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 boolean isRecentsActivityVisible(MutableBoolean isHomeStackVisible) { } 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/misc/Utilities.java b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java index 2c5c437bfab0..d64fc364cc86 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java @@ -79,14 +79,15 @@ public Rect get(Drawable object) { public static final Rect EMPTY_RECT = new Rect(); /** - * @return the first parent walking up the view hierarchy that has the given class type. + * @return the first parent walking up the view hierarchy that has the given class type (or + * a subclass). * * @param parentClass must be a class derived from {@link View} */ public static T findParent(View v, Class parentClass) { ViewParent parent = v.getParent(); while (parent != null) { - if (parent.getClass().equals(parentClass)) { + if (parentClass.isAssignableFrom(parent.getClass())) { return (T) parent; } parent = parent.getParent(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java index 9b48e4d02623..0ca4cb9031a4 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java @@ -26,6 +26,8 @@ import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.os.UserManager; +import android.provider.Settings; +import android.provider.Settings.Secure; import android.util.ArraySet; import android.util.SparseArray; import android.util.SparseIntArray; @@ -37,6 +39,7 @@ import com.android.systemui.recents.RecentsDebugFlags; import com.android.systemui.recents.misc.SystemServicesProxy; +import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -128,14 +131,17 @@ public synchronized void preloadPlan(RecentsTaskLoader loader, int runningTaskId preloadRawTasks(includeFrontMostExcludedTask); } + SystemServicesProxy ssp = SystemServicesProxy.getInstance(mContext); SparseArray affiliatedTasks = new SparseArray<>(); SparseIntArray affiliatedTaskCounts = new SparseIntArray(); String dismissDescFormat = mContext.getString( R.string.accessibility_recents_item_will_be_dismissed); String appInfoDescFormat = mContext.getString( R.string.accessibility_recents_item_open_app_info); - long lastStackActiveTime = Prefs.getLong(mContext, - Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, 0); + int currentUserId = ssp.getCurrentUser(); + long legacyLastStackActiveTime = migrateLegacyLastStackActiveTime(currentUserId); + long lastStackActiveTime = Settings.Secure.getLongForUser(mContext.getContentResolver(), + Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, legacyLastStackActiveTime, currentUserId); if (RecentsDebugFlags.Static.EnableMockTasks) { lastStackActiveTime = 0; } @@ -148,11 +154,19 @@ public synchronized void preloadPlan(RecentsTaskLoader loader, int runningTaskId Task.TaskKey taskKey = new Task.TaskKey(t.persistentId, t.stackId, t.baseIntent, t.userId, t.firstActiveTime, t.lastActiveTime); - // This task is only shown in the stack if it statisfies the historical time or min + // This task is only shown in the stack if it satisfies the historical time or min // number of tasks constraints. Freeform tasks are also always shown. boolean isFreeformTask = SystemServicesProxy.isFreeformStack(t.stackId); - boolean isStackTask = isFreeformTask || !isHistoricalTask(t) || + boolean isStackTask; + if (Recents.getConfiguration().isGridEnabled) { + // When grid layout is enabled, we only show the first + // TaskGridLayoutAlgorithm.MAX_LAYOUT_TASK_COUNT} tasks. + isStackTask = t.lastActiveTime >= lastStackActiveTime && + i >= taskCount - TaskGridLayoutAlgorithm.MAX_LAYOUT_TASK_COUNT; + } else { + isStackTask = isFreeformTask || !isHistoricalTask(t) || (t.lastActiveTime >= lastStackActiveTime && i >= (taskCount - MIN_NUM_TASKS)); + } boolean isLaunchTarget = taskKey.id == runningTaskId; // The last stack active time is the baseline for which we show visible tasks. Since @@ -189,8 +203,8 @@ public synchronized void preloadPlan(RecentsTaskLoader loader, int runningTaskId affiliatedTasks.put(taskKey.id, taskKey); } if (newLastStackActiveTime != -1) { - Prefs.putLong(mContext, Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, - newLastStackActiveTime); + Settings.Secure.putLongForUser(mContext.getContentResolver(), + Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, newLastStackActiveTime, currentUserId); } // Initialize the stacks @@ -269,4 +283,35 @@ public boolean hasTasks() { private boolean isHistoricalTask(ActivityManager.RecentTaskInfo t) { return t.lastActiveTime < (System.currentTimeMillis() - SESSION_BEGIN_TIME); } + + /** + * Migrate the last active time from the prefs to the secure settings. + * + * The first time this runs, it will: + * 1) fetch the last stack active time from the prefs + * 2) set the prefs to the last stack active time for all users + * 3) clear the pref + * 4) return the last stack active time + * + * Subsequent calls to this will return zero. + */ + private long migrateLegacyLastStackActiveTime(int currentUserId) { + long legacyLastStackActiveTime = Prefs.getLong(mContext, + Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, -1); + if (legacyLastStackActiveTime != -1) { + Prefs.remove(mContext, Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME); + UserManager userMgr = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + List users = userMgr.getUsers(); + for (int i = 0; i < users.size(); i++) { + int userId = users.get(i).id; + if (userId != currentUserId) { + Settings.Secure.putLongForUser(mContext.getContentResolver(), + Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, legacyLastStackActiveTime, + userId); + } + } + return legacyLastStackActiveTime; + } + return 0; + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java index 745f5a5a773e..9b25ef8faafd 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java @@ -247,6 +247,9 @@ void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask */ public static class DockState implements DropTarget { + public static final int DOCK_AREA_BG_COLOR = 0xFFffffff; + public static final int DOCK_AREA_GRID_BG_COLOR = 0xFF000000; + // The rotation to apply to the hint text @Retention(RetentionPolicy.SOURCE) @IntDef({HORIZONTAL, VERTICAL}) @@ -319,7 +322,8 @@ public Integer get(ViewState object) { private ViewState(int areaAlpha, int hintAlpha, @TextOrientation int hintOrientation, int hintTextResId) { dockAreaAlpha = areaAlpha; - dockAreaOverlay = new ColorDrawable(0xFFffffff); + dockAreaOverlay = new ColorDrawable(Recents.getConfiguration().isGridEnabled + ? DOCK_AREA_GRID_BG_COLOR : DOCK_AREA_BG_COLOR); dockAreaOverlay.setAlpha(0); hintTextAlpha = hintAlpha; hintTextOrientation = hintOrientation; @@ -435,7 +439,7 @@ public void startAnimation(Rect bounds, int areaAlpha, int hintAlpha, int durati * @param createMode used to pass to ActivityManager to dock the task * @param touchArea the area in which touch will initiate this dock state * @param dockArea the visible dock area - * @param expandedTouchDockArea the areain which touch will continue to dock after entering + * @param expandedTouchDockArea the area in which touch will continue to dock after entering * the initial touch area. This is also the new dock area to * draw. */ @@ -849,6 +853,24 @@ public Task getLaunchTarget() { return null; } + /** + * Returns the task in stack tasks which should be launched next if Recents are toggled + * again, or null if there is no task to be launched. + */ + public Task getNextLaunchTarget() { + int taskCount = getTaskCount(); + if (taskCount == 0) { + return null; + } + int launchTaskIndex = indexOfStackTask(getLaunchTarget()); + if (launchTaskIndex != -1) { + launchTaskIndex = Math.max(0, launchTaskIndex - 1); + } else { + launchTaskIndex = getTaskCount() - 1; + } + return getStackTasks().get(launchTaskIndex); + } + /** Returns the index of this task in this current task stack */ public int indexOfStackTask(Task t) { return mStackTaskList.indexOf(t); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java index 253d06a5f5f8..dba085e37427 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java @@ -30,17 +30,17 @@ public class AnimateableViewBounds extends ViewOutlineProvider { private static final float MIN_ALPHA = 0.1f; private static final float MAX_ALPHA = 0.8f; - View mSourceView; + protected View mSourceView; @ViewDebug.ExportedProperty(category="recents") - Rect mClipRect = new Rect(); + protected Rect mClipRect = new Rect(); @ViewDebug.ExportedProperty(category="recents") - Rect mClipBounds = new Rect(); + protected Rect mClipBounds = new Rect(); @ViewDebug.ExportedProperty(category="recents") - Rect mLastClipBounds = new Rect(); + protected Rect mLastClipBounds = new Rect(); @ViewDebug.ExportedProperty(category="recents") - int mCornerRadius; + protected int mCornerRadius; @ViewDebug.ExportedProperty(category="recents") - float mAlpha = 1f; + protected float mAlpha = 1f; public AnimateableViewBounds(View source, int cornerRadius) { mSourceView = source; @@ -110,7 +110,7 @@ public int getClipBottom() { return mClipRect.bottom; } - private void updateClipBounds() { + protected void updateClipBounds() { mClipBounds.set(Math.max(0, mClipRect.left), Math.max(0, mClipRect.top), mSourceView.getWidth() - Math.max(0, mClipRect.right), mSourceView.getHeight() - Math.max(0, mClipRect.bottom)); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/FakeShadowDrawable.java b/packages/SystemUI/src/com/android/systemui/recents/views/FakeShadowDrawable.java index d64a67600513..79a774f7fba0 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/FakeShadowDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/FakeShadowDrawable.java @@ -30,6 +30,7 @@ import android.util.Log; import com.android.systemui.R; +import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsConfiguration; /** @@ -90,8 +91,10 @@ public FakeShadowDrawable(Resources resources, RecentsConfiguration config) { mCornerShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); mCornerShadowPaint.setStyle(Paint.Style.FILL); mCornerShadowPaint.setDither(true); - mCornerRadius = resources.getDimensionPixelSize( - R.dimen.recents_task_view_rounded_corners_radius); + mCornerRadius = Recents.getConfiguration().isGridEnabled ? + resources.getDimensionPixelSize( + R.dimen.recents_grid_task_view_rounded_corners_radius) : + resources.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius); mCardBounds = new RectF(); mEdgeShadowPaint = new Paint(mCornerShadowPaint); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java index 24ef433bd4d8..60ffac204825 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -91,11 +91,11 @@ public class RecentsView extends FrameLayout { private static final int DEFAULT_UPDATE_SCRIM_DURATION = 200; private static final float DEFAULT_SCRIM_ALPHA = 0.33f; + private static final float GRID_LAYOUT_SCRIM_ALPHA = 0.45f; private static final int SHOW_STACK_ACTION_BUTTON_DURATION = 134; private static final int HIDE_STACK_ACTION_BUTTON_DURATION = 100; - private TaskStack mStack; private TaskStackView mTaskStackView; private TextView mStackActionButton; private TextView mEmptyView; @@ -107,8 +107,8 @@ public class RecentsView extends FrameLayout { Rect mSystemInsets = new Rect(); private int mDividerSize; - private Drawable mBackgroundScrim = new ColorDrawable( - Color.argb((int) (DEFAULT_SCRIM_ALPHA * 255), 0, 0, 0)).mutate(); + private final float mScrimAlpha; + private final Drawable mBackgroundScrim; private Animator mBackgroundScrimAnimator; private RecentsTransitionHelper mTransitionHelper; @@ -137,6 +137,10 @@ public RecentsView(Context context, AttributeSet attrs, int defStyleAttr, int de mDividerSize = ssp.getDockedDividerSize(context); mTouchHandler = new RecentsViewTouchHandler(this); mFlingAnimationUtils = new FlingAnimationUtils(context, 0.3f); + mScrimAlpha = Recents.getConfiguration().isGridEnabled + ? GRID_LAYOUT_SCRIM_ALPHA : DEFAULT_SCRIM_ALPHA; + mBackgroundScrim = new ColorDrawable( + Color.argb((int) (mScrimAlpha * 255), 0, 0, 0)).mutate(); LayoutInflater inflater = LayoutInflater.from(context); if (RecentsDebugFlags.Static.EnableStackActionButton) { @@ -195,7 +199,6 @@ public void onReload(boolean isResumingFromVisible, boolean isTaskStackEmpty) { * Called from RecentsActivity when the task stack is updated. */ public void updateStack(TaskStack stack, boolean setStackViewTasks) { - mStack = stack; if (setStackViewTasks) { mTaskStackView.setTasks(stack, true /* allowNotifyStackChanges */); } @@ -212,7 +215,7 @@ public void updateStack(TaskStack stack, boolean setStackViewTasks) { * Returns the current TaskStack. */ public TaskStack getStack() { - return mStack; + return mTaskStackView.getStack(); } /* @@ -251,8 +254,7 @@ public boolean launchFocusedTask(int logEvent) { /** Launches the task that recents was launched from if possible */ public boolean launchPreviousTask() { if (mTaskStackView != null) { - TaskStack stack = mTaskStackView.getStack(); - Task task = stack.getLaunchTarget(); + Task task = getStack().getLaunchTarget(); if (task != null) { TaskView taskView = mTaskStackView.getChildViewForTask(task); EventBus.getDefault().send(new LaunchTaskEvent(taskView, task, null, @@ -340,7 +342,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (RecentsDebugFlags.Static.EnableStackActionButton) { // Measure the stack action button within the constraints of the space above the stack - Rect buttonBounds = mTaskStackView.mLayoutAlgorithm.mStackActionButtonRect; + Rect buttonBounds = mTaskStackView.mLayoutAlgorithm.getStackActionButtonRect(); measureChild(mStackActionButton, MeasureSpec.makeMeasureSpec(buttonBounds.width(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(buttonBounds.height(), MeasureSpec.AT_MOST)); @@ -437,8 +439,9 @@ protected boolean verifyDrawable(Drawable who) { public final void onBusEvent(LaunchTaskEvent event) { mLastTaskLaunchedWasFreeform = event.task.isFreeformTask(); - mTransitionHelper.launchTaskFromRecents(mStack, event.task, mTaskStackView, event.taskView, - event.screenPinningRequested, event.targetTaskBounds, event.targetTaskStack); + mTransitionHelper.launchTaskFromRecents(getStack(), event.task, mTaskStackView, + event.taskView, event.screenPinningRequested, event.targetTaskBounds, + event.targetTaskStack); } public final void onBusEvent(DismissRecentsToHomeAnimationStarted event) { @@ -514,8 +517,7 @@ public void onAnimationStarted() { EventBus.getDefault().send(new DockedFirstAnimationFrameEvent()); // Remove the task and don't bother relaying out, as all the tasks will be // relaid out when the stack changes on the multiwindow change event - mTaskStackView.getStack().removeTask(event.task, null, - true /* fromDockGesture */); + getStack().removeTask(event.task, null, true /* fromDockGesture */); } }; @@ -536,7 +538,7 @@ public List composeSpecs() { MetricsLogger.action(mContext, MetricsEvent.ACTION_WINDOW_DOCK_DRAG_DROP, event.task.getTopComponent().flattenToShortString()); } else { - EventBus.getDefault().send(new DragEndCancelledEvent(mStack, event.task, + EventBus.getDefault().send(new DragEndCancelledEvent(getStack(), event.task, event.taskView)); } } else { @@ -598,7 +600,7 @@ public void run() { public final void onBusEvent(EnterRecentsWindowAnimationCompletedEvent event) { RecentsActivityLaunchState launchState = Recents.getConfiguration().getLaunchState(); if (!launchState.launchedViaDockGesture && !launchState.launchedFromApp - && mStack.getTaskCount() > 0) { + && getStack().getTaskCount() > 0) { animateBackgroundScrim(1f, TaskStackAnimationHelper.ENTER_FROM_HOME_TRANSLATION_DURATION); } @@ -760,7 +762,7 @@ private void updateVisibleDockRegions(TaskStack.DockState[] newDockStates, private void animateBackgroundScrim(float alpha, int duration) { Utilities.cancelAnimationWithoutCallbacks(mBackgroundScrimAnimator); // Calculate the absolute alpha to animate from - int fromAlpha = (int) ((mBackgroundScrim.getAlpha() / (DEFAULT_SCRIM_ALPHA * 255)) * 255); + int fromAlpha = (int) ((mBackgroundScrim.getAlpha() / (mScrimAlpha * 255)) * 255); int toAlpha = (int) (alpha * 255); mBackgroundScrimAnimator = ObjectAnimator.ofInt(mBackgroundScrim, Utilities.DRAWABLE_ALPHA, fromAlpha, toAlpha); @@ -775,7 +777,7 @@ private void animateBackgroundScrim(float alpha, int duration) { * @return the bounds of the stack action button. */ private Rect getStackActionButtonBoundsFromStackLayout() { - Rect actionButtonRect = new Rect(mTaskStackView.mLayoutAlgorithm.mStackActionButtonRect); + Rect actionButtonRect = new Rect(mTaskStackView.mLayoutAlgorithm.getStackActionButtonRect()); int left = isLayoutRtl() ? actionButtonRect.left - mStackActionButton.getPaddingLeft() : actionButtonRect.right + mStackActionButton.getPaddingRight() @@ -797,8 +799,8 @@ public void dump(String prefix, PrintWriter writer) { writer.print(" [0x"); writer.print(id); writer.print("]"); writer.println(); - if (mStack != null) { - mStack.dump(innerPrefix, writer); + if (getStack() != null) { + getStack().dump(innerPrefix, writer); } if (mTaskStackView != null) { mTaskStackView.dump(innerPrefix, writer); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java index 493e6187c83e..f1314aba1b46 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackAnimationHelper.java @@ -105,6 +105,7 @@ void onStartLaunchTargetLaunchAnimation(int duration, boolean screenPinningReque private static final Interpolator ENTER_WHILE_DOCKING_INTERPOLATOR = Interpolators.LINEAR_OUT_SLOW_IN; + private final int mEnterAndExitFromHomeTranslationOffset; private TaskStackView mStackView; private TaskViewTransform mTmpTransform = new TaskViewTransform(); @@ -113,6 +114,8 @@ void onStartLaunchTargetLaunchAnimation(int duration, boolean screenPinningReque public TaskStackAnimationHelper(Context context, TaskStackView stackView) { mStackView = stackView; + mEnterAndExitFromHomeTranslationOffset = Recents.getConfiguration().isGridEnabled + ? 0 : DOUBLE_FRAME_OFFSET_MS; } /** @@ -260,7 +263,7 @@ public void onAnimationEnd(Animator animation) { AnimationProps taskAnimation = new AnimationProps() .setInitialPlayTime(AnimationProps.BOUNDS, Math.min(ENTER_EXIT_NUM_ANIMATING_TASKS, taskIndexFromFront) * - DOUBLE_FRAME_OFFSET_MS) + mEnterAndExitFromHomeTranslationOffset) .setStartDelay(AnimationProps.ALPHA, Math.min(ENTER_EXIT_NUM_ANIMATING_TASKS, taskIndexFromFront) * FRAME_OFFSET_MS) @@ -321,7 +324,7 @@ public void startExitToHomeAnimation(boolean animated, AnimationProps taskAnimation; if (animated) { int delay = Math.min(ENTER_EXIT_NUM_ANIMATING_TASKS , taskIndexFromFront) * - DOUBLE_FRAME_OFFSET_MS; + mEnterAndExitFromHomeTranslationOffset; taskAnimation = new AnimationProps() .setStartDelay(AnimationProps.BOUNDS, delay) .setDuration(AnimationProps.BOUNDS, EXIT_TO_HOME_TRANSLATION_DURATION) @@ -390,68 +393,26 @@ public void run() { /** * Starts the delete animation for the specified {@link TaskView}. */ - public void startDeleteTaskAnimation(final TaskView deleteTaskView, + public void startDeleteTaskAnimation(final TaskView deleteTaskView, boolean gridLayout, final ReferenceCountedTrigger postAnimationTrigger) { - TaskStackViewTouchHandler touchHandler = mStackView.getTouchHandler(); - touchHandler.onBeginManualDrag(deleteTaskView); - - postAnimationTrigger.increment(); - postAnimationTrigger.addLastDecrementRunnable(() -> { - touchHandler.onChildDismissed(deleteTaskView); - }); - - final float dismissSize = touchHandler.getScaledDismissSize(); - ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f); - animator.setDuration(400); - animator.addUpdateListener((animation) -> { - float progress = (Float) animation.getAnimatedValue(); - deleteTaskView.setTranslationX(progress * dismissSize); - touchHandler.updateSwipeProgress(deleteTaskView, true, progress); - }); - animator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - postAnimationTrigger.decrement(); - } - }); - animator.start(); + if (gridLayout) { + startTaskGridDeleteTaskAnimation(deleteTaskView, postAnimationTrigger); + } else { + startTaskStackDeleteTaskAnimation(deleteTaskView, postAnimationTrigger); + } } /** * Starts the delete animation for all the {@link TaskView}s. */ - public void startDeleteAllTasksAnimation(final List taskViews, - final ReferenceCountedTrigger postAnimationTrigger) { - TaskStackLayoutAlgorithm stackLayout = mStackView.getStackAlgorithm(); - - int offscreenXOffset = mStackView.getMeasuredWidth() - stackLayout.mTaskRect.left; - - int taskViewCount = taskViews.size(); - for (int i = taskViewCount - 1; i >= 0; i--) { - TaskView tv = taskViews.get(i); - int taskIndexFromFront = taskViewCount - i - 1; - int startDelay = taskIndexFromFront * DOUBLE_FRAME_OFFSET_MS; - - // Disabling clipping with the stack while the view is animating away - tv.setClipViewInStack(false); - - // Compose the new animation and transform and star the animation - AnimationProps taskAnimation = new AnimationProps(startDelay, - DISMISS_ALL_TASKS_DURATION, DISMISS_ALL_TRANSLATION_INTERPOLATOR, - new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - postAnimationTrigger.decrement(); - - // Re-enable clipping with the stack (we will reuse this view) - tv.setClipViewInStack(true); - } - }); - postAnimationTrigger.increment(); - - mTmpTransform.fillIn(tv); - mTmpTransform.rect.offset(offscreenXOffset, 0); - mStackView.updateTaskViewToTransform(tv, mTmpTransform, taskAnimation); + public void startDeleteAllTasksAnimation(final List taskViews, boolean gridLayout, + final ReferenceCountedTrigger postAnimationTrigger) { + if (gridLayout) { + for (int i = 0; i < taskViews.size(); i++) { + startTaskGridDeleteTaskAnimation(taskViews.get(i), postAnimationTrigger); + } + } else { + startTaskStackDeleteAllTasksAnimation(taskViews, postAnimationTrigger); } } @@ -651,4 +612,80 @@ public void run() { private int calculateStaggeredAnimDuration(int i) { return Math.max(100, 100 + ((i - 1) * 50)); } + + private void startTaskGridDeleteTaskAnimation(final TaskView deleteTaskView, + final ReferenceCountedTrigger postAnimationTrigger) { + postAnimationTrigger.increment(); + postAnimationTrigger.addLastDecrementRunnable(() -> { + mStackView.getTouchHandler().onChildDismissed(deleteTaskView); + }); + deleteTaskView.animate().setDuration(300).scaleX(0.9f).scaleY(0.9f).alpha(0).setListener( + new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + postAnimationTrigger.decrement(); + }}).start(); + } + + private void startTaskStackDeleteTaskAnimation(final TaskView deleteTaskView, + final ReferenceCountedTrigger postAnimationTrigger) { + TaskStackViewTouchHandler touchHandler = mStackView.getTouchHandler(); + touchHandler.onBeginManualDrag(deleteTaskView); + + postAnimationTrigger.increment(); + postAnimationTrigger.addLastDecrementRunnable(() -> { + touchHandler.onChildDismissed(deleteTaskView); + }); + + final float dismissSize = touchHandler.getScaledDismissSize(); + ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f); + animator.setDuration(400); + animator.addUpdateListener((animation) -> { + float progress = (Float) animation.getAnimatedValue(); + deleteTaskView.setTranslationX(progress * dismissSize); + touchHandler.updateSwipeProgress(deleteTaskView, true, progress); + }); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + postAnimationTrigger.decrement(); + } + }); + animator.start(); + } + + private void startTaskStackDeleteAllTasksAnimation(final List taskViews, + final ReferenceCountedTrigger postAnimationTrigger) { + TaskStackLayoutAlgorithm stackLayout = mStackView.getStackAlgorithm(); + + int offscreenXOffset = mStackView.getMeasuredWidth() - stackLayout.getTaskRect().left; + + int taskViewCount = taskViews.size(); + for (int i = taskViewCount - 1; i >= 0; i--) { + TaskView tv = taskViews.get(i); + int taskIndexFromFront = taskViewCount - i - 1; + int startDelay = taskIndexFromFront * DOUBLE_FRAME_OFFSET_MS; + + // Disabling clipping with the stack while the view is animating away + tv.setClipViewInStack(false); + + // Compose the new animation and transform and star the animation + AnimationProps taskAnimation = new AnimationProps(startDelay, + DISMISS_ALL_TASKS_DURATION, DISMISS_ALL_TRANSLATION_INTERPOLATOR, + new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + postAnimationTrigger.decrement(); + + // Re-enable clipping with the stack (we will reuse this view) + tv.setClipViewInStack(true); + } + }); + postAnimationTrigger.increment(); + + mTmpTransform.fillIn(tv); + mTmpTransform.rect.offset(offscreenXOffset, 0); + mStackView.updateTaskViewToTransform(tv, mTmpTransform, taskAnimation); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java index fce7f9d51ea4..5ab650729d97 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java @@ -38,6 +38,7 @@ import com.android.systemui.recents.misc.Utilities; import com.android.systemui.recents.model.Task; import com.android.systemui.recents.model.TaskStack; +import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm; import java.io.PrintWriter; import java.lang.annotation.Retention; @@ -212,6 +213,13 @@ public void computeRects(Rect freeformRectOut, Rect stackRectOut, } } + /** + * @return True if we should use the grid layout. + */ + boolean useGridLayout() { + return Recents.getConfiguration().isGridEnabled; + } + // A report of the visibility state of the stack public class VisibilityReport { public int numVisibleTasks; @@ -240,14 +248,14 @@ public class VisibilityReport { // This is the current system insets @ViewDebug.ExportedProperty(category="recents") public Rect mSystemInsets = new Rect(); - // This is the bounds of the stack action above the stack rect - @ViewDebug.ExportedProperty(category="recents") - public Rect mStackActionButtonRect = new Rect(); // The visible ranges when the stack is focused and unfocused private Range mUnfocusedRange; private Range mFocusedRange; + // This is the bounds of the stack action above the stack rect + @ViewDebug.ExportedProperty(category="recents") + private Rect mStackActionButtonRect = new Rect(); // The base top margin for the stack from the system insets @ViewDebug.ExportedProperty(category="recents") private int mBaseTopMargin; @@ -284,6 +292,9 @@ public class VisibilityReport { @ViewDebug.ExportedProperty(category="recents") private int mStackBottomOffset; + /** The height, in pixels, of each task view's title bar. */ + private int mTitleBarHeight; + // The paths defining the motion of the tasks when the stack is focused and unfocused private Path mUnfocusedCurve; private Path mFocusedCurve; @@ -326,7 +337,7 @@ public class VisibilityReport { @ViewDebug.ExportedProperty(category="recents") int mMinTranslationZ; @ViewDebug.ExportedProperty(category="recents") - int mMaxTranslationZ; + public int mMaxTranslationZ; // Optimization, allows for quick lookup of task -> index private SparseIntArray mTaskIndexMap = new SparseIntArray(); @@ -334,6 +345,7 @@ public class VisibilityReport { // The freeform workspace layout FreeformWorkspaceLayoutAlgorithm mFreeformLayoutAlgorithm; + TaskGridLayoutAlgorithm mTaskGridLayoutAlgorithm; // The transform to place TaskViews at the front and back of the stack respectively TaskViewTransform mBackOfStackTransform = new TaskViewTransform(); @@ -344,19 +356,7 @@ public TaskStackLayoutAlgorithm(Context context, TaskStackLayoutAlgorithmCallbac mContext = context; mCb = cb; mFreeformLayoutAlgorithm = new FreeformWorkspaceLayoutAlgorithm(context); - mMinMargin = res.getDimensionPixelSize(R.dimen.recents_layout_min_margin); - mBaseTopMargin = getDimensionForDevice(context, - R.dimen.recents_layout_top_margin_phone, - R.dimen.recents_layout_top_margin_tablet, - R.dimen.recents_layout_top_margin_tablet_xlarge); - mBaseSideMargin = getDimensionForDevice(context, - R.dimen.recents_layout_side_margin_phone, - R.dimen.recents_layout_side_margin_tablet, - R.dimen.recents_layout_side_margin_tablet_xlarge); - mBaseBottomMargin = res.getDimensionPixelSize(R.dimen.recents_layout_bottom_margin); - mFreeformStackGap = - res.getDimensionPixelSize(R.dimen.recents_freeform_layout_bottom_margin); - + mTaskGridLayoutAlgorithm = new TaskGridLayoutAlgorithm(context); reloadOnConfigurationChange(context); } @@ -381,6 +381,7 @@ public void reloadOnConfigurationChange(Context context) { R.dimen.recents_layout_initial_top_offset_tablet, R.dimen.recents_layout_initial_top_offset_tablet, R.dimen.recents_layout_initial_top_offset_tablet, + R.dimen.recents_layout_initial_top_offset_tablet, R.dimen.recents_layout_initial_top_offset_tablet); mBaseInitialBottomOffset = getDimensionForDevice(context, R.dimen.recents_layout_initial_bottom_offset_phone_port, @@ -388,8 +389,32 @@ public void reloadOnConfigurationChange(Context context) { R.dimen.recents_layout_initial_bottom_offset_tablet, R.dimen.recents_layout_initial_bottom_offset_tablet, R.dimen.recents_layout_initial_bottom_offset_tablet, + R.dimen.recents_layout_initial_bottom_offset_tablet, R.dimen.recents_layout_initial_bottom_offset_tablet); mFreeformLayoutAlgorithm.reloadOnConfigurationChange(context); + mTaskGridLayoutAlgorithm.reloadOnConfigurationChange(context); + mMinMargin = res.getDimensionPixelSize(R.dimen.recents_layout_min_margin); + mBaseTopMargin = getDimensionForDevice(context, + R.dimen.recents_layout_top_margin_phone, + R.dimen.recents_layout_top_margin_tablet, + R.dimen.recents_layout_top_margin_tablet_xlarge, + R.dimen.recents_layout_top_margin_tablet); + mBaseSideMargin = getDimensionForDevice(context, + R.dimen.recents_layout_side_margin_phone, + R.dimen.recents_layout_side_margin_tablet, + R.dimen.recents_layout_side_margin_tablet_xlarge, + R.dimen.recents_layout_side_margin_tablet); + mBaseBottomMargin = res.getDimensionPixelSize(R.dimen.recents_layout_bottom_margin); + mFreeformStackGap = + res.getDimensionPixelSize(R.dimen.recents_freeform_layout_bottom_margin); + mTitleBarHeight = getDimensionForDevice(mContext, + R.dimen.recents_task_view_header_height, + R.dimen.recents_task_view_header_height, + R.dimen.recents_task_view_header_height, + R.dimen.recents_task_view_header_height_tablet_land, + R.dimen.recents_task_view_header_height, + R.dimen.recents_task_view_header_height_tablet_land, + R.dimen.recents_grid_task_view_header_height); } /** @@ -406,6 +431,7 @@ public void reset() { public boolean setSystemInsets(Rect systemInsets) { boolean changed = !mSystemInsets.equals(systemInsets); mSystemInsets.set(systemInsets); + mTaskGridLayoutAlgorithm.setSystemInsets(systemInsets); return changed; } @@ -471,6 +497,9 @@ public void initialize(Rect displayRect, Rect windowRect, Rect taskStackBounds, updateFrontBackTransforms(); } + + // Initialize the grid layout + mTaskGridLayoutAlgorithm.initialize(windowRect); } /** @@ -722,6 +751,11 @@ public int getInitialFocusState() { } } + public Rect getStackActionButtonRect() { + return useGridLayout() + ? mTaskGridLayoutAlgorithm.getStackActionButtonRect() : mStackActionButtonRect; + } + /** * Returns the TaskViewTransform that would put the task just off the back of the stack. */ @@ -844,6 +878,11 @@ public TaskViewTransform getStackTransform(Task task, float stackScroll, int foc if (mFreeformLayoutAlgorithm.isTransformAvailable(task, this)) { mFreeformLayoutAlgorithm.getTransform(task, transformOut, this); return transformOut; + } else if (useGridLayout()) { + int taskIndex = mTaskIndexMap.get(task.key.id); + int taskCount = mTaskIndexMap.size(); + mTaskGridLayoutAlgorithm.getTransform(taskIndex, taskCount, transformOut, this); + return transformOut; } else { // Return early if we have an invalid index int nonOverrideTaskProgress = mTaskIndexMap.get(task.key.id, -1); @@ -876,12 +915,17 @@ public TaskViewTransform getStackTransformScreenCoordinates(Task task, float sta * Transforms the given {@param transformOut} to the screen coordinates, overriding the current * window rectangle with {@param windowOverrideRect} if non-null. */ - public TaskViewTransform transformToScreenCoordinates(TaskViewTransform transformOut, + TaskViewTransform transformToScreenCoordinates(TaskViewTransform transformOut, Rect windowOverrideRect) { Rect windowRect = windowOverrideRect != null ? windowOverrideRect : Recents.getSystemServices().getWindowRect(); transformOut.rect.offset(windowRect.left, windowRect.top); + if (useGridLayout()) { + // Draw the thumbnail a little lower to perfectly coincide with the view we are + // transitioning to, where the header bar has already been drawn. + transformOut.rect.offset(0, mTitleBarHeight); + } return transformOut; } @@ -1089,9 +1133,9 @@ public void getTaskStackBounds(Rect displayRect, Rect windowRect, int topInset, * Retrieves resources that are constant regardless of the current configuration of the device. */ public static int getDimensionForDevice(Context ctx, int phoneResId, - int tabletResId, int xlargeTabletResId) { + int tabletResId, int xlargeTabletResId, int gridLayoutResId) { return getDimensionForDevice(ctx, phoneResId, phoneResId, tabletResId, tabletResId, - xlargeTabletResId, xlargeTabletResId); + xlargeTabletResId, xlargeTabletResId, gridLayoutResId); } /** @@ -1099,12 +1143,14 @@ public static int getDimensionForDevice(Context ctx, int phoneResId, */ public static int getDimensionForDevice(Context ctx, int phonePortResId, int phoneLandResId, int tabletPortResId, int tabletLandResId, int xlargeTabletPortResId, - int xlargeTabletLandResId) { + int xlargeTabletLandResId, int gridLayoutResId) { RecentsConfiguration config = Recents.getConfiguration(); Resources res = ctx.getResources(); boolean isLandscape = Utilities.getAppConfiguration(ctx).orientation == Configuration.ORIENTATION_LANDSCAPE; - if (config.isXLargeScreen) { + if (config.isGridEnabled) { + return res.getDimensionPixelSize(gridLayoutResId); + } else if (config.isXLargeScreen) { return res.getDimensionPixelSize(isLandscape ? xlargeTabletLandResId : xlargeTabletPortResId); @@ -1254,6 +1300,13 @@ private void updateFrontBackTransforms() { mFrontOfStackTransform.visible = true; } + /** + * Returns the proper task rectangle according to the current grid state. + */ + public Rect getTaskRect() { + return useGridLayout() ? mTaskGridLayoutAlgorithm.getTaskGridRect() : mTaskRect; + } + public void dump(String prefix, PrintWriter writer) { String innerPrefix = prefix + " "; diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index fc580a5ecc19..3c5a14149d65 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -20,6 +20,8 @@ import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID; import static android.app.ActivityManager.StackId.INVALID_STACK_ID; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.IntDef; @@ -64,12 +66,14 @@ import com.android.systemui.recents.events.activity.HideRecentsEvent; import com.android.systemui.recents.events.activity.HideStackActionButtonEvent; import com.android.systemui.recents.events.activity.IterateRecentsEvent; +import com.android.systemui.recents.events.activity.LaunchMostRecentTaskRequestEvent; import com.android.systemui.recents.events.activity.LaunchNextTaskRequestEvent; import com.android.systemui.recents.events.activity.LaunchTaskEvent; import com.android.systemui.recents.events.activity.LaunchTaskStartedEvent; import com.android.systemui.recents.events.activity.MultiWindowStateChangedEvent; import com.android.systemui.recents.events.activity.PackagesChangedEvent; import com.android.systemui.recents.events.activity.ShowStackActionButtonEvent; +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; @@ -86,12 +90,16 @@ import com.android.systemui.recents.events.ui.focus.DismissFocusedTaskViewEvent; import com.android.systemui.recents.events.ui.focus.FocusNextTaskViewEvent; import com.android.systemui.recents.events.ui.focus.FocusPreviousTaskViewEvent; +import com.android.systemui.recents.events.ui.focus.NavigateTaskViewEvent; import com.android.systemui.recents.misc.DozeTrigger; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.misc.Utilities; import com.android.systemui.recents.model.Task; import com.android.systemui.recents.model.TaskStack; +import com.android.systemui.recents.views.grid.GridTaskView; +import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm; +import com.android.systemui.recents.views.grid.TaskViewFocusFrame; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -205,6 +213,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal private int mLastWidth; private int mLastHeight; + // We keep track of the task view focused by user interaction and draw a frame around it in the + // grid layout. + private TaskViewFocusFrame mTaskViewFocusFrame; + // A convenience update listener to request updating clipping of tasks private ValueAnimator.AnimatorUpdateListener mRequestUpdateClippingListener = new ValueAnimator.AnimatorUpdateListener() { @@ -258,12 +270,21 @@ public TaskStackView(Context context) { mStackScroller = new TaskStackViewScroller(context, this, mLayoutAlgorithm); mTouchHandler = new TaskStackViewTouchHandler(context, this, mStackScroller); mAnimationHelper = new TaskStackAnimationHelper(context, this); - mTaskCornerRadiusPx = res.getDimensionPixelSize( - R.dimen.recents_task_view_rounded_corners_radius); + mTaskCornerRadiusPx = Recents.getConfiguration().isGridEnabled ? + res.getDimensionPixelSize(R.dimen.recents_grid_task_view_rounded_corners_radius) : + res.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius); mDividerSize = ssp.getDockedDividerSize(context); mDisplayOrientation = Utilities.getAppConfiguration(mContext).orientation; mDisplayRect = ssp.getDisplayRect(); + // Create a frame to draw around the focused task view + if (Recents.getConfiguration().isGridEnabled) { + mTaskViewFocusFrame = new TaskViewFocusFrame(mContext, this, + mLayoutAlgorithm.mTaskGridLayoutAlgorithm); + addView(mTaskViewFocusFrame); + getViewTreeObserver().addOnGlobalFocusChangeListener(mTaskViewFocusFrame); + } + int taskBarDismissDozeDelaySeconds = getResources().getInteger( R.integer.recents_task_bar_dismiss_delay_seconds); mUIDozeTrigger = new DozeTrigger(taskBarDismissDozeDelaySeconds, new Runnable() { @@ -279,6 +300,9 @@ public void run() { } }); setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); + if (ssp.hasFreeformWorkspaceSupport()) { + setWillNotDraw(false); + } mFreeformWorkspaceBackground = (GradientDrawable) getContext().getDrawable( R.drawable.recents_freeform_workspace_bg); @@ -426,6 +450,11 @@ public TaskStackLayoutAlgorithm getStackAlgorithm() { return mLayoutAlgorithm; } + /** Returns the grid algorithm for this task stack. */ + public TaskGridLayoutAlgorithm getGridAlgorithm() { + return mLayoutAlgorithm.mTaskGridLayoutAlgorithm; + } + /** * Returns the touch handler for this task stack. */ @@ -501,8 +530,8 @@ int[] computeVisibleTaskTransforms(ArrayList taskTransforms, // If we have a target stack scroll and the task is not currently visible, then we // just update the transform at the new scroll // TODO: Optimize this - transformAtTarget = mLayoutAlgorithm.getStackTransform(task, - targetStackScroll, new TaskViewTransform(), frontTransformAtTarget); + transformAtTarget = mLayoutAlgorithm.getStackTransform(task, targetStackScroll, + new TaskViewTransform(), frontTransformAtTarget); if (transformAtTarget.visible) { transform.copyFrom(transformAtTarget); } @@ -779,6 +808,11 @@ void cancelAllTaskViewAnimations() { * Updates the clip for each of the task views from back to front. */ private void clipTaskViews() { + // We never clip task views in grid layout + if (Recents.getConfiguration().isGridEnabled) { + return; + } + // Update the clip on each task child List taskViews = getTaskViews(); TaskView tmpTv = null; @@ -869,7 +903,7 @@ public TaskStackViewScroller getScroller() { * * @return whether or not the stack will scroll as a part of this focus change */ - private boolean setFocusedTask(int taskIndex, boolean scrollToTask, + public boolean setFocusedTask(int taskIndex, boolean scrollToTask, final boolean requestViewFocus) { return setFocusedTask(taskIndex, scrollToTask, requestViewFocus, 0); } @@ -879,7 +913,7 @@ private boolean setFocusedTask(int taskIndex, boolean scrollToTask, * * @return whether or not the stack will scroll as a part of this focus change */ - private boolean setFocusedTask(int focusTaskIndex, boolean scrollToTask, + public boolean setFocusedTask(int focusTaskIndex, boolean scrollToTask, boolean requestViewFocus, int timerIndicatorDuration) { // Find the next task to focus int newFocusedTaskIndex = mStack.getTaskCount() > 0 ? @@ -931,6 +965,10 @@ private boolean setFocusedTask(int focusTaskIndex, boolean scrollToTask, newFocusedTaskView.setFocusedState(true, requestViewFocus); } } + // Any time a task view gets the focus, we move the focus frame around it. + if (mTaskViewFocusFrame != null) { + mTaskViewFocusFrame.moveGridTaskViewFocus(getChildViewForTask(newFocusedTask)); + } } return willScroll; } @@ -996,20 +1034,28 @@ public void setRelativeFocusedTask(boolean forward, boolean stackTasksOnly, bool float stackScroll = mStackScroller.getStackScroll(); ArrayList tasks = mStack.getStackTasks(); int taskCount = tasks.size(); - if (forward) { - // Walk backwards and focus the next task smaller than the current stack scroll - for (newIndex = taskCount - 1; newIndex >= 0; newIndex--) { - float taskP = mLayoutAlgorithm.getStackScrollForTask(tasks.get(newIndex)); - if (Float.compare(taskP, stackScroll) <= 0) { - break; - } - } + if (useGridLayout()) { + // For the grid layout, we directly set focus to the most recently used task + // no matter we're moving forwards or backwards. + newIndex = taskCount - 1; } else { - // Walk forwards and focus the next task larger than the current stack scroll - for (newIndex = 0; newIndex < taskCount; newIndex++) { - float taskP = mLayoutAlgorithm.getStackScrollForTask(tasks.get(newIndex)); - if (Float.compare(taskP, stackScroll) >= 0) { - break; + // For the grid layout we pick a proper task to focus, according to the current + // stack scroll. + if (forward) { + // Walk backwards and focus the next task smaller than the current stack scroll + for (newIndex = taskCount - 1; newIndex >= 0; newIndex--) { + float taskP = mLayoutAlgorithm.getStackScrollForTask(tasks.get(newIndex)); + if (Float.compare(taskP, stackScroll) <= 0) { + break; + } + } + } else { + // Walk forwards and focus the next task larger than the current stack scroll + for (newIndex = 0; newIndex < taskCount; newIndex++) { + float taskP = mLayoutAlgorithm.getStackScrollForTask(tasks.get(newIndex)); + if (Float.compare(taskP, stackScroll) >= 0) { + break; + } } } } @@ -1028,20 +1074,23 @@ public void setRelativeFocusedTask(boolean forward, boolean stackTasksOnly, bool /** * Resets the focused task. */ - void resetFocusedTask(Task task) { + public void resetFocusedTask(Task task) { if (task != null) { TaskView tv = getChildViewForTask(task); if (tv != null) { tv.setFocusedState(false, false /* requestViewFocus */); } } + if (mTaskViewFocusFrame != null) { + mTaskViewFocusFrame.moveGridTaskViewFocus(null); + } mFocusedTask = null; } /** * Returns the focused task. */ - Task getFocusedTask() { + public Task getFocusedTask() { return mFocusedTask; } @@ -1244,6 +1293,9 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { for (int i = 0; i < taskViewCount; i++) { measureTaskView(mTmpTaskViews.get(i)); } + if (mTaskViewFocusFrame != null) { + mTaskViewFocusFrame.measure(); + } setMeasuredDimension(width, height); mLastWidth = width; @@ -1259,8 +1311,8 @@ private void measureTaskView(TaskView tv) { if (tv.getBackground() != null) { tv.getBackground().getPadding(padding); } - mTmpRect.set(mStableLayoutAlgorithm.mTaskRect); - mTmpRect.union(mLayoutAlgorithm.mTaskRect); + mTmpRect.set(mStableLayoutAlgorithm.getTaskRect()); + mTmpRect.union(mLayoutAlgorithm.getTaskRect()); tv.measure( MeasureSpec.makeMeasureSpec(mTmpRect.width() + padding.left + padding.right, MeasureSpec.EXACTLY), @@ -1278,6 +1330,9 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto for (int i = 0; i < taskViewCount; i++) { layoutTaskView(changed, mTmpTaskViews.get(i)); } + if (mTaskViewFocusFrame != null) { + mTaskViewFocusFrame.layout(); + } if (changed) { if (mStackScroller.isScrollOutOfBounds()) { @@ -1305,8 +1360,8 @@ private void layoutTaskView(boolean changed, TaskView tv) { if (tv.getBackground() != null) { tv.getBackground().getPadding(padding); } - mTmpRect.set(mStableLayoutAlgorithm.mTaskRect); - mTmpRect.union(mLayoutAlgorithm.mTaskRect); + mTmpRect.set(mStableLayoutAlgorithm.getTaskRect()); + mTmpRect.union(mLayoutAlgorithm.getTaskRect()); tv.cancelTransformAnimation(); tv.layout(mTmpRect.left - padding.left, mTmpRect.top - padding.top, mTmpRect.right + padding.right, mTmpRect.bottom + padding.bottom); @@ -1330,19 +1385,21 @@ void onFirstLayout() { // until after the enter-animation RecentsConfiguration config = Recents.getConfiguration(); RecentsActivityLaunchState launchState = config.getLaunchState(); - int focusedTaskIndex = launchState.getInitialFocusTaskIndex(mStack.getTaskCount()); - if (focusedTaskIndex != -1) { - setFocusedTask(focusedTaskIndex, false /* scrollToTask */, - false /* requestViewFocus */); - } - // Update the stack action button visibility - if (mStackScroller.getStackScroll() < SHOW_STACK_ACTION_BUTTON_SCROLL_THRESHOLD && - mStack.getTaskCount() > 0) { - EventBus.getDefault().send(new ShowStackActionButtonEvent(false /* translate */)); - } else { - EventBus.getDefault().send(new HideStackActionButtonEvent()); + // We set the initial focused task view iff the following conditions are satisfied: + // 1. Recents is showing task views in stack layout. + // 2. Recents is launched with ALT + TAB. + boolean setFocusOnFirstLayout = !useGridLayout() || + Recents.getConfiguration().getLaunchState().launchedWithAltTab; + if (setFocusOnFirstLayout) { + int focusedTaskIndex = launchState.getInitialFocusTaskIndex(mStack.getTaskCount(), + useGridLayout()); + if (focusedTaskIndex != -1) { + setFocusedTask(focusedTaskIndex, false /* scrollToTask */, + false /* requestViewFocus */); + } } + updateStackActionButtonVisibility(); } public boolean isTouchPointInView(float x, float y, TaskView tv) { @@ -1503,7 +1560,11 @@ public void onStackTasksUpdated(TaskStack stack) { @Override public TaskView createView(Context context) { - return (TaskView) mInflater.inflate(R.layout.recents_task_view, this, false); + if (Recents.getConfiguration().isGridEnabled) { + return (GridTaskView) mInflater.inflate(R.layout.recents_grid_task_view, this, false); + } else { + return (TaskView) mInflater.inflate(R.layout.recents_task_view, this, false); + } } @Override @@ -1560,11 +1621,6 @@ public void onPickUpViewFromPool(TaskView tv, Task task, boolean isNewView) { // Bind the task view to the new task bindTaskView(tv, task); - // If the doze trigger has already fired, then update the state for this task view - if (mUIDozeTrigger.isAsleep()) { - tv.setNoUserInteractionState(); - } - // Set the new state for this view, including the callbacks and view clipping tv.setCallbacks(this); tv.setTouchEnabled(true); @@ -1594,6 +1650,13 @@ private void bindTaskView(TaskView tv, Task task) { // Rebind the task and request that this task's data be filled into the TaskView tv.onTaskBound(task, mTouchExplorationEnabled, mDisplayOrientation, mDisplayRect); + // If the doze trigger has already fired, then update the state for this task view + if (mUIDozeTrigger.isAsleep() || + Recents.getSystemServices().hasFreeformWorkspaceSupport() || + useGridLayout()) { + tv.setNoUserInteractionState(); + } + // Load the task data Recents.getTaskLoader().loadTaskData(task); } @@ -1632,7 +1695,8 @@ public void onStackScrollChanged(float prevScroll, float curScroll, AnimationPro relayoutTaskViewsOnNextFrame(animation); } - if (mEnterAnimationComplete) { + // In grid layout, the stack action button always remains visible. + if (mEnterAnimationComplete && !useGridLayout()) { if (prevScroll > SHOW_STACK_ACTION_BUTTON_SCROLL_THRESHOLD && curScroll <= SHOW_STACK_ACTION_BUTTON_SCROLL_THRESHOLD && mStack.getTaskCount() > 0) { @@ -1673,43 +1737,22 @@ public final void onBusEvent(LaunchTaskEvent event) { mUIDozeTrigger.stopDozing(); } + public final void onBusEvent(LaunchMostRecentTaskRequestEvent event) { + if (mStack.getTaskCount() > 0) { + Task mostRecentTask = mStack.getStackFrontMostTask(true /* includeFreefromTasks */); + launchTask(mostRecentTask); + } + } + public final void onBusEvent(LaunchNextTaskRequestEvent event) { if (mAwaitingFirstLayout) { mLaunchNextAfterFirstMeasure = true; return; } - int launchTaskIndex = mStack.indexOfStackTask(mStack.getLaunchTarget()); - if (launchTaskIndex != -1) { - launchTaskIndex = Math.max(0, launchTaskIndex - 1); - } else { - launchTaskIndex = mStack.getTaskCount() - 1; - } - if (launchTaskIndex != -1) { - // Stop all animations - cancelAllTaskViewAnimations(); - - final Task launchTask = mStack.getStackTasks().get(launchTaskIndex); - float curScroll = mStackScroller.getStackScroll(); - float targetScroll = mLayoutAlgorithm.getStackScrollForTaskAtInitialOffset(launchTask); - float absScrollDiff = Math.abs(targetScroll - curScroll); - if (getChildViewForTask(launchTask) == null || absScrollDiff > 0.35f) { - int duration = (int) (LAUNCH_NEXT_SCROLL_BASE_DURATION + - absScrollDiff * LAUNCH_NEXT_SCROLL_INCR_DURATION); - mStackScroller.animateScroll(targetScroll, - duration, new Runnable() { - @Override - public void run() { - EventBus.getDefault().send(new LaunchTaskEvent( - getChildViewForTask(launchTask), launchTask, null, - INVALID_STACK_ID, false /* screenPinningRequested */)); - } - }); - } else { - EventBus.getDefault().send(new LaunchTaskEvent(getChildViewForTask(launchTask), - launchTask, null, INVALID_STACK_ID, false /* screenPinningRequested */)); - } - + final Task launchTask = mStack.getNextLaunchTarget(); + if (launchTask != null) { + launchTask(launchTask); MetricsLogger.action(getContext(), MetricsEvent.OVERVIEW_LAUNCH_PREVIOUS_TASK, launchTask.key.getComponent().toString()); } else if (mStack.getTaskCount() == 0) { @@ -1737,10 +1780,18 @@ public final void onBusEvent(DismissRecentsToHomeAnimationStarted event) { int taskViewExitToHomeDuration = TaskStackAnimationHelper.EXIT_TO_HOME_TRANSLATION_DURATION; animateFreeformWorkspaceBackgroundAlpha(0, new AnimationProps(taskViewExitToHomeDuration, Interpolators.FAST_OUT_SLOW_IN)); + + // Dismiss the grid task view focus frame + if (mTaskViewFocusFrame != null) { + mTaskViewFocusFrame.moveGridTaskViewFocus(null); + } } public final void onBusEvent(DismissFocusedTaskViewEvent event) { if (mFocusedTask != null) { + if (mTaskViewFocusFrame != null) { + mTaskViewFocusFrame.moveGridTaskViewFocus(null); + } TaskView tv = getChildViewForTask(mFocusedTask); if (tv != null) { tv.dismissTask(); @@ -1751,13 +1802,15 @@ public final void onBusEvent(DismissFocusedTaskViewEvent event) { public final void onBusEvent(DismissTaskViewEvent event) { // For visible children, defer removing the task until after the animation - mAnimationHelper.startDeleteTaskAnimation(event.taskView, event.getAnimationTrigger()); + mAnimationHelper.startDeleteTaskAnimation( + event.taskView, useGridLayout(), event.getAnimationTrigger()); } public final void onBusEvent(final DismissAllTaskViewsEvent event) { // Keep track of the tasks which will have their data removed ArrayList tasks = new ArrayList<>(mStack.getStackTasks()); - mAnimationHelper.startDeleteAllTasksAnimation(getTaskViews(), event.getAnimationTrigger()); + mAnimationHelper.startDeleteAllTasksAnimation( + getTaskViews(), useGridLayout(), event.getAnimationTrigger()); event.addPostAnimationCallback(new Runnable() { @Override public void run() { @@ -1782,6 +1835,17 @@ public final void onBusEvent(TaskViewDismissedEvent event) { announceForAccessibility(getContext().getString( R.string.accessibility_recents_item_dismissed, event.task.title)); + if (useGridLayout() && event.animation != null) { + event.animation.setListener(new AnimatorListenerAdapter() { + public void onAnimationEnd(Animator animator) { + if (mTaskViewFocusFrame != null) { + // Resize the grid layout task view focus frame + mTaskViewFocusFrame.resize(); + } + } + }); + } + // Remove the task from the stack mStack.removeTask(event.task, event.animation, false /* fromDockGesture */); EventBus.getDefault().send(new DeleteTaskDataEvent(event.task)); @@ -1807,6 +1871,26 @@ public final void onBusEvent(FocusPreviousTaskViewEvent event) { setRelativeFocusedTask(false, false /* stackTasksOnly */, true /* animated */); } + public final void onBusEvent(NavigateTaskViewEvent event) { + if (useGridLayout()) { + final int taskCount = mStack.getTaskCount(); + final int currentIndex = mStack.indexOfStackTask(getFocusedTask()); + final int nextIndex = mLayoutAlgorithm.mTaskGridLayoutAlgorithm.navigateFocus(taskCount, + currentIndex, event.direction); + setFocusedTask(nextIndex, false, true); + } else { + switch (event.direction) { + case UP: + EventBus.getDefault().send(new FocusPreviousTaskViewEvent()); + break; + case DOWN: + EventBus.getDefault().send( + new FocusNextTaskViewEvent(0 /* timerIndicatorDuration */)); + break; + } + } + } + public final void onBusEvent(UserInteractionEvent event) { // Poke the doze trigger on user interaction mUIDozeTrigger.poke(); @@ -1969,7 +2053,9 @@ public final void onBusEvent(EnterRecentsWindowAnimationCompletedEvent event) { @Override public void run() { // Start the dozer to trigger to trigger any UI that shows after a timeout - mUIDozeTrigger.startDozing(); + if (!Recents.getSystemServices().hasFreeformWorkspaceSupport()) { + mUIDozeTrigger.startDozing(); + } // Update the focused state here -- since we only set the focused task without // requesting view focus in onFirstLayout(), actually request view focus and @@ -2049,6 +2135,9 @@ public final void onBusEvent(ConfigurationChangedEvent event) { } } + // Update the Clear All button in case we're switching in or out of grid layout. + updateStackActionButtonVisibility(); + // Trigger a new layout and update to the initial state if necessary if (event.fromMultiWindow) { mInitialState = INITIAL_STATE_UPDATE_LAYOUT_ONLY; @@ -2063,9 +2152,17 @@ public final void onBusEvent(RecentsGrowingEvent event) { mResetToInitialStateWhenResized = true; } + public final void onBusEvent(RecentsVisibilityChangedEvent event) { + if (!event.visible && mTaskViewFocusFrame != null) { + mTaskViewFocusFrame.moveGridTaskViewFocus(null); + } + } + public void reloadOnConfigurationChange() { mStableLayoutAlgorithm.reloadOnConfigurationChange(getContext()); mLayoutAlgorithm.reloadOnConfigurationChange(getContext()); + + boolean hasDockedTask = Recents.getSystemServices().hasDockedTask(); } /** @@ -2118,6 +2215,38 @@ private int findTaskViewInsertIndex(Task task, int taskIndex) { return -1; } + private void launchTask(Task task) { + // Stop all animations + cancelAllTaskViewAnimations(); + + float curScroll = mStackScroller.getStackScroll(); + float targetScroll = mLayoutAlgorithm.getStackScrollForTaskAtInitialOffset(task); + float absScrollDiff = Math.abs(targetScroll - curScroll); + if (getChildViewForTask(task) == null || absScrollDiff > 0.35f) { + int duration = (int) (LAUNCH_NEXT_SCROLL_BASE_DURATION + + absScrollDiff * LAUNCH_NEXT_SCROLL_INCR_DURATION); + mStackScroller.animateScroll(targetScroll, + duration, new Runnable() { + @Override + public void run() { + EventBus.getDefault().send(new LaunchTaskEvent( + getChildViewForTask(task), task, null, + INVALID_STACK_ID, false /* screenPinningRequested */)); + } + }); + } else { + EventBus.getDefault().send(new LaunchTaskEvent(getChildViewForTask(task), + task, null, INVALID_STACK_ID, false /* screenPinningRequested */)); + } + } + + /** + * Check whether we should use the grid layout. + */ + public boolean useGridLayout() { + return mLayoutAlgorithm.useGridLayout(); + } + /** * Reads current system flags related to accessibility and screen pinning. */ @@ -2128,6 +2257,17 @@ private void readSystemFlags() { Settings.System.LOCK_TO_APP_ENABLED) != 0; } + private void updateStackActionButtonVisibility() { + // Always show the button in grid layout. + if (useGridLayout() || + (mStackScroller.getStackScroll() < SHOW_STACK_ACTION_BUTTON_SCROLL_THRESHOLD && + mStack.getTaskCount() > 0)) { + EventBus.getDefault().send(new ShowStackActionButtonEvent(false /* translate */)); + } else { + EventBus.getDefault().send(new HideStackActionButtonEvent()); + } + } + public void dump(String prefix, PrintWriter writer) { String innerPrefix = prefix + " "; String id = Integer.toHexString(System.identityHashCode(this)); @@ -2159,6 +2299,11 @@ public void dump(String prefix, PrintWriter writer) { mFocusedTask.dump("", writer); } + int numTaskViews = mTaskViews.size(); + for (int i = 0; i < numTaskViews; i++) { + mTaskViews.get(i).dump(innerPrefix, writer); + } + mLayoutAlgorithm.dump(innerPrefix, writer); mStackScroller.dump(innerPrefix, writer); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java index d44aa844003f..003138fa75ae 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java @@ -168,7 +168,7 @@ void recycleVelocityTracker() { /** Touch preprocessing for handling below */ public boolean onInterceptTouchEvent(MotionEvent ev) { // Pass through to swipe helper if we are swiping - mInterceptedBySwipeHelper = mSwipeHelper.onInterceptTouchEvent(ev); + mInterceptedBySwipeHelper = isSwipingEnabled() && mSwipeHelper.onInterceptTouchEvent(ev); if (mInterceptedBySwipeHelper) { return true; } @@ -342,8 +342,9 @@ private boolean handleTouchEvent(MotionEvent ev) { mSv.invalidate(); } - // Reset the focused task after the user has scrolled - if (!mSv.mTouchExplorationEnabled) { + // Reset the focused task after the user has scrolled, but we have no scrolling + // in grid layout and therefore we don't want to reset the focus there. + if (!mSv.mTouchExplorationEnabled && !mSv.useGridLayout()) { mSv.resetFocusedTask(mSv.getFocusedTask()); } } else if (mActiveTaskView == null) { @@ -680,4 +681,11 @@ private TaskView findViewAtPoint(int x, int y) { public float getScaledDismissSize() { return 1.5f * Math.max(mSv.getWidth(), mSv.getHeight()); } + + /** + * Returns whether swiping is enabled. + */ + private boolean isSwipingEnabled() { + return !mSv.useGridLayout(); + } } 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..94e9df0f453b 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java @@ -58,6 +58,7 @@ import com.android.systemui.recents.model.Task; import com.android.systemui.recents.model.TaskStack; +import java.io.PrintWriter; import java.util.ArrayList; /** @@ -148,9 +149,9 @@ public Float get(TaskView tv) { private ArrayList mTmpAnimators = new ArrayList<>(); @ViewDebug.ExportedProperty(deepExport=true, prefix="thumbnail_") - TaskViewThumbnail mThumbnailView; + protected TaskViewThumbnail mThumbnailView; @ViewDebug.ExportedProperty(deepExport=true, prefix="header_") - TaskViewHeader mHeaderView; + protected TaskViewHeader mHeaderView; private View mActionButtonView; private View mIncompatibleAppToastView; private TaskViewCallbacks mCb; @@ -176,8 +177,7 @@ public TaskView(Context context, AttributeSet attrs, int defStyleAttr, int defSt super(context, attrs, defStyleAttr, defStyleRes); RecentsConfiguration config = Recents.getConfiguration(); Resources res = context.getResources(); - mViewBounds = new AnimateableViewBounds(this, res.getDimensionPixelSize( - R.dimen.recents_task_view_shadow_rounded_corners_radius)); + mViewBounds = createOutlineProvider(); if (config.fakeShadows) { setBackground(new FakeShadowDrawable(res, config)); } @@ -194,7 +194,9 @@ void setCallbacks(TaskViewCallbacks cb) { * Called from RecentsActivity when it is relaunched. */ void onReload(boolean isResumingFromVisible) { - resetNoUserInteractionState(); + if (!Recents.getSystemServices().hasFreeformWorkspaceSupport()) { + resetNoUserInteractionState(); + } if (!isResumingFromVisible) { resetViewProperties(); } @@ -205,6 +207,12 @@ public Task getTask() { return mTask; } + /* Create an outline provider to clip and outline the view */ + protected AnimateableViewBounds createOutlineProvider() { + return new AnimateableViewBounds(this, mContext.getResources().getDimensionPixelSize( + R.dimen.recents_task_view_shadow_rounded_corners_radius)); + } + /** Returns the view bounds. */ AnimateableViewBounds getViewBounds() { return mViewBounds; @@ -232,7 +240,7 @@ public void getOutline(View view, Outline outline) { /** * Update the task view when the configuration changes. */ - void onConfigurationChanged() { + protected void onConfigurationChanged() { mHeaderView.onConfigurationChanged(); } @@ -261,7 +269,6 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev); } - @Override protected void measureContents(int width, int height) { int widthWithoutPadding = width - mPaddingLeft - mPaddingRight; @@ -360,12 +367,12 @@ public void cancelTransformAnimation() { } /** 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(); } @@ -666,10 +673,16 @@ public void onClick(final View v) { @Override public boolean onLongClick(View v) { SystemServicesProxy ssp = Recents.getSystemServices(); - // Since we are clipping the view to the bounds, manually do the hit test + boolean inBounds = false; Rect clipBounds = new Rect(mViewBounds.mClipBounds); - clipBounds.scale(getScaleX()); - boolean inBounds = clipBounds.contains(mDownTouchPos.x, mDownTouchPos.y); + if (!clipBounds.isEmpty()) { + // If we are clipping the view to the bounds, manually do the hit test. + clipBounds.scale(getScaleX()); + inBounds = clipBounds.contains(mDownTouchPos.x, mDownTouchPos.y); + } else { + // Otherwise just make sure we're within the view's bounds. + inBounds = mDownTouchPos.x <= getWidth() && mDownTouchPos.y <= getHeight(); + } if (v == this && inBounds && !ssp.hasDockedTask()) { // Start listening for drag events setClipViewInStack(false); @@ -702,4 +715,14 @@ public final void onBusEvent(DragEndCancelledEvent event) { setClipViewInStack(true); }); } + + public void dump(String prefix, PrintWriter writer) { + String innerPrefix = prefix + " "; + + writer.print(prefix); writer.print("TaskView"); + writer.print(" mTask="); writer.print(mTask.key.id); + writer.println(); + + mThumbnailView.dump(innerPrefix, writer); + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java index 691e599aacf3..dc666e90fbdb 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java @@ -91,6 +91,9 @@ public void setColorAndDim(int color, float dimAlpha) { if (mColor != color || Float.compare(mDimAlpha, dimAlpha) != 0) { mColor = color; mDimAlpha = dimAlpha; + if (mShouldDarkenBackgroundColor) { + color = getSecondaryColor(color, false /* useLightOverlayColor */); + } mBackgroundPaint.setColor(color); ColorUtils.colorToHSL(color, mTmpHSL); @@ -179,6 +182,10 @@ public int getColor() { // Header dim, which is only used when task view hardware layers are not used private Paint mDimLayerPaint = new Paint(); + // Whether the background color should be darkened to differentiate from the primary color. + // Used in grid layout. + private boolean mShouldDarkenBackgroundColor = false; + private CountDownTimer mFocusTimerCountDown; public TaskViewHeader(Context context) { @@ -201,7 +208,9 @@ public TaskViewHeader(Context context, AttributeSet attrs, int defStyleAttr, int Resources res = context.getResources(); mLightDismissDrawable = context.getDrawable(R.drawable.recents_dismiss_light); mDarkDismissDrawable = context.getDrawable(R.drawable.recents_dismiss_dark); - mCornerRadius = res.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius); + mCornerRadius = Recents.getConfiguration().isGridEnabled ? + res.getDimensionPixelSize(R.dimen.recents_grid_task_view_rounded_corners_radius) : + res.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius); mHighlightHeight = res.getDimensionPixelSize(R.dimen.recents_task_view_highlight); mTaskBarViewLightTextColor = context.getColor(R.color.recents_task_bar_light_text_color); mTaskBarViewDarkTextColor = context.getColor(R.color.recents_task_bar_dark_text_color); @@ -290,14 +299,16 @@ public void onConfigurationChanged() { R.dimen.recents_task_view_header_height, R.dimen.recents_task_view_header_height_tablet_land, R.dimen.recents_task_view_header_height, - R.dimen.recents_task_view_header_height_tablet_land); + R.dimen.recents_task_view_header_height_tablet_land, + R.dimen.recents_grid_task_view_header_height); int headerButtonPadding = TaskStackLayoutAlgorithm.getDimensionForDevice(getContext(), R.dimen.recents_task_view_header_button_padding, R.dimen.recents_task_view_header_button_padding, R.dimen.recents_task_view_header_button_padding, R.dimen.recents_task_view_header_button_padding_tablet_land, R.dimen.recents_task_view_header_button_padding, - R.dimen.recents_task_view_header_button_padding_tablet_land); + R.dimen.recents_task_view_header_button_padding_tablet_land, + R.dimen.recents_grid_task_view_header_button_padding); if (headerBarHeight != mHeaderBarHeight || headerButtonPadding != mHeaderButtonPadding) { mHeaderBarHeight = headerBarHeight; mHeaderButtonPadding = headerButtonPadding; @@ -438,6 +449,13 @@ private void updateBackgroundColor(int color, float dimAlpha) { } } + /** + * Sets whether the background color should be darkened to differentiate from the primary color. + */ + public void setShouldDarkenBackgroundColor(boolean flag) { + mShouldDarkenBackgroundColor = flag; + } + /** * Binds the bar view to the task. */ @@ -553,7 +571,7 @@ void startNoUserInteractionAnimation() { * Mark this task view that the user does has not interacted with the stack after a certain * time. */ - void setNoUserInteractionState() { + public void setNoUserInteractionState() { mDismissButton.setVisibility(View.VISIBLE); mDismissButton.animate().cancel(); mDismissButton.setAlpha(1f); @@ -603,10 +621,7 @@ public void onClick(View v) { Constants.Metrics.DismissSourceHeaderButton); } else if (v == mMoveTaskButton) { TaskView tv = Utilities.findParent(this, TaskView.class); - Rect bounds = mMoveTaskTargetStackId == FREEFORM_WORKSPACE_STACK_ID - ? new Rect(mTaskViewRect) - : new Rect(); - EventBus.getDefault().send(new LaunchTaskEvent(tv, mTask, bounds, + EventBus.getDefault().send(new LaunchTaskEvent(tv, mTask, null, mMoveTaskTargetStackId, false)); } else if (v == mAppInfoView) { EventBus.getDefault().send(new ShowApplicationInfoEvent(mTask)); diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java index c46adf15861f..83e2eb124bf7 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java @@ -19,6 +19,7 @@ import android.app.ActivityManager; import android.content.Context; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; @@ -35,8 +36,11 @@ import android.view.ViewDebug; import com.android.systemui.R; +import com.android.systemui.recents.misc.Utilities; import com.android.systemui.recents.model.Task; +import java.io.PrintWriter; + /** * The task thumbnail view. It implements an image view that allows for animating the dim and @@ -54,21 +58,25 @@ public class TaskViewThumbnail extends View { // Drawing @ViewDebug.ExportedProperty(category="recents") - private Rect mTaskViewRect = new Rect(); + protected Rect mTaskViewRect = new Rect(); @ViewDebug.ExportedProperty(category="recents") - private Rect mThumbnailRect = new Rect(); + protected Rect mThumbnailRect = new Rect(); @ViewDebug.ExportedProperty(category="recents") - private float mThumbnailScale; + protected float mThumbnailScale; private float mFullscreenThumbnailScale; + /** The height, in pixels, of the task view's title bar. */ + private int mTitleBarHeight; + private boolean mSizeToFit = false; + private boolean mOverlayHeaderOnThumbnailActionBar = true; private ActivityManager.TaskThumbnailInfo mThumbnailInfo; - private int mCornerRadius; + protected int mCornerRadius; @ViewDebug.ExportedProperty(category="recents") private float mDimAlpha; private Matrix mScaleMatrix = new Matrix(); - private Paint mDrawPaint = new Paint(); - private Paint mBgFillPaint = new Paint(); - private BitmapShader mBitmapShader; + protected Paint mDrawPaint = new Paint(); + protected Paint mBgFillPaint = new Paint(); + protected BitmapShader mBitmapShader; private LightingColorFilter mLightingColorFilter = new LightingColorFilter(0xffffffff, 0); // Clip the top of the thumbnail against the opaque header bar that overlaps this view @@ -99,11 +107,12 @@ public TaskViewThumbnail(Context context, AttributeSet attrs, int defStyleAttr, mDrawPaint.setColorFilter(mLightingColorFilter); mDrawPaint.setFilterBitmap(true); mDrawPaint.setAntiAlias(true); - mCornerRadius = getResources().getDimensionPixelSize( - R.dimen.recents_task_view_rounded_corners_radius); + Resources res = getResources(); + mCornerRadius = res.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius); mBgFillPaint.setColor(Color.WHITE); - mFullscreenThumbnailScale = context.getResources().getFraction( + mFullscreenThumbnailScale = res.getFraction( com.android.internal.R.fraction.thumbnail_fullscreen_scale, 1, 1); + mTitleBarHeight = res.getDimensionPixelSize(R.dimen.recents_grid_task_view_header_height); } /** @@ -133,10 +142,12 @@ protected void onDraw(Canvas canvas) { (int) (mThumbnailRect.width() * mThumbnailScale)); int thumbnailHeight = Math.min(viewHeight, (int) (mThumbnailRect.height() * mThumbnailScale)); + if (mBitmapShader != null && thumbnailWidth > 0 && thumbnailHeight > 0) { - int topOffset = mTaskBar != null - ? mTaskBar.getHeight() - mCornerRadius - : 0; + int topOffset = 0; + if (mTaskBar != null && mOverlayHeaderOnThumbnailActionBar) { + topOffset = mTaskBar.getHeight() - mCornerRadius; + } // Draw the background, there will be some small overdraw with the thumbnail if (thumbnailWidth < viewWidth) { @@ -230,6 +241,19 @@ public void updateThumbnailScale() { // If we haven't measured or the thumbnail is invalid, skip the thumbnail drawing // and only draw the background color mThumbnailScale = 0f; + } else if (mSizeToFit) { + // Make sure we fill the entire space regardless of the orientation. + float viewAspectRatio = (float) mTaskViewRect.width() / + (float) (mTaskViewRect.height() - mTitleBarHeight); + float thumbnailAspectRatio = + (float) mThumbnailRect.width() / (float) mThumbnailRect.height(); + if (viewAspectRatio > thumbnailAspectRatio) { + mThumbnailScale = + (float) mTaskViewRect.width() / (float) mThumbnailRect.width(); + } else { + mThumbnailScale = (float) (mTaskViewRect.height() - mTitleBarHeight) + / (float) mThumbnailRect.height(); + } } else if (isStackTask) { float invThumbnailScale = 1f / mFullscreenThumbnailScale; if (mDisplayOrientation == Configuration.ORIENTATION_PORTRAIT) { @@ -262,6 +286,19 @@ public void updateThumbnailScale() { } } + /** Sets whether the thumbnail should be resized to fit the task view in all orientations. */ + public void setSizeToFit(boolean flag) { + mSizeToFit = flag; + } + + /** + * Sets whether the header should overlap (and hide) the action bar in the thumbnail, or + * be stacked just above it. + */ + public void setOverlayHeaderOnThumbnailActionBar(boolean flag) { + mOverlayHeaderOnThumbnailActionBar = flag; + } + /** Updates the clip rect based on the given task bar. */ void updateClipToTaskBar(View taskBar) { mTaskBar = taskBar; @@ -318,4 +355,15 @@ void unbindFromTask() { mTask = null; setThumbnail(null, null); } + + public void dump(String prefix, PrintWriter writer) { + String innerPrefix = prefix + " "; + + writer.print(prefix); writer.print("TaskViewThumbnail"); + writer.print(" mTaskViewRect="); writer.print(Utilities.dumpRect(mTaskViewRect)); + writer.print(" mThumbnailRect="); writer.print(Utilities.dumpRect(mThumbnailRect)); + writer.print(" mThumbnailScale="); writer.print(mThumbnailScale); + writer.print(" mDimAlpha="); writer.print(mDimAlpha); + writer.println(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/grid/AnimateableGridViewBounds.java b/packages/SystemUI/src/com/android/systemui/recents/views/grid/AnimateableGridViewBounds.java new file mode 100644 index 000000000000..a029478c2045 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/views/grid/AnimateableGridViewBounds.java @@ -0,0 +1,32 @@ +/* + * 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.views.grid; + +import android.view.View; +import com.android.systemui.recents.views.AnimateableViewBounds; + +/* An outline provider for grid-based task views. */ +class AnimateableGridViewBounds extends AnimateableViewBounds { + + public AnimateableGridViewBounds(View source, int cornerRadius) { + super(source, cornerRadius); + } + + @Override + protected void updateClipBounds() { + } +} diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/grid/GridTaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/grid/GridTaskView.java new file mode 100644 index 000000000000..290727600286 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/views/grid/GridTaskView.java @@ -0,0 +1,72 @@ +/* + * 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.views.grid; + +import android.content.Context; +import android.util.AttributeSet; +import com.android.systemui.R; +import com.android.systemui.recents.views.AnimateableViewBounds; +import com.android.systemui.recents.views.TaskView; + +public class GridTaskView extends TaskView { + + /** The height, in pixels, of the header view. */ + private int mHeaderHeight; + + public GridTaskView(Context context) { + this(context, null); + } + + public GridTaskView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public GridTaskView(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public GridTaskView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + mHeaderHeight = context.getResources().getDimensionPixelSize( + R.dimen.recents_grid_task_view_header_height); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + // Show the full thumbnail and don't overlap with the header. + mThumbnailView.setSizeToFit(true); + mThumbnailView.setOverlayHeaderOnThumbnailActionBar(false); + mThumbnailView.updateThumbnailScale(); + mThumbnailView.setTranslationY(mHeaderHeight); + mHeaderView.setShouldDarkenBackgroundColor(true); + } + + @Override + protected AnimateableViewBounds createOutlineProvider() { + return new AnimateableGridViewBounds(this, mContext.getResources().getDimensionPixelSize( + R.dimen.recents_task_view_shadow_rounded_corners_radius)); + } + + @Override + protected void onConfigurationChanged() { + super.onConfigurationChanged(); + mHeaderHeight = mContext.getResources().getDimensionPixelSize( + R.dimen.recents_grid_task_view_header_height); + mThumbnailView.setTranslationY(mHeaderHeight); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/grid/GridTaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/grid/GridTaskViewThumbnail.java new file mode 100644 index 000000000000..afc0033eb81c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/views/grid/GridTaskViewThumbnail.java @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2017 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.views.grid; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Path; +import android.util.AttributeSet; + +import com.android.systemui.R; +import com.android.systemui.recents.views.TaskViewThumbnail; + +public class GridTaskViewThumbnail extends TaskViewThumbnail { + + private Path mThumbnailOutline; + private Path mRestBackgroundOutline; + private Path mFullBackgroundOutline; + // True if either this view's size or thumbnail scale has changed and mThumbnailOutline should + // be updated. + private boolean mUpdateThumbnailOutline = true; + + public GridTaskViewThumbnail(Context context) { + this(context, null); + } + + public GridTaskViewThumbnail(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public GridTaskViewThumbnail(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public GridTaskViewThumbnail(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + mCornerRadius = getResources().getDimensionPixelSize( + R.dimen.recents_grid_task_view_rounded_corners_radius); + } + + /** + * Called when the task view frame changes, allowing us to move the contents of the header + * to match the frame changes. + */ + public void onTaskViewSizeChanged(int width, int height) { + mUpdateThumbnailOutline = true; + super.onTaskViewSizeChanged(width, height); + } + + /** + * Updates the scale of the bitmap relative to this view. + */ + public void updateThumbnailScale() { + mUpdateThumbnailOutline = true; + super.updateThumbnailScale(); + } + + private void updateThumbnailOutline() { + final int titleHeight = getResources().getDimensionPixelSize( + R.dimen.recents_grid_task_view_header_height); + final int viewWidth = mTaskViewRect.width(); + final int viewHeight = mTaskViewRect.height() - titleHeight; + final int thumbnailWidth = Math.min(viewWidth, + (int) (mThumbnailRect.width() * mThumbnailScale)); + final int thumbnailHeight = Math.min(viewHeight, + (int) (mThumbnailRect.height() * mThumbnailScale)); + // Draw the thumbnail, we only round the bottom corners: + // + // outerLeft outerRight + // <-----------------------> mRestBackgroundOutline + // _________________________ (thumbnailWidth < viewWidth) + // |_______________________| outerTop A ____ B + // | | ↑ | | + // | | | | | + // | | | | | + // | | | | | C + // \_______________________/ ↓ |__/ + // mCornerRadius outerBottom E D + // + // mRestBackgroundOutline (thumbnailHeight < viewHeight) + // A _________________________ B + // | | C + // F \_______________________/ + // E D + final int outerLeft = 0; + final int outerTop = 0; + final int outerRight = outerLeft + thumbnailWidth; + final int outerBottom = outerTop + thumbnailHeight; + mThumbnailOutline = new Path(); + mThumbnailOutline.moveTo(outerLeft, outerTop); + mThumbnailOutline.lineTo(outerRight, outerTop); + mThumbnailOutline.lineTo(outerRight, outerBottom - mCornerRadius); + mThumbnailOutline.arcTo(outerRight - 2 * mCornerRadius, outerBottom - 2 * mCornerRadius, + outerRight, outerBottom, 0, 90, false); + mThumbnailOutline.lineTo(outerLeft + mCornerRadius, outerBottom); + mThumbnailOutline.arcTo(outerLeft, outerBottom - 2 * mCornerRadius, + outerLeft + 2 * mCornerRadius, outerBottom, 90, 90, false); + mThumbnailOutline.lineTo(outerLeft, outerTop); + mThumbnailOutline.close(); + + if (mBitmapShader != null && thumbnailWidth > 0 && thumbnailHeight > 0) { + if (thumbnailWidth < viewWidth) { + final int l = Math.max(0, outerRight - mCornerRadius); + final int r = outerRight; + final int t = outerTop; + final int b = outerBottom; + mRestBackgroundOutline = new Path(); + mRestBackgroundOutline.moveTo(l, t); // A + mRestBackgroundOutline.lineTo(r, t); // B + mRestBackgroundOutline.lineTo(r, b - mCornerRadius); // C + mRestBackgroundOutline.arcTo(r - 2 * mCornerRadius, b - 2 * mCornerRadius, r, b, + 0, 90, false); // D + mRestBackgroundOutline.lineTo(l, b); // E + mRestBackgroundOutline.lineTo(l, t); // A + mRestBackgroundOutline.close(); + + } + if (thumbnailHeight < viewHeight) { + final int l = outerLeft; + final int r = outerRight; + final int t = Math.max(0, thumbnailHeight - mCornerRadius); + final int b = outerBottom; + mRestBackgroundOutline = new Path(); + mRestBackgroundOutline.moveTo(l, t); // A + mRestBackgroundOutline.lineTo(r, t); // B + mRestBackgroundOutline.lineTo(r, b - mCornerRadius); // C + mRestBackgroundOutline.arcTo(r - 2 * mCornerRadius, b - 2 * mCornerRadius, r, b, + 0, 90, false); // D + mRestBackgroundOutline.lineTo(l + mCornerRadius, b); // E + mRestBackgroundOutline.arcTo(l, b - 2 * mCornerRadius, l + 2 * mCornerRadius, b, + 90, 90, false); // F + mRestBackgroundOutline.lineTo(l, t); // A + mRestBackgroundOutline.close(); + + } + } else { + mFullBackgroundOutline = mThumbnailOutline; + } + } + + @Override + protected void onDraw(Canvas canvas) { + final int titleHeight = getResources().getDimensionPixelSize( + R.dimen.recents_grid_task_view_header_height); + final int viewWidth = mTaskViewRect.width(); + final int viewHeight = mTaskViewRect.height() - titleHeight; + final int thumbnailWidth = Math.min(viewWidth, + (int) (mThumbnailRect.width() * mThumbnailScale)); + final int thumbnailHeight = Math.min(viewHeight, + (int) (mThumbnailRect.height() * mThumbnailScale)); + + if (mUpdateThumbnailOutline) { + updateThumbnailOutline(); + mUpdateThumbnailOutline = false; + } + if (mBitmapShader != null && thumbnailWidth > 0 && thumbnailHeight > 0) { + // Draw the background, there will be some small overdraw with the thumbnail + if (thumbnailWidth < viewWidth) { + // Portrait thumbnail on a landscape task view + canvas.drawPath(mRestBackgroundOutline, mBgFillPaint); + } + if (thumbnailHeight < viewHeight) { + // Landscape thumbnail on a portrait task view + canvas.drawPath(mRestBackgroundOutline, mBgFillPaint); + } + canvas.drawPath(mThumbnailOutline, mDrawPaint); + } else { + canvas.drawPath(mFullBackgroundOutline, mBgFillPaint); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskGridLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskGridLayoutAlgorithm.java new file mode 100644 index 000000000000..4f175368aceb --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskGridLayoutAlgorithm.java @@ -0,0 +1,316 @@ +/* + * 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.views.grid; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Point; +import android.graphics.Rect; +import android.view.WindowManager; + +import com.android.systemui.R; +import com.android.systemui.recents.events.ui.focus.NavigateTaskViewEvent; +import com.android.systemui.recents.events.ui.focus.NavigateTaskViewEvent.Direction; +import com.android.systemui.recents.misc.Utilities; +import com.android.systemui.recents.views.TaskStackLayoutAlgorithm; +import com.android.systemui.recents.views.TaskViewTransform; + +public class TaskGridLayoutAlgorithm { + + private final String TAG = "TaskGridLayoutAlgorithm"; + public static final int MAX_LAYOUT_TASK_COUNT = 8; + + /** The horizontal padding around the whole recents view. */ + private int mPaddingLeftRight; + /** The vertical padding around the whole recents view. */ + private int mPaddingTopBottom; + /** The padding between task views. */ + private int mPaddingTaskView; + + private Rect mWindowRect; + private Point mScreenSize = new Point(); + + private Rect mTaskGridRect; + + /** The height, in pixels, of each task view's title bar. */ + private int mTitleBarHeight; + + /** The aspect ratio of each task thumbnail, without the title bar. */ + private float mAppAspectRatio; + private Rect mSystemInsets = new Rect(); + + /** The thickness of the focused task view frame. */ + private int mFocusedFrameThickness; + + /** + * When the amount of tasks is determined, the size and position of every task view can be + * decided. Each instance of TaskGridRectInfo store the task view information for a certain + * amount of tasks. + */ + class TaskGridRectInfo { + Rect size; + int[] xOffsets; + int[] yOffsets; + int tasksPerLine; + int lines; + + TaskGridRectInfo(int taskCount) { + size = new Rect(); + xOffsets = new int[taskCount]; + yOffsets = new int[taskCount]; + + int layoutTaskCount = Math.min(MAX_LAYOUT_TASK_COUNT, taskCount); + tasksPerLine = getTasksPerLine(layoutTaskCount); + lines = layoutTaskCount < 4 ? 1 : 2; + + // A couple of special cases. + boolean landscapeWindow = mWindowRect.width() > mWindowRect.height(); + boolean landscapeTaskView = mAppAspectRatio > 1; + // If we're in portrait but task views are landscape, show more lines of fewer tasks. + if (!landscapeWindow && landscapeTaskView) { + tasksPerLine = layoutTaskCount < 2 ? 1 : 2; + lines = layoutTaskCount < 3 ? 1 : ( + layoutTaskCount < 5 ? 2 : ( + layoutTaskCount < 7 ? 3 : 4)); + } + // If we're in landscape but task views are portrait, show fewer lines of more tasks. + if (landscapeWindow && !landscapeTaskView) { + tasksPerLine = layoutTaskCount < 7 ? layoutTaskCount : 6; + lines = layoutTaskCount < 7 ? 1 : 2; + } + + int taskWidth, taskHeight; + int maxTaskWidth = (mWindowRect.width() - 2 * mPaddingLeftRight + - (tasksPerLine - 1) * mPaddingTaskView) / tasksPerLine; + int maxTaskHeight = (mWindowRect.height() - 2 * mPaddingTopBottom + - (lines - 1) * mPaddingTaskView) / lines; + + if (maxTaskHeight >= maxTaskWidth / mAppAspectRatio + mTitleBarHeight) { + // Width bound. + taskWidth = maxTaskWidth; + // Here we should round the height to the nearest integer. + taskHeight = (int) (maxTaskWidth / mAppAspectRatio + mTitleBarHeight + 0.5); + } else { + // Height bound. + taskHeight = maxTaskHeight; + // Here we should round the width to the nearest integer. + taskWidth = (int) ((taskHeight - mTitleBarHeight) * mAppAspectRatio + 0.5); + } + size.set(0, 0, taskWidth, taskHeight); + + int emptySpaceX = mWindowRect.width() - 2 * mPaddingLeftRight + - (tasksPerLine * taskWidth) - (tasksPerLine - 1) * mPaddingTaskView; + int emptySpaceY = mWindowRect.height() - 2 * mPaddingTopBottom + - (lines * taskHeight) - (lines - 1) * mPaddingTaskView; + for (int taskIndex = 0; taskIndex < taskCount; taskIndex++) { + // We also need to invert the index in order to display the most recent tasks first. + int taskLayoutIndex = taskCount - taskIndex - 1; + + int xIndex = taskLayoutIndex % tasksPerLine; + int yIndex = taskLayoutIndex / tasksPerLine; + xOffsets[taskIndex] = mWindowRect.left + + emptySpaceX / 2 + mPaddingLeftRight + (taskWidth + mPaddingTaskView) * xIndex; + yOffsets[taskIndex] = mWindowRect.top + + emptySpaceY / 2 + mPaddingTopBottom + (taskHeight + mPaddingTaskView) * yIndex; + } + } + + private int getTasksPerLine(int taskCount) { + switch(taskCount) { + case 0: + return 0; + case 1: + return 1; + case 2: + case 4: + return 2; + case 3: + case 5: + case 6: + return 3; + case 7: + case 8: + return 4; + default: + throw new IllegalArgumentException("Unsupported task count " + taskCount); + } + } + } + + /** + * We can find task view sizes and positions from mTaskGridRectInfoList[k - 1] when there + * are k tasks. + */ + private TaskGridRectInfo[] mTaskGridRectInfoList; + + public TaskGridLayoutAlgorithm(Context context) { + reloadOnConfigurationChange(context); + } + + public void reloadOnConfigurationChange(Context context) { + Resources res = context.getResources(); + mPaddingTaskView = res.getDimensionPixelSize(R.dimen.recents_grid_padding_task_view); + mFocusedFrameThickness = res.getDimensionPixelSize( + R.dimen.recents_grid_task_view_focused_frame_thickness); + + mTaskGridRect = new Rect(); + mTitleBarHeight = res.getDimensionPixelSize(R.dimen.recents_grid_task_view_header_height); + + WindowManager windowManager = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + windowManager.getDefaultDisplay().getRealSize(mScreenSize); + + updateAppAspectRatio(); + } + + /** + * Returns the proper task view transform of a certain task view, according to its index and the + * amount of task views. + * @param taskIndex The index of the task view whose transform we want. It's never greater + * than {@link MAX_LAYOUT_TASK_COUNT}. + * @param taskCount The current amount of task views. + * @param transformOut The result transform that this method returns. + * @param stackLayout The base stack layout algorithm. + * @return The expected transform of the (taskIndex)th task view. + */ + public TaskViewTransform getTransform(int taskIndex, int taskCount, + TaskViewTransform transformOut, TaskStackLayoutAlgorithm stackLayout) { + if (taskCount == 0) { + transformOut.reset(); + return transformOut; + } + + TaskGridRectInfo gridInfo = mTaskGridRectInfoList[taskCount - 1]; + mTaskGridRect.set(gridInfo.size); + + int x = gridInfo.xOffsets[taskIndex]; + int y = gridInfo.yOffsets[taskIndex]; + float z = stackLayout.mMaxTranslationZ; + + // We always set the dim alpha to 0, since we don't want grid task views to dim. + float dimAlpha = 0f; + // We always set the alpha of the view outline to 1, to make sure the shadow is visible. + float viewOutlineAlpha = 1f; + + // We also need to invert the index in order to display the most recent tasks first. + int taskLayoutIndex = taskCount - taskIndex - 1; + boolean isTaskViewVisible = taskLayoutIndex < MAX_LAYOUT_TASK_COUNT; + + // Fill out the transform + transformOut.scale = 1f; + transformOut.alpha = isTaskViewVisible ? 1f : 0f; + transformOut.translationZ = z; + transformOut.dimAlpha = dimAlpha; + transformOut.viewOutlineAlpha = viewOutlineAlpha; + transformOut.rect.set(mTaskGridRect); + transformOut.rect.offset(x, y); + Utilities.scaleRectAboutCenter(transformOut.rect, transformOut.scale); + // We only show the 8 most recent tasks. + transformOut.visible = isTaskViewVisible; + return transformOut; + } + + /** + * Return the proper task index to focus for arrow key navigation. + * @param taskCount The amount of tasks. + * @param currentFocusedIndex The index of the currently focused task. + * @param direction The direction we're navigating. + * @return The index of the task that should get the focus. + */ + public int navigateFocus(int taskCount, int currentFocusedIndex, Direction direction) { + if (taskCount < 1 || taskCount > MAX_LAYOUT_TASK_COUNT) { + return -1; + } + if (currentFocusedIndex == -1) { + return 0; + } + int newIndex = currentFocusedIndex; + final TaskGridRectInfo gridInfo = mTaskGridRectInfoList[taskCount - 1]; + final int currentLine = (taskCount - 1 - currentFocusedIndex) / gridInfo.tasksPerLine; + switch (direction) { + case UP: + newIndex += gridInfo.tasksPerLine; + newIndex = newIndex >= taskCount ? currentFocusedIndex : newIndex; + break; + case DOWN: + newIndex -= gridInfo.tasksPerLine; + newIndex = newIndex < 0 ? currentFocusedIndex : newIndex; + break; + case LEFT: + newIndex++; + final int leftMostIndex = (taskCount - 1) - currentLine * gridInfo.tasksPerLine; + newIndex = newIndex > leftMostIndex ? currentFocusedIndex : newIndex; + break; + case RIGHT: + newIndex--; + int rightMostIndex = + (taskCount - 1) - (currentLine + 1) * gridInfo.tasksPerLine + 1; + rightMostIndex = rightMostIndex < 0 ? 0 : rightMostIndex; + newIndex = newIndex < rightMostIndex ? currentFocusedIndex : newIndex; + break; + } + return newIndex; + } + + public void initialize(Rect windowRect) { + mWindowRect = windowRect; + // Define paddings in terms of percentage of the total area. + mPaddingLeftRight = (int) (0.025f * Math.min(mWindowRect.width(), mWindowRect.height())); + mPaddingTopBottom = (int) (0.1 * mWindowRect.height()); + + // Pre-calculate the positions and offsets of task views so that we can reuse them directly + // in the future. + mTaskGridRectInfoList = new TaskGridRectInfo[MAX_LAYOUT_TASK_COUNT]; + for (int i = 0; i < MAX_LAYOUT_TASK_COUNT; i++) { + mTaskGridRectInfoList[i] = new TaskGridRectInfo(i + 1); + } + } + + public void setSystemInsets(Rect systemInsets) { + mSystemInsets = systemInsets; + updateAppAspectRatio(); + } + + private void updateAppAspectRatio() { + int usableWidth = mScreenSize.x - mSystemInsets.left - mSystemInsets.right; + int usableHeight = mScreenSize.y - mSystemInsets.top - mSystemInsets.bottom; + mAppAspectRatio = (float) usableWidth / (float) usableHeight; + } + + public Rect getStackActionButtonRect() { + Rect buttonRect = new Rect(mWindowRect); + buttonRect.right -= mPaddingLeftRight; + buttonRect.left += mPaddingLeftRight; + buttonRect.bottom = buttonRect.top + mPaddingTopBottom; + return buttonRect; + } + + public void updateTaskGridRect(int taskCount) { + if (taskCount > 0) { + TaskGridRectInfo gridInfo = mTaskGridRectInfoList[taskCount - 1]; + mTaskGridRect.set(gridInfo.size); + } + } + + public Rect getTaskGridRect() { + return mTaskGridRect; + } + + public int getFocusFrameThickness() { + return mFocusedFrameThickness; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskViewFocusFrame.java b/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskViewFocusFrame.java new file mode 100644 index 000000000000..86ed583b07aa --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskViewFocusFrame.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2017 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.views.grid; + +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.View; + +import android.view.ViewTreeObserver.OnGlobalFocusChangeListener; +import com.android.systemui.R; +import com.android.systemui.recents.model.TaskStack; +import com.android.systemui.recents.views.TaskStackView; + +public class TaskViewFocusFrame extends View implements OnGlobalFocusChangeListener { + + private TaskStackView mSv; + private TaskGridLayoutAlgorithm mTaskGridLayoutAlgorithm; + public TaskViewFocusFrame(Context context) { + this(context, null); + } + + public TaskViewFocusFrame(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public TaskViewFocusFrame(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public TaskViewFocusFrame(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + setBackground(mContext.getDrawable( + R.drawable.recents_grid_task_view_focus_frame_background)); + setFocusable(false); + hide(); + } + + public TaskViewFocusFrame(Context context, TaskStackView stackView, + TaskGridLayoutAlgorithm taskGridLayoutAlgorithm) { + this(context); + mSv = stackView; + mTaskGridLayoutAlgorithm = taskGridLayoutAlgorithm; + } + + /** + * Measure the width and height of the focus frame according to the current grid task view size. + */ + public void measure() { + int thickness = mTaskGridLayoutAlgorithm.getFocusFrameThickness(); + Rect rect = mTaskGridLayoutAlgorithm.getTaskGridRect(); + measure( + MeasureSpec.makeMeasureSpec(rect.width() + thickness * 2, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(rect.height() + thickness * 2, MeasureSpec.EXACTLY)); + } + + /** + * Layout the focus frame with its size. + */ + public void layout() { + layout(0, 0, getMeasuredWidth(), getMeasuredHeight()); + } + + /** + * Update the current size of grid task view and the focus frame. + */ + public void resize() { + if (mSv.useGridLayout()) { + mTaskGridLayoutAlgorithm.updateTaskGridRect(mSv.getStack().getTaskCount()); + measure(); + requestLayout(); + } + } + + /** + * Move the task view focus frame to surround the newly focused view. If it's {@code null} or + * it's not an instance of GridTaskView, we hide the focus frame. + * @param newFocus The newly focused view. + */ + public void moveGridTaskViewFocus(View newFocus) { + if (mSv.useGridLayout()) { + // The frame only shows up in the grid layout. It shouldn't show up in the stack + // layout including when we're in the split screen. + if (newFocus instanceof GridTaskView) { + // If the focus goes to a GridTaskView, we show the frame and layout it. + int[] location = new int[2]; + newFocus.getLocationInWindow(location); + int thickness = mTaskGridLayoutAlgorithm.getFocusFrameThickness(); + setTranslationX(location[0] - thickness); + setTranslationY(location[1] - thickness); + show(); + } else { + // If focus goes to other views, we hide the frame. + hide(); + } + } + } + + @Override + public void onGlobalFocusChanged(View oldFocus, View newFocus) { + if (!mSv.useGridLayout()) { + return; + } + if (newFocus == null) { + // We're going to touch mode, unset the focus. + moveGridTaskViewFocus(null); + return; + } + if (oldFocus == null) { + // We're returning from touch mode, set the focus to the previously focused task. + final TaskStack stack = mSv.getStack(); + final int taskCount = stack.getTaskCount(); + final int k = stack.indexOfStackTask(mSv.getFocusedTask()); + final int taskIndexToFocus = k == -1 ? (taskCount - 1) : (k % taskCount); + mSv.setFocusedTask(taskIndexToFocus, false, true); + } + } + + private void show() { + setAlpha(1f); + } + + private void hide() { + setAlpha(0f); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 921459c37e9a..4a8a5db148fc 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -59,6 +59,7 @@ import android.view.animation.Interpolator; import android.widget.ImageView; +import com.android.internal.messages.SystemMessageProto.SystemMessage; import com.android.systemui.R; import com.android.systemui.SystemUI; @@ -201,7 +202,8 @@ class SaveImageInBackgroundTask extends AsyncTask { mNotificationBuilder.setFlag(Notification.FLAG_NO_CLEAR, true); SystemUI.overrideNotificationAppName(context, mNotificationBuilder); - mNotificationManager.notify(R.id.notification_screenshot, mNotificationBuilder.build()); + mNotificationManager.notify(SystemMessage.NOTE_GLOBAL_SCREENSHOT, + mNotificationBuilder.build()); /** * NOTE: The following code prepares the notification builder for updating the notification @@ -347,7 +349,8 @@ protected void onPostExecute(Void params) { .setPublicVersion(mPublicNotificationBuilder.build()) .setFlag(Notification.FLAG_NO_CLEAR, false); - mNotificationManager.notify(R.id.notification_screenshot, mNotificationBuilder.build()); + mNotificationManager.notify(SystemMessage.NOTE_GLOBAL_SCREENSHOT, + mNotificationBuilder.build()); } mParams.finisher.run(); mParams.clearContext(); @@ -363,7 +366,7 @@ protected void onCancelled(Void params) { mParams.clearContext(); // Cancel the posted notification - mNotificationManager.cancel(R.id.notification_screenshot); + mNotificationManager.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT); } } @@ -869,7 +872,7 @@ static void notifyScreenshotError(Context context, NotificationManager nManager, Notification n = new Notification.BigTextStyle(b) .bigText(errorMsg) .build(); - nManager.notify(R.id.notification_screenshot, n); + nManager.notify(SystemMessage.NOTE_GLOBAL_SCREENSHOT, n); } /** @@ -881,7 +884,7 @@ public void onReceive(Context context, Intent intent) { // Clear the notification final NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancel(R.id.notification_screenshot); + nm.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT); } } @@ -899,7 +902,7 @@ public void onReceive(Context context, Intent intent) { final NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); final Uri uri = Uri.parse(intent.getStringExtra(SCREENSHOT_URI_ID)); - nm.cancel(R.id.notification_screenshot); + nm.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT); // And delete the image from the media store new DeleteImageInBackgroundTask(context).execute(uri); diff --git a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java index 1c6fffb6dde7..14c41616c8e5 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java @@ -30,6 +30,9 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.provider.Settings; +import android.service.vr.IVrManager; +import android.service.vr.IVrStateCallbacks; +import android.util.Log; import android.widget.ImageView; import com.android.internal.logging.MetricsLogger; @@ -52,9 +55,12 @@ public class BrightnessController implements ToggleSlider.Listener { private static final int MSG_SET_CHECKED = 2; private static final int MSG_ATTACH_LISTENER = 3; private static final int MSG_DETACH_LISTENER = 4; + private static final int MSG_VR_MODE_CHANGED = 5; private final int mMinimumBacklight; private final int mMaximumBacklight; + private final int mMinimumBacklightForVr; + private final int mMaximumBacklightForVr; private final Context mContext; private final ImageView mIcon; @@ -62,6 +68,7 @@ public class BrightnessController implements ToggleSlider.Listener { private final boolean mAutomaticAvailable; private final IPowerManager mPower; private final CurrentUserTracker mUserTracker; + private final IVrManager mVrManager; private Handler mBackgroundHandler; private final BrightnessObserver mBrightnessObserver; @@ -69,7 +76,8 @@ public class BrightnessController implements ToggleSlider.Listener { private ArrayList mChangeCallbacks = new ArrayList(); - private volatile boolean mAutomatic; + private volatile boolean mAutomatic; // Brightness adjusted automatically using ambient light. + private volatile boolean mIsVrModeEnabled; private boolean mListening; private boolean mExternalChange; @@ -84,6 +92,8 @@ private class BrightnessObserver extends ContentObserver { Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE); private final Uri BRIGHTNESS_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); + private final Uri BRIGHTNESS_FOR_VR_URI = + Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_VR); private final Uri BRIGHTNESS_ADJ_URI = Settings.System.getUriFor(Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ); @@ -105,6 +115,8 @@ public void onChange(boolean selfChange, Uri uri) { mBackgroundHandler.post(mUpdateSliderRunnable); } else if (BRIGHTNESS_URI.equals(uri) && !mAutomatic) { mBackgroundHandler.post(mUpdateSliderRunnable); + } else if (BRIGHTNESS_FOR_VR_URI.equals(uri)) { + mBackgroundHandler.post(mUpdateSliderRunnable); } else if (BRIGHTNESS_ADJ_URI.equals(uri) && mAutomatic) { mBackgroundHandler.post(mUpdateSliderRunnable); } else { @@ -125,6 +137,9 @@ public void startObserving() { cr.registerContentObserver( BRIGHTNESS_URI, false, this, UserHandle.USER_ALL); + cr.registerContentObserver( + BRIGHTNESS_FOR_VR_URI, + false, this, UserHandle.USER_ALL); cr.registerContentObserver( BRIGHTNESS_ADJ_URI, false, this, UserHandle.USER_ALL); @@ -191,7 +206,14 @@ public void run() { private final Runnable mUpdateSliderRunnable = new Runnable() { @Override public void run() { - if (mAutomatic) { + if (mIsVrModeEnabled) { + int value = Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS_FOR_VR, mMaximumBacklight, + UserHandle.USER_CURRENT); + mHandler.obtainMessage(MSG_UPDATE_SLIDER, + mMaximumBacklightForVr - mMinimumBacklightForVr, + value - mMinimumBacklightForVr).sendToTarget(); + } else if (mAutomatic) { float value = Settings.System.getFloatForUser(mContext.getContentResolver(), Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0, UserHandle.USER_CURRENT); @@ -208,6 +230,14 @@ public void run() { } }; + private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { + @Override + public void onVrStateChanged(boolean enabled) { + mHandler.obtainMessage(MSG_VR_MODE_CHANGED, enabled ? 1 : 0, 0) + .sendToTarget(); + } + }; + private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { @@ -229,6 +259,10 @@ public void handleMessage(Message msg) { break; case MSG_DETACH_LISTENER: mControl.setOnChangedListener(null); + break; + case MSG_VR_MODE_CHANGED: + updateVrMode(msg.arg1 != 0); + break; default: super.handleMessage(msg); } @@ -255,10 +289,13 @@ public void onUserSwitched(int newUserId) { PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); mMinimumBacklight = pm.getMinimumScreenBrightnessSetting(); mMaximumBacklight = pm.getMaximumScreenBrightnessSetting(); + mMinimumBacklightForVr = pm.getMinimumScreenBrightnessForVrSetting(); + mMaximumBacklightForVr = pm.getMaximumScreenBrightnessForVrSetting(); mAutomaticAvailable = context.getResources().getBoolean( com.android.internal.R.bool.config_automatic_brightness_available); mPower = IPowerManager.Stub.asInterface(ServiceManager.getService("power")); + mVrManager = IVrManager.Stub.asInterface(ServiceManager.getService("vrmanager")); } public void setBackgroundLooper(Looper backgroundLooper) { @@ -283,6 +320,15 @@ public void registerCallbacks() { return; } + if (mVrManager != null) { + try { + mVrManager.registerListener(mVrStateCallbacks); + mIsVrModeEnabled = mVrManager.getVrModeState(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to register VR mode state listener: ", e); + } + } + mBackgroundHandler.post(mStartListeningRunnable); mListening = true; } @@ -293,6 +339,14 @@ public void unregisterCallbacks() { return; } + if (mVrManager != null) { + try { + mVrManager.unregisterListener(mVrStateCallbacks); + } catch (RemoteException e) { + Log.e(TAG, "Failed to unregister VR mode state listener: ", e); + } + } + mBackgroundHandler.post(mStopListeningRunnable); mListening = false; } @@ -303,7 +357,22 @@ public void onChanged(ToggleSlider view, boolean tracking, boolean automatic, in updateIcon(mAutomatic); if (mExternalChange) return; - if (!mAutomatic) { + if (mIsVrModeEnabled) { + final int val = value + mMinimumBacklightForVr; + if (stopTracking) { + MetricsLogger.action(mContext, MetricsEvent.ACTION_BRIGHTNESS_FOR_VR, val); + } + setBrightness(val); + if (!tracking) { + AsyncTask.execute(new Runnable() { + public void run() { + Settings.System.putIntForUser(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS_FOR_VR, val, + UserHandle.USER_CURRENT); + } + }); + } + } else if (!mAutomatic) { final int val = value + mMinimumBacklight; if (stopTracking) { MetricsLogger.action(mContext, MetricsEvent.ACTION_BRIGHTNESS, val); @@ -367,4 +436,11 @@ private void updateIcon(boolean automatic) { com.android.systemui.R.drawable.ic_qs_brightness_auto_off); } } + + private void updateVrMode(boolean isEnabled) { + if (mIsVrModeEnabled != isEnabled) { + mIsVrModeEnabled = isEnabled; + mBackgroundHandler.post(mUpdateSliderRunnable); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java index bc4654823f77..6b30c0cf25df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java @@ -110,6 +110,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private float mDownY; private final float mTouchSlop; + private float mActivationX; + private float mActivationY; + private final float mDoubleTapSlop; + private OnActivatedListener mOnActivatedListener; private final Interpolator mSlowOutFastInInterpolator; @@ -171,6 +175,7 @@ public void onAnimationUpdate(ValueAnimator animation) { public ActivatableNotificationView(Context context, AttributeSet attrs) { super(context, attrs); mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + mDoubleTapSlop = context.getResources().getDimension(R.dimen.double_tap_slop); mSlowOutFastInInterpolator = new PathInterpolator(0.8f, 0.0f, 0.6f, 1.0f); mSlowOutLinearInInterpolator = new PathInterpolator(0.8f, 0.0f, 1.0f, 1.0f); setClipChildren(false); @@ -232,7 +237,6 @@ public boolean onTouchEvent(MotionEvent event) { boolean wasActivated = mActivated; result = handleTouchEventDimmed(event); if (wasActivated && result && event.getAction() == MotionEvent.ACTION_UP) { - mFalsingManager.onNotificationDoubleTap(); removeCallbacks(mTapTimeoutRunnable); } } else { @@ -283,9 +287,21 @@ private boolean handleTouchEventDimmed(MotionEvent event) { if (!mActivated) { makeActive(); postDelayed(mTapTimeoutRunnable, DOUBLETAP_TIMEOUT_MS); + mActivationX = event.getX(); + mActivationY = event.getY(); } else { - if (!performClick()) { - return false; + boolean withinDoubleTapSlop = isWithinDoubleTapSlop(event); + mFalsingManager.onNotificationDoubleTap( + withinDoubleTapSlop, + event.getX() - mActivationX, + event.getY() - mActivationY); + if (withinDoubleTapSlop) { + if (!performClick()) { + return false; + } + } else { + makeInactive(true /* animate */); + mTrackTouch = false; } } } else { @@ -393,6 +409,16 @@ private boolean isWithinTouchSlop(MotionEvent event) { && Math.abs(event.getY() - mDownY) < mTouchSlop; } + private boolean isWithinDoubleTapSlop(MotionEvent event) { + if (!mActivated) { + // If we're not activated there's no double tap slop to satisfy. + return true; + } + + return Math.abs(event.getX() - mActivationX) < mDoubleTapSlop + && Math.abs(event.getY() - mActivationY) < mDoubleTapSlop; + } + public void setDimmed(boolean dimmed, boolean fade) { if (mDimmed != dimmed) { mDimmed = dimmed; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 80ab6acea9a3..3e3cfd6a50b6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -88,6 +88,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; +import com.android.internal.messages.SystemMessageProto.SystemMessage; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.widget.LockPatternUtils; @@ -103,6 +104,7 @@ import com.android.systemui.recents.Recents; import com.android.systemui.statusbar.NotificationData.Entry; import com.android.systemui.statusbar.NotificationGuts.OnGutsClosedListener; +import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.phone.NavigationBarView; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; @@ -118,14 +120,14 @@ import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.Stack; import static android.service.notification.NotificationListenerService.Ranking.IMPORTANCE_HIGH; public abstract class BaseStatusBar extends SystemUI implements CommandQueue.Callbacks, ActivatableNotificationView.OnActivatedListener, ExpandableNotificationRow.ExpansionLogger, NotificationData.Environment, - ExpandableNotificationRow.OnExpandClickListener, - OnGutsClosedListener { + ExpandableNotificationRow.OnExpandClickListener, OnGutsClosedListener { public static final String TAG = "StatusBar"; public static final boolean DEBUG = false; public static final boolean MULTIUSER_DEBUG = false; @@ -179,6 +181,9 @@ public abstract class BaseStatusBar extends SystemUI implements // for heads up notifications protected HeadsUpManager mHeadsUpManager; + // handling reordering + protected VisualStabilityManager mVisualStabilityManager = new VisualStabilityManager(); + protected int mCurrentUserId = 0; final protected SparseArray mCurrentProfiles = new SparseArray(); @@ -547,7 +552,7 @@ public void onReceive(Context context, Intent intent) { } else if (BANNER_ACTION_CANCEL.equals(action) || BANNER_ACTION_SETUP.equals(action)) { NotificationManager noMan = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - noMan.cancel(R.id.notification_hidden); + noMan.cancel(SystemMessage.NOTE_HIDDEN_NOTIFICATIONS); Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING, 0); @@ -878,7 +883,7 @@ protected void notifyUserAboutHiddenNotifications() { NotificationManager noMan = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - noMan.notify(R.id.notification_hidden, note.build()); + noMan.notify(SystemMessage.NOTE_HIDDEN_NOTIFICATIONS, note.build()); } } @@ -979,12 +984,12 @@ public void onClick(View v) { // Accessibility feedback v.announceForAccessibility( mContext.getString(R.string.accessibility_notification_dismissed)); - performRemoveNotification(row.getStatusBarNotification(), false /* removeView */); + performRemoveNotification(row.getStatusBarNotification()); } }); } - protected void performRemoveNotification(StatusBarNotification n, boolean removeView) { + protected void performRemoveNotification(StatusBarNotification n) { final String pkg = n.getPackageName(); final String tag = n.getTag(); final int id = n.getId(); @@ -994,14 +999,8 @@ protected void performRemoveNotification(StatusBarNotification n, boolean remove if (FORCE_REMOTE_INPUT_HISTORY && mKeysKeptForRemoteInput.contains(n.getKey())) { mKeysKeptForRemoteInput.remove(n.getKey()); - removeView = true; - } - if (mRemoteInputEntriesToRemoveOnCollapse.remove(mNotificationData.get(n.getKey()))) { - removeView = true; - } - if (removeView) { - removeNotification(n.getKey(), null); } + removeNotification(n.getKey(), null); } catch (RemoteException ex) { // system process is dead if we're here. @@ -2000,8 +1999,7 @@ public void run() { Runnable removeRunnable = new Runnable() { @Override public void run() { - performRemoveNotification(parentToCancelFinal, - true); + performRemoveNotification(parentToCancelFinal); } }; if (isCollapsing()) { @@ -2252,9 +2250,8 @@ protected void addNotificationViews(Entry entry, RankingMap ranking) { */ protected void updateRowStates() { mKeyguardIconOverflowContainer.getIconsView().removeAllViews(); + final int N = mStackScroller.getChildCount(); - ArrayList activeNotifications = mNotificationData.getActiveNotifications(); - final int N = activeNotifications.size(); int visibleNotifications = 0; boolean onKeyguard = mState == StatusBarState.KEYGUARD; @@ -2262,14 +2259,23 @@ protected void updateRowStates() { if (onKeyguard) { maxNotifications = getMaxKeyguardNotifications(true /* recompute */); } - for (int i = 0; i < N; i++) { - NotificationData.Entry entry = activeNotifications.get(i); + Stack stack = new Stack<>(); + for (int i = N - 1; i >= 0; i--) { + View child = mStackScroller.getChildAt(i); + if (!(child instanceof ExpandableNotificationRow)) { + continue; + } + stack.push((ExpandableNotificationRow) child); + } + while(!stack.isEmpty()) { + ExpandableNotificationRow row = stack.pop(); + NotificationData.Entry entry = row.getEntry(); boolean childNotification = mGroupManager.isChildInGroupWithSummary(entry.notification); if (onKeyguard) { - entry.row.setOnKeyguard(true); + row.setOnKeyguard(true); } else { - entry.row.setOnKeyguard(false); - entry.row.setSystemExpanded(visibleNotifications == 0 && !childNotification); + row.setOnKeyguard(false); + row.setSystemExpanded(visibleNotifications == 0 && !childNotification); } boolean suppressedSummary = mGroupManager.isSummaryOfSuppressedGroup( entry.notification) && !entry.row.isRemoved(); @@ -2286,7 +2292,9 @@ protected void updateRowStates() { } } else { boolean wasGone = entry.row.getVisibility() == View.GONE; - entry.row.setVisibility(View.VISIBLE); + if (wasGone) { + entry.row.setVisibility(View.VISIBLE); + } if (!childNotification && !entry.row.isRemoved()) { if (wasGone) { // notify the scroller of a child addition @@ -2296,6 +2304,14 @@ protected void updateRowStates() { visibleNotifications++; } } + if (row.isSummaryWithChildren()) { + List notificationChildren = + row.getNotificationChildren(); + int size = notificationChildren.size(); + for (int i = size - 1; i >= 0; i--) { + stack.push(notificationChildren.get(i)); + } + } } mStackScroller.updateOverflowContainerVisibility(onKeyguard @@ -2533,9 +2549,7 @@ protected boolean shouldPeek(Entry entry, StatusBarNotification sbn) { return false; } - boolean inUse = mPowerManager.isScreenOn() - && (!mStatusBarKeyguardViewManager.isShowing() - || mStatusBarKeyguardViewManager.isOccluded()); + boolean inUse = mPowerManager.isScreenOn(); try { inUse = inUse && !mDreamManager.isDreaming(); } catch (RemoteException e) { @@ -2574,7 +2588,9 @@ protected boolean shouldPeek(Entry entry, StatusBarNotification sbn) { if (DEBUG) Log.d(TAG, "No peeking: accessible fullscreen: " + sbn.getKey()); return false; } else { - return true; + // we only allow head-up on the lockscreen if it doesn't have a fullscreen intent + return !mStatusBarKeyguardViewManager.isShowing() + || mStatusBarKeyguardViewManager.isOccluded(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index caf5447d9d26..8ebe0b765215 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -48,6 +48,7 @@ import com.android.systemui.R; import com.android.systemui.classifier.FalsingManager; import com.android.systemui.statusbar.notification.HybridNotificationView; +import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.stack.NotificationChildrenContainer; @@ -318,6 +319,10 @@ public StatusBarNotification getStatusBarNotification() { return mStatusBarNotification; } + public NotificationData.Entry getEntry() { + return mEntry; + } + public boolean isHeadsUp() { return mIsHeadsUp; } @@ -451,10 +456,15 @@ public int getNumberOfNotificationChildren() { * Apply the order given in the list to the children. * * @param childOrder the new list order + * @param visualStabilityManager + * @param callback the callback to invoked in case it is not allowed * @return whether the list order has changed */ - public boolean applyChildOrder(List childOrder) { - return mChildrenContainer != null && mChildrenContainer.applyChildOrder(childOrder); + public boolean applyChildOrder(List childOrder, + VisualStabilityManager visualStabilityManager, + VisualStabilityManager.Callback callback) { + return mChildrenContainer != null && mChildrenContainer.applyChildOrder(childOrder, + visualStabilityManager, callback); } public void getChildrenStates(StackScrollState resultState) { @@ -1205,7 +1215,7 @@ public int getIntrinsicHeight() { return getMinHeight(); } else if (mIsSummaryWithChildren && !mOnKeyguard) { return mChildrenContainer.getIntrinsicHeight(); - } else if (mIsHeadsUp || mHeadsupDisappearRunning) { + } else if (!mOnKeyguard && (mIsHeadsUp || mHeadsupDisappearRunning)) { if (isPinned() || mHeadsupDisappearRunning) { return getPinnedHeadsUpHeight(true /* atLeastMinHeight */); } else if (isExpanded()) { @@ -1346,6 +1356,7 @@ public void setHideSensitive(boolean hideSensitive, boolean animated, long delay NotificationContentView showingLayout = getShowingLayout(); showingLayout.updateBackgroundColor(animated); mPrivateLayout.updateExpandButtons(isExpandable()); + showingLayout.setDark(isDark(), false /* animate */, 0 /* delay */); mShowingPublicInitialized = true; } @@ -1503,11 +1514,11 @@ public int getMaxContentHeight() { @Override public int getMinHeight() { - if (mIsHeadsUp && mHeadsUpManager.isTrackingHeadsUp()) { + if (!mOnKeyguard && mIsHeadsUp && mHeadsUpManager.isTrackingHeadsUp()) { return getPinnedHeadsUpHeight(false /* atLeastMinHeight */); } else if (mIsSummaryWithChildren && !isGroupExpanded() && !mShowingPublic) { return mChildrenContainer.getMinHeight(); - } else if (mIsHeadsUp) { + } else if (!mOnKeyguard && mIsHeadsUp) { return mHeadsUpHeight; } NotificationContentView showingLayout = getShowingLayout(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java index 58d57f68d699..8fdc32234aa5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java @@ -456,7 +456,8 @@ private int getMinContentHeightHint() { isTransitioningFromTo(VISIBLE_TYPE_HEADSUP, VISIBLE_TYPE_EXPANDED) || isTransitioningFromTo(VISIBLE_TYPE_EXPANDED, VISIBLE_TYPE_HEADSUP); boolean pinned = !isVisibleOrTransitioning(VISIBLE_TYPE_CONTRACTED) - && (mIsHeadsUp || mHeadsupDisappearRunning); + && (mIsHeadsUp || mHeadsupDisappearRunning) + && !mContainingNotification.isOnKeyguard(); if (transitioningBetweenHunAndExpanded || pinned) { return Math.min(mHeadsUpChild.getHeight(), mExpandedChild.getHeight()); } @@ -560,7 +561,7 @@ public int getContentHeight() { public int getMaxHeight() { if (mExpandedChild != null) { return mExpandedChild.getHeight(); - } else if (mIsHeadsUp && mHeadsUpChild != null) { + } else if (mIsHeadsUp && mHeadsUpChild != null && !mContainingNotification.isOnKeyguard()) { return mHeadsUpChild.getHeight(); } return mContractedChild.getHeight(); @@ -840,7 +841,8 @@ private int getVisualTypeForHeight(float viewHeight) { return VISIBLE_TYPE_SINGLELINE; } - if ((mIsHeadsUp || mHeadsupDisappearRunning) && mHeadsUpChild != null) { + if ((mIsHeadsUp || mHeadsupDisappearRunning) && mHeadsUpChild != null + && !mContainingNotification.isOnKeyguard()) { if (viewHeight <= mHeadsUpChild.getHeight() || noExpandedChild) { return VISIBLE_TYPE_HEADSUP; } else { @@ -1086,7 +1088,7 @@ public void updateExpandButtons(boolean expandable) { mExpandable = expandable; // if the expanded child has the same height as the collapsed one we hide it. if (mExpandedChild != null && mExpandedChild.getHeight() != 0) { - if ((!mIsHeadsUp || mHeadsUpChild == null)) { + if (!mIsHeadsUp || mHeadsUpChild == null || mContainingNotification.isOnKeyguard()) { if (mExpandedChild.getHeight() == mContractedChild.getHeight()) { expandable = false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java index 05a9fc762595..3052bf6a0617 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -394,20 +394,6 @@ boolean shouldFilterOut(StatusBarNotification sbn) { return false; } - /** - * Return whether there are any clearable notifications (that aren't errors). - */ - public boolean hasActiveClearableNotifications() { - for (Entry e : mSortedAndFiltered) { - if (e.getContentView() != null) { // the view successfully inflated - if (e.notification.isClearable()) { - return true; - } - } - } - return false; - } - // Q: What kinds of notifications should show during setup? // A: Almost none! Only things coming from the system (package is "android") that also // have special "kind" tags marking them as relevant for setup (see below). diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java index a92368a6a279..76afd66f53bb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java @@ -242,9 +242,9 @@ private int getSelectedImportance() { return Ranking.IMPORTANCE_UNSPECIFIED; } } else { - if (mBlock.isChecked()) { + if (mBlock != null && mBlock.isChecked()) { return Ranking.IMPORTANCE_NONE; - } else if (mSilent.isChecked()) { + } else if (mSilent != null && mSilent.isChecked()) { return Ranking.IMPORTANCE_LOW; } else { return Ranking.IMPORTANCE_UNSPECIFIED; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index 74caa5326f83..13253b4f03c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -271,7 +271,7 @@ public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState q @Override public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId) { + String description, boolean isWide, int subId, boolean roaming) { PhoneState state = getState(subId); if (state == null) { return; @@ -282,6 +282,7 @@ public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int state.mMobileDescription = statusIcon.contentDescription; state.mMobileTypeDescription = typeContentDescription; state.mIsMobileTypeIconWide = statusType != 0 && isWide; + state.mRoaming = roaming; apply(); } @@ -591,7 +592,8 @@ private class PhoneState { private String mMobileDescription, mMobileTypeDescription; private ViewGroup mMobileGroup; - private ImageView mMobile, mMobileDark, mMobileType; + private ImageView mMobile, mMobileDark, mMobileType, mMobileRoaming; + public boolean mRoaming; public PhoneState(int subId, Context context) { ViewGroup root = (ViewGroup) LayoutInflater.from(context) @@ -605,6 +607,7 @@ public void setViews(ViewGroup root) { mMobile = (ImageView) root.findViewById(R.id.mobile_signal); mMobileDark = (ImageView) root.findViewById(R.id.mobile_signal_dark); mMobileType = (ImageView) root.findViewById(R.id.mobile_type); + mMobileRoaming = (ImageView) root.findViewById(R.id.mobile_roaming); } public boolean apply(boolean isSecondaryIcon) { @@ -640,6 +643,7 @@ public boolean apply(boolean isSecondaryIcon) { (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId)); mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE); + mMobileRoaming.setVisibility(mRoaming ? View.VISIBLE : View.GONE); return mMobileVisible; } @@ -699,6 +703,8 @@ public void setIconTint(int tint, float darkIntensity, Rect tintArea) { StatusBarIconController.getDarkIntensity(tintArea, mMobile, darkIntensity), mMobile, mMobileDark); setTint(mMobileType, StatusBarIconController.getTint(tintArea, mMobileType, tint)); + setTint(mMobileRoaming, StatusBarIconController.getTint(tintArea, mMobileRoaming, + tint)); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisibilityLocationProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisibilityLocationProvider.java new file mode 100644 index 000000000000..4a52acccd4f0 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisibilityLocationProvider.java @@ -0,0 +1,30 @@ +/* + * 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.statusbar.notification; + +import com.android.systemui.statusbar.ExpandableNotificationRow; + +/** + * An object that can determine the visibility of a Notification. + */ +public interface VisibilityLocationProvider { + + /** + * @return whether the view is in a visible location right now. + */ + boolean isInVisibleLocation(ExpandableNotificationRow row); +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java new file mode 100644 index 000000000000..eaf552cda399 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java @@ -0,0 +1,147 @@ +/* + * 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.statusbar.notification; + +import android.util.ArraySet; +import android.view.View; + +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.NotificationData; +import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; + +import java.util.ArrayList; + +/** + * A manager that ensures that notifications are visually stable. It will suppress reorderings + * and reorder at the right time when they are out of view. + */ +public class VisualStabilityManager implements OnHeadsUpChangedListener { + + private final ArrayList mCallbacks = new ArrayList<>(); + + private boolean mPanelExpanded; + private boolean mScreenOn; + private boolean mReorderingAllowed; + private VisibilityLocationProvider mVisibilityLocationProvider; + private ArraySet mAllowedReorderViews = new ArraySet<>(); + private ArraySet mAddedChildren = new ArraySet<>(); + + /** + * Add a callback to invoke when reordering is allowed again. + * @param callback + */ + public void addReorderingAllowedCallback(Callback callback) { + if (mCallbacks.contains(callback)) { + return; + } + mCallbacks.add(callback); + } + + /** + * Set the panel to be expanded. + */ + public void setPanelExpanded(boolean expanded) { + mPanelExpanded = expanded; + updateReorderingAllowed(); + } + + /** + * @param screenOn whether the screen is on + */ + public void setScreenOn(boolean screenOn) { + mScreenOn = screenOn; + updateReorderingAllowed(); + } + + private void updateReorderingAllowed() { + boolean reorderingAllowed = !mScreenOn || !mPanelExpanded; + boolean changed = reorderingAllowed && !mReorderingAllowed; + mReorderingAllowed = reorderingAllowed; + if (changed) { + notifyCallbacks(); + } + } + + private void notifyCallbacks() { + for (int i = 0; i < mCallbacks.size(); i++) { + Callback callback = mCallbacks.get(i); + callback.onReorderingAllowed(); + } + mCallbacks.clear(); + } + + /** + * @return whether reordering is currently allowed in general. + */ + public boolean isReorderingAllowed() { + return mReorderingAllowed; + } + + /** + * @return whether a specific notification is allowed to reorder. Certain notifications are + * allowed to reorder even if {@link #isReorderingAllowed()} returns false, like newly added + * notifications or heads-up notifications that are out of view. + */ + public boolean canReorderNotification(ExpandableNotificationRow row) { + if (mReorderingAllowed) { + return true; + } + if (mAddedChildren.contains(row)) { + return true; + } + if (mAllowedReorderViews.contains(row) + && !mVisibilityLocationProvider.isInVisibleLocation(row)) { + return true; + } + return false; + } + + public void setVisibilityLocationProvider( + VisibilityLocationProvider visibilityLocationProvider) { + mVisibilityLocationProvider = visibilityLocationProvider; + } + + public void onReorderingFinished() { + mAllowedReorderViews.clear(); + mAddedChildren.clear(); + } + + @Override + public void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) { + if (isHeadsUp) { + // Heads up notifications should in general be allowed to reorder if they are out of + // view and stay at the current location if they aren't. + mAllowedReorderViews.add(entry.row); + } + } + + /** + * Notify the visual stability manager that a new view was added and should be allowed to + * reorder next time. + */ + public void notifyViewAddition(View view) { + mAddedChildren.add(view); + } + + public interface Callback { + /** + * Called when reordering is allowed again. + */ + void onReorderingAllowed(); + } + +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java index 95cb672666fe..379e7a487f4f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java @@ -40,6 +40,7 @@ public class ButtonDispatcher { private int mImageResource = -1; private Drawable mImageDrawable; private View mCurrentView; + private boolean mVertical; public ButtonDispatcher(int id) { mId = id; @@ -49,13 +50,6 @@ void clear() { mViews.clear(); } - void addView(View view, boolean landscape) { - addView(view); - if (view instanceof ButtonInterface) { - ((ButtonInterface) view).setLandscape(landscape); - } - } - void addView(View view) { mViews.add(view); view.setOnClickListener(mClickListener); @@ -75,6 +69,10 @@ void addView(View view) { } else if (mImageDrawable != null) { ((ButtonInterface) view).setImageDrawable(mImageDrawable); } + + if (view instanceof ButtonInterface) { + ((ButtonInterface) view).setVertical(mVertical); + } } public int getId() { @@ -186,6 +184,17 @@ public void setCarMode(boolean carMode) { } } + public void setVertical(boolean vertical) { + mVertical = vertical; + final int N = mViews.size(); + for (int i = 0; i < N; i++) { + final View view = mViews.get(i); + if (view instanceof ButtonInterface) { + ((ButtonInterface) view).setVertical(vertical); + } + } + } + /** * Interface for button actions. */ @@ -196,7 +205,7 @@ public interface ButtonInterface { void abortCurrentGesture(); - void setLandscape(boolean landscape); + void setVertical(boolean vertical); void setCarMode(boolean carMode); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 9bb49362c560..695b500363e2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -35,6 +35,8 @@ */ public class LockIcon extends KeyguardAffordanceView { + private static final int FP_DRAW_OFF_TIMEOUT = 800; + private static final int STATE_LOCKED = 0; private static final int STATE_LOCK_OPEN = 1; private static final int STATE_FACE_UNLOCK = 2; @@ -53,6 +55,8 @@ public class LockIcon extends KeyguardAffordanceView { private boolean mHasFingerPrintIcon; private int mDensity; + private final Runnable mDrawOffTimeout = () -> update(true /* forceUpdate */); + public LockIcon(Context context, AttributeSet attrs) { super(context, attrs); mTrustDrawable = new TrustDrawable(context); @@ -116,7 +120,6 @@ public void update(boolean force) { } else { mTrustDrawable.stop(); } - // TODO: Real icon for facelock. int state = getState(); boolean anyFingerprintIcon = state == STATE_FINGERPRINT || state == STATE_FINGERPRINT_ERROR; boolean useAdditionalPadding = anyFingerprintIcon; @@ -171,6 +174,14 @@ public void update(boolean force) { animation.forceAnimationOnUI(); animation.start(); } + + if (iconRes == R.drawable.lockscreen_fingerprint_draw_off_animation) { + removeCallbacks(mDrawOffTimeout); + postDelayed(mDrawOffTimeout, FP_DRAW_OFF_TIMEOUT); + } else { + removeCallbacks(mDrawOffTimeout); + } + mLastState = state; mLastDeviceInteractive = mDeviceInteractive; mLastScreenOn = mScreenOn; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java index 06c8b685ff63..59d12eaa13ad 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java @@ -17,12 +17,14 @@ import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; -import android.content.res.Resources; import android.util.AttributeSet; import android.util.SparseArray; +import android.view.Display; +import android.view.Display.Mode; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.Space; @@ -63,12 +65,13 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi protected FrameLayout mRot0; protected FrameLayout mRot90; + private boolean isRot0Landscape; private SparseArray mButtonDispatchers; private String mCurrentLayout; - private View mLastRot0; - private View mLastRot90; + private View mLastPortrait; + private View mLastLandscape; private boolean mAlternativeOrder; @@ -76,6 +79,10 @@ public NavigationBarInflaterView(Context context, AttributeSet attrs) { super(context, attrs); mDensity = context.getResources().getConfiguration().densityDpi; createInflaters(); + Display display = ((WindowManager) + context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + Mode displayMode = display.getMode(); + isRot0Landscape = displayMode.getPhysicalWidth() > displayMode.getPhysicalHeight(); } private void createInflaters() { @@ -204,17 +211,17 @@ protected void inflateLayout(String newLayout) { String[] center = sets[1].split(BUTTON_SEPARATOR); String[] end = sets[2].split(BUTTON_SEPARATOR); // Inflate these in start to end order or accessibility traversal will be messed up. - inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.ends_group), false); - inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.ends_group), true); + inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape); + inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape); - inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group), false); - inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group), true); + inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group), isRot0Landscape); + inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group), !isRot0Landscape); addGravitySpacer((LinearLayout) mRot0.findViewById(R.id.ends_group)); addGravitySpacer((LinearLayout) mRot90.findViewById(R.id.ends_group)); - inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.ends_group), false); - inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.ends_group), true); + inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape); + inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape); } private void addGravitySpacer(LinearLayout layout) { @@ -223,7 +230,7 @@ private void addGravitySpacer(LinearLayout layout) { private void inflateButtons(String[] buttons, ViewGroup parent, boolean landscape) { for (int i = 0; i < buttons.length; i++) { - inflateButton(buttons[i], parent, landscape, i); + inflateButton(buttons[i], parent, landscape); } } @@ -236,27 +243,17 @@ private ViewGroup.LayoutParams copy(ViewGroup.LayoutParams layoutParams) { } @Nullable - protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape, - int indexInParent) { + protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape) { LayoutInflater inflater = landscape ? mLandscapeInflater : mLayoutInflater; float size = extractSize(buttonSpec); String button = extractButton(buttonSpec); View v = null; if (HOME.equals(button)) { v = inflater.inflate(R.layout.home, parent, false); - if (landscape && isSw600Dp()) { - setupLandButton(v); - } } else if (BACK.equals(button)) { v = inflater.inflate(R.layout.back, parent, false); - if (landscape && isSw600Dp()) { - setupLandButton(v); - } } else if (RECENT.equals(button)) { v = inflater.inflate(R.layout.recent_apps, parent, false); - if (landscape && isSw600Dp()) { - setupLandButton(v); - } } else if (MENU_IME.equals(button)) { v = inflater.inflate(R.layout.menu_ime, parent, false); } else if (NAVSPACE.equals(button)) { @@ -280,15 +277,15 @@ protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landsc params.width = (int) (params.width * size); } parent.addView(v); - addToDispatchers(v, landscape); - View lastView = landscape ? mLastRot90 : mLastRot0; + addToDispatchers(v); + View lastView = landscape ? mLastLandscape : mLastPortrait; if (lastView != null) { v.setAccessibilityTraversalAfter(lastView.getId()); } if (landscape) { - mLastRot90 = v; + mLastLandscape = v; } else { - mLastRot0 = v; + mLastPortrait = v; } return v; } @@ -327,37 +324,22 @@ public static String extractButton(String buttonSpec) { return buttonSpec.substring(0, buttonSpec.indexOf(SIZE_MOD_START)); } - private void addToDispatchers(View v, boolean landscape) { + private void addToDispatchers(View v) { if (mButtonDispatchers != null) { final int indexOfKey = mButtonDispatchers.indexOfKey(v.getId()); if (indexOfKey >= 0) { - mButtonDispatchers.valueAt(indexOfKey).addView(v, landscape); + mButtonDispatchers.valueAt(indexOfKey).addView(v); } else if (v instanceof ViewGroup) { final ViewGroup viewGroup = (ViewGroup)v; final int N = viewGroup.getChildCount(); for (int i = 0; i < N; i++) { - addToDispatchers(viewGroup.getChildAt(i), landscape); + addToDispatchers(viewGroup.getChildAt(i)); } } } } - private boolean isSw600Dp() { - Configuration configuration = mContext.getResources().getConfiguration(); - return (configuration.smallestScreenWidthDp >= 600); - } - /** - * This manually sets the width of sw600dp landscape buttons because despite - * overriding the configuration from the overridden resources aren't loaded currently. - */ - private void setupLandButton(View v) { - Resources res = mContext.getResources(); - v.getLayoutParams().width = res.getDimensionPixelOffset( - R.dimen.navigation_key_width_sw600dp_land); - int padding = res.getDimensionPixelOffset(R.dimen.navigation_key_padding_sw600dp_land); - v.setPadding(padding, v.getPaddingTop(), padding, v.getPaddingBottom()); - } private void clearViews() { if (mButtonDispatchers != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 0bc70b53ac52..245d4da2e43f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -565,6 +565,7 @@ public void reorient() { getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener); mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone); + mDeadZone.setDisplayRotation(mCurrentRotation); // force the low profile & disabled states into compliance mBarTransitions.init(); @@ -577,6 +578,8 @@ public void reorient() { updateTaskSwitchHelper(); setNavigationIconHints(mNavigationIconHints, true); + + getHomeButton().setVertical(mVertical); } private void updateTaskSwitchHelper() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java index 2c8339a1dc22..f25e59941b11 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -23,6 +23,7 @@ import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -35,7 +36,7 @@ /** * A class to handle notifications and their corresponding groups. */ -public class NotificationGroupManager implements HeadsUpManager.OnHeadsUpChangedListener { +public class NotificationGroupManager implements OnHeadsUpChangedListener { private final HashMap mGroupMap = new HashMap<>(); private OnGroupChangeListener mListener; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index aeb20323744f..55380277fb40 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -68,6 +68,7 @@ import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; +import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.stack.StackStateAnimator; @@ -79,7 +80,7 @@ public class NotificationPanelView extends PanelView implements ExpandableView.OnHeightChangedListener, View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener, KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener, - HeadsUpManager.OnHeadsUpChangedListener { + OnHeadsUpChangedListener { private static final boolean DEBUG = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 6de53e397d3e..94a9030c6fd7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -36,6 +36,7 @@ import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.ActivityOptions; +import android.app.admin.DevicePolicyManager; import android.app.IActivityManager; import android.app.Notification; import android.app.PendingIntent; @@ -112,6 +113,7 @@ import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.WindowManagerGlobal; +import android.view.accessibility.AccessibilityEvent; import android.view.animation.AccelerateInterpolator; import android.view.animation.Interpolator; import android.widget.ImageView; @@ -166,6 +168,7 @@ import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.SignalClusterView; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.phone.UnlockMethodCache.OnUnlockMethodChangedListener; import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.statusbar.policy.BatteryController; @@ -178,12 +181,14 @@ import com.android.systemui.statusbar.policy.FlashlightController; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.HotspotControllerImpl; +import com.android.systemui.statusbar.policy.KeyButtonView; import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; import com.android.systemui.statusbar.policy.LocationControllerImpl; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkControllerImpl; import com.android.systemui.statusbar.policy.NextAlarmController; +import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.policy.PreviewInflater; import com.android.systemui.statusbar.policy.RotationLockControllerImpl; import com.android.systemui.statusbar.policy.SecurityControllerImpl; @@ -194,7 +199,6 @@ import com.android.systemui.statusbar.stack.NotificationStackScrollLayout .OnChildLocationsChangedListener; import com.android.systemui.statusbar.stack.StackStateAnimator; -import com.android.systemui.statusbar.stack.StackViewState; import com.android.systemui.volume.VolumeComponent; import java.io.FileDescriptor; @@ -209,7 +213,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, DragDownHelper.DragDownCallback, ActivityStarter, OnUnlockMethodChangedListener, - HeadsUpManager.OnHeadsUpChangedListener { + OnHeadsUpChangedListener, VisualStabilityManager.Callback { static final String TAG = "PhoneStatusBar"; public static final boolean DEBUG = BaseStatusBar.DEBUG; public static final boolean SPEW = false; @@ -564,9 +568,6 @@ public void onChildLocationsChanged(NotificationStackScrollLayout stackScrollLay */ protected boolean mStartedGoingToSleep; - private static final int VISIBLE_LOCATIONS = StackViewState.LOCATION_FIRST_HUN - | StackViewState.LOCATION_MAIN_AREA; - private final OnChildLocationsChangedListener mNotificationLocationsChangedListener = new OnChildLocationsChangedListener() { @Override @@ -615,8 +616,7 @@ public void run() { for (int i = 0; i < N; i++) { Entry entry = activeNotifications.get(i); String key = entry.notification.getKey(); - boolean isVisible = - (mStackScroller.getChildLocation(entry.row) & VISIBLE_LOCATIONS) != 0; + boolean isVisible = mStackScroller.isInVisibleLocation(entry.row); NotificationVisibility visObj = NotificationVisibility.obtain(key, i, isVisible); boolean previouslyVisible = mCurrentlyVisibleNotifications.contains(visObj); if (isVisible) { @@ -665,6 +665,7 @@ public void onClick(View v) { private RankingMap mLatestRankingMap; private boolean mNoAnimationOnNextBarModeChange; private FalsingManager mFalsingManager; + private long mLastLockToAppLongPress; private KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -745,6 +746,7 @@ protected PhoneStatusBarView makeStatusBarView() { @Override public boolean onTouch(View v, MotionEvent event) { checkUserAutohide(v, event); + checkRemoteInputOutside(event); if (event.getAction() == MotionEvent.ACTION_DOWN) { if (mExpandedVisible) { animateCollapsePanels(); @@ -774,9 +776,11 @@ public boolean onTouch(View v, MotionEvent event) { mHeadsUpManager.addListener(this); mHeadsUpManager.addListener(mNotificationPanel); mHeadsUpManager.addListener(mGroupManager); + mHeadsUpManager.addListener(mVisualStabilityManager); mNotificationPanel.setHeadsUpManager(mHeadsUpManager); mNotificationData.setHeadsUpManager(mHeadsUpManager); mGroupManager.setHeadsUpManager(mHeadsUpManager); + mHeadsUpManager.setVisualStabilityManager(mVisualStabilityManager); if (MULTIUSER_DEBUG) { mNotificationPanelDebugText = (TextView) mNotificationPanel.findViewById( @@ -806,6 +810,7 @@ public boolean onTouch(View v, MotionEvent event) { mStackScroller.setGroupManager(mGroupManager); mStackScroller.setHeadsUpManager(mHeadsUpManager); mGroupManager.setOnGroupChangeListener(mStackScroller); + mVisualStabilityManager.setVisibilityLocationProvider(mStackScroller); inflateOverflowContainer(); inflateEmptyShadeView(); @@ -994,6 +999,7 @@ public void onInflated(View v) { filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG); context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null); IntentFilter demoFilter = new IntentFilter(); @@ -1190,8 +1196,10 @@ public void clearAllNotifications() { List children = row.getNotificationChildren(); if (row.areChildrenExpanded() && children != null) { for (ExpandableNotificationRow childRow : children) { - if (childRow.getVisibility() == View.VISIBLE) { - viewsToHide.add(childRow); + if (mStackScroller.canChildBeDismissed(childRow)) { + if (childRow.getVisibility() == View.VISIBLE) { + viewsToHide.add(childRow); + } } } } @@ -1322,29 +1330,6 @@ public void onClick(View v) { } }; - private View.OnLongClickListener mLongPressBackListener = new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - return handleLongPressBack(); - } - }; - - private View.OnLongClickListener mRecentsLongClickListener = new View.OnLongClickListener() { - - @Override - public boolean onLongClick(View v) { - if (mRecents == null || !ActivityManager.supportsMultiWindow() - || !getComponent(Divider.class).getView().getSnapAlgorithm() - .isSplitScreenFeasible()) { - return false; - } - - toggleSplitScreenMode(MetricsEvent.ACTION_WINDOW_DOCK_LONGPRESS, - MetricsEvent.ACTION_WINDOW_UNDOCK_LONGPRESS); - return true; - } - }; - @Override protected void toggleSplitScreenMode(int metricsDockAction, int metricsUndockAction) { if (mRecents == null) { @@ -1429,11 +1414,11 @@ protected void prepareNavigationBarView() { recentsButton.setOnClickListener(mRecentsClickListener); recentsButton.setOnTouchListener(mRecentsPreloadOnTouchListener); recentsButton.setLongClickable(true); - recentsButton.setOnLongClickListener(mRecentsLongClickListener); + recentsButton.setOnLongClickListener(this::handleLongPressBackRecents); ButtonDispatcher backButton = mNavigationBarView.getBackButton(); backButton.setLongClickable(true); - backButton.setOnLongClickListener(mLongPressBackListener); + backButton.setOnLongClickListener(this::handleLongPressBackRecents); ButtonDispatcher homeButton = mNavigationBarView.getHomeButton(); homeButton.setOnTouchListener(mHomeActionListener); @@ -1597,8 +1582,11 @@ public void removeNotification(String key, RankingMap ranking) { if (mHeadsUpManager.isHeadsUp(key)) { // A cancel() in repsonse to a remote input shouldn't be delayed, as it makes the // sending look longer than it takes. + // Also we should not defer the removal if reordering isn't allowed since otherwise + // some notifications can't disappear before the panel is closed. boolean ignoreEarliestRemovalTime = mRemoteInputController.isSpinning(key) - && !FORCE_REMOTE_INPUT_HISTORY; + && !FORCE_REMOTE_INPUT_HISTORY + || !mVisualStabilityManager.isReorderingAllowed(); deferRemoval = !mHeadsUpManager.removeNotification(key, ignoreEarliestRemovalTime); } if (key.equals(mMediaNotificationKey)) { @@ -1699,8 +1687,15 @@ private void handleGroupSummaryRemoved(String key, } List notificationChildren = entry.row.getNotificationChildren(); - ArrayList toRemove = new ArrayList<>(notificationChildren); - for (int i = 0; i < toRemove.size(); i++) { + ArrayList toRemove = new ArrayList<>(); + for (int i = 0; i < notificationChildren.size(); i++) { + ExpandableNotificationRow row = notificationChildren.get(i); + if ((row.getStatusBarNotification().getNotification().flags + & Notification.FLAG_FOREGROUND_SERVICE) != 0) { + // the child is a forground service notification which we can't remove! + continue; + } + toRemove.add(row); toRemove.get(i).setKeepInParent(true); // we need to set this state earlier as otherwise we might generate some weird // animations @@ -1716,12 +1711,12 @@ private void handleGroupSummaryRemoved(String key, } @Override - protected void performRemoveNotification(StatusBarNotification n, boolean removeView) { + protected void performRemoveNotification(StatusBarNotification n) { Entry entry = mNotificationData.get(n.getKey()); if (mRemoteInputController.isRemoteInputActive(entry)) { mRemoteInputController.removeRemoteInput(entry, null); } - super.performRemoveNotification(n, removeView); + super.performRemoveNotification(n); } @Override @@ -1750,6 +1745,11 @@ public void run() { final int N = activeNotifications.size(); for (int i=0; i flag clear @@ -3573,6 +3608,9 @@ else if (Intent.ACTION_SCREEN_OFF.equals(action)) { else if (Intent.ACTION_SCREEN_ON.equals(action)) { notifyNavigationBarScreenOn(true); } + else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) { + mQSPanel.showDeviceMonitoringDialog(); + } } }; @@ -4439,13 +4477,17 @@ public boolean onSpacePressed() { return false; } - private void showBouncer() { + private void showBouncerIfKeyguard() { if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) { - mWaitingForKeyguardExit = mStatusBarKeyguardViewManager.isShowing(); - mStatusBarKeyguardViewManager.dismiss(); + showBouncer(); } } + private void showBouncer() { + mWaitingForKeyguardExit = mStatusBarKeyguardViewManager.isShowing(); + mStatusBarKeyguardViewManager.dismiss(); + } + private void instantExpandNotificationsPanel() { // Make our window larger and the panel expanded. @@ -4492,6 +4534,7 @@ public void setBarState(int state) { } mState = state; mGroupManager.setStatusBarState(state); + mHeadsUpManager.setStatusBarState(state); mFalsingManager.setStatusBarState(state); mStatusBarWindowManager.setStatusBarState(state); updateReportRejectedTouchVisibility(); @@ -4542,7 +4585,7 @@ public void onPhoneHintStarted() { public void onTrackingStopped(boolean expand) { if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) { if (!expand && !mUnlockMethodCache.canSkipBouncer()) { - showBouncer(); + showBouncerIfKeyguard(); } } } @@ -4633,7 +4676,7 @@ public void goToLockedShade(View expandView) { || !mShowLockscreenNotifications || mFalsingManager.shouldEnforceBouncer(); if (isLockscreenPublicMode() && fullShadeNeedsBouncer) { mLeaveOpenOnKeyguardHide = true; - showBouncer(); + showBouncerIfKeyguard(); mDraggedDownRow = row; mPendingRemoteInputView = null; } else { @@ -4789,6 +4832,7 @@ public void onFinishedGoingToSleep() { mWakeUpComingFromTouch = false; mWakeUpTouchLocation = null; mStackScroller.setAnimationsEnabled(false); + mVisualStabilityManager.setScreenOn(false); updateVisibleToUser(); if (mLaunchCameraOnFinishedGoingToSleep) { mLaunchCameraOnFinishedGoingToSleep = false; @@ -4807,6 +4851,7 @@ public void run() { public void onStartedWakingUp() { mDeviceInteractive = true; mStackScroller.setAnimationsEnabled(true); + mVisualStabilityManager.setScreenOn(true); mNotificationPanel.setTouchDisabled(false); updateVisibleToUser(); } @@ -4832,16 +4877,59 @@ public void onScreenTurnedOn() { } /** - * Handles long press for back button. This exits screen pinning. + * This handles long-press of both back and recents. They are + * handled together to capture them both being long-pressed + * at the same time to exit screen pinning (lock task). + * + * When accessibility mode is on, only a long-press from recents + * is required to exit. + * + * In all other circumstances we try to pass through long-press events + * for Back, so that apps can still use it. Which can be from two things. + * 1) Not currently in screen pinning (lock task). + * 2) Back is long-pressed without recents. */ - private boolean handleLongPressBack() { + private boolean handleLongPressBackRecents(View v) { try { + boolean sendBackLongPress = false; IActivityManager activityManager = ActivityManagerNative.getDefault(); - if (activityManager.isInLockTaskMode()) { - activityManager.stopSystemLockTaskMode(); - - // When exiting refresh disabled flags. - mNavigationBarView.setDisabledFlags(mDisabled1, true); + boolean touchExplorationEnabled = mAccessibilityManager.isTouchExplorationEnabled(); + boolean inLockTaskMode = activityManager.isInLockTaskMode(); + if (inLockTaskMode && !touchExplorationEnabled) { + long time = System.currentTimeMillis(); + // If we recently long-pressed the other button then they were + // long-pressed 'together' + if ((time - mLastLockToAppLongPress) < LOCK_TO_APP_GESTURE_TOLERENCE) { + activityManager.stopLockTaskMode(); + // When exiting refresh disabled flags. + mNavigationBarView.setDisabledFlags(mDisabled1, true); + return true; + } else if ((v.getId() == R.id.back) + && !mNavigationBarView.getRecentsButton().getCurrentView().isPressed()) { + // If we aren't pressing recents right now then they presses + // won't be together, so send the standard long-press action. + sendBackLongPress = true; + } + mLastLockToAppLongPress = time; + } else { + // If this is back still need to handle sending the long-press event. + if (v.getId() == R.id.back) { + sendBackLongPress = true; + } else if (touchExplorationEnabled && inLockTaskMode) { + // When in accessibility mode a long press that is recents (not back) + // should stop lock task. + activityManager.stopLockTaskMode(); + // When exiting refresh disabled flags. + mNavigationBarView.setDisabledFlags(mDisabled1, true); + return true; + } else if (v.getId() == R.id.recent_apps) { + return handleLongPressRecents(); + } + } + if (sendBackLongPress) { + KeyButtonView keyButtonView = (KeyButtonView) v; + keyButtonView.sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.FLAG_LONG_PRESS); + keyButtonView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED); return true; } } catch (RemoteException e) { @@ -4850,6 +4938,18 @@ private boolean handleLongPressBack() { return false; } + private boolean handleLongPressRecents() { + if (mRecents == null || !ActivityManager.supportsMultiWindow() + || !getComponent(Divider.class).getView().getSnapAlgorithm() + .isSplitScreenFeasible()) { + return false; + } + + toggleSplitScreenMode(MetricsEvent.ACTION_WINDOW_DOCK_LONGPRESS, + MetricsEvent.ACTION_WINDOW_UNDOCK_LONGPRESS); + return true; + } + @Override public void showScreenPinningRequest(int taskId) { if (mKeyguardMonitor.isShowing()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java index d0717a46d7a0..6869443099cf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java @@ -25,6 +25,7 @@ import android.graphics.drawable.RippleDrawable; import android.os.UserManager; import android.util.AttributeSet; +import android.util.SparseBooleanArray; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -43,6 +44,10 @@ import com.android.systemui.qs.TouchAnimator; import com.android.systemui.qs.TouchAnimator.Builder; import com.android.systemui.statusbar.policy.BatteryController; +import com.android.systemui.statusbar.policy.NetworkController; +import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener; +import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback; import com.android.systemui.statusbar.policy.UserInfoController; @@ -50,7 +55,8 @@ import com.android.systemui.tuner.TunerService; public class QuickStatusBarHeader extends BaseStatusBarHeader implements - NextAlarmChangeCallback, OnClickListener, OnUserInfoChangedListener { + NextAlarmChangeCallback, OnClickListener, OnUserInfoChangedListener, EmergencyListener, + SignalCallback { private static final String TAG = "QuickStatusBarHeader"; @@ -91,6 +97,8 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements private View mEdit; private boolean mShowFullAlarm; private float mDateTimeTranslation; + private SparseBooleanArray mRoamingsBySubId = new SparseBooleanArray(); + private boolean mIsRoaming; public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); @@ -265,7 +273,7 @@ public void updateEverything() { protected void updateVisibilities() { updateAlarmVisibilities(); updateDateTimePosition(); - mEmergencyOnly.setVisibility(mExpanded && mShowEmergencyCallsOnly + mEmergencyOnly.setVisibility(mExpanded && (mShowEmergencyCallsOnly || mIsRoaming) ? View.VISIBLE : View.INVISIBLE); mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(View.INVISIBLE); final boolean isDemo = UserManager.isDeviceInDemoMode(mContext); @@ -275,15 +283,21 @@ protected void updateVisibilities() { } private void updateDateTimePosition() { - mDateTimeAlarmGroup.setTranslationY(mShowEmergencyCallsOnly + mDateTimeAlarmGroup.setTranslationY(mShowEmergencyCallsOnly || mIsRoaming ? mExpansionAmount * mDateTimeTranslation : 0); } private void updateListeners() { if (mListening) { mNextAlarmController.addStateChangedCallback(this); + if (mHost.getNetworkController().hasVoiceCallingFeature()) { + mHost.getNetworkController().addEmergencyListener(this); + mHost.getNetworkController().addSignalCallback(this); + } } else { mNextAlarmController.removeStateChangedCallback(this); + mHost.getNetworkController().removeEmergencyListener(this); + mHost.getNetworkController().removeSignalCallback(this); } } @@ -382,6 +396,29 @@ public void setEmergencyCallsOnly(boolean show) { } } + @Override + public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, + int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, + String description, boolean isWide, int subId, boolean roaming) { + mRoamingsBySubId.put(subId, roaming); + boolean isRoaming = calculateRoaming(); + if (mIsRoaming != isRoaming) { + mIsRoaming = isRoaming; + mEmergencyOnly.setText(mIsRoaming ? R.string.accessibility_data_connection_roaming + : com.android.internal.R.string.emergency_calls_only); + if (mExpanded) { + updateEverything(); + } + } + } + + private boolean calculateRoaming() { + for (int i = 0; i < mRoamingsBySubId.size(); i++) { + if (mRoamingsBySubId.valueAt(i)) return true; + } + return false; + } + @Override public void onUserInfoChanged(String name, Drawable picture) { mMultiUserAvatar.setImageDrawable(picture); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 35e084db9cd7..9f2d446275d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -35,7 +35,7 @@ import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.ScrimView; -import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.stack.StackStateAnimator; /** @@ -43,7 +43,7 @@ * security method gets shown). */ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, - HeadsUpManager.OnHeadsUpChangedListener { + OnHeadsUpChangedListener { public static final long ANIMATION_DURATION = 220; public static final Interpolator KEYGUARD_FADE_OUT_INTERPOLATOR = new PathInterpolator(0f, 0, 0.7f, 1f); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index 3142ddfe9fb7..616d21055202 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -125,14 +125,14 @@ public void run() { public void setMobileDataIndicators(final IconState statusIcon, final IconState qsIcon, final int statusType, final int qsType,final boolean activityIn, final boolean activityOut, final String typeContentDescription, - final String description, final boolean isWide, final int subId) { + final String description, final boolean isWide, final int subId, boolean roaming) { post(new Runnable() { @Override public void run() { for (SignalCallback signalCluster : mSignalCallbacks) { signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType, activityIn, activityOut, typeContentDescription, description, isWide, - subId); + subId, roaming); } } }); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java index 1cad61fb6728..4c879c68f2ff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java @@ -24,6 +24,7 @@ import android.util.AttributeSet; import android.util.Slog; import android.view.MotionEvent; +import android.view.Surface; import android.view.View; import com.android.systemui.R; @@ -54,6 +55,7 @@ public class DeadZone extends View { private int mHold, mDecay; private boolean mVertical; private long mLastPokeTime; + private int mDisplayRotation; private final Runnable mDebugFlash = new Runnable() { @Override @@ -132,7 +134,16 @@ public boolean onTouchEvent(MotionEvent event) { int size = (int) getSize(event.getEventTime()); // In the vertical orientation consume taps along the left edge. // In horizontal orientation consume taps along the top edge. - final boolean consumeEvent = mVertical ? event.getX() < size : event.getY() < size; + final boolean consumeEvent; + if (mVertical) { + if (mDisplayRotation == Surface.ROTATION_270) { + consumeEvent = event.getX() > getWidth() - size; + } else { + consumeEvent = event.getX() < size; + } + } else { + consumeEvent = event.getY() < size; + } if (consumeEvent) { if (CHATTY) { Slog.v(TAG, "consuming errant click: (" + event.getX() + "," + event.getY() + ")"); @@ -170,7 +181,16 @@ public void onDraw(Canvas can) { } final int size = (int) getSize(SystemClock.uptimeMillis()); - can.clipRect(0, 0, mVertical ? size : can.getWidth(), mVertical ? can.getHeight() : size); + if (mVertical) { + if (mDisplayRotation == Surface.ROTATION_270) { + can.clipRect(can.getWidth() - size, 0, can.getWidth(), can.getHeight()); + } else { + can.clipRect(0, 0, size, can.getHeight()); + } + } else { + can.clipRect(0, 0, can.getWidth(), size); + } + final float frac = DEBUG ? (mFlashFrac - 0.5f) + 0.5f : mFlashFrac; can.drawARGB((int) (frac * 0xFF), 0xDD, 0xEE, 0xAA); @@ -178,4 +198,8 @@ public void onDraw(Canvas can) { // crazy aggressive redrawing here, for debugging only postInvalidateDelayed(100); } + + public void setDisplayRotation(int rotation) { + mDisplayRotation = rotation; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/EmergencyCryptkeeperText.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/EmergencyCryptkeeperText.java index 8abfb89b3f69..a2d1baf96da8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/EmergencyCryptkeeperText.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/EmergencyCryptkeeperText.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.policy; import android.annotation.Nullable; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -41,12 +42,20 @@ public class EmergencyCryptkeeperText extends TextView { private KeyguardUpdateMonitor mKeyguardUpdateMonitor; - private KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() { + private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() { @Override public void onPhoneStateChanged(int phoneState) { update(); } }; + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) { + update(); + } + } + }; public EmergencyCryptkeeperText(Context context, @Nullable AttributeSet attrs) { super(context, attrs); @@ -58,6 +67,8 @@ protected void onAttachedToWindow() { super.onAttachedToWindow(); mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext); mKeyguardUpdateMonitor.registerCallback(mCallback); + getContext().registerReceiver(mReceiver, + new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); update(); } @@ -67,6 +78,7 @@ protected void onDetachedFromWindow() { if (mKeyguardUpdateMonitor != null) { mKeyguardUpdateMonitor.removeCallback(mCallback); } + getContext().unregisterReceiver(mReceiver); } public void update() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java index f6c0942d7ed0..edca70443c5e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java @@ -23,6 +23,7 @@ import android.os.SystemClock; import android.provider.Settings; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.util.Pools; import android.view.View; @@ -33,6 +34,8 @@ import com.android.systemui.R; import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.NotificationData; +import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.PhoneStatusBar; @@ -48,7 +51,8 @@ * A manager which handles heads up notifications which is a special mode where * they simply peek from the top of the screen. */ -public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsListener { +public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsListener, + VisualStabilityManager.Callback { private static final String TAG = "HeadsUpManager"; private static final boolean DEBUG = false; private static final String SETTING_HEADS_UP_SNOOZE_LENGTH_MS = "heads_up_snooze_length_ms"; @@ -96,6 +100,8 @@ public boolean release(HeadsUpEntry instance) { private boolean mReleaseOnExpandFinish; private boolean mTrackingHeadsUp; private HashSet mEntriesToRemoveAfterExpand = new HashSet<>(); + private ArraySet mEntriesToRemoveWhenReorderingAllowed + = new ArraySet<>(); private boolean mIsExpanded; private boolean mHasPinnedNotification; private int[] mTmpTwoArray = new int[2]; @@ -103,6 +109,8 @@ public boolean release(HeadsUpEntry instance) { private boolean mWaitingOnCollapseWhenGoingAway; private boolean mIsObserving; private boolean mRemoteInputActive; + private VisualStabilityManager mVisualStabilityManager; + private int mStatusBarState; public HeadsUpManager(final Context context, View statusBarWindowView, NotificationGroupManager groupManager) { @@ -210,7 +218,8 @@ private void addHeadsUpEntry(NotificationData.Entry entry) { } private boolean shouldHeadsUpBecomePinned(NotificationData.Entry entry) { - return !mIsExpanded || hasFullScreenIntent(entry); + return mStatusBarState != StatusBarState.KEYGUARD + && !mIsExpanded || hasFullScreenIntent(entry); } private boolean hasFullScreenIntent(NotificationData.Entry entry) { @@ -602,6 +611,25 @@ public void setExpanded(NotificationData.Entry entry, boolean expanded) { } } + @Override + public void onReorderingAllowed() { + for (NotificationData.Entry entry : mEntriesToRemoveWhenReorderingAllowed) { + if (isHeadsUp(entry.key)) { + // Maybe the heads-up was removed already + removeHeadsUpEntry(entry); + } + } + mEntriesToRemoveWhenReorderingAllowed.clear(); + } + + public void setVisualStabilityManager(VisualStabilityManager visualStabilityManager) { + mVisualStabilityManager = visualStabilityManager; + } + + public void setStatusBarState(int statusBarState) { + mStatusBarState = statusBarState; + } + /** * This represents a notification and how long it is in a heads up mode. It also manages its * lifecycle automatically when created. @@ -622,7 +650,10 @@ public void setEntry(final NotificationData.Entry entry) { mRemoveHeadsUpRunnable = new Runnable() { @Override public void run() { - if (!mTrackingHeadsUp) { + if (!mVisualStabilityManager.isReorderingAllowed()) { + mEntriesToRemoveWhenReorderingAllowed.add(entry); + mVisualStabilityManager.addReorderingAllowedCallback(HeadsUpManager.this); + } else if (!mTrackingHeadsUp) { removeHeadsUpEntry(entry); } else { mEntriesToRemoveAfterExpand.add(entry); @@ -646,6 +677,9 @@ public void updateEntry(boolean updatePostTime) { if (mEntriesToRemoveAfterExpand.contains(entry)) { mEntriesToRemoveAfterExpand.remove(entry); } + if (mEntriesToRemoveWhenReorderingAllowed.contains(entry)) { + mEntriesToRemoveWhenReorderingAllowed.remove(entry); + } if (!isSticky()) { long finishTime = postTime + mHeadsUpNotificationDecay; long removeDelay = Math.max(finishTime - currentTime, mMinimumDisplayTime); @@ -715,30 +749,4 @@ public long currentTimeMillis() { } } - public interface OnHeadsUpChangedListener { - /** - * The state whether there exist pinned heads-ups or not changed. - * - * @param inPinnedMode whether there are any pinned heads-ups - */ - void onHeadsUpPinnedModeChanged(boolean inPinnedMode); - - /** - * A notification was just pinned to the top. - */ - void onHeadsUpPinned(ExpandableNotificationRow headsUp); - - /** - * A notification was just unpinned from the top. - */ - void onHeadsUpUnPinned(ExpandableNotificationRow headsUp); - - /** - * A notification just became a heads up or turned back to its normal state. - * - * @param entry the entry of the changed notification - * @param isHeadsUp whether the notification is now a headsUp notification - */ - void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp); - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index e6066aaa4c31..b8018bda76de 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -275,7 +275,7 @@ public void setImageDrawable(@Nullable Drawable drawable) { } @Override - public void setLandscape(boolean landscape) { + public void setVertical(boolean vertical) { //no op } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 098bdd70d8fc..cfea4cb3d134 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -227,10 +227,8 @@ public void notifyListeners(SignalCallback callback) { final boolean dataDisabled = mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED && mCurrentState.userSetup; - // Show icon in QS when we are connected or need to show roaming or data is disabled. - boolean showDataIcon = mCurrentState.dataConnected - || mCurrentState.iconGroup == TelephonyIcons.ROAMING - || dataDisabled; + // Show icon in QS when we are connected or data is disabled. + boolean showDataIcon = mCurrentState.dataConnected || dataDisabled; IconState statusIcon = new IconState(mCurrentState.enabled && !mCurrentState.airplaneMode, getCurrentIconId(), contentDescription); @@ -250,13 +248,11 @@ public void notifyListeners(SignalCallback callback) { boolean activityOut = mCurrentState.dataConnected && !mCurrentState.carrierNetworkChangeMode && mCurrentState.activityOut; - showDataIcon &= mCurrentState.isDefault - || mCurrentState.iconGroup == TelephonyIcons.ROAMING - || dataDisabled; + showDataIcon &= mCurrentState.isDefault || dataDisabled; int typeIcon = showDataIcon ? icons.mDataType : 0; callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon, activityIn, activityOut, dataContentDescription, description, icons.mIsWide, - mSubscriptionInfo.getSubscriptionId()); + mSubscriptionInfo.getSubscriptionId(), mCurrentState.roaming); } @Override @@ -413,10 +409,9 @@ private final void updateTelephony() { mCurrentState.dataConnected = mCurrentState.connected && mDataState == TelephonyManager.DATA_CONNECTED; + mCurrentState.roaming = isRoaming(); if (isCarrierNetworkChangeActive()) { mCurrentState.iconGroup = TelephonyIcons.CARRIER_NETWORK_CHANGE; - } else if (isRoaming()) { - mCurrentState.iconGroup = TelephonyIcons.ROAMING; } else if (isDataDisabled()) { mCurrentState.iconGroup = TelephonyIcons.DATA_DISABLED; } @@ -549,6 +544,7 @@ static class MobileState extends SignalController.State { boolean carrierNetworkChangeMode; boolean isDefault; boolean userSetup; + boolean roaming; @Override public void copyFrom(State s) { @@ -563,6 +559,7 @@ public void copyFrom(State s) { airplaneMode = state.airplaneMode; carrierNetworkChangeMode = state.carrierNetworkChangeMode; userSetup = state.userSetup; + roaming = state.roaming; } @Override @@ -573,6 +570,7 @@ protected void toString(StringBuilder builder) { builder.append("networkName=").append(networkName).append(','); builder.append("networkNameData=").append(networkNameData).append(','); builder.append("dataConnected=").append(dataConnected).append(','); + builder.append("roaming=").append(roaming).append(','); builder.append("isDefault=").append(isDefault).append(','); builder.append("isEmergency=").append(isEmergency).append(','); builder.append("airplaneMode=").append(airplaneMode).append(','); @@ -592,7 +590,8 @@ public boolean equals(Object o) { && ((MobileState) o).airplaneMode == airplaneMode && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode && ((MobileState) o).userSetup == userSetup - && ((MobileState) o).isDefault == isDefault; + && ((MobileState) o).isDefault == isDefault + && ((MobileState) o).roaming == roaming; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 5f1b8719c9b0..ad5f24b8f362 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -46,7 +46,7 @@ default void setWifiIndicators(boolean enabled, IconState statusIcon, IconState default void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId) {} + String description, boolean isWide, int subId, boolean roaming) {} default void setSubs(List subs) {} default void setNoSims(boolean show) {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index ee26f18af14a..4d7d85bf8f39 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -787,9 +787,11 @@ public void dispatchDemoCommand(String command, Bundle args) { datatype.equals("h") ? TelephonyIcons.H : datatype.equals("lte") ? TelephonyIcons.LTE : datatype.equals("lte+") ? TelephonyIcons.LTE_PLUS : - datatype.equals("roam") ? TelephonyIcons.ROAMING : TelephonyIcons.UNKNOWN; } + if (args.containsKey("roam")) { + controller.getState().roaming = "show".equals(args.getString("roam")); + } int[][] icons = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH; String level = args.getString("level"); if (level != null) { @@ -797,6 +799,10 @@ public void dispatchDemoCommand(String command, Bundle args) { : Math.min(Integer.parseInt(level), icons[0].length - 1); controller.getState().connected = controller.getState().level >= 0; } + String activity = args.getString("activity"); + if (activity != null) { + controller.setActivity(Integer.parseInt(activity)); + } controller.getState().enabled = show; controller.notifyListeners(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java new file mode 100644 index 000000000000..5444f06df9b5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java @@ -0,0 +1,50 @@ +/* + * 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.statusbar.policy; + +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.NotificationData; + +/** + * A listener to heads up changes + */ +public interface OnHeadsUpChangedListener { + /** + * The state whether there exist pinned heads-ups or not changed. + * + * @param inPinnedMode whether there are any pinned heads-ups + */ + default void onHeadsUpPinnedModeChanged(boolean inPinnedMode) {} + + /** + * A notification was just pinned to the top. + */ + default void onHeadsUpPinned(ExpandableNotificationRow headsUp) {} + + /** + * A notification was just unpinned from the top. + */ + default void onHeadsUpUnPinned(ExpandableNotificationRow headsUp) {} + + /** + * A notification just became a heads up or turned back to its normal state. + * + * @param entry the entry of the changed notification + * @param isHeadsUp whether the notification is now a headsUp notification + */ + default void onHeadsUpStateChanged(NotificationData.Entry entry, boolean isHeadsUp) {} +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java index 014afae7bf5a..63d4381e4aaa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java @@ -21,6 +21,7 @@ public interface SecurityController { boolean hasProfileOwner(); String getDeviceOwnerName(); String getProfileOwnerName(); + boolean isNetworkLoggingEnabled(); boolean isVpnEnabled(); boolean isVpnRestricted(); /** Whether the VPN app should use branded VPN iconography. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java index 07d3b596bc05..65a119ac0f1c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java @@ -153,6 +153,11 @@ public String getProfileVpnName() { return null; } + @Override + public boolean isNetworkLoggingEnabled() { + return mDevicePolicyManager.isNetworkLoggingEnabled(null); + } + @Override public boolean isVpnEnabled() { for (int profileId : mUserManager.getProfileIdsWithDisabled(mVpnUserId)) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java deleted file mode 100644 index dce889f831da..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.systemui.statusbar.policy; - -import android.telephony.SubscriptionInfo; - -import com.android.systemui.statusbar.policy.NetworkController.IconState; -import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; - -import java.util.List; - - -/** - * Provides empty implementations of SignalCallback for those that only want some of - * the callbacks. - */ -public class SignalCallbackAdapter implements SignalCallback { - - @Override - public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description) { - } - - @Override - public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId) { - } - - @Override - public void setSubs(List subs) { - } - - @Override - public void setNoSims(boolean show) { - } - - @Override - public void setEthernetIndicators(IconState icon) { - } - - @Override - public void setIsAirplaneMode(IconState icon) { - } - - @Override - public void setMobileDataEnabled(boolean enabled) { - } - -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java index ed8c7ff96aac..6b2361e64da0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -95,8 +95,6 @@ class TelephonyIcons { R.drawable.ic_qs_signal_carrier_network_change_animation } }; - static final int QS_DATA_R = R.drawable.ic_qs_signal_r; - //***** Data connection icons //GSM/UMTS @@ -211,7 +209,7 @@ class TelephonyIcons { static final int QS_DATA_LTE_PLUS = R.drawable.ic_qs_signal_lte_plus; static final int FLIGHT_MODE_ICON = R.drawable.stat_sys_airplane_mode; - static final int ROAMING_ICON = R.drawable.stat_sys_data_fully_connected_roam; + static final int ROAMING_ICON = R.drawable.stat_sys_roaming; static final int ICON_LTE = R.drawable.stat_sys_data_fully_connected_lte; static final int ICON_LTE_PLUS = R.drawable.stat_sys_data_fully_connected_lte_plus; static final int ICON_G = R.drawable.stat_sys_data_fully_connected_g; @@ -410,21 +408,6 @@ class TelephonyIcons { TelephonyIcons.QS_DATA_LTE_PLUS ); - static final MobileIconGroup ROAMING = new MobileIconGroup( - "Roaming", - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, - AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, - 0, 0, - TelephonyIcons.TELEPHONY_NO_NETWORK, - TelephonyIcons.QS_TELEPHONY_NO_NETWORK, - AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], - R.string.accessibility_data_connection_roaming, - TelephonyIcons.ROAMING_ICON, - false, - TelephonyIcons.QS_DATA_R - ); - static final MobileIconGroup DATA_DISABLED = new MobileIconGroup( "DataDisabled", TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 27ba003c6ef1..85888a3b2082 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -47,6 +47,7 @@ import android.widget.BaseAdapter; import com.android.internal.logging.MetricsProto.MetricsEvent; +import com.android.internal.messages.SystemMessageProto.SystemMessage; import com.android.internal.util.UserIcons; import com.android.settingslib.RestrictedLockUtils; import com.android.systemui.GuestResumeSessionReceiver; @@ -79,8 +80,6 @@ public class UserSwitcherController { private static final String ACTION_LOGOUT_USER = "com.android.systemui.LOGOUT_USER"; private static final int PAUSE_REFRESH_USERS_TIMEOUT_MS = 3000; - private static final int ID_REMOVE_GUEST = 1010; - private static final int ID_LOGOUT_USER = 1011; private static final String TAG_REMOVE_GUEST = "remove_guest"; private static final String TAG_LOGOUT_USER = "logout_user"; @@ -553,8 +552,8 @@ private void showLogoutNotification(int userId) { mContext.getString(R.string.user_logout_notification_action), logoutPI); SystemUI.overrideNotificationAppName(mContext, builder); - NotificationManager.from(mContext).notifyAsUser(TAG_LOGOUT_USER, ID_LOGOUT_USER, - builder.build(), new UserHandle(userId)); + NotificationManager.from(mContext).notifyAsUser(TAG_LOGOUT_USER, + SystemMessage.NOTE_LOGOUT_USER, builder.build(), new UserHandle(userId)); } }; @@ -576,8 +575,8 @@ private void showGuestNotification(int guestUserId) { mContext.getString(R.string.guest_notification_remove_action), removeGuestPI); SystemUI.overrideNotificationAppName(mContext, builder); - NotificationManager.from(mContext).notifyAsUser(TAG_REMOVE_GUEST, ID_REMOVE_GUEST, - builder.build(), new UserHandle(guestUserId)); + NotificationManager.from(mContext).notifyAsUser(TAG_REMOVE_GUEST, + SystemMessage.NOTE_REMOVE_GUEST, builder.build(), new UserHandle(guestUserId)); } private final Runnable mUnpauseRefreshUsers = new Runnable() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java index d7920a9b1e7b..24aae3852d9b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java @@ -38,6 +38,7 @@ import com.android.systemui.statusbar.notification.HybridNotificationView; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.NotificationViewWrapper; +import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.phone.NotificationPanelView; import java.util.ArrayList; @@ -315,9 +316,13 @@ public List getNotificationChildren() { * Apply the order given in the list to the children. * * @param childOrder the new list order + * @param visualStabilityManager + * @param callback * @return whether the list order has changed */ - public boolean applyChildOrder(List childOrder) { + public boolean applyChildOrder(List childOrder, + VisualStabilityManager visualStabilityManager, + VisualStabilityManager.Callback callback) { if (childOrder == null) { return false; } @@ -326,9 +331,13 @@ public boolean applyChildOrder(List childOrder) { ExpandableNotificationRow child = mChildren.get(i); ExpandableNotificationRow desiredChild = childOrder.get(i); if (child != desiredChild) { - mChildren.remove(desiredChild); - mChildren.add(i, desiredChild); - result = true; + if (visualStabilityManager.canReorderNotification(desiredChild)) { + mChildren.remove(desiredChild); + mChildren.add(i, desiredChild); + result = true; + } else { + visualStabilityManager.addReorderingAllowedCallback(callback); + } } } updateExpansionStates(); @@ -484,6 +493,7 @@ public void getState(StackScrollState resultState, StackViewState parentState) { } childState.location = parentState.location; yPosition += intrinsicHeight; + } if (mOverflowNumber != null) { ExpandableNotificationRow overflowView = mChildren.get(Math.min( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 5cf0e0a1e10e..84a9715cd45b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -75,6 +75,7 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.FakeShadowView; import com.android.systemui.statusbar.notification.NotificationUtils; +import com.android.systemui.statusbar.notification.VisibilityLocationProvider; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.PhoneStatusBar; import com.android.systemui.statusbar.phone.ScrimController; @@ -92,7 +93,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements SwipeHelper.Callback, ExpandHelper.Callback, ScrollAdapter, ExpandableView.OnHeightChangedListener, NotificationGroupManager.OnGroupChangeListener, - SettingsIconRowListener, ScrollContainer { + SettingsIconRowListener, ScrollContainer, VisibilityLocationProvider { public static final float BACKGROUND_ALPHA_DIMMED = 0.7f; private static final String TAG = "StackScroller"; @@ -550,21 +551,19 @@ public void setChildLocationsChangedListener(OnChildLocationsChangedListener lis mListener = listener; } - /** - * Returns the location the given child is currently rendered at. - * - * @param child the child to get the location for - * @return one of {@link StackViewState}'s LOCATION_* constants - */ - public int getChildLocation(View child) { - StackViewState childViewState = mCurrentStackScrollState.getViewStateForView(child); + @Override + public boolean isInVisibleLocation(ExpandableNotificationRow row) { + StackViewState childViewState = mCurrentStackScrollState.getViewStateForView(row); if (childViewState == null) { - return StackViewState.LOCATION_UNKNOWN; + return false; } - if (childViewState.gone) { - return StackViewState.LOCATION_GONE; + if ((childViewState.location &= StackViewState.VISIBLE_LOCATIONS) == 0) { + return false; } - return childViewState.location; + if (row.getVisibility() != View.VISIBLE) { + return false; + } + return true; } private void setMaxLayoutHeight(int maxLayoutHeight) { @@ -1037,6 +1036,19 @@ public boolean canChildBeExpanded(View v) { public void setUserExpandedChild(View v, boolean userExpanded) { if (v instanceof ExpandableNotificationRow) { ExpandableNotificationRow row = (ExpandableNotificationRow) v; + if (userExpanded && onKeyguard()) { + // Due to a race when locking the screen while touching, a notification may be + // expanded even after we went back to keyguard. An example of this happens if + // you click in the empty space while expanding a group. + + // We also need to un-user lock it here, since otherwise the content height + // calculated might be wrong. We also can't invert the two calls since + // un-userlocking it will trigger a layout switch in the content view. + row.setUserLocked(false); + updateContentHeight(); + notifyHeightChangeListener(row); + return; + } row.setUserExpanded(userExpanded, true /* allowChildrenExpansion */); row.onExpandedByGesture(userExpanded); } @@ -4595,5 +4607,4 @@ static long combineLength(ArrayList events) { return length; } } - } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java index ecdee4eaecba..f22a4107e205 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackViewState.java @@ -31,6 +31,10 @@ public class StackViewState extends ViewState { public static final int LOCATION_BOTTOM_STACK_HIDDEN = 0x10; /** The view isn't layouted at all. */ public static final int LOCATION_GONE = 0x40; + /** + * The visible locations of a view. + */ + public static final int VISIBLE_LOCATIONS = LOCATION_FIRST_HUN | LOCATION_MAIN_AREA; public int height; public boolean dimmed; diff --git a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java index 97d5e1078312..25e9bb0cce3d 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java +++ b/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java @@ -41,6 +41,7 @@ import android.util.SparseArray; import com.android.internal.R; +import com.android.internal.messages.SystemMessageProto.SystemMessage; import com.android.systemui.SystemUI; import java.util.List; @@ -48,11 +49,6 @@ public class StorageNotification extends SystemUI { private static final String TAG = "StorageNotification"; - private static final int PUBLIC_ID = 0x53505542; // SPUB - private static final int PRIVATE_ID = 0x53505256; // SPRV - private static final int DISK_ID = 0x5344534b; // SDSK - private static final int MOVE_ID = 0x534d4f56; // SMOV - private static final String ACTION_SNOOZE_VOLUME = "com.android.systemui.action.SNOOZE_VOLUME"; private static final String ACTION_FINISH_WIZARD = "com.android.systemui.action.FINISH_WIZARD"; @@ -91,7 +87,8 @@ public void onVolumeRecordChanged(VolumeRecord rec) { @Override public void onVolumeForgotten(String fsUuid) { // Stop annoying the user - mNotificationManager.cancelAsUser(fsUuid, PRIVATE_ID, UserHandle.ALL); + mNotificationManager.cancelAsUser(fsUuid, SystemMessage.NOTE_STORAGE_PRIVATE, + UserHandle.ALL); } @Override @@ -119,7 +116,8 @@ public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) { // When finishing the adoption wizard, clean up any notifications // for moving primary storage - mNotificationManager.cancelAsUser(null, MOVE_ID, UserHandle.ALL); + mNotificationManager.cancelAsUser(null, SystemMessage.NOTE_STORAGE_MOVE, + UserHandle.ALL); } }; @@ -190,7 +188,8 @@ private void updateMissingPrivateVolumes() { final VolumeInfo info = mStorageManager.findVolumeByUuid(fsUuid); if ((info != null && info.isMountedWritable()) || rec.isSnoozed()) { // Yay, private volume is here, or user snoozed - mNotificationManager.cancelAsUser(fsUuid, PRIVATE_ID, UserHandle.ALL); + mNotificationManager.cancelAsUser(fsUuid, SystemMessage.NOTE_STORAGE_PRIVATE, + UserHandle.ALL); } else { // Boo, annoy the user to reinsert the private volume @@ -211,8 +210,8 @@ private void updateMissingPrivateVolumes() { .setDeleteIntent(buildSnoozeIntent(fsUuid)); SystemUI.overrideNotificationAppName(mContext, builder); - mNotificationManager.notifyAsUser(fsUuid, PRIVATE_ID, builder - .build(), UserHandle.ALL); + mNotificationManager.notifyAsUser(fsUuid, SystemMessage.NOTE_STORAGE_PRIVATE, + builder.build(), UserHandle.ALL); } } } @@ -237,12 +236,13 @@ private void onDiskScannedInternal(DiskInfo disk, int volumeCount) { .setCategory(Notification.CATEGORY_ERROR); SystemUI.overrideNotificationAppName(mContext, builder); - mNotificationManager.notifyAsUser(disk.getId(), DISK_ID, builder.build(), - UserHandle.ALL); + mNotificationManager.notifyAsUser(disk.getId(), SystemMessage.NOTE_STORAGE_DISK, + builder.build(), UserHandle.ALL); } else { // Yay, we have volumes! - mNotificationManager.cancelAsUser(disk.getId(), DISK_ID, UserHandle.ALL); + mNotificationManager.cancelAsUser(disk.getId(), SystemMessage.NOTE_STORAGE_DISK, + UserHandle.ALL); } } @@ -252,7 +252,8 @@ private void onDiskScannedInternal(DiskInfo disk, int volumeCount) { * @param disk The disk that went away. */ private void onDiskDestroyedInternal(@NonNull DiskInfo disk) { - mNotificationManager.cancelAsUser(disk.getId(), DISK_ID, UserHandle.ALL); + mNotificationManager.cancelAsUser(disk.getId(), SystemMessage.NOTE_STORAGE_DISK, + UserHandle.ALL); } private void onVolumeStateChangedInternal(VolumeInfo vol) { @@ -308,9 +309,11 @@ private void onPublicVolumeStateChangedInternal(VolumeInfo vol) { } if (notif != null) { - mNotificationManager.notifyAsUser(vol.getId(), PUBLIC_ID, notif, UserHandle.ALL); + mNotificationManager.notifyAsUser(vol.getId(), SystemMessage.NOTE_STORAGE_PUBLIC, + notif, UserHandle.ALL); } else { - mNotificationManager.cancelAsUser(vol.getId(), PUBLIC_ID, UserHandle.ALL); + mNotificationManager.cancelAsUser(vol.getId(), SystemMessage.NOTE_STORAGE_PUBLIC, + UserHandle.ALL); } } @@ -488,7 +491,7 @@ private void onMoveProgress(MoveInfo move, int status, long estMillis) { .setOngoing(true); SystemUI.overrideNotificationAppName(mContext, builder); - mNotificationManager.notifyAsUser(move.packageName, MOVE_ID, + mNotificationManager.notifyAsUser(move.packageName, SystemMessage.NOTE_STORAGE_MOVE, builder.build(), UserHandle.ALL); } @@ -496,7 +499,8 @@ private void onMoveFinished(MoveInfo move, int status) { if (move.packageName != null) { // We currently ignore finished app moves; just clear the last // published progress - mNotificationManager.cancelAsUser(move.packageName, MOVE_ID, UserHandle.ALL); + mNotificationManager.cancelAsUser(move.packageName, SystemMessage.NOTE_STORAGE_MOVE, + UserHandle.ALL); return; } @@ -537,8 +541,8 @@ private void onMoveFinished(MoveInfo move, int status) { .setAutoCancel(true); SystemUI.overrideNotificationAppName(mContext, builder); - mNotificationManager.notifyAsUser(move.packageName, MOVE_ID, builder.build(), - UserHandle.ALL); + mNotificationManager.notifyAsUser(move.packageName, SystemMessage.NOTE_STORAGE_MOVE, + builder.build(), UserHandle.ALL); } private int getSmallIcon(DiskInfo disk, int state) { 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 @@ private Condition getTimeUntilNextAlarmCondition() { 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/notification/VisualStabilityManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/notification/VisualStabilityManagerTest.java new file mode 100644 index 000000000000..3b8d6b51d5d7 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/notification/VisualStabilityManagerTest.java @@ -0,0 +1,144 @@ +/* + * 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.notification; + +import android.service.notification.StatusBarNotification; +import android.test.suitebuilder.annotation.SmallTest; + +import com.android.systemui.statusbar.ExpandableNotificationRow; +import com.android.systemui.statusbar.NotificationData; +import com.android.systemui.statusbar.notification.VisibilityLocationProvider; +import com.android.systemui.statusbar.notification.VisualStabilityManager; +import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.SysuiTestCase; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static junit.framework.Assert.assertEquals; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@SmallTest +public class VisualStabilityManagerTest extends SysuiTestCase { + + private VisualStabilityManager mVisualStabilityManager = new VisualStabilityManager(); + private VisualStabilityManager.Callback mCallback = mock(VisualStabilityManager.Callback.class); + private VisibilityLocationProvider mLocationProvider = mock(VisibilityLocationProvider.class); + private ExpandableNotificationRow mRow = mock(ExpandableNotificationRow.class); + private NotificationData.Entry mEntry; + + @Before + public void setUp() { + mVisualStabilityManager.setVisibilityLocationProvider(mLocationProvider); + mEntry = new NotificationData.Entry(mock(StatusBarNotification.class), + mock(StatusBarIconView.class)); + mEntry.row = mRow; + } + + public void testPanelExpansion() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + assertEquals(mVisualStabilityManager.canReorderNotification(mRow), false); + mVisualStabilityManager.setPanelExpanded(false); + assertEquals(mVisualStabilityManager.canReorderNotification(mRow), true); + } + + public void testScreenOn() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + assertEquals(mVisualStabilityManager.canReorderNotification(mRow), false); + mVisualStabilityManager.setScreenOn(false); + assertEquals(mVisualStabilityManager.canReorderNotification(mRow), true); + } + + @Test + public void testReorderingAllowedChangesScreenOn() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + assertEquals(mVisualStabilityManager.isReorderingAllowed(), false); + mVisualStabilityManager.setScreenOn(false); + assertEquals(mVisualStabilityManager.isReorderingAllowed(), true); + } + + public void testReorderingAllowedChangesPanel() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + assertEquals(mVisualStabilityManager.isReorderingAllowed(), false); + mVisualStabilityManager.setPanelExpanded(false); + assertEquals(mVisualStabilityManager.isReorderingAllowed(), true); + } + + public void testCallBackCalledScreenOn() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + mVisualStabilityManager.addReorderingAllowedCallback(mCallback); + mVisualStabilityManager.setScreenOn(false); + verify(mCallback).onReorderingAllowed(); + } + + public void testCallBackCalledPanelExpanded() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + mVisualStabilityManager.addReorderingAllowedCallback(mCallback); + mVisualStabilityManager.setPanelExpanded(false); + verify(mCallback).onReorderingAllowed(); + } + + public void testCallBackExactlyOnce() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + mVisualStabilityManager.addReorderingAllowedCallback(mCallback); + mVisualStabilityManager.setScreenOn(false); + mVisualStabilityManager.setScreenOn(true); + mVisualStabilityManager.setScreenOn(false); + verify(mCallback).onReorderingAllowed(); + } + + public void testAddedCanReorder() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + mVisualStabilityManager.notifyViewAddition(mRow); + assertEquals(mVisualStabilityManager.canReorderNotification(mRow), true); + } + + public void testReorderingVisibleHeadsUpNotAllowed() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + when(mLocationProvider.isInVisibleLocation(anyObject())).thenReturn(true); + mVisualStabilityManager.onHeadsUpStateChanged(mEntry, true); + assertEquals(mVisualStabilityManager.canReorderNotification(mRow), false); + } + + public void testReorderingVisibleHeadsUpAllowed() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + when(mLocationProvider.isInVisibleLocation(anyObject())).thenReturn(false); + mVisualStabilityManager.onHeadsUpStateChanged(mEntry, true); + assertEquals(mVisualStabilityManager.canReorderNotification(mRow), true); + } + + public void testReorderingVisibleHeadsUpAllowedOnce() { + mVisualStabilityManager.setPanelExpanded(true); + mVisualStabilityManager.setScreenOn(true); + when(mLocationProvider.isInVisibleLocation(anyObject())).thenReturn(false); + mVisualStabilityManager.onHeadsUpStateChanged(mEntry, true); + mVisualStabilityManager.onReorderingFinished(); + assertEquals(mVisualStabilityManager.canReorderNotification(mRow), false); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java index 19cb24322095..d01ecb190b35 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java @@ -31,6 +31,8 @@ import java.util.ArrayList; import java.util.List; +import static org.mockito.Matchers.eq; + @SmallTest public class CallbackHandlerTest extends AndroidTestCase { @@ -102,8 +104,9 @@ public void testSignalCallback_setMobileDataIndicators() { int qsType = R.drawable.ic_qs_signal_1x; boolean wide = true; int subId = 5; + boolean roaming = true; mHandler.setMobileDataIndicators(status, qs, type, qsType, in, out, typeDescription, - description, wide, subId); + description, wide, subId, roaming); waitForCallbacks(); ArgumentCaptor statusArg = ArgumentCaptor.forClass(IconState.class); @@ -119,7 +122,7 @@ public void testSignalCallback_setMobileDataIndicators() { Mockito.verify(mSignalCallback).setMobileDataIndicators(statusArg.capture(), qsArg.capture(), typeIconArg.capture(), qsTypeIconArg.capture(), inArg.capture(), outArg.capture(), typeContentArg.capture(), descArg.capture(), wideArg.capture(), - subIdArg.capture()); + subIdArg.capture(), eq(roaming)); assertEquals(status, statusArg.getValue()); assertEquals(qs, qsArg.getValue()); assertEquals(type, (int) typeIconArg.getValue()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 38cac1e74031..29b6976dc57c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -43,6 +43,13 @@ import java.util.ArrayList; import java.util.List; +import static junit.framework.Assert.assertEquals; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -279,10 +286,7 @@ protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int t iconArg.capture(), ArgumentCaptor.forClass(Integer.class).capture(), typeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(), - ArgumentCaptor.forClass(String.class).capture(), - ArgumentCaptor.forClass(String.class).capture(), - ArgumentCaptor.forClass(Boolean.class).capture(), - ArgumentCaptor.forClass(Integer.class).capture()); + anyString(), anyString(), anyBoolean(), anyInt(), anyBoolean()); IconState iconState = iconArg.getValue(); assertEquals("Visibility in, quick settings", visible, iconState.visible); assertEquals("Signal icon in, quick settings", icon, iconState.icon); @@ -294,21 +298,46 @@ protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int t } protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon) { + verifyLastMobileDataIndicators(visible, icon, typeIcon, false); + } + + protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, + boolean roaming) { ArgumentCaptor iconArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor typeIconArg = ArgumentCaptor.forClass(Integer.class); // TODO: Verify all fields. Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators( iconArg.capture(), - ArgumentCaptor.forClass(IconState.class).capture(), + any(), + typeIconArg.capture(), + anyInt(), anyBoolean(), anyBoolean(), anyString(), anyString(), anyBoolean(), + anyInt(), eq(roaming)); + IconState iconState = iconArg.getValue(); + + assertEquals("Signal icon in status bar", icon, iconState.icon); + assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue()); + assertEquals("Visibility in status bar", visible, iconState.visible); + } + + protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, + boolean qsVisible, int qsIcon, int qsTypeIcon, boolean dataIn, boolean dataOut) { + ArgumentCaptor iconArg = ArgumentCaptor.forClass(IconState.class); + ArgumentCaptor typeIconArg = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor qsIconArg = ArgumentCaptor.forClass(IconState.class); + ArgumentCaptor qsTypeIconArg = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor dataInArg = ArgumentCaptor.forClass(Boolean.class); + ArgumentCaptor dataOutArg = ArgumentCaptor.forClass(Boolean.class); + + Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators( + iconArg.capture(), + qsIconArg.capture(), typeIconArg.capture(), - ArgumentCaptor.forClass(Integer.class).capture(), - ArgumentCaptor.forClass(Boolean.class).capture(), - ArgumentCaptor.forClass(Boolean.class).capture(), - ArgumentCaptor.forClass(String.class).capture(), - ArgumentCaptor.forClass(String.class).capture(), - ArgumentCaptor.forClass(Boolean.class).capture(), - ArgumentCaptor.forClass(Integer.class).capture()); + qsTypeIconArg.capture(), + dataInArg.capture(), + dataOutArg.capture(), + anyString(), anyString(), anyBoolean(), anyInt(), anyBoolean()); + IconState iconState = iconArg.getValue(); assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java index 542c39021ee9..fce1172ff625 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java @@ -17,18 +17,6 @@ public void test3gDataIcon() { TelephonyIcons.QS_DATA_3G); } - public void testRoamingDataIcon() { - setupDefaultSignal(); - setGsmRoaming(true); - - verifyLastMobileDataIndicators(true, - TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[1][DEFAULT_LEVEL], - TelephonyIcons.ROAMING_ICON); - verifyLastQsMobileDataIndicators(true, - TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[1][DEFAULT_LEVEL], - TelephonyIcons.QS_DATA_R, false, false); - } - public void test2gDataIcon() { setupDefaultSignal(); updateDataConnectionState(TelephonyManager.DATA_CONNECTED, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index 08da382a2fbe..1912bf042e8b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -140,13 +140,12 @@ public void testSignalRoaming() { for (int testStrength = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; testStrength <= SignalStrength.SIGNAL_STRENGTH_GREAT; testStrength++) { setupDefaultSignal(); - setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); setGsmRoaming(true); setLevel(testStrength); verifyLastMobileDataIndicators(true, TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[1][testStrength], - TelephonyIcons.ROAMING_ICON); + DEFAULT_ICON, true); } } @@ -160,7 +159,7 @@ public void testCdmaSignalRoaming() { verifyLastMobileDataIndicators(true, TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[1][testStrength], - TelephonyIcons.ROAMING_ICON); + TelephonyIcons.DATA_1X[1][0 /* No direction */], true); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java index d7c4e1e06514..15658a42c901 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java @@ -93,9 +93,10 @@ public void testRoamingIconDuringWifi() { setGsmRoaming(true); // Still be on wifi though. setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true); + setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); verifyLastMobileDataIndicators(true, TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH_ROAMING[1][DEFAULT_LEVEL], - TelephonyIcons.ROAMING_ICON); + 0, true); } protected void setWifiActivity(int activity) { diff --git a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java index ff934ef18677..4254a0ba200a 100644 --- a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java +++ b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java @@ -217,9 +217,6 @@ public void onRestoreFinished() { final int sysWhich = FLAG_SYSTEM | (lockImageStage.exists() ? 0 : FLAG_LOCK); try { - // First off, revert to the factory state - mWm.clear(FLAG_SYSTEM | FLAG_LOCK); - // It is valid for the imagery to be absent; it means that we were not permitted // to back up the original image on the source device, or there was no user-supplied // wallpaper image present. @@ -233,6 +230,11 @@ public void onRestoreFinished() { Slog.i(TAG, "Using wallpaper service " + wpService); } mWm.setWallpaperComponent(wpService, UserHandle.USER_SYSTEM); + if (!lockImageStage.exists()) { + // We have a live wallpaper and no static lock image, + // allow live wallpaper to show "through" on lock screen. + mWm.clear(FLAG_LOCK); + } } else { if (DEBUG) { Slog.v(TAG, "Can't use wallpaper service " + wpService); diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 8a0dfe51189f..ff3a9c5fa7b9 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -2213,6 +2213,40 @@ message MetricsEvent { // ---- End N-MR1 Constants, all N-MR1 constants go above this line ---- + // ACTION: The lockscreen gets shown because the SIM card was removed + // SUBTYPE: false: device was previously unlocked, true: device was previously locked + // CATEGORY: GLOBAL_SYSTEM_UI + // OS: N-MR2 + ACTION_LOCK_BECAUSE_SIM_REMOVED = 497; + + // ACTION: QS Brightness Slider (with auto brightness disabled, and VR enabled) + // SUBTYPE: slider value + // CATEGORY: QUICK_SETTINGS + // OS: 6.0 + ACTION_BRIGHTNESS_FOR_VR = 498; + + // ACTION: A captive portal was detected during network validation + // CATEGORY: NOTIFICATION + // OS: N-MR2 + NOTIFICATION_NETWORK_SIGN_IN = 740; + + // ACTION: An unvalidated network without Internet was selected by the user + // CATEGORY: NOTIFICATION + // OS: N-MR2 + NOTIFICATION_NETWORK_NO_INTERNET = 741; + + // ACTION: A validated network failed revalidation and lost Internet access + // CATEGORY: NOTIFICATION + // OS: N-MR2 + NOTIFICATION_NETWORK_LOST_INTERNET = 742; + + // ACTION: The system default network switched to a different network + // CATEGORY: NOTIFICATION + // OS: N-MR2 + NOTIFICATION_NETWORK_SWITCH = 743; + + // ---- End N-MR2 Constants, all N-MR2 constants go above this line ---- + // Add new aosp constants above this line. // END OF AOSP CONSTANTS } diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto new file mode 100644 index 000000000000..5b917761a6f6 --- /dev/null +++ b/proto/src/system_messages.proto @@ -0,0 +1,79 @@ +// Copyright (C) 2017 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. + +syntax = "proto2"; + +option java_package = "com.android.internal.messages"; +option java_outer_classname = "SystemMessageProto"; + +package com_android_notifications; + +// Descriptors for system messages: notifications, dialogs, toasts, etc. +message SystemMessage { + + // System message IDs + // These are non-consecutive in order to preserve some existing, ad hoc IDs. + enum ID { + // Unknown + NOTE_UNKNOWN = 0; + + // Notify the user that a screenshot was captured. + // Package: com.android.systemui + NOTE_GLOBAL_SCREENSHOT = 1; + + // Warn the user about an invalid charger. + // Package: com.android.systemui + NOTE_BAD_CHARGER = 2; + + // Warn the user about low battery. + // Package: com.android.systemui + NOTE_POWER_LOW = 3; + + // Warn the user that the device has gotten warm. + // Package: com.android.systemui + NOTE_HIGH_TEMP = 4; + + // Warn the user that some notifications are hidden. + // Package: com.android.systemui + NOTE_HIDDEN_NOTIFICATIONS = 5; + + // Notify the user of a problem with a plugin (dev devices only). + // Package: com.android.systemui + NOTE_PLUGIN = 6; + + // Confirm that the user wants to remove the guest account. + // Package: com.android.systemui + NOTE_REMOVE_GUEST = 1010; + + // Confirm that the user wants to log out of the device. + // Package: com.android.systemui + NOTE_LOGOUT_USER = 1011; + + // Notify the user about public volume state changes.. + // Package: com.android.systemui + NOTE_STORAGE_PUBLIC = 0x53505542; + + // Notify the user about private volume state changes. + // Package: com.android.systemui + NOTE_STORAGE_PRIVATE = 0x53505256; + + // Notify the user about an unsupported storage device.. + // Package: com.android.systemui + NOTE_STORAGE_DISK = 0x5344534b; + + // Notify the user that data or apps are being moved to external storage. + // Package: com.android.systemui + NOTE_STORAGE_MOVE = 0x534d4f56; + } +} diff --git a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java index c04191bb095d..49a71b430ac6 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java +++ b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java @@ -2441,10 +2441,10 @@ public void CGEMM(@Transpose int TransA, @Transpose int TransB, Float2 alpha, Al * @param TransA The type of transpose applied to matrix A. * @param TransB The type of transpose applied to matrix B. * @param alpha The scalar alpha. - * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2 - * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2 + * @param A The input allocation contains matrix A, supported elements type {@link Element#F64_2}. + * @param B The input allocation contains matrix B, supported elements type {@link Element#F64_2}. * @param beta The scalar beta. - * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2 + * @param C The input allocation contains matrix C, supported elements type {@link Element#F64_2}. */ public void ZGEMM(@Transpose int TransA, @Transpose int TransB, Double2 alpha, Allocation A, Allocation B, Double2 beta, Allocation C) { diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index e00178f8ea41..34ccb7b82c87 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -538,7 +538,7 @@ public List getEnabledAccessibilityServiceList(int fee @Override public void interrupt(int userId) { - CopyOnWriteArrayList services; + List interfacesToInterrupt; synchronized (mLock) { // We treat calls from a profile as if made by its parent as profiles // share the accessibility state of the parent. The call below @@ -549,15 +549,24 @@ public void interrupt(int userId) { if (resolvedUserId != mCurrentUserId) { return; } - services = getUserStateLocked(resolvedUserId).mBoundServices; + List services = getUserStateLocked(resolvedUserId).mBoundServices; + int numServices = services.size(); + interfacesToInterrupt = new ArrayList<>(numServices); + for (int i = 0; i < numServices; i++) { + Service service = services.get(i); + IBinder a11yServiceBinder = service.mService; + IAccessibilityServiceClient a11yServiceInterface = service.mServiceInterface; + if ((a11yServiceBinder != null) && (a11yServiceInterface != null)) { + interfacesToInterrupt.add(a11yServiceInterface); + } + } } - for (int i = 0, count = services.size(); i < count; i++) { - Service service = services.get(i); + for (int i = 0, count = interfacesToInterrupt.size(); i < count; i++) { try { - service.mServiceInterface.onInterrupt(); + interfacesToInterrupt.get(i).onInterrupt(); } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error during sending interrupt request to " - + service.mService, re); + Slog.e(LOG_TAG, "Error sending interrupt request to " + + interfacesToInterrupt.get(i), re); } } } @@ -2891,8 +2900,8 @@ public boolean performGlobalAction(int action) { 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 +3394,19 @@ private void expandQuickSettings() { 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/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index b5fcb5cb6a3b..4ae6e479798d 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -125,6 +125,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBackupProvider, OnCrossProfileWidgetProvidersChangeListener { @@ -151,6 +152,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku // Bump if the stored widgets need to be upgraded. private static final int CURRENT_VERSION = 1; + private static final AtomicLong REQUEST_COUNTER = new AtomicLong(); + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -767,7 +770,8 @@ public ParceledListSlice startListening(IAppWidgetHost callba LongSparseArray updatesMap = new LongSparseArray<>(); for (int i = 0; i < N; i++) { if (host.getPendingUpdatesForId(appWidgetIds[i], updatesMap)) { - // We key the updates based on time, so that the values are sorted by time. + // We key the updates based on request id, so that the values are sorted in the + // order they were received. int M = updatesMap.size(); for (int j = 0; j < M; j++) { outUpdates.add(updatesMap.valueAt(j)); @@ -1590,14 +1594,6 @@ private void updateAppWidgetIds(String callingPackage, int[] appWidgetIds, // Make sure the package runs under the caller uid. mSecurityPolicy.enforceCallFromPackage(callingPackage); - - final int bitmapMemoryUsage = (views != null) ? views.estimateMemoryUsage() : 0; - if (bitmapMemoryUsage > mMaxWidgetBitmapMemory) { - throw new IllegalArgumentException("RemoteViews for widget update exceeds" - + " maximum bitmap memory usage (used: " + bitmapMemoryUsage - + ", max: " + mMaxWidgetBitmapMemory + ")"); - } - synchronized (mLock) { ensureGroupStateLoadedLocked(userId); @@ -1809,6 +1805,15 @@ private void updateAppWidgetInstanceLocked(Widget widget, RemoteViews views, // For a full update we replace the RemoteViews completely. widget.views = views; } + int memoryUsage; + if ((UserHandle.getAppId(Binder.getCallingUid()) != Process.SYSTEM_UID) && + (widget.views != null) && + ((memoryUsage = widget.views.estimateMemoryUsage()) > mMaxWidgetBitmapMemory)) { + widget.views = null; + throw new IllegalArgumentException("RemoteViews for widget update exceeds" + + " maximum bitmap memory usage (used: " + memoryUsage + + ", max: " + mMaxWidgetBitmapMemory + ")"); + } scheduleNotifyUpdateAppWidgetLocked(widget, widget.getEffectiveViewsLocked()); } } @@ -1819,9 +1824,9 @@ private void scheduleNotifyAppWidgetViewDataChanged(Widget widget, int viewId) { // method with a wrong id. In that case, ignore the call. return; } - long requestTime = SystemClock.uptimeMillis(); + long requestId = REQUEST_COUNTER.incrementAndGet(); if (widget != null) { - widget.updateTimes.put(viewId, requestTime); + widget.updateRequestIds.put(viewId, requestId); } if (widget == null || widget.host == null || widget.host.zombie || widget.host.callbacks == null || widget.provider == null @@ -1832,7 +1837,7 @@ private void scheduleNotifyAppWidgetViewDataChanged(Widget widget, int viewId) { SomeArgs args = SomeArgs.obtain(); args.arg1 = widget.host; args.arg2 = widget.host.callbacks; - args.arg3 = requestTime; + args.arg3 = requestId; args.argi1 = widget.appWidgetId; args.argi2 = viewId; @@ -1843,10 +1848,10 @@ private void scheduleNotifyAppWidgetViewDataChanged(Widget widget, int viewId) { private void handleNotifyAppWidgetViewDataChanged(Host host, IAppWidgetHost callbacks, - int appWidgetId, int viewId, long requestTime) { + int appWidgetId, int viewId, long requestId) { try { callbacks.viewDataChanged(appWidgetId, viewId); - host.lastWidgetUpdateTime = requestTime; + host.lastWidgetUpdateRequestId = requestId; } catch (RemoteException re) { // It failed; remove the callback. No need to prune because // we know that this host is still referenced by this instance. @@ -1893,9 +1898,9 @@ public void onServiceDisconnected(android.content.ComponentName name) { } private void scheduleNotifyUpdateAppWidgetLocked(Widget widget, RemoteViews updateViews) { - long requestTime = SystemClock.uptimeMillis(); + long requestId = REQUEST_COUNTER.incrementAndGet(); if (widget != null) { - widget.updateTimes.put(ID_VIEWS_UPDATE, requestTime); + widget.updateRequestIds.put(ID_VIEWS_UPDATE, requestId); } if (widget == null || widget.provider == null || widget.provider.zombie || widget.host.callbacks == null || widget.host.zombie) { @@ -1906,7 +1911,7 @@ private void scheduleNotifyUpdateAppWidgetLocked(Widget widget, RemoteViews upda args.arg1 = widget.host; args.arg2 = widget.host.callbacks; args.arg3 = (updateViews != null) ? updateViews.clone() : null; - args.arg4 = requestTime; + args.arg4 = requestId; args.argi1 = widget.appWidgetId; mCallbackHandler.obtainMessage( @@ -1915,10 +1920,10 @@ private void scheduleNotifyUpdateAppWidgetLocked(Widget widget, RemoteViews upda } private void handleNotifyUpdateAppWidget(Host host, IAppWidgetHost callbacks, - int appWidgetId, RemoteViews views, long requestTime) { + int appWidgetId, RemoteViews views, long requestId) { try { callbacks.updateAppWidget(appWidgetId, views); - host.lastWidgetUpdateTime = requestTime; + host.lastWidgetUpdateRequestId = requestId; } catch (RemoteException re) { synchronized (mLock) { Slog.e(TAG, "Widget host dead: " + host.id, re); @@ -1928,11 +1933,11 @@ private void handleNotifyUpdateAppWidget(Host host, IAppWidgetHost callbacks, } private void scheduleNotifyProviderChangedLocked(Widget widget) { - long requestTime = SystemClock.uptimeMillis(); + long requestId = REQUEST_COUNTER.incrementAndGet(); if (widget != null) { // When the provider changes, reset everything else. - widget.updateTimes.clear(); - widget.updateTimes.append(ID_PROVIDER_CHANGED, requestTime); + widget.updateRequestIds.clear(); + widget.updateRequestIds.append(ID_PROVIDER_CHANGED, requestId); } if (widget == null || widget.provider == null || widget.provider.zombie || widget.host.callbacks == null || widget.host.zombie) { @@ -1943,7 +1948,7 @@ private void scheduleNotifyProviderChangedLocked(Widget widget) { args.arg1 = widget.host; args.arg2 = widget.host.callbacks; args.arg3 = widget.provider.info; - args.arg4 = requestTime; + args.arg4 = requestId; args.argi1 = widget.appWidgetId; mCallbackHandler.obtainMessage( @@ -1952,10 +1957,10 @@ private void scheduleNotifyProviderChangedLocked(Widget widget) { } private void handleNotifyProviderChanged(Host host, IAppWidgetHost callbacks, - int appWidgetId, AppWidgetProviderInfo info, long requestTime) { + int appWidgetId, AppWidgetProviderInfo info, long requestId) { try { callbacks.providerChanged(appWidgetId, info); - host.lastWidgetUpdateTime = requestTime; + host.lastWidgetUpdateRequestId = requestId; } catch (RemoteException re) { synchronized (mLock){ Slog.e(TAG, "Widget host dead: " + host.id, re); @@ -3428,11 +3433,11 @@ public void handleMessage(Message message) { Host host = (Host) args.arg1; IAppWidgetHost callbacks = (IAppWidgetHost) args.arg2; RemoteViews views = (RemoteViews) args.arg3; - long requestTime = (Long) args.arg4; + long requestId = (Long) args.arg4; final int appWidgetId = args.argi1; args.recycle(); - handleNotifyUpdateAppWidget(host, callbacks, appWidgetId, views, requestTime); + handleNotifyUpdateAppWidget(host, callbacks, appWidgetId, views, requestId); } break; case MSG_NOTIFY_PROVIDER_CHANGED: { @@ -3440,11 +3445,11 @@ public void handleMessage(Message message) { Host host = (Host) args.arg1; IAppWidgetHost callbacks = (IAppWidgetHost) args.arg2; AppWidgetProviderInfo info = (AppWidgetProviderInfo)args.arg3; - long requestTime = (Long) args.arg4; + long requestId = (Long) args.arg4; final int appWidgetId = args.argi1; args.recycle(); - handleNotifyProviderChanged(host, callbacks, appWidgetId, info, requestTime); + handleNotifyProviderChanged(host, callbacks, appWidgetId, info, requestId); } break; case MSG_NOTIFY_PROVIDERS_CHANGED: { @@ -3460,13 +3465,13 @@ public void handleMessage(Message message) { SomeArgs args = (SomeArgs) message.obj; Host host = (Host) args.arg1; IAppWidgetHost callbacks = (IAppWidgetHost) args.arg2; - long requestTime = (Long) args.arg3; + long requestId = (Long) args.arg3; final int appWidgetId = args.argi1; final int viewId = args.argi2; args.recycle(); handleNotifyAppWidgetViewDataChanged(host, callbacks, appWidgetId, viewId, - requestTime); + requestId); } break; } } @@ -3782,7 +3787,7 @@ private static final class Host { boolean zombie; // if we're in safe mode, don't prune this just because nobody references it int tag = TAG_UNDEFINED; // for use while saving state (the index) - long lastWidgetUpdateTime; // last time we were successfully able to send an update. + long lastWidgetUpdateRequestId; // request id for the last update successfully sent public int getUserId() { return UserHandle.getUserId(id.uid); @@ -3809,18 +3814,18 @@ private boolean hostsPackageForUser(String pkg, int userId) { */ public boolean getPendingUpdatesForId(int appWidgetId, LongSparseArray outUpdates) { - long updateTime = lastWidgetUpdateTime; + long updateRequestId = lastWidgetUpdateRequestId; int N = widgets.size(); for (int i = 0; i < N; i++) { Widget widget = widgets.get(i); if (widget.appWidgetId == appWidgetId) { outUpdates.clear(); - for (int j = widget.updateTimes.size() - 1; j >= 0; j--) { - long time = widget.updateTimes.valueAt(j); - if (time <= updateTime) { + for (int j = widget.updateRequestIds.size() - 1; j >= 0; j--) { + long requestId = widget.updateRequestIds.valueAt(j); + if (requestId <= updateRequestId) { continue; } - int id = widget.updateTimes.keyAt(j); + int id = widget.updateRequestIds.keyAt(j); final PendingHostUpdate update; switch (id) { case ID_PROVIDER_CHANGED: @@ -3834,7 +3839,7 @@ public boolean getPendingUpdatesForId(int appWidgetId, default: update = PendingHostUpdate.viewDataChanged(appWidgetId, id); } - outUpdates.put(time, update); + outUpdates.put(requestId, update); } return true; } @@ -3916,8 +3921,8 @@ private static final class Widget { RemoteViews maskedViews; Bundle options; Host host; - // timestamps for various operations - SparseLongArray updateTimes = new SparseLongArray(2); + // Request ids for various operations + SparseLongArray updateRequestIds = new SparseLongArray(2); @Override public String toString() { diff --git a/services/core/Android.mk b/services/core/Android.mk index 269ee1b663a9..e2254020ea5b 100644 --- a/services/core/Android.mk +++ b/services/core/Android.mk @@ -12,7 +12,7 @@ LOCAL_SRC_FILES += \ java/com/android/server/EventLogTags.logtags \ java/com/android/server/am/EventLogTags.logtags \ ../../../../system/netd/server/binder/android/net/INetd.aidl \ - ../../../../system/netd/server/binder/android/net/metrics/IDnsEventListener.aidl \ + ../../../../system/netd/server/binder/android/net/metrics/INetdEventListener.aidl \ LOCAL_AIDL_INCLUDES += \ system/netd/server/binder diff --git a/services/core/java/com/android/server/AnyMotionDetector.java b/services/core/java/com/android/server/AnyMotionDetector.java index f93c716ae162..d56492521276 100644 --- a/services/core/java/com/android/server/AnyMotionDetector.java +++ b/services/core/java/com/android/server/AnyMotionDetector.java @@ -97,6 +97,15 @@ interface DeviceIdleCallback { /** True if an orientation measurement is in progress. */ private boolean mMeasurementInProgress; + /** True if sendMessageDelayed() for the mMeasurementTimeout callback has been scheduled */ + private boolean mMeasurementTimeoutIsActive; + + /** True if sendMessageDelayed() for the mWakelockTimeout callback has been scheduled */ + private boolean mWakelockTimeoutIsActive; + + /** True if sendMessageDelayed() for the mSensorRestart callback has been scheduled */ + private boolean mSensorRestartIsActive; + /** The most recent gravity vector. */ private Vector3 mCurrentGravityVector = null; @@ -118,6 +127,9 @@ public AnyMotionDetector(PowerManager pm, Handler handler, SensorManager sm, mSensorManager = sm; mAccelSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); mMeasurementInProgress = false; + mMeasurementTimeoutIsActive = false; + mWakelockTimeoutIsActive = false; + mSensorRestartIsActive = false; mState = STATE_INACTIVE; mCallback = callback; mThresholdAngle = thresholdAngle; @@ -146,6 +158,7 @@ public void checkForAnyMotion() { mWakeLock.acquire(); Message wakelockTimeoutMsg = Message.obtain(mHandler, mWakelockTimeout); mHandler.sendMessageDelayed(wakelockTimeoutMsg, WAKELOCK_TIMEOUT_MILLIS); + mWakelockTimeoutIsActive = true; startOrientationMeasurementLocked(); } } @@ -157,17 +170,20 @@ public void stop() { mState = STATE_INACTIVE; if (DEBUG) Slog.d(TAG, "Moved from STATE_ACTIVE to STATE_INACTIVE."); } + mHandler.removeCallbacks(mMeasurementTimeout); + mHandler.removeCallbacks(mSensorRestart); + mMeasurementTimeoutIsActive = false; + mSensorRestartIsActive = false; if (mMeasurementInProgress) { mMeasurementInProgress = false; mSensorManager.unregisterListener(mListener); } - mHandler.removeCallbacks(mMeasurementTimeout); - mHandler.removeCallbacks(mSensorRestart); mCurrentGravityVector = null; mPreviousGravityVector = null; if (mWakeLock.isHeld()) { - mWakeLock.release(); mHandler.removeCallbacks(mWakelockTimeout); + mWakelockTimeoutIsActive = false; + mWakeLock.release(); } } } @@ -183,6 +199,7 @@ private void startOrientationMeasurementLocked() { } Message measurementTimeoutMsg = Message.obtain(mHandler, mMeasurementTimeout); mHandler.sendMessageDelayed(measurementTimeoutMsg, ACCELEROMETER_DATA_TIMEOUT_MILLIS); + mMeasurementTimeoutIsActive = true; } } @@ -191,8 +208,9 @@ private int stopOrientationMeasurementLocked() { mMeasurementInProgress); int status = RESULT_UNKNOWN; if (mMeasurementInProgress) { - mSensorManager.unregisterListener(mListener); mHandler.removeCallbacks(mMeasurementTimeout); + mMeasurementTimeoutIsActive = false; + mSensorManager.unregisterListener(mListener); mMeasurementInProgress = false; mPreviousGravityVector = mCurrentGravityVector; mCurrentGravityVector = mRunningStats.getRunningAverage(); @@ -213,8 +231,9 @@ private int stopOrientationMeasurementLocked() { if (DEBUG) Slog.d(TAG, "getStationaryStatus() returned " + status); if (status != RESULT_UNKNOWN) { if (mWakeLock.isHeld()) { - mWakeLock.release(); mHandler.removeCallbacks(mWakelockTimeout); + mWakelockTimeoutIsActive = false; + mWakeLock.release(); } if (DEBUG) { Slog.d(TAG, "Moved from STATE_ACTIVE to STATE_INACTIVE. status = " + status); @@ -230,6 +249,7 @@ private int stopOrientationMeasurementLocked() { " milliseconds."); Message msg = Message.obtain(mHandler, mSensorRestart); mHandler.sendMessageDelayed(msg, ORIENTATION_MEASUREMENT_INTERVAL_MILLIS); + mSensorRestartIsActive = true; } } return status; @@ -283,6 +303,7 @@ public void onSensorChanged(SensorEvent event) { } if (status != RESULT_UNKNOWN) { mHandler.removeCallbacks(mWakelockTimeout); + mWakelockTimeoutIsActive = false; mCallback.onAnyMotionResult(status); } } @@ -296,7 +317,10 @@ public void onAccuracyChanged(Sensor sensor, int accuracy) { @Override public void run() { synchronized (mLock) { - startOrientationMeasurementLocked(); + if (mSensorRestartIsActive == true) { + mSensorRestartIsActive = false; + startOrientationMeasurementLocked(); + } } } }; @@ -306,14 +330,18 @@ public void run() { public void run() { int status = RESULT_UNKNOWN; synchronized (mLock) { - if (DEBUG) Slog.i(TAG, "mMeasurementTimeout. Failed to collect sufficient accel " + - "data within " + ACCELEROMETER_DATA_TIMEOUT_MILLIS + " ms. Stopping " + - "orientation measurement."); - status = stopOrientationMeasurementLocked(); - } - if (status != RESULT_UNKNOWN) { - mHandler.removeCallbacks(mWakelockTimeout); - mCallback.onAnyMotionResult(status); + if (mMeasurementTimeoutIsActive == true) { + mMeasurementTimeoutIsActive = false; + if (DEBUG) Slog.i(TAG, "mMeasurementTimeout. Failed to collect sufficient accel " + + "data within " + ACCELEROMETER_DATA_TIMEOUT_MILLIS + " ms. Stopping " + + "orientation measurement."); + status = stopOrientationMeasurementLocked(); + if (status != RESULT_UNKNOWN) { + mHandler.removeCallbacks(mWakelockTimeout); + mWakelockTimeoutIsActive = false; + mCallback.onAnyMotionResult(status); + } + } } } }; @@ -322,7 +350,10 @@ public void run() { @Override public void run() { synchronized (mLock) { - stop(); + if (mWakelockTimeoutIsActive == true) { + mWakelockTimeoutIsActive = false; + stop(); + } } } }; diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 242fe1965af4..e4ea22346588 100755 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -28,6 +28,7 @@ import android.bluetooth.IBluetoothManagerCallback; import android.bluetooth.IBluetoothProfileServiceConnection; import android.bluetooth.IBluetoothStateChangeCallback; +import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; @@ -35,11 +36,13 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.database.ContentObserver; import android.os.Binder; +import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -53,15 +56,18 @@ import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.util.Slog; -import java.util.concurrent.locks.ReentrantReadWriteLock; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.HashMap; +import java.util.LinkedList; import java.util.Map; import android.app.AppOpsManager; import android.os.SystemProperties; + class BluetoothManagerService extends IBluetoothManager.Stub { private static final String TAG = "BluetoothManagerService"; private static final boolean DBG = true; @@ -101,6 +107,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private static final int MESSAGE_USER_UNLOCKED = 301; private static final int MESSAGE_ADD_PROXY_DELAYED = 400; private static final int MESSAGE_BIND_PROFILE_SERVICE = 401; + private static final int MAX_SAVE_RETRIES = 3; private static final int MAX_ERROR_RESTART_RETRIES = 6; @@ -118,7 +125,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private static final int SERVICE_IBLUETOOTHGATT = 2; private final Context mContext; - private static int mBleAppCount = 0; // Locks are not provided for mName and mAddress. // They are accessed in handler or broadcast receiver, same thread context. @@ -134,16 +140,46 @@ class BluetoothManagerService extends IBluetoothManager.Stub { new ReentrantReadWriteLock(); private boolean mBinding; private boolean mUnbinding; + // used inside handler thread private boolean mQuietEnable = false; - // configuarion from external IBinder call which is used to + private boolean mEnable; + + /** + * Used for tracking apps that enabled / disabled Bluetooth. + */ + private class ActiveLog { + private String mPackageName; + private boolean mEnable; + private long mTimestamp; + + public ActiveLog(String packageName, boolean enable, long timestamp) { + mPackageName = packageName; + mEnable = enable; + mTimestamp = timestamp; + } + + public long getTime() { + return mTimestamp; + } + + public String toString() { + return android.text.format.DateFormat.format("MM-dd hh:mm:ss ", mTimestamp) + + (mEnable ? " Enabled " : " Disabled ") + " by " + mPackageName; + } + + } + + private LinkedList mActiveLogs; + + // configuration from external IBinder call which is used to // synchronize with broadcast receiver. private boolean mQuietEnableExternal; - // configuarion from external IBinder call which is used to - // synchronize with broadcast receiver. private boolean mEnableExternal; - // used inside handler thread - private boolean mEnable; + + // Map of apps registered to keep BLE scanning on. + private Map mBleApps = new ConcurrentHashMap(); + private int mState; private final BluetoothHandler mHandler; private int mErrorRecoveryRetryCounter; @@ -156,6 +192,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private final Map mProfileServices = new HashMap (); + private final boolean mPermissionReviewRequired; + private void registerForAirplaneMode(IntentFilter filter) { final ContentResolver resolver = mContext.getContentResolver(); final String airplaneModeRadios = Settings.Global.getString(resolver, @@ -169,7 +207,7 @@ private void registerForAirplaneMode(IntentFilter filter) { } } - private final IBluetoothCallback mBluetoothCallback = new IBluetoothCallback.Stub() { + private final IBluetoothCallback mBluetoothCallback = new IBluetoothCallback.Stub() { @Override public void onBluetoothStateChange(int prevState, int newState) throws RemoteException { Message msg = mHandler.obtainMessage(MESSAGE_BLUETOOTH_STATE_CHANGE,prevState,newState); @@ -208,14 +246,11 @@ public void onReceive(Context context, Intent intent) { } finally { mBluetoothLock.readLock().unlock(); } - Slog.d(TAG, "Airplane Mode change - current state: " + st); + Slog.d(TAG, "State " + BluetoothAdapter.nameForState(st)); if (isAirplaneModeOn()) { // Clear registered LE apps to force shut-off - synchronized (this) { - mBleAppCount = 0; - mBleApps.clear(); - } + clearBleApps(); if (st == BluetoothAdapter.STATE_BLE_ON) { //if state is BLE_ON make sure you trigger disableBLE part try { @@ -233,12 +268,12 @@ public void onReceive(Context context, Intent intent) { } else if (st == BluetoothAdapter.STATE_ON){ // disable without persisting the setting Slog.d(TAG, "Calling disable"); - sendDisableMsg(); + sendDisableMsg("airplane mode"); } } else if (mEnableExternal) { // enable without persisting the setting Slog.d(TAG, "Calling enable"); - sendEnableMsg(mQuietEnableExternal); + sendEnableMsg(mQuietEnableExternal, "airplane mode"); } } } @@ -249,6 +284,12 @@ public void onReceive(Context context, Intent intent) { mHandler = new BluetoothHandler(IoThread.get().getLooper()); mContext = context; + + mPermissionReviewRequired = Build.PERMISSIONS_REVIEW_REQUIRED + || context.getResources().getBoolean( + com.android.internal.R.bool.config_permissionReviewRequired); + + mActiveLogs = new LinkedList(); mBluetooth = null; mBluetoothBinder = null; mBluetoothGatt = null; @@ -276,15 +317,15 @@ public void onReceive(Context context, Intent intent) { mEnableExternal = true; } - int sysUiUid = -1; + int systemUiUid = -1; try { - sysUiUid = mContext.getPackageManager().getPackageUidAsUser("com.android.systemui", + systemUiUid = mContext.getPackageManager().getPackageUidAsUser("com.android.systemui", PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM); } catch (PackageManager.NameNotFoundException e) { // Some platforms, such as wearables do not have a system ui. Slog.w(TAG, "Unable to resolve SystemUI's UID.", e); } - mSystemUiUid = sysUiUid; + mSystemUiUid = systemUiUid; } /** @@ -315,13 +356,15 @@ private final boolean isBluetoothPersistedStateOnBluetooth() { /** * Save the Bluetooth on/off state - * */ private void persistBluetoothSetting(int value) { if (DBG) Slog.d(TAG, "Persisting Bluetooth Setting: " + value); + // waive WRITE_SECURE_SETTINGS permission check + long callingIdentity = Binder.clearCallingIdentity(); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.BLUETOOTH_ON, value); + Binder.restoreCallingIdentity(callingIdentity); } /** @@ -404,6 +447,10 @@ public void unregisterAdapter(IBluetoothManagerCallback callback) { public void registerStateChangeCallback(IBluetoothStateChangeCallback callback) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); + if (callback == null) { + Slog.w(TAG, "registerStateChangeCallback: Callback is null!"); + return; + } Message msg = mHandler.obtainMessage(MESSAGE_REGISTER_STATE_CHANGE_CALLBACK); msg.obj = callback; mHandler.sendMessage(msg); @@ -412,6 +459,10 @@ public void registerStateChangeCallback(IBluetoothStateChangeCallback callback) public void unregisterStateChangeCallback(IBluetoothStateChangeCallback callback) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); + if (callback == null) { + Slog.w(TAG, "unregisterStateChangeCallback: Callback is null!"); + return; + } Message msg = mHandler.obtainMessage(MESSAGE_UNREGISTER_STATE_CHANGE_CALLBACK); msg.obj = callback; mHandler.sendMessage(msg); @@ -438,7 +489,7 @@ public boolean isEnabled() { public int getState() { if ((Binder.getCallingUid() != Process.SYSTEM_UID) && (!checkIfCallerIsForegroundUser())) { - Slog.w(TAG, "getState(): not allowed for non-active and non system user"); + Slog.w(TAG, "getState(): report OFF for non-active and non system user"); return BluetoothAdapter.STATE_OFF; } @@ -454,30 +505,37 @@ public int getState() { } class ClientDeathRecipient implements IBinder.DeathRecipient { - public void binderDied() { - if (DBG) Slog.d(TAG, "Binder is dead - unregister Ble App"); - if (mBleAppCount > 0) --mBleAppCount; + private String mPackageName; - if (mBleAppCount == 0) { - if (DBG) Slog.d(TAG, "Disabling LE only mode after application crash"); - try { - mBluetoothLock.readLock().lock(); - if (mBluetooth != null && - mBluetooth.getState() == BluetoothAdapter.STATE_BLE_ON) { - mEnable = false; - mBluetooth.onBrEdrDown(); - } - } catch (RemoteException e) { - Slog.e(TAG,"Unable to call onBrEdrDown", e); - } finally { - mBluetoothLock.readLock().unlock(); + public ClientDeathRecipient(String packageName) { + mPackageName = packageName; + } + + public void binderDied() { + if (DBG) Slog.d(TAG, "Binder is dead - unregister " + mPackageName); + if (isBleAppPresent()) { + // Nothing to do, another app is here. + return; + } + if (DBG) Slog.d(TAG, "Disabling LE only mode after application crash"); + try { + mBluetoothLock.readLock().lock(); + if (mBluetooth != null && + mBluetooth.getState() == BluetoothAdapter.STATE_BLE_ON) { + mEnable = false; + mBluetooth.onBrEdrDown(); } + } catch (RemoteException e) { + Slog.e(TAG,"Unable to call onBrEdrDown", e); + } finally { + mBluetoothLock.readLock().unlock(); } } - } - /** Internal death rec list */ - Map mBleApps = new HashMap(); + public String getPackageName() { + return mPackageName; + } + } @Override public boolean isBleScanAlwaysAvailable() { @@ -497,17 +555,20 @@ private void registerForBleScanModeChange() { ContentObserver contentObserver = new ContentObserver(null) { @Override public void onChange(boolean selfChange) { - if (!isBleScanAlwaysAvailable()) { - disableBleScanMode(); - clearBleApps(); - try { - mBluetoothLock.readLock().lock(); - if (mBluetooth != null) mBluetooth.onBrEdrDown(); - } catch (RemoteException e) { - Slog.e(TAG, "error when disabling bluetooth", e); - } finally { - mBluetoothLock.readLock().unlock(); - } + if (isBleScanAlwaysAvailable()) { + // Nothing to do + return; + } + // BLE scan is not available. + disableBleScanMode(); + clearBleApps(); + try { + mBluetoothLock.readLock().lock(); + if (mBluetooth != null) mBluetooth.onBrEdrDown(); + } catch (RemoteException e) { + Slog.e(TAG, "error when disabling bluetooth", e); + } finally { + mBluetoothLock.readLock().unlock(); } } }; @@ -532,71 +593,63 @@ private void disableBleScanMode() { } } - public int updateBleAppCount(IBinder token, boolean enable) { - if (enable) { - ClientDeathRecipient r = mBleApps.get(token); - if (r == null) { - ClientDeathRecipient deathRec = new ClientDeathRecipient(); - try { - token.linkToDeath(deathRec, 0); - } catch (RemoteException ex) { - throw new IllegalArgumentException("Wake lock is already dead."); - } - mBleApps.put(token, deathRec); - synchronized (this) { - ++mBleAppCount; - } - if (DBG) Slog.d(TAG, "Registered for death Notification"); - } - - } else { - ClientDeathRecipient r = mBleApps.get(token); - if (r != null) { - // Unregister death recipient as the app goes away. - token.unlinkToDeath(r, 0); - mBleApps.remove(token); - synchronized (this) { - if (mBleAppCount > 0) --mBleAppCount; - } - if (DBG) Slog.d(TAG, "Unregistered for death Notification"); + public int updateBleAppCount(IBinder token, boolean enable, String packageName) { + ClientDeathRecipient r = mBleApps.get(token); + if (r == null && enable) { + ClientDeathRecipient deathRec = new ClientDeathRecipient(packageName); + try { + token.linkToDeath(deathRec, 0); + } catch (RemoteException ex) { + throw new IllegalArgumentException("BLE app (" + packageName + ") already dead!"); } - } - if (DBG) Slog.d(TAG, "Updated BleAppCount" + mBleAppCount); - if (mBleAppCount == 0 && mEnable) { + mBleApps.put(token, deathRec); + if (DBG) Slog.d(TAG, "Registered for death of " + packageName); + } else if (!enable && r != null) { + // Unregister death recipient as the app goes away. + token.unlinkToDeath(r, 0); + mBleApps.remove(token); + if (DBG) Slog.d(TAG, "Unregistered for death of " + packageName); + } + int appCount = mBleApps.size(); + if (DBG) Slog.d(TAG, appCount + " registered Ble Apps"); + if (appCount == 0 && mEnable) { disableBleScanMode(); } - return mBleAppCount; + return appCount; } // Clear all apps using BLE scan only mode. private void clearBleApps() { - synchronized (this) { - mBleApps.clear(); - mBleAppCount = 0; - } + mBleApps.clear(); } - /** @hide*/ + /** @hide */ public boolean isBleAppPresent() { - if (DBG) Slog.d(TAG, "isBleAppPresent() count: " + mBleAppCount); - return (mBleAppCount > 0); + if (DBG) Slog.d(TAG, "isBleAppPresent() count: " + mBleApps.size()); + return mBleApps.size() > 0; } /** - * Action taken when GattService is turned off + * Action taken when GattService is turned on */ private void onBluetoothGattServiceUp() { if (DBG) Slog.d(TAG,"BluetoothGatt Service is Up"); try { mBluetoothLock.readLock().lock(); - if (isBleAppPresent() == false && mBluetooth != null - && mBluetooth.getState() == BluetoothAdapter.STATE_BLE_ON) { + if (mBluetooth == null) { + if (DBG) Slog.w(TAG, "onBluetoothServiceUp: mBluetooth is null!"); + return; + } + int st = mBluetooth.getState(); + if (st != BluetoothAdapter.STATE_BLE_ON) { + if (DBG) Slog.v(TAG, "onBluetoothServiceUp: state isn't BLE_ON: " + + BluetoothAdapter.nameForState(st)); + return; + } + if (isBluetoothPersistedStateOnBluetooth() || !isBleAppPresent()) { + // This triggers transition to STATE_ON mBluetooth.onLeServiceUp(); - - // waive WRITE_SECURE_SETTINGS permission check - long callingIdentity = Binder.clearCallingIdentity(); persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH); - Binder.restoreCallingIdentity(callingIdentity); } } catch (RemoteException e) { Slog.e(TAG,"Unable to call onServiceUp", e); @@ -636,7 +689,7 @@ private void sendBrEdrDownCallback() { } } - public boolean enableNoAutoConnect() + public boolean enableNoAutoConnect(String packageName) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH ADMIN permission"); @@ -654,61 +707,65 @@ public boolean enableNoAutoConnect() synchronized(mReceiver) { mQuietEnableExternal = true; mEnableExternal = true; - sendEnableMsg(true); + sendEnableMsg(true, packageName); } return true; } - private boolean isStrictOpEnable() { - return SystemProperties.getBoolean("persist.sys.strict_op_enable", false); - } + public boolean enable(String packageName) throws RemoteException { + final int callingUid = Binder.getCallingUid(); + final boolean callerSystem = UserHandle.getAppId(callingUid) == Process.SYSTEM_UID; - public boolean enable() { - if ((Binder.getCallingUid() != Process.SYSTEM_UID) && - (!checkIfCallerIsForegroundUser())) { - Slog.w(TAG,"enable(): not allowed for non-active and non system user"); - return false; - } + if (!callerSystem) { + if (!checkIfCallerIsForegroundUser()) { + Slog.w(TAG, "enable(): not allowed for non-active and non system user"); + return false; + } - mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, - "Need BLUETOOTH ADMIN permission"); - if(isStrictOpEnable()){ - AppOpsManager mAppOpsManager = mContext.getSystemService(AppOpsManager.class); - String packageName = mContext.getPackageManager().getNameForUid(Binder.getCallingUid()); - - if ((Binder.getCallingUid() > 10000) - && (packageName.indexOf("android.uid.systemui") != 0) - && (packageName.indexOf("android.uid.system") != 0)) { - int result = mAppOpsManager.noteOp(AppOpsManager.OP_BLUETOOTH_ADMIN, - Binder.getCallingUid(), packageName); - if (result == AppOpsManager.MODE_IGNORED) { - return false; - } + mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, + "Need BLUETOOTH ADMIN permission"); + + if (!isEnabled() && mPermissionReviewRequired + && startConsentUiIfNeeded(packageName, callingUid, + BluetoothAdapter.ACTION_REQUEST_ENABLE)) { + return false; } } + if (DBG) { - Slog.d(TAG,"enable(): mBluetooth =" + mBluetooth + - " mBinding = " + mBinding + " mState = " + mState); + Slog.d(TAG,"enable(" + packageName + "): mBluetooth =" + mBluetooth + + " mBinding = " + mBinding + " mState = " + + BluetoothAdapter.nameForState(mState)); } synchronized(mReceiver) { mQuietEnableExternal = false; mEnableExternal = true; // waive WRITE_SECURE_SETTINGS permission check - sendEnableMsg(false); + sendEnableMsg(false, packageName); } if (DBG) Slog.d(TAG, "enable returning"); return true; } - public boolean disable(boolean persist) { - mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, - "Need BLUETOOTH ADMIN permissicacheNameAndAddresson"); + public boolean disable(String packageName, boolean persist) throws RemoteException { + final int callingUid = Binder.getCallingUid(); + final boolean callerSystem = UserHandle.getAppId(callingUid) == Process.SYSTEM_UID; - if ((Binder.getCallingUid() != Process.SYSTEM_UID) && - (!checkIfCallerIsForegroundUser())) { - Slog.w(TAG,"disable(): not allowed for non-active and non system user"); - return false; + if (!callerSystem) { + if (!checkIfCallerIsForegroundUser()) { + Slog.w(TAG, "disable(): not allowed for non-active and non system user"); + return false; + } + + mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, + "Need BLUETOOTH ADMIN permission"); + + if (isEnabled() && mPermissionReviewRequired + && startConsentUiIfNeeded(packageName, callingUid, + BluetoothAdapter.ACTION_REQUEST_DISABLE)) { + return false; + } } if (DBG) { @@ -718,21 +775,48 @@ public boolean disable(boolean persist) { synchronized(mReceiver) { if (persist) { - // waive WRITE_SECURE_SETTINGS permission check - long callingIdentity = Binder.clearCallingIdentity(); persistBluetoothSetting(BLUETOOTH_OFF); - Binder.restoreCallingIdentity(callingIdentity); } mEnableExternal = false; - sendDisableMsg(); + sendDisableMsg(packageName); } return true; } + private boolean startConsentUiIfNeeded(String packageName, + int callingUid, String intentAction) throws RemoteException { + try { + // Validate the package only if we are going to use it + ApplicationInfo applicationInfo = mContext.getPackageManager() + .getApplicationInfoAsUser(packageName, + PackageManager.MATCH_DEBUG_TRIAGED_MISSING, + UserHandle.getUserId(callingUid)); + if (applicationInfo.uid != callingUid) { + throw new SecurityException("Package " + callingUid + + " not in uid " + callingUid); + } + + Intent intent = new Intent(intentAction); + intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + try { + mContext.startActivity(intent); + } catch (ActivityNotFoundException e) { + // Shouldn't happen + Slog.e(TAG, "Intent to handle action " + intentAction + " missing"); + return false; + } + return true; + } catch (PackageManager.NameNotFoundException e) { + throw new RemoteException(e.getMessage()); + } + } + public void unbindAndFinish() { if (DBG) { Slog.d(TAG,"unbindAndFinish(): " + mBluetooth + - " mBinding = " + mBinding); + " mBinding = " + mBinding + " mUnbinding = " + mUnbinding); } try { @@ -747,16 +831,13 @@ public void unbindAndFinish() { } catch (RemoteException re) { Slog.e(TAG, "Unable to unregister BluetoothCallback",re); } - - if (DBG) Slog.d(TAG, "Sending unbind request."); mBluetoothBinder = null; mBluetooth = null; - //Unbind mContext.unbindService(mConnection); mUnbinding = false; mBinding = false; } else { - mUnbinding=false; + mUnbinding = false; } mBluetoothGatt = null; } finally { @@ -840,7 +921,7 @@ public void handleOnBootPhase() { if (DBG) Slog.d(TAG, "Bluetooth boot completed"); if (mEnableExternal && isBluetoothPersistedStateOnBluetooth()) { if (DBG) Slog.d(TAG, "Auto-enabling Bluetooth."); - sendEnableMsg(mQuietEnableExternal); + sendEnableMsg(mQuietEnableExternal, "system boot"); } else if (!isNameAndAddressSet()) { if (DBG) Slog.d(TAG, "Getting adapter name and address"); Message getMsg = mHandler.obtainMessage(MESSAGE_GET_NAME_AND_ADDRESS); @@ -1026,7 +1107,6 @@ private void sendBluetoothStateCallback(boolean isUp) { * Inform BluetoothAdapter instances that Adapter service is up */ private void sendBluetoothServiceUpCallback() { - if (DBG) Slog.d(TAG,"Calling onBluetoothServiceUp callbacks"); try { int n = mCallbacks.beginBroadcast(); Slog.d(TAG,"Broadcasting onBluetoothServiceUp() to " + n + " receivers."); @@ -1045,7 +1125,6 @@ private void sendBluetoothServiceUpCallback() { * Inform BluetoothAdapter instances that Adapter service is down */ private void sendBluetoothServiceDownCallback() { - if (DBG) Slog.d(TAG,"Calling onBluetoothServiceDown callbacks"); try { int n = mCallbacks.beginBroadcast(); Slog.d(TAG,"Broadcasting onBluetoothServiceDown() to " + n + " receivers."); @@ -1117,17 +1196,16 @@ public String getName() { } private class BluetoothServiceConnection implements ServiceConnection { - public void onServiceConnected(ComponentName className, IBinder service) { - if (DBG) Slog.d(TAG, "BluetoothServiceConnection: " + className.getClassName()); + public void onServiceConnected(ComponentName componentName, IBinder service) { + String name = componentName.getClassName(); + if (DBG) Slog.d(TAG, "BluetoothServiceConnection: " + name); Message msg = mHandler.obtainMessage(MESSAGE_BLUETOOTH_SERVICE_CONNECTED); - // TBD if (className.getClassName().equals(IBluetooth.class.getName())) { - if (className.getClassName().equals("com.android.bluetooth.btservice.AdapterService")) { + if (name.equals("com.android.bluetooth.btservice.AdapterService")) { msg.arg1 = SERVICE_IBLUETOOTH; - // } else if (className.getClassName().equals(IBluetoothGatt.class.getName())) { - } else if (className.getClassName().equals("com.android.bluetooth.gatt.GattService")) { + } else if (name.equals("com.android.bluetooth.gatt.GattService")) { msg.arg1 = SERVICE_IBLUETOOTHGATT; } else { - Slog.e(TAG, "Unknown service connected: " + className.getClassName()); + Slog.e(TAG, "Unknown service connected: " + name); return; } msg.obj = service; @@ -1136,17 +1214,17 @@ public void onServiceConnected(ComponentName className, IBinder service) { mIBluetoothConnectedMsgQueued++; } - public void onServiceDisconnected(ComponentName className) { - // Called if we unexpected disconnected. - if (DBG) Slog.d(TAG, "BluetoothServiceConnection, disconnected: " + - className.getClassName()); + public void onServiceDisconnected(ComponentName componentName) { + // Called if we unexpectedly disconnect. + String name = componentName.getClassName(); + if (DBG) Slog.d(TAG, "BluetoothServiceConnection, disconnected: " + name); Message msg = mHandler.obtainMessage(MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED); - if (className.getClassName().equals("com.android.bluetooth.btservice.AdapterService")) { + if (name.equals("com.android.bluetooth.btservice.AdapterService")) { msg.arg1 = SERVICE_IBLUETOOTH; - } else if (className.getClassName().equals("com.android.bluetooth.gatt.GattService")) { + } else if (name.equals("com.android.bluetooth.gatt.GattService")) { msg.arg1 = SERVICE_IBLUETOOTHGATT; } else { - Slog.e(TAG, "Unknown service disconnected: " + className.getClassName()); + Slog.e(TAG, "Unknown service disconnected: " + name); return; } mHandler.sendMessage(msg); @@ -1164,7 +1242,6 @@ public BluetoothHandler(Looper looper) { @Override public void handleMessage(Message msg) { - if (DBG) Slog.d (TAG, "Message: " + msg.what); switch (msg.what) { case MESSAGE_GET_NAME_AND_ADDRESS: if (DBG) Slog.d(TAG, "MESSAGE_GET_NAME_AND_ADDRESS"); @@ -1202,7 +1279,7 @@ public void handleMessage(Message msg) { case MESSAGE_ENABLE: if (DBG) { - Slog.d(TAG, "MESSAGE_ENABLE: mBluetooth = " + mBluetooth); + Slog.d(TAG, "MESSAGE_ENABLE(" + msg.arg1 + "): mBluetooth = " + mBluetooth); } mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE); mEnable = true; @@ -1213,8 +1290,9 @@ public void handleMessage(Message msg) { if (mBluetooth != null) { int state = mBluetooth.getState(); if (state == BluetoothAdapter.STATE_BLE_ON) { - Slog.w(TAG, "BT is in BLE_ON State"); + Slog.w(TAG, "BT Enable in BLE_ON State, going to ON"); mBluetooth.onLeServiceUp(); + persistBluetoothSetting(BLUETOOTH_ON_BLUETOOTH); break; } } @@ -1252,6 +1330,7 @@ public void handleMessage(Message msg) { break; case MESSAGE_DISABLE: + if (DBG) Slog.d(TAG, "MESSAGE_DISABLE: mBluetooth = " + mBluetooth); mHandler.removeMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE); if (mEnable && mBluetooth != null) { waitForOnOff(true, false); @@ -1267,31 +1346,25 @@ public void handleMessage(Message msg) { case MESSAGE_REGISTER_ADAPTER: { IBluetoothManagerCallback callback = (IBluetoothManagerCallback) msg.obj; - boolean added = mCallbacks.register(callback); - Slog.d(TAG,"Added callback: " + (callback == null? "null": callback) +":" +added ); - } + mCallbacks.register(callback); break; + } case MESSAGE_UNREGISTER_ADAPTER: { IBluetoothManagerCallback callback = (IBluetoothManagerCallback) msg.obj; - boolean removed = mCallbacks.unregister(callback); - Slog.d(TAG,"Removed callback: " + (callback == null? "null": callback) +":" + removed); + mCallbacks.unregister(callback); break; } case MESSAGE_REGISTER_STATE_CHANGE_CALLBACK: { IBluetoothStateChangeCallback callback = (IBluetoothStateChangeCallback) msg.obj; - if (callback != null) { - mStateChangeCallbacks.register(callback); - } + mStateChangeCallbacks.register(callback); break; } case MESSAGE_UNREGISTER_STATE_CHANGE_CALLBACK: { IBluetoothStateChangeCallback callback = (IBluetoothStateChangeCallback) msg.obj; - if (callback != null) { - mStateChangeCallbacks.unregister(callback); - } + mStateChangeCallbacks.unregister(callback); break; } case MESSAGE_ADD_PROXY_DELAYED: @@ -1366,13 +1439,11 @@ public void handleMessage(Message msg) { //Do enable request try { if (mQuietEnable == false) { - if(!mBluetooth.enable()) { + if (!mBluetooth.enable()) { Slog.e(TAG,"IBluetooth.enable() returned false"); } - } - else - { - if(!mBluetooth.enableNoAutoConnect()) { + } else { + if (!mBluetooth.enableNoAutoConnect()) { Slog.e(TAG,"IBluetooth.enableNoAutoConnect() returned false"); } } @@ -1390,19 +1461,14 @@ public void handleMessage(Message msg) { } break; } - case MESSAGE_TIMEOUT_BIND: { - Slog.e(TAG, "MESSAGE_TIMEOUT_BIND"); - mBluetoothLock.writeLock().lock(); - mBinding = false; - mBluetoothLock.writeLock().unlock(); - - break; - } case MESSAGE_BLUETOOTH_STATE_CHANGE: { int prevState = msg.arg1; int newState = msg.arg2; - if (DBG) Slog.d(TAG, "MESSAGE_BLUETOOTH_STATE_CHANGE: prevState = " + prevState + ", newState =" + newState); + if (DBG) { + Slog.d(TAG, "MESSAGE_BLUETOOTH_STATE_CHANGE: " + BluetoothAdapter.nameForState(prevState) + " > " + + BluetoothAdapter.nameForState(newState)); + } mState = newState; bluetoothStateChangeHandler(prevState, newState); // handle error state transition case from TURNING_ON to OFF @@ -1410,7 +1476,7 @@ public void handleMessage(Message msg) { if ((prevState == BluetoothAdapter.STATE_BLE_TURNING_ON) && (newState == BluetoothAdapter.STATE_OFF) && (mBluetooth != null) && mEnable) { - recoverBluetoothServiceFromError(); + recoverBluetoothServiceFromError(false); } if ((prevState == BluetoothAdapter.STATE_TURNING_ON) && (newState == BluetoothAdapter.STATE_OFF) && @@ -1420,7 +1486,7 @@ public void handleMessage(Message msg) { if ((prevState == BluetoothAdapter.STATE_TURNING_ON) && (newState == BluetoothAdapter.STATE_BLE_ON) && (mBluetooth != null) && mEnable) { - recoverBluetoothServiceFromError(); + recoverBluetoothServiceFromError(true); } // If we tried to enable BT while BT was in the process of shutting down, // wait for the BT process to fully tear down and then force a restart @@ -1447,7 +1513,7 @@ public void handleMessage(Message msg) { } case MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED: { - Slog.e(TAG, "MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED: " + msg.arg1); + Slog.e(TAG, "MESSAGE_BLUETOOTH_SERVICE_DISCONNECTED(" + msg.arg1 + ")"); try { mBluetoothLock.writeLock().lock(); if (msg.arg1 == SERVICE_IBLUETOOTH) { @@ -1458,7 +1524,7 @@ public void handleMessage(Message msg) { mBluetoothGatt = null; break; } else { - Slog.e(TAG, "Bad msg.arg1: " + msg.arg1); + Slog.e(TAG, "Unknown argument for service disconnect!"); break; } } finally { @@ -1495,8 +1561,7 @@ public void handleMessage(Message msg) { } case MESSAGE_RESTART_BLUETOOTH_SERVICE: { - Slog.d(TAG, "MESSAGE_RESTART_BLUETOOTH_SERVICE:" - +" Restart IBluetooth service"); + Slog.d(TAG, "MESSAGE_RESTART_BLUETOOTH_SERVICE"); /* Enable without persisting the setting as it doesnt change when IBluetooth service restarts */ @@ -1504,7 +1569,13 @@ public void handleMessage(Message msg) { handleEnable(mQuietEnable); break; } - + case MESSAGE_TIMEOUT_BIND: { + Slog.e(TAG, "MESSAGE_TIMEOUT_BIND"); + mBluetoothLock.writeLock().lock(); + mBinding = false; + mBluetoothLock.writeLock().unlock(); + break; + } case MESSAGE_TIMEOUT_UNBIND: { Slog.e(TAG, "MESSAGE_TIMEOUT_UNBIND"); @@ -1590,11 +1661,10 @@ public void handleMessage(Message msg) { } else if (mBinding || mBluetooth != null) { Message userMsg = mHandler.obtainMessage(MESSAGE_USER_SWITCHED); userMsg.arg2 = 1 + msg.arg2; - // if user is switched when service is being binding - // delay sending MESSAGE_USER_SWITCHED + // if user is switched when service is binding retry after a delay mHandler.sendMessageDelayed(userMsg, USER_SWITCHED_TIME_MS); if (DBG) { - Slog.d(TAG, "delay MESSAGE_USER_SWITCHED " + userMsg.arg2); + Slog.d(TAG, "Retry MESSAGE_USER_SWITCHED " + userMsg.arg2); } } break; @@ -1695,7 +1765,7 @@ private boolean checkIfCallerIsForegroundUser() { parentUser == foregroundUser || callingAppId == Process.NFC_UID || callingAppId == mSystemUiUid; - if (DBG) { + if (DBG && !valid) { Slog.d(TAG, "checkIfCallerIsForegroundUser: valid=" + valid + " callingUser=" + callingUser + " parentUser=" + parentUser @@ -1708,7 +1778,8 @@ private boolean checkIfCallerIsForegroundUser() { } private void sendBleStateChanged(int prevState, int newState) { - if (DBG) Slog.d(TAG,"BLE State Change Intent: " + prevState + " -> " + newState); + if (DBG) Slog.d(TAG,"Sending BLE State Change: " + BluetoothAdapter.nameForState(prevState) + + " > " + BluetoothAdapter.nameForState(newState)); // Send broadcast message to everyone else Intent intent = new Intent(BluetoothAdapter.ACTION_BLE_STATE_CHANGED); intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState); @@ -1719,87 +1790,76 @@ private void sendBleStateChanged(int prevState, int newState) { private void bluetoothStateChangeHandler(int prevState, int newState) { boolean isStandardBroadcast = true; - if (DBG) Slog.d(TAG, "bluetoothStateChangeHandler: " + prevState + " -> " + newState); - if (prevState != newState) { - //Notify all proxy objects first of adapter state change - if (newState == BluetoothAdapter.STATE_BLE_ON || - newState == BluetoothAdapter.STATE_OFF) { - boolean intermediate_off = (prevState == BluetoothAdapter.STATE_TURNING_OFF - && newState == BluetoothAdapter.STATE_BLE_ON); - - if (newState == BluetoothAdapter.STATE_OFF) { - // If Bluetooth is off, send service down event to proxy objects, and unbind - if (DBG) Slog.d(TAG, "Bluetooth is complete turn off"); - sendBluetoothServiceDownCallback(); - unbindAndFinish(); - sendBleStateChanged(prevState, newState); - // Don't broadcast as it has already been broadcast before - if(!mIntentPending) - isStandardBroadcast = false; - else - mIntentPending = false; - - } else if (!intermediate_off) { - // connect to GattService - if (DBG) Slog.d(TAG, "Bluetooth is in LE only mode"); - if (mBluetoothGatt != null) { - if (DBG) Slog.d(TAG, "Calling BluetoothGattServiceUp"); - onBluetoothGattServiceUp(); - } else { - if (DBG) Slog.d(TAG, "Binding Bluetooth GATT service"); - if (mContext.getPackageManager().hasSystemFeature( - PackageManager.FEATURE_BLUETOOTH_LE)) { - Intent i = new Intent(IBluetoothGatt.class.getName()); - doBind(i, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.CURRENT); - } - } - sendBleStateChanged(prevState, newState); - //Don't broadcase this as std intent - isStandardBroadcast = false; - - } else if (intermediate_off){ - if (DBG) Slog.d(TAG, "Intermediate off, back to LE only mode"); - // For LE only mode, broadcast as is - sendBleStateChanged(prevState, newState); - sendBluetoothStateCallback(false); // BT is OFF for general users - // Broadcast as STATE_OFF - newState = BluetoothAdapter.STATE_OFF; - sendBrEdrDownCallback(); - if(!isBleAppPresent()){ - isStandardBroadcast = false; - mIntentPending = true; - } else { - mIntentPending = false; - isStandardBroadcast = true; - } - } - } else if (newState == BluetoothAdapter.STATE_ON) { - boolean isUp = (newState==BluetoothAdapter.STATE_ON); - sendBluetoothStateCallback(isUp); + if (prevState == newState) { // No change. Nothing to do. + return; + } + // Notify all proxy objects first of adapter state change + if (newState == BluetoothAdapter.STATE_BLE_ON || + newState == BluetoothAdapter.STATE_OFF) { + boolean intermediate_off = (prevState == BluetoothAdapter.STATE_TURNING_OFF + && newState == BluetoothAdapter.STATE_BLE_ON); + + if (newState == BluetoothAdapter.STATE_OFF) { + // If Bluetooth is off, send service down event to proxy objects, and unbind + if (DBG) Slog.d(TAG, "Bluetooth is complete send Service Down"); + sendBluetoothServiceDownCallback(); + unbindAndFinish(); sendBleStateChanged(prevState, newState); + // Don't broadcast as it has already been broadcast before + isStandardBroadcast = false; - } else if (newState == BluetoothAdapter.STATE_BLE_TURNING_ON || - newState == BluetoothAdapter.STATE_BLE_TURNING_OFF ) { + } else if (!intermediate_off) { + // connect to GattService + if (DBG) Slog.d(TAG, "Bluetooth is in LE only mode"); + if (mBluetoothGatt != null) { + if (DBG) Slog.d(TAG, "Calling BluetoothGattServiceUp"); + onBluetoothGattServiceUp(); + } else { + if (DBG) Slog.d(TAG, "Binding Bluetooth GATT service"); + if (mContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_BLUETOOTH_LE)) { + Intent i = new Intent(IBluetoothGatt.class.getName()); + doBind(i, mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.CURRENT); + } + } sendBleStateChanged(prevState, newState); + //Don't broadcase this as std intent isStandardBroadcast = false; - } else if (newState == BluetoothAdapter.STATE_TURNING_ON || - newState == BluetoothAdapter.STATE_TURNING_OFF) { + } else if (intermediate_off) { + if (DBG) Slog.d(TAG, "Intermediate off, back to LE only mode"); + // For LE only mode, broadcast as is sendBleStateChanged(prevState, newState); + sendBluetoothStateCallback(false); // BT is OFF for general users + // Broadcast as STATE_OFF + newState = BluetoothAdapter.STATE_OFF; + sendBrEdrDownCallback(); } - - if (isStandardBroadcast) { - if (prevState == BluetoothAdapter.STATE_BLE_ON) { - // Show prevState of BLE_ON as OFF to standard users - prevState = BluetoothAdapter.STATE_OFF; - } - Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED); - intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState); - intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL, BLUETOOTH_PERM); - } + } else if (newState == BluetoothAdapter.STATE_ON) { + boolean isUp = (newState == BluetoothAdapter.STATE_ON); + sendBluetoothStateCallback(isUp); + sendBleStateChanged(prevState, newState); + + } else if (newState == BluetoothAdapter.STATE_BLE_TURNING_ON || + newState == BluetoothAdapter.STATE_BLE_TURNING_OFF ) { + sendBleStateChanged(prevState, newState); + isStandardBroadcast = false; + + } else if (newState == BluetoothAdapter.STATE_TURNING_ON || + newState == BluetoothAdapter.STATE_TURNING_OFF) { + sendBleStateChanged(prevState, newState); + } + + if (isStandardBroadcast) { + if (prevState == BluetoothAdapter.STATE_BLE_ON) { + // Show prevState of BLE_ON as OFF to standard users + prevState = BluetoothAdapter.STATE_OFF; + } + Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED); + intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState); + intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + mContext.sendBroadcastAsUser(intent, UserHandle.ALL, BLUETOOTH_PERM); } } @@ -1838,16 +1898,27 @@ private boolean waitForOnOff(boolean on, boolean off) { return false; } - private void sendDisableMsg() { + private void sendDisableMsg(String packageName) { mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_DISABLE)); + addActiveLog(packageName, false); } - private void sendEnableMsg(boolean quietMode) { + private void sendEnableMsg(boolean quietMode, String packageName) { mHandler.sendMessage(mHandler.obtainMessage(MESSAGE_ENABLE, quietMode ? 1 : 0, 0)); + addActiveLog(packageName, true); } - private void recoverBluetoothServiceFromError() { + private void addActiveLog(String packageName, boolean enable) { + synchronized (mActiveLogs) { + if (mActiveLogs.size() > 10) { + mActiveLogs.remove(); + } + mActiveLogs.add(new ActiveLog(packageName, enable, System.currentTimeMillis())); + } + } + + private void recoverBluetoothServiceFromError(boolean clearBle) { Slog.e(TAG,"recoverBluetoothServiceFromError"); try { mBluetoothLock.readLock().lock(); @@ -1899,6 +1970,10 @@ private void recoverBluetoothServiceFromError() { mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE); mState = BluetoothAdapter.STATE_OFF; + if (clearBle) { + clearBleApps(); + } + mEnable = false; if (mErrorRecoveryRetryCounter++ < MAX_ERROR_RESTART_RETRIES) { @@ -1915,19 +1990,50 @@ private void recoverBluetoothServiceFromError() { public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG); String errorMsg = null; + + boolean protoOut = (args.length > 0) && args[0].startsWith("--proto"); + + if (!protoOut) { + writer.println("Bluetooth Status"); + writer.println(" enabled: " + isEnabled()); + writer.println(" state: " + BluetoothAdapter.nameForState(mState)); + writer.println(" address: " + mAddress); + writer.println(" name: " + mName); + if (mEnable) { + long onDuration = System.currentTimeMillis() - mActiveLogs.getLast().getTime(); + String onDurationString = String.format("%02d:%02d:%02d.%03d", + (int)(onDuration / (1000 * 60 * 60)), + (int)((onDuration / (1000 * 60)) % 60), + (int)((onDuration / 1000) % 60), + (int)(onDuration % 1000)); + writer.println(" time since enabled: " + onDurationString + "\n"); + } + + writer.println("Enable log:"); + for (ActiveLog log : mActiveLogs) { + writer.println(log); + } + + writer.println("\n" + mBleApps.size() + " BLE Apps registered:"); + for (ClientDeathRecipient app : mBleApps.values()) { + writer.println(app.getPackageName()); + } + + writer.flush(); + } + if (mBluetoothBinder == null) { errorMsg = "Bluetooth Service not connected"; } else { try { mBluetoothBinder.dump(fd, args); } catch (RemoteException re) { - errorMsg = "RemoteException while calling Bluetooth Service"; + errorMsg = "RemoteException while dumping Bluetooth Service"; } } if (errorMsg != null) { // Silently return if we are extracting metrics in Protobuf format - if ((args.length > 0) && args[0].startsWith("--proto")) - return; + if (protoOut) return; writer.println(errorMsg); } } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index af6e4ea9f44f..cb1f118f4865 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -867,6 +867,7 @@ protected ConnectivityService(Context context, INetworkManagementService netMana mAvoidBadWifiTracker = createAvoidBadWifiTracker( mContext, mHandler, () -> rematchForAvoidBadWifiUpdate()); + mAvoidBadWifiTracker.start(); } private NetworkRequest createInternetRequestForTransport( @@ -2293,11 +2294,19 @@ private boolean maybeHandleNetworkMonitorMessage(Message msg) { synchronized (mNetworkForNetId) { nai = mNetworkForNetId.get(netId); } - // If captive portal status has changed, update capabilities. + // If captive portal status has changed, update capabilities or disconnect. if (nai != null && (visible != nai.lastCaptivePortalDetected)) { final int oldScore = nai.getCurrentScore(); nai.lastCaptivePortalDetected = visible; nai.everCaptivePortalDetected |= visible; + if (nai.lastCaptivePortalDetected && + Settings.Global.CAPTIVE_PORTAL_MODE_AVOID == getCaptivePortalMode()) { + if (DBG) log("Avoiding captive portal network: " + nai.name()); + nai.asyncChannel.sendMessage( + NetworkAgent.CMD_PREVENT_AUTOMATIC_RECONNECT); + teardownUnneededNetwork(nai); + break; + } updateCapabilities(oldScore, nai, nai.networkCapabilities); } if (!visible) { @@ -2318,6 +2327,12 @@ private boolean maybeHandleNetworkMonitorMessage(Message msg) { return true; } + private int getCaptivePortalMode() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.CAPTIVE_PORTAL_MODE, + Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT); + } + private boolean maybeHandleNetworkAgentInfoMessage(Message msg) { switch (msg.what) { default: diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 6219a1985b09..cffd47c212f0 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -213,7 +213,10 @@ private static String lightStateToString(int state) { private long mMaintenanceStartTime; private int mActiveIdleOpCount; - private PowerManager.WakeLock mActiveIdleWakeLock; + private PowerManager.WakeLock mActiveIdleWakeLock; // held when there are operations in progress + private PowerManager.WakeLock mGoingIdleWakeLock; // held when we are going idle so hardware + // (especially NetworkPolicyManager) can shut + // down. private boolean mJobsActive; private boolean mAlarmsActive; private boolean mReportedMaintenanceActivity; @@ -1000,14 +1003,14 @@ public void onAnyMotionResult(int result) { } } - static final int MSG_WRITE_CONFIG = 1; - static final int MSG_REPORT_IDLE_ON = 2; - static final int MSG_REPORT_IDLE_ON_LIGHT = 3; - static final int MSG_REPORT_IDLE_OFF = 4; - static final int MSG_REPORT_ACTIVE = 5; - static final int MSG_TEMP_APP_WHITELIST_TIMEOUT = 6; - static final int MSG_REPORT_MAINTENANCE_ACTIVITY = 7; - static final int MSG_FINISH_IDLE_OP = 8; + private static final int MSG_WRITE_CONFIG = 1; + private static final int MSG_REPORT_IDLE_ON = 2; + private static final int MSG_REPORT_IDLE_ON_LIGHT = 3; + private static final int MSG_REPORT_IDLE_OFF = 4; + private static final int MSG_REPORT_ACTIVE = 5; + private static final int MSG_TEMP_APP_WHITELIST_TIMEOUT = 6; + private static final int MSG_REPORT_MAINTENANCE_ACTIVITY = 7; + private static final int MSG_FINISH_IDLE_OP = 8; final class MyHandler extends Handler { MyHandler(Looper looper) { @@ -1018,10 +1021,12 @@ final class MyHandler extends Handler { if (DEBUG) Slog.d(TAG, "handleMessage(" + msg.what + ")"); switch (msg.what) { case MSG_WRITE_CONFIG: { + // Does not hold a wakelock. Just let this happen whenever. handleWriteConfigFile(); } break; case MSG_REPORT_IDLE_ON: case MSG_REPORT_IDLE_ON_LIGHT: { + // mGoingIdleWakeLock is held at this point EventLogTags.writeDeviceIdleOnStart(); final boolean deepChanged; final boolean lightChanged; @@ -1046,8 +1051,10 @@ final class MyHandler extends Handler { getContext().sendBroadcastAsUser(mLightIdleIntent, UserHandle.ALL); } EventLogTags.writeDeviceIdleOnComplete(); + mGoingIdleWakeLock.release(); } break; case MSG_REPORT_IDLE_OFF: { + // mActiveIdleWakeLock is held at this point EventLogTags.writeDeviceIdleOffStart("unknown"); final boolean deepChanged = mLocalPowerManager.setDeviceIdleMode(false); final boolean lightChanged = mLocalPowerManager.setLightDeviceIdleMode(false); @@ -1073,6 +1080,7 @@ final class MyHandler extends Handler { EventLogTags.writeDeviceIdleOffComplete(); } break; case MSG_REPORT_ACTIVE: { + // The device is awake at this point, so no wakelock necessary. String activeReason = (String)msg.obj; int activeUid = msg.arg1; EventLogTags.writeDeviceIdleOffStart( @@ -1094,10 +1102,12 @@ final class MyHandler extends Handler { EventLogTags.writeDeviceIdleOffComplete(); } break; case MSG_TEMP_APP_WHITELIST_TIMEOUT: { + // TODO: What is keeping the device awake at this point? Does it need to be? int uid = msg.arg1; checkTempAppWhitelistTimeout(uid); } break; case MSG_REPORT_MAINTENANCE_ACTIVITY: { + // TODO: What is keeping the device awake at this point? Does it need to be? boolean active = (msg.arg1 == 1); final int size = mMaintenanceActivityListeners.beginBroadcast(); try { @@ -1113,6 +1123,7 @@ final class MyHandler extends Handler { } } break; case MSG_FINISH_IDLE_OP: { + // mActiveIdleWakeLock is held at this point decActiveIdleOps(); } break; } @@ -1371,6 +1382,9 @@ public void onBootPhase(int phase) { mActiveIdleWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "deviceidle_maint"); mActiveIdleWakeLock.setReferenceCounted(false); + mGoingIdleWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, + "deviceidle_going_idle"); + mGoingIdleWakeLock.setReferenceCounted(true); mConnectivityService = (ConnectivityService)ServiceManager.getService( Context.CONNECTIVITY_SERVICE); mLocalAlarmManager = getLocalService(AlarmManagerService.LocalService.class); @@ -1913,6 +1927,7 @@ void stepLightIdleStateLocked(String reason) { mLightState = LIGHT_STATE_IDLE; EventLogTags.writeDeviceIdleLight(mLightState, reason); addEvent(EVENT_LIGHT_IDLE); + mGoingIdleWakeLock.acquire(); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON_LIGHT); break; case LIGHT_STATE_IDLE: @@ -2038,6 +2053,7 @@ void stepIdleStateLocked(String reason) { } EventLogTags.writeDeviceIdle(mState, reason); addEvent(EVENT_DEEP_IDLE); + mGoingIdleWakeLock.acquire(); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON); break; case STATE_IDLE: diff --git a/services/core/java/com/android/server/DiskStatsService.java b/services/core/java/com/android/server/DiskStatsService.java index 8ca675a904c4..962ac6fc540f 100644 --- a/services/core/java/com/android/server/DiskStatsService.java +++ b/services/core/java/com/android/server/DiskStatsService.java @@ -22,6 +22,15 @@ import android.os.StatFs; import android.os.SystemClock; import android.os.storage.StorageManager; +import android.util.Log; + +import com.android.server.storage.DiskStatsFileLogger; +import com.android.server.storage.DiskStatsLoggingService; + +import libcore.io.IoUtils; + +import org.json.JSONException; +import org.json.JSONObject; import java.io.File; import java.io.FileDescriptor; @@ -35,11 +44,13 @@ */ public class DiskStatsService extends Binder { private static final String TAG = "DiskStatsService"; + private static final String DISKSTATS_DUMP_FILE = "/data/system/diskstats_cache.json"; private final Context mContext; public DiskStatsService(Context context) { mContext = context; + DiskStatsLoggingService.schedule(context); } @Override @@ -84,6 +95,8 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("File-based Encryption: true"); } + reportCachedValues(pw); + // TODO: Read /proc/yaffs and report interesting values; // add configurable (through args) performance test parameters. } @@ -114,4 +127,36 @@ private void reportFreeSpace(File path, String name, PrintWriter pw) { return; } } + + private void reportCachedValues(PrintWriter pw) { + try { + String jsonString = IoUtils.readFileAsString(DISKSTATS_DUMP_FILE); + JSONObject json = new JSONObject(jsonString); + pw.print("App Size: "); + pw.println(json.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)); + pw.print("App Cache Size: "); + pw.println(json.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)); + pw.print("Photos Size: "); + pw.println(json.getLong(DiskStatsFileLogger.PHOTOS_KEY)); + pw.print("Videos Size: "); + pw.println(json.getLong(DiskStatsFileLogger.VIDEOS_KEY)); + pw.print("Audio Size: "); + pw.println(json.getLong(DiskStatsFileLogger.AUDIO_KEY)); + pw.print("Downloads Size: "); + pw.println(json.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)); + pw.print("System Size: "); + pw.println(json.getLong(DiskStatsFileLogger.SYSTEM_KEY)); + pw.print("Other Size: "); + pw.println(json.getLong(DiskStatsFileLogger.MISC_KEY)); + pw.print("Package Names: "); + pw.println(json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY)); + pw.print("App Sizes: "); + pw.println(json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY)); + pw.print("Cache Sizes: "); + pw.println(json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY)); + } catch (IOException | JSONException e) { + Log.w(TAG, "exception reading diskstats cache file", e); + } + } + } diff --git a/services/core/java/com/android/server/DockObserver.java b/services/core/java/com/android/server/DockObserver.java index 07aa565642c6..122074ba4dac 100644 --- a/services/core/java/com/android/server/DockObserver.java +++ b/services/core/java/com/android/server/DockObserver.java @@ -167,10 +167,17 @@ private void handleDockStateChange() { intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); intent.putExtra(Intent.EXTRA_DOCK_STATE, mReportedDockState); + boolean dockSoundsEnabled = Settings.Global.getInt(cr, + Settings.Global.DOCK_SOUNDS_ENABLED, 1) == 1; + boolean dockSoundsEnabledWhenAccessibility = Settings.Global.getInt(cr, + Settings.Global.DOCK_SOUNDS_ENABLED_WHEN_ACCESSIBILITY, 1) == 1; + boolean accessibilityEnabled = Settings.Secure.getInt(cr, + Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1; + // Play a sound to provide feedback to confirm dock connection. // Particularly useful for flaky contact pins... - if (Settings.Global.getInt(cr, - Settings.Global.DOCK_SOUNDS_ENABLED, 1) == 1) { + if ((dockSoundsEnabled) || + (accessibilityEnabled && dockSoundsEnabledWhenAccessibility)) { String whichSound = null; if (mReportedDockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) { if ((previousDockState == Intent.EXTRA_DOCK_STATE_DESK) || diff --git a/services/core/java/com/android/server/HardwarePropertiesManagerService.java b/services/core/java/com/android/server/HardwarePropertiesManagerService.java index 23cf64a031af..36a16cd0a18b 100644 --- a/services/core/java/com/android/server/HardwarePropertiesManagerService.java +++ b/services/core/java/com/android/server/HardwarePropertiesManagerService.java @@ -16,6 +16,8 @@ package com.android.server; +import android.Manifest; +import android.app.ActivityManager; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.PackageManager; @@ -80,8 +82,9 @@ public float[] getFanSpeeds(String callingPackage) throws SecurityException { * * @param callingPackage The calling package name. * - * @throws SecurityException if something other than the profile or device owner, or the - * current VR service tries to retrieve information provided by this service. + * @throws SecurityException if something other than the profile or device owner, the + * current VR service, or a caller holding the {@link Manifest.permission#DEVICE_POWER} + * permission tries to retrieve information provided by this service. */ private void enforceHardwarePropertiesRetrievalAllowed(String callingPackage) throws SecurityException { @@ -100,9 +103,11 @@ private void enforceHardwarePropertiesRetrievalAllowed(String callingPackage) final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class); final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); if (!dpm.isDeviceOwnerApp(callingPackage) && !dpm.isProfileOwnerApp(callingPackage) - && !vrService.isCurrentVrListener(callingPackage, userId)) { - throw new SecurityException("The caller is not a device or profile owner or bound " - + "VrListenerService."); + && !vrService.isCurrentVrListener(callingPackage, userId) + && mContext.checkCallingOrSelfPermission(Manifest.permission.DEVICE_POWER) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("The caller is not a device or profile owner, bound " + + "VrListenerService, or holding the DEVICE_POWER permission."); } } } diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index da12962d0e96..6ed702d4c7b0 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -597,6 +597,20 @@ private void migrateOldData() { 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/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java index 33f92344f615..54b2a25aa3bb 100644 --- a/services/core/java/com/android/server/MmsServiceBroker.java +++ b/services/core/java/com/android/server/MmsServiceBroker.java @@ -17,6 +17,7 @@ package com.android.server; import android.Manifest; +import android.app.ActivityManagerInternal; import android.app.AppOpsManager; import android.app.PendingIntent; import android.content.ComponentName; @@ -499,13 +500,21 @@ public boolean getAutoPersisting() throws RemoteException { */ private Uri adjustUriForUserAndGrantPermission(Uri contentUri, String action, int permission) { + final Intent grantIntent = new Intent(); + grantIntent.setData(contentUri); + grantIntent.setFlags(permission); + + final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getCallingUserId(); if (callingUserId != UserHandle.USER_SYSTEM) { contentUri = ContentProvider.maybeAddUserId(contentUri, callingUserId); } + long token = Binder.clearCallingIdentity(); try { - mContext.grantUriPermission(PHONE_PACKAGE_NAME, contentUri, permission); + LocalServices.getService(ActivityManagerInternal.class) + .grantUriPermissionFromIntent(callingUid, PHONE_PACKAGE_NAME, + grantIntent, UserHandle.USER_SYSTEM); // Grant permission for the carrier app. Intent intent = new Intent(action); @@ -514,7 +523,9 @@ private Uri adjustUriForUserAndGrantPermission(Uri contentUri, String action, List carrierPackages = telephonyManager.getCarrierPackageNamesForIntent( intent); if (carrierPackages != null && carrierPackages.size() == 1) { - mContext.grantUriPermission(carrierPackages.get(0), contentUri, permission); + LocalServices.getService(ActivityManagerInternal.class) + .grantUriPermissionFromIntent(callingUid, carrierPackages.get(0), + grantIntent, UserHandle.USER_SYSTEM); } } finally { Binder.restoreCallingIdentity(token); 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 @@ private ApplicationInfo getCameraInfo(int userHandle) { if (isResolverActivity(cameraResolveInfo.activityInfo)) { + if (DEBUG) { + Slog.v(TAG, "cameraIntent returned resolverActivity"); + } return null; } diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java index 904c967acdc8..0aad4c74b051 100644 --- a/services/core/java/com/android/server/SystemServiceManager.java +++ b/services/core/java/com/android/server/SystemServiceManager.java @@ -36,6 +36,7 @@ public class SystemServiceManager { private final Context mContext; private boolean mSafeMode; + private boolean mRuntimeRestarted; // Services that should receive lifecycle events. private final ArrayList mServices = new ArrayList(); @@ -249,6 +250,17 @@ public boolean isSafeMode() { return mSafeMode; } + /** + * @return true if runtime was restarted, false if it's normal boot + */ + public boolean isRuntimeRestarted() { + return mRuntimeRestarted; + } + + void setRuntimeRestarted(boolean runtimeRestarted) { + mRuntimeRestarted = runtimeRestarted; + } + /** * Outputs the state of this manager to the System log. */ diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 4c0ee4e3b797..60b8623fabf7 100755 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -372,7 +372,7 @@ ComponentName startServiceLocked(IApplicationThread caller, Intent service, Stri // we do not start the service and launch a review activity if the calling app // is in the foreground passing it a pending intent to start the service when // review is completed. - if (Build.PERMISSIONS_REVIEW_REQUIRED) { + if (mAm.mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { if (!requestStartTargetPermissionsReviewIfNeededLocked(r, callingPackage, callingUid, service, callerFg, userId)) { return null; @@ -916,7 +916,7 @@ int bindServiceLocked(IApplicationThread caller, IBinder token, Intent service, // we schedule binding to the service but do not start its process, then // we launch a review activity to which is passed a callback to invoke // when done to start the bound service's process to completing the binding. - if (Build.PERMISSIONS_REVIEW_REQUIRED) { + if (mAm.mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { if (mAm.getPackageManagerInternalLocked().isPermissionsReviewRequired( s.packageName, s.userId)) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 1e4b778edfd3..72efcbce5a7a 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1221,6 +1221,15 @@ private class Identity { /** * Set while we are wanting to sleep, to prevent any * activities from being started/resumed. + * + * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping. + * + * Currently mSleeping is set to true when transitioning into the sleep state, and remains true + * while in the sleep state until there is a pending transition out of sleep, in which case + * mSleeping is set to false, and remains false while awake. + * + * Whether mSleeping can quickly toggled between true/false without the device actually + * display changing states is undefined. */ private boolean mSleeping = false; @@ -1546,8 +1555,8 @@ public void binderDied() { static final int NOTIFY_PINNED_STACK_ANIMATION_ENDED_LISTENERS_MSG = 66; static final int NOTIFY_FORCED_RESIZABLE_MSG = 67; static final int NOTIFY_ACTIVITY_DISMISSING_DOCKED_STACK_MSG = 68; - static final int VR_MODE_APPLY_IF_NEEDED_MSG = 69; - static final int SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG = 70; + static final int SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG = 69; + static final int NOTIFY_VR_SLEEPING_MSG = 70; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_BROADCAST_QUEUE_MSG = 200; @@ -1595,6 +1604,8 @@ public void binderDied() { // being called for multiwindow assist in a single session. private int mViSessionId = 1000; + final boolean mPermissionReviewRequired; + final class KillHandler extends Handler { static final int KILL_PROCESS_GROUP_MSG = 4000; @@ -2336,6 +2347,9 @@ public void handleMessage(Message msg) { } break; case VR_MODE_CHANGE_MSG: { VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class); + if (vrService == null) { + break; + } final ActivityRecord r = (ActivityRecord) msg.obj; boolean vrMode; ComponentName requestedPackage; @@ -2371,14 +2385,8 @@ public void handleMessage(Message msg) { } } vrService.setVrMode(vrMode, requestedPackage, userId, callingPackage); - } break; - case VR_MODE_APPLY_IF_NEEDED_MSG: { - final ActivityRecord r = (ActivityRecord) msg.obj; - final boolean needsVrMode = r != null && r.requestedVrComponent != null; - if (needsVrMode) { - applyVrMode(msg.arg1 == 1, r.requestedVrComponent, r.userId, - r.info.getComponentName(), false); - } + } case NOTIFY_VR_SLEEPING_MSG: { + notifyVrManagerOfSleepState(msg.arg1 != 0); } break; } } @@ -2642,6 +2650,9 @@ public ActivityManagerService(Context systemContext) { Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass()); + mPermissionReviewRequired = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_permissionReviewRequired); + mHandlerThread = new ServiceThread(TAG, android.os.Process.THREAD_PRIORITY_FOREGROUND, false /*allowIo*/); mHandlerThread.start(); @@ -3178,20 +3189,17 @@ final void applyUpdateVrModeLocked(ActivityRecord r) { mHandler.obtainMessage(VR_MODE_CHANGE_MSG, 0, 0, r)); } - private void applyVrModeIfNeededLocked(ActivityRecord r, boolean enable) { + private void sendNotifyVrManagerOfSleepState(boolean isSleeping) { mHandler.sendMessage( - mHandler.obtainMessage(VR_MODE_APPLY_IF_NEEDED_MSG, enable ? 1 : 0, 0, r)); + mHandler.obtainMessage(NOTIFY_VR_SLEEPING_MSG, isSleeping ? 1 : 0, 0)); } - private void applyVrMode(boolean enabled, ComponentName packageName, int userId, - ComponentName callingPackage, boolean immediate) { - VrManagerInternal vrService = - LocalServices.getService(VrManagerInternal.class); - if (immediate) { - vrService.setVrModeImmediate(enabled, packageName, userId, callingPackage); - } else { - vrService.setVrMode(enabled, packageName, userId, callingPackage); + private void notifyVrManagerOfSleepState(boolean isSleeping) { + final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class); + if (vrService == null) { + return; } + vrService.onSleepStateChanged(isSleeping); } final void showAskCompatModeDialogLocked(ActivityRecord r) { @@ -6325,8 +6333,19 @@ final boolean forceStopPackageLocked(String packageName, int appId, } private final ProcessRecord removeProcessNameLocked(final String name, final int uid) { - ProcessRecord old = mProcessNames.remove(name, uid); - if (old != null) { + return removeProcessNameLocked(name, uid, null); + } + + private final ProcessRecord removeProcessNameLocked(final String name, final int uid, + final ProcessRecord expecting) { + ProcessRecord old = mProcessNames.get(name, uid); + // Only actually remove when the currently recorded value matches the + // record that we expected; if it doesn't match then we raced with a + // newly created process and we don't want to destroy the new one. + if ((expecting == null) || (old == expecting)) { + mProcessNames.remove(name, uid); + } + if (old != null && old.uidRecord != null) { old.uidRecord.numProcs--; if (old.uidRecord.numProcs == 0) { // No more processes using this uid, tell clients it is gone. @@ -6486,6 +6505,7 @@ private final boolean attachApplicationLocked(IApplicationThread thread, // the pid if we are running in multiple processes, or just pull the // next app record if we are emulating process with anonymous threads. ProcessRecord app; + long startTime = SystemClock.uptimeMillis(); if (pid != MY_PID && pid >= 0) { synchronized (mPidsSelfLocked) { app = mPidsSelfLocked.get(pid); @@ -6564,6 +6584,8 @@ private final boolean attachApplicationLocked(IApplicationThread thread, mHandler.sendMessageDelayed(msg, CONTENT_PROVIDER_PUBLISH_TIMEOUT); } + checkTime(startTime, "attachApplicationLocked: before bindApplication"); + if (!normalMode) { Slog.i(TAG, "Launching preboot mode app: " + app); } @@ -6622,7 +6644,8 @@ private final boolean attachApplicationLocked(IApplicationThread thread, profileFd = profileFd.dup(); } ProfilerInfo profilerInfo = profileFile == null ? null - : new ProfilerInfo(profileFile, profileFd, samplingInterval, profileAutoStop); + : new ProfilerInfo(profileFile, profileFd, samplingInterval, profileAutoStop); + checkTime(startTime, "attachApplicationLocked: immediately before bindApplication"); thread.bindApplication(processName, appInfo, providers, app.instrumentationClass, profilerInfo, app.instrumentationArguments, app.instrumentationWatcher, app.instrumentationUiAutomationConnection, testMode, @@ -6630,8 +6653,10 @@ private final boolean attachApplicationLocked(IApplicationThread thread, isRestrictedBackupMode || !normalMode, app.persistent, new Configuration(mConfiguration), app.compat, getCommonServicesLocked(app.isolated), - mCoreSettingsObserver.getCoreSettingsLocked()); + mCoreSettingsObserver.getCoreSettingsLocked()); + checkTime(startTime, "attachApplicationLocked: immediately after bindApplication"); updateLruProcessLocked(app, false, null); + checkTime(startTime, "attachApplicationLocked: after updateLruProcessLocked"); app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis(); } catch (Exception e) { // todo: Yikes! What should we do? For now we will try to @@ -6670,6 +6695,7 @@ private final boolean attachApplicationLocked(IApplicationThread thread, if (!badApp) { try { didSomething |= mServices.attachApplicationLocked(app, processName); + checkTime(startTime, "attachApplicationLocked: after mServices.attachApplicationLocked"); } catch (Exception e) { Slog.wtf(TAG, "Exception thrown starting services in " + app, e); badApp = true; @@ -6680,6 +6706,7 @@ private final boolean attachApplicationLocked(IApplicationThread thread, if (!badApp && isPendingBroadcastProcessLocked(pid)) { try { didSomething |= sendPendingBroadcastsLocked(app); + checkTime(startTime, "attachApplicationLocked: after sendPendingBroadcastsLocked"); } catch (Exception e) { // If the app died trying to launch the receiver we declare it 'bad' Slog.wtf(TAG, "Exception thrown dispatching broadcasts in " + app, e); @@ -6711,6 +6738,7 @@ private final boolean attachApplicationLocked(IApplicationThread thread, if (!didSomething) { updateOomAdjLocked(); + checkTime(startTime, "attachApplicationLocked: after updateOomAdjLocked"); } return true; @@ -6803,7 +6831,6 @@ public void keyguardGoingAway(int flags) { // Some stack visibility might change (e.g. docked stack) mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); - applyVrModeIfNeededLocked(mFocusedActivity, true); } } } finally { @@ -10901,7 +10928,7 @@ && isValidSingletonCall(r.uid, cpi.applicationInfo.uid)) { // If permissions need a review before any of the app components can run, // we return no provider and launch a review activity if the calling app // is in the foreground. - if (Build.PERMISSIONS_REVIEW_REQUIRED) { + if (mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { if (!requestTargetProviderPermissionsReviewIfNeededLocked(cpi, r, userId)) { return null; } @@ -11733,6 +11760,7 @@ void updateSleepIfNeededLocked() { startTimeTrackingFocusedActivityLocked(); mTopProcessState = ActivityManager.PROCESS_STATE_TOP; mStackSupervisor.comeOutOfSleepIfNeededLocked(); + sendNotifyVrManagerOfSleepState(false); updateOomAdjLocked(); } else if (!mSleeping && shouldSleepLocked()) { mSleeping = true; @@ -11741,6 +11769,7 @@ void updateSleepIfNeededLocked() { } mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING; mStackSupervisor.goingToSleepLocked(); + sendNotifyVrManagerOfSleepState(true); updateOomAdjLocked(); // Initialize the wake times of all processes. @@ -12205,6 +12234,9 @@ public void requestBugReport(int bugreportType) { case ActivityManager.BUGREPORT_OPTION_WEAR: service = "bugreportwear"; break; + case ActivityManager.BUGREPORT_OPTION_TELEPHONY: + service = "bugreportelefony"; + break; } if (service == null) { throw new IllegalArgumentException("Provided bugreport type is not correct, value: " @@ -17099,7 +17131,7 @@ private final boolean cleanUpApplicationRecordLocked(ProcessRecord app, if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG_CLEANUP, "Removing non-persistent process during cleanup: " + app); if (!replacingPid) { - removeProcessNameLocked(app.processName, app.uid); + removeProcessNameLocked(app.processName, app.uid, app); } if (mHeavyWeightProcess == app) { mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG, @@ -21092,34 +21124,9 @@ final void updateOomAdjLocked() { int numBServices = 0; for (int i=N-1; i>=0; i--) { ProcessRecord app = mLruProcesses.get(i); - if (mEnableBServicePropagation && app.serviceb - && (app.curAdj == ProcessList.SERVICE_B_ADJ)) { - numBServices++; - for (int s = app.services.size() - 1; s >= 0; s--) { - ServiceRecord sr = app.services.valueAt(s); - if (DEBUG_OOM_ADJ) Slog.d(TAG,"app.processName = " + app.processName - + " serviceb = " + app.serviceb + " s = " + s + " sr.lastActivity = " - + sr.lastActivity + " packageName = " + sr.packageName - + " processName = " + sr.processName); - if (SystemClock.uptimeMillis() - sr.lastActivity - < mMinBServiceAgingTime) { - if (DEBUG_OOM_ADJ) { - Slog.d(TAG,"Not aged enough!!!"); - } - continue; - } - if (serviceLastActivity == 0) { - serviceLastActivity = sr.lastActivity; - selectedAppRecord = app; - } else if (sr.lastActivity < serviceLastActivity) { - serviceLastActivity = sr.lastActivity; - selectedAppRecord = app; - } - } + if (app == null) { + continue; } - if (DEBUG_OOM_ADJ && selectedAppRecord != null) Slog.d(TAG, - "Identified app.processName = " + selectedAppRecord.processName - + " app.pid = " + selectedAppRecord.pid); if (!app.killedByAm && app.thread != null) { app.procStateChanged = false; computeOomAdjLocked(app, ProcessList.UNKNOWN_ADJ, TOP_APP, true, now); @@ -21303,6 +21310,9 @@ final void updateOomAdjLocked() { int curLevel = ComponentCallbacks2.TRIM_MEMORY_COMPLETE; for (int i=N-1; i>=0; i--) { ProcessRecord app = mLruProcesses.get(i); + if (app == null) { + continue; + } if (allChanged || app.procStateChanged) { setProcessTrackerStateLocked(app, trackerMemFactor, now); app.procStateChanged = false; @@ -22066,6 +22076,15 @@ public boolean stopBinderTrackingAndDump(ParcelFileDescriptor fd) throws RemoteE } private final class LocalService extends ActivityManagerInternal { + @Override + public void grantUriPermissionFromIntent(int callingUid, String targetPkg, Intent intent, + int targetUserId) { + synchronized (ActivityManagerService.this) { + ActivityManagerService.this.grantUriPermissionFromIntentLocked(callingUid, + targetPkg, intent, null, targetUserId); + } + } + @Override public String checkContentProviderAccess(String authority, int userId) { return ActivityManagerService.this.checkContentProviderAccess(authority, userId); @@ -22087,21 +22106,6 @@ public int startIsolatedProcess(String entryPoint, String[] entryPointArgs, public SleepToken acquireSleepToken(String tag) { Preconditions.checkNotNull(tag); - ComponentName requestedVrService = null; - ComponentName callingVrActivity = null; - int userId = -1; - synchronized (ActivityManagerService.this) { - if (mFocusedActivity != null) { - requestedVrService = mFocusedActivity.requestedVrComponent; - callingVrActivity = mFocusedActivity.info.getComponentName(); - userId = mFocusedActivity.userId; - } - } - - if (requestedVrService != null) { - applyVrMode(false, requestedVrService, userId, callingVrActivity, true); - } - synchronized (ActivityManagerService.this) { SleepTokenImpl token = new SleepTokenImpl(tag); mSleepTokens.add(token); diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 3f69712efa6f..55c4698528a8 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -710,12 +710,7 @@ boolean isResolverActivity() { AttributeCache.Entry ent = AttributeCache.instance().get(packageName, realTheme, com.android.internal.R.styleable.Window, userId); final boolean translucent = ent != null && (ent.array.getBoolean( - com.android.internal.R.styleable.Window_windowIsTranslucent, false) - || (!ent.array.hasValue( - com.android.internal.R.styleable.Window_windowIsTranslucent) - && ent.array.getBoolean( - com.android.internal.R.styleable.Window_windowSwipeToDismiss, - false))); + com.android.internal.R.styleable.Window_windowIsTranslucent, false)); fullscreen = ent != null && !ent.array.getBoolean( com.android.internal.R.styleable.Window_windowIsFloating, false) && !translucent; @@ -1389,7 +1384,8 @@ void setTaskDescription(TaskDescription _taskDescription) { if (_taskDescription.getIconFilename() == null && (icon = _taskDescription.getIcon()) != null) { final String iconFilename = createImageFilename(createTime, task.taskId); - final File iconFile = new File(TaskPersister.getUserImagesDir(userId), iconFilename); + final File iconFile = new File(TaskPersister.getUserImagesDir(task.userId), + iconFilename); final String iconFilePath = iconFile.getAbsolutePath(); service.mRecentTasks.saveImage(icon, iconFilePath); _taskDescription.setIconFilename(iconFilePath); diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 64c9a785f68b..aacc9de8896d 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -416,7 +416,8 @@ final int startActivityLocked(IApplicationThread caller, Intent intent, Intent e // If permissions need a review before any of the app components can run, we // launch the review activity and pass a pending intent to start the activity // we are to launching now after the review is completed. - if (Build.PERMISSIONS_REVIEW_REQUIRED && aInfo != null) { + if ((mService.mPermissionReviewRequired + || Build.PERMISSIONS_REVIEW_REQUIRED) && aInfo != null) { if (mService.getPackageManagerInternalLocked().isPermissionsReviewRequired( aInfo.packageName, userId)) { IIntentSender target = mService.getIntentSenderLocked( @@ -1077,6 +1078,10 @@ private int startActivityUnchecked(final ActivityRecord r, ActivityRecord source top.task.setIntent(mStartActivity); } ActivityStack.logStartActivity(AM_NEW_INTENT, mStartActivity, top.task); + + if (shouldActivityBeBroughtToFront(mReusedActivity)) { + mStartActivity.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); + } top.deliverNewIntentLocked(mCallingUid, mStartActivity.intent, mStartActivity.launchedFromPackage); } @@ -1509,6 +1514,16 @@ private ActivityRecord getReusableIntentActivity() { return intentActivity; } + private boolean shouldActivityBeBroughtToFront(ActivityRecord intentActivity) { + final ActivityStack focusStack = mSupervisor.getFocusedStack(); + ActivityRecord curTop = (focusStack == null) + ? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop); + + return curTop != null + && (curTop.task != intentActivity.task || curTop.task != focusStack.topTask()) + && !mAvoidMoveToFront; + } + private ActivityRecord setTargetStackAndMoveToFrontIfNeeded(ActivityRecord intentActivity) { mTargetStack = intentActivity.task.stack; mTargetStack.mLastPausedActivity = null; @@ -1517,13 +1532,8 @@ private ActivityRecord setTargetStackAndMoveToFrontIfNeeded(ActivityRecord inten // the same behavior as if a new instance was being started, which means not bringing it // to the front if the caller is not itself in the front. final ActivityStack focusStack = mSupervisor.getFocusedStack(); - ActivityRecord curTop = (focusStack == null) - ? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop); - if (curTop != null - && (curTop.task != intentActivity.task || curTop.task != focusStack.topTask()) - && !mAvoidMoveToFront) { - mStartActivity.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); + if (shouldActivityBeBroughtToFront(intentActivity)) { if (mSourceRecord == null || (mSourceStack.topActivity() != null && mSourceStack.topActivity().task == mSourceRecord.task)) { // We really do want to push this one into the user's face, right now. diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 8b8e2c4097c2..8f2e05f7dc03 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -226,12 +226,13 @@ public void enqueueOrderedBroadcastLocked(BroadcastRecord r) { } public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) { + final Intent intent = r.intent; for (int i = mParallelBroadcasts.size() - 1; i >= 0; i--) { final Intent curIntent = mParallelBroadcasts.get(i).intent; - if (r.intent.filterEquals(curIntent)) { + if (intent.filterEquals(curIntent)) { if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "***** DROPPING PARALLEL [" - + mQueueName + "]: " + r.intent); + + mQueueName + "]: " + intent); mParallelBroadcasts.set(i, r); return true; } @@ -240,11 +241,12 @@ public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) { } public final boolean replaceOrderedBroadcastLocked(BroadcastRecord r) { + final Intent intent = r.intent; for (int i = mOrderedBroadcasts.size() - 1; i > 0; i--) { - if (r.intent.filterEquals(mOrderedBroadcasts.get(i).intent)) { + if (intent.filterEquals(mOrderedBroadcasts.get(i).intent)) { if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "***** DROPPING ORDERED [" - + mQueueName + "]: " + r.intent); + + mQueueName + "]: " + intent); mOrderedBroadcasts.set(i, r); return true; } @@ -624,7 +626,7 @@ private void deliverToRegisteredReceiverLocked(BroadcastRecord r, // the broadcast and if the calling app is in the foreground and the broadcast is // explicit we launch the review UI passing it a pending intent to send the skipped // broadcast. - if (Build.PERMISSIONS_REVIEW_REQUIRED) { + if (mService.mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { if (!requestStartTargetPermissionsReviewIfNeededLocked(r, filter.packageName, filter.owningUserId)) { r.delivery[index] = BroadcastRecord.DELIVERY_SKIPPED; @@ -1130,7 +1132,8 @@ final void processNextBroadcast(boolean fromMsg) { // the broadcast and if the calling app is in the foreground and the broadcast is // explicit we launch the review UI passing it a pending intent to send the skipped // broadcast. - if (Build.PERMISSIONS_REVIEW_REQUIRED && !skip) { + if ((mService.mPermissionReviewRequired + || Build.PERMISSIONS_REVIEW_REQUIRED) && !skip) { if (!requestStartTargetPermissionsReviewIfNeededLocked(r, info.activityInfo.packageName, UserHandle.getUserId( info.activityInfo.applicationInfo.uid))) { diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index 9dd07a9a9f90..73a17c613c4d 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -42,6 +42,7 @@ final class CoreSettingsObserver extends ContentObserver { String, Class>(); static { sSecureSettingToTypeMap.put(Settings.Secure.LONG_PRESS_TIMEOUT, int.class); + sSecureSettingToTypeMap.put(Settings.Secure.MULTI_PRESS_TIMEOUT, int.class); // add other secure settings here... sSystemSettingToTypeMap.put(Settings.System.TIME_12_24, String.class); diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 4bc148bef290..4fd26b38b185 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -46,6 +46,7 @@ import android.annotation.NonNull; import android.annotation.UserIdInt; import android.app.ActivityManager; +import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.Dialog; import android.app.IStopUserCallback; @@ -54,6 +55,7 @@ import android.content.Context; import android.content.IIntentReceiver; import android.content.Intent; +import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.os.BatteryStats; @@ -112,7 +114,7 @@ final class UserController { // Amount of time we wait for observers to handle a user switch before // giving up on them and unfreezing the screen. - static final int USER_SWITCH_TIMEOUT = 2 * 1000; + static final int USER_SWITCH_TIMEOUT = 3 * 1000; private final ActivityManagerService mService; private final Handler mHandler; @@ -239,11 +241,14 @@ private void finishUserBoot(UserState uss, IIntentReceiver resultTo) { // storage is already unlocked. if (uss.setState(STATE_BOOTING, STATE_RUNNING_LOCKED)) { getUserManagerInternal().setUserState(userId, uss.state); - - int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000); - MetricsLogger.histogram(mService.mContext, "framework_locked_boot_completed", - uptimeSeconds); - + // Do not report secondary users, runtime restarts or first boot/upgrade + if (userId == UserHandle.USER_SYSTEM + && !mService.mSystemServiceManager.isRuntimeRestarted() + && !isFirstBootOrUpgrade()) { + int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000); + MetricsLogger.histogram(mService.mContext, "framework_locked_boot_completed", + uptimeSeconds); + } Intent intent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED, null); intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT @@ -415,8 +420,14 @@ public void performReceive(Intent intent, int resultCode, } Slog.d(TAG, "Sending BOOT_COMPLETE user #" + userId); - int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000); - MetricsLogger.histogram(mService.mContext, "framework_boot_completed", uptimeSeconds); + // Do not report secondary users, runtime restarts or first boot/upgrade + if (userId == UserHandle.USER_SYSTEM + && !mService.mSystemServiceManager.isRuntimeRestarted() + && !isFirstBootOrUpgrade()) { + int uptimeSeconds = (int) (SystemClock.elapsedRealtime() / 1000); + MetricsLogger + .histogram(mService.mContext, "framework_boot_completed", uptimeSeconds); + } final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT @@ -427,6 +438,15 @@ public void performReceive(Intent intent, int resultCode, } } + private static boolean isFirstBootOrUpgrade() { + IPackageManager pm = AppGlobals.getPackageManager(); + try { + return pm.isFirstBoot() || pm.isUpgrade(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + int stopUser(final int userId, final boolean force, final IStopUserCallback callback) { if (mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL) != PackageManager.PERMISSION_GRANTED) { @@ -1085,6 +1105,7 @@ void dispatchUserSwitch(final UserState uss, final int oldUserId, final int newU mCurWaitingUserSwitchCallbacks = curWaitingUserSwitchCallbacks; } final AtomicInteger waitingCallbacksCount = new AtomicInteger(observerCount); + final long dispatchStartedTime = SystemClock.elapsedRealtime(); for (int i = 0; i < observerCount; i++) { try { // Prepend with unique prefix to guarantee that keys are unique @@ -1096,6 +1117,11 @@ void dispatchUserSwitch(final UserState uss, final int oldUserId, final int newU @Override public void sendResult(Bundle data) throws RemoteException { synchronized (mService) { + long delay = SystemClock.elapsedRealtime() - dispatchStartedTime; + if (delay > USER_SWITCH_TIMEOUT) { + Slog.wtf(TAG, "User switch timeout: observer " + name + + " sent result after " + delay + " ms"); + } // Early return if this session is no longer valid if (curWaitingUserSwitchCallbacks != mCurWaitingUserSwitchCallbacks) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 23428490bf37..8e350585acb2 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -4220,21 +4220,23 @@ public boolean setIndex(int index, int device, String caller) { mIndexMap.put(device, index); changed = oldIndex != index; - if (changed) { - // Apply change to all streams using this one as alias - // if changing volume of current device, also change volume of current - // device on aliased stream - boolean currentDevice = (device == getDeviceForStream(mStreamType)); - int numStreamTypes = AudioSystem.getNumStreamTypes(); - for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { - if (streamType != mStreamType && - mStreamVolumeAlias[streamType] == mStreamType) { - int scaledIndex = rescaleIndex(index, mStreamType, streamType); - mStreamStates[streamType].setIndex(scaledIndex, device, caller); - if (currentDevice) { - mStreamStates[streamType].setIndex(scaledIndex, - getDeviceForStream(streamType), caller); - } + // Apply change to all streams using this one as alias if: + // - the index actually changed OR + // - there is no volume index stored for this device on alias stream. + // If changing volume of current device, also change volume of current + // device on aliased stream + final boolean currentDevice = (device == getDeviceForStream(mStreamType)); + final int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) { + final VolumeStreamState aliasStreamState = mStreamStates[streamType]; + if (streamType != mStreamType && + mStreamVolumeAlias[streamType] == mStreamType && + (changed || !aliasStreamState.hasIndexForDevice(device))) { + final int scaledIndex = rescaleIndex(index, mStreamType, streamType); + aliasStreamState.setIndex(scaledIndex, device, caller); + if (currentDevice) { + aliasStreamState.setIndex(scaledIndex, + getDeviceForStream(streamType), caller); } } } @@ -4271,6 +4273,12 @@ public int getIndex(int device) { } } + public boolean hasIndexForDevice(int device) { + synchronized (VolumeStreamState.class) { + return (mIndexMap.get(device, -1) != -1); + } + } + public int getMaxIndex() { return mIndexMax; } diff --git a/services/core/java/com/android/server/connectivity/ConnectStats.java b/services/core/java/com/android/server/connectivity/ConnectStats.java new file mode 100644 index 000000000000..d6de815c8ef4 --- /dev/null +++ b/services/core/java/com/android/server/connectivity/ConnectStats.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.connectivity; + +import android.system.OsConstants; +import android.util.IntArray; +import android.util.SparseIntArray; +import com.android.internal.util.TokenBucket; +import com.android.server.connectivity.metrics.IpConnectivityLogClass.ConnectStatistics; +import com.android.server.connectivity.metrics.IpConnectivityLogClass.Pair; + +/** + * A class that aggregates connect() statistics and helps build + * IpConnectivityLogClass.ConnectStatistics instances. + * + * {@hide} + */ +public class ConnectStats { + private final static int EALREADY = OsConstants.EALREADY; + private final static int EINPROGRESS = OsConstants.EINPROGRESS; + + /** How many events resulted in a given errno. */ + private final SparseIntArray mErrnos = new SparseIntArray(); + /** Latencies of blocking connects. TODO: add non-blocking connects latencies. */ + private final IntArray mLatencies = new IntArray(); + /** TokenBucket for rate limiting latency recording. */ + private final TokenBucket mLatencyTb; + /** Maximum number of latency values recorded. */ + private final int mMaxLatencyRecords; + /** Total count of successful connects. */ + private int mConnectCount = 0; + /** Total count of successful connects with IPv6 socket address. */ + private int mIpv6ConnectCount = 0; + + public ConnectStats(TokenBucket tb, int maxLatencyRecords) { + mLatencyTb = tb; + mMaxLatencyRecords = maxLatencyRecords; + } + + public ConnectStatistics toProto() { + ConnectStatistics stats = new ConnectStatistics(); + stats.connectCount = mConnectCount; + stats.ipv6AddrCount = mIpv6ConnectCount; + stats.latenciesMs = mLatencies.toArray(); + stats.errnosCounters = toPairArrays(mErrnos); + return stats; + } + + public void addEvent(int errno, int latencyMs, String ipAddr) { + if (isSuccess(errno)) { + countConnect(ipAddr); + countLatency(errno, latencyMs); + } else { + countError(errno); + } + } + + private void countConnect(String ipAddr) { + mConnectCount++; + if (isIPv6(ipAddr)) mIpv6ConnectCount++; + } + + private void countLatency(int errno, int ms) { + if (isNonBlocking(errno)) { + // Ignore connect() on non-blocking sockets + return; + } + if (!mLatencyTb.get()) { + // Rate limited + return; + } + if (mLatencies.size() >= mMaxLatencyRecords) { + // Hard limit the total number of latency measurements. + return; + } + mLatencies.add(ms); + } + + private void countError(int errno) { + final int newcount = mErrnos.get(errno, 0) + 1; + mErrnos.put(errno, newcount); + } + + private static boolean isSuccess(int errno) { + return (errno == 0) || isNonBlocking(errno); + } + + private static boolean isNonBlocking(int errno) { + // On non-blocking TCP sockets, connect() immediately returns EINPROGRESS. + // On non-blocking TCP sockets that are connecting, connect() immediately returns EALREADY. + return (errno == EINPROGRESS) || (errno == EALREADY); + } + + private static boolean isIPv6(String ipAddr) { + return ipAddr.contains(":"); + } + + private static Pair[] toPairArrays(SparseIntArray counts) { + final int s = counts.size(); + Pair[] pairs = new Pair[s]; + for (int i = 0; i < s; i++) { + Pair p = new Pair(); + p.key = counts.keyAt(i); + p.value = counts.valueAt(i); + pairs[i] = p; + } + return pairs; + } +} diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java index f1ef947f3472..2a2d1abc6def 100644 --- a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java +++ b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java @@ -43,15 +43,19 @@ final public class IpConnectivityEventBuilder { private IpConnectivityEventBuilder() { } - public static byte[] serialize(int dropped, List events) + public static byte[] serialize(int dropped, List events) throws IOException { final IpConnectivityLog log = new IpConnectivityLog(); - log.events = toProto(events); + log.events = events.toArray(new IpConnectivityEvent[events.size()]); log.droppedEvents = dropped; + if ((log.events.length > 0) || (dropped > 0)) { + // Only write version number if log has some information at all. + log.version = IpConnectivityMetrics.VERSION; + } return IpConnectivityLog.toByteArray(log); } - public static IpConnectivityEvent[] toProto(List eventsIn) { + public static List toProto(List eventsIn) { final ArrayList eventsOut = new ArrayList<>(eventsIn.size()); for (ConnectivityMetricsEvent in : eventsIn) { final IpConnectivityEvent out = toProto(in); @@ -60,7 +64,7 @@ public static IpConnectivityEvent[] toProto(List event } eventsOut.add(out); } - return eventsOut.toArray(new IpConnectivityEvent[eventsOut.size()]); + return eventsOut; } public static IpConnectivityEvent toProto(ConnectivityMetricsEvent ev) { diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java index bcbcf54b03d2..76c3528856fd 100644 --- a/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java +++ b/services/core/java/com/android/server/connectivity/IpConnectivityMetrics.java @@ -19,31 +19,53 @@ import android.content.Context; import android.net.ConnectivityMetricsEvent; import android.net.IIpConnectivityMetrics; +import android.net.INetdEventCallback; +import android.net.metrics.ApfProgramEvent; import android.net.metrics.IpConnectivityLog; +import android.os.Binder; import android.os.IBinder; import android.os.Parcelable; +import android.os.Process; +import android.provider.Settings; import android.text.TextUtils; +import android.text.format.DateUtils; +import android.util.ArrayMap; import android.util.Base64; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.TokenBucket; import com.android.server.SystemService; +import com.android.server.connectivity.metrics.IpConnectivityLogClass.IpConnectivityEvent; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; - -import static com.android.server.connectivity.metrics.IpConnectivityLogClass.IpConnectivityEvent; +import java.util.List; +import java.util.function.ToIntFunction; /** {@hide} */ final public class IpConnectivityMetrics extends SystemService { private static final String TAG = IpConnectivityMetrics.class.getSimpleName(); private static final boolean DBG = false; + // The logical version numbers of ipconnectivity.proto, corresponding to the + // "version" field of IpConnectivityLog. + private static final int NYC = 0; + private static final int NYC_MR1 = 1; + private static final int NYC_MR2 = 2; + public static final int VERSION = NYC_MR2; + private static final String SERVICE_NAME = IpConnectivityLog.SERVICE_NAME; // Default size of the event buffer. Once the buffer is full, incoming events are dropped. private static final int DEFAULT_BUFFER_SIZE = 2000; + // Maximum size of the event buffer. + private static final int MAXIMUM_BUFFER_SIZE = DEFAULT_BUFFER_SIZE * 10; + + private static final int MAXIMUM_CONNECT_LATENCY_RECORDS = 20000; + + private static final int ERROR_RATE_LIMITED = -1; // Lock ensuring that concurrent manipulations of the event buffer are correct. // There are three concurrent operations to synchronize: @@ -54,7 +76,7 @@ final public class IpConnectivityMetrics extends SystemService { @VisibleForTesting public final Impl impl = new Impl(); - private DnsEventListenerService mDnsListener; + private NetdEventListenerService mNetdListener; @GuardedBy("mLock") private ArrayList mBuffer; @@ -62,12 +84,21 @@ final public class IpConnectivityMetrics extends SystemService { private int mDropped; @GuardedBy("mLock") private int mCapacity; + @GuardedBy("mLock") + private final ArrayMap, TokenBucket> mBuckets = makeRateLimitingBuckets(); - public IpConnectivityMetrics(Context ctx) { + private final ToIntFunction mCapacityGetter; + + public IpConnectivityMetrics(Context ctx, ToIntFunction capacityGetter) { super(ctx); + mCapacityGetter = capacityGetter; initBuffer(); } + public IpConnectivityMetrics(Context ctx) { + this(ctx, READ_BUFFER_SIZE); + } + @Override public void onStart() { if (DBG) Log.d(TAG, "onStart"); @@ -77,16 +108,16 @@ public void onStart() { public void onBootPhase(int phase) { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { if (DBG) Log.d(TAG, "onBootPhase"); - mDnsListener = new DnsEventListenerService(getContext()); + mNetdListener = new NetdEventListenerService(getContext()); publishBinderService(SERVICE_NAME, impl); - publishBinderService(mDnsListener.SERVICE_NAME, mDnsListener); + publishBinderService(mNetdListener.SERVICE_NAME, mNetdListener); } } @VisibleForTesting public int bufferCapacity() { - return DEFAULT_BUFFER_SIZE; // TODO: read from config + return mCapacityGetter.applyAsInt(getContext()); } private void initBuffer() { @@ -104,6 +135,10 @@ private int append(ConnectivityMetricsEvent event) { if (event == null) { return left; } + if (isRateLimited(event)) { + // Do not count as a dropped event. TODO: consider adding separate counter + return ERROR_RATE_LIMITED; + } if (left == 0) { mDropped++; return 0; @@ -113,6 +148,11 @@ private int append(ConnectivityMetricsEvent event) { } } + private boolean isRateLimited(ConnectivityMetricsEvent event) { + TokenBucket tb = mBuckets.get(event.data.getClass()); + return (tb != null) && !tb.get(); + } + private String flushEncodedOutput() { final ArrayList events; final int dropped; @@ -122,9 +162,15 @@ private String flushEncodedOutput() { initBuffer(); } + final List protoEvents = IpConnectivityEventBuilder.toProto(events); + + if (mNetdListener != null) { + mNetdListener.flushStatistics(protoEvents); + } + final byte[] data; try { - data = IpConnectivityEventBuilder.serialize(dropped, events); + data = IpConnectivityEventBuilder.serialize(dropped, protoEvents); } catch (IOException e) { Log.e(TAG, "could not serialize events", e); return ""; @@ -169,8 +215,8 @@ private void cmdStats(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("Buffer capacity: " + mCapacity); pw.println("Dropped events: " + mDropped); } - if (mDnsListener != null) { - mDnsListener.dump(pw); + if (mNetdListener != null) { + mNetdListener.dump(pw); } } @@ -225,5 +271,48 @@ private void enforceDumpPermission() { private void enforcePermission(String what) { getContext().enforceCallingOrSelfPermission(what, "IpConnectivityMetrics"); } + + private void enforceNetdEventListeningPermission() { + final int uid = Binder.getCallingUid(); + if (uid != Process.SYSTEM_UID) { + throw new SecurityException(String.format("Uid %d has no permission to listen for" + + " netd events.", uid)); + } + } + + @Override + public boolean registerNetdEventCallback(INetdEventCallback callback) { + enforceNetdEventListeningPermission(); + if (mNetdListener == null) { + return false; + } + return mNetdListener.registerNetdEventCallback(callback); + } + + @Override + public boolean unregisterNetdEventCallback() { + enforceNetdEventListeningPermission(); + if (mNetdListener == null) { + // if the service is null, we aren't registered anyway + return true; + } + return mNetdListener.unregisterNetdEventCallback(); + } + }; + + private static final ToIntFunction READ_BUFFER_SIZE = (ctx) -> { + int size = Settings.Global.getInt(ctx.getContentResolver(), + Settings.Global.CONNECTIVITY_METRICS_BUFFER_SIZE, DEFAULT_BUFFER_SIZE); + if (size <= 0) { + return DEFAULT_BUFFER_SIZE; + } + return Math.min(size, MAXIMUM_BUFFER_SIZE); }; + + private static ArrayMap, TokenBucket> makeRateLimitingBuckets() { + ArrayMap, TokenBucket> map = new ArrayMap<>(); + // one token every minute, 50 tokens max: burst of ~50 events every hour. + map.put(ApfProgramEvent.class, new TokenBucket((int)DateUtils.MINUTE_IN_MILLIS, 50)); + return map; + } } diff --git a/services/core/java/com/android/server/connectivity/DnsEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java similarity index 56% rename from services/core/java/com/android/server/connectivity/DnsEventListenerService.java rename to services/core/java/com/android/server/connectivity/NetdEventListenerService.java index 8d206ef90b94..3f056a54d1f4 100644 --- a/services/core/java/com/android/server/connectivity/DnsEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -19,37 +19,47 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; +import android.net.INetdEventCallback; import android.net.Network; import android.net.NetworkRequest; import android.net.metrics.DnsEvent; -import android.net.metrics.IDnsEventListener; +import android.net.metrics.INetdEventListener; import android.net.metrics.IpConnectivityLog; +import android.os.RemoteException; +import android.text.format.DateUtils; import android.util.Log; - import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; - +import com.android.internal.util.TokenBucket; +import com.android.server.connectivity.metrics.IpConnectivityLogClass.ConnectStatistics; +import com.android.server.connectivity.metrics.IpConnectivityLogClass.IpConnectivityEvent; import java.io.PrintWriter; import java.util.Arrays; +import java.util.List; import java.util.SortedMap; import java.util.TreeMap; - /** - * Implementation of the IDnsEventListener interface. + * Implementation of the INetdEventListener interface. */ -public class DnsEventListenerService extends IDnsEventListener.Stub { +public class NetdEventListenerService extends INetdEventListener.Stub { - public static final String SERVICE_NAME = "dns_listener"; + public static final String SERVICE_NAME = "netd_listener"; - private static final String TAG = DnsEventListenerService.class.getSimpleName(); - private static final boolean DBG = true; + private static final String TAG = NetdEventListenerService.class.getSimpleName(); + private static final boolean DBG = false; private static final boolean VDBG = false; // TODO: read this constant from system property private static final int MAX_LOOKUPS_PER_DNS_EVENT = 100; + // Rate limit connect latency logging to 1 measurement per 15 seconds (5760 / day) with maximum + // bursts of 5000 measurements. + private static final int CONNECT_LATENCY_BURST_LIMIT = 5000; + private static final int CONNECT_LATENCY_FILL_RATE = 15 * (int) DateUtils.SECOND_IN_MILLIS; + private static final int CONNECT_LATENCY_MAXIMUM_RECORDS = 20000; + // Stores the results of a number of consecutive DNS lookups on the same network. // This class is not thread-safe and it is the responsibility of the service to call its methods // on one thread at a time. @@ -86,7 +96,7 @@ public void logAndClear() { byte[] returnCodes = Arrays.copyOf(mReturnCodes, mEventCount); int[] latenciesMs = Arrays.copyOf(mLatenciesMs, mEventCount); mMetricsLog.log(new DnsEvent(mNetId, eventTypes, returnCodes, latenciesMs)); - maybeLog(String.format("Logging %d results for netId %d", mEventCount, mNetId)); + maybeLog("Logging %d results for netId %d", mEventCount, mNetId); mEventCount = 0; } @@ -110,7 +120,7 @@ public String toString() { private final NetworkCallback mNetworkCallback = new NetworkCallback() { @Override public void onLost(Network network) { - synchronized (DnsEventListenerService.this) { + synchronized (NetdEventListenerService.this) { DnsEventBatch batch = mEventBatches.remove(network.netId); if (batch != null) { batch.logAndClear(); @@ -119,12 +129,33 @@ public void onLost(Network network) { } }; - public DnsEventListenerService(Context context) { + @GuardedBy("this") + private final TokenBucket mConnectTb = + new TokenBucket(CONNECT_LATENCY_FILL_RATE, CONNECT_LATENCY_BURST_LIMIT); + @GuardedBy("this") + private ConnectStats mConnectStats = makeConnectStats(); + + // Callback should only be registered/unregistered when logging is being enabled/disabled in DPM + // by the device owner. It's DevicePolicyManager's responsibility to ensure that. + @GuardedBy("this") + private INetdEventCallback mNetdEventCallback; + + public synchronized boolean registerNetdEventCallback(INetdEventCallback callback) { + mNetdEventCallback = callback; + return true; + } + + public synchronized boolean unregisterNetdEventCallback() { + mNetdEventCallback = null; + return true; + } + + public NetdEventListenerService(Context context) { this(context.getSystemService(ConnectivityManager.class), new IpConnectivityLog()); } @VisibleForTesting - public DnsEventListenerService(ConnectivityManager cm, IpConnectivityLog log) { + public NetdEventListenerService(ConnectivityManager cm, IpConnectivityLog log) { // We are started when boot is complete, so ConnectivityService should already be running. mCm = cm; mMetricsLog = log; @@ -134,9 +165,11 @@ public DnsEventListenerService(ConnectivityManager cm, IpConnectivityLog log) { @Override // Called concurrently by multiple binder threads. - public synchronized void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs) { - maybeVerboseLog(String.format("onDnsEvent(%d, %d, %d, %d)", - netId, eventType, returnCode, latencyMs)); + // This method must not block or perform long-running operations. + public synchronized void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs, + String hostname, String[] ipAddresses, int ipAddressesCount, int uid) + throws RemoteException { + maybeVerboseLog("onDnsEvent(%d, %d, %d, %dms)", netId, eventType, returnCode, latencyMs); DnsEventBatch batch = mEventBatches.get(netId); if (batch == null) { @@ -144,6 +177,38 @@ public synchronized void onDnsEvent(int netId, int eventType, int returnCode, in mEventBatches.put(netId, batch); } batch.addResult((byte) eventType, (byte) returnCode, latencyMs); + + if (mNetdEventCallback != null) { + mNetdEventCallback.onDnsEvent(hostname, ipAddresses, ipAddressesCount, + System.currentTimeMillis(), uid); + } + } + + @Override + // Called concurrently by multiple binder threads. + // This method must not block or perform long-running operations. + public synchronized void onConnectEvent(int netId, int error, int latencyMs, String ipAddr, int port, + int uid) throws RemoteException { + maybeVerboseLog("onConnectEvent(%d, %d)", netId, latencyMs); + + mConnectStats.addEvent(error, latencyMs, ipAddr); + + if (mNetdEventCallback != null) { + mNetdEventCallback.onConnectEvent(ipAddr, port, System.currentTimeMillis(), uid); + } + } + + public synchronized void flushStatistics(List events) { + events.add(flushConnectStats()); + // TODO: migrate DnsEventBatch to IpConnectivityLogClass.DNSLatencies + } + + private IpConnectivityEvent flushConnectStats() { + IpConnectivityEvent ev = new IpConnectivityEvent(); + ev.connectStatistics = mConnectStats.toProto(); + // TODO: add transport information + mConnectStats = makeConnectStats(); + return ev; } public synchronized void dump(PrintWriter writer) { @@ -153,14 +218,19 @@ public synchronized void dump(PrintWriter writer) { for (DnsEventBatch batch : mEventBatches.values()) { pw.println(batch.toString()); } + // TODO: also dump ConnectStats pw.decreaseIndent(); } - private static void maybeLog(String s) { - if (DBG) Log.d(TAG, s); + private ConnectStats makeConnectStats() { + return new ConnectStats(mConnectTb, CONNECT_LATENCY_MAXIMUM_RECORDS); + } + + private static void maybeLog(String s, Object... args) { + if (DBG) Log.d(TAG, String.format(s, args)); } - private static void maybeVerboseLog(String s) { - if (VDBG) Log.d(TAG, s); + private static void maybeVerboseLog(String s, Object... args) { + if (VDBG) Log.d(TAG, String.format(s, args)); } } diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index 6eb89facca76..c40780e0d588 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -80,7 +80,8 @@ */ public class NetworkMonitor extends StateMachine { private static final String TAG = NetworkMonitor.class.getSimpleName(); - private static final boolean DBG = false; + private static final boolean DBG = true; + private static final boolean VDBG = false; // Default configuration values for captive portal detection probes. // TODO: append a random length parameter to the default HTTPS url. @@ -96,6 +97,24 @@ public class NetworkMonitor extends StateMachine { private static final int SOCKET_TIMEOUT_MS = 10000; private static final int PROBE_TIMEOUT_MS = 3000; + static enum EvaluationResult { + VALIDATED(true), + CAPTIVE_PORTAL(false); + final boolean isValidated; + EvaluationResult(boolean isValidated) { + this.isValidated = isValidated; + } + } + + static enum ValidationStage { + FIRST_VALIDATION(true), + REVALIDATION(false); + final boolean isFirstValidation; + ValidationStage(boolean isFirstValidation) { + this.isFirstValidation = isFirstValidation; + } + } + public static final String ACTION_NETWORK_CONDITIONS_MEASURED = "android.net.conn.NETWORK_CONDITIONS_MEASURED"; public static final String EXTRA_CONNECTIVITY_TYPE = "extra_connectivity_type"; @@ -211,8 +230,12 @@ public class NetworkMonitor extends StateMachine { private final NetworkRequest mDefaultRequest; private final IpConnectivityLog mMetricsLog; - private boolean mIsCaptivePortalCheckEnabled; + @VisibleForTesting + protected boolean mIsCaptivePortalCheckEnabled; + private boolean mUseHttps; + // The total number of captive portal detection attempts for this NetworkMonitor instance. + private int mValidations = 0; // Set if the user explicitly selected "Do not use this network" in captive portal sign-in app. private boolean mUserDoesNotWant = false; @@ -265,7 +288,8 @@ protected NetworkMonitor(Context context, Handler handler, NetworkAgentInfo netw setInitialState(mDefaultState); mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1) == 1; + Settings.Global.CAPTIVE_PORTAL_MODE, Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT) + != Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE; mUseHttps = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.CAPTIVE_PORTAL_USE_HTTPS, 1) == 1; @@ -286,6 +310,10 @@ public ReadOnlyLocalLog getValidationLogs() { return validationLogs.readOnlyLocalLog(); } + private ValidationStage validationStage() { + return 0 == mValidations ? ValidationStage.FIRST_VALIDATION : ValidationStage.REVALIDATION; + } + // DefaultState is the parent of all States. It exists only to handle CMD_* messages but // does not entail any real state (hence no enter() or exit() routines). private class DefaultState extends State { @@ -362,9 +390,11 @@ public boolean processMessage(Message message) { private class ValidatedState extends State { @Override public void enter() { - maybeLogEvaluationResult(NetworkEvent.NETWORK_VALIDATED); + maybeLogEvaluationResult( + networkEventType(validationStage(), EvaluationResult.VALIDATED)); mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED, NETWORK_TEST_RESULT_VALID, mNetworkAgentInfo.network.netId, null)); + mValidations++; } @Override @@ -403,6 +433,8 @@ public void appResponse(int response) { })); intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_URL, mLastPortalProbeResult.detectUrl); + intent.putExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_USER_AGENT, + getCaptivePortalUserAgent(mContext)); intent.setFlags( Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivityAsUser(intent, UserHandle.CURRENT); @@ -580,7 +612,8 @@ private class CaptivePortalState extends State { @Override public void enter() { - maybeLogEvaluationResult(NetworkEvent.NETWORK_CAPTIVE_PORTAL_FOUND); + maybeLogEvaluationResult( + networkEventType(validationStage(), EvaluationResult.CAPTIVE_PORTAL)); // Don't annoy user with sign-in notifications. if (mDontDisplaySigninNotification) return; // Create a CustomIntentReceiver that sends us a @@ -600,6 +633,7 @@ ACTION_LAUNCH_CAPTIVE_PORTAL_APP, new Random().nextInt(), // Retest for captive portal occasionally. sendMessageDelayed(CMD_CAPTIVE_PORTAL_RECHECK, 0 /* no UID */, CAPTIVE_PORTAL_REEVALUATE_DELAY_MS); + mValidations++; } @Override @@ -632,7 +666,10 @@ private static String getSetting(Context context, String symbol, String defaultV @VisibleForTesting protected CaptivePortalProbeResult isCaptivePortal() { - if (!mIsCaptivePortalCheckEnabled) return new CaptivePortalProbeResult(204); + if (!mIsCaptivePortalCheckEnabled) { + validationLog("Validation disabled."); + return new CaptivePortalProbeResult(204); + } URL pacUrl = null, httpsUrl = null, httpUrl = null, fallbackUrl = null; @@ -672,48 +709,13 @@ protected CaptivePortalProbeResult isCaptivePortal() { long startTime = SystemClock.elapsedRealtime(); - // Pre-resolve the captive portal server host so we can log it. - // Only do this if HttpURLConnection is about to, to avoid any potentially - // unnecessary resolution. - String hostToResolve = null; - if (pacUrl != null) { - hostToResolve = pacUrl.getHost(); - } else if (proxyInfo != null) { - hostToResolve = proxyInfo.getHost(); - } else { - hostToResolve = httpUrl.getHost(); - } - - if (!TextUtils.isEmpty(hostToResolve)) { - String probeName = ValidationProbeEvent.getProbeName(ValidationProbeEvent.PROBE_DNS); - final Stopwatch dnsTimer = new Stopwatch().start(); - int dnsResult; - long dnsLatency; - try { - InetAddress[] addresses = mNetworkAgentInfo.network.getAllByName(hostToResolve); - dnsResult = ValidationProbeEvent.DNS_SUCCESS; - dnsLatency = dnsTimer.stop(); - final StringBuffer connectInfo = new StringBuffer(", " + hostToResolve + "="); - for (InetAddress address : addresses) { - connectInfo.append(address.getHostAddress()); - if (address != addresses[addresses.length-1]) connectInfo.append(","); - } - validationLog(probeName + " OK " + dnsLatency + "ms" + connectInfo); - } catch (UnknownHostException e) { - dnsResult = ValidationProbeEvent.DNS_FAILURE; - dnsLatency = dnsTimer.stop(); - validationLog(probeName + " FAIL " + dnsLatency + "ms, " + hostToResolve); - } - logValidationProbe(dnsLatency, ValidationProbeEvent.PROBE_DNS, dnsResult); - } - - CaptivePortalProbeResult result; + final CaptivePortalProbeResult result; if (pacUrl != null) { - result = sendHttpProbe(pacUrl, ValidationProbeEvent.PROBE_PAC); + result = sendDnsAndHttpProbes(null, pacUrl, ValidationProbeEvent.PROBE_PAC); } else if (mUseHttps) { - result = sendParallelHttpProbes(httpsUrl, httpUrl, fallbackUrl); + result = sendParallelHttpProbes(proxyInfo, httpsUrl, httpUrl, fallbackUrl); } else { - result = sendHttpProbe(httpUrl, ValidationProbeEvent.PROBE_HTTP); + result = sendDnsAndHttpProbes(proxyInfo, httpUrl, ValidationProbeEvent.PROBE_HTTP); } long endTime = SystemClock.elapsedRealtime(); @@ -726,8 +728,50 @@ protected CaptivePortalProbeResult isCaptivePortal() { } /** - * Do a URL fetch on a known server to see if we get the data we expect. - * Returns HTTP response code. + * Do a DNS resolution and URL fetch on a known web server to see if we get the data we expect. + * @return a CaptivePortalProbeResult inferred from the HTTP response. + */ + private CaptivePortalProbeResult sendDnsAndHttpProbes(ProxyInfo proxy, URL url, int probeType) { + // Pre-resolve the captive portal server host so we can log it. + // Only do this if HttpURLConnection is about to, to avoid any potentially + // unnecessary resolution. + final String host = (proxy != null) ? proxy.getHost() : url.getHost(); + sendDnsProbe(host); + return sendHttpProbe(url, probeType); + } + + /** Do a DNS resolution of the given server. */ + private void sendDnsProbe(String host) { + if (TextUtils.isEmpty(host)) { + return; + } + + final String name = ValidationProbeEvent.getProbeName(ValidationProbeEvent.PROBE_DNS); + final Stopwatch watch = new Stopwatch().start(); + int result; + String connectInfo; + try { + InetAddress[] addresses = mNetworkAgentInfo.network.getAllByName(host); + result = ValidationProbeEvent.DNS_SUCCESS; + StringBuffer buffer = new StringBuffer(host).append("="); + for (InetAddress address : addresses) { + buffer.append(address.getHostAddress()); + if (address != addresses[addresses.length-1]) buffer.append(","); + } + connectInfo = buffer.toString(); + } catch (UnknownHostException e) { + result = ValidationProbeEvent.DNS_FAILURE; + connectInfo = host; + } + final long latency = watch.stop(); + String resultString = (ValidationProbeEvent.DNS_SUCCESS == result) ? "OK" : "FAIL"; + validationLog(String.format("%s %s %dms, %s", name, resultString, latency, connectInfo)); + logValidationProbe(latency, ValidationProbeEvent.PROBE_DNS, result); + } + + /** + * Do a URL fetch on a known web server to see if we get the data we expect. + * @return a CaptivePortalProbeResult inferred from the HTTP response. */ @VisibleForTesting protected CaptivePortalProbeResult sendHttpProbe(URL url, int probeType) { @@ -765,19 +809,26 @@ protected CaptivePortalProbeResult sendHttpProbe(URL url, int probeType) { // portal. If it is considered a captive portal, a different sign-in URL // is needed (i.e. can't browse a 204). This could be the result of an HTTP // proxy server. - - // Consider 200 response with "Content-length=0" to not be a captive portal. - // There's no point in considering this a captive portal as the user cannot - // sign-in to an empty page. Probably the result of a broken transparent proxy. - // See http://b/9972012. - if (httpResponseCode == 200 && urlConnection.getContentLength() == 0) { - validationLog("Empty 200 response interpreted as 204 response."); - httpResponseCode = 204; - } - - if (httpResponseCode == 200 && probeType == ValidationProbeEvent.PROBE_PAC) { - validationLog("PAC fetch 200 response interpreted as 204 response."); - httpResponseCode = 204; + if (httpResponseCode == 200) { + if (probeType == ValidationProbeEvent.PROBE_PAC) { + validationLog("PAC fetch 200 response interpreted as 204 response."); + httpResponseCode = 204; + } else if (urlConnection.getContentLengthLong() == 0) { + // Consider 200 response with "Content-length=0" to not be a captive portal. + // There's no point in considering this a captive portal as the user cannot + // sign-in to an empty page. Probably the result of a broken transparent proxy. + // See http://b/9972012. + validationLog( + "200 response with Content-length=0 interpreted as 204 response."); + httpResponseCode = 204; + } else if (urlConnection.getContentLengthLong() == -1) { + // When no Content-length (default value == -1), attempt to read a byte from the + // response. Do not use available() as it is unreliable. See http://b/33498325. + if (urlConnection.getInputStream().read() == -1) { + validationLog("Empty 200 response interpreted as 204 response."); + httpResponseCode = 204; + } + } } } catch (IOException e) { validationLog("Probably not a portal: exception " + e); @@ -794,7 +845,7 @@ protected CaptivePortalProbeResult sendHttpProbe(URL url, int probeType) { } private CaptivePortalProbeResult sendParallelHttpProbes( - URL httpsUrl, URL httpUrl, URL fallbackUrl) { + ProxyInfo proxy, URL httpsUrl, URL httpUrl, URL fallbackUrl) { // Number of probes to wait for. If a probe completes with a conclusive answer // it shortcuts the latch immediately by forcing the count to 0. final CountDownLatch latch = new CountDownLatch(2); @@ -814,9 +865,10 @@ public CaptivePortalProbeResult result() { @Override public void run() { if (mIsHttps) { - mResult = sendHttpProbe(httpsUrl, ValidationProbeEvent.PROBE_HTTPS); + mResult = + sendDnsAndHttpProbes(proxy, httpsUrl, ValidationProbeEvent.PROBE_HTTPS); } else { - mResult = sendHttpProbe(httpUrl, ValidationProbeEvent.PROBE_HTTP); + mResult = sendDnsAndHttpProbes(proxy, httpUrl, ValidationProbeEvent.PROBE_HTTP); } if ((mIsHttps && mResult.isSuccessful()) || (!mIsHttps && mResult.isPortal())) { // Stop waiting immediately if https succeeds or if http finds a portal. @@ -912,7 +964,7 @@ private void sendNetworkConditionsBroadcast(boolean responseReceived, boolean is latencyBroadcast.putExtra(EXTRA_SSID, currentWifiInfo.getSSID()); latencyBroadcast.putExtra(EXTRA_BSSID, currentWifiInfo.getBSSID()); } else { - if (DBG) logw("network info is TYPE_WIFI but no ConnectionInfo found"); + if (VDBG) logw("network info is TYPE_WIFI but no ConnectionInfo found"); return; } break; @@ -925,8 +977,8 @@ private void sendNetworkConditionsBroadcast(boolean responseReceived, boolean is if (cellInfo.isRegistered()) { numRegisteredCellInfo++; if (numRegisteredCellInfo > 1) { - log("more than one registered CellInfo. Can't " + - "tell which is active. Bailing."); + if (VDBG) logw("more than one registered CellInfo." + + " Can't tell which is active. Bailing."); return; } if (cellInfo instanceof CellInfoCdma) { @@ -942,7 +994,7 @@ private void sendNetworkConditionsBroadcast(boolean responseReceived, boolean is CellIdentityWcdma cellId = ((CellInfoWcdma) cellInfo).getCellIdentity(); latencyBroadcast.putExtra(EXTRA_CELL_ID, cellId); } else { - if (DBG) logw("Registered cellinfo is unrecognized"); + if (VDBG) logw("Registered cellinfo is unrecognized"); return; } } @@ -967,6 +1019,22 @@ private void logNetworkEvent(int evtype) { mMetricsLog.log(new NetworkEvent(mNetId, evtype)); } + private int networkEventType(ValidationStage s, EvaluationResult r) { + if (s.isFirstValidation) { + if (r.isValidated) { + return NetworkEvent.NETWORK_FIRST_VALIDATION_SUCCESS; + } else { + return NetworkEvent.NETWORK_FIRST_VALIDATION_PORTAL_FOUND; + } + } else { + if (r.isValidated) { + return NetworkEvent.NETWORK_REVALIDATION_SUCCESS; + } else { + return NetworkEvent.NETWORK_REVALIDATION_PORTAL_FOUND; + } + } + } + private void maybeLogEvaluationResult(int evtype) { if (mEvaluationTimer.isRunning()) { mMetricsLog.log(new NetworkEvent(mNetId, evtype, mEvaluationTimer.stop())); @@ -975,6 +1043,8 @@ private void maybeLogEvaluationResult(int evtype) { } private void logValidationProbe(long durationMs, int probeType, int probeResult) { + probeType = + ValidationProbeEvent.makeProbeType(probeType, validationStage().isFirstValidation); mMetricsLog.log(new ValidationProbeEvent(mNetId, durationMs, probeType, probeResult)); } } diff --git a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java index f7b01be48d88..4ff665787c45 100644 --- a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java +++ b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java @@ -19,7 +19,6 @@ import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; -import android.widget.Toast; import android.content.Context; import android.content.Intent; import android.content.res.Resources; @@ -27,17 +26,40 @@ import android.os.UserHandle; import android.telephony.TelephonyManager; import android.util.Slog; - +import android.util.SparseArray; +import android.util.SparseIntArray; +import android.widget.Toast; import com.android.internal.R; +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.logging.MetricsProto.MetricsEvent; -import static android.net.NetworkCapabilities.*; - +import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; +import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; +import static android.net.NetworkCapabilities.TRANSPORT_WIFI; public class NetworkNotificationManager { - public static enum NotificationType { SIGN_IN, NO_INTERNET, LOST_INTERNET, NETWORK_SWITCH }; + public static enum NotificationType { + LOST_INTERNET(MetricsEvent.NOTIFICATION_NETWORK_LOST_INTERNET), + NETWORK_SWITCH(MetricsEvent.NOTIFICATION_NETWORK_SWITCH), + NO_INTERNET(MetricsEvent.NOTIFICATION_NETWORK_NO_INTERNET), + SIGN_IN(MetricsEvent.NOTIFICATION_NETWORK_SIGN_IN); + + public final int eventId; + + NotificationType(int eventId) { + this.eventId = eventId; + Holder.sIdToTypeMap.put(eventId, this); + } + + private static class Holder { + private static SparseArray sIdToTypeMap = new SparseArray<>(); + } - private static final String NOTIFICATION_ID = "Connectivity.Notification"; + public static NotificationType getFromId(int id) { + return Holder.sIdToTypeMap.get(id); + } + }; private static final String TAG = NetworkNotificationManager.class.getSimpleName(); private static final boolean DBG = true; @@ -46,11 +68,14 @@ public static enum NotificationType { SIGN_IN, NO_INTERNET, LOST_INTERNET, NETWO private final Context mContext; private final TelephonyManager mTelephonyManager; private final NotificationManager mNotificationManager; + // Tracks the types of notifications managed by this instance, from creation to cancellation. + private final SparseIntArray mNotificationTypeMap; public NetworkNotificationManager(Context c, TelephonyManager t, NotificationManager n) { mContext = c; mTelephonyManager = t; mNotificationManager = n; + mNotificationTypeMap = new SparseIntArray(); } // TODO: deal more gracefully with multi-transport networks. @@ -100,8 +125,10 @@ private static int getIcon(int transportType) { */ public void showNotification(int id, NotificationType notifyType, NetworkAgentInfo nai, NetworkAgentInfo switchToNai, PendingIntent intent, boolean highPriority) { - int transportType; - String extraInfo; + final String tag = tagFor(id); + final int eventId = notifyType.eventId; + final int transportType; + final String extraInfo; if (nai != null) { transportType = getFirstTransportType(nai); extraInfo = nai.networkInfo.getExtraInfo(); @@ -114,9 +141,10 @@ public void showNotification(int id, NotificationType notifyType, NetworkAgentIn } if (DBG) { - Slog.d(TAG, "showNotification " + notifyType - + " transportType=" + getTransportName(transportType) - + " extraInfo=" + extraInfo + " highPriority=" + highPriority); + Slog.d(TAG, String.format( + "showNotification tag=%s event=%s transport=%s extraInfo=%s highPrioriy=%s", + tag, nameOf(eventId), getTransportName(transportType), extraInfo, + highPriority)); } Resources r = Resources.getSystem(); @@ -154,7 +182,7 @@ public void showNotification(int id, NotificationType notifyType, NetworkAgentIn details = r.getString(R.string.network_switch_metered_detail, toTransport, fromTransport); } else { - Slog.wtf(TAG, "Unknown notification type " + notifyType + "on network transport " + Slog.wtf(TAG, "Unknown notification type " + notifyType + " on network transport " + getTransportName(transportType)); return; } @@ -184,22 +212,31 @@ public void showNotification(int id, NotificationType notifyType, NetworkAgentIn Notification notification = builder.build(); + mNotificationTypeMap.put(id, eventId); try { - mNotificationManager.notifyAsUser(NOTIFICATION_ID, id, notification, UserHandle.ALL); + mNotificationManager.notifyAsUser(tag, eventId, notification, UserHandle.ALL); } catch (NullPointerException npe) { - Slog.d(TAG, "setNotificationVisible: visible notificationManager npe=" + npe); + Slog.d(TAG, "setNotificationVisible: visible notificationManager error", npe); } } public void clearNotification(int id) { + if (mNotificationTypeMap.indexOfKey(id) < 0) { + return; + } + final String tag = tagFor(id); + final int eventId = mNotificationTypeMap.get(id); if (DBG) { - Slog.d(TAG, "clearNotification id=" + id); + Slog.d(TAG, String.format("clearing notification tag=%s event=%s", tag, + nameOf(eventId))); } try { - mNotificationManager.cancelAsUser(NOTIFICATION_ID, id, UserHandle.ALL); + mNotificationManager.cancelAsUser(tag, eventId, UserHandle.ALL); } catch (NullPointerException npe) { - Slog.d(TAG, "setNotificationVisible: cancel notificationManager npe=" + npe); + Slog.d(TAG, String.format( + "failed to clear notification tag=%s event=%s", tag, nameOf(eventId)), npe); } + mNotificationTypeMap.delete(id); } /** @@ -222,4 +259,15 @@ public void showToast(NetworkAgentInfo fromNai, NetworkAgentInfo toNai) { R.string.network_switch_metered_toast, fromTransport, toTransport); Toast.makeText(mContext, text, Toast.LENGTH_LONG).show(); } + + @VisibleForTesting + static String tagFor(int id) { + return String.format("ConnectivityNotification:%d", id); + } + + @VisibleForTesting + static String nameOf(int eventId) { + NotificationType t = NotificationType.getFromId(eventId); + return (t != null) ? t.name() : "UNKNOWN"; + } } diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 0c8235e10b1c..6d73ccbb48d2 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -909,7 +909,7 @@ public int setUsbTethering(boolean enable) { } } else { mUsbTetherRequested = true; - usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS); + usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS, false); } } else { final long ident = Binder.clearCallingIdentity(); @@ -919,7 +919,7 @@ public int setUsbTethering(boolean enable) { Binder.restoreCallingIdentity(ident); } if (mRndisEnabled) { - usbManager.setCurrentFunction(null); + usbManager.setCurrentFunction(null, false); } mUsbTetherRequested = false; } @@ -1555,9 +1555,8 @@ class SimChangeBroadcastReceiver extends BroadcastReceiver { // used to verify this receiver is still current final private int mGenerationNumber; - // we're interested in edge-triggered LOADED notifications, so - // ignore LOADED unless we saw an ABSENT state first - private boolean mSimAbsentSeen = false; + // used to check the sim state transition from non-loaded to loaded + private boolean mSimNotLoadedSeen = false; public SimChangeBroadcastReceiver(int generationNumber) { super(); @@ -1575,14 +1574,14 @@ public void onReceive(Context context, Intent intent) { final String state = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE); - Log.d(TAG, "got Sim changed to state " + state + ", mSimAbsentSeen=" + - mSimAbsentSeen); - if (!mSimAbsentSeen && IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(state)) { - mSimAbsentSeen = true; + Log.d(TAG, "got Sim changed to state " + state + ", mSimNotLoadedSeen=" + + mSimNotLoadedSeen); + if (!mSimNotLoadedSeen && !IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(state)) { + mSimNotLoadedSeen = true; } - if (mSimAbsentSeen && IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(state)) { - mSimAbsentSeen = false; + if (mSimNotLoadedSeen && IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(state)) { + mSimNotLoadedSeen = false; try { if (mContext.getResources().getString(com.android.internal.R.string. config_mobile_hotspot_provision_app_no_ui).isEmpty() == false) { diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index ede3bda5bea2..610a2ab5b53b 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1544,9 +1544,6 @@ public void check(String interfaze) { public void exit() { // We assume that everything is reset after stopping the daemons. interrupt(); - for (LocalSocket socket : mSockets) { - IoUtils.closeQuietly(socket); - } agentDisconnect(); try { mContext.unregisterReceiver(mBroadcastReceiver); @@ -1559,8 +1556,26 @@ public void run() { Log.v(TAG, "Waiting"); synchronized (TAG) { Log.v(TAG, "Executing"); - execute(); - monitorDaemons(); + try { + execute(); + monitorDaemons(); + interrupted(); // Clear interrupt flag if execute called exit. + } catch (InterruptedException e) { + } finally { + for (LocalSocket socket : mSockets) { + IoUtils.closeQuietly(socket); + } + // This sleep is necessary for racoon to successfully complete sending delete + // message to server. + try { + Thread.sleep(50); + } catch (InterruptedException e) { + } + for (String daemon : mDaemons) { + SystemService.stop(daemon); + } + } + agentDisconnect(); } } @@ -1759,18 +1774,6 @@ private void execute() { Log.i(TAG, "Aborting", e); updateState(DetailedState.FAILED, e.getMessage()); exit(); - } finally { - // Kill the daemons if they fail to stop. - if (!initFinished) { - for (String daemon : mDaemons) { - SystemService.stop(daemon); - } - } - - // Do not leave an unstable state. - if (!initFinished || mNetworkInfo.getDetailedState() == DetailedState.CONNECTING) { - agentDisconnect(); - } } } @@ -1778,28 +1781,17 @@ private void execute() { * Monitor the daemons we started, moving to disconnected state if the * underlying services fail. */ - private void monitorDaemons() { + private void monitorDaemons() throws InterruptedException{ if (!mNetworkInfo.isConnected()) { return; } - - try { - while (true) { - Thread.sleep(2000); - for (int i = 0; i < mDaemons.length; i++) { - if (mArguments[i] != null && SystemService.isStopped(mDaemons[i])) { - return; - } + while (true) { + Thread.sleep(2000); + for (int i = 0; i < mDaemons.length; i++) { + if (mArguments[i] != null && SystemService.isStopped(mDaemons[i])) { + return; } } - } catch (InterruptedException e) { - Log.d(TAG, "interrupted during monitorDaemons(); stopping services"); - } finally { - for (String daemon : mDaemons) { - SystemService.stop(daemon); - } - - agentDisconnect(); } } } diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 15ae846186fa..de092207846b 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -18,9 +18,6 @@ import com.android.server.EventLogTags; import com.android.server.LocalServices; -import com.android.server.twilight.TwilightListener; -import com.android.server.twilight.TwilightManager; -import com.android.server.twilight.TwilightState; import android.annotation.Nullable; import android.hardware.Sensor; @@ -50,20 +47,11 @@ class AutomaticBrightnessController { // If true, enables the use of the screen auto-brightness adjustment setting. private static final boolean USE_SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT = true; - // Hysteresis constraints for brightening or darkening. - // The recent lux must have changed by at least this fraction relative to the - // current ambient lux before a change will be considered. - private static final float BRIGHTENING_LIGHT_HYSTERESIS = 0.10f; - private static final float DARKENING_LIGHT_HYSTERESIS = 0.20f; - - // How long the current sensor reading is assumed to be valid beyond the current time. + // How long the current sensor reading is assumed to be valid beyond the current time. // This provides a bit of prediction, as well as ensures that the weight for the last sample is // non-zero, which in turn ensures that the total weight is non-zero. private static final long AMBIENT_LIGHT_PREDICTION_TIME_MILLIS = 100; - // Specifies the maximum magnitude of the time of day adjustment. - private static final float TWILIGHT_ADJUSTMENT_MAX_GAMMA = 1f; - // Debounce for sampling user-initiated changes in display brightness to ensure // the user is satisfied with the result before storing the sample. private static final int BRIGHTNESS_ADJUSTMENT_SAMPLE_DEBOUNCE_MILLIS = 10000; @@ -71,7 +59,7 @@ class AutomaticBrightnessController { private static final int MSG_UPDATE_AMBIENT_LUX = 1; private static final int MSG_BRIGHTNESS_ADJUSTMENT_SAMPLE = 2; - // Callbacks for requesting updates to the the display's power state + // Callbacks for requesting updates to the display's power state private final Callbacks mCallbacks; // The sensor manager. @@ -80,9 +68,6 @@ class AutomaticBrightnessController { // The light sensor, or null if not available or needed. private final Sensor mLightSensor; - // The twilight service. - private final TwilightManager mTwilight; - // The auto-brightness spline adjustment. // The brightness values have been scaled to a range of 0..1. private final Spline mScreenAutoBrightnessSpline; @@ -92,8 +77,14 @@ class AutomaticBrightnessController { private final int mScreenBrightnessRangeMaximum; private final float mDozeScaleFactor; - // Light sensor event rate in milliseconds. - private final int mLightSensorRate; + // Initial light sensor event rate in milliseconds. + private final int mInitialLightSensorRate; + + // Steady-state light sensor event rate in milliseconds. + private final int mNormalLightSensorRate; + + // The current light sensor event rate in milliseconds. + private int mCurrentLightSensorRate; // Stability requirements in milliseconds for accepting a new brightness level. This is used // for debouncing the light sensor. Different constants are used to debounce the light sensor @@ -115,6 +106,9 @@ class AutomaticBrightnessController { // weighting values positive. private final int mWeightingIntercept; + // accessor object for determining lux levels + private final LuxLevels mLuxLevels; + // Amount of time to delay auto-brightness after screen on while waiting for // the light sensor to warm-up in milliseconds. // May be 0 if no warm-up is required. @@ -175,6 +169,14 @@ class AutomaticBrightnessController { // Are we going to adjust brightness while dozing. private boolean mDozing; + // True if we are collecting light samples when dozing to set the screen brightness. A single + // light sample is collected when entering doze mode. If autobrightness is enabled, calls to + // DisplayPowerController#updatePowerState in doze mode will also collect light samples. + private final boolean mUseActiveDozeLightSensorConfig; + + // True if the ambient light sensor ring buffer should be cleared when entering doze mode. + private final boolean mUseNewSensorSamplesForDoze; + // True if we are collecting a brightness adjustment sample, along with some data // for the initial state of the sample. private boolean mBrightnessAdjustmentSamplePending; @@ -183,35 +185,39 @@ class AutomaticBrightnessController { private int mBrightnessAdjustmentSampleOldBrightness; private float mBrightnessAdjustmentSampleOldGamma; - private boolean mUseTwilight; - public AutomaticBrightnessController(Callbacks callbacks, Looper looper, SensorManager sensorManager, Spline autoBrightnessSpline, int lightSensorWarmUpTime, int brightnessMin, int brightnessMax, float dozeScaleFactor, - int lightSensorRate, long brighteningLightDebounceConfig, + int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig, - int ambientLightHorizon, float autoBrightnessAdjustmentMaxGamma ) { + int ambientLightHorizon, float autoBrightnessAdjustmentMaxGamma, + boolean activeDozeLightSensor, boolean useNewSensorSamplesForDoze, + LuxLevels luxLevels) { mCallbacks = callbacks; - mTwilight = LocalServices.getService(TwilightManager.class); mSensorManager = sensorManager; mScreenAutoBrightnessSpline = autoBrightnessSpline; mScreenBrightnessRangeMinimum = brightnessMin; mScreenBrightnessRangeMaximum = brightnessMax; mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime; mDozeScaleFactor = dozeScaleFactor; - mLightSensorRate = lightSensorRate; + mNormalLightSensorRate = lightSensorRate; + mInitialLightSensorRate = initialLightSensorRate; + mCurrentLightSensorRate = -1; mBrighteningLightDebounceConfig = brighteningLightDebounceConfig; mDarkeningLightDebounceConfig = darkeningLightDebounceConfig; mResetAmbientLuxAfterWarmUpConfig = resetAmbientLuxAfterWarmUpConfig; mAmbientLightHorizon = ambientLightHorizon; mWeightingIntercept = ambientLightHorizon; mScreenAutoBrightnessAdjustmentMaxGamma = autoBrightnessAdjustmentMaxGamma; + mUseNewSensorSamplesForDoze = useNewSensorSamplesForDoze; + mUseActiveDozeLightSensorConfig = activeDozeLightSensor; + mLuxLevels = luxLevels; mHandler = new AutomaticBrightnessHandler(looper); mAmbientLightRingBuffer = - new AmbientLightRingBuffer(mLightSensorRate, mAmbientLightHorizon); + new AmbientLightRingBuffer(mNormalLightSensorRate, mAmbientLightHorizon); mInitialHorizonAmbientLightRingBuffer = - new AmbientLightRingBuffer(mLightSensorRate, mAmbientLightHorizon); + new AmbientLightRingBuffer(mNormalLightSensorRate, mAmbientLightHorizon); if (!DEBUG_PRETEND_LIGHT_SENSOR_ABSENT) { mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); @@ -219,42 +225,41 @@ public AutomaticBrightnessController(Callbacks callbacks, Looper looper, } public int getAutomaticScreenBrightness() { - if (mDozing) { + if (mDozing && !mLuxLevels.hasDynamicDozeBrightness()) { return (int) (mScreenAutoBrightness * mDozeScaleFactor); } return mScreenAutoBrightness; } public void configure(boolean enable, float adjustment, boolean dozing, - boolean userInitiatedChange, boolean useTwilight) { + boolean userInitiatedChange) { // While dozing, the application processor may be suspended which will prevent us from // receiving new information from the light sensor. On some devices, we may be able to // switch to a wake-up light sensor instead but for now we will simply disable the sensor // and hold onto the last computed screen auto brightness. We save the dozing flag for // debugging purposes. + boolean enableSensor = enable && (dozing ? mUseActiveDozeLightSensorConfig : true); + if (enableSensor && dozing && !mDozing && mLightSensorEnabled + && mUseNewSensorSamplesForDoze) { + mAmbientLightRingBuffer.clear(); + mInitialHorizonAmbientLightRingBuffer.clear(); + if (DEBUG) { + Slog.d(TAG, "configure: Clearing ambient light ring buffers when entering doze."); + } + mAmbientLuxValid = false; + adjustLightSensorRate(mInitialLightSensorRate); + } mDozing = dozing; - boolean changed = setLightSensorEnabled(enable && !dozing); + boolean changed = setLightSensorEnabled(enableSensor); changed |= setScreenAutoBrightnessAdjustment(adjustment); - changed |= setUseTwilight(useTwilight); if (changed) { updateAutoBrightness(false /*sendUpdate*/); } - if (enable && !dozing && userInitiatedChange) { + if (enableSensor && userInitiatedChange) { prepareBrightnessAdjustmentSample(); } } - private boolean setUseTwilight(boolean useTwilight) { - if (mUseTwilight == useTwilight) return false; - if (useTwilight) { - mTwilight.registerListener(mTwilightListener, mHandler); - } else { - mTwilight.unregisterListener(mTwilightListener); - } - mUseTwilight = useTwilight; - return true; - } - public void dump(PrintWriter pw) { pw.println(); pw.println("Automatic Brightness Controller Configuration:"); @@ -269,7 +274,6 @@ public void dump(PrintWriter pw) { pw.println(); pw.println("Automatic Brightness Controller State:"); pw.println(" mLightSensor=" + mLightSensor); - pw.println(" mTwilight.getLastTwilightState()=" + mTwilight.getLastTwilightState()); pw.println(" mLightSensorEnabled=" + mLightSensorEnabled); pw.println(" mLightSensorEnableTime=" + TimeUtils.formatUptime(mLightSensorEnableTime)); pw.println(" mAmbientLux=" + mAmbientLux); @@ -292,19 +296,27 @@ public void dump(PrintWriter pw) { private boolean setLightSensorEnabled(boolean enable) { if (enable) { if (!mLightSensorEnabled) { + if (DEBUG) { + Slog.d(TAG, "setLightSensorEnabled: sensor enabled"); + } mLightSensorEnabled = true; + mAmbientLightRingBuffer.clear(); + mInitialHorizonAmbientLightRingBuffer.clear(); + mAmbientLuxValid = !mResetAmbientLuxAfterWarmUpConfig; mLightSensorEnableTime = SystemClock.uptimeMillis(); + mCurrentLightSensorRate = mInitialLightSensorRate; mSensorManager.registerListener(mLightSensorListener, mLightSensor, - mLightSensorRate * 1000, mHandler); + mCurrentLightSensorRate * 1000, mHandler); return true; } } else { if (mLightSensorEnabled) { + if (DEBUG) { + Slog.d(TAG, "setLightSensorEnabled: sensor disabled"); + } mLightSensorEnabled = false; - mAmbientLuxValid = !mResetAmbientLuxAfterWarmUpConfig; mRecentLightSamples = 0; - mAmbientLightRingBuffer.clear(); - mInitialHorizonAmbientLightRingBuffer.clear(); + mCurrentLightSensorRate = -1; mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX); mSensorManager.unregisterListener(mLightSensorListener); } @@ -315,8 +327,20 @@ private boolean setLightSensorEnabled(boolean enable) { private void handleLightSensorEvent(long time, float lux) { mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX); + if (mAmbientLightRingBuffer.size() == 0) { + // switch to using the steady-state sample rate after grabbing the initial light sample + adjustLightSensorRate(mNormalLightSensorRate); + } applyLightSensorMeasurement(time, lux); updateAmbientLux(time); + if (mUseActiveDozeLightSensorConfig && mDozing) { + // disable the ambient light sensor and update the screen brightness + if (DEBUG) { + Slog.d(TAG, "handleLightSensorEvent: doze ambient light sensor reading: " + lux); + } + setLightSensorEnabled(false); + updateAutoBrightness(true /*sendUpdate*/); + } } private void applyLightSensorMeasurement(long time, float lux) { @@ -334,6 +358,20 @@ private void applyLightSensorMeasurement(long time, float lux) { mLastObservedLuxTime = time; } + private void adjustLightSensorRate(int lightSensorRate) { + // if the light sensor rate changed, update the sensor listener + if (lightSensorRate != mCurrentLightSensorRate) { + if (DEBUG) { + Slog.d(TAG, "adjustLightSensorRate: previousRate=" + mCurrentLightSensorRate + + ", currentRate=" + lightSensorRate); + } + mCurrentLightSensorRate = lightSensorRate; + mSensorManager.unregisterListener(mLightSensorListener); + mSensorManager.registerListener(mLightSensorListener, mLightSensor, + lightSensorRate * 1000, mHandler); + } + } + private boolean setScreenAutoBrightnessAdjustment(float adjustment) { if (adjustment != mScreenAutoBrightnessAdjustment) { mScreenAutoBrightnessAdjustment = adjustment; @@ -344,8 +382,8 @@ private boolean setScreenAutoBrightnessAdjustment(float adjustment) { private void setAmbientLux(float lux) { mAmbientLux = lux; - mBrighteningLuxThreshold = mAmbientLux * (1.0f + BRIGHTENING_LIGHT_HYSTERESIS); - mDarkeningLuxThreshold = mAmbientLux * (1.0f - DARKENING_LIGHT_HYSTERESIS); + mBrighteningLuxThreshold = mLuxLevels.getBrighteningThreshold(lux); + mDarkeningLuxThreshold = mLuxLevels.getDarkeningThreshold(lux); } private float calculateAmbientLux(long now) { @@ -469,7 +507,7 @@ private void updateAmbientLux(long time) { // should be enough time to decide whether we should actually transition to the new // weighted ambient lux or not. nextTransitionTime = - nextTransitionTime > time ? nextTransitionTime : time + mLightSensorRate; + nextTransitionTime > time ? nextTransitionTime : time + mNormalLightSensorRate; if (DEBUG) { Slog.d(TAG, "updateAmbientLux: Scheduling ambient lux update for " + nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime)); @@ -495,19 +533,6 @@ private void updateAutoBrightness(boolean sendUpdate) { } } - if (mUseTwilight) { - TwilightState state = mTwilight.getLastTwilightState(); - if (state != null && state.isNight()) { - final long duration = state.sunriseTimeMillis() - state.sunsetTimeMillis(); - final long progress = System.currentTimeMillis() - state.sunsetTimeMillis(); - final float amount = (float) Math.pow(2.0 * progress / duration - 1.0, 2.0); - gamma *= 1 + amount * TWILIGHT_ADJUSTMENT_MAX_GAMMA; - if (DEBUG) { - Slog.d(TAG, "updateAutoBrightness: twilight amount=" + amount); - } - } - } - if (gamma != 1.0f) { final float in = value; value = MathUtils.pow(value, gamma); @@ -517,8 +542,14 @@ private void updateAutoBrightness(boolean sendUpdate) { } } - int newScreenAutoBrightness = + int newScreenAutoBrightness; + if (mUseActiveDozeLightSensorConfig && mDozing) { + newScreenAutoBrightness = mLuxLevels.getDozeBrightness(mAmbientLux); + } else { + newScreenAutoBrightness = clampScreenBrightness(Math.round(value * PowerManager.BRIGHTNESS_ON)); + } + if (mScreenAutoBrightness != newScreenAutoBrightness) { if (DEBUG) { Slog.d(TAG, "updateAutoBrightness: mScreenAutoBrightness=" @@ -622,13 +653,6 @@ public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; - private final TwilightListener mTwilightListener = new TwilightListener() { - @Override - public void onTwilightStateChanged(@Nullable TwilightState state) { - updateAutoBrightness(true /*sendUpdate*/); - } - }; - /** Callbacks to request updates to the display's power state. */ interface Callbacks { void updateBrightness(); 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 DisplayManagerService(Context context) { 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 @@ private void handleDisplayDeviceAddedLocked(DisplayDevice device) { } 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 @@ private void dumpInternal(PrintWriter pw) { 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/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 3c95ace14351..153ffe89d058 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -79,7 +79,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private static final String TAG = "DisplayPowerController"; private static final String SCREEN_ON_BLOCKED_TRACE_NAME = "Screen on blocked"; - private static boolean DEBUG = false; + private static final boolean DEBUG = false; private static final boolean DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT = false; // If true, uses the color fade on animation. @@ -109,9 +109,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Trigger proximity if distance is less than 5 cm. private static final float TYPICAL_PROXIMITY_THRESHOLD = 5.0f; - // Brightness animation ramp rate in brightness units per second. - private static final int BRIGHTNESS_RAMP_RATE_SLOW = 40; - private static final int REPORTED_TO_POLICY_SCREEN_OFF = 0; private static final int REPORTED_TO_POLICY_SCREEN_TURNING_ON = 1; private static final int REPORTED_TO_POLICY_SCREEN_ON = 2; @@ -166,6 +163,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // True if should use light sensor to automatically determine doze screen brightness. private final boolean mAllowAutoBrightnessWhileDozingConfig; + // True if collecting light sensor samples in doze mode. + private boolean mUseActiveDozeLightSensorConfig; + // True if we should fade the screen while turning it off, false if we should play // a stylish color fade animation instead. private boolean mColorFadeFadesConfig; @@ -253,8 +253,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private boolean mAppliedDimming; private boolean mAppliedLowPower; - // Brightness ramp rate fast. + // Brightness animation ramp rates in brightness units per second private final int mBrightnessRampRateFast; + private final int mBrightnessRampRateSlow; // The controller for the automatic brightness level. private AutomaticBrightnessController mAutomaticBrightnessController; @@ -331,9 +332,20 @@ public DisplayPowerController(Context context, mBrightnessRampRateFast = resources.getInteger( com.android.internal.R.integer.config_brightness_ramp_rate_fast); + mBrightnessRampRateSlow = resources.getInteger( + com.android.internal.R.integer.config_brightness_ramp_rate_slow); int lightSensorRate = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessLightSensorRate); + int initialLightSensorRate = resources.getInteger( + com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate); + if (initialLightSensorRate == -1) { + initialLightSensorRate = lightSensorRate; + } else if (initialLightSensorRate > lightSensorRate) { + Slog.w(TAG, "Expected config_autoBrightnessInitialLightSensorRate (" + + initialLightSensorRate + ") to be less than or equal to " + + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ")."); + } long brighteningLightDebounce = resources.getInteger( com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce); long darkeningLightDebounce = resources.getInteger( @@ -357,6 +369,25 @@ public DisplayPowerController(Context context, com.android.internal.R.fraction.config_screenAutoBrightnessDozeScaleFactor, 1, 1); + // hysteresis configs + int[] brightHysteresisLevels = resources.getIntArray( + com.android.internal.R.array.config_dynamicHysteresisBrightLevels); + int[] darkHysteresisLevels = resources.getIntArray( + com.android.internal.R.array.config_dynamicHysteresisDarkLevels); + int[] luxHysteresisLevels = resources.getIntArray( + com.android.internal.R.array.config_dynamicHysteresisLuxLevels); + // doze brightness configs + int[] dozeSensorLuxLevels = resources.getIntArray( + com.android.internal.R.array.config_dozeSensorLuxLevels); + int[] dozeBrightnessBacklightValues = resources.getIntArray( + com.android.internal.R.array.config_dozeBrightnessBacklightValues); + boolean useNewSensorSamplesForDoze = resources.getBoolean( + com.android.internal.R.bool.config_useNewSensorSamplesForDoze); + mUseActiveDozeLightSensorConfig = resources.getBoolean( + com.android.internal.R.bool.config_allowAutoBrightnessActiveDozeLightSensor); + LuxLevels luxLevels = new LuxLevels(brightHysteresisLevels, darkHysteresisLevels, + luxHysteresisLevels, dozeSensorLuxLevels, dozeBrightnessBacklightValues); + Spline screenAutoBrightnessSpline = createAutoBrightnessSpline(lux, screenBrightness); if (screenAutoBrightnessSpline == null) { Slog.e(TAG, "Error in config.xml. config_autoBrightnessLcdBacklightValues " @@ -381,9 +412,10 @@ public DisplayPowerController(Context context, handler.getLooper(), sensorManager, screenAutoBrightnessSpline, lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate, - brighteningLightDebounce, darkeningLightDebounce, - autoBrightnessResetAmbientLuxAfterWarmUp, - ambientLightHorizon, autoBrightnessAdjustmentMaxGamma); + initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce, + autoBrightnessResetAmbientLuxAfterWarmUp, ambientLightHorizon, + autoBrightnessAdjustmentMaxGamma, mUseActiveDozeLightSensorConfig, + useNewSensorSamplesForDoze, luxLevels); } } @@ -621,6 +653,9 @@ private void updatePowerState() { brightness = mPowerRequest.dozeScreenBrightness; } break; + case DisplayPowerRequest.POLICY_VR: + state = Display.STATE_VR; + break; case DisplayPowerRequest.POLICY_DIM: case DisplayPowerRequest.POLICY_BRIGHT: default: @@ -663,6 +698,7 @@ private void updatePowerState() { // Animate the screen state change unless already animating. // The transition may be deferred, so after this point we will use the // actual state instead of the desired one. + final int oldState = mPowerState.getScreenState(); animateScreenStateChange(state, performScreenOffTransition); state = mPowerState.getScreenState(); @@ -682,14 +718,15 @@ private void updatePowerState() { if (mAutomaticBrightnessController != null) { final boolean autoBrightnessEnabledInDoze = mAllowAutoBrightnessWhileDozingConfig && (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND); - autoBrightnessEnabled = mPowerRequest.useAutoBrightness + autoBrightnessEnabled = (mPowerRequest.useAutoBrightness && (state == Display.STATE_ON || autoBrightnessEnabledInDoze) + || mUseActiveDozeLightSensorConfig && autoBrightnessEnabledInDoze) && brightness < 0; final boolean userInitiatedChange = autoBrightnessAdjustmentChanged && mPowerRequest.brightnessSetByUser; mAutomaticBrightnessController.configure(autoBrightnessEnabled, mPowerRequest.screenAutoBrightnessAdjustment, state != Display.STATE_ON, - userInitiatedChange, mPowerRequest.useTwilight); + userInitiatedChange); } // Apply brightness boost. @@ -722,10 +759,16 @@ private void updatePowerState() { mAppliedAutoBrightness = false; } - // Use default brightness when dozing unless overridden. - if (brightness < 0 && (state == Display.STATE_DOZE - || state == Display.STATE_DOZE_SUSPEND)) { - brightness = mScreenBrightnessDozeConfig; + // Use default brightness when dozing unless overridden or if collecting sensor samples. + if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND) { + if (brightness < 0) { + brightness = mScreenBrightnessDozeConfig; + } else if (mUseActiveDozeLightSensorConfig) { + brightness = Math.min(brightness, mScreenBrightnessDozeConfig); + if (DEBUG) { + Slog.d(TAG, "updatePowerState: ALS-based doze brightness: " + brightness); + } + } } // Apply manual brightness. @@ -768,11 +811,12 @@ private void updatePowerState() { } // Animate the screen brightness when the screen is on or dozing. - // Skip the animation when the screen is off or suspended. + // Skip the animation when the screen is off or suspended or transition to/from VR. if (!mPendingScreenOff) { - if (state == Display.STATE_ON || state == Display.STATE_DOZE) { + boolean wasOrWillBeInVr = (state == Display.STATE_VR || oldState == Display.STATE_VR); + if ((state == Display.STATE_ON || state == Display.STATE_DOZE) && !wasOrWillBeInVr) { animateScreenBrightness(brightness, - slowChange ? BRIGHTNESS_RAMP_RATE_SLOW : mBrightnessRampRateFast); + slowChange ? mBrightnessRampRateSlow : mBrightnessRampRateFast); } else { animateScreenBrightness(brightness, 0); } @@ -954,6 +998,23 @@ private void animateScreenStateChange(int target, boolean performScreenOffTransi mPowerState.setColorFadeLevel(1.0f); mPowerState.dismissColorFade(); } + } else if (target == Display.STATE_VR) { + // Wait for brightness animation to complete beforehand when entering VR + // from screen on to prevent a perceptible jump because brightness may operate + // differently when the display is configured for dozing. + if (mScreenBrightnessRampAnimator.isAnimating() + && mPowerState.getScreenState() == Display.STATE_ON) { + return; + } + + // Set screen state. + if (!setScreenState(Display.STATE_VR)) { + return; // screen on blocked + } + + // Dismiss the black surface without fanfare. + mPowerState.setColorFadeLevel(1.0f); + mPowerState.dismissColorFade(); } else if (target == Display.STATE_DOZE) { // Want screen dozing. // Wait for brightness animation to complete beforehand when entering doze diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 1fc76704f016..d8ad07859ec0 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -473,6 +473,16 @@ public void run() { } } + // If the state change was from or to VR, then we need to tell the light + // so that it can apply appropriate VR brightness settings. This should + // happen prior to changing the brightness but also if there is no + // brightness change at all. + if ((state == Display.STATE_VR || currentState == Display.STATE_VR) && + currentState != state) { + setVrMode(state == Display.STATE_VR); + } + + // Apply brightness changes given that we are in a non-suspended state. if (brightnessChanged) { setDisplayBrightness(brightness); @@ -484,6 +494,15 @@ public void run() { } } + private void setVrMode(boolean isVrEnabled) { + if (DEBUG) { + Slog.d(TAG, "setVrMode(" + + "id=" + displayId + + ", state=" + Display.stateToString(state) + ")"); + } + mBacklight.setVrMode(isVrEnabled); + } + private void setDisplayState(int state) { if (DEBUG) { Slog.d(TAG, "setDisplayState(" diff --git a/services/core/java/com/android/server/display/LuxLevels.java b/services/core/java/com/android/server/display/LuxLevels.java new file mode 100644 index 000000000000..a796871874c4 --- /dev/null +++ b/services/core/java/com/android/server/display/LuxLevels.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.display; + +import android.util.Slog; + +/** + * A helper class for handling access to illuminance level values. + */ +final class LuxLevels { + private static final String TAG = "LuxLevels"; + + private static final boolean DEBUG = true; + + private final float[] mBrightLevels; + private final float[] mDarkLevels; + private final float[] mLuxHysteresisLevels; + private final float[] mDozeBrightnessBacklightValues; + private final float[] mDozeSensorLuxLevels; + + /** + * Creates a {@code LuxLevels} object with the given integer arrays. The following arrays + * are either empty or have the following relations: + * {@code brightLevels} and {@code darkLevels} have the same length n. + * {@code luxLevels} has length n+1. + * + * {@code dozeSensorLuxLevels} has length r. + * {@code dozeBrightnessBacklightValues} has length r+1. + * + * @param brightLevels an array of brightening hysteresis constraint constants + * @param darkLevels an array of darkening hysteresis constraint constants + * @param luxHysteresisLevels a monotonically increasing array of illuminance thresholds in lux + * @param dozeSensorLuxLevels a monotonically increasing array of ALS thresholds in lux + * @param dozeBrightnessBacklightValues an array of screen brightness values for doze mode in lux + */ + public LuxLevels(int[] brightLevels, int[] darkLevels, int[] luxHysteresisLevels, + int[] dozeSensorLuxLevels, int[] dozeBrightnessBacklightValues) { + if (brightLevels.length != darkLevels.length || + darkLevels.length !=luxHysteresisLevels.length + 1) { + throw new IllegalArgumentException("Mismatch between hysteresis array lengths."); + } + if (dozeBrightnessBacklightValues.length > 0 && dozeSensorLuxLevels.length > 0 + && dozeBrightnessBacklightValues.length != dozeSensorLuxLevels.length + 1) { + throw new IllegalArgumentException("Mismatch between doze lux array lengths."); + } + mBrightLevels = setArrayFormat(brightLevels, 1000.0f); + mDarkLevels = setArrayFormat(darkLevels, 1000.0f); + mLuxHysteresisLevels = setArrayFormat(luxHysteresisLevels, 1.0f); + mDozeSensorLuxLevels = setArrayFormat(dozeSensorLuxLevels, 1.0f); + mDozeBrightnessBacklightValues = setArrayFormat(dozeBrightnessBacklightValues, 1.0f); + } + + /** + * Return the brightening hysteresis threshold for the given lux level. + */ + public float getBrighteningThreshold(float lux) { + float brightConstant = getReferenceLevel(lux, mBrightLevels, mLuxHysteresisLevels); + float brightThreshold = lux * (1.0f + brightConstant); + if (DEBUG) { + Slog.d(TAG, "bright hysteresis constant= " + brightConstant + ", threshold=" + + brightThreshold + ", lux=" + lux); + } + return brightThreshold; + } + + /** + * Return the darkening hysteresis threshold for the given lux level. + */ + public float getDarkeningThreshold(float lux) { + float darkConstant = getReferenceLevel(lux, mDarkLevels, mLuxHysteresisLevels); + float darkThreshold = lux * (1.0f - darkConstant); + if (DEBUG) { + Slog.d(TAG, "dark hysteresis constant= " + darkConstant + ", threshold=" + + darkThreshold + ", lux=" + lux); + } + return darkThreshold; + } + + /** + * Return the doze backlight brightness level for the given ambient sensor lux level. + */ + public int getDozeBrightness(float lux) { + int dozeBrightness = (int) getReferenceLevel(lux, mDozeBrightnessBacklightValues, + mDozeSensorLuxLevels); + if (DEBUG) { + Slog.d(TAG, "doze brightness: " + dozeBrightness + ", lux=" + lux); + } + return dozeBrightness; + } + + /** + * Find the index of the closest value in {@code thresholdLevels} to {@code lux} and return + * the {@code referenceLevels} entry with that index. + */ + private float getReferenceLevel(float lux, float[] referenceLevels, float[] thresholdLevels) { + int index = 0; + while (thresholdLevels.length > index && lux >= thresholdLevels[index]) { + ++index; + } + return referenceLevels[index]; + } + + /** + * Return if the doze backlight brightness level is specified dynamically. + */ + public boolean hasDynamicDozeBrightness() { + return mDozeSensorLuxLevels.length > 0; + } + + /** + * Return a float array where each i-th element equals {@code configArray[i]/divideFactor}. + */ + private float[] setArrayFormat(int[] configArray, float divideFactor) { + float[] levelArray = new float[configArray.length]; + for (int index = 0; levelArray.length > index; ++index) { + levelArray[index] = (float)configArray[index] / divideFactor; + } + return levelArray; + } +} 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 @@ private int findRememberedWifiDisplay(String deviceAddress) { 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/emergency/EmergencyAffordanceService.java b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java index 353f4506e1e9..98771dfa1f33 100644 --- a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java +++ b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java @@ -245,23 +245,25 @@ private boolean handleUpdateSimSubscriptionInfo() { } } } - if (neededNow != neededBefore) { - setSimNeedsEmergencyAffordance(neededNow); - } + setSimNeedsEmergencyAffordance(neededNow); return neededNow; } private void setSimNeedsEmergencyAffordance(boolean simNeedsEmergencyAffordance) { - mSimNeedsEmergencyAffordance = simNeedsEmergencyAffordance; - Settings.Global.putInt(mContext.getContentResolver(), - EMERGENCY_SIM_INSERTED_SETTING, - simNeedsEmergencyAffordance ? 1 : 0); - updateEmergencyAffordanceNeeded(); + if (simNeededAffordanceBefore() != simNeedsEmergencyAffordance) { + Settings.Global.putInt(mContext.getContentResolver(), + EMERGENCY_SIM_INSERTED_SETTING, + simNeedsEmergencyAffordance ? 1 : 0); + } + if (simNeedsEmergencyAffordance != mSimNeedsEmergencyAffordance) { + mSimNeedsEmergencyAffordance = simNeedsEmergencyAffordance; + updateEmergencyAffordanceNeeded(); + } } private boolean simNeededAffordanceBefore() { return Settings.Global.getInt(mContext.getContentResolver(), - "emergency_sim_inserted_before", 0) != 0; + EMERGENCY_SIM_INSERTED_SETTING, 0) != 0; } private boolean handleUpdateCellInfo() { diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index 6c11794b189d..e6408238e4c2 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -74,6 +74,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * A service to manage multiple clients that want to access the fingerprint HAL API. @@ -101,6 +102,8 @@ private class PerformanceStats { private final ArrayList mLockoutMonitors = new ArrayList<>(); + private final Map mAuthenticatorIds = + Collections.synchronizedMap(new HashMap<>()); private final AppOpsManager mAppOps; private static final long FAIL_LOCKOUT_TIMEOUT_MS = 30*1000; private static final int MAX_FAILED_ATTEMPTS = 5; @@ -117,7 +120,6 @@ private class PerformanceStats { private final UserManager mUserManager; private ClientMonitor mCurrentClient; private ClientMonitor mPendingClient; - private long mCurrentAuthenticatorId; private PerformanceStats mPerformanceStats; // Normal fingerprint authentications are tracked by mPerformanceMap. @@ -209,6 +211,7 @@ public IFingerprintDaemon getFingerprintDaemon() { mDaemon.init(mDaemonCallback); mHalDeviceId = mDaemon.openHal(); if (mHalDeviceId != 0) { + loadAuthenticatorIds(); updateActiveGroup(ActivityManager.getCurrentUser(), null); } else { Slog.w(TAG, "Failed to open Fingerprint HAL!"); @@ -226,6 +229,26 @@ public IFingerprintDaemon getFingerprintDaemon() { return mDaemon; } + /** Populates existing authenticator ids. To be used only during the start of the service. */ + private void loadAuthenticatorIds() { + // This operation can be expensive, so keep track of the elapsed time. Might need to move to + // background if it takes too long. + long t = System.currentTimeMillis(); + + mAuthenticatorIds.clear(); + for (UserInfo user : UserManager.get(mContext).getUsers(true /* excludeDying */)) { + int userId = getUserOrWorkProfileId(null, user.id); + if (!mAuthenticatorIds.containsKey(userId)) { + updateActiveGroup(userId, null); + } + } + + t = System.currentTimeMillis() - t; + if (t > 1000) { + Slog.w(TAG, "loadAuthenticatorIds() taking too long: " + t + "ms"); + } + } + protected void handleEnumerate(long deviceId, int[] fingerIds, int[] groupIds) { if (fingerIds.length != groupIds.length) { Slog.w(TAG, "fingerIds and groupIds differ in length: f[]=" @@ -443,14 +466,23 @@ int getEffectiveUserId(int userId) { boolean isCurrentUserOrProfile(int userId) { UserManager um = UserManager.get(mContext); + if (um == null) { + Slog.e(TAG, "Unable to acquire UserManager"); + return false; + } - // Allow current user or profiles of the current user... - for (int profileId : um.getEnabledProfileIds(userId)) { - if (profileId == userId) { - return true; + final long token = Binder.clearCallingIdentity(); + try { + // Allow current user or profiles of the current user... + for (int profileId : um.getEnabledProfileIds(mCurrentUserId)) { + if (profileId == userId) { + return true; + } } + return false; + } finally { + Binder.restoreCallingIdentity(token); } - return false; } private boolean isForegroundActivity(int uid, int pid) { @@ -1035,7 +1067,7 @@ private void updateActiveGroup(int userId, String clientPackage) { daemon.setActiveGroup(userId, fpDir.getAbsolutePath().getBytes()); mCurrentUserId = userId; } - mCurrentAuthenticatorId = daemon.getAuthenticatorId(); + mAuthenticatorIds.put(userId, daemon.getAuthenticatorId()); } catch (RemoteException e) { Slog.e(TAG, "Failed to setActiveGroup():", e); } @@ -1058,8 +1090,14 @@ private int getUserOrWorkProfileId(String clientPackage, int userId) { * @return true if this is a work profile */ private boolean isWorkProfile(int userId) { - UserInfo info = mUserManager.getUserInfo(userId); - return info != null && info.isManagedProfile(); + UserInfo userInfo = null; + final long token = Binder.clearCallingIdentity(); + try { + userInfo = mUserManager.getUserInfo(userId); + } finally { + Binder.restoreCallingIdentity(token); + } + return userInfo != null && userInfo.isManagedProfile(); } private void listenForUserSwitches() { @@ -1085,12 +1123,14 @@ public void onForegroundProfileSwitch(int newProfileId) { } } - /*** + /** * @param opPackageName the name of the calling package - * @return authenticator id for the current user + * @return authenticator id for the calling user */ public long getAuthenticatorId(String opPackageName) { - return mCurrentAuthenticatorId; + final int userId = getUserOrWorkProfileId(opPackageName, UserHandle.getCallingUserId()); + Long authenticatorId = mAuthenticatorIds.get(userId); + return authenticatorId != null ? authenticatorId : 0; } } diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 74095acca16a..719ce7618fd0 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -25,6 +25,7 @@ import com.android.internal.inputmethod.InputMethodSubtypeHandle; import com.android.internal.os.SomeArgs; import com.android.internal.R; +import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.server.DisplayThread; import com.android.server.LocalServices; @@ -1705,6 +1706,7 @@ public void setPointerIconType(int iconId) { // Binder call @Override public void setCustomPointerIcon(PointerIcon icon) { + Preconditions.checkNotNull(icon); nativeSetCustomPointerIcon(mPtr, icon); } diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java index 5e495fab3f6e..fb54d3bb9468 100644 --- a/services/core/java/com/android/server/job/JobServiceContext.java +++ b/services/core/java/com/android/server/job/JobServiceContext.java @@ -445,7 +445,10 @@ private void handleServiceBoundH() { mVerb = VERB_STARTING; scheduleOpTimeOut(); service.startJob(mParams); - } catch (RemoteException e) { + } catch (Exception e) { + // We catch 'Exception' because client-app malice or bugs might induce a wide + // range of possible exception-throw outcomes from startJob() and its handling + // of the client's ParcelableBundle extras. Slog.e(TAG, "Error sending onStart message to '" + mRunningJob.getServiceComponent().getShortClassName() + "' ", e); } diff --git a/services/core/java/com/android/server/lights/Light.java b/services/core/java/com/android/server/lights/Light.java index b18a18129248..6d0a51040c73 100644 --- a/services/core/java/com/android/server/lights/Light.java +++ b/services/core/java/com/android/server/lights/Light.java @@ -43,4 +43,5 @@ public abstract class Light { public abstract void pulse(); public abstract void pulse(int color, int onMS); public abstract void turnOff(); + public abstract void setVrMode(boolean enabled); } diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java index 07048a491543..eead11464d64 100644 --- a/services/core/java/com/android/server/lights/LightsService.java +++ b/services/core/java/com/android/server/lights/LightsService.java @@ -1,5 +1,4 @@ -/* - * Copyright (C) 2008 The Android Open Source Project +/* * Copyright (C) 2008 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. @@ -17,18 +16,13 @@ package com.android.server.lights; import com.android.server.SystemService; -import com.android.server.vr.VrManagerService; import android.app.ActivityManager; import android.content.Context; import android.os.Handler; import android.os.Message; -import android.os.RemoteException; import android.os.Trace; -import android.os.UserHandle; import android.provider.Settings; -import android.service.vr.IVrManager; -import android.service.vr.IVrStateCallbacks; import android.util.Slog; public class LightsService extends SystemService { @@ -36,7 +30,6 @@ public class LightsService extends SystemService { static final boolean DEBUG = false; final LightImpl mLights[] = new LightImpl[LightsManager.LIGHT_ID_COUNT]; - private boolean mVrModeEnabled; private final class LightImpl extends Light { @@ -52,6 +45,13 @@ public void setBrightness(int brightness) { @Override public void setBrightness(int brightness, int brightnessMode) { synchronized (this) { + // LOW_PERSISTENCE cannot be manually set + if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) { + Slog.w(TAG, "setBrightness with LOW_PERSISTENCE unexpected #" + mId + + ": brightness=0x" + Integer.toHexString(brightness)); + return; + } + int color = brightness & 0x000000ff; color = 0xff000000 | (color << 16) | (color << 8) | color; setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode); @@ -80,11 +80,9 @@ public void pulse() { @Override public void pulse(int color, int onMS) { synchronized (this) { - if (mBrightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) { - return; - } if (mColor == 0 && !mFlashing) { - setLightLocked(color, LIGHT_FLASH_HARDWARE, onMS, 1000, BRIGHTNESS_MODE_USER); + setLightLocked(color, LIGHT_FLASH_HARDWARE, onMS, 1000, + BRIGHTNESS_MODE_USER); mColor = 0; mH.sendMessageDelayed(Message.obtain(mH, 1, this), onMS); } @@ -98,17 +96,23 @@ public void turnOff() { } } - void enableLowPersistence() { - synchronized(this) { - setLightLocked(0, LIGHT_FLASH_NONE, 0, 0, BRIGHTNESS_MODE_LOW_PERSISTENCE); - mLocked = true; - } - } - - void disableLowPersistence() { - synchronized(this) { - mLocked = false; - setLightLocked(mLastColor, LIGHT_FLASH_NONE, 0, 0, mLastBrightnessMode); + @Override + public void setVrMode(boolean enabled) { + synchronized (this) { + if (mVrModeEnabled != enabled) { + mVrModeEnabled = enabled; + + mUseLowPersistenceForVR = + (getVrDisplayMode() == Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE); + if (shouldBeInLowPersistenceMode()) { + mLastBrightnessMode = mBrightnessMode; + } + + // NOTE: We do not trigger a call to setLightLocked here. We do not know the + // current brightness or other values when leaving VR so we avoid any incorrect + // jumps. The code that calls this method will immediately issue a brightness + // update which is when the change will occur. + } } } @@ -119,7 +123,13 @@ private void stopFlashing() { } private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) { - if (!mLocked && (color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS || + if (shouldBeInLowPersistenceMode()) { + brightnessMode = BRIGHTNESS_MODE_LOW_PERSISTENCE; + } else if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) { + brightnessMode = mLastBrightnessMode; + } + + if ((color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS || mBrightnessMode != brightnessMode)) { if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#" + Integer.toHexString(color) + ": brightnessMode=" + brightnessMode); @@ -128,7 +138,6 @@ private void setLightLocked(int color, int mode, int onMS, int offMS, int bright mMode = mode; mOnMS = onMS; mOffMS = offMS; - mLastBrightnessMode = mBrightnessMode; mBrightnessMode = brightnessMode; Trace.traceBegin(Trace.TRACE_TAG_POWER, "setLight(" + mId + ", 0x" + Integer.toHexString(color) + ")"); @@ -140,6 +149,10 @@ private void setLightLocked(int color, int mode, int onMS, int offMS, int bright } } + private boolean shouldBeInLowPersistenceMode() { + return mVrModeEnabled && mUseLowPersistenceForVR; + } + private int mId; private int mColor; private int mMode; @@ -149,7 +162,8 @@ private void setLightLocked(int color, int mode, int onMS, int offMS, int bright private int mBrightnessMode; private int mLastBrightnessMode; private int mLastColor; - private boolean mLocked; + private boolean mVrModeEnabled; + private boolean mUseLowPersistenceForVR; } public LightsService(Context context) { @@ -169,15 +183,6 @@ public void onStart() { @Override public void onBootPhase(int phase) { - if (phase == PHASE_SYSTEM_SERVICES_READY) { - IVrManager vrManager = - (IVrManager) getBinderService(VrManagerService.VR_MANAGER_BINDER_SERVICE); - try { - vrManager.registerListener(mVrStateCallbacks); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to register VR mode state listener: " + e); - } - } } private int getVrDisplayMode() { @@ -188,30 +193,6 @@ private int getVrDisplayMode() { currentUser); } - private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { - @Override - public void onVrStateChanged(boolean enabled) throws RemoteException { - LightImpl l = mLights[LightsManager.LIGHT_ID_BACKLIGHT]; - int vrDisplayMode = getVrDisplayMode(); - - // User leaves VR mode before altering display settings. - if (enabled && vrDisplayMode == Settings.Secure.VR_DISPLAY_MODE_LOW_PERSISTENCE) { - if (!mVrModeEnabled) { - if (DEBUG) - Slog.v(TAG, "VR mode enabled, setting brightness to low persistence"); - l.enableLowPersistence(); - mVrModeEnabled = true; - } - } else { - if (mVrModeEnabled) { - if (DEBUG) Slog.v(TAG, "VR mode disabled, resetting brightnes"); - l.disableLowPersistence(); - mVrModeEnabled = false; - } - } - } - }; - private final LightsManager mService = new LightsManager() { @Override public Light getLight(int id) { diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 1b0800852492..bdf1463d5129 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 GpsRequest(ProviderRequest request, WorkSource source) { 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 @@ private void startNavigating(boolean singleShot) { 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 @@ private boolean hasCapability(int capability) { * 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 @@ private void reportLocation(int flags, double latitude, double longitude, double mLocation.removeAltitude(); } if ((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) { - mLocation.setSpeed(speed); + mLocation.setSpeed(speedMetersPerSecond); } else { mLocation.removeSpeed(); } @@ -1704,23 +1726,29 @@ private void releaseSuplConnection(int connStatus) { * 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/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 5e3b8408bd0f..3dbacbff132e 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1022,7 +1022,7 @@ private boolean isTemplateRelevant(NetworkTemplate template) { */ private void notifyOverLimitNL(NetworkTemplate template) { if (!mOverLimitNotified.contains(template)) { - mContext.startActivity(buildNetworkOverLimitIntent(template)); + mContext.startActivity(buildNetworkOverLimitIntent(mContext.getResources(), template)); mOverLimitNotified.add(template); } } @@ -1068,7 +1068,7 @@ private void enqueueNotification(NetworkPolicy policy, int type, long totalBytes builder.setDeleteIntent(PendingIntent.getBroadcast( mContext, 0, snoozeIntent, PendingIntent.FLAG_UPDATE_CURRENT)); - final Intent viewIntent = buildViewDataUsageIntent(policy.template); + final Intent viewIntent = buildViewDataUsageIntent(res, policy.template); builder.setContentIntent(PendingIntent.getActivity( mContext, 0, viewIntent, PendingIntent.FLAG_UPDATE_CURRENT)); @@ -1104,7 +1104,7 @@ private void enqueueNotification(NetworkPolicy policy, int type, long totalBytes builder.setContentTitle(title); builder.setContentText(body); - final Intent intent = buildNetworkOverLimitIntent(policy.template); + final Intent intent = buildNetworkOverLimitIntent(res, policy.template); builder.setContentIntent(PendingIntent.getActivity( mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); break; @@ -1139,7 +1139,7 @@ private void enqueueNotification(NetworkPolicy policy, int type, long totalBytes builder.setContentTitle(title); builder.setContentText(body); - final Intent intent = buildViewDataUsageIntent(policy.template); + final Intent intent = buildViewDataUsageIntent(res, policy.template); builder.setContentIntent(PendingIntent.getActivity( mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); break; @@ -3602,19 +3602,19 @@ private static Intent buildSnoozeWarningIntent(NetworkTemplate template) { return intent; } - private static Intent buildNetworkOverLimitIntent(NetworkTemplate template) { + private static Intent buildNetworkOverLimitIntent(Resources res, NetworkTemplate template) { final Intent intent = new Intent(); - intent.setComponent(new ComponentName( - "com.android.systemui", "com.android.systemui.net.NetworkOverLimitActivity")); + intent.setComponent(ComponentName.unflattenFromString( + res.getString(R.string.config_networkOverLimitComponent))); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(EXTRA_NETWORK_TEMPLATE, template); return intent; } - private static Intent buildViewDataUsageIntent(NetworkTemplate template) { + private static Intent buildViewDataUsageIntent(Resources res, NetworkTemplate template) { final Intent intent = new Intent(); - intent.setComponent(new ComponentName( - "com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity")); + intent.setComponent(ComponentName.unflattenFromString( + res.getString(R.string.config_dataUsageSummaryComponent))); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(EXTRA_NETWORK_TEMPLATE, template); return intent; diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index eb85f191304e..4973e17f33bf 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -140,7 +140,6 @@ import com.android.server.notification.ManagedServices.ManagedServiceInfo; import com.android.server.policy.PhoneWindowManager; import com.android.server.statusbar.StatusBarManagerInternal; -import com.android.server.vr.VrManagerInternal; import com.android.server.notification.ManagedServices.UserProfiles; import libcore.io.IoUtils; @@ -232,7 +231,6 @@ public class NotificationManagerService extends SystemService { AudioManagerInternal mAudioManagerInternal; @Nullable StatusBarManagerInternal mStatusBar; Vibrator mVibrator; - private VrManagerInternal mVrManagerInternal; private WindowManagerInternal mWindowManagerInternal; final IBinder mForegroundToken = new Binder(); @@ -1128,7 +1126,6 @@ public void onBootPhase(int phase) { // Grab our optional AudioService mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); mAudioManagerInternal = getLocalService(AudioManagerInternal.class); - mVrManagerInternal = getLocalService(VrManagerInternal.class); mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class); mZenModeHelper.onSystemReady(); } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) { @@ -3579,7 +3576,8 @@ private void cancelGroupChildrenLocked(NotificationRecord r, int callingUid, int NotificationRecord childR = mNotificationList.get(i); StatusBarNotification childSbn = childR.sbn; if ((childSbn.isGroup() && !childSbn.getNotification().isGroupSummary()) && - childR.getGroupKey().equals(r.getGroupKey())) { + childR.getGroupKey().equals(r.getGroupKey()) + && (childR.getFlags() & Notification.FLAG_FOREGROUND_SERVICE) == 0) { EventLogTags.writeNotificationCancel(callingUid, callingPid, pkg, childSbn.getId(), childSbn.getTag(), userId, 0, 0, reason, listenerName); mNotificationList.remove(i); diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java index ded85f3da3d6..5016ec0d4be0 100644 --- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java @@ -150,6 +150,10 @@ final class DefaultPermissionGrantPolicy { private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1; + private static final String ACTION_TWINNING = + "com.google.android.clockwork.intent.TWINNING_SETTINGS"; + private static final String ACTION_TRACK = "com.android.fitness.TRACK"; + private final PackageManagerService mService; private final Handler mHandler; @@ -603,8 +607,9 @@ && doesPackageSupportRuntimePermissions(musicPackage)) { grantRuntimePermissionsLPw(musicPackage, STORAGE_PERMISSIONS, userId); } - // Android Wear Home + // Watches if (mService.hasSystemFeature(PackageManager.FEATURE_WATCH, 0)) { + // Home application on watches Intent homeIntent = new Intent(Intent.ACTION_MAIN); homeIntent.addCategory(Intent.CATEGORY_HOME_MAIN); @@ -621,6 +626,27 @@ && doesPackageSupportRuntimePermissions(wearHomePackage)) { grantRuntimePermissionsLPw(wearHomePackage, LOCATION_PERMISSIONS, false, userId); } + + // Twinning on watches + Intent twinningIntent = new Intent(ACTION_TWINNING); + PackageParser.Package twinningPackage = getDefaultSystemHandlerActivityPackageLPr( + twinningIntent, userId); + + if (twinningPackage != null + && doesPackageSupportRuntimePermissions(twinningPackage)) { + grantRuntimePermissionsLPw(twinningPackage, PHONE_PERMISSIONS, false, userId); + grantRuntimePermissionsLPw(twinningPackage, SMS_PERMISSIONS, false, userId); + } + + // Fitness tracking on watches + Intent trackIntent = new Intent(ACTION_TRACK); + PackageParser.Package trackPackage = getDefaultSystemHandlerActivityPackageLPr( + trackIntent, userId); + if (trackPackage != null + && doesPackageSupportRuntimePermissions(trackPackage)) { + grantRuntimePermissionsLPw(trackPackage, SENSORS_PERMISSIONS, false, userId); + grantRuntimePermissionsLPw(trackPackage, LOCATION_PERMISSIONS, false, userId); + } } // Print Spooler diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 08dd93715038..fa9bb1448994 100755 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -468,6 +468,12 @@ public class PackageManagerService extends IPackageManager.Stub { private static final String PACKAGE_SCHEME = "package"; private static final String VENDOR_OVERLAY_DIR = "/vendor/overlay"; + /** + * If VENDOR_OVERLAY_THEME_PROPERTY is set, search for runtime resource overlay APKs also in + * VENDOR_OVERLAY_DIR/ in addition to + * VENDOR_OVERLAY_DIR. + */ + private static final String VENDOR_OVERLAY_THEME_PROPERTY = "ro.boot.vendor.overlay.theme"; private static int DEFAULT_EPHEMERAL_HASH_PREFIX_MASK = 0xFFFFF000; private static int DEFAULT_EPHEMERAL_HASH_PREFIX_COUNT = 5; @@ -1136,6 +1142,8 @@ static class PostInstallData { final @NonNull String mServicesSystemSharedLibraryPackageName; final @NonNull String mSharedSystemSharedLibraryPackageName; + final boolean mPermissionReviewRequired; + private final PackageUsage mPackageUsage = new PackageUsage(); private final CompilerStats mCompilerStats = new CompilerStats(); @@ -2079,6 +2087,10 @@ public PackageManagerService(Context context, Installer installer, } mContext = context; + + mPermissionReviewRequired = context.getResources().getBoolean( + R.bool.config_permissionReviewRequired); + mFactoryTest = factoryTest; mOnlyCore = onlyCore; mMetrics = new DisplayMetrics(); @@ -2312,12 +2324,17 @@ public PackageManagerService(Context context, Installer installer, } } - // Collect vendor overlay packages. - // (Do this before scanning any apps.) + // Collect vendor overlay packages. (Do this before scanning any apps.) // For security and version matching reason, only consider - // overlay packages if they reside in VENDOR_OVERLAY_DIR. - File vendorOverlayDir = new File(VENDOR_OVERLAY_DIR); - scanDirTracedLI(vendorOverlayDir, mDefParseFlags + // overlay packages if they reside in the right directory. + String overlayThemeDir = SystemProperties.get(VENDOR_OVERLAY_THEME_PROPERTY); + if (!overlayThemeDir.isEmpty()) { + scanDirTracedLI(new File(VENDOR_OVERLAY_DIR, overlayThemeDir), mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags, 0); + } + scanDirTracedLI(new File(VENDOR_OVERLAY_DIR), mDefParseFlags | PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0); @@ -4074,7 +4091,7 @@ public void grantRuntimePermission(String packageName, String name, final int us // their permissions as always granted runtime ones since we need // to keep the review required permission flag per user while an // install permission's state is shared across all users. - if (Build.PERMISSIONS_REVIEW_REQUIRED + if ((mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M && bp.isRuntime()) { return; @@ -4185,7 +4202,7 @@ public void revokeRuntimePermission(String packageName, String name, int userId) // their permissions as always granted runtime ones since we need // to keep the review required permission flag per user while an // install permission's state is shared across all users. - if (Build.PERMISSIONS_REVIEW_REQUIRED + if ((mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M && bp.isRuntime()) { return; @@ -5416,15 +5433,23 @@ private List getMatchingCrossProfileIntentFilters(Inte result.remove(xpResolveInfo); } if (result.size() == 0 && !addEphemeral) { + // No result in current profile, but found candidate in parent user. + // And we are not going to add emphemeral app, so we can return the + // result straight away. result.add(xpDomainInfo.resolveInfo); return result; } - } - if (result.size() > 1 || addEphemeral) { - result = filterCandidatesWithDomainPreferredActivitiesLPr( - intent, flags, result, xpDomainInfo, userId); - sortResult = true; - } + } else if (result.size() <= 1 && !addEphemeral) { + // No result in parent user and <= 1 result in current profile, and we + // are not going to add emphemeral app, so we can return the result without + // further processing. + return result; + } + // We have more than one candidate (combining results from current and parent + // profile), so we need filtering and sorting. + result = filterCandidatesWithDomainPreferredActivitiesLPr( + intent, flags, result, xpDomainInfo, userId); + sortResult = true; } } else { final PackageParser.Package pkg = mPackages.get(pkgName); @@ -9983,7 +10008,8 @@ private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace, // their permissions as always granted runtime ones since we need // to keep the review required permission flag per user while an // install permission's state is shared across all users. - if (!appSupportsRuntimePermissions && !Build.PERMISSIONS_REVIEW_REQUIRED) { + if (!appSupportsRuntimePermissions && !mPermissionReviewRequired + && !Build.PERMISSIONS_REVIEW_REQUIRED) { // For legacy apps dangerous permissions are install time ones. grant = GRANT_INSTALL; } else if (origPermissions.hasInstallPermission(bp.name)) { @@ -10062,14 +10088,32 @@ && isSystemApp(ps) int flags = permissionState != null ? permissionState.getFlags() : 0; if (origPermissions.hasRuntimePermission(bp.name, userId)) { - if (permissionsState.grantRuntimePermission(bp, userId) == - PermissionsState.PERMISSION_OPERATION_FAILURE) { - // If we cannot put the permission as it was, we have to write. + // Don't propagate the permission in a permission review mode if + // the former was revoked, i.e. marked to not propagate on upgrade. + // Note that in a permission review mode install permissions are + // represented as constantly granted runtime ones since we need to + // keep a per user state associated with the permission. Also the + // revoke on upgrade flag is no longer applicable and is reset. + final boolean revokeOnUpgrade = (flags & PackageManager + .FLAG_PERMISSION_REVOKE_ON_UPGRADE) != 0; + if (revokeOnUpgrade) { + flags &= ~PackageManager.FLAG_PERMISSION_REVOKE_ON_UPGRADE; + // Since we changed the flags, we have to write. changedRuntimePermissionUserIds = ArrayUtils.appendInt( changedRuntimePermissionUserIds, userId); } + if (!mPermissionReviewRequired || !revokeOnUpgrade) { + if (permissionsState.grantRuntimePermission(bp, userId) == + PermissionsState.PERMISSION_OPERATION_FAILURE) { + // If we cannot put the permission as it was, + // we have to write. + changedRuntimePermissionUserIds = ArrayUtils.appendInt( + changedRuntimePermissionUserIds, userId); + } + } + // If the app supports runtime permissions no need for a review. - if (Build.PERMISSIONS_REVIEW_REQUIRED + if ((mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) && appSupportsRuntimePermissions && (flags & PackageManager .FLAG_PERMISSION_REVIEW_REQUIRED) != 0) { @@ -10078,7 +10122,8 @@ && isSystemApp(ps) changedRuntimePermissionUserIds = ArrayUtils.appendInt( changedRuntimePermissionUserIds, userId); } - } else if (Build.PERMISSIONS_REVIEW_REQUIRED + } else if ((mPermissionReviewRequired + || Build.PERMISSIONS_REVIEW_REQUIRED) && !appSupportsRuntimePermissions) { // For legacy apps that need a permission review, every new // runtime permission is granted but it is pending a review. @@ -16674,7 +16719,7 @@ private void resetUserChangesToRuntimePermissionsAndFlagsLPw( // If permission review is enabled and this is a legacy app, mark the // permission as requiring a review as this is the initial state. int flags = 0; - if (Build.PERMISSIONS_REVIEW_REQUIRED + if ((mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) && ps.pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) { flags |= FLAG_PERMISSION_REVIEW_REQUIRED; } @@ -20549,7 +20594,7 @@ void onNewUserCreated(final int userId) { // permissions to keep per user flag state whether review is needed. // Hence, if a new user is added we have to propagate dangerous // permission grants for these legacy apps. - if (Build.PERMISSIONS_REVIEW_REQUIRED) { + if (mPermissionReviewRequired || Build.PERMISSIONS_REVIEW_REQUIRED) { updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL | UPDATE_PERMISSIONS_REPLACE_ALL); } @@ -21003,7 +21048,7 @@ public void setKeepUninstalledPackages(final List packageList) { public boolean isPermissionsReviewRequired(String packageName, int userId) { synchronized (mPackages) { // If we do not support permission review, done. - if (!Build.PERMISSIONS_REVIEW_REQUIRED) { + if (!mPermissionReviewRequired && !Build.PERMISSIONS_REVIEW_REQUIRED) { return false; } @@ -21093,6 +21138,10 @@ public void setResourceDirs(int userId, String packageName, String[] resourceDir ps.setResourceDirs(resourceDirs, userId); } } + + public String getNameForUid(int uid) { + return PackageManagerService.this.getNameForUid(uid); + } } @Override diff --git a/services/core/java/com/android/server/pm/ShortcutPackageItem.java b/services/core/java/com/android/server/pm/ShortcutPackageItem.java index 1f195a7a544b..e59d69f4c563 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackageItem.java +++ b/services/core/java/com/android/server/pm/ShortcutPackageItem.java @@ -106,27 +106,31 @@ public void attemptToRestoreIfNeededAndSave() { } return; // Not installed, no need to restore yet. } + boolean blockRestore = false; if (!mPackageInfo.hasSignatures()) { s.wtf("Attempted to restore package " + mPackageName + ", user=" + mPackageUserId + " but signatures not found in the restore data."); - onRestoreBlocked(); - return; + blockRestore = true; } - - final PackageInfo pi = s.getPackageInfoWithSignatures(mPackageName, mPackageUserId); - if (!mPackageInfo.canRestoreTo(s, pi)) { - // Package is now installed, but can't restore. Let the subclass do the cleanup. - onRestoreBlocked(); - return; - } - if (ShortcutService.DEBUG) { - Slog.d(TAG, String.format("Restored package: %s/%d on user %d", mPackageName, - mPackageUserId, getOwnerUserId())); + if (!blockRestore) { + final PackageInfo pi = s.getPackageInfoWithSignatures(mPackageName, mPackageUserId); + if (!mPackageInfo.canRestoreTo(s, pi)) { + // Package is now installed, but can't restore. Let the subclass do the cleanup. + blockRestore = true; + } } + if (blockRestore) { + onRestoreBlocked(); + } else { + if (ShortcutService.DEBUG) { + Slog.d(TAG, String.format("Restored package: %s/%d on user %d", mPackageName, + mPackageUserId, getOwnerUserId())); + } - onRestored(); + onRestored(); + } - // Now the package is not shadow. + // Either way, it's no longer a shadow. mPackageInfo.setShadow(false); s.scheduleSaveUser(mPackageUserId); diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 13f558e3dd13..6e8799e81326 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 @@ interface ConfigConstants { private static List EMPTY_RESOLVE_INFO = new ArrayList<>(0); - private static Predicate ACTIVITY_NOT_EXPORTED = - ri -> !ri.activityInfo.exported; + // Temporarily reverted to anonymous inner class form due to: b/32554459 + private static Predicate ACTIVITY_NOT_EXPORTED = new Predicate() { + public boolean test(ResolveInfo ri) { + return !ri.activityInfo.exported; + } + }; - private static Predicate PACKAGE_NOT_INSTALLED = pi -> !isInstalled(pi); + // Temporarily reverted to anonymous inner class form due to: b/32554459 + private static Predicate PACKAGE_NOT_INSTALLED = new Predicate() { + public boolean test(PackageInfo pi) { + return !isInstalled(pi); + } + }; private final Handler mHandler; @@ -3730,6 +3739,16 @@ ShortcutInfo getPackageShortcutForTest(String packageName, String shortcutId, in } } + @VisibleForTesting + ShortcutLauncher getLauncherShortcutForTest(String packageName, int userId) { + synchronized (mLock) { + final ShortcutUser user = mUsers.get(userId); + if (user == null) return null; + + return user.getAllLaunchersForTest().get(PackageWithUser.of(userId, packageName)); + } + } + /** * Control whether {@link #verifyStates} should be performed. We always perform it during unit * tests. diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index af055da2b9e6..24f877e26b7f 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -33,12 +33,10 @@ import android.app.KeyguardManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; @@ -573,7 +571,7 @@ public List getProfiles(int userId, boolean enabledOnly) { @Override public int[] getProfileIds(int userId, boolean enabledOnly) { if (userId != UserHandle.getCallingUserId()) { - checkManageUsersPermission("getting profiles related to user " + userId); + checkManageOrCreateUsersPermission("getting profiles related to user " + userId); } final long ident = Binder.clearCallingIdentity(); try { @@ -654,12 +652,10 @@ public int getCredentialOwnerProfile(int userHandle) { public boolean isSameProfileGroup(int userId, int otherUserId) { if (userId == otherUserId) return true; checkManageUsersPermission("check if in the same profile group"); - synchronized (mPackagesLock) { - return isSameProfileGroupLP(userId, otherUserId); - } + return isSameProfileGroupNoChecks(userId, otherUserId); } - private boolean isSameProfileGroupLP(int userId, int otherUserId) { + private boolean isSameProfileGroupNoChecks(int userId, int otherUserId) { synchronized (mUsersLock) { UserInfo userInfo = getUserInfoLU(userId); if (userInfo == null || userInfo.profileGroupId == UserInfo.NO_PROFILE_GROUP_ID) { @@ -861,12 +857,10 @@ private UserInfo userWithName(UserInfo orig) { public boolean isManagedProfile(int userId) { int callingUserId = UserHandle.getCallingUserId(); if (callingUserId != userId && !hasManageUsersPermission()) { - synchronized (mPackagesLock) { - if (!isSameProfileGroupLP(callingUserId, userId)) { - throw new SecurityException( - "You need MANAGE_USERS permission to: check if specified user a " + - "managed profile outside your profile group"); - } + if (!isSameProfileGroupNoChecks(callingUserId, userId)) { + throw new SecurityException( + "You need MANAGE_USERS permission to: check if specified user a " + + "managed profile outside your profile group"); } } synchronized (mUsersLock) { @@ -875,6 +869,37 @@ public boolean isManagedProfile(int userId) { } } + @Override + public boolean isUserUnlockingOrUnlocked(int userId) { + checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserUnlockingOrUnlocked"); + return mLocalService.isUserUnlockingOrUnlocked(userId); + } + + @Override + public boolean isUserUnlocked(int userId) { + checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserUnlocked"); + return mLocalService.isUserUnlockingOrUnlocked(userId); + } + + @Override + public boolean isUserRunning(int userId) { + checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isUserRunning"); + return mLocalService.isUserRunning(userId); + } + + private void checkManageOrInteractPermIfCallerInOtherProfileGroup(int userId, String name) { + int callingUserId = UserHandle.getCallingUserId(); + if (callingUserId == userId || isSameProfileGroupNoChecks(callingUserId, userId) || + hasManageUsersPermission()) { + return; + } + if (ActivityManager.checkComponentPermission(Manifest.permission.INTERACT_ACROSS_USERS, + Binder.getCallingUid(), -1, true) != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("You need INTERACT_ACROSS_USERS or MANAGE_USERS permission " + + "to: check " + name); + } + } + @Override public boolean isDemoUser(int userId) { int callingUserId = UserHandle.getCallingUserId(); @@ -2889,8 +2914,6 @@ public void onBeforeStartUser(int userId) { applyUserRestrictionsLR(userId); } } - - maybeInitializeDemoMode(userId); } /** @@ -2923,29 +2946,6 @@ public void onUserLoggedIn(@UserIdInt int userId) { scheduleWriteUser(userData); } - private void maybeInitializeDemoMode(int userId) { - if (UserManager.isDeviceInDemoMode(mContext) && userId != UserHandle.USER_SYSTEM) { - String demoLauncher = - mContext.getResources().getString( - com.android.internal.R.string.config_demoModeLauncherComponent); - if (!TextUtils.isEmpty(demoLauncher)) { - ComponentName componentToEnable = ComponentName.unflattenFromString(demoLauncher); - String demoLauncherPkg = componentToEnable.getPackageName(); - try { - final IPackageManager iPm = AppGlobals.getPackageManager(); - iPm.setComponentEnabledSetting(componentToEnable, - PackageManager.COMPONENT_ENABLED_STATE_ENABLED, /* flags= */ 0, - /* userId= */ userId); - iPm.setApplicationEnabledSetting(demoLauncherPkg, - PackageManager.COMPONENT_ENABLED_STATE_ENABLED, /* flags= */ 0, - /* userId= */ userId, null); - } catch (RemoteException re) { - // Internal, shouldn't happen - } - } - } - } - /** * Returns the next available user id, filling in any holes in the ids. * TODO: May not be a good idea to recycle ids, in case it results in confusion @@ -3485,6 +3485,14 @@ public boolean isUserUnlockingOrUnlocked(int userId) { || (state == UserState.STATE_RUNNING_UNLOCKED); } } + + @Override + public boolean isUserUnlocked(int userId) { + synchronized (mUserStates) { + int state = mUserStates.get(userId, -1); + return state == UserState.STATE_RUNNING_UNLOCKED; + } + } } /* Remove all the users except of the system one. */ diff --git a/services/core/java/com/android/server/policy/BurnInProtectionHelper.java b/services/core/java/com/android/server/policy/BurnInProtectionHelper.java index e6ec6a67fe3a..92729dc08b63 100644 --- a/services/core/java/com/android/server/policy/BurnInProtectionHelper.java +++ b/services/core/java/com/android/server/policy/BurnInProtectionHelper.java @@ -43,7 +43,10 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, // Default value when max burnin radius is not set. public static final int BURN_IN_MAX_RADIUS_DEFAULT = -1; - private static final long BURNIN_PROTECTION_WAKEUP_INTERVAL_MS = TimeUnit.MINUTES.toMillis(1); + private static final long BURNIN_PROTECTION_FIRST_WAKEUP_INTERVAL_MS = + TimeUnit.MINUTES.toMillis(1); + private static final long BURNIN_PROTECTION_SUBSEQUENT_WAKEUP_INTERVAL_MS = + TimeUnit.MINUTES.toMillis(2); private static final long BURNIN_PROTECTION_MINIMAL_INTERVAL_MS = TimeUnit.SECONDS.toMillis(10); private static final boolean DEBUG = false; @@ -138,6 +141,9 @@ private void updateBurnInProtection() { // We don't want to adjust offsets immediately after the device goes into ambient mode. // Instead, we want to wait until it's more likely that the user is not observing the // screen anymore. + final long interval = mFirstUpdate + ? BURNIN_PROTECTION_FIRST_WAKEUP_INTERVAL_MS + : BURNIN_PROTECTION_SUBSEQUENT_WAKEUP_INTERVAL_MS; if (mFirstUpdate) { mFirstUpdate = false; } else { @@ -156,8 +162,7 @@ private void updateBurnInProtection() { // Next adjustment at least ten seconds in the future. long nextWall = nowWall + BURNIN_PROTECTION_MINIMAL_INTERVAL_MS; // And aligned to the minute. - nextWall = nextWall - nextWall % BURNIN_PROTECTION_WAKEUP_INTERVAL_MS - + BURNIN_PROTECTION_WAKEUP_INTERVAL_MS; + nextWall = (nextWall - (nextWall % interval)) + interval; // Use elapsed real time that is adjusted to full minute on wall clock. final long nextElapsed = nowElapsed + (nextWall - nowWall); if (DEBUG) { diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 9674ff43870e..2dbc2f3ab524 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -155,6 +155,7 @@ import com.android.server.policy.keyguard.KeyguardServiceDelegate; import com.android.server.policy.keyguard.KeyguardServiceDelegate.DrawnListener; import com.android.server.statusbar.StatusBarManagerInternal; +import com.android.server.vr.VrManagerInternal; import java.io.File; import java.io.FileReader; @@ -211,6 +212,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final int MULTI_PRESS_POWER_THEATER_MODE = 1; static final int MULTI_PRESS_POWER_BRIGHTNESS_BOOST = 2; + // Number of presses needed before we induce panic press behavior on the back button + static final int PANIC_PRESS_BACK_COUNT = 4; + static final int PANIC_PRESS_BACK_NOTHING = 0; + static final int PANIC_PRESS_BACK_HOME = 1; + // These need to match the documentation/constant in // core/res/res/values/config.xml static final int LONG_PRESS_HOME_NOTHING = 0; @@ -435,6 +441,7 @@ public void onDrawn() { volatile boolean mBackKeyHandled; volatile boolean mBeganFromNonInteractive; volatile int mPowerKeyPressCounter; + volatile int mBackKeyPressCounter; volatile boolean mEndCallKeyHandled; volatile boolean mCameraGestureTriggeredDuringGoingToSleep; volatile boolean mGoingToSleep; @@ -495,6 +502,7 @@ public void onDrawn() { int mDoublePressOnPowerBehavior; int mTriplePressOnPowerBehavior; int mLongPressOnBackBehavior; + int mPanicPressOnBackBehavior; int mShortPressOnSleepBehavior; int mShortPressWindowBehavior; boolean mAwake; @@ -675,6 +683,9 @@ public void onDrawn() { // (See Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR.) int mIncallPowerBehavior; + // Behavior of Back button while in-call and screen on + int mIncallBackBehavior; + Display mDisplay; private int mShortSizeDp; @@ -766,6 +777,7 @@ public void onDrawn() { private static final int MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU = 17; private static final int MSG_BACK_LONG_PRESS = 18; private static final int MSG_DISPOSE_INPUT_CONSUMER = 19; + private static final int MSG_BACK_DELAYED_PRESS = 20; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1; @@ -834,10 +846,15 @@ public void handleMessage(Message msg) { break; case MSG_BACK_LONG_PRESS: backLongPress(); + finishBackKeyPress(); break; case MSG_DISPOSE_INPUT_CONSUMER: disposeInputConsumer((InputConsumer) msg.obj); break; + case MSG_BACK_DELAYED_PRESS: + backMultiPressAction((Long) msg.obj, msg.arg1); + finishBackKeyPress(); + break; } } } @@ -863,6 +880,9 @@ void observe() { resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR), false, this, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Secure.getUriFor( + Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR), false, this, + UserHandle.USER_ALL); resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.WAKE_GESTURE_ENABLED), false, this, UserHandle.USER_ALL); @@ -1067,6 +1087,74 @@ void updateOrientationListenerLp() { } } + private void interceptBackKeyDown() { + MetricsLogger.count(mContext, "key_back_down", 1); + // Reset back key state for long press + mBackKeyHandled = false; + + // Cancel multi-press detection timeout. + if (hasPanicPressOnBackBehavior()) { + if (mBackKeyPressCounter != 0 + && mBackKeyPressCounter < PANIC_PRESS_BACK_COUNT) { + mHandler.removeMessages(MSG_BACK_DELAYED_PRESS); + } + } + + if (hasLongPressOnBackBehavior()) { + Message msg = mHandler.obtainMessage(MSG_BACK_LONG_PRESS); + msg.setAsynchronous(true); + mHandler.sendMessageDelayed(msg, + ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout()); + } + } + + // returns true if the key was handled and should not be passed to the user + private boolean interceptBackKeyUp(KeyEvent event) { + // Cache handled state + boolean handled = mBackKeyHandled; + + if (hasPanicPressOnBackBehavior()) { + // Check for back key panic press + ++mBackKeyPressCounter; + + final long eventTime = event.getDownTime(); + + if (mBackKeyPressCounter <= PANIC_PRESS_BACK_COUNT) { + // This could be a multi-press. Wait a little bit longer to confirm. + Message msg = mHandler.obtainMessage(MSG_BACK_DELAYED_PRESS, + mBackKeyPressCounter, 0, eventTime); + msg.setAsynchronous(true); + mHandler.sendMessageDelayed(msg, ViewConfiguration.getMultiPressTimeout()); + } + } + + // Reset back long press state + cancelPendingBackKeyAction(); + + if (mHasFeatureWatch) { + TelecomManager telecomManager = getTelecommService(); + + if (telecomManager != null) { + if (telecomManager.isRinging()) { + // Pressing back while there's a ringing incoming + // call should silence the ringer. + telecomManager.silenceRinger(); + + // It should not prevent navigating away + return false; + } else if ( + (mIncallBackBehavior & Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR_HANGUP) != 0 + && telecomManager.isInCall()) { + // Otherwise, if "Back button ends call" is enabled, + // the Back button will hang up any current active call. + return telecomManager.endCall(); + } + } + } + + return handled; + } + private void interceptPowerKeyDown(KeyEvent event, boolean interactive) { // Hold a wake lock until the power key is released. if (!mPowerKeyWakeLock.isHeld()) { @@ -1197,6 +1285,10 @@ private void finishPowerKeyPress() { } } + private void finishBackKeyPress() { + mBackKeyPressCounter = 0; + } + private void cancelPendingPowerKeyAction() { if (!mPowerKeyHandled) { mPowerKeyHandled = true; @@ -1211,6 +1303,18 @@ private void cancelPendingBackKeyAction() { } } + private void backMultiPressAction(long eventTime, int count) { + if (count >= PANIC_PRESS_BACK_COUNT) { + switch (mPanicPressOnBackBehavior) { + case PANIC_PRESS_BACK_NOTHING: + break; + case PANIC_PRESS_BACK_HOME: + launchHomeFromHotKey(); + break; + } + } + } + private void powerPress(long eventTime, boolean interactive, int count) { if (mScreenOnEarly && !mScreenOnFully) { Slog.i(TAG, "Suppressed redundant power key press while " @@ -1325,8 +1429,13 @@ private void backLongPress() { case LONG_PRESS_BACK_NOTHING: break; case LONG_PRESS_BACK_GO_TO_VOICE_ASSIST: - Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST); - startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF); + final boolean keyguardActive = mKeyguardDelegate == null + ? false + : mKeyguardDelegate.isShowing(); + if (!keyguardActive) { + Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST); + startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF); + } break; } } @@ -1369,6 +1478,10 @@ private boolean hasLongPressOnBackBehavior() { return mLongPressOnBackBehavior != LONG_PRESS_BACK_NOTHING; } + private boolean hasPanicPressOnBackBehavior() { + return mPanicPressOnBackBehavior != PANIC_PRESS_BACK_NOTHING; + } + private void interceptScreenshotChord() { if (mScreenshotChordEnabled && mScreenshotChordVolumeDownKeyTriggered && mScreenshotChordPowerKeyTriggered @@ -1702,6 +1815,8 @@ public void init(Context context, IWindowManager windowManager, mLongPressOnBackBehavior = mContext.getResources().getInteger( com.android.internal.R.integer.config_longPressOnBackBehavior); + mPanicPressOnBackBehavior = mContext.getResources().getInteger( + com.android.internal.R.integer.config_backPanicBehavior); mShortPressOnPowerBehavior = mContext.getResources().getInteger( com.android.internal.R.integer.config_shortPressOnPowerBehavior); @@ -2032,6 +2147,10 @@ public void updateSettings() { Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR, Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_DEFAULT, UserHandle.USER_CURRENT); + mIncallBackBehavior = Settings.Secure.getIntForUser(resolver, + Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR, + Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR_DEFAULT, + UserHandle.USER_CURRENT); // Configure wake gesture. boolean wakeGestureEnabledSetting = Settings.Secure.getIntForUser(resolver, @@ -5846,20 +5965,11 @@ public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: { if (down) { - mBackKeyHandled = false; - if (hasLongPressOnBackBehavior()) { - Message msg = mHandler.obtainMessage(MSG_BACK_LONG_PRESS); - msg.setAsynchronous(true); - mHandler.sendMessageDelayed(msg, - ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout()); - } + interceptBackKeyDown(); } else { - boolean handled = mBackKeyHandled; - - // Reset back key state - cancelPendingBackKeyAction(); + boolean handled = interceptBackKeyUp(event); - // Don't pass back press to app if we've already handled it + // Don't pass back press to app if we've already handled it via long press if (handled) { result &= ~ACTION_PASS_TO_USER; } @@ -6607,6 +6717,7 @@ public void screenTurnedOff() { mKeyguardDelegate.onScreenTurnedOff(); } } + reportScreenStateToVrManager(false); } // Called on the DisplayManager's DisplayPowerController thread. @@ -6642,6 +6753,15 @@ public void screenTurnedOn() { mKeyguardDelegate.onScreenTurnedOn(); } } + reportScreenStateToVrManager(true); + } + + private void reportScreenStateToVrManager(boolean isScreenOn) { + VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class); + if (vrService == null) { + return; + } + vrService.onScreenStateChanged(isScreenOn); } private void finishWindowsDrawn() { @@ -8213,6 +8333,7 @@ public void dump(String prefix, PrintWriter pw, String[] args) { pw.print(" mLockScreenTimerActive="); pw.println(mLockScreenTimerActive); pw.print(prefix); pw.print("mEndcallBehavior="); pw.print(mEndcallBehavior); pw.print(" mIncallPowerBehavior="); pw.print(mIncallPowerBehavior); + pw.print(" mIncallBackBehavior="); pw.print(mIncallBackBehavior); pw.print(" mLongPressOnHomeBehavior="); pw.println(mLongPressOnHomeBehavior); pw.print(prefix); pw.print("mLandscapeRotation="); pw.print(mLandscapeRotation); pw.print(" mSeascapeRotation="); pw.println(mSeascapeRotation); diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 81a0749c91ba..fe0c4b909547 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -142,6 +142,8 @@ public final class PowerManagerService extends SystemService private static final int DIRTY_DOCK_STATE = 1 << 10; // Dirty bit: brightness boost changed private static final int DIRTY_SCREEN_BRIGHTNESS_BOOST = 1 << 11; + // Dirty bit: VR Mode enabled changed + private static final int DIRTY_VR_MODE_CHANGED = 1 << 12; // Summarizes the state of all active wakelocks. private static final int WAKE_LOCK_CPU = 1 << 0; @@ -431,11 +433,15 @@ public final class PowerManagerService extends SystemService private int mScreenBrightnessSettingMinimum; private int mScreenBrightnessSettingMaximum; private int mScreenBrightnessSettingDefault; + private int mScreenBrightnessForVrSettingDefault; // The screen brightness setting, from 0 to 255. // Use -1 if no value has been set. private int mScreenBrightnessSetting; + // The screen brightness setting, from 0 to 255, to be used while in VR Mode. + private int mScreenBrightnessForVrSetting; + // The screen auto-brightness adjustment setting, from -1 to 1. // Use 0 if there is no adjustment. private float mScreenAutoBrightnessAdjustmentSetting; @@ -527,8 +533,8 @@ public final class PowerManagerService extends SystemService private final ArrayList mLowPowerModeListeners = new ArrayList(); - // True if brightness should be affected by twilight. - private boolean mBrightnessUseTwilight; + // True if we are currently in VR Mode. + private boolean mIsVrModeEnabled; private native void nativeInit(); @@ -621,6 +627,7 @@ public void systemReady(IAppOpsService appOps) { mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting(); mButtonBrightnessSettingDefault = pm.getDefaultButtonBrightness(); mKeyboardBrightnessSettingDefault = pm.getDefaultKeyboardBrightness(); + mScreenBrightnessForVrSettingDefault = pm.getDefaultScreenBrightnessForVrSetting(); SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper()); @@ -690,6 +697,9 @@ mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"), resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_BRIGHTNESS), false, mSettingsObserver, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.SCREEN_BRIGHTNESS_FOR_VR), + false, mSettingsObserver, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SCREEN_BRIGHTNESS_MODE), false, mSettingsObserver, UserHandle.USER_ALL); @@ -708,15 +718,14 @@ mAppOps, createSuspendBlockerLocked("PowerManagerService.Broadcasts"), resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.DOUBLE_TAP_TO_WAKE), false, mSettingsObserver, UserHandle.USER_ALL); - resolver.registerContentObserver(Settings.Secure.getUriFor( - Secure.BRIGHTNESS_USE_TWILIGHT), - false, mSettingsObserver, UserHandle.USER_ALL); IVrManager vrManager = (IVrManager) getBinderService(VrManagerService.VR_MANAGER_BINDER_SERVICE); - try { - vrManager.registerListener(mVrStateCallbacks); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to register VR mode state listener: " + e); + if (vrManager != null) { + try { + vrManager.registerListener(mVrStateCallbacks); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to register VR mode state listener: " + e); + } } resolver.registerContentObserver(Settings.System.getUriFor( @@ -828,11 +837,17 @@ private void updateSettingsLocked() { } } - final int oldScreenBrightnessSetting = mScreenBrightnessSetting; + final int oldScreenBrightnessSetting = getCurrentBrightnessSettingLocked(); + + mScreenBrightnessForVrSetting = Settings.System.getIntForUser(resolver, + Settings.System.SCREEN_BRIGHTNESS_FOR_VR, mScreenBrightnessForVrSettingDefault, + UserHandle.USER_CURRENT); + mScreenBrightnessSetting = Settings.System.getIntForUser(resolver, Settings.System.SCREEN_BRIGHTNESS, mScreenBrightnessSettingDefault, UserHandle.USER_CURRENT); - if (oldScreenBrightnessSetting != mScreenBrightnessSetting) { + + if (oldScreenBrightnessSetting != getCurrentBrightnessSettingLocked()) { mTemporaryScreenBrightnessSettingOverride = -1; } @@ -849,9 +864,6 @@ private void updateSettingsLocked() { Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL, UserHandle.USER_CURRENT); - mBrightnessUseTwilight = Settings.Secure.getIntForUser(resolver, - Secure.BRIGHTNESS_USE_TWILIGHT, 0, UserHandle.USER_CURRENT) != 0; - final boolean lowPowerModeEnabled = Settings.Global.getInt(resolver, Settings.Global.LOW_POWER_MODE, 0) != 0; final boolean autoLowPowerModeConfigured = Settings.Global.getInt(resolver, @@ -877,6 +889,10 @@ private void updateSettingsLocked() { mDirty |= DIRTY_SETTINGS; } + private int getCurrentBrightnessSettingLocked() { + return mIsVrModeEnabled ? mScreenBrightnessForVrSetting : mScreenBrightnessSetting; + } + private void postAfterBootCompleted(Runnable r) { if (mBootCompleted) { BackgroundThread.getHandler().post(r); @@ -2134,6 +2150,7 @@ private boolean canDreamLocked() { || !mDreamsSupportedConfig || !mDreamsEnabledSetting || !mDisplayPowerRequest.isBrightOrDim() + || mDisplayPowerRequest.isVr() || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM | USER_ACTIVITY_SCREEN_DREAM)) == 0 || !mBootCompleted) { @@ -2178,7 +2195,7 @@ private boolean updateDisplayPowerStateLocked(int dirty) { final boolean oldDisplayReady = mDisplayReady; if ((dirty & (DIRTY_WAKE_LOCKS | DIRTY_USER_ACTIVITY | DIRTY_WAKEFULNESS | DIRTY_ACTUAL_DISPLAY_POWER_STATE_UPDATED | DIRTY_BOOT_COMPLETED - | DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST)) != 0) { + | DIRTY_SETTINGS | DIRTY_SCREEN_BRIGHTNESS_BOOST | DIRTY_VR_MODE_CHANGED)) != 0) { mDisplayPowerRequest.policy = getDesiredScreenPolicyLocked(); // Determine appropriate screen brightness and auto-brightness adjustments. @@ -2192,6 +2209,9 @@ private boolean updateDisplayPowerStateLocked(int dirty) { // bootloader brightness and the default brightness to be identical. autoBrightness = false; brightnessSetByUser = false; + } else if (mIsVrModeEnabled) { + screenBrightness = mScreenBrightnessForVrSetting; + autoBrightness = false; } else if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) { screenBrightness = mScreenBrightnessOverrideFromWindowManager; autoBrightness = false; @@ -2225,8 +2245,7 @@ private boolean updateDisplayPowerStateLocked(int dirty) { mDisplayPowerRequest.useAutoBrightness = autoBrightness; mDisplayPowerRequest.useProximitySensor = shouldUseProximitySensorLocked(); mDisplayPowerRequest.lowPowerMode = mLowPowerModeEnabled; - mDisplayPowerRequest.boostScreenBrightness = mScreenBrightnessBoostInProgress; - mDisplayPowerRequest.useTwilight = mBrightnessUseTwilight; + mDisplayPowerRequest.boostScreenBrightness = shouldBoostScreenBrightness(); if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE) { mDisplayPowerRequest.dozeScreenState = mDozeScreenStateOverrideFromDreamManager; @@ -2252,6 +2271,7 @@ private boolean updateDisplayPowerStateLocked(int dirty) { + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary) + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary) + ", mBootCompleted=" + mBootCompleted + + ", mIsVrModeEnabled= " + mIsVrModeEnabled + ", mScreenBrightnessBoostInProgress=" + mScreenBrightnessBoostInProgress); } @@ -2282,6 +2302,10 @@ private void updateScreenBrightnessBoostLocked(int dirty) { } } + private boolean shouldBoostScreenBrightness() { + return !mIsVrModeEnabled && mScreenBrightnessBoostInProgress; + } + private static boolean isValidBrightness(int value) { return value >= 0 && value <= 255; } @@ -2292,6 +2316,10 @@ private static boolean isValidAutoBrightnessAdjustment(float value) { } private int getDesiredScreenPolicyLocked() { + if (mIsVrModeEnabled) { + return DisplayPowerRequest.POLICY_VR; + } + if (mWakefulness == WAKEFULNESS_ASLEEP) { return DisplayPowerRequest.POLICY_OFF; } @@ -2395,7 +2423,7 @@ public String toString() { }; private boolean shouldUseProximitySensorLocked() { - return (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0; + return !mIsVrModeEnabled && (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0; } /** @@ -3055,7 +3083,11 @@ private void dumpInternal(PrintWriter pw) { pw.println(" mScreenBrightnessSettingMinimum=" + mScreenBrightnessSettingMinimum); pw.println(" mScreenBrightnessSettingMaximum=" + mScreenBrightnessSettingMaximum); pw.println(" mScreenBrightnessSettingDefault=" + mScreenBrightnessSettingDefault); + pw.println(" mScreenBrightnessForVrSettingDefault=" + + mScreenBrightnessForVrSettingDefault); + pw.println(" mScreenBrightnessForVrSetting=" + mScreenBrightnessForVrSetting); pw.println(" mDoubleTapWakeEnabled=" + mDoubleTapWakeEnabled); + pw.println(" mIsVrModeEnabled=" + mIsVrModeEnabled); final int sleepTimeout = getSleepTimeoutLocked(); final int screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout); @@ -3182,6 +3214,14 @@ public void onChange(boolean selfChange, Uri uri) { @Override public void onVrStateChanged(boolean enabled) { powerHintInternal(POWER_HINT_VR_MODE, enabled ? 1 : 0); + + synchronized (mLock) { + if (mIsVrModeEnabled != enabled) { + mIsVrModeEnabled = enabled; + mDirty |= DIRTY_VR_MODE_CHANGED; + updatePowerStateLocked(); + } + } } }; @@ -4045,6 +4085,7 @@ public void setDozeOverrideFromDreamManager(int screenState, int screenBrightnes case Display.STATE_DOZE: case Display.STATE_DOZE_SUSPEND: case Display.STATE_ON: + case Display.STATE_VR: break; default: screenState = Display.STATE_UNKNOWN; diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java index 5748b4f4ef30..f416ca9c2739 100644 --- a/services/core/java/com/android/server/power/ShutdownThread.java +++ b/services/core/java/com/android/server/power/ShutdownThread.java @@ -631,7 +631,7 @@ public void run() { bluetooth.getState() == BluetoothAdapter.STATE_OFF; if (!bluetoothOff) { Log.w(TAG, "Disabling Bluetooth..."); - bluetooth.disable(false); // disable but don't persist new state + bluetooth.disable(mContext.getPackageName(), false); // disable but don't persist new state } } catch (RemoteException ex) { Log.e(TAG, "RemoteException during bluetooth shutdown", ex); diff --git a/services/core/java/com/android/server/storage/AppCollector.java b/services/core/java/com/android/server/storage/AppCollector.java new file mode 100644 index 000000000000..ee9c5bf2775d --- /dev/null +++ b/services/core/java/com/android/server/storage/AppCollector.java @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.storage; + +import android.annotation.NonNull; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageStatsObserver; +import android.content.pm.PackageManager; +import android.content.pm.PackageStats; +import android.content.pm.UserInfo; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.os.Process; +import android.os.RemoteException; +import android.os.UserManager; +import android.os.storage.VolumeInfo; +import android.util.Log; +import com.android.internal.os.BackgroundThread; +import com.android.internal.util.Preconditions; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * AppCollector asynchronously collects package sizes. + */ +public class AppCollector { + private static String TAG = "AppCollector"; + + private CompletableFuture> mStats; + private final BackgroundHandler mBackgroundHandler; + + /** + * Constrcuts a new AppCollector which runs on the provided volume. + * @param context Android context used to get + * @param volume Volume to check for apps. + */ + public AppCollector(Context context, @NonNull VolumeInfo volume) { + Preconditions.checkNotNull(volume); + + mBackgroundHandler = new BackgroundHandler(BackgroundThread.get().getLooper(), + volume, + context.getPackageManager(), + (UserManager) context.getSystemService(Context.USER_SERVICE)); + } + + /** + * Returns a list of package stats for the context and volume. Note that in a multi-user + * environment, this may return stats for the same package multiple times. These "duplicate" + * entries will have the package stats for the package for a given user, not the package in + * aggregate. + * @param timeoutMillis Milliseconds before timing out and returning early with null. + */ + public List getPackageStats(long timeoutMillis) { + synchronized(this) { + if (mStats == null) { + mStats = new CompletableFuture<>(); + mBackgroundHandler.sendEmptyMessage(BackgroundHandler.MSG_START_LOADING_SIZES); + } + } + + List value = null; + try { + value = mStats.get(timeoutMillis, TimeUnit.MILLISECONDS); + } catch (InterruptedException | ExecutionException e) { + Log.e(TAG, "An exception occurred while getting app storage", e); + } catch (TimeoutException e) { + Log.e(TAG, "AppCollector timed out"); + } + return value; + } + + private class StatsObserver extends IPackageStatsObserver.Stub { + private AtomicInteger mCount; + private final ArrayList mPackageStats; + + public StatsObserver(int count) { + mCount = new AtomicInteger(count); + mPackageStats = new ArrayList<>(count); + } + + @Override + public void onGetStatsCompleted(PackageStats packageStats, boolean succeeded) + throws RemoteException { + if (succeeded) { + mPackageStats.add(packageStats); + } + + if (mCount.decrementAndGet() == 0) { + mStats.complete(mPackageStats); + } + } + } + + private class BackgroundHandler extends Handler { + static final int MSG_START_LOADING_SIZES = 0; + private final VolumeInfo mVolume; + private final PackageManager mPm; + private final UserManager mUm; + + BackgroundHandler(Looper looper, @NonNull VolumeInfo volume, PackageManager pm, UserManager um) { + super(looper); + mVolume = volume; + mPm = pm; + mUm = um; + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_START_LOADING_SIZES: { + final List apps = mPm.getInstalledApplications( + PackageManager.GET_UNINSTALLED_PACKAGES + | PackageManager.GET_DISABLED_COMPONENTS); + + final List volumeApps = new ArrayList<>(); + for (ApplicationInfo app : apps) { + if (Objects.equals(app.volumeUuid, mVolume.getFsUuid())) { + volumeApps.add(app); + } + } + + List users = mUm.getUsers(); + final int count = users.size() * volumeApps.size(); + if (count == 0) { + mStats.complete(new ArrayList<>()); + } + + // Kick off the async package size query for all apps. + final StatsObserver observer = new StatsObserver(count); + for (UserInfo user : users) { + for (ApplicationInfo app : volumeApps) { + mPm.getPackageSizeInfoAsUser(app.packageName, user.id, + observer); + } + } + } + } + } + } +} diff --git a/services/core/java/com/android/server/storage/DiskStatsFileLogger.java b/services/core/java/com/android/server/storage/DiskStatsFileLogger.java new file mode 100644 index 000000000000..22299df93ef5 --- /dev/null +++ b/services/core/java/com/android/server/storage/DiskStatsFileLogger.java @@ -0,0 +1,166 @@ +/* + * 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/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.server.storage; + +import android.content.pm.PackageStats; +import android.os.Environment; +import android.util.ArrayMap; +import android.util.Log; + +import com.android.server.storage.FileCollector.MeasurementResult; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.util.List; +import java.util.Map; + +/** + * DiskStatsFileLogger logs collected storage information to a file in a JSON format. + * + * The following information is cached in the file: + * 1. Size of images on disk. + * 2. Size of videos on disk. + * 3. Size of audio on disk. + * 4. Size of the downloads folder. + * 5. System size. + * 6. Aggregate and individual app and app cache sizes. + * 7. How much storage couldn't be categorized in one of the above categories. + */ +public class DiskStatsFileLogger { + private static final String TAG = "DiskStatsLogger"; + + public static final String PHOTOS_KEY = "photosSize"; + public static final String VIDEOS_KEY = "videosSize"; + public static final String AUDIO_KEY = "audioSize"; + public static final String DOWNLOADS_KEY = "downloadsSize"; + public static final String SYSTEM_KEY = "systemSize"; + public static final String MISC_KEY = "otherSize"; + public static final String APP_SIZE_AGG_KEY = "appSize"; + public static final String APP_CACHE_AGG_KEY = "cacheSize"; + public static final String PACKAGE_NAMES_KEY = "packageNames"; + public static final String APP_SIZES_KEY = "appSizes"; + public static final String APP_CACHES_KEY = "cacheSizes"; + public static final String LAST_QUERY_TIMESTAMP_KEY = "queryTime"; + + private MeasurementResult mResult; + private long mDownloadsSize; + private long mSystemSize; + private List mPackageStats; + + /** + * Constructs a DiskStatsFileLogger with calculated measurement results. + */ + public DiskStatsFileLogger(MeasurementResult result, MeasurementResult downloadsResult, + List stats, long systemSize) { + mResult = result; + mDownloadsSize = downloadsResult.totalAccountedSize(); + mSystemSize = systemSize; + mPackageStats = stats; + } + + /** + * Dumps the storage collection output to a file. + * @param file File to write the output into. + * @throws FileNotFoundException + */ + public void dumpToFile(File file) throws FileNotFoundException { + PrintWriter pw = new PrintWriter(file); + JSONObject representation = getJsonRepresentation(); + if (representation != null) { + pw.println(representation); + } + pw.close(); + } + + private JSONObject getJsonRepresentation() { + JSONObject json = new JSONObject(); + try { + json.put(LAST_QUERY_TIMESTAMP_KEY, System.currentTimeMillis()); + json.put(PHOTOS_KEY, mResult.imagesSize); + json.put(VIDEOS_KEY, mResult.videosSize); + json.put(AUDIO_KEY, mResult.audioSize); + json.put(DOWNLOADS_KEY, mDownloadsSize); + json.put(SYSTEM_KEY, mSystemSize); + json.put(MISC_KEY, mResult.miscSize); + addAppsToJson(json); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + return null; + } + + return json; + } + + private void addAppsToJson(JSONObject json) throws JSONException { + JSONArray names = new JSONArray(); + JSONArray appSizeList = new JSONArray(); + JSONArray cacheSizeList = new JSONArray(); + + long appSizeSum = 0L; + long cacheSizeSum = 0L; + boolean isExternal = Environment.isExternalStorageEmulated(); + for (Map.Entry entry : mergePackagesAcrossUsers().entrySet()) { + PackageStats stat = entry.getValue(); + long appSize = stat.codeSize + stat.dataSize; + long cacheSize = stat.cacheSize; + if (isExternal) { + appSize += stat.externalCodeSize + stat.externalDataSize; + cacheSize += stat.externalCacheSize; + } + appSizeSum += appSize; + cacheSizeSum += cacheSize; + + names.put(stat.packageName); + appSizeList.put(appSize); + cacheSizeList.put(cacheSize); + } + json.put(PACKAGE_NAMES_KEY, names); + json.put(APP_SIZES_KEY, appSizeList); + json.put(APP_CACHES_KEY, cacheSizeList); + json.put(APP_SIZE_AGG_KEY, appSizeSum); + json.put(APP_CACHE_AGG_KEY, cacheSizeSum); + } + + /** + * A given package may exist for multiple users with distinct sizes. This function merges + * the duplicated packages together and sums up their sizes to get the actual totals for the + * package. + * @return A mapping of package name to merged package stats. + */ + private ArrayMap mergePackagesAcrossUsers() { + ArrayMap packageMap = new ArrayMap<>(); + for (PackageStats stat : mPackageStats) { + PackageStats existingStats = packageMap.get(stat.packageName); + if (existingStats != null) { + existingStats.cacheSize += stat.cacheSize; + existingStats.codeSize += stat.codeSize; + existingStats.dataSize += stat.dataSize; + existingStats.externalCacheSize += stat.externalCacheSize; + existingStats.externalCodeSize += stat.externalCodeSize; + existingStats.externalDataSize += stat.externalDataSize; + } else { + packageMap.put(stat.packageName, new PackageStats(stat)); + } + } + return packageMap; + } +} \ No newline at end of file diff --git a/services/core/java/com/android/server/storage/DiskStatsLoggingService.java b/services/core/java/com/android/server/storage/DiskStatsLoggingService.java new file mode 100644 index 000000000000..4035adedafe1 --- /dev/null +++ b/services/core/java/com/android/server/storage/DiskStatsLoggingService.java @@ -0,0 +1,191 @@ +/* + * 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/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.server.storage; + +import android.app.job.JobInfo; +import android.app.job.JobParameters; +import android.app.job.JobScheduler; +import android.app.job.JobService; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.PackageStats; +import android.os.AsyncTask; +import android.os.BatteryManager; +import android.os.Environment; +import android.os.Environment.UserEnvironment; +import android.os.UserHandle; +import android.os.storage.VolumeInfo; +import android.provider.Settings; +import android.util.Log; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.server.storage.FileCollector.MeasurementResult; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * DiskStatsLoggingService is a JobService which collects storage categorization information and + * app size information on a roughly daily cadence. + */ +public class DiskStatsLoggingService extends JobService { + private static final String TAG = "DiskStatsLogService"; + public static final String DUMPSYS_CACHE_PATH = "/data/system/diskstats_cache.json"; + private static final int JOB_DISKSTATS_LOGGING = 0x4449534b; // DISK + private static ComponentName sDiskStatsLoggingService = new ComponentName( + "android", + DiskStatsLoggingService.class.getName()); + + @Override + public boolean onStartJob(JobParameters params) { + // We need to check the preconditions again because they may not be enforced for + // subsequent runs. + if (!isCharging(this) || !isDumpsysTaskEnabled(getContentResolver())) { + jobFinished(params, true); + return false; + } + + + VolumeInfo volume = getPackageManager().getPrimaryStorageCurrentVolume(); + // volume is null if the primary storage is not yet mounted. + if (volume == null) { + return false; + } + AppCollector collector = new AppCollector(this, volume); + + final int userId = UserHandle.myUserId(); + UserEnvironment environment = new UserEnvironment(userId); + LogRunnable task = new LogRunnable(); + task.setRootDirectory(environment.getExternalStorageDirectory()); + task.setDownloadsDirectory( + environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)); + task.setSystemSize(FileCollector.getSystemSize(this)); + task.setLogOutputFile(new File(DUMPSYS_CACHE_PATH)); + task.setAppCollector(collector); + task.setJobService(this, params); + AsyncTask.execute(task); + return true; + } + + @Override + public boolean onStopJob(JobParameters params) { + // TODO: Try to stop being handled. + return false; + } + + /** + * Schedules a DiskStats collection task. This task only runs on device idle while charging + * once every 24 hours. + * @param context Context to use to get a job scheduler. + */ + public static void schedule(Context context) { + JobScheduler js = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + + js.schedule(new JobInfo.Builder(JOB_DISKSTATS_LOGGING, sDiskStatsLoggingService) + .setRequiresDeviceIdle(true) + .setRequiresCharging(true) + .setPeriodic(TimeUnit.DAYS.toMillis(1)) + .build()); + } + + private static boolean isCharging(Context context) { + BatteryManager batteryManager = context.getSystemService(BatteryManager.class); + if (batteryManager != null) { + return batteryManager.isCharging(); + } + return false; + } + + @VisibleForTesting + static boolean isDumpsysTaskEnabled(ContentResolver resolver) { + // The default is to treat the task as enabled. + return Settings.Global.getInt(resolver, Settings.Global.ENABLE_DISKSTATS_LOGGING, 1) != 0; + } + + @VisibleForTesting + static class LogRunnable implements Runnable { + private static final long TIMEOUT_MILLIS = TimeUnit.MINUTES.toMillis(10); + + private JobService mJobService; + private JobParameters mParams; + private AppCollector mCollector; + private File mOutputFile; + private File mRootDirectory; + private File mDownloadsDirectory; + private long mSystemSize; + + public void setRootDirectory(File file) { + mRootDirectory = file; + } + + public void setDownloadsDirectory(File file) { + mDownloadsDirectory = file; + } + + public void setAppCollector(AppCollector collector) { + mCollector = collector; + } + + public void setLogOutputFile(File file) { + mOutputFile = file; + } + + public void setSystemSize(long size) { + mSystemSize = size; + } + + public void setJobService(JobService jobService, JobParameters params) { + mJobService = jobService; + mParams = params; + } + + public void run() { + FileCollector.MeasurementResult mainCategories = + FileCollector.getMeasurementResult(mRootDirectory); + FileCollector.MeasurementResult downloads = + FileCollector.getMeasurementResult(mDownloadsDirectory); + + boolean needsReschedule = true; + List stats = mCollector.getPackageStats(TIMEOUT_MILLIS); + if (stats != null) { + needsReschedule = false; + logToFile(mainCategories, downloads, stats, mSystemSize); + } else { + Log.w("TAG", "Timed out while fetching package stats."); + } + + if (mJobService != null) { + mJobService.jobFinished(mParams, needsReschedule); + } + } + + private void logToFile(MeasurementResult mainCategories, MeasurementResult downloads, + List stats, long systemSize) { + DiskStatsFileLogger logger = new DiskStatsFileLogger(mainCategories, downloads, stats, + systemSize); + try { + mOutputFile.createNewFile(); + logger.dumpToFile(mOutputFile); + } catch (IOException e) { + Log.e(TAG, "Exception while writing opportunistic disk file cache.", e); + } + } + } +} \ No newline at end of file diff --git a/services/core/java/com/android/server/storage/FileCollector.java b/services/core/java/com/android/server/storage/FileCollector.java new file mode 100644 index 000000000000..90f9f1391679 --- /dev/null +++ b/services/core/java/com/android/server/storage/FileCollector.java @@ -0,0 +1,247 @@ +/* + * 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/LICENSE2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.server.storage; + +import android.annotation.IntDef; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.storage.StorageManager; +import android.os.storage.VolumeInfo; +import android.util.ArrayMap; + +import java.io.File; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Map; + +/** + * FileCollector walks over a directory and categorizes storage usage by their type. + */ +public class FileCollector { + private static final int UNRECOGNIZED = -1; + private static final int IMAGES = 0; + private static final int VIDEO = 1; + private static final int AUDIO = 2; + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + UNRECOGNIZED, + IMAGES, + VIDEO, + AUDIO }) + private @interface FileTypes {} + + + private static final Map EXTENSION_MAP = new ArrayMap(); + static { + // Audio + EXTENSION_MAP.put("aac", AUDIO); + EXTENSION_MAP.put("amr", AUDIO); + EXTENSION_MAP.put("awb", AUDIO); + EXTENSION_MAP.put("snd", AUDIO); + EXTENSION_MAP.put("flac", AUDIO); + EXTENSION_MAP.put("mp3", AUDIO); + EXTENSION_MAP.put("mpga", AUDIO); + EXTENSION_MAP.put("mpega", AUDIO); + EXTENSION_MAP.put("mp2", AUDIO); + EXTENSION_MAP.put("m4a", AUDIO); + EXTENSION_MAP.put("aif", AUDIO); + EXTENSION_MAP.put("aiff", AUDIO); + EXTENSION_MAP.put("aifc", AUDIO); + EXTENSION_MAP.put("gsm", AUDIO); + EXTENSION_MAP.put("mka", AUDIO); + EXTENSION_MAP.put("m3u", AUDIO); + EXTENSION_MAP.put("wma", AUDIO); + EXTENSION_MAP.put("wax", AUDIO); + EXTENSION_MAP.put("ra", AUDIO); + EXTENSION_MAP.put("rm", AUDIO); + EXTENSION_MAP.put("ram", AUDIO); + EXTENSION_MAP.put("pls", AUDIO); + EXTENSION_MAP.put("sd2", AUDIO); + EXTENSION_MAP.put("wav", AUDIO); + EXTENSION_MAP.put("ogg", AUDIO); + EXTENSION_MAP.put("oga", AUDIO); + // Video + EXTENSION_MAP.put("3gpp", VIDEO); + EXTENSION_MAP.put("3gp", VIDEO); + EXTENSION_MAP.put("3gpp2", VIDEO); + EXTENSION_MAP.put("3g2", VIDEO); + EXTENSION_MAP.put("avi", VIDEO); + EXTENSION_MAP.put("dl", VIDEO); + EXTENSION_MAP.put("dif", VIDEO); + EXTENSION_MAP.put("dv", VIDEO); + EXTENSION_MAP.put("fli", VIDEO); + EXTENSION_MAP.put("m4v", VIDEO); + EXTENSION_MAP.put("ts", VIDEO); + EXTENSION_MAP.put("mpeg", VIDEO); + EXTENSION_MAP.put("mpg", VIDEO); + EXTENSION_MAP.put("mpe", VIDEO); + EXTENSION_MAP.put("mp4", VIDEO); + EXTENSION_MAP.put("vob", VIDEO); + EXTENSION_MAP.put("qt", VIDEO); + EXTENSION_MAP.put("mov", VIDEO); + EXTENSION_MAP.put("mxu", VIDEO); + EXTENSION_MAP.put("webm", VIDEO); + EXTENSION_MAP.put("lsf", VIDEO); + EXTENSION_MAP.put("lsx", VIDEO); + EXTENSION_MAP.put("mkv", VIDEO); + EXTENSION_MAP.put("mng", VIDEO); + EXTENSION_MAP.put("asf", VIDEO); + EXTENSION_MAP.put("asx", VIDEO); + EXTENSION_MAP.put("wm", VIDEO); + EXTENSION_MAP.put("wmv", VIDEO); + EXTENSION_MAP.put("wmx", VIDEO); + EXTENSION_MAP.put("wvx", VIDEO); + EXTENSION_MAP.put("movie", VIDEO); + EXTENSION_MAP.put("wrf", VIDEO); + // Images + EXTENSION_MAP.put("bmp", IMAGES); + EXTENSION_MAP.put("gif", IMAGES); + EXTENSION_MAP.put("jpg", IMAGES); + EXTENSION_MAP.put("jpeg", IMAGES); + EXTENSION_MAP.put("jpe", IMAGES); + EXTENSION_MAP.put("pcx", IMAGES); + EXTENSION_MAP.put("png", IMAGES); + EXTENSION_MAP.put("svg", IMAGES); + EXTENSION_MAP.put("svgz", IMAGES); + EXTENSION_MAP.put("tiff", IMAGES); + EXTENSION_MAP.put("tif", IMAGES); + EXTENSION_MAP.put("wbmp", IMAGES); + EXTENSION_MAP.put("webp", IMAGES); + EXTENSION_MAP.put("dng", IMAGES); + EXTENSION_MAP.put("cr2", IMAGES); + EXTENSION_MAP.put("ras", IMAGES); + EXTENSION_MAP.put("art", IMAGES); + EXTENSION_MAP.put("jng", IMAGES); + EXTENSION_MAP.put("nef", IMAGES); + EXTENSION_MAP.put("nrw", IMAGES); + EXTENSION_MAP.put("orf", IMAGES); + EXTENSION_MAP.put("rw2", IMAGES); + EXTENSION_MAP.put("pef", IMAGES); + EXTENSION_MAP.put("psd", IMAGES); + EXTENSION_MAP.put("pnm", IMAGES); + EXTENSION_MAP.put("pbm", IMAGES); + EXTENSION_MAP.put("pgm", IMAGES); + EXTENSION_MAP.put("ppm", IMAGES); + EXTENSION_MAP.put("srw", IMAGES); + EXTENSION_MAP.put("arw", IMAGES); + EXTENSION_MAP.put("rgb", IMAGES); + EXTENSION_MAP.put("xbm", IMAGES); + EXTENSION_MAP.put("xpm", IMAGES); + EXTENSION_MAP.put("xwd", IMAGES); + } + + /** + * Returns the file categorization measurement result. + * @param path Directory to collect and categorize storage in. + */ + public static MeasurementResult getMeasurementResult(File path) { + return collectFiles(StorageManager.maybeTranslateEmulatedPathToInternal(path), + new MeasurementResult()); + } + + /** + * Returns the size of a system for a given context. This is done by finding the difference + * between the shared data and the total primary storage size. + * @param context Context to use to get storage information. + */ + public static long getSystemSize(Context context) { + PackageManager pm = context.getPackageManager(); + VolumeInfo primaryVolume = pm.getPrimaryStorageCurrentVolume(); + + StorageManager sm = context.getSystemService(StorageManager.class); + VolumeInfo shared = sm.findEmulatedForPrivate(primaryVolume); + if (shared == null) { + return 0; + } + + final long sharedDataSize = shared.getPath().getTotalSpace(); + long systemSize = sm.getPrimaryStorageSize() - sharedDataSize; + + // This case is not exceptional -- we just fallback to the shared data volume in this case. + if (systemSize <= 0) { + return 0; + } + + return systemSize; + } + + private static MeasurementResult collectFiles(File file, MeasurementResult result) { + File[] files = file.listFiles(); + + if (files == null) { + return result; + } + + for (File f : files) { + if (f.isDirectory()) { + try { + collectFiles(f, result); + } catch (StackOverflowError e) { + return result; + } + } else { + handleFile(result, f); + } + } + + return result; + } + + private static void handleFile(MeasurementResult result, File f) { + long fileSize = f.length(); + int fileType = EXTENSION_MAP.getOrDefault(getExtensionForFile(f), UNRECOGNIZED); + switch (fileType) { + case AUDIO: + result.audioSize += fileSize; + break; + case VIDEO: + result.videosSize += fileSize; + break; + case IMAGES: + result.imagesSize += fileSize; + break; + default: + result.miscSize += fileSize; + } + } + + private static String getExtensionForFile(File file) { + String fileName = file.getName(); + int index = fileName.lastIndexOf('.'); + if (index == -1) { + return ""; + } + return fileName.substring(index + 1).toLowerCase(); + } + + /** + * MeasurementResult contains a storage categorization result. + */ + public static class MeasurementResult { + public long imagesSize; + public long videosSize; + public long miscSize; + public long audioSize; + + /** + * Sums up the storage taken by all of the categorizable sizes in the measurement. + */ + public long totalAccountedSize() { + return imagesSize + videosSize + miscSize + audioSize; + } + } +} diff --git a/services/core/java/com/android/server/twilight/TwilightService.java b/services/core/java/com/android/server/twilight/TwilightService.java index db7df25da3de..bb4d67e0309f 100644 --- a/services/core/java/com/android/server/twilight/TwilightService.java +++ b/services/core/java/com/android/server/twilight/TwilightService.java @@ -59,17 +59,17 @@ public final class TwilightService extends SystemService private final Handler mHandler; - private AlarmManager mAlarmManager; + protected AlarmManager mAlarmManager; private LocationManager mLocationManager; private boolean mBootCompleted; private boolean mHasListeners; private BroadcastReceiver mTimeChangedReceiver; - private Location mLastLocation; + protected Location mLastLocation; @GuardedBy("mListeners") - private TwilightState mLastTwilightState; + protected TwilightState mLastTwilightState; public TwilightService(Context context) { super(context); @@ -247,7 +247,11 @@ public void onAlarm() { @Override public void onLocationChanged(Location location) { - if (location != null) { + // Location providers may erroneously return (0.0, 0.0) when they fail to determine the + // device's location. These location updates can be safely ignored since the chance of a + // user actually being at these coordinates is quite low. + if (location != null + && !(location.getLongitude() == 0.0 && location.getLatitude() == 0.0)) { Slog.d(TAG, "onLocationChanged:" + " provider=" + location.getProvider() + " accuracy=" + location.getAccuracy() diff --git a/services/core/java/com/android/server/vr/VrManagerInternal.java b/services/core/java/com/android/server/vr/VrManagerInternal.java index ad87a885348e..0fc1900166e2 100644 --- a/services/core/java/com/android/server/vr/VrManagerInternal.java +++ b/services/core/java/com/android/server/vr/VrManagerInternal.java @@ -56,25 +56,27 @@ public abstract void setVrMode(boolean enabled, @NonNull ComponentName packageNa int userId, @NonNull ComponentName calling); /** - * Set the current VR mode state immediately. + * Set whether the system has acquired a sleep token. * - * @param enabled {@code true} to enable VR mode. - * @param packageName The package name of the requested VrListenerService to bind. - * @param userId the user requesting the VrListenerService component. - * @param calling the component currently using VR mode, or null to leave unchanged. + * @param isAsleep is {@code true} if the device is asleep, or {@code false} otherwise. */ - public abstract void setVrModeImmediate(boolean enabled, @NonNull ComponentName packageName, - int userId, @NonNull ComponentName calling); + public abstract void onSleepStateChanged(boolean isAsleep); + /** + * Set whether the display used for VR output is on. + * + * @param isScreenOn is {@code true} if the display is on and can receive commands, + * or {@code false} otherwise. + */ + public abstract void onScreenStateChanged(boolean isScreenOn); - /** - * Return NO_ERROR if the given package is installed on the device and enabled as a - * VrListenerService for the given current user, or a negative error code indicating a failure. - * - * @param packageName the name of the package to check, or null to select the default package. - * @return NO_ERROR if the given package is installed and is enabled, or a negative error code - * given in {@link android.service.vr.VrModeException} on failure. - */ + /** + * Return NO_ERROR if the given package is installed on the device and enabled as a + * VrListenerService for the given current user, or a negative error code indicating a failure. + * + * @param packageName the name of the package to check, or null to select the default package. + * @return NO_ERROR if the given package is installed and is enabled, or a negative error code + * given in {@link android.service.vr.VrModeException} on failure. + */ public abstract int hasVrPackage(@NonNull ComponentName packageName, int userId); - } diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java index fdadc8de717f..a9a6aa1000cf 100644 --- a/services/core/java/com/android/server/vr/VrManagerService.java +++ b/services/core/java/com/android/server/vr/VrManagerService.java @@ -86,9 +86,9 @@ * {@link android.app.Activity#setVrModeEnabled)}. An application may also implement a service to * be run while in VR mode by implementing {@link android.service.vr.VrListenerService}. * - * @see {@link android.service.vr.VrListenerService} - * @see {@link com.android.server.vr.VrManagerInternal} - * @see {@link com.android.server.vr.VrStateListener} + * @see android.service.vr.VrListenerService + * @see com.android.server.vr.VrManagerInternal + * @see com.android.server.vr.VrStateListener * * @hide */ @@ -101,6 +101,14 @@ public class VrManagerService extends SystemService implements EnabledComponentC private static final int PENDING_STATE_DELAY_MS = 300; private static final int EVENT_LOG_SIZE = 32; private static final int INVALID_APPOPS_MODE = -1; + /** Null set of sleep sleep flags. */ + private static final int FLAG_NONE = 0; + /** Flag set when the device is not sleeping. */ + private static final int FLAG_AWAKE = 1; + /** Flag set when the screen has been turned on. */ + private static final int FLAG_SCREEN_ON = 2; + /** Flag indicating that all system sleep flags have been set.*/ + private static final int FLAG_ALL = FLAG_AWAKE | FLAG_SCREEN_ON; private static native void initializeNative(); private static native void setVrModeNative(boolean enabled); @@ -110,6 +118,7 @@ public class VrManagerService extends SystemService implements EnabledComponentC private final IBinder mOverlayToken = new Binder(); // State protected by mLock + private boolean mVrModeAllowed; private boolean mVrModeEnabled; private EnabledComponentsObserver mComponentObserver; private ManagedApplicationService mCurrentVrService; @@ -125,10 +134,64 @@ public class VrManagerService extends SystemService implements EnabledComponentC private VrState mPendingState; private final ArrayDeque mLoggingDeque = new ArrayDeque<>(EVENT_LOG_SIZE); private final NotificationAccessManager mNotifAccessManager = new NotificationAccessManager(); + /** Tracks the state of the screen and keyguard UI.*/ + private int mSystemSleepFlags = FLAG_NONE; private static final int MSG_VR_STATE_CHANGE = 0; private static final int MSG_PENDING_VR_STATE_CHANGE = 1; + /** + * Set whether VR mode may be enabled. + *

    + * If VR mode is not allowed to be enabled, calls to set VR mode will be cached. When VR mode + * is again allowed to be enabled, the most recent cached state will be applied. + * + * @param allowed {@code true} if calling any of the setVrMode methods may cause the device to + * enter VR mode. + */ + private void setVrModeAllowedLocked(boolean allowed) { + if (mVrModeAllowed != allowed) { + mVrModeAllowed = allowed; + Slog.i(TAG, "VR mode is " + ((allowed) ? "allowed" : "disallowed")); + if (mVrModeAllowed) { + consumeAndApplyPendingStateLocked(); + } else { + // Set pending state to current state. + mPendingState = (mVrModeEnabled && mCurrentVrService != null) + ? new VrState(mVrModeEnabled, mCurrentVrService.getComponent(), + mCurrentVrService.getUserId(), mCurrentVrModeComponent) + : null; + + // Unbind current VR service and do necessary callbacks. + updateCurrentVrServiceLocked(false, null, 0, null); + } + } + } + + private void setSleepState(boolean isAsleep) { + synchronized(mLock) { + + if (!isAsleep) { + mSystemSleepFlags |= FLAG_AWAKE; + } else { + mSystemSleepFlags &= ~FLAG_AWAKE; + } + + setVrModeAllowedLocked(mSystemSleepFlags == FLAG_ALL); + } + } + + private void setScreenOn(boolean isScreenOn) { + synchronized(mLock) { + if (isScreenOn) { + mSystemSleepFlags |= FLAG_SCREEN_ON; + } else { + mSystemSleepFlags &= ~FLAG_SCREEN_ON; + } + setVrModeAllowedLocked(mSystemSleepFlags == FLAG_ALL); + } + } + private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { @@ -148,7 +211,9 @@ public void handleMessage(Message msg) { } break; case MSG_PENDING_VR_STATE_CHANGE : { synchronized(mLock) { - VrManagerService.this.consumeAndApplyPendingStateLocked(); + if (mVrModeAllowed) { + VrManagerService.this.consumeAndApplyPendingStateLocked(); + } } } break; default : @@ -255,7 +320,6 @@ public void update(Collection packageNames) { public void onEnabledComponentChanged() { synchronized (mLock) { int currentUser = ActivityManager.getCurrentUser(); - // Update listeners ArraySet enabledListeners = mComponentObserver.getEnabled(currentUser); @@ -268,12 +332,12 @@ public void onEnabledComponentChanged() { } mNotifAccessManager.update(enabledPackages); - if (mCurrentVrService == null) { - return; // No active services + if (!mVrModeAllowed) { + return; // Don't do anything, we shouldn't be in VR mode. } // If there is a pending state change, we'd better deal with that first - consumeAndApplyPendingStateLocked(); + consumeAndApplyPendingStateLocked(false); if (mCurrentVrService == null) { return; // No active services @@ -321,6 +385,7 @@ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { return; } pw.println("********* Dump of VrManagerService *********"); + pw.println("VR mode is currently: " + ((mVrModeAllowed) ? "allowed" : "disallowed")); pw.println("Previous state transitions:\n"); String tab = " "; dumpStateTransitions(pw); @@ -374,13 +439,17 @@ private final class LocalService extends VrManagerInternal { @Override public void setVrMode(boolean enabled, ComponentName packageName, int userId, ComponentName callingPackage) { - VrManagerService.this.setVrMode(enabled, packageName, userId, callingPackage, false); + VrManagerService.this.setVrMode(enabled, packageName, userId, callingPackage); } @Override - public void setVrModeImmediate(boolean enabled, ComponentName packageName, int userId, - ComponentName callingPackage) { - VrManagerService.this.setVrMode(enabled, packageName, userId, callingPackage, true); + public void onSleepStateChanged(boolean isAsleep) { + VrManagerService.this.setSleepState(isAsleep); + } + + @Override + public void onScreenStateChanged(boolean isScreenOn) { + VrManagerService.this.setScreenOn(isScreenOn); } @Override @@ -424,6 +493,10 @@ public void onBootPhase(int phase) { mComponentObserver.rebuildAll(); } + } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) { + synchronized (mLock) { + mVrModeAllowed = true; + } } } @@ -466,12 +539,16 @@ private void updateOverlayStateLocked(String exemptedPackage, int newUserId, int false, mOverlayToken, null, oldUserId); } + if (!mVrModeEnabled) { + return; + } + // Apply the restrictions for the current user based on vr state String[] exemptions = (exemptedPackage == null) ? new String[0] : new String[] { exemptedPackage }; appOpsManager.setUserRestrictionForUser(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, - mVrModeEnabled, mOverlayToken, exemptions, newUserId); + true, mOverlayToken, exemptions, newUserId); } private void updateDependentAppOpsLocked(String newVrServicePackage, int newUserId, @@ -512,7 +589,8 @@ private boolean updateCurrentVrServiceLocked(boolean enabled, @NonNull Component boolean validUserComponent = (mComponentObserver.isValid(component, userId) == EnabledComponentsObserver.NO_ERROR); - if (!mVrModeEnabled && !enabled) { + boolean goingIntoVrMode = validUserComponent && enabled; + if (!mVrModeEnabled && !goingIntoVrMode) { return validUserComponent; // Disabled -> Disabled transition does nothing. } @@ -520,29 +598,39 @@ private boolean updateCurrentVrServiceLocked(boolean enabled, @NonNull Component ? mCurrentVrService.getComponent().getPackageName() : null; final int oldUserId = mCurrentVrModeUser; - // Always send mode change events. - changeVrModeLocked(enabled); + // Notify system services and VR HAL of mode change. + changeVrModeLocked(goingIntoVrMode); - if (!enabled || !validUserComponent) { - // Unbind whatever is running + boolean nothingChanged = false; + if (!goingIntoVrMode) { + // Not going into VR mode, unbind whatever is running if (mCurrentVrService != null) { - Slog.i(TAG, "Disconnecting " + mCurrentVrService.getComponent() + " for user " + - mCurrentVrService.getUserId()); + Slog.i(TAG, "Leaving VR mode, disconnecting " + + mCurrentVrService.getComponent() + " for user " + + mCurrentVrService.getUserId()); mCurrentVrService.disconnect(); mCurrentVrService = null; + } else { + nothingChanged = true; } } else { + // Going into VR mode if (mCurrentVrService != null) { - // Unbind any running service that doesn't match the component/user selection + // Unbind any running service that doesn't match the latest component/user + // selection. if (mCurrentVrService.disconnectIfNotMatching(component, userId)) { - Slog.i(TAG, "Disconnecting " + mCurrentVrService.getComponent() + - " for user " + mCurrentVrService.getUserId()); + Slog.i(TAG, "VR mode component changed to " + component + + ", disconnecting " + mCurrentVrService.getComponent() + + " for user " + mCurrentVrService.getUserId()); createAndConnectService(component, userId); sendUpdatedCaller = true; + } else { + nothingChanged = true; } - // The service with the correct component/user is bound + // The service with the correct component/user is already bound, do nothing. } else { - // Nothing was previously running, bind a new service + // Nothing was previously running, bind a new service for the latest + // component/user selection. createAndConnectService(component, userId); sendUpdatedCaller = true; } @@ -577,7 +665,10 @@ public void runEvent(IInterface service) throws RemoteException { } }); } - logStateLocked(); + + if (!nothingChanged) { + logStateLocked(); + } return validUserComponent; } finally { @@ -663,16 +754,28 @@ private void revokeNotificationListenerAccess(String pkg, int userId) { private void grantCoarseLocationPermissionIfNeeded(String pkg, int userId) { // Don't clobber the user if permission set in current state explicitly if (!isPermissionUserUpdated(Manifest.permission.ACCESS_COARSE_LOCATION, pkg, userId)) { - mContext.getPackageManager().grantRuntimePermission(pkg, - Manifest.permission.ACCESS_COARSE_LOCATION, new UserHandle(userId)); + try { + mContext.getPackageManager().grantRuntimePermission(pkg, + Manifest.permission.ACCESS_COARSE_LOCATION, new UserHandle(userId)); + } catch (IllegalArgumentException e) { + // Package was removed during update. + Slog.w(TAG, "Could not grant coarse location permission, package " + pkg + + " was removed."); + } } } private void revokeCoarseLocationPermissionIfNeeded(String pkg, int userId) { // Don't clobber the user if permission set in current state explicitly if (!isPermissionUserUpdated(Manifest.permission.ACCESS_COARSE_LOCATION, pkg, userId)) { - mContext.getPackageManager().revokeRuntimePermission(pkg, - Manifest.permission.ACCESS_COARSE_LOCATION, new UserHandle(userId)); + try { + mContext.getPackageManager().revokeRuntimePermission(pkg, + Manifest.permission.ACCESS_COARSE_LOCATION, new UserHandle(userId)); + } catch (IllegalArgumentException e) { + // Package was removed during update. + Slog.w(TAG, "Could not revoke coarse location permission, package " + pkg + + " was removed."); + } } } @@ -766,12 +869,29 @@ private static ManagedApplicationService create(@NonNull Context context, sBinderChecker); } + /** + * Apply the pending VR state. If no state is pending, disconnect any currently bound + * VR listener service. + */ private void consumeAndApplyPendingStateLocked() { + consumeAndApplyPendingStateLocked(true); + } + + /** + * Apply the pending VR state. + * + * @param disconnectIfNoPendingState if {@code true}, then any currently bound VR listener + * service will be disconnected if no state is pending. If this is {@code false} then the + * nothing will be changed when there is no pending state. + */ + private void consumeAndApplyPendingStateLocked(boolean disconnectIfNoPendingState) { if (mPendingState != null) { updateCurrentVrServiceLocked(mPendingState.enabled, mPendingState.targetPackageName, mPendingState.userId, mPendingState.callingPackage); mPendingState = null; + } else if (disconnectIfNoPendingState) { + updateCurrentVrServiceLocked(false, null, 0, null); } } @@ -822,13 +942,20 @@ private void dumpStateTransitions(PrintWriter pw) { /* * Implementation of VrManagerInternal calls. These are callable from system services. */ - private void setVrMode(boolean enabled, @NonNull ComponentName targetPackageName, - int userId, @NonNull ComponentName callingPackage, boolean immediate) { + int userId, @NonNull ComponentName callingPackage) { synchronized (mLock) { + VrState pending = new VrState(enabled, targetPackageName, userId, callingPackage); + if (!mVrModeAllowed) { + // We're not allowed to be in VR mode. Make this state pending. This will be + // applied the next time we are allowed to enter VR mode unless it is superseded by + // another call. + mPendingState = pending; + return; + } - if (!enabled && mCurrentVrService != null && !immediate) { + if (!enabled && mCurrentVrService != null) { // If we're transitioning out of VR mode, delay briefly to avoid expensive HAL calls // and service bind/unbind in case we are immediately switching to another VR app. if (mPendingState == null) { @@ -836,7 +963,7 @@ private void setVrMode(boolean enabled, @NonNull ComponentName targetPackageName PENDING_STATE_DELAY_MS); } - mPendingState = new VrState(enabled, targetPackageName, userId, callingPackage); + mPendingState = pending; return; } else { mHandler.removeMessages(MSG_PENDING_VR_STATE_CHANGE); diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index d3fb10ad064c..da8fb5df2cb6 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1564,6 +1564,19 @@ private void setWallpaperComponent(ComponentName name, int userId) { throw new IllegalStateException("Wallpaper not yet initialized for user " + userId); } final long ident = Binder.clearCallingIdentity(); + + // Live wallpapers can't be specified for keyguard. If we're using a static + // system+lock image currently, migrate the system wallpaper to be a lock-only + // image as part of making a different live component active as the system + // wallpaper. + if (mImageWallpaper.equals(wallpaper.wallpaperComponent)) { + if (mLockWallpaperMap.get(userId) == null) { + // We're using the static imagery and there is no lock-specific image in place, + // therefore it's a shared system+lock image that we need to migrate. + migrateSystemToLockWallpaperLocked(userId); + } + } + try { wallpaper.imageWallpaperPending = false; if (bindWallpaperComponentLocked(name, false, true, wallpaper, null)) { diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index cd46165b56b3..d8e0b0b84281 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -57,6 +57,7 @@ import android.os.IBinder; import android.os.IRemoteCallback; import android.os.RemoteException; +import android.os.SystemProperties; import android.util.ArraySet; import android.util.Slog; import android.util.SparseArray; @@ -234,6 +235,8 @@ public class AppTransition implements Dump { private boolean mLastHadClipReveal; private boolean mProlongedAnimationsEnded; + private final boolean mGridLayoutRecentsEnabled; + AppTransition(Context context, WindowManagerService service) { mContext = context; mService = service; @@ -272,6 +275,7 @@ public float getInterpolation(float input) { }; mClipRevealTranslationY = (int) (CLIP_REVEAL_TRANSLATION_Y_DP * mContext.getResources().getDisplayMetrics().density); + mGridLayoutRecentsEnabled = SystemProperties.getBoolean("ro.recents.grid", false); } boolean isTransitionSet() { @@ -921,12 +925,12 @@ Animation createThumbnailAspectScaleAnimationLocked(Rect appRect, @Nullable Rect float scaleW = appWidth / thumbWidth; getNextAppTransitionStartRect(taskId, mTmpRect); final float fromX; - final float fromY; + float fromY; final float toX; - final float toY; + float toY; final float pivotX; final float pivotY; - if (isTvUiMode(uiMode) || orientation == Configuration.ORIENTATION_PORTRAIT) { + if (shouldScaleDownThumbnailTransition(uiMode, orientation)) { fromX = mTmpRect.left; fromY = mTmpRect.top; @@ -936,6 +940,12 @@ Animation createThumbnailAspectScaleAnimationLocked(Rect appRect, @Nullable Rect toY = appRect.height() / 2 * (1 - 1 / scaleW) + appRect.top; pivotX = mTmpRect.width() / 2; pivotY = appRect.height() / 2 / scaleW; + if (mGridLayoutRecentsEnabled) { + // In the grid layout, the header is displayed above the thumbnail instead of + // overlapping it. + fromY -= thumbHeightI; + toY -= thumbHeightI * scaleW; + } } else { pivotX = 0; pivotY = 0; @@ -984,7 +994,10 @@ Animation createThumbnailAspectScaleAnimationLocked(Rect appRect, @Nullable Rect // This AnimationSet uses the Interpolators assigned above. AnimationSet set = new AnimationSet(false); set.addAnimation(scale); - set.addAnimation(alpha); + if (!mGridLayoutRecentsEnabled) { + // In the grid layout, the header should be shown for the whole animation. + set.addAnimation(alpha); + } set.addAnimation(translate); set.addAnimation(clipAnim); a = set; @@ -1003,7 +1016,10 @@ Animation createThumbnailAspectScaleAnimationLocked(Rect appRect, @Nullable Rect // This AnimationSet uses the Interpolators assigned above. AnimationSet set = new AnimationSet(false); set.addAnimation(scale); - set.addAnimation(alpha); + if (!mGridLayoutRecentsEnabled) { + // In the grid layout, the header should be shown for the whole animation. + set.addAnimation(alpha); + } set.addAnimation(translate); a = set; @@ -1097,12 +1113,14 @@ Animation createAspectScaledThumbnailEnterExitAnimationLocked(int thumbTransitSt mTmpFromClipRect.inset(contentInsets); mNextAppTransitionInsets.set(contentInsets); - if (isTvUiMode(uiMode) || orientation == Configuration.ORIENTATION_PORTRAIT) { + if (shouldScaleDownThumbnailTransition(uiMode, orientation)) { // We scale the width and clip to the top/left square float scale = thumbWidth / (appWidth - contentInsets.left - contentInsets.right); - int unscaledThumbHeight = (int) (thumbHeight / scale); - mTmpFromClipRect.bottom = mTmpFromClipRect.top + unscaledThumbHeight; + if (!mGridLayoutRecentsEnabled) { + int unscaledThumbHeight = (int) (thumbHeight / scale); + mTmpFromClipRect.bottom = mTmpFromClipRect.top + unscaledThumbHeight; + } mNextAppTransitionInsets.set(contentInsets); @@ -1959,6 +1977,15 @@ && isTransitionEqual(TRANSIT_ACTIVITY_CLOSE)) { return prepared; } + /** + * @return whether the transition should show the thumbnail being scaled down. + */ + private boolean shouldScaleDownThumbnailTransition(int uiMode, int orientation) { + return isTvUiMode(uiMode) + || mGridLayoutRecentsEnabled + || orientation == Configuration.ORIENTATION_PORTRAIT; + } + /** * @return whether the specified {@param uiMode} is the TV mode. */ diff --git a/services/core/java/com/android/server/wm/CircularDisplayMask.java b/services/core/java/com/android/server/wm/CircularDisplayMask.java index ae4154131079..c57dfb676a7e 100644 --- a/services/core/java/com/android/server/wm/CircularDisplayMask.java +++ b/services/core/java/com/android/server/wm/CircularDisplayMask.java @@ -21,6 +21,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; +import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; @@ -85,12 +86,115 @@ public CircularDisplayMask(Display display, SurfaceSession session, int zOrder, mSurfaceControl = ctrl; mDrawNeeded = true; mPaint = new Paint(); - mPaint.setAntiAlias(true); - mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mScreenOffset = screenOffset; mMaskThickness = maskThickness; } + static private double distanceFromCenterSquared(double x, double y) { + return x*x + y*y; + } + + static private double distanceFromCenter(double x, double y) { + return Math.sqrt(distanceFromCenterSquared(x, y)); + } + + static private double verticalLineIntersectsCircle(double x, double radius) { + return Math.sqrt(radius*radius - x*x); + } + + static private double horizontalLineIntersectsCircle(double y, double radius) { + return Math.sqrt(radius*radius - y*y); + } + + static private double triangleArea(double width, double height) { + return width * height / 2.0; + } + + static private double trapezoidArea(double width, double height1, double height2) { + return width * (height1 + height2) / 2.0; + } + + static private double areaUnderChord(double radius, double chordLength) { + double isocelesHeight = Math.sqrt(radius*radius - chordLength * chordLength / 4.0); + double areaUnderIsoceles = isocelesHeight * chordLength / 2.0; + double halfAngle = Math.asin(chordLength / (2.0 * radius)); + double areaUnderArc = halfAngle * radius * radius; + + return areaUnderArc - triangleArea(chordLength, isocelesHeight); + } + + // Returns the fraction of the pixel at (px, py) covered by + // the circle with center (cx, cy) and radius 'radius' + static private double calcPixelShading(double cx, double cy, double px, + double py, double radius) { + // Translate so the center is at the origin + px -= cx; + py -= cy; + + // Reflect across the axis so the point is in the first quadrant + px = Math.abs(px); + py = Math.abs(py); + + // One more transformation which simplifies the logic later + if (py > px) { + double temp; + + temp = px; + px = py; + py = temp; + } + + double left = px - 0.5; + double right = px + 0.5; + double bottom = py - 0.5; + double top = py + 0.5; + + if (distanceFromCenterSquared(left, bottom) > radius*radius) { + return 0.0; + } + + if (distanceFromCenterSquared(right, top) < radius*radius) { + return 1.0; + } + + // Check if only the bottom-left corner of the pixel is inside the circle + if (distanceFromCenterSquared(left, top) > radius*radius) { + double triangleWidth = horizontalLineIntersectsCircle(bottom, radius) - left; + double triangleHeight = verticalLineIntersectsCircle(left, radius) - bottom; + double chordLength = distanceFromCenter(triangleWidth, triangleHeight); + + return triangleArea(triangleWidth, triangleHeight) + + areaUnderChord(radius, chordLength); + + } + + // Check if only the top-right corner of the pixel is outside the circle + if (distanceFromCenterSquared(right, bottom) < radius*radius) { + double triangleWidth = right - horizontalLineIntersectsCircle(top, radius); + double triangleHeight = top - verticalLineIntersectsCircle(right, radius); + double chordLength = distanceFromCenter(triangleWidth, triangleHeight); + + return 1 - triangleArea(triangleWidth, triangleHeight) + + areaUnderChord(radius, chordLength); + } + + // It must be that the top-left and bottom-left corners are inside the circle + double trapezoidWidth1 = horizontalLineIntersectsCircle(top, radius) - left; + double trapezoidWidth2 = horizontalLineIntersectsCircle(bottom, radius) - left; + double chordLength = distanceFromCenter(1, trapezoidWidth2 - trapezoidWidth1); + double shading = trapezoidArea(1.0, trapezoidWidth1, trapezoidWidth2) + + areaUnderChord(radius, chordLength); + + // When top >= 0 and bottom <= 0 it's possible for the circle to intersect the pixel 4 times. + // If so, remove the area of the section which crosses the right-hand edge. + if (top >= 0 && bottom <= 0 && radius > right) { + shading -= areaUnderChord(radius, 2 * verticalLineIntersectsCircle(right, radius)); + } + + return shading; + } + private void drawIfNeeded() { if (!mDrawNeeded || !mVisible || mDimensionsUnequal) { return; @@ -123,11 +227,41 @@ private void drawIfNeeded() { break; } - int circleRadius = mScreenSize.x / 2; c.drawColor(Color.BLACK); - // The radius is reduced by mMaskThickness to provide an anti aliasing effect on the display edges. - c.drawCircle(circleRadius, circleRadius, circleRadius - mMaskThickness, mPaint); + int maskWidth = mScreenSize.x - 2*mMaskThickness; + int maskHeight; + + // Don't render the whole mask if it is partly offscreen. + if (maskWidth > mScreenSize.y) { + maskHeight = mScreenSize.y; + } else { + // To ensure the mask can be properly centered on the canvas the + // bitmap dimensions must have the same parity as those of the canvas. + maskHeight = mScreenSize.y - ((mScreenSize.y - maskWidth) & ~1); + } + + double cx = (maskWidth - 1.0) / 2.0; + double cy = (maskHeight - 1.0 + mScreenOffset) / 2.0; + double radius = maskWidth / 2.0; + int[] pixels = new int[maskWidth * maskHeight]; + + for (int py=0; py { mAnimationStartDelayed = false; if (mDelayedImeWin != null) { diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index e7ceba90bde3..aea8b39bd00b 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -346,7 +346,15 @@ void setWindowWallpaperDisplayOffset(WindowState window, int x, int y) { Bundle sendWindowWallpaperCommand( WindowState window, String action, int x, int y, int z, Bundle extras, boolean sync) { - if (window == mWallpaperTarget + + // HACK(ewol): Custom whitelist for Wear Home app, to allow it to update the wallpaper + // regardless of what window is targeted. + // http://b/32172459 + final boolean hackWearWhitelisted = (window != null) && (window.mAttrs != null) + && "com.google.android.wearable.app".equals(window.mAttrs.packageName); + + if (hackWearWhitelisted + || window == mWallpaperTarget || window == mLowerWallpaperTarget || window == mUpperWallpaperTarget) { boolean doWait = sync; diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index f5ed9d1b8650..961f742f3e27 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -57,6 +57,12 @@ class WindowSurfaceController { private float mSurfaceW = 0; private float mSurfaceH = 0; + // Initialize to the identity matrix. + private float mLastDsdx = 1; + private float mLastDtdx = 0; + private float mLastDsdy = 0; + private float mLastDtdy = 1; + private float mSurfaceAlpha = 0; private int mSurfaceLayer = 0; @@ -266,6 +272,17 @@ void setGeometryAppliesWithResizeInTransaction(boolean recoveringMemory) { void setMatrixInTransaction(float dsdx, float dtdx, float dsdy, float dtdy, boolean recoveringMemory) { + final boolean matrixChanged = mLastDsdx != dsdx || mLastDtdx != dtdx || + mLastDsdy != dsdy || mLastDtdy != dtdy; + if (!matrixChanged) { + return; + } + + mLastDsdx = dsdx; + mLastDtdx = dtdx; + mLastDsdy = dsdy; + mLastDtdy = dtdy; + try { if (SHOW_TRANSACTIONS) logSurface( "MATRIX [" + dsdx + "," + dtdx + "," + dsdy + "," + dtdy + "]", null); @@ -281,7 +298,6 @@ void setMatrixInTransaction(float dsdx, float dtdx, float dsdy, float dtdy, mAnimator.reclaimSomeSurfaceMemory("matrix", true); } } - return; } boolean setSizeInTransaction(int width, int height, boolean recoveringMemory) { @@ -318,6 +334,10 @@ boolean prepareToShowInTransaction(float alpha, int layer, float dsdx, float dtd mSurfaceControl.setAlpha(alpha); mSurfaceLayer = layer; mSurfaceControl.setLayer(layer); + mLastDsdx = dsdx; + mLastDtdx = dtdx; + mLastDsdy = dsdy; + mLastDtdy = dtdy; mSurfaceControl.setMatrix( dsdx, dtdx, dsdy, dtdy); diff --git a/services/core/jni/com_android_server_SystemServer.cpp b/services/core/jni/com_android_server_SystemServer.cpp index c7d6b95083d2..e46490bb3fac 100644 --- a/services/core/jni/com_android_server_SystemServer.cpp +++ b/services/core/jni/com_android_server_SystemServer.cpp @@ -22,15 +22,22 @@ #include #include #include +#include namespace android { +static int start_sensor_service(void* /*unused*/) { + SensorService::instantiate(); + return 0; +} + static void android_server_SystemServer_startSensorService(JNIEnv* /* env */, jobject /* clazz */) { char propBuf[PROPERTY_VALUE_MAX]; property_get("system_init.startsensorservice", propBuf, "1"); if (strcmp(propBuf, "1") == 0) { - // Start the sensor service - SensorService::instantiate(); + // Start the sensor service in a new thread + createThreadEtc(start_sensor_service, nullptr, + "StartSensorThread", PRIORITY_FOREGROUND); } } diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 2f72a5cd1ab5..88cfce8023af 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -1462,7 +1462,11 @@ static void nativeSetCustomPointerIcon(JNIEnv* env, jclass /* clazz */, NativeInputManager* im = reinterpret_cast(ptr); PointerIcon pointerIcon; - android_view_PointerIcon_getLoadedIcon(env, iconObj, &pointerIcon); + status_t result = android_view_PointerIcon_getLoadedIcon(env, iconObj, &pointerIcon); + if (result) { + jniThrowRuntimeException(env, "Failed to load custom pointer icon."); + return; + } SpriteIcon spriteIcon; pointerIcon.bitmap.copyTo(&spriteIcon.bitmap, kN32_SkColorType); diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp index c8e3946970e9..bf91fe3fd0b4 100644 --- a/services/core/jni/com_android_server_lights_LightsService.cpp +++ b/services/core/jni/com_android_server_lights_LightsService.cpp @@ -128,12 +128,12 @@ static void setLight_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr, } } else { // Only set non-brightness settings when not in low-persistence mode - state.color = colorARGB; state.flashMode = flashMode; state.flashOnMS = onMS; state.flashOffMS = offMS; } + state.color = colorARGB; state.brightnessMode = brightnessMode; { diff --git a/services/core/proto/ipconnectivity.proto b/services/core/proto/ipconnectivity.proto index e0d7f0984eb0..cf372bc90c74 100644 --- a/services/core/proto/ipconnectivity.proto +++ b/services/core/proto/ipconnectivity.proto @@ -17,6 +17,22 @@ message NetworkId { optional int32 network_id = 1; }; +// Transport describes a physical technology used by a network. It is a subset +// of the TRANSPORT_* constants defined in android.net.NetworkCapabilities. +enum Transport { + UNKNOWN = 0; + BLUETOOTH = 1; + CELLULAR = 2; + ETHERNET = 3; + WIFI = 4; +}; + +// A pair of (key, value) integers for describing histogram-like statistics. +message Pair { + optional int32 key = 1; + optional int32 value = 2; +}; + // Logs changes in the system default network. Changes can be 1) acquiring a // default network with no previous default, 2) a switch of the system default // network to a new default network, 3) a loss of the system default network. @@ -49,10 +65,12 @@ message DefaultNetworkEvent { // This message is associated to android.net.metrics.IpReachabilityEvent. message IpReachabilityEvent { // The interface name (wlan, rmnet, lo, ...) on which the probe was sent. - optional string if_name = 1; + // Deprecated since version 2, replaced by transport field. + optional string if_name = 1 [deprecated = true]; // The event type code of the probe, represented by constants defined in // android.net.metrics.IpReachabilityEvent. + // NUD_FAILED_ORGANIC and PROVISIONING_LOST_ORGANIC recorded since version 1. optional int32 event_type = 2; }; @@ -92,6 +110,7 @@ message ValidationProbeEvent { // Logs DNS lookup latencies. Repeated fields must have the same length. // This message is associated to android.net.metrics.DnsEvent. +// Deprecated since version 2. message DNSLookupBatch { // The id of the network on which the DNS lookups took place. optional NetworkId network_id = 1; @@ -106,13 +125,62 @@ message DNSLookupBatch { repeated int32 latencies_ms = 4; }; +// Represents a collections of DNS lookup latencies and counters for a +// particular combination of DNS query type and return code. +// Since version 2. +message DNSLatencies { + // The type of the DNS lookups, as defined in android.net.metrics.DnsEvent. + // Acts as a key for a set of DNS query results. + // Possible values are: 0 for getaddrinfo, 1 for gethostbyname. + optional int32 type = 1; + + // The return value of the DNS resolver for the DNS lookups. + // Acts as a key for a set of DNS query results. + // Possible values are: 0 for success, or errno code for failures. + optional int32 return_code = 2; + + // The number of query operations recorded. + optional int32 query_count = 3; + + // The number of query operations returning A IPv4 records. + optional int32 a_count = 4; + + // The number of query operations returning AAAA IPv6 records. + optional int32 aaaa_count = 5; + + // The time it took for each DNS lookup to complete. The number of repeated + // values can be less than query_count in case of event rate-limiting. + repeated int32 latencies_ms = 6; +}; + +// Represents latency and errno statistics of the connect() system call. +// Since version 2. +message ConnectStatistics { + // The number of connect() operations recorded. + optional int32 connect_count = 1; + + // The number of connect() operations with IPv6 socket address. + optional int32 ipv6_addr_count = 2; + + // The time it took for each successful connect() operation to complete. + // The number of repeated values can be less than connect_count in case of + // event rate-limiting. + repeated int32 latencies_ms = 3; + + // Counts of all error values returned by failed connect() operations. + // The Pair key field is the errno code. The Pair value field is the count + // for that errno code. + repeated Pair errnos_counters = 4; +}; + // Represents a DHCP event on a single interface, which can be a DHCPClient // state transition or a response packet parsing error. // This message is associated to android.net.metrics.DhcpClientEvent and // android.net.metrics.DhcpErrorEvent. message DHCPEvent { // The interface name (wlan, rmnet, lo, ...) on which the event happened. - optional string if_name = 1; + // Deprecated since version 2, replaced by transport field. + optional string if_name = 1 [deprecated = true]; oneof value { // The name of a state in the DhcpClient state machine, represented by @@ -126,11 +194,12 @@ message DHCPEvent { // Lifetime duration in milliseconds of a DhcpClient state, or transition // time in milliseconds between specific pairs of DhcpClient's states. - // Only populated when state_transition is populated. + // Only populated since version 1, when state_transition is populated. optional int32 duration_ms = 4; } // Represents the generation of an Android Packet Filter program. +// Since version 1. message ApfProgramEvent { // Lifetime of the program in seconds. optional int64 lifetime = 1; @@ -154,6 +223,7 @@ message ApfProgramEvent { // Represents Router Advertisement listening statistics for an interface with // Android Packet Filter enabled. +// Since version 1. message ApfStatistics { // The time interval in milliseconds these stastistics cover. optional int64 duration_ms = 1; @@ -183,6 +253,7 @@ message ApfStatistics { // Represents the reception of a Router Advertisement packet for an interface // with Android Packet Filter enabled. +// Since version 1. message RaEvent { // All lifetime values are expressed in seconds. The default value for an // option lifetime that was not present in the RA option list is -1. @@ -213,7 +284,8 @@ message RaEvent { // This message is associated to android.net.metrics.IpManagerEvent. message IpProvisioningEvent { // The interface name (wlan, rmnet, lo, ...) on which the probe was sent. - optional string if_name = 1; + // Deprecated since version 2, replaced by transport field. + optional string if_name = 1 [deprecated = true]; // The code of the IP provisioning event, represented by constants defined in // android.net.metrics.IpManagerEvent. @@ -224,11 +296,15 @@ message IpProvisioningEvent { } // Represents one of the IP connectivity event defined in this file. -// Next tag: 12 +// Next tag: 15 message IpConnectivityEvent { // Time in ms when the event was recorded. optional int64 time_ms = 1; + // Physical transport of the network on which the event happened. + // Since version 2. + optional Transport transport = 12; + // Event type. oneof event { @@ -242,7 +318,14 @@ message IpConnectivityEvent { NetworkEvent network_event = 4; // A batch of DNS lookups. - DNSLookupBatch dns_lookup_batch = 5; + // Deprecated in the nyc-mr2 release since version 2, and replaced by dns_latencies. + DNSLookupBatch dns_lookup_batch = 5 [deprecated = true]; + + // DNS lookup latency statistics. + DNSLatencies dns_latencies = 13; + + // Connect latency and errno statistics. + ConnectStatistics connect_statistics = 14; // A DHCP client event or DHCP receive error. DHCPEvent dhcp_event = 6; @@ -271,4 +354,11 @@ message IpConnectivityLog { // The number of events that had to be dropped due to a full buffer. optional int32 dropped_events = 2; + + // The version number of the metrics events being collected. + // nyc-dev: not populated, implicitly 0. + // nyc-dr1: not populated, implicitly 1 (sailfish and marlin only). + // nyc-mr1: not populated, implicitly 1. + // nyc-mr2: 2. + optional int32 version = 3; }; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 43168660a316..e3b6ecc749cf 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -17,6 +17,7 @@ package com.android.server.devicepolicy; import static android.Manifest.permission.MANAGE_CA_CERTIFICATES; +import static android.app.admin.DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; import static android.app.admin.DevicePolicyManager.WIPE_EXTERNAL_STORAGE; import static android.app.admin.DevicePolicyManager.WIPE_RESET_PROTECTION_DATA; @@ -37,6 +38,7 @@ import android.annotation.UserIdInt; import android.app.Activity; import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.ActivityManagerNative; import android.app.AlarmManager; import android.app.AppGlobals; @@ -50,6 +52,7 @@ import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManagerInternal; import android.app.admin.IDevicePolicyManager; +import android.app.admin.NetworkEvent; import android.app.admin.SecurityLog; import android.app.admin.SecurityLog.SecurityEvent; import android.app.admin.SystemUpdatePolicy; @@ -77,8 +80,10 @@ import android.media.AudioManager; import android.media.IAudioService; import android.net.ConnectivityManager; +import android.net.IIpConnectivityMetrics; import android.net.ProxyInfo; import android.net.Uri; +import android.net.metrics.IpConnectivityLog; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.AsyncTask; @@ -215,6 +220,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private static final int MONITORING_CERT_NOTIFICATION_ID = R.plurals.ssl_ca_cert_warning; private static final int PROFILE_WIPED_NOTIFICATION_ID = 1001; + private static final int NETWORK_LOGGING_NOTIFICATION_ID = 1002; private static final String ATTR_PERMISSION_PROVIDER = "permission-provider"; private static final String ATTR_SETUP_COMPLETE = "setup-complete"; @@ -222,6 +228,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private static final String ATTR_PERMISSION_POLICY = "permission-policy"; private static final String ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED = "device-provisioning-config-applied"; + private static final String ATTR_DEVICE_PAIRED = "device-paired"; private static final String ATTR_DELEGATED_CERT_INSTALLER = "delegated-cert-installer"; private static final String ATTR_APPLICATION_RESTRICTIONS_MANAGER @@ -301,6 +308,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private static final int CODE_NONSYSTEM_USER_EXISTS = 5; private static final int CODE_ACCOUNTS_NOT_EMPTY = 6; private static final int CODE_NOT_SYSTEM_USER = 7; + private static final int CODE_HAS_PAIRED = 8; @Retention(RetentionPolicy.SOURCE) @IntDef({ CODE_OK, CODE_HAS_DEVICE_OWNER, CODE_USER_HAS_PROFILE_OWNER, CODE_USER_NOT_RUNNING, @@ -344,7 +352,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { */ boolean mHasFeature; + /** + * Whether or not this device is a watch. + */ + boolean mIsWatch; + private final SecurityLogMonitor mSecurityLogMonitor; + private NetworkLogger mNetworkLogger; private final AtomicBoolean mRemoteBugreportServiceIsActive = new AtomicBoolean(); private final AtomicBoolean mRemoteBugreportSharingAccepted = new AtomicBoolean(); @@ -424,6 +438,7 @@ public static class DevicePolicyData { int mPasswordOwner = -1; long mLastMaximumTimeToLock = -1; boolean mUserSetupComplete = false; + boolean mPaired = false; int mUserProvisioningState; int mPermissionPolicy; @@ -470,6 +485,19 @@ public void onReceive(Context context, Intent intent) { final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId()); + /* + * Network logging would ideally be started in setDeviceOwnerSystemPropertyLocked(), + * however it's too early in the boot process to register with IIpConnectivityMetrics + * to listen for events. + */ + if (Intent.ACTION_USER_STARTED.equals(action) + && userHandle == mOwners.getDeviceOwnerUserId()) { + synchronized (DevicePolicyManagerService.this) { + if (isNetworkLoggingEnabledInternalLocked()) { + setNetworkLoggingActiveInternal(true); + } + } + } if (Intent.ACTION_BOOT_COMPLETED.equals(action) && userHandle == mOwners.getDeviceOwnerUserId() && getDeviceOwnerRemoteBugreportUri() != null) { @@ -541,6 +569,7 @@ static class ActiveAdmin { private static final String TAG_DISABLE_ACCOUNT_MANAGEMENT = "disable-account-management"; private static final String TAG_REQUIRE_AUTO_TIME = "require_auto_time"; private static final String TAG_FORCE_EPHEMERAL_USERS = "force_ephemeral_users"; + private static final String TAG_IS_NETWORK_LOGGING_ENABLED = "is_network_logging_enabled"; private static final String TAG_ACCOUNT_TYPE = "account-type"; private static final String TAG_PERMITTED_ACCESSIBILITY_SERVICES = "permitted-accessiblity-services"; @@ -579,6 +608,8 @@ static class ActiveAdmin { private static final String TAG_PARENT_ADMIN = "parent-admin"; private static final String TAG_ORGANIZATION_COLOR = "organization-color"; private static final String TAG_ORGANIZATION_NAME = "organization-name"; + private static final String ATTR_LAST_NETWORK_LOGGING_NOTIFICATION = "last-notification"; + private static final String ATTR_NUM_NETWORK_LOGGING_NOTIFICATIONS = "num-notifications"; final DeviceAdminInfo info; @@ -635,6 +666,12 @@ static class ActiveAdmin { boolean disableScreenCapture = false; // Can only be set by a device/profile owner. boolean requireAutoTime = false; // Can only be set by a device owner. boolean forceEphemeralUsers = false; // Can only be set by a device owner. + boolean isNetworkLoggingEnabled = false; // Can only be set by a device owner. + + // one notification after enabling + 3 more after reboots + static final int DEF_MAXIMUM_NETWORK_LOGGING_NOTIFICATIONS_SHOWN = 4; + int numNetworkLoggingNotifications = 0; + long lastNetworkLoggingNotificationTimeMs = 0; // Time in milliseconds since epoch ActiveAdmin parentAdmin; final boolean isParent; @@ -843,6 +880,15 @@ void writeToXml(XmlSerializer out) out.attribute(null, ATTR_VALUE, Boolean.toString(forceEphemeralUsers)); out.endTag(null, TAG_FORCE_EPHEMERAL_USERS); } + if (isNetworkLoggingEnabled) { + out.startTag(null, TAG_IS_NETWORK_LOGGING_ENABLED); + out.attribute(null, ATTR_VALUE, Boolean.toString(isNetworkLoggingEnabled)); + out.attribute(null, ATTR_NUM_NETWORK_LOGGING_NOTIFICATIONS, + Integer.toString(numNetworkLoggingNotifications)); + out.attribute(null, ATTR_LAST_NETWORK_LOGGING_NOTIFICATION, + Long.toString(lastNetworkLoggingNotificationTimeMs)); + out.endTag(null, TAG_IS_NETWORK_LOGGING_ENABLED); + } if (disabledKeyguardFeatures != DEF_KEYGUARD_FEATURES_DISABLED) { out.startTag(null, TAG_DISABLE_KEYGUARD_FEATURES); out.attribute(null, ATTR_VALUE, Integer.toString(disabledKeyguardFeatures)); @@ -1029,6 +1075,13 @@ void readFromXml(XmlPullParser parser) } else if (TAG_FORCE_EPHEMERAL_USERS.equals(tag)) { forceEphemeralUsers = Boolean.parseBoolean( parser.getAttributeValue(null, ATTR_VALUE)); + } else if (TAG_IS_NETWORK_LOGGING_ENABLED.equals(tag)) { + isNetworkLoggingEnabled = Boolean.parseBoolean( + parser.getAttributeValue(null, ATTR_VALUE)); + lastNetworkLoggingNotificationTimeMs = Long.parseLong( + parser.getAttributeValue(null, ATTR_LAST_NETWORK_LOGGING_NOTIFICATION)); + numNetworkLoggingNotifications = Integer.parseInt( + parser.getAttributeValue(null, ATTR_NUM_NETWORK_LOGGING_NOTIFICATIONS)); } else if (TAG_DISABLE_KEYGUARD_FEATURES.equals(tag)) { disabledKeyguardFeatures = Integer.parseInt( parser.getAttributeValue(null, ATTR_VALUE)); @@ -1269,6 +1322,8 @@ void dump(String prefix, PrintWriter pw) { pw.println(requireAutoTime); pw.print(prefix); pw.print("forceEphemeralUsers="); pw.println(forceEphemeralUsers); + pw.print(prefix); pw.print("isNetworkLoggingEnabled="); + pw.println(isNetworkLoggingEnabled); pw.print(prefix); pw.print("disabledKeyguardFeatures="); pw.println(disabledKeyguardFeatures); pw.print(prefix); pw.print("crossProfileWidgetProviders="); @@ -1395,6 +1450,11 @@ NotificationManager getNotificationManager() { return mContext.getSystemService(NotificationManager.class); } + IIpConnectivityMetrics getIIpConnectivityMetrics() { + return (IIpConnectivityMetrics) IIpConnectivityMetrics.Stub.asInterface( + ServiceManager.getService(IpConnectivityLog.SERVICE_NAME)); + } + PowerManagerInternal getPowerManagerInternal() { return LocalServices.getService(PowerManagerInternal.class); } @@ -1407,6 +1467,10 @@ TrustManager getTrustManager() { return (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE); } + AlarmManager getAlarmManager() { + return (AlarmManager) mContext.getSystemService(AlarmManager.class); + } + IWindowManager getIWindowManager() { return IWindowManager.Stub .asInterface(ServiceManager.getService(Context.WINDOW_SERVICE)); @@ -1615,6 +1679,8 @@ public DevicePolicyManagerService(Context context) { mHasFeature = mContext.getPackageManager() .hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN); + mIsWatch = mContext.getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_WATCH); if (!mHasFeature) { // Skip the rest of the initialization return; @@ -1715,8 +1781,14 @@ void loadOwners() { } private void setDeviceOwnerSystemPropertyLocked() { - // Device owner may still be provisioned, do not set the read-only system property yet. - if (mInjector.settingsGlobalGetInt(Settings.Global.DEVICE_PROVISIONED, 0) == 0) { + final boolean deviceProvisioned = + mInjector.settingsGlobalGetInt(Settings.Global.DEVICE_PROVISIONED, 0) != 0; + // If the device is not provisioned and there is currently no device owner, do not set the + // read-only system property yet, since Device owner may still be provisioned. For Wear + // devices, if there is already a device owner then it's OK to set the property to true now, + // regardless the provision state. + final boolean isWatchWithDeviceOwner = mIsWatch && mOwners.hasDeviceOwner(); + if (!isWatchWithDeviceOwner && !deviceProvisioned) { return; } // Still at the first stage of CryptKeeper double bounce, mOwners.hasDeviceOwner is @@ -1924,7 +1996,7 @@ private void setExpirationAlarmCheckLocked(Context context, int userHandle, bool long token = mInjector.binderClearCallingIdentity(); try { int affectedUserHandle = parent ? getProfileParentId(userHandle) : userHandle; - AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + AlarmManager am = mInjector.getAlarmManager(); PendingIntent pi = PendingIntent.getBroadcastAsUser(context, REQUEST_EXPIRE_PASSWORD, new Intent(ACTION_EXPIRED_PASSWORD_NOTIFICATION), PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT, @@ -2215,6 +2287,10 @@ private void saveSettingsLocked(int userHandle) { out.attribute(null, ATTR_SETUP_COMPLETE, Boolean.toString(true)); } + if (policy.mPaired) { + out.attribute(null, ATTR_DEVICE_PAIRED, + Boolean.toString(true)); + } if (policy.mDeviceProvisioningConfigApplied) { out.attribute(null, ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED, Boolean.toString(true)); @@ -2383,6 +2459,10 @@ private void loadSettingsLocked(DevicePolicyData policy, int userHandle) { if (userSetupComplete != null && Boolean.toString(true).equals(userSetupComplete)) { policy.mUserSetupComplete = true; } + String paired = parser.getAttributeValue(null, ATTR_DEVICE_PAIRED); + if (paired != null && Boolean.toString(true).equals(paired)) { + policy.mPaired = true; + } String deviceProvisioningConfigApplied = parser.getAttributeValue(null, ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED); if (deviceProvisioningConfigApplied != null @@ -2602,7 +2682,7 @@ private void onLockSettingsReady() { // Register an observer for watching for user setup complete. new SetupContentObserver(mHandler).register(); // Initialize the user setup state, to handle the upgrade case. - updateUserSetupComplete(); + updateUserSetupCompleteAndPaired(); List packageList; synchronized (this) { @@ -4677,7 +4757,7 @@ public String getAlwaysOnVpnPackage(ComponentName admin) } } - private void wipeDataLocked(boolean wipeExtRequested, String reason) { + private void wipeDataNoLock(boolean wipeExtRequested, String reason) { if (wipeExtRequested) { StorageManager sm = (StorageManager) mContext.getSystemService( Context.STORAGE_SERVICE); @@ -4697,13 +4777,14 @@ public void wipeData(int flags) { } final int userHandle = mInjector.userHandleGetCallingUserId(); enforceFullCrossUsersPermission(userHandle); + + final String source; synchronized (this) { // This API can only be called by an active device admin, // so try to retrieve it to check that the caller is one. final ActiveAdmin admin = getActiveAdminForCallerLocked(null, DeviceAdminInfo.USES_POLICY_WIPE_DATA); - - final String source = admin.info.getComponent().flattenToShortString(); + source = admin.info.getComponent().flattenToShortString(); long ident = mInjector.binderClearCallingIdentity(); try { @@ -4718,39 +4799,44 @@ public void wipeData(int flags) { manager.wipe(); } } - boolean wipeExtRequested = (flags & WIPE_EXTERNAL_STORAGE) != 0; - wipeDeviceOrUserLocked(wipeExtRequested, userHandle, - "DevicePolicyManager.wipeData() from " + source); } finally { mInjector.binderRestoreCallingIdentity(ident); } } + final boolean wipeExtRequested = (flags & WIPE_EXTERNAL_STORAGE) != 0; + wipeDeviceNoLock(wipeExtRequested, userHandle, + "DevicePolicyManager.wipeData() from " + source); } - private void wipeDeviceOrUserLocked(boolean wipeExtRequested, final int userHandle, String reason) { - if (userHandle == UserHandle.USER_SYSTEM) { - wipeDataLocked(wipeExtRequested, reason); - } else { - mHandler.post(new Runnable() { - @Override - public void run() { - try { - IActivityManager am = mInjector.getIActivityManager(); - if (am.getCurrentUser().id == userHandle) { - am.switchUser(UserHandle.USER_SYSTEM); - } + private void wipeDeviceNoLock(boolean wipeExtRequested, final int userHandle, String reason) { + final long ident = mInjector.binderClearCallingIdentity(); + try { + if (userHandle == UserHandle.USER_SYSTEM) { + wipeDataNoLock(wipeExtRequested, reason); + } else { + mHandler.post(new Runnable() { + @Override + public void run() { + try { + IActivityManager am = mInjector.getIActivityManager(); + if (am.getCurrentUser().id == userHandle) { + am.switchUser(UserHandle.USER_SYSTEM); + } - boolean isManagedProfile = isManagedProfile(userHandle); - if (!mUserManager.removeUser(userHandle)) { - Slog.w(LOG_TAG, "Couldn't remove user " + userHandle); - } else if (isManagedProfile) { - sendWipeProfileNotification(); + boolean isManagedProfile = isManagedProfile(userHandle); + if (!mUserManager.removeUser(userHandle)) { + Slog.w(LOG_TAG, "Couldn't remove user " + userHandle); + } else if (isManagedProfile) { + sendWipeProfileNotification(); + } + } catch (RemoteException re) { + // Shouldn't happen } - } catch (RemoteException re) { - // Shouldn't happen } - } - }); + }); + } + } finally { + mInjector.binderRestoreCallingIdentity(ident); } } @@ -4930,7 +5016,7 @@ public void reportFailedPasswordAttempt(int userHandle) { } if (wipeData) { // Call without holding lock. - wipeDeviceOrUserLocked(false, identifier, + wipeDeviceNoLock(false, identifier, "reportFailedPasswordAttempt()"); } } finally { @@ -5647,8 +5733,12 @@ private void shareBugreportWithDeviceOwnerIfExists(String bugreportUriString, intent.setComponent(mOwners.getDeviceOwnerComponent()); intent.setDataAndType(bugreportUri, RemoteBugreportUtils.BUGREPORT_MIMETYPE); intent.putExtra(DeviceAdminReceiver.EXTRA_BUGREPORT_HASH, bugreportHash); - mContext.grantUriPermission(mOwners.getDeviceOwnerComponent().getPackageName(), - bugreportUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + + LocalServices.getService(ActivityManagerInternal.class) + .grantUriPermissionFromIntent(Process.SHELL_UID, + mOwners.getDeviceOwnerComponent().getPackageName(), + intent, mOwners.getDeviceOwnerUserId()); mContext.sendBroadcastAsUser(intent, UserHandle.of(mOwners.getDeviceOwnerUserId())); } } catch (FileNotFoundException e) { @@ -5854,8 +5944,10 @@ public boolean setDeviceOwner(ComponentName admin, String ownerName, int userId) throw new IllegalArgumentException("Invalid component " + admin + " for device owner"); } + final boolean hasIncompatibleAccountsOrNonAdb = + hasIncompatibleAccountsOrNonAdbNoLock(userId, admin); synchronized (this) { - enforceCanSetDeviceOwnerLocked(admin, userId); + enforceCanSetDeviceOwnerLocked(admin, userId, hasIncompatibleAccountsOrNonAdb); if (getActiveAdminUncheckedLocked(admin, userId) == null || getUserData(userId).mRemovingAdmins.contains(admin)) { throw new IllegalArgumentException("Not active admin: " + admin); @@ -6027,8 +6119,10 @@ private void clearDeviceOwnerLocked(ActiveAdmin admin, int userId) { updateDeviceOwnerLocked(); disableDeviceOwnerManagedSingleUserFeaturesIfNeeded(); try { - // Reactivate backup service. - mInjector.getIBackupManager().setBackupServiceActive(UserHandle.USER_SYSTEM, true); + if (mInjector.getIBackupManager() != null) { + // Reactivate backup service. + mInjector.getIBackupManager().setBackupServiceActive(UserHandle.USER_SYSTEM, true); + } } catch (RemoteException e) { throw new IllegalStateException("Failed reactivating backup service.", e); } @@ -6044,8 +6138,10 @@ public boolean setProfileOwner(ComponentName who, String ownerName, int userHand throw new IllegalArgumentException("Component " + who + " not installed for userId:" + userHandle); } + final boolean hasIncompatibleAccountsOrNonAdb = + hasIncompatibleAccountsOrNonAdbNoLock(userHandle, who); synchronized (this) { - enforceCanSetProfileOwnerLocked(who, userHandle); + enforceCanSetProfileOwnerLocked(who, userHandle, hasIncompatibleAccountsOrNonAdb); if (getActiveAdminUncheckedLocked(who, userHandle) == null || getUserData(userHandle).mRemovingAdmins.contains(who)) { @@ -6141,6 +6237,9 @@ public boolean hasUserSetupCompleted() { 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; @@ -6148,6 +6247,13 @@ private boolean hasUserSetupCompleted(int userHandle) { return getUserData(userHandle).mUserSetupComplete; } + private boolean hasPaired(int userHandle) { + if (!mHasFeature) { + return true; + } + return getUserData(userHandle).mPaired; + } + @Override public int getUserProvisioningState() { if (!mHasFeature) { @@ -6356,9 +6462,10 @@ private String getApplicationLabel(String packageName, int userHandle) { * The profile owner can only be set before the user setup phase has completed, * except for: * - SYSTEM_UID - * - adb if there are no accounts. (But see {@link #hasIncompatibleAccountsLocked}) + * - adb unless hasIncompatibleAccountsOrNonAdb is true. */ - private void enforceCanSetProfileOwnerLocked(@Nullable ComponentName owner, int userHandle) { + private void enforceCanSetProfileOwnerLocked(@Nullable ComponentName owner, int userHandle, + boolean hasIncompatibleAccountsOrNonAdb) { UserInfo info = getUserInfo(userHandle); if (info == null) { // User doesn't exist. @@ -6378,15 +6485,15 @@ private void enforceCanSetProfileOwnerLocked(@Nullable ComponentName owner, int } int callingUid = mInjector.binderGetCallingUid(); if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) { - if (hasUserSetupCompleted(userHandle) - && hasIncompatibleAccountsLocked(userHandle, owner)) { + if ((mIsWatch || hasUserSetupCompleted(userHandle)) + && hasIncompatibleAccountsOrNonAdb) { throw new IllegalStateException("Not allowed to set the profile owner because " + "there are already some accounts on the profile"); } 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"); } @@ -6396,14 +6503,16 @@ && hasIncompatibleAccountsLocked(userHandle, owner)) { * The Device owner can only be set by adb or an app with the MANAGE_PROFILE_AND_DEVICE_OWNERS * permission. */ - private void enforceCanSetDeviceOwnerLocked(@Nullable ComponentName owner, int userId) { + private void enforceCanSetDeviceOwnerLocked(@Nullable ComponentName owner, int userId, + boolean hasIncompatibleAccountsOrNonAdb) { int callingUid = mInjector.binderGetCallingUid(); boolean isAdb = callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID; if (!isAdb) { enforceCanManageProfileAndDeviceOwners(); } - final int code = checkSetDeviceOwnerPreConditionLocked(owner, userId, isAdb); + final int code = checkSetDeviceOwnerPreConditionLocked(owner, userId, isAdb, + hasIncompatibleAccountsOrNonAdb); switch (code) { case CODE_OK: return; @@ -6426,6 +6535,9 @@ private void enforceCanSetDeviceOwnerLocked(@Nullable ComponentName owner, int u case CODE_ACCOUNTS_NOT_EMPTY: throw new IllegalStateException("Not allowed to set the device owner because there " + "are already some accounts on the device"); + case CODE_HAS_PAIRED: + throw new IllegalStateException("Not allowed to set the device owner because this " + + "device has already paired"); default: throw new IllegalStateException("Unknown @DeviceOwnerPreConditionCode " + code); } @@ -6489,6 +6601,16 @@ private void enforceNotManagedProfile(int userHandle, String message) { } } + private void enforceDeviceOwnerOrManageUsers() { + synchronized (this) { + if (getActiveAdminWithPolicyForUidLocked(null, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER, + mInjector.binderGetCallingUid()) != null) { + return; + } + } + enforceManageUsers(); + } + private void ensureCallerPackage(@Nullable String packageName) { if (packageName == null) { Preconditions.checkState(isCallerWithSystemUid(), @@ -8185,14 +8307,15 @@ private boolean setStatusBarDisabledInternal(boolean disabled, int userId) { } /** - * We need to update the internal state of whether a user has completed setup once. After - * that, we ignore any changes that reset the Settings.Secure.USER_SETUP_COMPLETE changes - * as we don't trust any apps that might try to reset it. + * We need to update the internal state of whether a user has completed setup or a + * device has paired once. After that, we ignore any changes that reset the + * Settings.Secure.USER_SETUP_COMPLETE or Settings.Secure.DEVICE_PAIRED change + * as we don't trust any apps that might try to reset them. *

    * Unfortunately, we don't know which user's setup state was changed, so we write all of * them. */ - void updateUserSetupComplete() { + void updateUserSetupCompleteAndPaired() { List users = mUserManager.getUsers(true); final int N = users.size(); for (int i = 0; i < N; i++) { @@ -8207,6 +8330,16 @@ void updateUserSetupComplete() { } } } + if (mIsWatch && mInjector.settingsSecureGetIntForUser(Settings.Secure.DEVICE_PAIRED, 0, + userHandle) != 0) { + DevicePolicyData policy = getUserData(userHandle); + if (!policy.mPaired) { + policy.mPaired = true; + synchronized (this) { + saveSettingsLocked(userHandle); + } + } + } } } @@ -8216,6 +8349,7 @@ private class SetupContentObserver extends ContentObserver { Settings.Secure.USER_SETUP_COMPLETE); private final Uri mDeviceProvisioned = Settings.Global.getUriFor( Settings.Global.DEVICE_PROVISIONED); + private final Uri mPaired = Settings.Secure.getUriFor(Settings.Secure.DEVICE_PAIRED); public SetupContentObserver(Handler handler) { super(handler); @@ -8224,12 +8358,15 @@ public SetupContentObserver(Handler handler) { void register() { mInjector.registerContentObserver(mUserSetupComplete, false, this, UserHandle.USER_ALL); mInjector.registerContentObserver(mDeviceProvisioned, false, this, UserHandle.USER_ALL); + if (mIsWatch) { + mInjector.registerContentObserver(mPaired, false, this, UserHandle.USER_ALL); + } } @Override public void onChange(boolean selfChange, Uri uri) { - if (mUserSetupComplete.equals(uri)) { - updateUserSetupComplete(); + if (mUserSetupComplete.equals(uri) || (mIsWatch && mPaired.equals(uri))) { + updateUserSetupCompleteAndPaired(); } else if (mDeviceProvisioned.equals(uri)) { synchronized (DevicePolicyManagerService.this) { // Set PROPERTY_DEVICE_OWNER_PRESENT, for the SUW case where setting the property @@ -8613,6 +8750,9 @@ public boolean isProvisioningAllowed(String action) { 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()) { @@ -8629,7 +8769,8 @@ public boolean isProvisioningAllowed(String action) { * except for adb command if no accounts or additional users are present on the device. */ private synchronized @DeviceOwnerPreConditionCode int checkSetDeviceOwnerPreConditionLocked( - @Nullable ComponentName owner, int deviceOwnerUserId, boolean isAdb) { + @Nullable ComponentName owner, int deviceOwnerUserId, boolean isAdb, + boolean hasIncompatibleAccountsOrNonAdb) { if (mOwners.hasDeviceOwner()) { return CODE_HAS_DEVICE_OWNER; } @@ -8639,14 +8780,17 @@ public boolean isProvisioningAllowed(String action) { if (!mUserManager.isUserRunning(new UserHandle(deviceOwnerUserId))) { return CODE_USER_NOT_RUNNING; } + if (mIsWatch && hasPaired(UserHandle.USER_SYSTEM)) { + return CODE_HAS_PAIRED; + } 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; } - if (hasIncompatibleAccountsLocked(UserHandle.USER_SYSTEM, owner)) { + if (hasIncompatibleAccountsOrNonAdb) { return CODE_ACCOUNTS_NOT_EMPTY; } } else { @@ -8674,7 +8818,8 @@ public boolean isProvisioningAllowed(String action) { private boolean isDeviceOwnerProvisioningAllowed(int deviceOwnerUserId) { synchronized (this) { return CODE_OK == checkSetDeviceOwnerPreConditionLocked( - /* owner unknown */ null, deviceOwnerUserId, /* isAdb */ false); + /* owner unknown */ null, deviceOwnerUserId, /* isAdb */ false, + /* hasIncompatibleAccountsOrNonAdb=*/ true); } } @@ -9008,12 +9153,33 @@ public boolean isAffiliatedUser() { } private synchronized void disableDeviceOwnerManagedSingleUserFeaturesIfNeeded() { - if (!isDeviceOwnerManagedSingleUserDevice()) { + final boolean isSingleUserManagedDevice = isDeviceOwnerManagedSingleUserDevice(); + + // disable security logging if needed + if (!isSingleUserManagedDevice) { mInjector.securityLogSetLoggingEnabledProperty(false); - Slog.w(LOG_TAG, "Security logging turned off as it's no longer a single user device."); + Slog.w(LOG_TAG, "Security logging turned off as it's no longer a single user managed" + + " device."); + } + + // disable backup service if needed + // note: when clearing DO, the backup service shouldn't be disabled if it was enabled by + // the device owner + if (mOwners.hasDeviceOwner() && !isSingleUserManagedDevice) { + setBackupServiceEnabledInternal(false); + Slog.w(LOG_TAG, "Backup is off as it's a managed device that has more that one user."); + } + + // disable network logging if needed + if (!isSingleUserManagedDevice) { + setNetworkLoggingActiveInternal(false); + Slog.w(LOG_TAG, "Network logging turned off as it's no longer a single user managed" + + " device."); + // if there still is a device owner, disable logging policy, otherwise the admin + // has been nuked if (mOwners.hasDeviceOwner()) { - setBackupServiceEnabledInternal(false); - Slog.w(LOG_TAG, "Backup is off as it's a managed device that has more that one user."); + getDeviceOwnerAdminLocked().isNetworkLoggingEnabled = false; + saveSettingsLocked(mOwners.getDeviceOwnerUserId()); } } } @@ -9247,8 +9413,25 @@ public boolean isDeviceProvisioningConfigApplied() { * - Otherwise, if there's any account that does not have ..._ALLOWED, or does have * ..._DISALLOWED, return true. * - Otherwise return false. + * + * If the caller is *not* ADB, it also returns true. The returned value shouldn't be used + * when the caller is not ADB. + * + * DO NOT CALL IT WITH THE DPMS LOCK HELD. */ - private boolean hasIncompatibleAccountsLocked(int userId, @Nullable ComponentName owner) { + private boolean hasIncompatibleAccountsOrNonAdbNoLock( + int userId, @Nullable ComponentName owner) { + final boolean isAdb = (mInjector.binderGetCallingUid() == Process.SHELL_UID) + || (mInjector.binderGetCallingUid() == Process.ROOT_UID); + if (!isAdb) { + return true; + } + + if (Thread.holdsLock(this)) { + Slog.wtf(LOG_TAG, "hasIncompatibleAccountsNoLock() called with the DPMS lock held."); + return true; + } + final long token = mInjector.binderClearCallingIdentity(); try { final AccountManager am = AccountManager.get(mContext); @@ -9256,22 +9439,30 @@ private boolean hasIncompatibleAccountsLocked(int userId, @Nullable ComponentNam if (accounts.length == 0) { return false; } + synchronized (this) { + if (owner == null || !isAdminTestOnlyLocked(owner, userId)) { + Log.w(LOG_TAG, + "Non test-only owner can't be installed with existing accounts."); + return true; + } + } + final String[] feature_allow = { DevicePolicyManager.ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED }; final String[] feature_disallow = { DevicePolicyManager.ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED }; - // Even if we find incompatible accounts along the way, we still check all accounts - // for logging. boolean compatible = true; for (Account account : accounts) { if (hasAccountFeatures(am, account, feature_disallow)) { Log.e(LOG_TAG, account + " has " + feature_disallow[0]); compatible = false; + break; } if (!hasAccountFeatures(am, account, feature_allow)) { Log.e(LOG_TAG, account + " doesn't have " + feature_allow[0]); compatible = false; + break; } } if (compatible) { @@ -9279,28 +9470,6 @@ private boolean hasIncompatibleAccountsLocked(int userId, @Nullable ComponentNam } else { Log.e(LOG_TAG, "Found incompatible accounts"); } - - // Then check if the owner is test-only. - String log; - if (owner == null) { - // Owner is unknown. Suppose it's not test-only - compatible = false; - log = "Only test-only device/profile owner can be installed with accounts"; - } else if (isAdminTestOnlyLocked(owner, userId)) { - if (compatible) { - log = "Installing test-only owner " + owner; - } else { - log = "Can't install test-only owner " + owner + " with incompatible accounts"; - } - } else { - compatible = false; - log = "Can't install non test-only owner " + owner + " with accounts"; - } - if (compatible) { - Log.w(LOG_TAG, log); - } else { - Log.e(LOG_TAG, log); - } return !compatible; } finally { mInjector.binderRestoreCallingIdentity(token); @@ -9357,4 +9526,128 @@ public boolean isBackupServiceEnabled(ComponentName admin) { } } } + + @Override + public synchronized void setNetworkLoggingEnabled(ComponentName admin, boolean enabled) { + if (!mHasFeature) { + return; + } + Preconditions.checkNotNull(admin); + ensureDeviceOwnerManagingSingleUser(admin); + + if (enabled == isNetworkLoggingEnabledInternalLocked()) { + // already in the requested state + return; + } + ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked(); + deviceOwner.isNetworkLoggingEnabled = enabled; + if (!enabled) { + deviceOwner.numNetworkLoggingNotifications = 0; + deviceOwner.lastNetworkLoggingNotificationTimeMs = 0; + } + saveSettingsLocked(mInjector.userHandleGetCallingUserId()); + + setNetworkLoggingActiveInternal(enabled); + } + + private synchronized void setNetworkLoggingActiveInternal(boolean active) { + final long callingIdentity = mInjector.binderClearCallingIdentity(); + try { + if (active) { + mNetworkLogger = new NetworkLogger(this, mInjector.getPackageManagerInternal()); + if (!mNetworkLogger.startNetworkLogging()) { + mNetworkLogger = null; + Slog.wtf(LOG_TAG, "Network logging could not be started due to the logging" + + " service not being available yet."); + } + sendNetworkLoggingNotificationLocked(); + } else { + if (mNetworkLogger != null && !mNetworkLogger.stopNetworkLogging()) { + mNetworkLogger = null; + Slog.wtf(LOG_TAG, "Network logging could not be stopped due to the logging" + + " service not being available yet."); + } + mNetworkLogger = null; + mInjector.getNotificationManager().cancel(NETWORK_LOGGING_NOTIFICATION_ID); + } + } finally { + mInjector.binderRestoreCallingIdentity(callingIdentity); + } + } + + @Override + public boolean isNetworkLoggingEnabled(ComponentName admin) { + if (!mHasFeature) { + return false; + } + synchronized (this) { + enforceDeviceOwnerOrManageUsers(); + return isNetworkLoggingEnabledInternalLocked(); + } + } + + private boolean isNetworkLoggingEnabledInternalLocked() { + ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked(); + return (deviceOwner != null) && deviceOwner.isNetworkLoggingEnabled; + } + + /* + * A maximum of 1200 events are returned, and the total marshalled size is in the order of + * 100kB, so returning a List instead of ParceledListSlice is acceptable. + * Ideally this would be done with ParceledList, however it only supports homogeneous types. + * + * @see NetworkLoggingHandler#MAX_EVENTS_PER_BATCH + */ + @Override + public synchronized List retrieveNetworkLogs(ComponentName admin, + long batchToken) { + if (!mHasFeature) { + return null; + } + Preconditions.checkNotNull(admin); + ensureDeviceOwnerManagingSingleUser(admin); + + if (mNetworkLogger == null) { + return null; + } + return isNetworkLoggingEnabledInternalLocked() + ? mNetworkLogger.retrieveLogs(batchToken) + : null; + } + + private void sendNetworkLoggingNotificationLocked() { + final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked(); + if (deviceOwner == null || !deviceOwner.isNetworkLoggingEnabled) { + return; + } + if (deviceOwner.numNetworkLoggingNotifications >= + ActiveAdmin.DEF_MAXIMUM_NETWORK_LOGGING_NOTIFICATIONS_SHOWN) { + return; + } + final long now = System.currentTimeMillis(); + if (now - deviceOwner.lastNetworkLoggingNotificationTimeMs < MS_PER_DAY) { + return; + } + deviceOwner.numNetworkLoggingNotifications++; + if (deviceOwner.numNetworkLoggingNotifications + >= ActiveAdmin.DEF_MAXIMUM_NETWORK_LOGGING_NOTIFICATIONS_SHOWN) { + deviceOwner.lastNetworkLoggingNotificationTimeMs = 0; + } else { + deviceOwner.lastNetworkLoggingNotificationTimeMs = now; + } + final Intent intent = new Intent(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG); + intent.setPackage("com.android.systemui"); + final PendingIntent pendingIntent = PendingIntent.getBroadcastAsUser(mContext, 0, intent, 0, + UserHandle.CURRENT); + Notification notification = new Notification.Builder(mContext) + .setSmallIcon(R.drawable.ic_qs_network_logging) + .setContentTitle(mContext.getString(R.string.network_logging_notification_title)) + .setContentText(mContext.getString(R.string.network_logging_notification_text)) + .setTicker(mContext.getString(R.string.network_logging_notification_title)) + .setShowWhen(true) + .setContentIntent(pendingIntent) + .build(); + mInjector.getNotificationManager().notify(NETWORK_LOGGING_NOTIFICATION_ID, notification); + saveSettingsLocked(mOwners.getDeviceOwnerUserId()); + } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java new file mode 100644 index 000000000000..b82cb3cfbeaf --- /dev/null +++ b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.devicepolicy; + +import android.app.admin.ConnectEvent; +import android.app.admin.DnsEvent; +import android.app.admin.NetworkEvent; +import android.content.pm.PackageManagerInternal; +import android.net.IIpConnectivityMetrics; +import android.net.INetdEventCallback; +import android.os.Bundle; +import android.os.Message; +import android.os.Process; +import android.os.RemoteException; +import android.util.Log; +import android.util.Slog; + +import com.android.server.ServiceThread; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * A class for managing network logging. + * This class is not thread-safe, callers should synchronize access. + */ +final class NetworkLogger { + + private static final String TAG = NetworkLogger.class.getSimpleName(); + + private final DevicePolicyManagerService mDpm; + private final PackageManagerInternal mPm; + private final AtomicBoolean mIsLoggingEnabled = new AtomicBoolean(false); + + private IIpConnectivityMetrics mIpConnectivityMetrics; + private ServiceThread mHandlerThread; + private NetworkLoggingHandler mNetworkLoggingHandler; + + private final INetdEventCallback mNetdEventCallback = new INetdEventCallback.Stub() { + @Override + public void onDnsEvent(String hostname, String[] ipAddresses, int ipAddressesCount, + long timestamp, int uid) { + if (!mIsLoggingEnabled.get()) { + return; + } + DnsEvent dnsEvent = new DnsEvent(hostname, ipAddresses, ipAddressesCount, + mPm.getNameForUid(uid), timestamp); + sendNetworkEvent(dnsEvent); + } + + @Override + public void onConnectEvent(String ipAddr, int port, long timestamp, int uid) { + if (!mIsLoggingEnabled.get()) { + return; + } + ConnectEvent connectEvent = new ConnectEvent(ipAddr, port, mPm.getNameForUid(uid), + timestamp); + sendNetworkEvent(connectEvent); + } + + private void sendNetworkEvent(NetworkEvent event) { + Message msg = mNetworkLoggingHandler.obtainMessage( + NetworkLoggingHandler.LOG_NETWORK_EVENT_MSG); + Bundle bundle = new Bundle(); + bundle.putParcelable(NetworkLoggingHandler.NETWORK_EVENT_KEY, event); + msg.setData(bundle); + mNetworkLoggingHandler.sendMessage(msg); + } + }; + + NetworkLogger(DevicePolicyManagerService dpm, PackageManagerInternal pm) { + mDpm = dpm; + mPm = pm; + } + + private boolean checkIpConnectivityMetricsService() { + if (mIpConnectivityMetrics != null) { + return true; + } + final IIpConnectivityMetrics service = mDpm.mInjector.getIIpConnectivityMetrics(); + if (service == null) { + return false; + } + mIpConnectivityMetrics = service; + return true; + } + + boolean startNetworkLogging() { + Log.d(TAG, "Starting network logging."); + if (!checkIpConnectivityMetricsService()) { + // the IIpConnectivityMetrics service should have been present at this point + Slog.wtf(TAG, "Failed to register callback with IIpConnectivityMetrics."); + return false; + } + try { + if (mIpConnectivityMetrics.registerNetdEventCallback(mNetdEventCallback)) { + mHandlerThread = new ServiceThread(TAG, Process.THREAD_PRIORITY_BACKGROUND, + /* allowIo */ false); + mHandlerThread.start(); + mNetworkLoggingHandler = new NetworkLoggingHandler(mHandlerThread.getLooper(), + mDpm); + mNetworkLoggingHandler.scheduleBatchFinalization(); + mIsLoggingEnabled.set(true); + return true; + } else { + return false; + } + } catch (RemoteException re) { + Slog.wtf(TAG, "Failed to make remote calls to register the callback", re); + return false; + } + } + + boolean stopNetworkLogging() { + Log.d(TAG, "Stopping network logging"); + // stop the logging regardless of whether we fail to unregister listener + mIsLoggingEnabled.set(false); + try { + if (!checkIpConnectivityMetricsService()) { + // the IIpConnectivityMetrics service should have been present at this point + Slog.wtf(TAG, "Failed to unregister callback with IIpConnectivityMetrics."); + // logging is forcefully disabled even if unregistering fails + return true; + } + return mIpConnectivityMetrics.unregisterNetdEventCallback(); + } catch (RemoteException re) { + Slog.wtf(TAG, "Failed to make remote calls to unregister the callback", re); + } finally { + mHandlerThread.quitSafely(); + return true; + } + } + + List retrieveLogs(long batchToken) { + return mNetworkLoggingHandler.retrieveFullLogBatch(batchToken); + } +} diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java new file mode 100644 index 000000000000..a56a3709f02a --- /dev/null +++ b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.devicepolicy; + +import android.app.AlarmManager; +import android.app.AlarmManager.OnAlarmListener; +import android.app.admin.DeviceAdminReceiver; +import android.app.admin.NetworkEvent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.os.SystemClock; +import android.util.Log; + +import com.android.internal.annotations.GuardedBy; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * A Handler class for managing network logging on a background thread. + */ +final class NetworkLoggingHandler extends Handler { + + private static final String TAG = NetworkLoggingHandler.class.getSimpleName(); + + static final String NETWORK_EVENT_KEY = "network_event"; + + // If this value changes, update DevicePolicyManager#retrieveNetworkLogs() javadoc + private static final int MAX_EVENTS_PER_BATCH = 1200; + private static final long BATCH_FINALIZATION_TIMEOUT_MS = TimeUnit.MINUTES.toMillis(90); + private static final long BATCH_FINALIZATION_TIMEOUT_ALARM_INTERVAL_MS = + TimeUnit.MINUTES.toMillis(30); + + private static final String NETWORK_LOGGING_TIMEOUT_ALARM_TAG = "NetworkLogging.batchTimeout"; + + private final DevicePolicyManagerService mDpm; + private final AlarmManager mAlarmManager; + + private final OnAlarmListener mBatchTimeoutAlarmListener = new OnAlarmListener() { + @Override + public void onAlarm() { + Log.d(TAG, "Received a batch finalization timeout alarm, finalizing " + + mNetworkEvents.size() + " pending events."); + synchronized (NetworkLoggingHandler.this) { + finalizeBatchAndNotifyDeviceOwnerIfNotEmpty(); + } + } + }; + + static final int LOG_NETWORK_EVENT_MSG = 1; + + // threadsafe as it's Handler's thread confined + @GuardedBy("this") + private ArrayList mNetworkEvents = new ArrayList(); + + @GuardedBy("this") + private ArrayList mFullBatch; + + // each full batch is represented by its token, which the DPC has to provide back to revieve it + @GuardedBy("this") + private long mCurrentFullBatchToken; + + NetworkLoggingHandler(Looper looper, DevicePolicyManagerService dpm) { + super(looper); + mDpm = dpm; + mAlarmManager = mDpm.mInjector.getAlarmManager(); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case LOG_NETWORK_EVENT_MSG: { + NetworkEvent networkEvent = msg.getData().getParcelable(NETWORK_EVENT_KEY); + if (networkEvent != null) { + mNetworkEvents.add(networkEvent); + if (mNetworkEvents.size() >= MAX_EVENTS_PER_BATCH) { + finalizeBatchAndNotifyDeviceOwnerIfNotEmpty(); + } + } + break; + } + default: { + Log.d(TAG, "NetworkLoggingHandler received an unknown of message."); + break; + } + } + } + + void scheduleBatchFinalization() { + final long when = SystemClock.elapsedRealtime() + BATCH_FINALIZATION_TIMEOUT_MS; + mAlarmManager.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, + BATCH_FINALIZATION_TIMEOUT_ALARM_INTERVAL_MS, NETWORK_LOGGING_TIMEOUT_ALARM_TAG, + mBatchTimeoutAlarmListener, this); + Log.d(TAG, "Scheduled a new batch finalization alarm " + BATCH_FINALIZATION_TIMEOUT_MS + + "ms from now."); + } + + private synchronized void finalizeBatchAndNotifyDeviceOwnerIfNotEmpty() { + if (mNetworkEvents.size() > 0) { + // finalize the batch and start a new one from scratch + mFullBatch = mNetworkEvents; + mCurrentFullBatchToken++; + mNetworkEvents = new ArrayList(); + // notify DO that there's a new non-empty batch waiting + Bundle extras = new Bundle(); + extras.putLong(DeviceAdminReceiver.EXTRA_NETWORK_LOGS_TOKEN, mCurrentFullBatchToken); + extras.putInt(DeviceAdminReceiver.EXTRA_NETWORK_LOGS_COUNT, mFullBatch.size()); + Log.d(TAG, "Sending network logging batch broadcast to device owner, batchToken: " + + mCurrentFullBatchToken); + mDpm.sendDeviceOwnerCommand(DeviceAdminReceiver.ACTION_NETWORK_LOGS_AVAILABLE, extras); + } else { + // don't notify the DO, since there are no events; DPC can still retrieve + // the last full batch + Log.d(TAG, "Was about to finalize the batch, but there were no events to send to" + + " the DPC, the batchToken of last available batch: " + + mCurrentFullBatchToken); + } + // regardless of whether the batch was non-empty schedule a new finalization after timeout + scheduleBatchFinalization(); + } + + synchronized List retrieveFullLogBatch(long batchToken) { + if (batchToken != mCurrentFullBatchToken) { + return null; + } + return mFullBatch; + } +} + diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 8ab3cca406c3..ff1d26234765 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -172,6 +172,8 @@ public final class SystemServer { "com.google.android.clockwork.bluetooth.WearBluetoothService"; private static final String WEAR_WIFI_MEDIATOR_SERVICE_CLASS = "com.google.android.clockwork.wifi.WearWifiMediatorService"; + private static final String WEAR_CELLULAR_MEDIATOR_SERVICE_CLASS = + "com.google.android.clockwork.cellular.WearCellularMediatorService"; private static final String WEAR_TIME_SERVICE_CLASS = "com.google.android.clockwork.time.WearTimeService"; private static final String ACCOUNT_SERVICE_CLASS = @@ -216,6 +218,7 @@ public final class SystemServer { private boolean mOnlyCore; private boolean mFirstBoot; + private final boolean mRuntimeRestart; /** * Start the sensor service. @@ -232,6 +235,8 @@ public static void main(String[] args) { public SystemServer() { // Check for factory test mode. mFactoryTestMode = FactoryTest.getMode(); + // Remember if it's runtime restart(when sys.boot_completed is already set) or reboot + mRuntimeRestart = "1".equals(SystemProperties.get("sys.boot_completed")); } private void run() { @@ -331,6 +336,7 @@ public void run() { // Create the system service manager. mSystemServiceManager = new SystemServiceManager(mSystemContext); + mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); } finally { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); @@ -576,9 +582,15 @@ private void startOtherServices() { false); boolean disableTrustManager = SystemProperties.getBoolean("config.disable_trustmanager", false); - boolean disableTextServices = SystemProperties.getBoolean("config.disable_textservices", false); + boolean disableTextServices = SystemProperties.getBoolean("config.disable_textservices", + false); boolean disableSamplingProfiler = SystemProperties.getBoolean("config.disable_samplingprof", false); + boolean disableConsumerIr = SystemProperties.getBoolean("config.disable_consumerir", false); + boolean disableVrManager = SystemProperties.getBoolean("config.disable_vrmanager", false); + boolean disableCameraService = SystemProperties.getBoolean("config.disable_cameraservice", + false); + boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1"); boolean enableWigig = SystemProperties.getBoolean("persist.wigig.enable", false); @@ -603,8 +615,10 @@ private void startOtherServices() { mContentResolver = context.getContentResolver(); - Slog.i(TAG, "Camera Service"); - mSystemServiceManager.startService(CameraService.class); + if (!disableCameraService) { + Slog.i(TAG, "Camera Service"); + mSystemServiceManager.startService(CameraService.class); + } // The AccountManager must come before the ContentService traceBeginAndSlog("StartAccountManagerService"); @@ -624,10 +638,12 @@ private void startOtherServices() { ServiceManager.addService("vibrator", vibrator); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); - traceBeginAndSlog("StartConsumerIrService"); - consumerIr = new ConsumerIrService(context); - ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr); - Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + if (!disableConsumerIr) { + traceBeginAndSlog("StartConsumerIrService"); + consumerIr = new ConsumerIrService(context); + ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr); + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + } traceBeginAndSlog("StartAlarmManagerService"); mSystemServiceManager.startService(AlarmManagerService.class); @@ -650,9 +666,11 @@ private void startOtherServices() { ServiceManager.addService(Context.INPUT_SERVICE, inputManager); Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); - traceBeginAndSlog("StartVrManagerService"); - mSystemServiceManager.startService(VrManagerService.class); - Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + if (!disableVrManager) { + traceBeginAndSlog("StartVrManagerService"); + mSystemServiceManager.startService(VrManagerService.class); + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + } mActivityManagerService.setWindowManager(wm); @@ -1227,6 +1245,9 @@ private void startOtherServices() { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) { mSystemServiceManager.startService(WEAR_BLUETOOTH_SERVICE_CLASS); mSystemServiceManager.startService(WEAR_WIFI_MEDIATOR_SERVICE_CLASS); + if (SystemProperties.getBoolean("config.enable_cellmediator", false)) { + mSystemServiceManager.startService(WEAR_CELLULAR_MEDIATOR_SERVICE_CLASS); + } if (!disableNonCoreServices) { mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS); } diff --git a/services/net/java/android/net/apf/ApfFilter.java b/services/net/java/android/net/apf/ApfFilter.java index 4c7545240c23..0b47079c0d21 100644 --- a/services/net/java/android/net/apf/ApfFilter.java +++ b/services/net/java/android/net/apf/ApfFilter.java @@ -194,8 +194,10 @@ private void logStats() { { (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; private static final int ICMP6_TYPE_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN; - private static final int ICMP6_NEIGHBOR_ANNOUNCEMENT = 136; + private static final int ICMP6_ROUTER_SOLICITATION = 133; private static final int ICMP6_ROUTER_ADVERTISEMENT = 134; + private static final int ICMP6_NEIGHBOR_SOLICITATION = 135; + private static final int ICMP6_NEIGHBOR_ANNOUNCEMENT = 136; // NOTE: this must be added to the IPv4 header length in IPV4_HEADER_SIZE_MEMORY_SLOT private static final int UDP_DESTINATION_PORT_OFFSET = ETH_HEADER_LEN + 2; @@ -795,6 +797,8 @@ private void generateIPv6FilterLocked(ApfGenerator gen) throws IllegalInstructio // if it's multicast and we're dropping multicast: // drop // pass + // if it's ICMPv6 RS to any: + // drop // if it's ICMPv6 NA to ff02::1: // drop @@ -819,10 +823,12 @@ private void generateIPv6FilterLocked(ApfGenerator gen) throws IllegalInstructio // Add unsolicited multicast neighbor announcements filter String skipUnsolicitedMulticastNALabel = "skipUnsolicitedMulticastNA"; - // If not neighbor announcements, skip unsolicited multicast NA filter gen.addLoad8(Register.R0, ICMP6_TYPE_OFFSET); + // Drop all router solicitations (b/32833400) + gen.addJumpIfR0Equals(ICMP6_ROUTER_SOLICITATION, gen.DROP_LABEL); + // If not neighbor announcements, skip filter. gen.addJumpIfR0NotEquals(ICMP6_NEIGHBOR_ANNOUNCEMENT, skipUnsolicitedMulticastNALabel); - // If to ff02::1, drop + // If to ff02::1, drop. // TODO: Drop only if they don't contain the address of on-link neighbours. gen.addLoadImmediate(Register.R0, IPV6_DEST_ADDR_OFFSET); gen.addJumpIfBytesNotEqual(Register.R0, IPV6_ALL_NODES_ADDRESS, @@ -842,6 +848,7 @@ private void generateIPv6FilterLocked(ApfGenerator gen) throws IllegalInstructio *

  • Pass all non-ICMPv6 IPv6 packets, *
  • Pass all non-IPv4 and non-IPv6 packets, *
  • Drop IPv6 ICMPv6 NAs to ff02::1. + *
  • Drop IPv6 ICMPv6 RSs. *
  • Let execution continue off the end of the program for IPv6 ICMPv6 packets. This allows * insertion of RA filters here, or if there aren't any, just passes the packets. * diff --git a/services/net/java/android/net/dhcp/DhcpPacket.java b/services/net/java/android/net/dhcp/DhcpPacket.java index ef4bc024c153..060ded6b7b1b 100644 --- a/services/net/java/android/net/dhcp/DhcpPacket.java +++ b/services/net/java/android/net/dhcp/DhcpPacket.java @@ -25,8 +25,10 @@ * Defines basic data and operations needed to build and use packets for the * DHCP protocol. Subclasses create the specific packets used at each * stage of the negotiation. + * + * @hide */ -abstract class DhcpPacket { +public abstract class DhcpPacket { protected static final String TAG = "DhcpPacket"; // dhcpcd has a minimum lease of 20 seconds, but DhcpStateMachine would refuse to wake up the diff --git a/services/net/java/android/net/ip/ConnectivityPacketTracker.java b/services/net/java/android/net/ip/ConnectivityPacketTracker.java new file mode 100644 index 000000000000..884a8a754266 --- /dev/null +++ b/services/net/java/android/net/ip/ConnectivityPacketTracker.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.ip; + +import static android.system.OsConstants.*; + +import android.net.NetworkUtils; +import android.net.util.BlockingSocketReader; +import android.net.util.ConnectivityPacketSummary; +import android.os.Handler; +import android.system.ErrnoException; +import android.system.Os; +import android.system.PacketSocketAddress; +import android.util.Log; +import android.util.LocalLog; + +import libcore.io.IoBridge; +import libcore.util.HexEncoding; + +import java.io.FileDescriptor; +import java.io.InterruptedIOException; +import java.io.IOException; +import java.net.NetworkInterface; +import java.net.SocketException; + + +/** + * Critical connectivity packet tracking daemon. + * + * Tracks ARP, DHCPv4, and IPv6 RS/RA/NS/NA packets. + * + * This class's constructor, start() and stop() methods must only be called + * from the same thread on which the passed in |log| is accessed. + * + * Log lines include a hexdump of the packet, which can be decoded via: + * + * echo -n H3XSTR1NG | sed -e 's/\([0-9A-F][0-9A-F]\)/\1 /g' -e 's/^/000000 /' + * | text2pcap - - + * | tcpdump -n -vv -e -r - + * + * @hide + */ +public class ConnectivityPacketTracker { + private static final String TAG = ConnectivityPacketTracker.class.getSimpleName(); + private static final boolean DBG = false; + private static final String MARK_START = "--- START ---"; + private static final String MARK_STOP = "--- STOP ---"; + + private final String mTag; + private final Handler mHandler; + private final LocalLog mLog; + private final BlockingSocketReader mPacketListener; + + public ConnectivityPacketTracker(NetworkInterface netif, LocalLog log) { + final String ifname; + final int ifindex; + final byte[] hwaddr; + final int mtu; + + try { + ifname = netif.getName(); + ifindex = netif.getIndex(); + hwaddr = netif.getHardwareAddress(); + mtu = netif.getMTU(); + } catch (NullPointerException|SocketException e) { + throw new IllegalArgumentException("bad network interface", e); + } + + mTag = TAG + "." + ifname; + mHandler = new Handler(); + mLog = log; + mPacketListener = new PacketListener(ifindex, hwaddr, mtu); + } + + public void start() { + mLog.log(MARK_START); + mPacketListener.start(); + } + + public void stop() { + mPacketListener.stop(); + mLog.log(MARK_STOP); + } + + private final class PacketListener extends BlockingSocketReader { + private final int mIfIndex; + private final byte mHwAddr[]; + + PacketListener(int ifindex, byte[] hwaddr, int mtu) { + super(mtu); + mIfIndex = ifindex; + mHwAddr = hwaddr; + } + + @Override + protected FileDescriptor createSocket() { + FileDescriptor s = null; + try { + // TODO: Evaluate switching to SOCK_DGRAM and changing the + // BlockingSocketReader's read() to recvfrom(), so that this + // might work on non-ethernet-like links (via SLL). + s = Os.socket(AF_PACKET, SOCK_RAW, 0); + NetworkUtils.attachControlPacketFilter(s, ARPHRD_ETHER); + Os.bind(s, new PacketSocketAddress((short) ETH_P_ALL, mIfIndex)); + } catch (ErrnoException | IOException e) { + logError("Failed to create packet tracking socket: ", e); + closeSocket(s); + return null; + } + return s; + } + + @Override + protected void handlePacket(byte[] recvbuf, int length) { + final String summary = ConnectivityPacketSummary.summarize( + mHwAddr, recvbuf, length); + if (summary == null) return; + + if (DBG) Log.d(mTag, summary); + addLogEntry(summary + + "\n[" + new String(HexEncoding.encode(recvbuf, 0, length)) + "]"); + } + + @Override + protected void logError(String msg, Exception e) { + Log.e(mTag, msg, e); + addLogEntry(msg + e); + } + + private void addLogEntry(String entry) { + mHandler.post(() -> mLog.log(entry)); + } + } +} diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java index 01d93048bfe2..abdf6831b06c 100644 --- a/services/net/java/android/net/ip/IpManager.java +++ b/services/net/java/android/net/ip/IpManager.java @@ -374,6 +374,7 @@ public String toString() { private static final int EVENT_DHCPACTION_TIMEOUT = 10; private static final int MAX_LOG_RECORDS = 500; + private static final int MAX_PACKET_RECORDS = 100; private static final boolean NO_CALLBACKS = false; private static final boolean SEND_CALLBACKS = true; @@ -399,6 +400,7 @@ public String toString() { private final WakeupMessage mDhcpActionTimeoutAlarm; private final AvoidBadWifiTracker mAvoidBadWifiTracker; private final LocalLog mLocalLog; + private final LocalLog mConnectivityPacketLog; private final MessageHandlingLogger mMsgStateLogger; private final IpConnectivityLog mMetricsLog = new IpConnectivityLog(); @@ -438,6 +440,10 @@ public IpManager(Context context, String ifName, Callback callback, mCallback = new LoggingCallbackWrapper(callback); mNwService = nwService; + mLocalLog = new LocalLog(MAX_LOG_RECORDS); + mConnectivityPacketLog = new LocalLog(MAX_PACKET_RECORDS); + mMsgStateLogger = new MessageHandlingLogger(); + mNetlinkTracker = new NetlinkTracker( mInterfaceName, new NetlinkTracker.Callback() { @@ -451,48 +457,79 @@ public void interfaceAdded(String iface) { super.interfaceAdded(iface); if (mClatInterfaceName.equals(iface)) { mCallback.setNeighborDiscoveryOffload(false); + } else if (!mInterfaceName.equals(iface)) { + return; } + + final String msg = "interfaceAdded(" + iface +")"; + logMsg(msg); } @Override public void interfaceRemoved(String iface) { super.interfaceRemoved(iface); + // TODO: Also observe mInterfaceName going down and take some + // kind of appropriate action. if (mClatInterfaceName.equals(iface)) { // TODO: consider sending a message to the IpManager main // StateMachine thread, in case "NDO enabled" state becomes // tied to more things that 464xlat operation. mCallback.setNeighborDiscoveryOffload(true); + } else if (!mInterfaceName.equals(iface)) { + return; } + + final String msg = "interfaceRemoved(" + iface +")"; + logMsg(msg); } - }; - try { - mNwService.registerObserver(mNetlinkTracker); - } catch (RemoteException e) { - Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString()); - } + private void logMsg(String msg) { + Log.d(mTag, msg); + getHandler().post(() -> { mLocalLog.log("OBSERVED " + msg); }); + } + }; - mAvoidBadWifiTracker = new AvoidBadWifiTracker(mContext, getHandler()); + mLinkProperties = new LinkProperties(); + mLinkProperties.setInterfaceName(mInterfaceName); - resetLinkProperties(); + mAvoidBadWifiTracker = new AvoidBadWifiTracker(mContext, getHandler(), + () -> { mLocalLog.log("OBSERVED AvoidBadWifi changed"); }); mProvisioningTimeoutAlarm = new WakeupMessage(mContext, getHandler(), mTag + ".EVENT_PROVISIONING_TIMEOUT", EVENT_PROVISIONING_TIMEOUT); mDhcpActionTimeoutAlarm = new WakeupMessage(mContext, getHandler(), mTag + ".EVENT_DHCPACTION_TIMEOUT", EVENT_DHCPACTION_TIMEOUT); - // Super simple StateMachine. + // Anything the StateMachine may access must have been instantiated + // before this point. + configureAndStartStateMachine(); + + // Anything that may send messages to the StateMachine must only be + // configured to do so after the StateMachine has started (above). + startStateMachineUpdaters(); + } + + private void configureAndStartStateMachine() { addState(mStoppedState); addState(mStartedState); addState(mRunningState, mStartedState); addState(mStoppingState); setInitialState(mStoppedState); - mLocalLog = new LocalLog(MAX_LOG_RECORDS); - mMsgStateLogger = new MessageHandlingLogger(); + super.start(); } + private void startStateMachineUpdaters() { + try { + mNwService.registerObserver(mNetlinkTracker); + } catch (RemoteException e) { + Log.e(mTag, "Couldn't register NetlinkTracker: " + e.toString()); + } + + mAvoidBadWifiTracker.start(); + } + @Override protected void onQuitting() { mCallback.onQuit(); @@ -501,6 +538,7 @@ protected void onQuitting() { // Shut down this IpManager instance altogether. public void shutdown() { stop(); + mAvoidBadWifiTracker.shutdown(); quit(); } @@ -574,7 +612,7 @@ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { } IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); - pw.println("APF dump:"); + pw.println(mTag + " APF dump:"); pw.increaseIndent(); // Thread-unsafe access to mApfFilter but just used for debugging. ApfFilter apfFilter = mApfFilter; @@ -590,6 +628,12 @@ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { pw.increaseIndent(); mLocalLog.readOnlyLocalLog().dump(fd, pw, args); pw.decreaseIndent(); + + pw.println(); + pw.println(mTag + " connectivity packet log:"); + pw.increaseIndent(); + mConnectivityPacketLog.readOnlyLocalLog().dump(fd, pw, args); + pw.decreaseIndent(); } @@ -631,6 +675,11 @@ protected boolean recordLogRec(Message msg) { 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); @@ -816,13 +865,7 @@ private LinkProperties assembleLinkProperties() { for (RouteInfo route : netlinkLinkProperties.getRoutes()) { newLp.addRoute(route); } - for (InetAddress dns : netlinkLinkProperties.getDnsServers()) { - // Only add likely reachable DNS servers. - // TODO: investigate deleting this. - if (newLp.isReachable(dns)) { - newLp.addDnsServer(dns); - } - } + addAllReachableDnsServers(newLp, netlinkLinkProperties.getDnsServers()); // [3] Add in data from DHCPv4, if available. // @@ -832,13 +875,7 @@ private LinkProperties assembleLinkProperties() { for (RouteInfo route : mDhcpResults.getRoutes(mInterfaceName)) { newLp.addRoute(route); } - for (InetAddress dns : mDhcpResults.dnsServers) { - // Only add likely reachable DNS servers. - // TODO: investigate deleting this. - if (newLp.isReachable(dns)) { - newLp.addDnsServer(dns); - } - } + addAllReachableDnsServers(newLp, mDhcpResults.dnsServers); newLp.setDomains(mDhcpResults.domains); if (mDhcpResults.mtu != 0) { @@ -860,6 +897,18 @@ private LinkProperties assembleLinkProperties() { return newLp; } + private static void addAllReachableDnsServers( + LinkProperties lp, Iterable dnses) { + // TODO: Investigate deleting this reachability check. We should be + // able to pass everything down to netd and let netd do evaluation + // and RFC6724-style sorting. + for (InetAddress dns : dnses) { + if (!dns.isAnyLocalAddress() && lp.isReachable(dns)) { + lp.addDnsServer(dns); + } + } + } + // Returns false if we have lost provisioning, true otherwise. private boolean handleLinkPropertiesUpdate(boolean sendCallbacks) { final LinkProperties newLp = assembleLinkProperties(); @@ -880,7 +929,7 @@ private boolean setIPv4Address(LinkAddress address) { 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 +993,12 @@ private void handleProvisioningFailure() { } } + 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 +1006,6 @@ private boolean startIPv4() { 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 +1024,40 @@ private boolean startIPv6() { 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 @@ -1153,6 +1229,7 @@ boolean readyToProceed() { } class RunningState extends State { + private ConnectivityPacketTracker mPacketTracker; private boolean mDhcpActionInFlight; @Override @@ -1165,29 +1242,26 @@ public void enter() { mCallback.setFallbackMulticastFilter(mMulticastFiltering); } - if (mConfiguration.mEnableIPv6) { - // TODO: Consider transitionTo(mStoppingState) if this fails. - startIPv6(); + mPacketTracker = createPacketTracker(); + if (mPacketTracker != null) mPacketTracker.start(); + + 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; } } @@ -1205,6 +1279,11 @@ public void exit() { mDhcpClient.doQuit(); } + if (mPacketTracker != null) { + mPacketTracker.stop(); + mPacketTracker = null; + } + if (mApfFilter != null) { mApfFilter.shutdown(); mApfFilter = null; @@ -1213,6 +1292,14 @@ public void exit() { resetLinkProperties(); } + private ConnectivityPacketTracker createPacketTracker() { + try { + return new ConnectivityPacketTracker(mNetworkInterface, mConnectivityPacketLog); + } catch (IllegalArgumentException e) { + return null; + } + } + private void ensureDhcpAction() { if (!mDhcpActionInFlight) { mCallback.onPreDhcpAction(); diff --git a/services/net/java/android/net/util/AvoidBadWifiTracker.java b/services/net/java/android/net/util/AvoidBadWifiTracker.java index c14e811e0584..2abaeb1ae35b 100644 --- a/services/net/java/android/net/util/AvoidBadWifiTracker.java +++ b/services/net/java/android/net/util/AvoidBadWifiTracker.java @@ -57,7 +57,11 @@ public class AvoidBadWifiTracker { private final Context mContext; private final Handler mHandler; private final Runnable mReevaluateRunnable; + private final Uri mUri; + private final ContentResolver mResolver; private final SettingObserver mSettingObserver; + private final BroadcastReceiver mBroadcastReceiver; + private volatile boolean mAvoidBadWifi = true; public AvoidBadWifiTracker(Context ctx, Handler handler) { @@ -68,19 +72,36 @@ public AvoidBadWifiTracker(Context ctx, Handler handler, Runnable cb) { mContext = ctx; mHandler = handler; mReevaluateRunnable = () -> { if (update() && cb != null) cb.run(); }; + mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI); + mResolver = mContext.getContentResolver(); mSettingObserver = new SettingObserver(); - - final IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); - mContext.registerReceiverAsUser(new BroadcastReceiver() { + mBroadcastReceiver = new BroadcastReceiver() { + @Override public void onReceive(Context context, Intent intent) { reevaluate(); } - }, UserHandle.ALL, intentFilter, null, null); + }; update(); } + public void start() { + mResolver.registerContentObserver(mUri, false, mSettingObserver); + + final IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + mContext.registerReceiverAsUser( + mBroadcastReceiver, UserHandle.ALL, intentFilter, null, null); + + reevaluate(); + } + + public void shutdown() { + mResolver.unregisterContentObserver(mSettingObserver); + + mContext.unregisterReceiver(mBroadcastReceiver); + } + public boolean currentValue() { return mAvoidBadWifi; } @@ -100,8 +121,7 @@ public boolean shouldNotifyWifiUnvalidated() { } public String getSettingsValue() { - final ContentResolver resolver = mContext.getContentResolver(); - return Settings.Global.getString(resolver, NETWORK_AVOID_BAD_WIFI); + return Settings.Global.getString(mResolver, NETWORK_AVOID_BAD_WIFI); } @VisibleForTesting @@ -117,12 +137,8 @@ public boolean update() { } private class SettingObserver extends ContentObserver { - private final Uri mUri = Settings.Global.getUriFor(NETWORK_AVOID_BAD_WIFI); - public SettingObserver() { super(null); - final ContentResolver resolver = mContext.getContentResolver(); - resolver.registerContentObserver(mUri, false, this); } @Override diff --git a/services/net/java/android/net/util/BlockingSocketReader.java b/services/net/java/android/net/util/BlockingSocketReader.java new file mode 100644 index 000000000000..12fa1e57653a --- /dev/null +++ b/services/net/java/android/net/util/BlockingSocketReader.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.util; + +import android.annotation.Nullable; +import android.system.ErrnoException; +import android.system.Os; +import android.system.OsConstants; + +import libcore.io.IoBridge; + +import java.io.FileDescriptor; +import java.io.InterruptedIOException; +import java.io.IOException; + + +/** + * A thread that reads from a socket and passes the received packets to a + * subclass's handlePacket() method. The packet receive buffer is recycled + * on every read call, so subclasses should make any copies they would like + * inside their handlePacket() implementation. + * + * All public methods may be called from any thread. + * + * @hide + */ +public abstract class BlockingSocketReader { + public static final int DEFAULT_RECV_BUF_SIZE = 2 * 1024; + + private final byte[] mPacket; + private final Thread mThread; + private volatile FileDescriptor mSocket; + private volatile boolean mRunning; + private volatile long mPacketsReceived; + + // Make it slightly easier for subclasses to properly close a socket + // without having to know this incantation. + public static final void closeSocket(@Nullable FileDescriptor fd) { + try { + IoBridge.closeAndSignalBlockedThreads(fd); + } catch (IOException ignored) {} + } + + protected BlockingSocketReader() { + this(DEFAULT_RECV_BUF_SIZE); + } + + protected BlockingSocketReader(int recvbufsize) { + if (recvbufsize < DEFAULT_RECV_BUF_SIZE) { + recvbufsize = DEFAULT_RECV_BUF_SIZE; + } + mPacket = new byte[recvbufsize]; + mThread = new Thread(() -> { mainLoop(); }); + } + + public final boolean start() { + if (mSocket != null) return false; + + try { + mSocket = createSocket(); + } catch (Exception e) { + logError("Failed to create socket: ", e); + return false; + } + + if (mSocket == null) return false; + + mRunning = true; + mThread.start(); + return true; + } + + public final void stop() { + mRunning = false; + closeSocket(mSocket); + mSocket = null; + } + + public final boolean isRunning() { return mRunning; } + + public final long numPacketsReceived() { return mPacketsReceived; } + + /** + * Subclasses MUST create the listening socket here, including setting + * all desired socket options, interface or address/port binding, etc. + */ + protected abstract FileDescriptor createSocket(); + + /** + * Called by the main loop for every packet. Any desired copies of + * |recvbuf| should be made in here, and the underlying byte array is + * reused across all reads. + */ + protected void handlePacket(byte[] recvbuf, int length) {} + + /** + * Called by the main loop to log errors. In some cases |e| may be null. + */ + protected void logError(String msg, Exception e) {} + + /** + * Called by the main loop just prior to exiting. + */ + protected void onExit() {} + + private final void mainLoop() { + while (isRunning()) { + final int bytesRead; + + try { + // Blocking read. + // TODO: See if this can be converted to recvfrom. + bytesRead = Os.read(mSocket, mPacket, 0, mPacket.length); + if (bytesRead < 1) { + if (isRunning()) logError("Socket closed, exiting", null); + break; + } + mPacketsReceived++; + } catch (ErrnoException e) { + if (e.errno != OsConstants.EINTR) { + if (isRunning()) logError("read error: ", e); + break; + } + continue; + } catch (IOException ioe) { + if (isRunning()) logError("read error: ", ioe); + continue; + } + + try { + handlePacket(mPacket, bytesRead); + } catch (Exception e) { + logError("Unexpected exception: ", e); + break; + } + } + + stop(); + onExit(); + } +} diff --git a/services/net/java/android/net/util/ConnectivityPacketSummary.java b/services/net/java/android/net/util/ConnectivityPacketSummary.java new file mode 100644 index 000000000000..5b068c0b2468 --- /dev/null +++ b/services/net/java/android/net/util/ConnectivityPacketSummary.java @@ -0,0 +1,378 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.util; + +import android.net.dhcp.DhcpPacket; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Arrays; +import java.util.StringJoiner; + +import static android.system.OsConstants.*; +import static android.net.util.NetworkConstants.*; + + +/** + * Critical connectivity packet summarizing class. + * + * Outputs short descriptions of ARP, DHCPv4, and IPv6 RS/RA/NS/NA packets. + * + * @hide + */ +public class ConnectivityPacketSummary { + private static final String TAG = ConnectivityPacketSummary.class.getSimpleName(); + + private final byte[] mHwAddr; + private final byte[] mBytes; + private final int mLength; + private final ByteBuffer mPacket; + private final String mSummary; + + public static String summarize(byte[] hwaddr, byte[] buffer) { + return summarize(hwaddr, buffer, buffer.length); + } + + // Methods called herein perform some but by no means all error checking. + // They may throw runtime exceptions on malformed packets. + public static String summarize(byte[] hwaddr, byte[] buffer, int length) { + if ((hwaddr == null) || (hwaddr.length != ETHER_ADDR_LEN)) return null; + if (buffer == null) return null; + length = Math.min(length, buffer.length); + return (new ConnectivityPacketSummary(hwaddr, buffer, length)).toString(); + } + + private ConnectivityPacketSummary(byte[] hwaddr, byte[] buffer, int length) { + mHwAddr = hwaddr; + mBytes = buffer; + mLength = Math.min(length, mBytes.length); + mPacket = ByteBuffer.wrap(mBytes, 0, mLength); + mPacket.order(ByteOrder.BIG_ENDIAN); + + final StringJoiner sj = new StringJoiner(" "); + // TODO: support other link-layers, or even no link-layer header. + parseEther(sj); + mSummary = sj.toString(); + } + + public String toString() { + return mSummary; + } + + private void parseEther(StringJoiner sj) { + if (mPacket.remaining() < ETHER_HEADER_LEN) { + sj.add("runt:").add(asString(mPacket.remaining())); + return; + } + + mPacket.position(ETHER_SRC_ADDR_OFFSET); + final ByteBuffer srcMac = (ByteBuffer) mPacket.slice().limit(ETHER_ADDR_LEN); + sj.add(ByteBuffer.wrap(mHwAddr).equals(srcMac) ? "TX" : "RX"); + sj.add(getMacAddressString(srcMac)); + + mPacket.position(ETHER_DST_ADDR_OFFSET); + final ByteBuffer dstMac = (ByteBuffer) mPacket.slice().limit(ETHER_ADDR_LEN); + sj.add(">").add(getMacAddressString(dstMac)); + + mPacket.position(ETHER_TYPE_OFFSET); + final int etherType = asUint(mPacket.getShort()); + switch (etherType) { + case ETHER_TYPE_ARP: + sj.add("arp"); + parseARP(sj); + break; + case ETHER_TYPE_IPV4: + sj.add("ipv4"); + parseIPv4(sj); + break; + case ETHER_TYPE_IPV6: + sj.add("ipv6"); + parseIPv6(sj); + break; + default: + // Unknown ether type. + sj.add("ethtype").add(asString(etherType)); + break; + } + } + + private void parseARP(StringJoiner sj) { + if (mPacket.remaining() < ARP_PAYLOAD_LEN) { + sj.add("runt:").add(asString(mPacket.remaining())); + return; + } + + if (asUint(mPacket.getShort()) != ARP_HWTYPE_ETHER || + asUint(mPacket.getShort()) != ETHER_TYPE_IPV4 || + asUint(mPacket.get()) != ETHER_ADDR_LEN || + asUint(mPacket.get()) != IPV4_ADDR_LEN) { + sj.add("unexpected header"); + return; + } + + final int opCode = asUint(mPacket.getShort()); + + final String senderHwAddr = getMacAddressString(mPacket); + final String senderIPv4 = getIPv4AddressString(mPacket); + getMacAddressString(mPacket); // target hardware address, unused + final String targetIPv4 = getIPv4AddressString(mPacket); + + if (opCode == ARP_REQUEST) { + sj.add("who-has").add(targetIPv4); + } else if (opCode == ARP_REPLY) { + sj.add("reply").add(senderIPv4).add(senderHwAddr); + } else { + sj.add("unknown opcode").add(asString(opCode)); + } + } + + private void parseIPv4(StringJoiner sj) { + if (!mPacket.hasRemaining()) { + sj.add("runt"); + return; + } + + final int startOfIpLayer = mPacket.position(); + final int ipv4HeaderLength = (mPacket.get(startOfIpLayer) & IPV4_IHL_MASK) * 4; + if (mPacket.remaining() < ipv4HeaderLength || + mPacket.remaining() < IPV4_HEADER_MIN_LEN) { + sj.add("runt:").add(asString(mPacket.remaining())); + return; + } + final int startOfTransportLayer = startOfIpLayer + ipv4HeaderLength; + + mPacket.position(startOfIpLayer + IPV4_FLAGS_OFFSET); + final int flagsAndFragment = asUint(mPacket.getShort()); + final boolean isFragment = (flagsAndFragment & IPV4_FRAGMENT_MASK) != 0; + + mPacket.position(startOfIpLayer + IPV4_PROTOCOL_OFFSET); + final int protocol = asUint(mPacket.get()); + + mPacket.position(startOfIpLayer + IPV4_SRC_ADDR_OFFSET); + final String srcAddr = getIPv4AddressString(mPacket); + + mPacket.position(startOfIpLayer + IPV4_DST_ADDR_OFFSET); + final String dstAddr = getIPv4AddressString(mPacket); + + sj.add(srcAddr).add(">").add(dstAddr); + + mPacket.position(startOfTransportLayer); + if (protocol == IPPROTO_UDP) { + sj.add("udp"); + if (isFragment) sj.add("fragment"); + else parseUDP(sj); + } else { + sj.add("proto").add(asString(protocol)); + if (isFragment) sj.add("fragment"); + } + } + + private void parseIPv6(StringJoiner sj) { + if (mPacket.remaining() < IPV6_HEADER_LEN) { + sj.add("runt:").add(asString(mPacket.remaining())); + return; + } + + final int startOfIpLayer = mPacket.position(); + + mPacket.position(startOfIpLayer + IPV6_PROTOCOL_OFFSET); + final int protocol = asUint(mPacket.get()); + + mPacket.position(startOfIpLayer + IPV6_SRC_ADDR_OFFSET); + final String srcAddr = getIPv6AddressString(mPacket); + final String dstAddr = getIPv6AddressString(mPacket); + + sj.add(srcAddr).add(">").add(dstAddr); + + mPacket.position(startOfIpLayer + IPV6_HEADER_LEN); + if (protocol == IPPROTO_ICMPV6) { + sj.add("icmp6"); + parseICMPv6(sj); + } else { + sj.add("proto").add(asString(protocol)); + } + } + + private void parseICMPv6(StringJoiner sj) { + if (mPacket.remaining() < ICMPV6_HEADER_MIN_LEN) { + sj.add("runt:").add(asString(mPacket.remaining())); + return; + } + + final int icmp6Type = asUint(mPacket.get()); + final int icmp6Code = asUint(mPacket.get()); + mPacket.getShort(); // checksum, unused + + switch (icmp6Type) { + case ICMPV6_ROUTER_SOLICITATION: + sj.add("rs"); + parseICMPv6RouterSolicitation(sj); + break; + case ICMPV6_ROUTER_ADVERTISEMENT: + sj.add("ra"); + parseICMPv6RouterAdvertisement(sj); + break; + case ICMPV6_NEIGHBOR_SOLICITATION: + sj.add("ns"); + parseICMPv6NeighborMessage(sj); + break; + case ICMPV6_NEIGHBOR_ADVERTISEMENT: + sj.add("na"); + parseICMPv6NeighborMessage(sj); + break; + default: + sj.add("type").add(asString(icmp6Type)); + sj.add("code").add(asString(icmp6Code)); + break; + } + } + + private void parseICMPv6RouterSolicitation(StringJoiner sj) { + final int RESERVED = 4; + if (mPacket.remaining() < RESERVED) { + sj.add("runt:").add(asString(mPacket.remaining())); + return; + } + + mPacket.position(mPacket.position() + RESERVED); + parseICMPv6NeighborDiscoveryOptions(sj); + } + + private void parseICMPv6RouterAdvertisement(StringJoiner sj) { + final int FLAGS_AND_TIMERS = 3 * 4; + if (mPacket.remaining() < FLAGS_AND_TIMERS) { + sj.add("runt:").add(asString(mPacket.remaining())); + return; + } + + mPacket.position(mPacket.position() + FLAGS_AND_TIMERS); + parseICMPv6NeighborDiscoveryOptions(sj); + } + + private void parseICMPv6NeighborMessage(StringJoiner sj) { + final int RESERVED = 4; + final int minReq = RESERVED + IPV6_ADDR_LEN; + if (mPacket.remaining() < minReq) { + sj.add("runt:").add(asString(mPacket.remaining())); + return; + } + + mPacket.position(mPacket.position() + RESERVED); + sj.add(getIPv6AddressString(mPacket)); + parseICMPv6NeighborDiscoveryOptions(sj); + } + + private void parseICMPv6NeighborDiscoveryOptions(StringJoiner sj) { + // All ND options are TLV, where T is one byte and L is one byte equal + // to the length of T + L + V in units of 8 octets. + while (mPacket.remaining() >= ICMPV6_ND_OPTION_MIN_LENGTH) { + final int ndType = asUint(mPacket.get()); + final int ndLength = asUint(mPacket.get()); + final int ndBytes = ndLength * ICMPV6_ND_OPTION_LENGTH_SCALING_FACTOR - 2; + if (ndBytes < 0 || ndBytes > mPacket.remaining()) { + sj.add(""); + break; + } + final int position = mPacket.position(); + + switch (ndType) { + case ICMPV6_ND_OPTION_SLLA: + sj.add("slla"); + sj.add(getMacAddressString(mPacket)); + break; + case ICMPV6_ND_OPTION_TLLA: + sj.add("tlla"); + sj.add(getMacAddressString(mPacket)); + break; + case ICMPV6_ND_OPTION_MTU: + sj.add("mtu"); + final short reserved = mPacket.getShort(); + sj.add(asString(mPacket.getInt())); + break; + default: + // Skip. + break; + } + + mPacket.position(position + ndBytes); + } + } + + private void parseUDP(StringJoiner sj) { + if (mPacket.remaining() < UDP_HEADER_LEN) { + sj.add("runt:").add(asString(mPacket.remaining())); + return; + } + + final int previous = mPacket.position(); + final int srcPort = asUint(mPacket.getShort()); + final int dstPort = asUint(mPacket.getShort()); + sj.add(asString(srcPort)).add(">").add(asString(dstPort)); + + mPacket.position(previous + UDP_HEADER_LEN); + if (srcPort == DHCP4_CLIENT_PORT || dstPort == DHCP4_CLIENT_PORT) { + sj.add("dhcp4"); + parseDHCPv4(sj); + } + } + + private void parseDHCPv4(StringJoiner sj) { + final DhcpPacket dhcpPacket; + try { + dhcpPacket = DhcpPacket.decodeFullPacket(mBytes, mLength, DhcpPacket.ENCAP_L2); + sj.add(dhcpPacket.toString()); + } catch (DhcpPacket.ParseException e) { + sj.add("parse error: " + e); + } + } + + private static String getIPv4AddressString(ByteBuffer ipv4) { + return getIpAddressString(ipv4, IPV4_ADDR_LEN); + } + + private static String getIPv6AddressString(ByteBuffer ipv6) { + return getIpAddressString(ipv6, IPV6_ADDR_LEN); + } + + private static String getIpAddressString(ByteBuffer ip, int byteLength) { + if (ip == null || ip.remaining() < byteLength) return "invalid"; + + byte[] bytes = new byte[byteLength]; + ip.get(bytes, 0, byteLength); + try { + InetAddress addr = InetAddress.getByAddress(bytes); + return addr.getHostAddress(); + } catch (UnknownHostException uhe) { + return "unknown"; + } + } + + private static String getMacAddressString(ByteBuffer mac) { + if (mac == null || mac.remaining() < ETHER_ADDR_LEN) return "invalid"; + + byte[] bytes = new byte[ETHER_ADDR_LEN]; + mac.get(bytes, 0, bytes.length); + Byte[] printableBytes = new Byte[bytes.length]; + int i = 0; + for (byte b : bytes) printableBytes[i++] = b; + + final String MAC48_FORMAT = "%02x:%02x:%02x:%02x:%02x:%02x"; + return String.format(MAC48_FORMAT, printableBytes); + } +} diff --git a/services/net/java/android/net/util/NetworkConstants.java b/services/net/java/android/net/util/NetworkConstants.java new file mode 100644 index 000000000000..362f7570c124 --- /dev/null +++ b/services/net/java/android/net/util/NetworkConstants.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.util; + +import java.nio.ByteBuffer; + + +/** + * Networking protocol constants. + * + * Includes: + * - constants that describe packet layout + * - various helper functions + * + * @hide + */ +public final class NetworkConstants { + private NetworkConstants() { throw new RuntimeException("no instance permitted"); } + + /** + * Ethernet constants. + * + * See also: + * - https://tools.ietf.org/html/rfc894 + * - https://tools.ietf.org/html/rfc7042 + * - http://www.iana.org/assignments/ethernet-numbers/ethernet-numbers.xhtml + * - http://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml + */ + public static final int ETHER_DST_ADDR_OFFSET = 0; + public static final int ETHER_SRC_ADDR_OFFSET = 6; + public static final int ETHER_ADDR_LEN = 6; + + public static final int ETHER_TYPE_OFFSET = 12; + public static final int ETHER_TYPE_LENGTH = 2; + public static final int ETHER_TYPE_ARP = 0x0806; + public static final int ETHER_TYPE_IPV4 = 0x0800; + public static final int ETHER_TYPE_IPV6 = 0x86dd; + + public static final int ETHER_HEADER_LEN = 14; + + private static final byte FF = asByte(0xff); + public static final byte[] ETHER_ADDR_BROADCAST = { + FF, FF, FF, FF, FF, FF + }; + + /** + * ARP constants. + * + * See also: + * - https://tools.ietf.org/html/rfc826 + * - http://www.iana.org/assignments/arp-parameters/arp-parameters.xhtml + */ + public static final int ARP_PAYLOAD_LEN = 28; // For Ethernet+IPv4. + public static final int ARP_REQUEST = 1; + public static final int ARP_REPLY = 2; + public static final int ARP_HWTYPE_RESERVED_LO = 0; + public static final int ARP_HWTYPE_ETHER = 1; + public static final int ARP_HWTYPE_RESERVED_HI = 0xffff; + + /** + * IPv4 constants. + * + * See als: + * - https://tools.ietf.org/html/rfc791 + */ + public static final int IPV4_HEADER_MIN_LEN = 20; + public static final int IPV4_IHL_MASK = 0xf; + public static final int IPV4_FLAGS_OFFSET = 6; + public static final int IPV4_FRAGMENT_MASK = 0x1fff; + public static final int IPV4_PROTOCOL_OFFSET = 9; + public static final int IPV4_SRC_ADDR_OFFSET = 12; + public static final int IPV4_DST_ADDR_OFFSET = 16; + public static final int IPV4_ADDR_LEN = 4; + + /** + * IPv6 constants. + * + * See also: + * - https://tools.ietf.org/html/rfc2460 + */ + public static final int IPV6_HEADER_LEN = 40; + public static final int IPV6_PROTOCOL_OFFSET = 6; + public static final int IPV6_SRC_ADDR_OFFSET = 8; + public static final int IPV6_DST_ADDR_OFFSET = 24; + public static final int IPV6_ADDR_LEN = 16; + + /** + * ICMPv6 constants. + * + * See also: + * - https://tools.ietf.org/html/rfc4443 + * - https://tools.ietf.org/html/rfc4861 + */ + public static final int ICMPV6_HEADER_MIN_LEN = 4; + public static final int ICMPV6_ROUTER_SOLICITATION = 133; + public static final int ICMPV6_ROUTER_ADVERTISEMENT = 134; + public static final int ICMPV6_NEIGHBOR_SOLICITATION = 135; + public static final int ICMPV6_NEIGHBOR_ADVERTISEMENT = 136; + + public static final int ICMPV6_ND_OPTION_MIN_LENGTH = 8; + public static final int ICMPV6_ND_OPTION_LENGTH_SCALING_FACTOR = 8; + public static final int ICMPV6_ND_OPTION_SLLA = 1; + public static final int ICMPV6_ND_OPTION_TLLA = 2; + public static final int ICMPV6_ND_OPTION_MTU = 5; + + /** + * UDP constants. + * + * See also: + * - https://tools.ietf.org/html/rfc768 + */ + public static final int UDP_HEADER_LEN = 8; + + /** + * DHCP(v4) constants. + * + * See also: + * - https://tools.ietf.org/html/rfc2131 + */ + public static final int DHCP4_SERVER_PORT = 67; + public static final int DHCP4_CLIENT_PORT = 68; + + /** + * Utility functions. + */ + public static byte asByte(int i) { return (byte) i; } + + public static String asString(int i) { return Integer.toString(i); } + + public static int asUint(byte b) { return (b & 0xff); } + public static int asUint(short s) { return (s & 0xffff); } +} diff --git a/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java b/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java index 6197c42d0146..c6804cdf2a1a 100644 --- a/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java +++ b/services/retaildemo/java/com/android/server/retaildemo/RetailDemoModeService.java @@ -26,7 +26,6 @@ import android.app.RetailDemoModeServiceInternal; import android.content.BroadcastReceiver; import android.content.ComponentName; -import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; @@ -59,6 +58,7 @@ import android.provider.CallLog; import android.provider.MediaStore; import android.provider.Settings; +import android.text.TextUtils; import android.util.KeyValueListParser; import android.util.Slog; import com.android.internal.os.BackgroundThread; @@ -103,7 +103,8 @@ public class RetailDemoModeService extends SystemService { private static final String DEMO_SESSION_COUNT = "retail_demo_session_count"; private static final String DEMO_SESSION_DURATION = "retail_demo_session_duration"; - boolean mDeviceInDemoMode = false; + boolean mDeviceInDemoMode; + boolean mIsCarrierDemoMode; int mCurrentUserId = UserHandle.USER_SYSTEM; long mUserInactivityTimeout; long mWarningDialogTimeout; @@ -138,7 +139,8 @@ public void onReceive(Context context, Intent intent) { if (!mDeviceInDemoMode) { return; } - switch (intent.getAction()) { + final String action = intent.getAction(); + switch (action) { case Intent.ACTION_SCREEN_OFF: mHandler.removeMessages(MSG_TURN_SCREEN_ON); mHandler.sendEmptyMessageDelayed(MSG_TURN_SCREEN_ON, SCREEN_WAKEUP_DELAY); @@ -166,7 +168,7 @@ public void handleMessage(Message msg) { mWakeLock.acquire(); break; case MSG_INACTIVITY_TIME_OUT: - if (isDemoLauncherDisabled()) { + if (!mIsCarrierDemoMode && isDemoLauncherDisabled()) { Slog.i(TAG, "User inactivity timeout reached"); showInactivityCountdownDialog(); } @@ -177,12 +179,29 @@ public void handleMessage(Message msg) { } removeMessages(MSG_START_NEW_SESSION); removeMessages(MSG_INACTIVITY_TIME_OUT); - if (mCurrentUserId != UserHandle.USER_SYSTEM) { + if (!mIsCarrierDemoMode && mCurrentUserId != UserHandle.USER_SYSTEM) { logSessionDuration(); } - final UserInfo demoUser = getUserManager().createUser(DEMO_USER_NAME, - UserInfo.FLAG_DEMO | UserInfo.FLAG_EPHEMERAL); - if (demoUser != null) { + + UserInfo demoUser = null; + if (mIsCarrierDemoMode) { + // Re-use the existing demo user in carrier demo mode. + for (UserInfo user : getUserManager().getUsers()) { + if (user.isDemo()) { + demoUser = user; + break; + } + } + } + + if (demoUser == null) { + // User in carrier demo mode should survive reboots. + final int flags = UserInfo.FLAG_DEMO + | (mIsCarrierDemoMode ? 0 : UserInfo.FLAG_EPHEMERAL); + demoUser = getUserManager().createUser(DEMO_USER_NAME, flags); + } + + if (demoUser != null && mCurrentUserId != demoUser.id) { setupDemoUser(demoUser); getActivityManager().switchUser(demoUser.id); } @@ -196,8 +215,6 @@ private class SettingsObserver extends ContentObserver { private final static String KEY_USER_INACTIVITY_TIMEOUT = "user_inactivity_timeout_ms"; private final static String KEY_WARNING_DIALOG_TIMEOUT = "warning_dialog_timeout_ms"; - private final Uri mDeviceDemoModeUri = Settings.Global - .getUriFor(Settings.Global.DEVICE_DEMO_MODE); private final Uri mDeviceProvisionedUri = Settings.Global .getUriFor(Settings.Global.DEVICE_PROVISIONED); private final Uri mRetailDemoConstantsUri = Settings.Global @@ -211,7 +228,6 @@ public SettingsObserver(Handler handler) { public void register() { ContentResolver cr = getContext().getContentResolver(); - cr.registerContentObserver(mDeviceDemoModeUri, false, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mDeviceProvisionedUri, false, this, UserHandle.USER_SYSTEM); cr.registerContentObserver(mRetailDemoConstantsUri, false, this, UserHandle.USER_SYSTEM); @@ -223,29 +239,28 @@ public void onChange(boolean selfChange, Uri uri) { refreshTimeoutConstants(); return; } - if (mDeviceDemoModeUri.equals(uri)) { - mDeviceInDemoMode = UserManager.isDeviceInDemoMode(getContext()); - if (mDeviceInDemoMode) { + // If device is provisioned and left demo mode - run the cleanup in demo folder + if (isDeviceProvisioned()) { + if (UserManager.isDeviceInDemoMode(getContext())) { putDeviceInDemoMode(); } else { SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "0"); + + // Run on the bg thread to not block the fg thread + BackgroundThread.getHandler().post(new Runnable() { + @Override + public void run() { + if (!deletePreloadsFolderContents()) { + Slog.w(TAG, "Failed to delete preloads folder contents"); + } + } + }); + if (mWakeLock.isHeld()) { mWakeLock.release(); } } } - // If device is provisioned and left demo mode - run the cleanup in demo folder - if (!mDeviceInDemoMode && isDeviceProvisioned()) { - // Run on the bg thread to not block the fg thread - BackgroundThread.getHandler().post(new Runnable() { - @Override - public void run() { - if (!deletePreloadsFolderContents()) { - Slog.w(TAG, "Failed to delete preloads folder contents"); - } - } - }); - } } private void refreshTimeoutConstants() { @@ -312,23 +327,22 @@ private PendingIntent getResetDemoPendingIntent() { } boolean isDemoLauncherDisabled() { - IPackageManager pm = AppGlobals.getPackageManager(); int enabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; - String demoLauncherComponent = getContext().getResources() - .getString(R.string.config_demoModeLauncherComponent); try { - enabledState = pm.getComponentEnabledSetting( - ComponentName.unflattenFromString(demoLauncherComponent), - mCurrentUserId); - } catch (RemoteException exc) { - Slog.e(TAG, "Unable to talk to Package Manager", exc); + final IPackageManager iPm = AppGlobals.getPackageManager(); + final String demoLauncherComponent = + getContext().getString(R.string.config_demoModeLauncherComponent); + enabledState = iPm.getComponentEnabledSetting( + ComponentName.unflattenFromString(demoLauncherComponent), mCurrentUserId); + } catch (RemoteException re) { + Slog.e(TAG, "Error retrieving demo launcher enabled setting", re); } return enabledState == PackageManager.COMPONENT_ENABLED_STATE_DISABLED; } private void setupDemoUser(UserInfo userInfo) { - UserManager um = getUserManager(); - UserHandle user = UserHandle.of(userInfo.id); + final UserManager um = getUserManager(); + final UserHandle user = UserHandle.of(userInfo.id); um.setUserRestriction(UserManager.DISALLOW_CONFIG_WIFI, true, user); um.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, true, user); um.setUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, true, user); @@ -338,14 +352,60 @@ private void setupDemoUser(UserInfo userInfo) { // Set this to false because the default is true on user creation um.setUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS, false, user); // Disallow rebooting in safe mode - controlled by user 0 - getUserManager().setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, - UserHandle.SYSTEM); + um.setUserRestriction(UserManager.DISALLOW_SAFE_BOOT, true, UserHandle.SYSTEM); + if (mIsCarrierDemoMode) { + // Enable SMS in carrier demo mode. + um.setUserRestriction(UserManager.DISALLOW_SMS, false, user); + } + Settings.Secure.putIntForUser(getContext().getContentResolver(), Settings.Secure.SKIP_FIRST_USE_HINTS, 1, userInfo.id); Settings.Global.putInt(getContext().getContentResolver(), Settings.Global.PACKAGE_VERIFIER_ENABLE, 0); + grantRuntimePermissionToCamera(user); clearPrimaryCallLog(); + + if (!mIsCarrierDemoMode) { + // Enable demo launcher. + final String demoLauncher = getContext().getString( + R.string.config_demoModeLauncherComponent); + if (!TextUtils.isEmpty(demoLauncher)) { + final ComponentName componentToEnable = + ComponentName.unflattenFromString(demoLauncher); + final String packageName = componentToEnable.getPackageName(); + try { + final IPackageManager iPm = AppGlobals.getPackageManager(); + iPm.setComponentEnabledSetting(componentToEnable, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userInfo.id); + iPm.setApplicationEnabledSetting(packageName, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userInfo.id, null); + } catch (RemoteException re) { + // Internal, shouldn't happen + } + } + } else { + // Set the carrier demo mode setting for the demo user. + final String carrierDemoModeSetting = getContext().getString( + R.string.config_carrierDemoModeSetting); + Settings.Secure.putIntForUser(getContext().getContentResolver(), + carrierDemoModeSetting, 1, userInfo.id); + + // Enable packages for carrier demo mode. + final String packageList = getContext().getString( + R.string.config_carrierDemoModePackages); + final String[] packageNames = packageList == null ? new String[0] + : TextUtils.split(packageList, ","); + final IPackageManager iPm = AppGlobals.getPackageManager(); + for (String packageName : packageNames) { + try { + iPm.setApplicationEnabledSetting(packageName, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, userInfo.id, null); + } catch (RemoteException re) { + Slog.e(TAG, "Error enabling application: " + packageName, re); + } + } + } } private void grantRuntimePermissionToCamera(UserHandle user) { @@ -419,7 +479,9 @@ private boolean deletePreloadsFolderContents() { private void registerBroadcastReceiver() { final IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_OFF); + if (!mIsCarrierDemoMode) { + filter.addAction(Intent.ACTION_SCREEN_OFF); + } filter.addAction(ACTION_RESET_DEMO); getContext().registerReceiver(mBroadcastReceiver, filter); } @@ -465,8 +527,18 @@ private Configuration getSystemUsersConfiguration() { } private void putDeviceInDemoMode() { + mDeviceInDemoMode = true; + + final String carrierDemoModeSetting = + getContext().getString(R.string.config_carrierDemoModeSetting); + mIsCarrierDemoMode = !TextUtils.isEmpty(carrierDemoModeSetting) + && (Settings.Secure.getInt(getContext().getContentResolver(), + carrierDemoModeSetting, 0) == 1); + SystemProperties.set(SYSTEM_PROPERTY_RETAIL_DEMO_ENABLED, "1"); mHandler.sendEmptyMessage(MSG_START_NEW_SESSION); + + registerBroadcastReceiver(); } @Override @@ -488,10 +560,8 @@ public void onBootPhase(int bootPhase) { mPreloadAppsInstaller = new PreloadAppsInstaller(getContext()); mPm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE); mAmi = LocalServices.getService(ActivityManagerInternal.class); - mWakeLock = mPm - .newWakeLock( - PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, - TAG); + mWakeLock = mPm.newWakeLock( + PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG); mNm = NotificationManager.from(getContext()); mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); mCameraManager = (CameraManager) getContext() @@ -500,11 +570,9 @@ public void onBootPhase(int bootPhase) { SettingsObserver settingsObserver = new SettingsObserver(mHandler); settingsObserver.register(); settingsObserver.refreshTimeoutConstants(); - registerBroadcastReceiver(); break; case PHASE_BOOT_COMPLETED: if (UserManager.isDeviceInDemoMode(getContext())) { - mDeviceInDemoMode = true; putDeviceInDemoMode(); } break; @@ -524,32 +592,38 @@ public void onSwitchUser(int userId) { Slog.wtf(TAG, "Should not allow switch to non-demo user in demo mode"); return; } - if (!mWakeLock.isHeld()) { + if (!mIsCarrierDemoMode && !mWakeLock.isHeld()) { mWakeLock.acquire(); } mCurrentUserId = userId; mAmi.updatePersistentConfigurationForUser(getSystemUsersConfiguration(), userId); + turnOffAllFlashLights(); muteVolumeStreams(); if (!mWifiManager.isWifiEnabled()) { mWifiManager.setWifiEnabled(true); } + // Disable lock screen for demo users. LockPatternUtils lockPatternUtils = new LockPatternUtils(getContext()); lockPatternUtils.setLockScreenDisabled(true, userId); - mNm.notifyAsUser(TAG, 1, createResetNotification(), UserHandle.of(userId)); - synchronized (mActivityLock) { - mUserUntouched = true; - } - MetricsLogger.count(getContext(), DEMO_SESSION_COUNT, 1); - mHandler.removeMessages(MSG_INACTIVITY_TIME_OUT); - mHandler.post(new Runnable() { - @Override - public void run() { - mPreloadAppsInstaller.installApps(userId); + if (!mIsCarrierDemoMode) { + // Show reset notification (except in carrier demo mode). + mNm.notifyAsUser(TAG, 1, createResetNotification(), UserHandle.of(userId)); + + synchronized (mActivityLock) { + mUserUntouched = true; } - }); + MetricsLogger.count(getContext(), DEMO_SESSION_COUNT, 1); + mHandler.removeMessages(MSG_INACTIVITY_TIME_OUT); + mHandler.post(new Runnable() { + @Override + public void run() { + mPreloadAppsInstaller.installApps(userId); + } + }); + } } private RetailDemoModeServiceInternal mLocalService = new RetailDemoModeServiceInternal() { @@ -557,7 +631,7 @@ public void run() { @Override public void onUserActivity() { - if (!mDeviceInDemoMode) { + if (!mDeviceInDemoMode || mIsCarrierDemoMode) { return; } long timeOfActivity = SystemClock.uptimeMillis(); diff --git a/services/tests/servicestests/Android.mk b/services/tests/servicestests/Android.mk index 50e0662ad4d4..7886b5e9e395 100644 --- a/services/tests/servicestests/Android.mk +++ b/services/tests/servicestests/Android.mk @@ -21,7 +21,8 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ guava \ android-support-test \ mockito-target \ - ShortcutManagerTestUtils + ShortcutManagerTestUtils \ + truth-prebuilt LOCAL_JAVA_LIBRARIES := android.test.runner @@ -46,6 +47,11 @@ LOCAL_JNI_SHARED_LIBRARIES := libservicestestsjni \ LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk +# Code coverage puts us over the dex limit, so enable multi-dex for coverage-enabled builds +ifeq (true,$(EMMA_INSTRUMENT)) +LOCAL_JACK_FLAGS := --multi-dex native +endif # EMMA_INSTRUMENT_STATIC + include $(BUILD_PACKAGE) ######################################################################### diff --git a/services/tests/servicestests/src/android/net/apf/ApfTest.java b/services/tests/servicestests/src/android/net/apf/ApfTest.java index f7c61d15bb5f..6092fddc6be8 100644 --- a/services/tests/servicestests/src/android/net/apf/ApfTest.java +++ b/services/tests/servicestests/src/android/net/apf/ApfTest.java @@ -660,9 +660,13 @@ public void shutdown() { // The IPv6 all nodes address ff02::1 private static final byte[] IPV6_ALL_NODES_ADDRESS = { (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; + private static final byte[] IPV6_ALL_ROUTERS_ADDRESS = + { (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 }; private static final int ICMP6_TYPE_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN; + private static final int ICMP6_ROUTER_SOLICITATION = 133; private static final int ICMP6_ROUTER_ADVERTISEMENT = 134; + private static final int ICMP6_NEIGHBOR_SOLICITATION = 135; private static final int ICMP6_NEIGHBOR_ANNOUNCEMENT = 136; private static final int ICMP6_RA_HEADER_LEN = 16; @@ -797,6 +801,12 @@ public void testApfFilterIPv6() throws Exception { put(packet, IPV6_DEST_ADDR_OFFSET, IPV6_ALL_NODES_ADDRESS); assertDrop(program, packet.array()); + // Verify ICMPv6 RS to any is dropped + packet.put(ICMP6_TYPE_OFFSET, (byte)ICMP6_ROUTER_SOLICITATION); + assertDrop(program, packet.array()); + put(packet, IPV6_DEST_ADDR_OFFSET, IPV6_ALL_ROUTERS_ADDRESS); + assertDrop(program, packet.array()); + apfFilter.shutdown(); } diff --git a/services/tests/servicestests/src/android/net/util/BlockingSocketReaderTest.java b/services/tests/servicestests/src/android/net/util/BlockingSocketReaderTest.java new file mode 100644 index 000000000000..e03350f29f95 --- /dev/null +++ b/services/tests/servicestests/src/android/net/util/BlockingSocketReaderTest.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.util; + +import static android.system.OsConstants.*; + +import android.system.ErrnoException; +import android.system.Os; +import android.system.StructTimeval; + +import libcore.io.IoBridge; + +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketException; +import java.util.Arrays; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import junit.framework.TestCase; + + +/** + * Tests for BlockingSocketReader. + * + * @hide + */ +public class BlockingSocketReaderTest extends TestCase { + static final InetAddress LOOPBACK6 = Inet6Address.getLoopbackAddress(); + static final StructTimeval TIMEO = StructTimeval.fromMillis(500); + + protected CountDownLatch mLatch; + protected FileDescriptor mLocalSocket; + protected InetSocketAddress mLocalSockName; + protected byte[] mLastRecvBuf; + protected boolean mExited; + protected BlockingSocketReader mReceiver; + + @Override + public void setUp() { + resetLatch(); + mLocalSocket = null; + mLocalSockName = null; + mLastRecvBuf = null; + mExited = false; + + mReceiver = new BlockingSocketReader() { + @Override + protected FileDescriptor createSocket() { + FileDescriptor s = null; + try { + s = Os.socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + Os.bind(s, LOOPBACK6, 0); + mLocalSockName = (InetSocketAddress) Os.getsockname(s); + Os.setsockoptTimeval(s, SOL_SOCKET, SO_SNDTIMEO, TIMEO); + } catch (ErrnoException|SocketException e) { + closeSocket(s); + fail(); + return null; + } + + mLocalSocket = s; + return s; + } + + @Override + protected void handlePacket(byte[] recvbuf, int length) { + mLastRecvBuf = Arrays.copyOf(recvbuf, length); + mLatch.countDown(); + } + + @Override + protected void onExit() { + mExited = true; + mLatch.countDown(); + } + }; + } + + @Override + public void tearDown() { + if (mReceiver != null) mReceiver.stop(); + mReceiver = null; + } + + void resetLatch() { mLatch = new CountDownLatch(1); } + + void waitForActivity() throws Exception { + assertTrue(mLatch.await(500, TimeUnit.MILLISECONDS)); + resetLatch(); + } + + void sendPacket(byte[] contents) throws Exception { + final DatagramSocket sender = new DatagramSocket(); + sender.connect(mLocalSockName); + sender.send(new DatagramPacket(contents, contents.length)); + sender.close(); + } + + public void testBasicWorking() throws Exception { + assertTrue(mReceiver.start()); + assertTrue(mLocalSockName != null); + assertEquals(LOOPBACK6, mLocalSockName.getAddress()); + assertTrue(0 < mLocalSockName.getPort()); + assertTrue(mLocalSocket != null); + assertFalse(mExited); + + final byte[] one = "one 1".getBytes("UTF-8"); + sendPacket(one); + waitForActivity(); + assertEquals(1, mReceiver.numPacketsReceived()); + assertTrue(Arrays.equals(one, mLastRecvBuf)); + assertFalse(mExited); + + final byte[] two = "two 2".getBytes("UTF-8"); + sendPacket(two); + waitForActivity(); + assertEquals(2, mReceiver.numPacketsReceived()); + assertTrue(Arrays.equals(two, mLastRecvBuf)); + assertFalse(mExited); + + mReceiver.stop(); + waitForActivity(); + assertEquals(2, mReceiver.numPacketsReceived()); + assertTrue(Arrays.equals(two, mLastRecvBuf)); + assertTrue(mExited); + } +} diff --git a/services/tests/servicestests/src/android/net/util/ConnectivityPacketSummaryTest.java b/services/tests/servicestests/src/android/net/util/ConnectivityPacketSummaryTest.java new file mode 100644 index 000000000000..dd679bc20090 --- /dev/null +++ b/services/tests/servicestests/src/android/net/util/ConnectivityPacketSummaryTest.java @@ -0,0 +1,401 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.util; + +import static android.net.util.NetworkConstants.*; + +import libcore.util.HexEncoding; + +import junit.framework.TestCase; + + +/** + * Tests for ConnectivityPacketSummary. + * + * @hide + */ +public class ConnectivityPacketSummaryTest extends TestCase { + private static final byte[] MYHWADDR = { + asByte(0x80), asByte(0x7a), asByte(0xbf), asByte(0x6f), asByte(0x48), asByte(0xf3) + }; + + private String getSummary(String hexBytes) { + hexBytes = hexBytes.replaceAll("\\s+", ""); + final byte[] bytes = HexEncoding.decode(hexBytes.toCharArray(), false); + return ConnectivityPacketSummary.summarize(MYHWADDR, bytes); + } + + public void testParseICMPv6DADProbe() { + final String packet = + // Ethernet + "3333FF6F48F3 807ABF6F48F3 86DD" + + // IPv6 + "600000000018 3A FF" + + "00000000000000000000000000000000" + + "FF0200000000000000000001FF6F48F3" + + // ICMPv6 + "87 00 A8E7" + + "00000000" + + "FE80000000000000827ABFFFFE6F48F3"; + + final String expected = + "TX 80:7a:bf:6f:48:f3 > 33:33:ff:6f:48:f3 ipv6" + + " :: > ff02::1:ff6f:48f3 icmp6" + + " ns fe80::827a:bfff:fe6f:48f3"; + + assertEquals(expected, getSummary(packet)); + } + + public void testParseICMPv6RS() { + final String packet = + // Ethernet + "333300000002 807ABF6F48F3 86DD" + + // IPv6 + "600000000010 3A FF" + + "FE80000000000000827ABFFFFE6F48F3" + + "FF020000000000000000000000000002" + + // ICMPv6 RS + "85 00 6973" + + "00000000" + + "01 01 807ABF6F48F3"; + + final String expected = + "TX 80:7a:bf:6f:48:f3 > 33:33:00:00:00:02 ipv6" + + " fe80::827a:bfff:fe6f:48f3 > ff02::2 icmp6" + + " rs slla 80:7a:bf:6f:48:f3"; + + assertEquals(expected, getSummary(packet)); + } + + public void testParseICMPv6RA() { + final String packet = + // Ethernet + "807ABF6F48F3 100E7E263FC1 86DD" + + // IPv6 + "600000000068 3A FF" + + "FE80000000000000FA000004FD000001" + + "FE80000000000000827ABFFFFE6F48F3" + + // ICMPv6 RA + "86 00 8141" + + "40 00 0E10" + + "00000000" + + "00000000" + + "01 01 00005E000265" + + "05 01 0000000005DC" + + "19 05 000000000E10" + + " 20014860486000000000000000008844" + + " 20014860486000000000000000008888" + + "03 04 40 C0" + + " 00278D00" + + " 00093A80" + + " 00000000" + + " 2401FA000004FD000000000000000000"; + + final String expected = + "RX 10:0e:7e:26:3f:c1 > 80:7a:bf:6f:48:f3 ipv6" + + " fe80::fa00:4:fd00:1 > fe80::827a:bfff:fe6f:48f3 icmp6" + + " ra slla 00:00:5e:00:02:65 mtu 1500"; + + assertEquals(expected, getSummary(packet)); + } + + public void testParseICMPv6NS() { + final String packet = + // Ethernet + "807ABF6F48F3 100E7E263FC1 86DD" + + // IPv6 + "6C0000000020 3A FF" + + "FE80000000000000FA000004FD000001" + + "FF0200000000000000000001FF01C146" + + // ICMPv6 NS + "87 00 8AD4" + + "00000000" + + "2401FA000004FD0015EA6A5C7B01C146" + + "01 01 00005E000265"; + + final String expected = + "RX 10:0e:7e:26:3f:c1 > 80:7a:bf:6f:48:f3 ipv6" + + " fe80::fa00:4:fd00:1 > ff02::1:ff01:c146 icmp6" + + " ns 2401:fa00:4:fd00:15ea:6a5c:7b01:c146 slla 00:00:5e:00:02:65"; + + assertEquals(expected, getSummary(packet)); + } + + public void testInvalidICMPv6NDLength() { + final String packet = + // Ethernet + "807ABF6F48F3 100E7E263FC1 86DD" + + // IPv6 + "600000000068 3A FF" + + "FE80000000000000FA000004FD000001" + + "FE80000000000000827ABFFFFE6F48F3" + + // ICMPv6 RA + "86 00 8141" + + "40 00 0E10" + + "00000000" + + "00000000" + + "01 01 00005E000265" + + "00 00 0102030405D6"; + + final String expected = + "RX 10:0e:7e:26:3f:c1 > 80:7a:bf:6f:48:f3 ipv6" + + " fe80::fa00:4:fd00:1 > fe80::827a:bfff:fe6f:48f3 icmp6" + + " ra slla 00:00:5e:00:02:65 "; + + assertEquals(expected, getSummary(packet)); + } + + public void testParseICMPv6NA() { + final String packet = + // Ethernet + "00005E000265 807ABF6F48F3 86DD" + + "600000000020 3A FF" + + "2401FA000004FD0015EA6A5C7B01C146" + + "FE80000000000000FA000004FD000001" + + "88 00 E8126" + + "0000000" + + "2401FA000004FD0015EA6A5C7B01C146" + + "02 01 807ABF6F48F3"; + + final String expected = + "TX 80:7a:bf:6f:48:f3 > 00:00:5e:00:02:65 ipv6" + + " 2401:fa00:4:fd00:15ea:6a5c:7b01:c146 > fe80::fa00:4:fd00:1 icmp6" + + " na 2401:fa00:4:fd00:15ea:6a5c:7b01:c146 tlla 80:7a:bf:6f:48:f3"; + + assertEquals(expected, getSummary(packet)); + } + + public void testParseARPRequest() { + final String packet = + // Ethernet + "FFFFFFFFFFFF 807ABF6F48F3 0806" + + // ARP + "0001 0800 06 04" + + // Request + "0001" + + "807ABF6F48F3 64706ADB" + + "000000000000 64706FFD"; + + final String expected = + "TX 80:7a:bf:6f:48:f3 > ff:ff:ff:ff:ff:ff arp" + + " who-has 100.112.111.253"; + + assertEquals(expected, getSummary(packet)); + } + + public void testParseARPReply() { + final String packet = + // Ethernet + "807ABF6F48F3 288A1CA8DFC1 0806" + + // ARP + "0001 0800 06 04" + + // Reply + "0002" + + "288A1CA8DFC1 64706FFD"+ + "807ABF6F48F3 64706ADB" + + // Ethernet padding to packet min size. + "0000000000000000000000000000"; + + final String expected = + "RX 28:8a:1c:a8:df:c1 > 80:7a:bf:6f:48:f3 arp" + + " reply 100.112.111.253 28:8a:1c:a8:df:c1"; + + assertEquals(expected, getSummary(packet)); + } + + public void testParseDHCPv4Discover() { + final String packet = + // Ethernet + "FFFFFFFFFFFF 807ABF6F48F3 0800" + + // IPv4 + "451001580000400040113986" + + "00000000" + + "FFFFFFFF" + + // UDP + "0044 0043" + + "0144 5559" + + // DHCPv4 + "01 01 06 00" + + "79F7ACA4" + + "0000 0000" + + "00000000" + + "00000000" + + "00000000" + + "00000000" + + "807ABF6F48F300000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "63 82 53 63" + + "35 01 01" + + "3D 07 01807ABF6F48F3" + + "39 02 05DC" + + "3C 12 616E64726F69642D646863702D372E312E32" + + "0C 18 616E64726F69642D36623030366333313333393835343139" + + "37 0A 01 03 06 0F 1A 1C 33 3A 3B 2B" + + "FF" + + "00"; + + final String expectedPrefix = + "TX 80:7a:bf:6f:48:f3 > ff:ff:ff:ff:ff:ff ipv4" + + " 0.0.0.0 > 255.255.255.255 udp" + + " 68 > 67 dhcp4" + + " 80:7a:bf:6f:48:f3 DISCOVER"; + + assertTrue(getSummary(packet).startsWith(expectedPrefix)); + } + + public void testParseDHCPv4Offer() { + final String packet = + // Ethernet + "807ABF6F48F3 288A1CA8DFC1 0800" + + // IPv4 + "4500013D4D2C0000401188CB" + + "64706FFD" + + "64706ADB" + + // UDP + "0043 0044" + + "0129 371D" + + // DHCPv4 + "02 01 06 01" + + "79F7ACA4" + + "0000 0000" + + "00000000" + + "64706ADB" + + "00000000" + + "00000000" + + "807ABF6F48F300000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "63 82 53 63" + + "35 01 02" + + "36 04 AC188A0B" + + "33 04 00000708" + + "01 04 FFFFF000" + + "03 04 64706FFE" + + "06 08 08080808" + + " 08080404" + + "FF0001076165313A363636FF"; + + final String expectedPrefix = + "RX 28:8a:1c:a8:df:c1 > 80:7a:bf:6f:48:f3 ipv4" + + " 100.112.111.253 > 100.112.106.219 udp" + + " 67 > 68 dhcp4" + + " 80:7a:bf:6f:48:f3 OFFER"; + + assertTrue(getSummary(packet).startsWith(expectedPrefix)); + } + + public void testParseDHCPv4Request() { + final String packet = + // Ethernet + "FFFFFFFFFFFF 807ABF6F48F3 0800" + + // IPv4 + "45100164000040004011397A" + + "00000000" + + "FFFFFFFF" + + // UDP + "0044 0043" + + "0150 E5C7" + + // DHCPv4 + "01 01 06 00" + + "79F7ACA4" + + "0001 0000" + + "00000000" + + "00000000" + + "00000000" + + "00000000" + + "807ABF6F48F300000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "63 82 53 63" + + "35 01 03" + + "3D 07 01807ABF6F48F3" + + "32 04 64706ADB" + + "36 04 AC188A0B" + + "39 02 05DC" + + "3C 12 616E64726F69642D646863702D372E312E32" + + "0C 18 616E64726F69642D36623030366333313333393835343139" + + "37 0A 01 03 06 0F 1A 1C 33 3A 3B 2B" + + "FF" + + "00"; + + final String expectedPrefix = + "TX 80:7a:bf:6f:48:f3 > ff:ff:ff:ff:ff:ff ipv4" + + " 0.0.0.0 > 255.255.255.255 udp" + + " 68 > 67 dhcp4" + + " 80:7a:bf:6f:48:f3 REQUEST"; + + assertTrue(getSummary(packet).startsWith(expectedPrefix)); + } + + public void testParseDHCPv4Ack() { + final String packet = + // Ethernet + "807ABF6F48F3 288A1CA8DFC1 0800" + + // IPv4 + "4500013D4D3B0000401188BC" + + "64706FFD" + + "64706ADB" + + // UDP + "0043 0044" + + "0129 341C" + + // DHCPv4 + "02 01 06 01" + + "79F7ACA4" + + "0001 0000" + + "00000000" + + "64706ADB" + + "00000000" + + "00000000" + + "807ABF6F48F300000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "0000000000000000000000000000000000000000000000000000000000000000" + + "63 82 53 63" + + "35 01 05" + + "36 04 AC188A0B" + + "33 04 00000708" + + "01 04 FFFFF000" + + "03 04 64706FFE" + + "06 08 08080808" + + " 08080404" + + "FF0001076165313A363636FF"; + + final String expectedPrefix = + "RX 28:8a:1c:a8:df:c1 > 80:7a:bf:6f:48:f3 ipv4" + + " 100.112.111.253 > 100.112.106.219 udp" + + " 67 > 68 dhcp4" + + " 80:7a:bf:6f:48:f3 ACK"; + + assertTrue(getSummary(packet).startsWith(expectedPrefix)); + } +} diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java index 4af1cf1a0df8..65f9399c5a80 100644 --- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java @@ -236,6 +236,7 @@ private class MockNetworkAgent { private final IdleableHandlerThread mHandlerThread; private final ConditionVariable mDisconnected = new ConditionVariable(); private final ConditionVariable mNetworkStatusReceived = new ConditionVariable(); + private final ConditionVariable mPreventReconnectReceived = new ConditionVariable(); private int mScore; private NetworkAgent mNetworkAgent; private int mStartKeepaliveError = PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED; @@ -291,6 +292,11 @@ public void networkStatus(int status, String redirectUrl) { mRedirectUrl = redirectUrl; mNetworkStatusReceived.open(); } + + @Override + protected void preventAutomaticReconnect() { + mPreventReconnectReceived.open(); + } }; // Waits for the NetworkAgent to be registered, which includes the creation of the // NetworkMonitor. @@ -375,11 +381,6 @@ public void connectWithCaptivePortal(String redirectUrl) { mWrappedNetworkMonitor.gen204ProbeResult = 200; mWrappedNetworkMonitor.gen204ProbeRedirectUrl = redirectUrl; connect(false); - waitFor(new Criteria() { public boolean get() { - NetworkCapabilities caps = mCm.getNetworkCapabilities(getNetwork()); - return caps != null && caps.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL);} }); - mWrappedNetworkMonitor.gen204ProbeResult = 500; - mWrappedNetworkMonitor.gen204ProbeRedirectUrl = null; } public void disconnect() { @@ -391,6 +392,10 @@ public Network getNetwork() { return new Network(mNetworkAgent.netId); } + public ConditionVariable getPreventReconnectReceived() { + return mPreventReconnectReceived; + } + public ConditionVariable getDisconnectedCV() { return mDisconnected; } @@ -597,6 +602,7 @@ public WrappedNetworkMonitor(Context context, Handler handler, @Override protected CaptivePortalProbeResult isCaptivePortal() { + if (!mIsCaptivePortalCheckEnabled) { return new CaptivePortalProbeResult(204); } return new CaptivePortalProbeResult(gen204ProbeResult, gen204ProbeRedirectUrl, null); } } @@ -743,6 +749,9 @@ public void setUp() throws Exception { mService.systemReady(); mCm = new WrappedConnectivityManager(getContext(), mService); mCm.bindProcessToNetwork(null); + + // Ensure that the default setting for Captive Portals is used for most tests + setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT); } public void tearDown() throws Exception { @@ -1704,6 +1713,47 @@ public void testCaptivePortal() { validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); } + @LargeTest + public void testAvoidOrIgnoreCaptivePortals() { + final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); + final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); + mCm.registerNetworkCallback(captivePortalRequest, captivePortalCallback); + + final TestNetworkCallback validatedCallback = new TestNetworkCallback(); + final NetworkRequest validatedRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_VALIDATED).build(); + mCm.registerNetworkCallback(validatedRequest, validatedCallback); + + setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_AVOID); + // Bring up a network with a captive portal. + // Expect it to fail to connect and not result in any callbacks. + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + String firstRedirectUrl = "http://example.com/firstPath"; + + ConditionVariable disconnectCv = mWiFiNetworkAgent.getDisconnectedCV(); + ConditionVariable avoidCv = mWiFiNetworkAgent.getPreventReconnectReceived(); + mWiFiNetworkAgent.connectWithCaptivePortal(firstRedirectUrl); + waitFor(disconnectCv); + waitFor(avoidCv); + + assertNoCallbacks(captivePortalCallback, validatedCallback); + + // Now test ignore mode. + setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE); + + // Bring up a network with a captive portal. + // Since we're ignoring captive portals, the network will validate. + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + String secondRedirectUrl = "http://example.com/secondPath"; + mWiFiNetworkAgent.connectWithCaptivePortal(secondRedirectUrl); + + // Expect NET_CAPABILITY_VALIDATED onAvailable callback. + validatedCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + // But there should be no CaptivePortal callback. + captivePortalCallback.assertNoCallback(); + } + @SmallTest public void testInvalidNetworkSpecifier() { boolean execptionCalled = true; @@ -1844,6 +1894,11 @@ public void testRequestCallbackUpdates() throws Exception { mCm.unregisterNetworkCallback(cellNetworkCallback); } + private void setCaptivePortalMode(int mode) { + ContentResolver cr = mServiceContext.getContentResolver(); + Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE, mode); + } + private void setMobileDataAlwaysOn(boolean enable) { ContentResolver cr = mServiceContext.getContentResolver(); Settings.Global.putInt(cr, Settings.Global.MOBILE_DATA_ALWAYS_ON, enable ? 1 : 0); diff --git a/services/tests/servicestests/src/com/android/server/connectivity/DnsEventListenerServiceTest.java b/services/tests/servicestests/src/com/android/server/connectivity/DnsEventListenerServiceTest.java deleted file mode 100644 index 033b2c96c8f5..000000000000 --- a/services/tests/servicestests/src/com/android/server/connectivity/DnsEventListenerServiceTest.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2016, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.connectivity; - -import android.net.ConnectivityManager.NetworkCallback; -import android.net.ConnectivityManager; -import android.net.Network; -import android.net.metrics.DnsEvent; -import android.net.metrics.IDnsEventListener; -import android.net.metrics.IpConnectivityLog; - -import junit.framework.TestCase; -import org.junit.Before; -import org.junit.Test; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertTrue; - -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.anyInt; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import java.io.FileOutputStream; -import java.io.PrintWriter; -import java.util.Arrays; -import java.util.List; -import java.util.OptionalInt; -import java.util.stream.IntStream; - -public class DnsEventListenerServiceTest extends TestCase { - - // TODO: read from DnsEventListenerService after this constant is read from system property - static final int BATCH_SIZE = 100; - static final int EVENT_TYPE = IDnsEventListener.EVENT_GETADDRINFO; - // TODO: read from IDnsEventListener - static final int RETURN_CODE = 1; - - static final byte[] EVENT_TYPES = new byte[BATCH_SIZE]; - static final byte[] RETURN_CODES = new byte[BATCH_SIZE]; - static final int[] LATENCIES = new int[BATCH_SIZE]; - static { - for (int i = 0; i < BATCH_SIZE; i++) { - EVENT_TYPES[i] = EVENT_TYPE; - RETURN_CODES[i] = RETURN_CODE; - LATENCIES[i] = i; - } - } - - DnsEventListenerService mDnsService; - - @Mock ConnectivityManager mCm; - @Mock IpConnectivityLog mLog; - ArgumentCaptor mCallbackCaptor; - ArgumentCaptor mEvCaptor; - - public void setUp() { - MockitoAnnotations.initMocks(this); - mCallbackCaptor = ArgumentCaptor.forClass(NetworkCallback.class); - mEvCaptor = ArgumentCaptor.forClass(DnsEvent.class); - mDnsService = new DnsEventListenerService(mCm, mLog); - - verify(mCm, times(1)).registerNetworkCallback(any(), mCallbackCaptor.capture()); - } - - public void testOneBatch() throws Exception { - log(105, LATENCIES); - log(106, Arrays.copyOf(LATENCIES, BATCH_SIZE - 1)); // one lookup short of a batch event - - verifyLoggedEvents(new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES)); - - log(106, Arrays.copyOfRange(LATENCIES, BATCH_SIZE - 1, BATCH_SIZE)); - - mEvCaptor = ArgumentCaptor.forClass(DnsEvent.class); // reset argument captor - verifyLoggedEvents( - new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), - new DnsEvent(106, EVENT_TYPES, RETURN_CODES, LATENCIES)); - } - - public void testSeveralBatches() throws Exception { - log(105, LATENCIES); - log(106, LATENCIES); - log(105, LATENCIES); - log(107, LATENCIES); - - verifyLoggedEvents( - new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), - new DnsEvent(106, EVENT_TYPES, RETURN_CODES, LATENCIES), - new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), - new DnsEvent(107, EVENT_TYPES, RETURN_CODES, LATENCIES)); - } - - public void testBatchAndNetworkLost() throws Exception { - byte[] eventTypes = Arrays.copyOf(EVENT_TYPES, 20); - byte[] returnCodes = Arrays.copyOf(RETURN_CODES, 20); - int[] latencies = Arrays.copyOf(LATENCIES, 20); - - log(105, LATENCIES); - log(105, latencies); - mCallbackCaptor.getValue().onLost(new Network(105)); - log(105, LATENCIES); - - verifyLoggedEvents( - new DnsEvent(105, eventTypes, returnCodes, latencies), - new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), - new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES)); - } - - public void testConcurrentBatchesAndDumps() throws Exception { - final long stop = System.currentTimeMillis() + 100; - final PrintWriter pw = new PrintWriter(new FileOutputStream("/dev/null")); - new Thread() { - public void run() { - while (System.currentTimeMillis() < stop) { - mDnsService.dump(pw); - } - } - }.start(); - - logAsync(105, LATENCIES); - logAsync(106, LATENCIES); - logAsync(107, LATENCIES); - - verifyLoggedEvents(500, - new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), - new DnsEvent(106, EVENT_TYPES, RETURN_CODES, LATENCIES), - new DnsEvent(107, EVENT_TYPES, RETURN_CODES, LATENCIES)); - } - - public void testConcurrentBatchesAndNetworkLoss() throws Exception { - logAsync(105, LATENCIES); - Thread.sleep(10L); - // call onLost() asynchronously to logAsync's onDnsEvent() calls. - mCallbackCaptor.getValue().onLost(new Network(105)); - - // do not verify unpredictable batch - verify(mLog, timeout(500).times(1)).log(any()); - } - - void log(int netId, int[] latencies) { - for (int l : latencies) { - mDnsService.onDnsEvent(netId, EVENT_TYPE, RETURN_CODE, l); - } - } - - void logAsync(int netId, int[] latencies) { - new Thread() { - public void run() { - log(netId, latencies); - } - }.start(); - } - - void verifyLoggedEvents(DnsEvent... expected) { - verifyLoggedEvents(0, expected); - } - - void verifyLoggedEvents(int wait, DnsEvent... expectedEvents) { - verify(mLog, timeout(wait).times(expectedEvents.length)).log(mEvCaptor.capture()); - for (DnsEvent got : mEvCaptor.getAllValues()) { - OptionalInt index = IntStream.range(0, expectedEvents.length) - .filter(i -> eventsEqual(expectedEvents[i], got)) - .findFirst(); - // Don't match same expected event more than once. - index.ifPresent(i -> expectedEvents[i] = null); - assertTrue(index.isPresent()); - } - } - - /** equality function for DnsEvent to avoid overriding equals() and hashCode(). */ - static boolean eventsEqual(DnsEvent expected, DnsEvent got) { - return (expected == got) || ((expected != null) && (got != null) - && (expected.netId == got.netId) - && Arrays.equals(expected.eventTypes, got.eventTypes) - && Arrays.equals(expected.returnCodes, got.returnCodes) - && Arrays.equals(expected.latenciesMs, got.latenciesMs)); - } -} diff --git a/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityEventBuilderTest.java b/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityEventBuilderTest.java index aed363524560..011e505c46c4 100644 --- a/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityEventBuilderTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityEventBuilderTest.java @@ -16,6 +16,17 @@ package com.android.server.connectivity; +import static com.android.server.connectivity.MetricsTestUtil.aBool; +import static com.android.server.connectivity.MetricsTestUtil.aByteArray; +import static com.android.server.connectivity.MetricsTestUtil.aLong; +import static com.android.server.connectivity.MetricsTestUtil.aString; +import static com.android.server.connectivity.MetricsTestUtil.aType; +import static com.android.server.connectivity.MetricsTestUtil.anInt; +import static com.android.server.connectivity.MetricsTestUtil.anIntArray; +import static com.android.server.connectivity.MetricsTestUtil.b; +import static com.android.server.connectivity.MetricsTestUtil.describeIpEvent; +import static com.android.server.connectivity.metrics.IpConnectivityLogClass.IpConnectivityLog; + import android.net.ConnectivityMetricsEvent; import android.net.metrics.ApfProgramEvent; import android.net.metrics.ApfStats; @@ -28,24 +39,13 @@ import android.net.metrics.NetworkEvent; import android.net.metrics.RaEvent; import android.net.metrics.ValidationProbeEvent; -import com.google.protobuf.nano.MessageNano; +import android.test.suitebuilder.annotation.SmallTest; import java.util.Arrays; import junit.framework.TestCase; -import static com.android.server.connectivity.metrics.IpConnectivityLogClass.IpConnectivityLog; -import static com.android.server.connectivity.MetricsTestUtil.aBool; -import static com.android.server.connectivity.MetricsTestUtil.aByteArray; -import static com.android.server.connectivity.MetricsTestUtil.aLong; -import static com.android.server.connectivity.MetricsTestUtil.aString; -import static com.android.server.connectivity.MetricsTestUtil.aType; -import static com.android.server.connectivity.MetricsTestUtil.anInt; -import static com.android.server.connectivity.MetricsTestUtil.anIntArray; -import static com.android.server.connectivity.MetricsTestUtil.b; -import static com.android.server.connectivity.MetricsTestUtil.describeIpEvent; -import static com.android.server.connectivity.MetricsTestUtil.ipEv; - public class IpConnectivityEventBuilderTest extends TestCase { + @SmallTest public void testDefaultNetworkEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(DefaultNetworkEvent.class), @@ -58,6 +58,8 @@ public void testDefaultNetworkEventSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " default_network_event <", " network_id <", " network_id: 102", @@ -70,12 +72,13 @@ public void testDefaultNetworkEventSerialization() { " transport_types: 2", " transport_types: 3", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testDhcpClientEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(DhcpClientEvent.class), @@ -86,18 +89,20 @@ public void testDhcpClientEventSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " dhcp_event <", " duration_ms: 192", - " error_code: 0", " if_name: \"wlan0\"", " state_transition: \"SomeState\"", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testDhcpErrorEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(DhcpErrorEvent.class), @@ -107,18 +112,20 @@ public void testDhcpErrorEventSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " dhcp_event <", " duration_ms: 0", - " error_code: 50397184", " if_name: \"wlan0\"", - " state_transition: \"\"", + " error_code: 50397184", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testDnsEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(DnsEvent.class), @@ -130,6 +137,8 @@ public void testDnsEventSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " dns_lookup_batch <", " event_types: 1", " event_types: 1", @@ -159,12 +168,13 @@ public void testDnsEventSerialization() { " return_codes: 200", " return_codes: 178", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testIpManagerEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(IpManagerEvent.class), @@ -175,17 +185,20 @@ public void testIpManagerEventSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " ip_provisioning_event <", " event_type: 1", " if_name: \"wlan0\"", " latency_ms: 5678", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testIpReachabilityEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(IpReachabilityEvent.class), @@ -195,16 +208,19 @@ public void testIpReachabilityEventSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " ip_reachability_event <", " event_type: 512", " if_name: \"wlan0\"", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testNetworkEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(NetworkEvent.class), @@ -215,6 +231,8 @@ public void testNetworkEventSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " network_event <", " event_type: 5", " latency_ms: 20410", @@ -222,12 +240,13 @@ public void testNetworkEventSerialization() { " network_id: 100", " >", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testValidationProbeEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(ValidationProbeEvent.class), @@ -240,6 +259,7 @@ public void testValidationProbeEventSerialization() { "dropped_events: 0", "events <", " time_ms: 1", + " transport: 0", " validation_probe_event <", " latency_ms: 40730", " network_id <", @@ -248,11 +268,13 @@ public void testValidationProbeEventSerialization() { " probe_result: 204", " probe_type: 1", " >", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testApfProgramEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(ApfProgramEvent.class), @@ -265,6 +287,8 @@ public void testApfProgramEventSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " apf_program_event <", " current_ras: 9", " drop_multicast: true", @@ -273,12 +297,13 @@ public void testApfProgramEventSerialization() { " lifetime: 200", " program_length: 2048", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testApfStatsSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(ApfStats.class), @@ -294,6 +319,8 @@ public void testApfStatsSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " apf_statistics <", " dropped_ras: 2", " duration_ms: 45000", @@ -304,12 +331,13 @@ public void testApfStatsSerialization() { " received_ras: 10", " zero_lifetime_ras: 1", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } + @SmallTest public void testRaEventSerialization() { ConnectivityMetricsEvent ev = describeIpEvent( aType(RaEvent.class), @@ -323,6 +351,8 @@ public void testRaEventSerialization() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 1", + " transport: 0", " ra_event <", " dnssl_lifetime: -1", " prefix_preferred_lifetime: 300", @@ -331,17 +361,17 @@ public void testRaEventSerialization() { " route_info_lifetime: -1", " router_lifetime: 2000", " >", - " time_ms: 1", - ">"); + ">", + "version: 2"); verifySerialization(want, ev); } static void verifySerialization(String want, ConnectivityMetricsEvent... input) { try { - byte[] got = IpConnectivityEventBuilder.serialize(0, Arrays.asList(input)); - IpConnectivityLog log = new IpConnectivityLog(); - MessageNano.mergeFrom(log, got); + byte[] got = IpConnectivityEventBuilder.serialize(0, + IpConnectivityEventBuilder.toProto(Arrays.asList(input))); + IpConnectivityLog log = IpConnectivityLog.parseFrom(got); assertEquals(want, log.toString()); } catch (Exception e) { fail(e.toString()); diff --git a/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityMetricsTest.java b/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityMetricsTest.java index 3fc89b9ff12d..450653cdb01f 100644 --- a/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityMetricsTest.java +++ b/services/tests/servicestests/src/com/android/server/connectivity/IpConnectivityMetricsTest.java @@ -16,9 +16,13 @@ package com.android.server.connectivity; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.verify; + import android.content.Context; import android.net.ConnectivityMetricsEvent; import android.net.IIpConnectivityMetrics; +import android.net.metrics.ApfProgramEvent; import android.net.metrics.ApfStats; import android.net.metrics.DefaultNetworkEvent; import android.net.metrics.DhcpClientEvent; @@ -28,9 +32,9 @@ import android.net.metrics.RaEvent; import android.net.metrics.ValidationProbeEvent; import android.os.Parcelable; +import android.test.suitebuilder.annotation.SmallTest; import android.util.Base64; import com.android.server.connectivity.metrics.IpConnectivityLogClass; -import com.google.protobuf.nano.MessageNano; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Collections; @@ -42,10 +46,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - public class IpConnectivityMetricsTest extends TestCase { static final IpReachabilityEvent FAKE_EV = new IpReachabilityEvent("wlan0", IpReachabilityEvent.NUD_FAILED); @@ -57,9 +57,10 @@ public class IpConnectivityMetricsTest extends TestCase { public void setUp() { MockitoAnnotations.initMocks(this); - mService = new IpConnectivityMetrics(mCtx); + mService = new IpConnectivityMetrics(mCtx, (ctx) -> 2000); } + @SmallTest public void testLoggingEvents() throws Exception { IpConnectivityLog logger = new IpConnectivityLog(mMockService); @@ -73,6 +74,7 @@ public void testLoggingEvents() throws Exception { assertEventsEqual(expectedEvent(3), got.get(2)); } + @SmallTest public void testLoggingEventsWithMultipleCallers() throws Exception { IpConnectivityLog logger = new IpConnectivityLog(mMockService); @@ -100,6 +102,7 @@ public void run() { } } + @SmallTest public void testBufferFlushing() { String output1 = getdump("flush"); assertEquals("", output1); @@ -112,6 +115,29 @@ public void testBufferFlushing() { assertEquals("", output3); } + @SmallTest + public void testRateLimiting() { + final IpConnectivityLog logger = new IpConnectivityLog(mService.impl); + final ApfProgramEvent ev = new ApfProgramEvent(0, 0, 0, 0, 0); + final long fakeTimestamp = 1; + + int attempt = 100; // More than burst quota, but less than buffer size. + for (int i = 0; i < attempt; i++) { + logger.log(ev); + } + + String output1 = getdump("flush"); + assertFalse("".equals(output1)); + + for (int i = 0; i < attempt; i++) { + assertFalse("expected event to be dropped", logger.log(fakeTimestamp, ev)); + } + + String output2 = getdump("flush"); + assertEquals("", output2); + } + + @SmallTest public void testEndToEndLogging() { IpConnectivityLog logger = new IpConnectivityLog(mService.impl); @@ -132,22 +158,25 @@ public void testEndToEndLogging() { String want = joinLines( "dropped_events: 0", "events <", + " time_ms: 100", + " transport: 0", " ip_reachability_event <", " event_type: 512", " if_name: \"wlan0\"", " >", - " time_ms: 100", ">", "events <", + " time_ms: 200", + " transport: 0", " dhcp_event <", " duration_ms: 192", - " error_code: 0", " if_name: \"wlan0\"", " state_transition: \"SomeState\"", " >", - " time_ms: 200", ">", "events <", + " time_ms: 300", + " transport: 0", " default_network_event <", " network_id <", " network_id: 102", @@ -160,18 +189,19 @@ public void testEndToEndLogging() { " transport_types: 2", " transport_types: 3", " >", - " time_ms: 300", ">", "events <", + " time_ms: 400", + " transport: 0", " ip_provisioning_event <", " event_type: 1", " if_name: \"wlan0\"", " latency_ms: 5678", " >", - " time_ms: 400", ">", "events <", " time_ms: 500", + " transport: 0", " validation_probe_event <", " latency_ms: 40730", " network_id <", @@ -182,6 +212,8 @@ public void testEndToEndLogging() { " >", ">", "events <", + " time_ms: 600", + " transport: 0", " apf_statistics <", " dropped_ras: 2", " duration_ms: 45000", @@ -192,9 +224,10 @@ public void testEndToEndLogging() { " received_ras: 10", " zero_lifetime_ras: 1", " >", - " time_ms: 600", ">", "events <", + " time_ms: 700", + " transport: 0", " ra_event <", " dnssl_lifetime: -1", " prefix_preferred_lifetime: 300", @@ -203,8 +236,8 @@ public void testEndToEndLogging() { " route_info_lifetime: -1", " router_lifetime: 2000", " >", - " time_ms: 700", - ">"); + ">", + "version: 2"); verifySerialization(want, getdump("flush")); } @@ -231,8 +264,7 @@ static void verifySerialization(String want, String output) { try { byte[] got = Base64.decode(output, Base64.DEFAULT); IpConnectivityLogClass.IpConnectivityLog log = - new IpConnectivityLogClass.IpConnectivityLog(); - MessageNano.mergeFrom(log, got); + IpConnectivityLogClass.IpConnectivityLog.parseFrom(got); assertEquals(want, log.toString()); } catch (Exception e) { fail(e.toString()); @@ -260,10 +292,5 @@ static void assertEventsEqual(ConnectivityMetricsEvent expected, ConnectivityMet } static final Comparator EVENT_COMPARATOR = - new Comparator() { - @Override - public int compare(ConnectivityMetricsEvent ev1, ConnectivityMetricsEvent ev2) { - return (int) (ev1.timestamp - ev2.timestamp); - } - }; + Comparator.comparingLong((ev) -> ev.timestamp); } diff --git a/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java b/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java new file mode 100644 index 000000000000..97afa60f0c6d --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/connectivity/NetdEventListenerServiceTest.java @@ -0,0 +1,326 @@ +/* + * Copyright (C) 2016, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.connectivity; + +import android.net.ConnectivityManager; +import android.net.ConnectivityManager.NetworkCallback; +import android.net.Network; +import android.net.metrics.DnsEvent; +import android.net.metrics.INetdEventListener; +import android.net.metrics.IpConnectivityLog; +import android.os.RemoteException; +import android.system.OsConstants; +import android.test.suitebuilder.annotation.SmallTest; +import com.android.server.connectivity.metrics.IpConnectivityLogClass.IpConnectivityEvent; +import java.io.FileOutputStream; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.OptionalInt; +import java.util.stream.IntStream; +import junit.framework.TestCase; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.timeout; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class NetdEventListenerServiceTest extends TestCase { + + // TODO: read from NetdEventListenerService after this constant is read from system property + static final int BATCH_SIZE = 100; + static final int EVENT_TYPE = INetdEventListener.EVENT_GETADDRINFO; + // TODO: read from INetdEventListener + static final int RETURN_CODE = 1; + + static final byte[] EVENT_TYPES = new byte[BATCH_SIZE]; + static final byte[] RETURN_CODES = new byte[BATCH_SIZE]; + static final int[] LATENCIES = new int[BATCH_SIZE]; + static { + for (int i = 0; i < BATCH_SIZE; i++) { + EVENT_TYPES[i] = EVENT_TYPE; + RETURN_CODES[i] = RETURN_CODE; + LATENCIES[i] = i; + } + } + + private static final String EXAMPLE_IPV4 = "192.0.2.1"; + private static final String EXAMPLE_IPV6 = "2001:db8:1200::2:1"; + + NetdEventListenerService mNetdEventListenerService; + + @Mock ConnectivityManager mCm; + @Mock IpConnectivityLog mLog; + ArgumentCaptor mCallbackCaptor; + ArgumentCaptor mDnsEvCaptor; + + public void setUp() { + MockitoAnnotations.initMocks(this); + mCallbackCaptor = ArgumentCaptor.forClass(NetworkCallback.class); + mDnsEvCaptor = ArgumentCaptor.forClass(DnsEvent.class); + mNetdEventListenerService = new NetdEventListenerService(mCm, mLog); + + verify(mCm, times(1)).registerNetworkCallback(any(), mCallbackCaptor.capture()); + } + + @SmallTest + public void testOneDnsBatch() throws Exception { + log(105, LATENCIES); + log(106, Arrays.copyOf(LATENCIES, BATCH_SIZE - 1)); // one lookup short of a batch event + + verifyLoggedDnsEvents(new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES)); + + log(106, Arrays.copyOfRange(LATENCIES, BATCH_SIZE - 1, BATCH_SIZE)); + + mDnsEvCaptor = ArgumentCaptor.forClass(DnsEvent.class); // reset argument captor + verifyLoggedDnsEvents( + new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), + new DnsEvent(106, EVENT_TYPES, RETURN_CODES, LATENCIES)); + } + + @SmallTest + public void testSeveralDmsBatches() throws Exception { + log(105, LATENCIES); + log(106, LATENCIES); + log(105, LATENCIES); + log(107, LATENCIES); + + verifyLoggedDnsEvents( + new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), + new DnsEvent(106, EVENT_TYPES, RETURN_CODES, LATENCIES), + new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), + new DnsEvent(107, EVENT_TYPES, RETURN_CODES, LATENCIES)); + } + + @SmallTest + public void testDnsBatchAndNetworkLost() throws Exception { + byte[] eventTypes = Arrays.copyOf(EVENT_TYPES, 20); + byte[] returnCodes = Arrays.copyOf(RETURN_CODES, 20); + int[] latencies = Arrays.copyOf(LATENCIES, 20); + + log(105, LATENCIES); + log(105, latencies); + mCallbackCaptor.getValue().onLost(new Network(105)); + log(105, LATENCIES); + + verifyLoggedDnsEvents( + new DnsEvent(105, eventTypes, returnCodes, latencies), + new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), + new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES)); + } + + @SmallTest + public void testConcurrentDnsBatchesAndDumps() throws Exception { + final long stop = System.currentTimeMillis() + 100; + final PrintWriter pw = new PrintWriter(new FileOutputStream("/dev/null")); + new Thread() { + public void run() { + while (System.currentTimeMillis() < stop) { + mNetdEventListenerService.dump(pw); + } + } + }.start(); + + logDnsAsync(105, LATENCIES); + logDnsAsync(106, LATENCIES); + logDnsAsync(107, LATENCIES); + + verifyLoggedDnsEvents(500, + new DnsEvent(105, EVENT_TYPES, RETURN_CODES, LATENCIES), + new DnsEvent(106, EVENT_TYPES, RETURN_CODES, LATENCIES), + new DnsEvent(107, EVENT_TYPES, RETURN_CODES, LATENCIES)); + } + + @SmallTest + public void testConcurrentDnsBatchesAndNetworkLoss() throws Exception { + logDnsAsync(105, LATENCIES); + Thread.sleep(10L); + // call onLost() asynchronously to logDnsAsync's onDnsEvent() calls. + mCallbackCaptor.getValue().onLost(new Network(105)); + + // do not verify unpredictable batch + verify(mLog, timeout(500).times(1)).log(any()); + } + + @SmallTest + public void testConnectLogging() throws Exception { + final int OK = 0; + Thread[] logActions = { + // ignored + connectEventAction(OsConstants.EALREADY, 0, EXAMPLE_IPV4), + connectEventAction(OsConstants.EALREADY, 0, EXAMPLE_IPV6), + connectEventAction(OsConstants.EINPROGRESS, 0, EXAMPLE_IPV4), + connectEventAction(OsConstants.EINPROGRESS, 0, EXAMPLE_IPV6), + connectEventAction(OsConstants.EINPROGRESS, 0, EXAMPLE_IPV6), + // valid latencies + connectEventAction(OK, 110, EXAMPLE_IPV4), + connectEventAction(OK, 23, EXAMPLE_IPV4), + connectEventAction(OK, 45, EXAMPLE_IPV4), + connectEventAction(OK, 56, EXAMPLE_IPV4), + connectEventAction(OK, 523, EXAMPLE_IPV6), + connectEventAction(OK, 214, EXAMPLE_IPV6), + connectEventAction(OK, 67, EXAMPLE_IPV6), + // errors + connectEventAction(OsConstants.EPERM, 0, EXAMPLE_IPV4), + connectEventAction(OsConstants.EPERM, 0, EXAMPLE_IPV4), + connectEventAction(OsConstants.EAGAIN, 0, EXAMPLE_IPV4), + connectEventAction(OsConstants.EACCES, 0, EXAMPLE_IPV4), + connectEventAction(OsConstants.EACCES, 0, EXAMPLE_IPV4), + connectEventAction(OsConstants.EACCES, 0, EXAMPLE_IPV6), + connectEventAction(OsConstants.EADDRINUSE, 0, EXAMPLE_IPV4), + connectEventAction(OsConstants.ETIMEDOUT, 0, EXAMPLE_IPV4), + connectEventAction(OsConstants.ETIMEDOUT, 0, EXAMPLE_IPV6), + connectEventAction(OsConstants.ETIMEDOUT, 0, EXAMPLE_IPV6), + connectEventAction(OsConstants.ECONNREFUSED, 0, EXAMPLE_IPV4), + }; + + for (Thread t : logActions) { + t.start(); + } + for (Thread t : logActions) { + t.join(); + } + + List events = new ArrayList<>(); + mNetdEventListenerService.flushStatistics(events); + + IpConnectivityEvent got = events.get(0); + String want = joinLines( + "time_ms: 0", + "transport: 0", + "connect_statistics <", + " connect_count: 12", + " errnos_counters <", + " key: 1", + " value: 2", + " >", + " errnos_counters <", + " key: 11", + " value: 1", + " >", + " errnos_counters <", + " key: 13", + " value: 3", + " >", + " errnos_counters <", + " key: 98", + " value: 1", + " >", + " errnos_counters <", + " key: 110", + " value: 3", + " >", + " errnos_counters <", + " key: 111", + " value: 1", + " >", + " ipv6_addr_count: 6", + " latencies_ms: 23", + " latencies_ms: 45", + " latencies_ms: 56", + " latencies_ms: 67", + " latencies_ms: 110", + " latencies_ms: 214", + " latencies_ms: 523"); + verifyConnectEvent(want, got); + } + + Thread connectEventAction(int error, int latencyMs, String ipAddr) { + return new Thread(() -> { + try { + mNetdEventListenerService.onConnectEvent(100, error, latencyMs, ipAddr, 80, 1); + } catch (Exception e) { + fail(e.toString()); + } + }); + } + + void log(int netId, int[] latencies) { + try { + for (int l : latencies) { + mNetdEventListenerService.onDnsEvent(netId, EVENT_TYPE, RETURN_CODE, l, null, null, + 0, 0); + } + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + void logDnsAsync(int netId, int[] latencies) { + new Thread() { + public void run() { + log(netId, latencies); + } + }.start(); + } + + void verifyLoggedDnsEvents(DnsEvent... expected) { + verifyLoggedDnsEvents(0, expected); + } + + void verifyLoggedDnsEvents(int wait, DnsEvent... expectedEvents) { + verify(mLog, timeout(wait).times(expectedEvents.length)).log(mDnsEvCaptor.capture()); + for (DnsEvent got : mDnsEvCaptor.getAllValues()) { + OptionalInt index = IntStream.range(0, expectedEvents.length) + .filter(i -> dnsEventsEqual(expectedEvents[i], got)) + .findFirst(); + // Don't match same expected event more than once. + index.ifPresent(i -> expectedEvents[i] = null); + assertTrue(index.isPresent()); + } + } + + /** equality function for DnsEvent to avoid overriding equals() and hashCode(). */ + static boolean dnsEventsEqual(DnsEvent expected, DnsEvent got) { + return (expected == got) || ((expected != null) && (got != null) + && (expected.netId == got.netId) + && Arrays.equals(expected.eventTypes, got.eventTypes) + && Arrays.equals(expected.returnCodes, got.returnCodes) + && Arrays.equals(expected.latenciesMs, got.latenciesMs)); + } + + static String joinLines(String ... elems) { + StringBuilder b = new StringBuilder(); + for (String s : elems) { + b.append(s).append("\n"); + } + return b.toString(); + } + + static void verifyConnectEvent(String expected, IpConnectivityEvent got) { + try { + Arrays.sort(got.connectStatistics.latenciesMs); + Arrays.sort(got.connectStatistics.errnosCounters, + Comparator.comparingInt((p) -> p.key)); + assertEquals(expected, got.toString()); + } catch (Exception e) { + fail(e.toString()); + } + } +} diff --git a/services/tests/servicestests/src/com/android/server/connectivity/NetworkNotificationManagerTest.java b/services/tests/servicestests/src/com/android/server/connectivity/NetworkNotificationManagerTest.java new file mode 100644 index 000000000000..21c2de79d68b --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/connectivity/NetworkNotificationManagerTest.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.connectivity; + +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.net.NetworkCapabilities; +import android.net.NetworkInfo; +import android.telephony.TelephonyManager; +import android.test.suitebuilder.annotation.SmallTest; +import com.android.server.connectivity.NetworkNotificationManager.NotificationType; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import junit.framework.TestCase; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import static com.android.server.connectivity.NetworkNotificationManager.NotificationType.*; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class NetworkNotificationManagerTest extends TestCase { + + static final NetworkCapabilities CELL_CAPABILITIES = new NetworkCapabilities(); + static final NetworkCapabilities WIFI_CAPABILITIES = new NetworkCapabilities(); + static { + CELL_CAPABILITIES.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); + CELL_CAPABILITIES.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + + WIFI_CAPABILITIES.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); + WIFI_CAPABILITIES.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + } + + @Mock Context mCtx; + @Mock Resources mResources; + @Mock PackageManager mPm; + @Mock TelephonyManager mTelephonyManager; + @Mock NotificationManager mNotificationManager; + @Mock NetworkAgentInfo mWifiNai; + @Mock NetworkAgentInfo mCellNai; + @Mock NetworkInfo mNetworkInfo; + ArgumentCaptor mCaptor; + + NetworkNotificationManager mManager; + + public void setUp() { + MockitoAnnotations.initMocks(this); + mCaptor = ArgumentCaptor.forClass(Notification.class); + mWifiNai.networkCapabilities = WIFI_CAPABILITIES; + mWifiNai.networkInfo = mNetworkInfo; + mCellNai.networkCapabilities = CELL_CAPABILITIES; + mCellNai.networkInfo = mNetworkInfo; + when(mCtx.getResources()).thenReturn(mResources); + when(mCtx.getPackageManager()).thenReturn(mPm); + when(mCtx.getApplicationInfo()).thenReturn(new ApplicationInfo()); + when(mNetworkInfo.getExtraInfo()).thenReturn("extra"); + when(mResources.getColor(anyInt(), any())).thenReturn(0xFF607D8B); + + mManager = new NetworkNotificationManager(mCtx, mTelephonyManager, mNotificationManager); + } + + @SmallTest + public void testNotificationsShownAndCleared() { + final int NETWORK_ID_BASE = 100; + List types = Arrays.asList(NotificationType.values()); + List ids = new ArrayList<>(types.size()); + for (int i = 0; i < ids.size(); i++) { + ids.add(NETWORK_ID_BASE + i); + } + Collections.shuffle(ids); + Collections.shuffle(types); + + for (int i = 0; i < ids.size(); i++) { + mManager.showNotification(ids.get(i), types.get(i), mWifiNai, mCellNai, null, false); + } + + Collections.shuffle(ids); + for (int i = 0; i < ids.size(); i++) { + mManager.clearNotification(ids.get(i)); + } + + for (int i = 0; i < ids.size(); i++) { + final int id = ids.get(i); + final int eventId = types.get(i).eventId; + final String tag = NetworkNotificationManager.tagFor(id); + verify(mNotificationManager, times(1)).notifyAsUser(eq(tag), eq(eventId), any(), any()); + verify(mNotificationManager, times(1)).cancelAsUser(eq(tag), eq(eventId), any()); + } + } + + @SmallTest + public void testNoInternetNotificationsNotShownForCellular() { + mManager.showNotification(100, NO_INTERNET, mCellNai, mWifiNai, null, false); + mManager.showNotification(101, LOST_INTERNET, mCellNai, mWifiNai, null, false); + + verify(mNotificationManager, never()).notifyAsUser(any(), anyInt(), any(), any()); + + mManager.showNotification(102, NO_INTERNET, mWifiNai, mCellNai, null, false); + + final int eventId = NO_INTERNET.eventId; + final String tag = NetworkNotificationManager.tagFor(102); + verify(mNotificationManager, times(1)).notifyAsUser(eq(tag), eq(eventId), any(), any()); + } + + @SmallTest + public void testNotificationsNotShownIfNoInternetCapability() { + mWifiNai.networkCapabilities = new NetworkCapabilities(); + mWifiNai.networkCapabilities .addTransportType(NetworkCapabilities.TRANSPORT_WIFI); + mManager.showNotification(102, NO_INTERNET, mWifiNai, mCellNai, null, false); + mManager.showNotification(103, LOST_INTERNET, mWifiNai, mCellNai, null, false); + mManager.showNotification(104, NETWORK_SWITCH, mWifiNai, mCellNai, null, false); + + verify(mNotificationManager, never()).notifyAsUser(any(), anyInt(), any(), any()); + } +} diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java index 0783afc0dfd4..956d83a2caf8 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java @@ -16,8 +16,15 @@ package com.android.server.devicepolicy; -import com.android.internal.widget.LockPatternUtils; +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; +import android.accounts.Account; +import android.accounts.AccountManager; import android.app.IActivityManager; import android.app.NotificationManager; import android.app.backup.IBackupManager; @@ -44,6 +51,8 @@ import android.test.mock.MockContext; import android.view.IWindowManager; +import com.android.internal.widget.LockPatternUtils; + import org.junit.Assert; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -52,13 +61,6 @@ import java.util.ArrayList; import java.util.List; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; - /** * Context used throughout DPMS tests. */ @@ -264,6 +266,7 @@ public boolean isEncryptable() { public final SettingsForMock settings; public final MockContentResolver contentResolver; public final TelephonyManager telephonyManager; + public final AccountManager accountManager; /** Note this is a partial mock, not a real mock. */ public final PackageManager packageManager; @@ -298,6 +301,7 @@ public DpmMockContext(Context context, File dataDir) { wifiManager = mock(WifiManager.class); settings = mock(SettingsForMock.class); telephonyManager = mock(TelephonyManager.class); + accountManager = mock(AccountManager.class); // Package manager is huge, so we use a partial mock instead. packageManager = spy(context.getPackageManager()); @@ -360,6 +364,7 @@ public int[] answer(InvocationOnMock invocation) throws Throwable { } } ); + when(accountManager.getAccountsAsUser(anyInt())).thenReturn(new Account[0]); // Create a data directory. @@ -418,6 +423,8 @@ public Object getSystemService(String name) { return powerManager; case Context.WIFI_SERVICE: return wifiManager; + case Context.ACCOUNT_SERVICE: + return accountManager; } throw new UnsupportedOperationException(); } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java new file mode 100644 index 000000000000..315d37cbd662 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/NetworkEventTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.server.devicepolicy; + +import android.app.admin.ConnectEvent; +import android.app.admin.DnsEvent; +import android.os.Parcel; +import android.test.suitebuilder.annotation.SmallTest; + +import static junit.framework.Assert.assertEquals; + +@SmallTest +public class NetworkEventTest extends DpmTestBase { + + /** + * Test parceling and unparceling of a ConnectEvent. + */ + public void testConnectEventParceling() { + ConnectEvent event = new ConnectEvent("127.0.0.1", 80, "com.android.whateverdude", 100000); + Parcel p = Parcel.obtain(); + p.writeParcelable(event, 0); + p.setDataPosition(0); + ConnectEvent unparceledEvent = p.readParcelable(NetworkEventTest.class.getClassLoader()); + p.recycle(); + assertEquals(event.getIpAddress(), unparceledEvent.getIpAddress()); + assertEquals(event.getPort(), unparceledEvent.getPort()); + assertEquals(event.getPackageName(), unparceledEvent.getPackageName()); + assertEquals(event.getTimestamp(), unparceledEvent.getTimestamp()); + } + + /** + * Test parceling and unparceling of a DnsEvent. + */ + public void testDnsEventParceling() { + DnsEvent event = new DnsEvent("d.android.com", new String[]{"192.168.0.1", "127.0.0.1"}, 2, + "com.android.whateverdude", 100000); + Parcel p = Parcel.obtain(); + p.writeParcelable(event, 0); + p.setDataPosition(0); + DnsEvent unparceledEvent = p.readParcelable(NetworkEventTest.class.getClassLoader()); + p.recycle(); + assertEquals(event.getHostname(), unparceledEvent.getHostname()); + assertEquals(event.getIpAddresses()[0], unparceledEvent.getIpAddresses()[0]); + assertEquals(event.getIpAddresses()[1], unparceledEvent.getIpAddresses()[1]); + assertEquals(event.getIpAddressesCount(), unparceledEvent.getIpAddressesCount()); + assertEquals(event.getPackageName(), unparceledEvent.getPackageName()); + assertEquals(event.getTimestamp(), unparceledEvent.getTimestamp()); + } +} diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index 3cfdc329a971..cd48f36ade52 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -4938,6 +4938,9 @@ protected void checkBackupAndRestore_publisherNotRestored() { assertEquals(0, mManager.getDynamicShortcuts().size()); assertEquals(0, mManager.getPinnedShortcuts().size()); }); + assertFalse(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, USER_0) + .getPackageInfo().isShadow()); + installPackage(USER_0, CALLING_PACKAGE_2); runWithCaller(CALLING_PACKAGE_2, USER_0, () -> { @@ -4946,6 +4949,8 @@ protected void checkBackupAndRestore_publisherNotRestored() { mManager.getPinnedShortcuts()), "s1", "s2", "s3"); }); + assertFalse(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, USER_0) + .getPackageInfo().isShadow()); installPackage(USER_0, LAUNCHER_1); runWithCaller(LAUNCHER_1, USER_0, () -> { @@ -5069,6 +5074,8 @@ protected void checkBackupAndRestore_launcherNotRestored() { mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0)) /* empty */); }); + assertFalse(mService.getLauncherShortcutForTest(LAUNCHER_1, USER_0) + .getPackageInfo().isShadow()); runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertEquals(0, mManager.getDynamicShortcuts().size()); @@ -5091,6 +5098,8 @@ protected void checkBackupAndRestore_launcherNotRestored() { mLauncherApps.getShortcuts(buildAllQuery(CALLING_PACKAGE_3), HANDLE_USER_0)) /* empty */); }); + assertFalse(mService.getLauncherShortcutForTest(LAUNCHER_2, USER_0) + .getPackageInfo().isShadow()); installPackage(USER_0, CALLING_PACKAGE_3); runWithCaller(CALLING_PACKAGE_3, USER_0, () -> { diff --git a/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java b/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java new file mode 100644 index 000000000000..29185e92d5ed --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/storage/AppCollectorTest.java @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.storage; + +import android.content.pm.UserInfo; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageStatsObserver; +import android.content.pm.PackageManager; +import android.content.pm.PackageStats; +import android.os.UserManager; +import android.os.storage.VolumeInfo; +import android.test.AndroidTestCase; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.when; + +@RunWith(JUnit4.class) +public class AppCollectorTest extends AndroidTestCase { + private static final long TIMEOUT = TimeUnit.MINUTES.toMillis(1); + @Mock private Context mContext; + @Mock private PackageManager mPm; + @Mock private UserManager mUm; + private List mApps; + private List mUsers; + + @Before + public void setUp() throws Exception { + super.setUp(); + MockitoAnnotations.initMocks(this); + mApps = new ArrayList<>(); + when(mContext.getPackageManager()).thenReturn(mPm); + when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUm); + + // Set up the app list. + when(mPm.getInstalledApplications(anyInt())).thenReturn(mApps); + + // Set up the user list with a single user (0). + mUsers = new ArrayList<>(); + mUsers.add(new UserInfo(0, "", 0)); + when(mUm.getUsers()).thenReturn(mUsers); + } + + @Test + public void testNoApps() throws Exception { + VolumeInfo volume = new VolumeInfo("testuuid", 0, null, null); + volume.fsUuid = "testuuid"; + AppCollector collector = new AppCollector(mContext, volume); + + assertThat(collector.getPackageStats(TIMEOUT)).isEmpty(); + } + + @Test + public void testAppOnExternalVolume() throws Exception { + addApplication("com.test.app", "differentuuid"); + VolumeInfo volume = new VolumeInfo("testuuid", 0, null, null); + volume.fsUuid = "testuuid"; + AppCollector collector = new AppCollector(mContext, volume); + + assertThat(collector.getPackageStats(TIMEOUT)).isEmpty(); + } + + @Test + public void testOneValidApp() throws Exception { + addApplication("com.test.app", "testuuid"); + VolumeInfo volume = new VolumeInfo("testuuid", 0, null, null); + volume.fsUuid = "testuuid"; + AppCollector collector = new AppCollector(mContext, volume); + PackageStats stats = new PackageStats("com.test.app"); + + // Set up this to handle the asynchronous call to the PackageManager. This returns the + // package info for the specified package. + doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) { + try { + ((IPackageStatsObserver.Stub) invocation.getArguments()[2]) + .onGetStatsCompleted(stats, true); + } catch (Exception e) { + // We fail instead of just letting the exception fly because throwing + // out of the callback like this on the background thread causes the test + // runner to crash, rather than reporting the failure. + fail(); + } + return null; + } + }).when(mPm).getPackageSizeInfoAsUser(eq("com.test.app"), eq(0), any()); + + + // Because getPackageStats is a blocking call, we block execution of the test until the + // call finishes. In order to finish the call, we need the above answer to execute. + List myStats = new ArrayList<>(); + CountDownLatch latch = new CountDownLatch(1); + new Thread(new Runnable() { + @Override + public void run() { + myStats.addAll(collector.getPackageStats(TIMEOUT)); + latch.countDown(); + } + }).start(); + latch.await(); + + assertThat(myStats).containsExactly(stats); + } + + @Test + public void testMultipleUsersOneApp() throws Exception { + addApplication("com.test.app", "testuuid"); + ApplicationInfo otherUsersApp = new ApplicationInfo(); + otherUsersApp.packageName = "com.test.app"; + otherUsersApp.volumeUuid = "testuuid"; + otherUsersApp.uid = 1; + mUsers.add(new UserInfo(1, "", 0)); + + VolumeInfo volume = new VolumeInfo("testuuid", 0, null, null); + volume.fsUuid = "testuuid"; + AppCollector collector = new AppCollector(mContext, volume); + PackageStats stats = new PackageStats("com.test.app"); + PackageStats otherStats = new PackageStats("com.test.app"); + otherStats.userHandle = 1; + + // Set up this to handle the asynchronous call to the PackageManager. This returns the + // package info for our packages. + doAnswer(new Answer() { + @Override + public Void answer(InvocationOnMock invocation) { + try { + ((IPackageStatsObserver.Stub) invocation.getArguments()[2]) + .onGetStatsCompleted(stats, true); + + // Now callback for the other uid. + ((IPackageStatsObserver.Stub) invocation.getArguments()[2]) + .onGetStatsCompleted(otherStats, true); + } catch (Exception e) { + // We fail instead of just letting the exception fly because throwing + // out of the callback like this on the background thread causes the test + // runner to crash, rather than reporting the failure. + fail(); + } + return null; + } + }).when(mPm).getPackageSizeInfoAsUser(eq("com.test.app"), eq(0), any()); + + + // Because getPackageStats is a blocking call, we block execution of the test until the + // call finishes. In order to finish the call, we need the above answer to execute. + List myStats = new ArrayList<>(); + CountDownLatch latch = new CountDownLatch(1); + new Thread(new Runnable() { + @Override + public void run() { + myStats.addAll(collector.getPackageStats(TIMEOUT)); + latch.countDown(); + } + }).start(); + latch.await(); + + assertThat(myStats).containsAllOf(stats, otherStats); + } + + @Test(expected=NullPointerException.class) + public void testNullVolumeShouldCauseNPE() throws Exception { + AppCollector collector = new AppCollector(mContext, null); + } + + private void addApplication(String packageName, String uuid) { + ApplicationInfo info = new ApplicationInfo(); + info.packageName = packageName; + info.volumeUuid = uuid; + mApps.add(info); + } + +} diff --git a/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java b/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java new file mode 100644 index 000000000000..2aca702b809c --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java @@ -0,0 +1,239 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.storage; + +import android.content.pm.PackageStats; +import android.test.AndroidTestCase; +import android.util.ArraySet; +import libcore.io.IoUtils; +import org.json.JSONArray; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.io.File; +import java.util.ArrayList; + +import static com.google.common.truth.Truth.assertThat; + +@RunWith(JUnit4.class) +public class DiskStatsFileLoggerTest extends AndroidTestCase { + @Rule public TemporaryFolder temporaryFolder; + public FileCollector.MeasurementResult mMainResult; + public FileCollector.MeasurementResult mDownloadsResult; + private ArrayList mPackages; + private File mOutputFile; + + @Before + public void setUp() throws Exception { + super.setUp(); + temporaryFolder = new TemporaryFolder(); + temporaryFolder.create(); + mOutputFile = temporaryFolder.newFile(); + mMainResult = new FileCollector.MeasurementResult(); + mDownloadsResult = new FileCollector.MeasurementResult(); + mPackages = new ArrayList<>(); + } + + @Test + public void testEmptyStorage() throws Exception { + DiskStatsFileLogger logger = new DiskStatsFileLogger( + mMainResult, mDownloadsResult,mPackages, 0L); + + logger.dumpToFile(mOutputFile); + + JSONObject output = getOutputFileAsJson(); + assertThat(output.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(0L); + assertThat(output.getLong(DiskStatsFileLogger.VIDEOS_KEY)).isEqualTo(0L); + assertThat(output.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(0L); + assertThat(output.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(0L); + assertThat(output.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(0L); + assertThat(output.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(0L); + assertThat(output.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(0L); + assertThat(output.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(0L); + assertThat( + output.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY).length()).isEqualTo(0L); + assertThat(output.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY).length()).isEqualTo(0L); + assertThat(output.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY).length()).isEqualTo(0L); + } + + @Test + public void testMeasurementResultsReported() throws Exception { + mMainResult.audioSize = 1; + mMainResult.imagesSize = 10; + mMainResult.miscSize = 100; + mDownloadsResult.miscSize = 1000; + DiskStatsFileLogger logger = new DiskStatsFileLogger( + mMainResult, mDownloadsResult,mPackages, 3L); + + logger.dumpToFile(mOutputFile); + + JSONObject output = getOutputFileAsJson(); + assertThat(output.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(1L); + assertThat(output.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(10L); + assertThat(output.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(100L); + assertThat(output.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(1000L); + assertThat(output.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(3L); + } + + @Test + public void testAppsReported() throws Exception { + PackageStats firstPackage = new PackageStats("com.test.app"); + firstPackage.codeSize = 100; + firstPackage.dataSize = 1000; + firstPackage.cacheSize = 20; + mPackages.add(firstPackage); + + PackageStats secondPackage = new PackageStats("com.test.app2"); + secondPackage.codeSize = 10; + secondPackage.dataSize = 1; + secondPackage.cacheSize = 2; + mPackages.add(secondPackage); + + DiskStatsFileLogger logger = new DiskStatsFileLogger( + mMainResult, mDownloadsResult, mPackages, 0L); + logger.dumpToFile(mOutputFile); + + JSONObject output = getOutputFileAsJson(); + assertThat(output.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(1111); + assertThat(output.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(22); + + JSONArray packageNames = output.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY); + assertThat(packageNames.length()).isEqualTo(2); + JSONArray appSizes = output.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY); + assertThat(appSizes.length()).isEqualTo(2); + JSONArray cacheSizes = output.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY); + assertThat(cacheSizes.length()).isEqualTo(2); + + // We need to do this crazy Set over this because the DiskStatsFileLogger provides no + // guarantee of the ordering of the apps in its output. By using a set, we avoid any order + // problems. + ArraySet apps = new ArraySet<>(); + for (int i = 0; i < packageNames.length(); i++) { + AppSizeGrouping app = new AppSizeGrouping(packageNames.getString(i), + appSizes.getLong(i), cacheSizes.getLong(i)); + apps.add(app); + } + assertThat(apps).containsAllOf(new AppSizeGrouping("com.test.app", 1100, 20), + new AppSizeGrouping("com.test.app2", 11, 2)); + } + + @Test + public void testEmulatedExternalStorageCounted() throws Exception { + PackageStats app = new PackageStats("com.test.app"); + app.dataSize = 1000; + app.externalDataSize = 1000; + app.cacheSize = 20; + mPackages.add(app); + + DiskStatsFileLogger logger = new DiskStatsFileLogger( + mMainResult, mDownloadsResult, mPackages, 0L); + logger.dumpToFile(mOutputFile); + + JSONObject output = getOutputFileAsJson(); + JSONArray appSizes = output.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY); + assertThat(appSizes.length()).isEqualTo(1); + assertThat(appSizes.getLong(0)).isEqualTo(2000); + } + + @Test + public void testDuplicatePackageNameIsMergedAcrossMultipleUsers() throws Exception { + PackageStats app = new PackageStats("com.test.app"); + app.dataSize = 1000; + app.externalDataSize = 1000; + app.cacheSize = 20; + app.userHandle = 0; + mPackages.add(app); + + PackageStats secondApp = new PackageStats("com.test.app"); + secondApp.dataSize = 100; + secondApp.externalDataSize = 100; + secondApp.cacheSize = 2; + secondApp.userHandle = 1; + mPackages.add(secondApp); + + DiskStatsFileLogger logger = new DiskStatsFileLogger( + mMainResult, mDownloadsResult, mPackages, 0L); + logger.dumpToFile(mOutputFile); + + JSONObject output = getOutputFileAsJson(); + assertThat(output.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(2200); + assertThat(output.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(22); + JSONArray packageNames = output.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY); + assertThat(packageNames.length()).isEqualTo(1); + assertThat(packageNames.getString(0)).isEqualTo("com.test.app"); + + JSONArray appSizes = output.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY); + assertThat(appSizes.length()).isEqualTo(1); + assertThat(appSizes.getLong(0)).isEqualTo(2200); + + JSONArray cacheSizes = output.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY); + assertThat(cacheSizes.length()).isEqualTo(1); + assertThat(cacheSizes.getLong(0)).isEqualTo(22); + } + + private JSONObject getOutputFileAsJson() throws Exception { + return new JSONObject(IoUtils.readFileAsString(mOutputFile.getAbsolutePath())); + } + + /** + * This class exists for putting zipped app size information arrays into a set for comparison + * purposes. + */ + private class AppSizeGrouping { + public String packageName; + public long appSize; + public long cacheSize; + + public AppSizeGrouping(String packageName, long appSize, long cacheSize) { + this.packageName = packageName; + this.appSize = appSize; + this.cacheSize = cacheSize; + } + + @Override + public int hashCode() { + int result = 17; + result = 37 * result + (int)(appSize ^ (appSize >>> 32)); + result = 37 * result + (int)(cacheSize ^ (cacheSize >>> 32)); + result = 37 * result + packageName.hashCode(); + return result; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof AppSizeGrouping)) { + return false; + } + if (this == o) { + return true; + } + AppSizeGrouping grouping = (AppSizeGrouping) o; + return packageName.equals(grouping.packageName) && appSize == grouping.appSize && + cacheSize == grouping.cacheSize; + } + + @Override + public String toString() { + return packageName + " " + appSize + " " + cacheSize; + } + } +} \ No newline at end of file diff --git a/services/tests/servicestests/src/com/android/server/storage/DiskStatsLoggingServiceTest.java b/services/tests/servicestests/src/com/android/server/storage/DiskStatsLoggingServiceTest.java new file mode 100644 index 000000000000..378908655cb0 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/storage/DiskStatsLoggingServiceTest.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.storage; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.job.JobService; +import android.app.job.JobParameters; +import android.content.pm.PackageStats; +import android.test.AndroidTestCase; + +import com.android.server.storage.DiskStatsLoggingService.LogRunnable; + +import libcore.io.IoUtils; + +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.io.File; +import java.io.PrintStream; +import java.util.ArrayList; + +@RunWith(JUnit4.class) +public class DiskStatsLoggingServiceTest extends AndroidTestCase { + @Rule public TemporaryFolder mTemporaryFolder; + @Rule public TemporaryFolder mDownloads; + @Rule public TemporaryFolder mRootDirectory; + @Mock private AppCollector mCollector; + private File mInputFile; + + + @Before + public void setUp() throws Exception { + super.setUp(); + MockitoAnnotations.initMocks(this); + mTemporaryFolder = new TemporaryFolder(); + mTemporaryFolder.create(); + mInputFile = mTemporaryFolder.newFile(); + mDownloads = new TemporaryFolder(); + mDownloads.create(); + mRootDirectory = new TemporaryFolder(); + mRootDirectory.create(); + } + + @Test + public void testEmptyLog() throws Exception { + LogRunnable task = new LogRunnable(); + task.setAppCollector(mCollector); + task.setDownloadsDirectory(mDownloads.getRoot()); + task.setRootDirectory(mRootDirectory.getRoot()); + task.setLogOutputFile(mInputFile); + task.setSystemSize(0L); + task.run(); + + JSONObject json = getJsonOutput(); + assertThat(json.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(0L); + assertThat(json.getLong(DiskStatsFileLogger.VIDEOS_KEY)).isEqualTo(0L); + assertThat(json.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(0L); + assertThat(json.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(0L); + assertThat(json.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(0L); + assertThat(json.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(0L); + assertThat(json.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(0L); + assertThat(json.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(0L); + assertThat( + json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY).length()).isEqualTo(0L); + assertThat(json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY).length()).isEqualTo(0L); + assertThat(json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY).length()).isEqualTo(0L); + } + + @Test + public void testPopulatedLogTask() throws Exception { + // Write data to directories. + writeDataToFile(mDownloads.newFile(), "lol"); + writeDataToFile(mRootDirectory.newFile("test.jpg"), "1234"); + writeDataToFile(mRootDirectory.newFile("test.mp4"), "12345"); + writeDataToFile(mRootDirectory.newFile("test.mp3"), "123456"); + writeDataToFile(mRootDirectory.newFile("test.whatever"), "1234567"); + + // Write apps. + ArrayList apps = new ArrayList<>(); + PackageStats testApp = new PackageStats("com.test.app"); + testApp.dataSize = 5L; + testApp.cacheSize = 55L; + testApp.codeSize = 10L; + apps.add(testApp); + when(mCollector.getPackageStats(anyInt())).thenReturn(apps); + + LogRunnable task = new LogRunnable(); + task.setAppCollector(mCollector); + task.setDownloadsDirectory(mDownloads.getRoot()); + task.setRootDirectory(mRootDirectory.getRoot()); + task.setLogOutputFile(mInputFile); + task.setSystemSize(10L); + task.run(); + + JSONObject json = getJsonOutput(); + assertThat(json.getLong(DiskStatsFileLogger.PHOTOS_KEY)).isEqualTo(4L); + assertThat(json.getLong(DiskStatsFileLogger.VIDEOS_KEY)).isEqualTo(5L); + assertThat(json.getLong(DiskStatsFileLogger.AUDIO_KEY)).isEqualTo(6L); + assertThat(json.getLong(DiskStatsFileLogger.DOWNLOADS_KEY)).isEqualTo(3L); + assertThat(json.getLong(DiskStatsFileLogger.SYSTEM_KEY)).isEqualTo(10L); + assertThat(json.getLong(DiskStatsFileLogger.MISC_KEY)).isEqualTo(7L); + assertThat(json.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(15L); + assertThat(json.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(55L); + assertThat( + json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY).length()).isEqualTo(1L); + assertThat(json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY).length()).isEqualTo(1L); + assertThat(json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY).length()).isEqualTo(1L); + } + + @Test + public void testDontCrashOnPackageStatsTimeout() throws Exception { + when(mCollector.getPackageStats(anyInt())).thenReturn(null); + + LogRunnable task = new LogRunnable(); + task.setAppCollector(mCollector); + task.setDownloadsDirectory(mDownloads.getRoot()); + task.setRootDirectory(mRootDirectory.getRoot()); + task.setLogOutputFile(mInputFile); + task.setSystemSize(10L); + task.run(); + + // No exception should be thrown. + } + + private void writeDataToFile(File f, String data) throws Exception{ + PrintStream out = new PrintStream(f); + out.print(data); + out.close(); + } + + private JSONObject getJsonOutput() throws Exception { + return new JSONObject(IoUtils.readFileAsString(mInputFile.getAbsolutePath())); + } +} diff --git a/services/tests/servicestests/src/com/android/server/storage/FileCollectorTest.java b/services/tests/servicestests/src/com/android/server/storage/FileCollectorTest.java new file mode 100644 index 000000000000..f1b3442f1cf7 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/storage/FileCollectorTest.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.storage; + +import android.test.AndroidTestCase; +import com.android.server.storage.FileCollector.MeasurementResult; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.io.File; +import java.io.PrintStream; + +import static com.google.common.truth.Truth.assertThat; + +@RunWith(JUnit4.class) +public class FileCollectorTest extends AndroidTestCase { + @Rule + public TemporaryFolder temporaryFolder; + + @Before + public void setUp() throws Exception { + temporaryFolder = new TemporaryFolder(); + temporaryFolder.create(); + } + + @Test + public void testEmpty() throws Exception { + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + assertThat(result.totalAccountedSize()).isEqualTo(0L); + } + + @Test + public void testImageFile() throws Exception { + writeDataToFile(temporaryFolder.newFile("test.jpg"), "1234"); + + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + + assertThat(result.imagesSize).isEqualTo(4); + } + + @Test + public void testVideoFile() throws Exception { + writeDataToFile(temporaryFolder.newFile("test.mp4"), "1234"); + + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + + assertThat(result.videosSize).isEqualTo(4); + } + + @Test + public void testAudioFile() throws Exception { + writeDataToFile(temporaryFolder.newFile("test.mp3"), "1234"); + + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + + assertThat(result.audioSize).isEqualTo(4); + } + + @Test + public void testMiscFile() throws Exception { + writeDataToFile(temporaryFolder.newFile("test"), "1234"); + + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + + assertThat(result.miscSize).isEqualTo(4); + } + + @Test + public void testNestedFile() throws Exception { + File directory = temporaryFolder.newFolder(); + writeDataToFile(new File(directory, "test"), "1234"); + + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + + assertThat(result.miscSize).isEqualTo(4); + } + + @Test + public void testMultipleFiles() throws Exception { + writeDataToFile(temporaryFolder.newFile("test"), "1234"); + writeDataToFile(temporaryFolder.newFile("test2"), "12345"); + + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + + assertThat(result.miscSize).isEqualTo(9); + } + + @Test + public void testTotalSize() throws Exception { + writeDataToFile(temporaryFolder.newFile("test.jpg"), "1"); + writeDataToFile(temporaryFolder.newFile("test.mp3"), "1"); + writeDataToFile(temporaryFolder.newFile("test.mp4"), "1"); + writeDataToFile(temporaryFolder.newFile("test"), "1"); + + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + + assertThat(result.totalAccountedSize()).isEqualTo(4); + } + + @Test + public void testFileEndsWithPeriod() throws Exception { + writeDataToFile(temporaryFolder.newFile("test."), "1"); + + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + + assertThat(result.miscSize).isEqualTo(1); + assertThat(result.totalAccountedSize()).isEqualTo(1); + } + + public void testIgnoreFileExtensionCase() throws Exception { + writeDataToFile(temporaryFolder.newFile("test.JpG"), "1234"); + + MeasurementResult result = FileCollector.getMeasurementResult(temporaryFolder.getRoot()); + + assertThat(result.imagesSize).isEqualTo(4); + } + + private void writeDataToFile(File f, String data) throws Exception{ + PrintStream out = new PrintStream(f); + out.print(data); + out.close(); + } +} diff --git a/services/tests/servicestests/src/com/android/server/twilight/TwilightServiceTest.java b/services/tests/servicestests/src/com/android/server/twilight/TwilightServiceTest.java new file mode 100644 index 000000000000..751e4b56be1e --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/twilight/TwilightServiceTest.java @@ -0,0 +1,71 @@ +package com.android.server.twilight; + +/* + * 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. + */ + +import android.app.AlarmManager; +import android.content.Context; +import android.location.Location; +import android.test.AndroidTestCase; + +public class TwilightServiceTest extends AndroidTestCase { + + private TwilightService mTwilightService; + private Location mInitialLocation; + + @Override + protected void setUp() throws Exception { + final Context context = getContext(); + mTwilightService = new TwilightService(context); + mTwilightService.mAlarmManager = + (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + mInitialLocation = createMockLocation(10.0, 10.0); + mTwilightService.onLocationChanged(mInitialLocation); + } + + @Override + protected void tearDown() throws Exception { + mTwilightService = null; + mInitialLocation = null; + } + + public void testValidLocation_updatedLocation() { + final TwilightState priorState = mTwilightService.mLastTwilightState; + final Location validLocation = createMockLocation(35.0, 35.0); + mTwilightService.onLocationChanged(validLocation); + assertEquals(mTwilightService.mLastLocation, validLocation); + assertNotSame(priorState, mTwilightService.mLastTwilightState); + } + + public void testInvalidLocation_ignoreLocationUpdate() { + final TwilightState priorState = mTwilightService.mLastTwilightState; + final Location invalidLocation = createMockLocation(0.0, 0.0); + mTwilightService.onLocationChanged(invalidLocation); + assertEquals(mTwilightService.mLastLocation, mInitialLocation); + assertEquals(priorState, mTwilightService.mLastTwilightState); + } + + private Location createMockLocation(double latitude, double longitude) { + // There's no empty constructor, so we initialize with a string and quickly reset it. + final Location location = new Location(""); + location.reset(); + location.setLatitude(latitude); + location.setLongitude(longitude); + return location; + } + +} diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 44ccb8e20031..fc8500dfa35c 100755 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -32,6 +32,7 @@ import android.hardware.usb.UsbManager; import android.hardware.usb.UsbPort; import android.hardware.usb.UsbPortStatus; +import android.os.BatteryManager; import android.os.FileUtils; import android.os.Handler; import android.os.Looper; @@ -109,9 +110,9 @@ public class UsbDeviceManager { private static final int MSG_SYSTEM_READY = 3; private static final int MSG_BOOT_COMPLETED = 4; private static final int MSG_USER_SWITCHED = 5; - private static final int MSG_SET_USB_DATA_UNLOCKED = 6; - private static final int MSG_UPDATE_USER_RESTRICTIONS = 7; - private static final int MSG_UPDATE_HOST_STATE = 8; + private static final int MSG_UPDATE_USER_RESTRICTIONS = 6; + private static final int MSG_UPDATE_HOST_STATE = 7; + private static final int MSG_UPDATE_CHARGING_STATE = 9; private static final int AUDIO_MODE_SOURCE = 1; @@ -192,6 +193,15 @@ public void onReceive(Context context, Intent intent) { } }; + private final BroadcastReceiver mChargingReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + boolean usbCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; + mHandler.sendMessage(MSG_UPDATE_CHARGING_STATE, usbCharging); + } + }; + public UsbDeviceManager(Context context, UsbAlsaManager alsaManager) { mContext = context; mUsbAlsaManager = alsaManager; @@ -216,6 +226,8 @@ public UsbDeviceManager(Context context, UsbAlsaManager alsaManager) { } mContext.registerReceiver(mHostReceiver, new IntentFilter(UsbManager.ACTION_USB_PORT_CHANGED)); + mContext.registerReceiver(mChargingReceiver, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); } private UsbSettingsManager getCurrentSettings() { @@ -288,7 +300,7 @@ private void startAccessoryMode() { if (functions != null) { mAccessoryModeRequestTime = SystemClock.elapsedRealtime(); - setCurrentFunctions(functions); + setCurrentFunctions(functions, false); } } @@ -330,6 +342,7 @@ private final class UsbHandler extends Handler { private int mUsbNotificationId; private boolean mAdbNotificationShown; private int mCurrentUser = UserHandle.USER_NULL; + private boolean mUsbCharging; public UsbHandler(Looper looper) { super(looper); @@ -337,14 +350,22 @@ public UsbHandler(Looper looper) { // Restore default functions. mCurrentFunctions = SystemProperties.get(USB_CONFIG_PROPERTY, UsbManager.USB_FUNCTION_NONE); - if (UsbManager.USB_FUNCTION_NONE.equals(mCurrentFunctions)) { - mCurrentFunctions = UsbManager.USB_FUNCTION_MTP; - } mCurrentFunctionsApplied = mCurrentFunctions.equals( SystemProperties.get(USB_STATE_PROPERTY)); mAdbEnabled = UsbManager.containsFunction(getDefaultFunctions(), UsbManager.USB_FUNCTION_ADB); - setEnabledFunctions(null, false); + + /** + * Remove MTP from persistent config, to bring usb to a good state + * after fixes to b/31814300. This block can be removed after the update + */ + String persisted = SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY); + if (UsbManager.containsFunction(persisted, UsbManager.USB_FUNCTION_MTP)) { + SystemProperties.set(USB_PERSISTENT_CONFIG_PROPERTY, + UsbManager.removeFunction(persisted, UsbManager.USB_FUNCTION_MTP)); + } + + setEnabledFunctions(null, false, false); String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim(); updateState(state); @@ -376,6 +397,14 @@ public void sendMessage(int what, Object arg) { sendMessage(m); } + public void sendMessage(int what, Object arg, boolean arg1) { + removeMessages(what); + Message m = Message.obtain(this, what); + m.obj = arg; + m.arg1 = (arg1 ? 1 : 0); + sendMessage(m); + } + public void updateState(String state) { int connected, configured; @@ -414,7 +443,10 @@ public void updateHostState(UsbPort port, UsbPortStatus status) { args.argi2 = sourcePower ? 1 :0; args.argi3 = sinkPower ? 1 :0; - obtainMessage(MSG_UPDATE_HOST_STATE, args).sendToTarget(); + removeMessages(MSG_UPDATE_HOST_STATE); + Message msg = obtainMessage(MSG_UPDATE_HOST_STATE, args); + // debounce rapid transitions of connect/disconnect on type-c ports + sendMessageDelayed(msg, UPDATE_DELAY); } private boolean waitForState(String state) { @@ -440,29 +472,24 @@ private boolean setUsbConfig(String config) { return waitForState(config); } - private void setUsbDataUnlocked(boolean enable) { - if (DEBUG) Slog.d(TAG, "setUsbDataUnlocked: " + enable); - mUsbDataUnlocked = enable; - updateUsbNotification(); - updateUsbStateBroadcastIfNeeded(); - setEnabledFunctions(mCurrentFunctions, true); - } - private void setAdbEnabled(boolean enable) { if (DEBUG) Slog.d(TAG, "setAdbEnabled: " + enable); if (enable != mAdbEnabled) { mAdbEnabled = enable; + String oldFunctions = mCurrentFunctions; + + // Persist the adb setting + String newFunction = applyAdbFunction(SystemProperties.get( + USB_PERSISTENT_CONFIG_PROPERTY, UsbManager.USB_FUNCTION_NONE)); + SystemProperties.set(USB_PERSISTENT_CONFIG_PROPERTY, newFunction); - // Due to the persist.sys.usb.config property trigger, changing adb state requires - // persisting default function - String oldFunctions = getDefaultFunctions(); - String newFunctions = applyAdbFunction(oldFunctions); - if (!oldFunctions.equals(newFunctions)) { - SystemProperties.set(USB_PERSISTENT_CONFIG_PROPERTY, newFunctions); + // Remove mtp from the config if file transfer is not enabled + if (oldFunctions.equals(UsbManager.USB_FUNCTION_MTP) && + !mUsbDataUnlocked && enable) { + oldFunctions = UsbManager.USB_FUNCTION_NONE; } - // After persisting them use the lock-down aware function set - setEnabledFunctions(mCurrentFunctions, false); + setEnabledFunctions(oldFunctions, true, mUsbDataUnlocked); updateAdbNotification(); } @@ -474,10 +501,17 @@ private void setAdbEnabled(boolean enable) { /** * Evaluates USB function policies and applies the change accordingly. */ - private void setEnabledFunctions(String functions, boolean forceRestart) { + private void setEnabledFunctions(String functions, boolean forceRestart, + boolean usbDataUnlocked) { if (DEBUG) Slog.d(TAG, "setEnabledFunctions functions=" + functions + ", " + "forceRestart=" + forceRestart); + if (usbDataUnlocked != mUsbDataUnlocked) { + mUsbDataUnlocked = usbDataUnlocked; + updateUsbNotification(); + forceRestart = true; + } + // Try to set the enabled functions. final String oldFunctions = mCurrentFunctions; final boolean oldFunctionsApplied = mCurrentFunctionsApplied; @@ -514,7 +548,8 @@ private void setEnabledFunctions(String functions, boolean forceRestart) { } private boolean trySetEnabledFunctions(String functions, boolean forceRestart) { - if (functions == null) { + if (functions == null || applyAdbFunction(functions) + .equals(UsbManager.USB_FUNCTION_NONE)) { functions = getDefaultFunctions(); } functions = applyAdbFunction(functions); @@ -581,7 +616,7 @@ private void updateCurrentAccessory() { // make sure accessory mode is off // and restore default functions Slog.d(TAG, "exited USB accessory mode"); - setEnabledFunctions(null, false); + setEnabledFunctions(null, false, false); if (mCurrentAccessory != null) { if (mBootCompleted) { @@ -598,10 +633,6 @@ private boolean isUsbStateChanged(Intent intent) { if (mBroadcastedIntent == null) { for (String key : keySet) { if (intent.getBooleanExtra(key, false)) { - // MTP function is enabled by default. - if (UsbManager.USB_FUNCTION_MTP.equals(key)) { - continue; - } return true; } } @@ -710,14 +741,12 @@ private void updateMidiFunction() { @Override public void handleMessage(Message msg) { + SomeArgs args; switch (msg.what) { case MSG_UPDATE_STATE: mConnected = (msg.arg1 == 1); mConfigured = (msg.arg2 == 1); - if (!mConnected) { - // When a disconnect occurs, relock access to sensitive user data - mUsbDataUnlocked = false; - } + updateUsbNotification(); updateAdbNotification(); if (UsbManager.containsFunction(mCurrentFunctions, @@ -725,7 +754,7 @@ public void handleMessage(Message msg) { updateCurrentAccessory(); } else if (!mConnected) { // restore defaults when USB is disconnected - setEnabledFunctions(null, false); + setEnabledFunctions(null, false, false); } if (mBootCompleted) { updateUsbStateBroadcastIfNeeded(); @@ -733,7 +762,7 @@ public void handleMessage(Message msg) { } break; case MSG_UPDATE_HOST_STATE: - SomeArgs args = (SomeArgs) msg.obj; + args = (SomeArgs) msg.obj; mHostConnected = (args.argi1 == 1); mSourcePower = (args.argi2 == 1); mSinkPower = (args.argi3 == 1); @@ -743,18 +772,19 @@ public void handleMessage(Message msg) { updateUsbStateBroadcastIfNeeded(); } break; + case MSG_UPDATE_CHARGING_STATE: + mUsbCharging = (msg.arg1 == 1); + updateUsbNotification(); + break; case MSG_ENABLE_ADB: setAdbEnabled(msg.arg1 == 1); break; case MSG_SET_CURRENT_FUNCTIONS: String functions = (String)msg.obj; - setEnabledFunctions(functions, false); + setEnabledFunctions(functions, false, msg.arg1 == 1); break; case MSG_UPDATE_USER_RESTRICTIONS: - setEnabledFunctions(mCurrentFunctions, false); - break; - case MSG_SET_USB_DATA_UNLOCKED: - setUsbDataUnlocked(msg.arg1 == 1); + setEnabledFunctions(mCurrentFunctions, false, mUsbDataUnlocked); break; case MSG_SYSTEM_READY: updateUsbNotification(); @@ -782,8 +812,7 @@ public void handleMessage(Message msg) { Slog.v(TAG, "Current user switched to " + mCurrentUser + "; resetting USB host stack for MTP or PTP"); // avoid leaking sensitive data from previous user - mUsbDataUnlocked = false; - setEnabledFunctions(mCurrentFunctions, true); + setEnabledFunctions(mCurrentFunctions, true, false); } mCurrentUser = msg.arg1; } @@ -827,7 +856,7 @@ private void updateUsbNotification() { } } else if (mSourcePower) { id = com.android.internal.R.string.usb_supplying_notification_title; - } else if (mHostConnected && mSinkPower) { + } else if (mHostConnected && mSinkPower && mUsbCharging) { id = com.android.internal.R.string.usb_charging_notification_title; } if (id != mUsbNotificationId) { @@ -931,6 +960,7 @@ public void dump(IndentingPrintWriter pw) { pw.println(" mHostConnected: " + mHostConnected); pw.println(" mSourcePower: " + mSourcePower); pw.println(" mSinkPower: " + mSinkPower); + pw.println(" mUsbCharging: " + mUsbCharging); try { pw.println(" Kernel state: " + FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim()); @@ -967,14 +997,10 @@ public boolean isFunctionEnabled(String function) { return UsbManager.containsFunction(SystemProperties.get(USB_CONFIG_PROPERTY), function); } - public void setCurrentFunctions(String functions) { - if (DEBUG) Slog.d(TAG, "setCurrentFunctions(" + functions + ")"); - mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions); - } - - public void setUsbDataUnlocked(boolean unlocked) { - if (DEBUG) Slog.d(TAG, "setUsbDataUnlocked(" + unlocked + ")"); - mHandler.sendMessage(MSG_SET_USB_DATA_UNLOCKED, unlocked); + public void setCurrentFunctions(String functions, boolean usbDataUnlocked) { + if (DEBUG) Slog.d(TAG, "setCurrentFunctions(" + functions + ", " + + usbDataUnlocked + ")"); + mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions, usbDataUnlocked); } private void readOemUsbOverrideConfig() { diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java index d6f6b82dc97a..fb92e70f66c1 100755 --- a/services/usb/java/com/android/server/usb/UsbService.java +++ b/services/usb/java/com/android/server/usb/UsbService.java @@ -287,7 +287,7 @@ public boolean isFunctionEnabled(String function) { } @Override - public void setCurrentFunction(String function) { + public void setCurrentFunction(String function, boolean usbDataUnlocked) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); if (!isSupportedCurrentFunction(function)) { @@ -297,7 +297,7 @@ public void setCurrentFunction(String function) { } if (mDeviceManager != null) { - mDeviceManager.setCurrentFunctions(function); + mDeviceManager.setCurrentFunctions(function, usbDataUnlocked); } else { throw new IllegalStateException("USB device mode not supported"); } @@ -320,12 +320,6 @@ private static boolean isSupportedCurrentFunction(String function) { return false; } - @Override - public void setUsbDataUnlocked(boolean unlocked) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); - mDeviceManager.setUsbDataUnlocked(unlocked); - } - @Override public void allowUsbDebugging(boolean alwaysAllow, String publicKey) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index 5cba9d65b2e5..8866ff8e841b 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -366,6 +366,7 @@ public static class Details { private final PhoneAccountHandle mAccountHandle; private final int mCallCapabilities; private final int mCallProperties; + private final int mSupportedAudioRoutes = CallAudioState.ROUTE_ALL; private final DisconnectCause mDisconnectCause; private final long mCreateTimeMillis; private final long mConnectTimeMillis; @@ -599,6 +600,15 @@ public int getCallProperties() { return mCallProperties; } + /** + * @return a bitmask of the audio routes available for the call. + * + * @hide + */ + public int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + /** * @return For a {@link #STATE_DISCONNECTED} {@code Call}, the disconnect cause expressed * by {@link android.telecom.DisconnectCause}. diff --git a/telecomm/java/android/telecom/CallAudioState.java b/telecomm/java/android/telecom/CallAudioState.java index 2b1672209a3d..f601d8b545ac 100644 --- a/telecomm/java/android/telecom/CallAudioState.java +++ b/telecomm/java/android/telecom/CallAudioState.java @@ -44,8 +44,12 @@ public final class CallAudioState implements Parcelable { */ public static final int ROUTE_WIRED_OR_EARPIECE = ROUTE_EARPIECE | ROUTE_WIRED_HEADSET; - /** Bit mask of all possible audio routes. */ - private static final int ROUTE_ALL = ROUTE_EARPIECE | ROUTE_BLUETOOTH | ROUTE_WIRED_HEADSET | + /** + * Bit mask of all possible audio routes. + * + * @hide + **/ + public static final int ROUTE_ALL = ROUTE_EARPIECE | ROUTE_BLUETOOTH | ROUTE_WIRED_HEADSET | ROUTE_SPEAKER; private final boolean isMuted; diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 23b2bb8ac784..b719f9dbd84a 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -820,6 +820,7 @@ public void onRingbackRequested(Connection c, boolean ringback) {} public void onDestroyed(Connection c) {} public void onConnectionCapabilitiesChanged(Connection c, int capabilities) {} public void onConnectionPropertiesChanged(Connection c, int properties) {} + public void onSupportedAudioRoutesChanged(Connection c, int supportedAudioRoutes) {} public void onVideoProviderChanged( Connection c, VideoProvider videoProvider) {} public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {} @@ -1526,6 +1527,7 @@ public void onDestroyed(Conference c) { private boolean mRingbackRequested = false; private int mConnectionCapabilities; private int mConnectionProperties; + private int mSupportedAudioRoutes = CallAudioState.ROUTE_ALL; private VideoProvider mVideoProvider; private boolean mAudioModeIsVoip; private long mConnectTimeMillis = Conference.CONNECT_TIME_NOT_SPECIFIED; @@ -1805,6 +1807,15 @@ public final int getConnectionProperties() { return mConnectionProperties; } + /** + * Returns the connection's supported audio routes. + * + * @hide + */ + public final int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + /** * Sets the value of the {@link #getAddress()} property. * @@ -2026,6 +2037,28 @@ public final void setConnectionProperties(int connectionProperties) { } } + /** + * Sets the supported audio routes. + * + * @param supportedAudioRoutes the supported audio routes as a bitmask. + * See {@link CallAudioState} + * @hide + */ + public final void setSupportedAudioRoutes(int supportedAudioRoutes) { + if ((supportedAudioRoutes + & (CallAudioState.ROUTE_EARPIECE | CallAudioState.ROUTE_SPEAKER)) == 0) { + throw new IllegalArgumentException( + "supported audio routes must include either speaker or earpiece"); + } + + if (mSupportedAudioRoutes != supportedAudioRoutes) { + mSupportedAudioRoutes = supportedAudioRoutes; + for (Listener l : mListeners) { + l.onSupportedAudioRoutesChanged(this, mSupportedAudioRoutes); + } + } + } + /** * Tears down the Connection object. */ diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index 4d3bbdf9ef67..15dafe7e9574 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -797,6 +797,7 @@ private void createConnection( connection.getState(), connection.getConnectionCapabilities(), connection.getConnectionProperties(), + connection.getSupportedAudioRoutes(), connection.getAddress(), connection.getAddressPresentation(), connection.getCallerDisplayName(), @@ -1207,6 +1208,7 @@ public final void addExistingConnection(PhoneAccountHandle phoneAccountHandle, connection.getState(), connection.getConnectionCapabilities(), connection.getConnectionProperties(), + connection.getSupportedAudioRoutes(), connection.getAddress(), connection.getAddressPresentation(), connection.getCallerDisplayName(), diff --git a/telecomm/java/android/telecom/DisconnectCause.java b/telecomm/java/android/telecom/DisconnectCause.java index 68602692f8d3..e6b567e388aa 100644 --- a/telecomm/java/android/telecom/DisconnectCause.java +++ b/telecomm/java/android/telecom/DisconnectCause.java @@ -75,6 +75,14 @@ public final class DisconnectCause implements Parcelable { */ public static final int CALL_PULLED = 12; + /** + * Reason code (returned via {@link #getReason()}) which indicates that a call could not be + * completed because the cellular radio is off or out of service, the device is connected to + * a wifi network, but the user has not enabled wifi calling. + * @hide + */ + public static final String REASON_WIFI_ON_BUT_WFC_OFF = "REASON_WIFI_ON_BUT_WFC_OFF"; + private int mDisconnectCode; private CharSequence mDisconnectLabel; private CharSequence mDisconnectDescription; diff --git a/telecomm/java/android/telecom/ParcelableCall.java b/telecomm/java/android/telecom/ParcelableCall.java index ecc7755280c9..ec3d45932ee5 100644 --- a/telecomm/java/android/telecom/ParcelableCall.java +++ b/telecomm/java/android/telecom/ParcelableCall.java @@ -40,6 +40,7 @@ public final class ParcelableCall implements Parcelable { private final int mCapabilities; private final int mProperties; private final long mCreateTimeMillis; + private final int mSupportedAudioRoutes; private final long mConnectTimeMillis; private final Uri mHandle; private final int mHandlePresentation; @@ -66,6 +67,7 @@ public ParcelableCall( int capabilities, int properties, long createTimeMillis, + int supportedAudioRoutes, long connectTimeMillis, Uri handle, int handlePresentation, @@ -89,6 +91,7 @@ public ParcelableCall( mCapabilities = capabilities; mProperties = properties; mCreateTimeMillis = createTimeMillis; + mSupportedAudioRoutes = supportedAudioRoutes; mConnectTimeMillis = connectTimeMillis; mHandle = handle; mHandlePresentation = handlePresentation; @@ -145,6 +148,11 @@ public long getCreateTimeMillis() { return mCreateTimeMillis; } + /** Bitmask of supported routes of the call */ + public int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + /** The time that the call switched to the active state. */ public long getConnectTimeMillis() { return mConnectTimeMillis; @@ -301,6 +309,7 @@ public ParcelableCall createFromParcel(Parcel source) { source.readList(conferenceableCallIds, classLoader); Bundle intentExtras = source.readBundle(classLoader); Bundle extras = source.readBundle(classLoader); + int supportedAudioRoutes = source.readInt(); return new ParcelableCall( id, state, @@ -309,6 +318,7 @@ public ParcelableCall createFromParcel(Parcel source) { capabilities, properties, createTimeMillis, + supportedAudioRoutes, connectTimeMillis, handle, handlePresentation, @@ -366,6 +376,7 @@ public void writeToParcel(Parcel destination, int flags) { destination.writeList(mConferenceableCallIds); destination.writeBundle(mIntentExtras); destination.writeBundle(mExtras); + destination.writeInt(mSupportedAudioRoutes); } @Override diff --git a/telecomm/java/android/telecom/ParcelableConnection.java b/telecomm/java/android/telecom/ParcelableConnection.java index 540f388384bb..e9dba686ff82 100644 --- a/telecomm/java/android/telecom/ParcelableConnection.java +++ b/telecomm/java/android/telecom/ParcelableConnection.java @@ -37,6 +37,7 @@ public final class ParcelableConnection implements Parcelable { private final int mState; private final int mConnectionCapabilities; private final int mConnectionProperties; + private final int mSupportedAudioRoutes; private final Uri mAddress; private final int mAddressPresentation; private final String mCallerDisplayName; @@ -57,6 +58,7 @@ public ParcelableConnection( int state, int capabilities, int properties, + int supportedAudioRoutes, Uri address, int addressPresentation, String callerDisplayName, @@ -74,6 +76,7 @@ public ParcelableConnection( mState = state; mConnectionCapabilities = capabilities; mConnectionProperties = properties; + mSupportedAudioRoutes = supportedAudioRoutes; mAddress = address; mAddressPresentation = addressPresentation; mCallerDisplayName = callerDisplayName; @@ -117,6 +120,10 @@ public int getConnectionProperties() { return mConnectionProperties; } + public int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + public Uri getHandle() { return mAddress; } @@ -210,12 +217,14 @@ public ParcelableConnection createFromParcel(Parcel source) { source.readStringList(conferenceableConnectionIds); Bundle extras = Bundle.setDefusable(source.readBundle(classLoader), true); int properties = source.readInt(); + int supportedAudioRoutes = source.readInt(); return new ParcelableConnection( phoneAccount, state, capabilities, properties, + supportedAudioRoutes, address, addressPresentation, callerDisplayName, @@ -264,5 +273,6 @@ public void writeToParcel(Parcel destination, int flags) { destination.writeStringList(mConferenceableConnectionIds); destination.writeBundle(mExtras); destination.writeInt(mConnectionProperties); + destination.writeInt(mSupportedAudioRoutes); } } diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index 473e39457f58..692dfb73b59b 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -17,15 +17,6 @@ package android.telecom; import android.annotation.SystemApi; -import android.content.ComponentName; -import android.content.Context; -import android.content.pm.PackageManager; -import android.content.res.Resources.NotFoundException; -import android.graphics.Bitmap; -import android.graphics.Color; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Bundle; @@ -37,7 +28,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.MissingResourceException; /** * Represents a distinct method to place or receive a phone call. Apps which can place calls and @@ -217,6 +207,7 @@ public final class PhoneAccount implements Parcelable { private final CharSequence mLabel; private final CharSequence mShortDescription; private final List mSupportedUriSchemes; + private final int mSupportedAudioRoutes; private final Icon mIcon; private final Bundle mExtras; private boolean mIsEnabled; @@ -226,10 +217,12 @@ public final class PhoneAccount implements Parcelable { * Helper class for creating a {@link PhoneAccount}. */ public static class Builder { + private PhoneAccountHandle mAccountHandle; private Uri mAddress; private Uri mSubscriptionAddress; private int mCapabilities; + private int mSupportedAudioRoutes = CallAudioState.ROUTE_ALL; private int mHighlightColor = NO_HIGHLIGHT_COLOR; private CharSequence mLabel; private CharSequence mShortDescription; @@ -266,6 +259,7 @@ public Builder(PhoneAccount phoneAccount) { mIsEnabled = phoneAccount.isEnabled(); mExtras = phoneAccount.getExtras(); mGroupId = phoneAccount.getGroupId(); + mSupportedAudioRoutes = phoneAccount.getSupportedAudioRoutes(); } /** @@ -410,6 +404,18 @@ public Builder setGroupId(String groupId) { return this; } + /** + * Sets the audio routes supported by this {@link PhoneAccount}. + * + * @param routes bit mask of available routes. + * @return The builder. + * @hide + */ + public Builder setSupportedAudioRoutes(int routes) { + mSupportedAudioRoutes = routes; + return this; + } + /** * Creates an instance of a {@link PhoneAccount} based on the current builder settings. * @@ -432,6 +438,7 @@ public PhoneAccount build() { mShortDescription, mSupportedUriSchemes, mExtras, + mSupportedAudioRoutes, mIsEnabled, mGroupId); } @@ -448,6 +455,7 @@ private PhoneAccount( CharSequence shortDescription, List supportedUriSchemes, Bundle extras, + int supportedAudioRoutes, boolean isEnabled, String groupId) { mAccountHandle = account; @@ -460,6 +468,7 @@ private PhoneAccount( mShortDescription = shortDescription; mSupportedUriSchemes = Collections.unmodifiableList(supportedUriSchemes); mExtras = extras; + mSupportedAudioRoutes = supportedAudioRoutes; mIsEnabled = isEnabled; mGroupId = groupId; } @@ -532,6 +541,17 @@ public boolean hasCapabilities(int capability) { return (mCapabilities & capability) == capability; } + /** + * Determines if this {@code PhoneAccount} has routes specified by the passed in bit mask. + * + * @param route The routes to check. + * @return {@code true} if the phone account has the routes. + * @hide + */ + public boolean hasAudioRoutes(int routes) { + return (mSupportedAudioRoutes & routes) == routes; + } + /** * A short label describing a {@code PhoneAccount}. * @@ -571,6 +591,15 @@ public Bundle getExtras() { return mExtras; } + /** + * The audio routes supported by this {@code PhoneAccount}. + * + * @hide + */ + public int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + /** * The icon to represent this {@code PhoneAccount}. * @@ -687,6 +716,7 @@ public void writeToParcel(Parcel out, int flags) { out.writeByte((byte) (mIsEnabled ? 1 : 0)); out.writeBundle(mExtras); out.writeString(mGroupId); + out.writeInt(mSupportedAudioRoutes); } public static final Creator CREATOR @@ -731,6 +761,7 @@ private PhoneAccount(Parcel in) { mIsEnabled = in.readByte() == 1; mExtras = in.readBundle(); mGroupId = in.readString(); + mSupportedAudioRoutes = in.readInt(); } @Override @@ -740,7 +771,9 @@ public String toString() { .append("] PhoneAccount: ") .append(mAccountHandle) .append(" Capabilities: ") - .append(capabilitiesToString(mCapabilities)) + .append(capabilitiesToString()) + .append(" Audio Routes: ") + .append(audioRoutesToString()) .append(" Schemes: "); for (String scheme : mSupportedUriSchemes) { sb.append(scheme) @@ -760,7 +793,7 @@ public String toString() { * @param capabilities The capabilities bitmask. * @return String representation of the capabilities bitmask. */ - private String capabilitiesToString(int capabilities) { + private String capabilitiesToString() { StringBuilder sb = new StringBuilder(); if (hasCapabilities(CAPABILITY_VIDEO_CALLING)) { sb.append("Video "); @@ -794,4 +827,23 @@ private String capabilitiesToString(int capabilities) { } return sb.toString(); } + + private String audioRoutesToString() { + StringBuilder sb = new StringBuilder(); + + if (hasAudioRoutes(CallAudioState.ROUTE_BLUETOOTH)) { + sb.append("B"); + } + if (hasAudioRoutes(CallAudioState.ROUTE_EARPIECE)) { + sb.append("E"); + } + if (hasAudioRoutes(CallAudioState.ROUTE_SPEAKER)) { + sb.append("S"); + } + if (hasAudioRoutes(CallAudioState.ROUTE_WIRED_HEADSET)) { + sb.append("W"); + } + + return sb.toString(); + } } diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index c91ac569c3b1..c06fb3aeb860 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -331,6 +331,15 @@ public class TelecomManager { */ public static final String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER"; + /** + * The number of milliseconds that Telecom should wait after disconnecting a call via the + * ACTION_NEW_OUTGOING_CALL broadcast, in order to wait for the app which cancelled the call + * to make a new one. + * @hide + */ + public static final String EXTRA_NEW_OUTGOING_CALL_CANCEL_TIMEOUT = + "android.telecom.extra.NEW_OUTGOING_CALL_CANCEL_TIMEOUT"; + /** * A boolean meta-data value indicating whether an {@link InCallService} implements an * in-call user interface. Dialer implementations (see {@link #getDefaultDialerPackage()}) which diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index dda9cf30dc7e..e47663acd02b 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -65,6 +65,16 @@ public CarrierConfigManager() { public static final String KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL = "ignore_sim_network_locked_events_bool"; + /** + * When checking if a given number is the voicemail number, if this flag is true + * then in addition to comparing the given number to the voicemail number, we also compare it + * to the mdn. If this flag is false, the given number is only compared to the voicemail number. + * By default this value is false. + * @hide + */ + public static final String KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL = + "mdn_is_additional_voicemail_number_bool"; + /** * Flag indicating whether the Phone app should provide a "Dismiss" button on the SIM network * unlock screen. The default value is true. If set to false, there will be *no way* to dismiss @@ -268,6 +278,14 @@ public CarrierConfigManager() { public static final String KEY_SUPPORT_DOWNGRADE_VT_TO_AUDIO_BOOL = "support_downgrade_vt_to_audio_bool"; + /** + * Flag indicating whether we should downgrade/terminate VT calls and disable VT when + * data enabled changed (e.g. reach data limit or turn off data). + * @hide + */ + public static final String KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS = + "ignore_data_enabled_changed_for_video_calls"; + /** * Flag specifying whether WFC over IMS should be available for carrier: independent of * carrier provisioning. If false: hard disabled. If true: then depends on carrier @@ -333,6 +351,21 @@ public CarrierConfigManager() { public static final String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL = "carrier_volte_provisioning_required_bool"; + /** + * Flag specifying if WFC provisioning depends on VoLTE provisioning. + * + * {@code false}: default value; honor actual WFC provisioning state. + * {@code true}: when VoLTE is not provisioned, treat WFC as not provisioned; when VoLTE is + * provisioned, honor actual WFC provisioning state. + * + * As of now, Verizon is the only carrier enforcing this dependency in their + * WFC awareness and activation requirements. + * + * @hide + * */ + public static final String KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL + = "carrier_volte_override_wfc_provisioning_bool"; + /** Flag specifying whether VoLTE TTY is supported. */ public static final String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL = "carrier_volte_tty_supported_bool"; @@ -442,6 +475,13 @@ public CarrierConfigManager() { public static final String KEY_DISABLE_SEVERE_WHEN_EXTREME_DISABLED_BOOL = "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 @@ -573,6 +613,15 @@ public CarrierConfigManager() { */ public static final String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool"; + /** + * Determines whether High Definition audio property is displayed in the dialer UI. + * If {@code false}, remove the HD audio property from the connection so that HD audio related + * UI is not displayed. If {@code true}, keep HD audio property as it is configured. + * @hide + */ + public static final String KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL = + "display_hd_audio_property_bool"; + /** * Determines whether video conference calls are supported by a carrier. When {@code true}, * video calls can be merged into conference calls, {@code false} otherwiwse. @@ -1013,6 +1062,52 @@ public CarrierConfigManager() { public static final String KEY_EDITABLE_WFC_ROAMING_MODE_BOOL = "editable_wfc_roaming_mode_bool"; + /** + * Carrier specified WiFi networks. + * @hide + */ + public static final String KEY_CARRIER_WIFI_STRING_ARRAY = "carrier_wifi_string_array"; + + /** + * Time delay (in ms) after which we show the notification to switch the preferred network. + * @hide + */ + public static final String KEY_PREF_NETWORK_NOTIFICATION_DELAY_INT = + "network_notification_delay_int"; + + /** + * Determine whether user edited tether APN (type dun) has effect + * {@code false} - Default. APN with dun type in telephony database has no effect. + * + * {@code true} - DUN APN added/edited in ApnEditor will be used for tethering data call. + * + * @hide + */ + public static final String KEY_EDITABLE_TETHER_APN_BOOL = + "editable_tether_apn_bool"; + + /** + * Indicates whether the carrier supports 3gpp call forwarding MMI codes while roaming. If + * false, the user will be notified that call forwarding is not available when the MMI code + * fails. + * @hide + */ + public static final String KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL = + "support_3gpp_call_forwarding_while_roaming_bool"; + + /** + * An array containing custom call forwarding number prefixes that will be blocked while the + * device is reporting that it is roaming. By default, there are no custom call + * forwarding prefixes and none of these numbers will be filtered. If one or more entries are + * present, the system will not complete the call and display an error message. + * + * To display a message to the user when call forwarding fails for 3gpp MMI codes while roaming, + * use the {@link #KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL} option instead. + * @hide + */ + public static final String KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY = + "call_forwarding_blocks_while_roaming_string_array"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -1029,6 +1124,7 @@ public CarrierConfigManager() { sDefaults.putBoolean(KEY_CARRIER_VT_AVAILABLE_BOOL, false); sDefaults.putBoolean(KEY_NOTIFY_HANDOVER_VIDEO_FROM_WIFI_TO_LTE_BOOL, false); sDefaults.putBoolean(KEY_SUPPORT_DOWNGRADE_VT_TO_AUDIO_BOOL, true); + sDefaults.putBoolean(KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS, false); sDefaults.putBoolean(KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL, false); @@ -1038,6 +1134,7 @@ public CarrierConfigManager() { sDefaults.putInt(KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT, 2); sDefaults.putBoolean(KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, false); + sDefaults.putBoolean(KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL, false); sDefaults.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, true); sDefaults.putBoolean(KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL, true); sDefaults.putBoolean(KEY_CARRIER_IMS_GBA_REQUIRED_BOOL, false); @@ -1054,6 +1151,7 @@ public CarrierConfigManager() { sDefaults.putBoolean(KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL, false); sDefaults.putBoolean(KEY_HIDE_SIM_LOCK_SETTINGS_BOOL, false); sDefaults.putBoolean(KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL, false); + sDefaults.putBoolean(KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL, false); sDefaults.putBoolean(KEY_OPERATOR_SELECTION_EXPAND_BOOL, true); sDefaults.putBoolean(KEY_PREFER_2G_BOOL, true); sDefaults.putBoolean(KEY_SHOW_APN_SETTING_CDMA_BOOL, true); @@ -1088,6 +1186,7 @@ public 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", @@ -1114,6 +1213,7 @@ public CarrierConfigManager() { sDefaults.putInt(KEY_CDMA_DTMF_TONE_DELAY_INT, 100); sDefaults.putBoolean(KEY_SUPPORT_CONFERENCE_CALL_BOOL, true); sDefaults.putBoolean(KEY_SUPPORT_VIDEO_CONFERENCE_CALL_BOOL, false); + sDefaults.putBoolean(KEY_DISPLAY_HD_AUDIO_PROPERTY_BOOL, true); sDefaults.putBoolean(KEY_EDITABLE_ENHANCED_4G_LTE_BOOL, true); sDefaults.putBoolean(KEY_HIDE_IMS_APN_BOOL, false); sDefaults.putBoolean(KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL, false); @@ -1193,6 +1293,11 @@ public CarrierConfigManager() { sDefaults.putStringArray(FILTERED_CNAP_NAMES_STRING_ARRAY, null); sDefaults.putBoolean(KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, false); sDefaults.putBoolean(KEY_STK_DISABLE_LAUNCH_BROWSER_BOOL, false); + sDefaults.putStringArray(KEY_CARRIER_WIFI_STRING_ARRAY, null); + sDefaults.putInt(KEY_PREF_NETWORK_NOTIFICATION_DELAY_INT, -1); + sDefaults.putBoolean(KEY_EDITABLE_TETHER_APN_BOOL, false); + sDefaults.putBoolean(KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL, true); + sDefaults.putStringArray(KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY, null); } /** @@ -1245,12 +1350,12 @@ public PersistableBundle getConfig() { * moment. *

    *

    Requires that the calling app has carrier privileges. - * @see #hasCarrierPrivileges *

    * This method returns before the reload has completed, and * {@link android.service.carrier.CarrierService#onLoadConfig} will be called from an * arbitrary thread. *

    + * @see #hasCarrierPrivileges */ public void notifyConfigChangedForSubId(int subId) { try { diff --git a/telephony/java/android/telephony/DisconnectCause.java b/telephony/java/android/telephony/DisconnectCause.java index 03342548e7df..88fd84815965 100644 --- a/telephony/java/android/telephony/DisconnectCause.java +++ b/telephony/java/android/telephony/DisconnectCause.java @@ -233,6 +233,13 @@ public class DisconnectCause { */ public static final int DIALED_ON_WRONG_SLOT = 56; + /** + * The call being placed was detected as a call forwarding number and was being dialed while + * roaming on a carrier that does not allow this. + * @hide + */ + public static final int DIALED_CALL_FORWARDING_WHILE_ROAMING = 57; + //********************************************************************************************* // When adding a disconnect type: // 1) Please assign the new type the next id value below. @@ -241,14 +248,14 @@ public class DisconnectCause { // 4) Update toString() with the newly added disconnect type. // 5) Update android.telecom.DisconnectCauseUtil with any mappings to a telecom.DisconnectCause. // - // NextId: 57 + // NextId: 58 //********************************************************************************************* /** Smallest valid value for call disconnect codes. */ public static final int MINIMUM_VALID_VALUE = NOT_DISCONNECTED; /** Largest valid value for call disconnect codes. */ - public static final int MAXIMUM_VALID_VALUE = DIALED_ON_WRONG_SLOT; + public static final int MAXIMUM_VALID_VALUE = DIALED_CALL_FORWARDING_WHILE_ROAMING; /** Private constructor to avoid class instantiation. */ private DisconnectCause() { @@ -370,6 +377,8 @@ public static String toString(int cause) { return "DATA_LIMIT_REACHED"; case DIALED_ON_WRONG_SLOT: return "DIALED_ON_WRONG_SLOT"; + case DIALED_CALL_FORWARDING_WHILE_ROAMING: + return "DIALED_CALL_FORWARDING_WHILE_ROAMING"; default: return "INVALID: " + cause; } diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index 9463c8db7bd2..904e97cf2370 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -30,6 +30,7 @@ import android.location.CountryDetector; import android.net.Uri; import android.os.SystemProperties; +import android.os.PersistableBundle; import android.provider.Contacts; import android.provider.ContactsContract; import android.telecom.PhoneAccount; @@ -2127,7 +2128,7 @@ public static boolean isVoiceMailNumber(int subId, String number) { * number provided by the RIL and SIM card. The caller must have * the READ_PHONE_STATE credential. * - * @param context a non-null {@link Context}. + * @param context {@link Context}. * @param subId the subscription id of the SIM. * @param number the number to look up. * @return true if the number is in the list of voicemail. False @@ -2136,25 +2137,54 @@ public static boolean isVoiceMailNumber(int subId, String number) { * @hide */ public static boolean isVoiceMailNumber(Context context, int subId, String number) { - String vmNumber; + String vmNumber, mdn; try { final TelephonyManager tm; if (context == null) { tm = TelephonyManager.getDefault(); + if (DBG) log("isVoiceMailNumber: default tm"); } else { tm = TelephonyManager.from(context); + if (DBG) log("isVoiceMailNumber: tm from context"); } vmNumber = tm.getVoiceMailNumber(subId); + mdn = tm.getLine1Number(subId); + if (DBG) log("isVoiceMailNumber: mdn=" + mdn + ", vmNumber=" + vmNumber + + ", number=" + number); } catch (SecurityException ex) { + if (DBG) log("isVoiceMailNumber: SecurityExcpetion caught"); return false; } // Strip the separators from the number before comparing it // to the list. number = extractNetworkPortionAlt(number); + if (TextUtils.isEmpty(number)) { + if (DBG) log("isVoiceMailNumber: number is empty after stripping"); + return false; + } - // compare tolerates null so we need to make sure that we - // don't return true when both are null. - return !TextUtils.isEmpty(number) && compare(number, vmNumber); + // check if the carrier considers MDN to be an additional voicemail number + boolean compareWithMdn = false; + if (context != null) { + CarrierConfigManager configManager = (CarrierConfigManager) + context.getSystemService(Context.CARRIER_CONFIG_SERVICE); + if (configManager != null) { + PersistableBundle b = configManager.getConfigForSubId(subId); + if (b != null) { + compareWithMdn = b.getBoolean(CarrierConfigManager. + KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL); + if (DBG) log("isVoiceMailNumber: compareWithMdn=" + compareWithMdn); + } + } + } + + if (compareWithMdn) { + if (DBG) log("isVoiceMailNumber: treating mdn as additional vm number"); + return compare(number, vmNumber) || compare(number, mdn); + } else { + if (DBG) log("isVoiceMailNumber: returning regular compare"); + return compare(number, vmNumber); + } } /** diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 8ddf35d7a463..fc5650a21f31 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -363,13 +363,13 @@ public boolean isMultiSimEnabled() { * The lookup key used with the {@link #ACTION_PHONE_STATE_CHANGED} broadcast * for a String containing the new call state. * - * @see #EXTRA_STATE_IDLE - * @see #EXTRA_STATE_RINGING - * @see #EXTRA_STATE_OFFHOOK - * *

    * Retrieve with * {@link android.content.Intent#getStringExtra(String)}. + * + * @see #EXTRA_STATE_IDLE + * @see #EXTRA_STATE_RINGING + * @see #EXTRA_STATE_OFFHOOK */ public static final String EXTRA_STATE = PhoneConstants.STATE_KEY; @@ -1053,12 +1053,12 @@ public void disableLocationUpdates(int subId) { /** * Returns the neighboring cell information of the device. * - * @return List of NeighboringCellInfo or null if info unavailable. - * *

    Requires Permission: - * (@link android.Manifest.permission#ACCESS_COARSE_UPDATES} + * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} * - * @deprecated Use (@link getAllCellInfo} which returns a superset of the information + * @return List of NeighboringCellInfo or null if info unavailable. + * + * @deprecated Use {@link #getAllCellInfo} which returns a superset of the information * from NeighboringCellInfo. */ @Deprecated @@ -1586,6 +1586,11 @@ public int getNetworkType(int subId) { /** * Returns a constant indicating the radio technology (network type) * currently in use on the device for data transmission. + * + *

    + * Requires Permission: + * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * * @return the network type * * @see #NETWORK_TYPE_UNKNOWN @@ -1604,10 +1609,6 @@ public int getNetworkType(int subId) { * @see #NETWORK_TYPE_LTE * @see #NETWORK_TYPE_EHRPD * @see #NETWORK_TYPE_HSPAP - * - *

    - * Requires Permission: - * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} */ public int getDataNetworkType() { return getDataNetworkType(getDefaultDataSubscriptionId()); diff --git a/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl b/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl index 04cb1f278792..98f8e0a207c2 100644 --- a/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl +++ b/telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl @@ -107,4 +107,14 @@ interface IImsRegistrationListener { * Notifies the application when the list of URIs associated with IMS client is updated. */ void registrationAssociatedUriChanged(in Uri[] uris); + + /** + * Notifies the application when IMS registration attempt on a target + * access tech fails. + * + * @param targetAccessTech Radio access technology on which the IMS registration was + * attempted. + * @param imsReasonInfo Reason for the failure. + */ + void registrationChangeFailed(in int targetAccessTech, in ImsReasonInfo imsReasonInfo); } diff --git a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java index d4104bd34db3..20c303e9550b 100644 --- a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java +++ b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java @@ -438,7 +438,7 @@ public static CallerInfoAsyncQuery startQuery(int token, Context context, String // check to see if these are recognized numbers, and use shortcuts if we can. if (PhoneNumberUtils.isLocalEmergencyNumber(context, number)) { cw.event = EVENT_EMERGENCY_NUMBER; - } else if (PhoneNumberUtils.isVoiceMailNumber(subId, number)) { + } else if (PhoneNumberUtils.isVoiceMailNumber(context, subId, number)) { cw.event = EVENT_VOICEMAIL_NUMBER; } else { cw.event = EVENT_NEW_QUERY; diff --git a/test-runner/src/android/test/mock/MockPackageManager.java b/test-runner/src/android/test/mock/MockPackageManager.java index 330dbab5bab3..e3dabc83d6fe 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -140,6 +140,12 @@ public List queryPermissionsByGroup(String group, int flags) throw new UnsupportedOperationException(); } + /** @hide */ + @Override + public boolean isPermissionReviewModeEnabled() { + return false; + } + @Override public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) throws NameNotFoundException { diff --git a/tests/TouchLatency/.gitignore b/tests/TouchLatency/.gitignore new file mode 100644 index 000000000000..cfb71643044b --- /dev/null +++ b/tests/TouchLatency/.gitignore @@ -0,0 +1,5 @@ +.gradle +/local.properties +/.idea +.DS_Store +/build diff --git a/tests/TouchLatency/Android.mk b/tests/TouchLatency/Android.mk new file mode 100644 index 000000000000..73b5b6c2e7b8 --- /dev/null +++ b/tests/TouchLatency/Android.mk @@ -0,0 +1,27 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml + +# omit gradle 'build' dir +LOCAL_SRC_FILES := $(call all-java-files-under,app/src/main/java) + +# use appcompat/support lib from the tree, so improvements/ +# regressions are reflected in test data +LOCAL_RESOURCE_DIR := \ + $(LOCAL_PATH)/app/src/main/res \ + frameworks/support/v7/appcompat/res + +LOCAL_AAPT_FLAGS := \ + --auto-add-overlay \ + --extra-packages android.support.v7.appcompat + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android-support-v4 \ + android-support-v7-appcompat + +LOCAL_PACKAGE_NAME := TouchLatency + +include $(BUILD_PACKAGE) diff --git a/tests/TouchLatency/TouchLatency.iml b/tests/TouchLatency/TouchLatency.iml new file mode 100644 index 000000000000..cd87cea19f1d --- /dev/null +++ b/tests/TouchLatency/TouchLatency.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/TouchLatency/app/.gitignore b/tests/TouchLatency/app/.gitignore new file mode 100644 index 000000000000..796b96d1c402 --- /dev/null +++ b/tests/TouchLatency/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/tests/TouchLatency/app/app.iml b/tests/TouchLatency/app/app.iml new file mode 100644 index 000000000000..689e5e0024da --- /dev/null +++ b/tests/TouchLatency/app/app.iml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/TouchLatency/app/build.gradle b/tests/TouchLatency/app/build.gradle new file mode 100644 index 000000000000..7133beb8efee --- /dev/null +++ b/tests/TouchLatency/app/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 21 + buildToolsVersion "21.1.2" + + defaultConfig { + applicationId "com.prefabulated.touchlatency" + minSdkVersion 21 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:appcompat-v7:21.0.3' +} diff --git a/tests/TouchLatency/app/proguard-rules.pro b/tests/TouchLatency/app/proguard-rules.pro new file mode 100644 index 000000000000..de32a749cc70 --- /dev/null +++ b/tests/TouchLatency/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/google/home/stoza/android-sdk-linux/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/tests/TouchLatency/app/src/androidTest/java/com/prefabulated/touchlatency/ApplicationTest.java b/tests/TouchLatency/app/src/androidTest/java/com/prefabulated/touchlatency/ApplicationTest.java new file mode 100644 index 000000000000..717e3974919d --- /dev/null +++ b/tests/TouchLatency/app/src/androidTest/java/com/prefabulated/touchlatency/ApplicationTest.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.prefabulated.touchlatency; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} diff --git a/core/res/res/drawable/watch_switch_thumb_material.xml b/tests/TouchLatency/app/src/main/AndroidManifest.xml similarity index 50% rename from core/res/res/drawable/watch_switch_thumb_material.xml rename to tests/TouchLatency/app/src/main/AndroidManifest.xml index 3463a4f54684..e4aa4dc6c3f0 100644 --- a/core/res/res/drawable/watch_switch_thumb_material.xml +++ b/tests/TouchLatency/app/src/main/AndroidManifest.xml @@ -1,9 +1,12 @@ - - - - - + + + + + + + + + + + + + diff --git a/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java new file mode 100644 index 000000000000..7c139742f54d --- /dev/null +++ b/tests/TouchLatency/app/src/main/java/com/prefabulated/touchlatency/TouchLatencyActivity.java @@ -0,0 +1,210 @@ +/* + * 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.prefabulated.touchlatency; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.os.CountDownTimer; +import android.support.v7.app.ActionBarActivity; +import android.os.Bundle; +import android.text.method.Touch; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; + +import java.util.ArrayList; +import java.util.Collections; + +class TouchLatencyView extends View implements View.OnTouchListener { + private static final String LOG_TAG = "TouchLatency"; + private static final int BACKGROUND_COLOR = 0xFF400080; + private static final int INNER_RADIUS = 70; + private static final int BALL_RADIUS = 100; + + public TouchLatencyView(Context context, AttributeSet attrs) { + super(context, attrs); + setOnTouchListener(this); + setWillNotDraw(false); + mBluePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mBluePaint.setColor(0xFF0000FF); + mBluePaint.setStyle(Paint.Style.FILL); + mGreenPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mGreenPaint.setColor(0xFF00FF00); + mGreenPaint.setStyle(Paint.Style.FILL); + mYellowPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mYellowPaint.setColor(0xFFFFFF00); + mYellowPaint.setStyle(Paint.Style.FILL); + mRedPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mRedPaint.setColor(0xFFFF0000); + mRedPaint.setStyle(Paint.Style.FILL); + + mTouching = false; + + mBallX = 100.0f; + mBallY = 100.0f; + mVelocityX = 7.0f; + mVelocityY = 7.0f; + } + + @Override + public boolean onTouch(View view, MotionEvent event) { + int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) { + mTouching = true; + invalidate(); + } else if (action == MotionEvent.ACTION_UP) { + mTouching = false; + invalidate(); + return true; + } else { + return true; + } + mTouchX = event.getX(); + mTouchY = event.getY(); + return true; + } + + private void drawTouch(Canvas canvas) { + if (!mTouching) { + Log.d(LOG_TAG, "Filling background"); + canvas.drawColor(BACKGROUND_COLOR); + return; + } + + float deltaX = (mTouchX - mLastDrawnX); + float deltaY = (mTouchY - mLastDrawnY); + float scaleFactor = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY) * 1.5f; + + mLastDrawnX = mTouchX; + mLastDrawnY = mTouchY; + + canvas.drawColor(BACKGROUND_COLOR); + canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS + 3 * scaleFactor, mRedPaint); + canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS + 2 * scaleFactor, mYellowPaint); + canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS + scaleFactor, mGreenPaint); + canvas.drawCircle(mTouchX, mTouchY, INNER_RADIUS, mBluePaint); + } + + private void drawBall(Canvas canvas) { + int width = canvas.getWidth(); + int height = canvas.getHeight(); + + // Update position + mBallX += mVelocityX; + mBallY += mVelocityY; + + // Clamp and change velocity if necessary + float left = mBallX - BALL_RADIUS; + if (left < 0) { + left = 0; + mVelocityX *= -1; + } + + float top = mBallY - BALL_RADIUS; + if (top < 0) { + top = 0; + mVelocityY *= -1; + } + + float right = mBallX + BALL_RADIUS; + if (right > width) { + right = width; + mVelocityX *= -1; + } + + float bottom = mBallY + BALL_RADIUS; + if (bottom > height) { + bottom = height; + mVelocityY *= -1; + } + + // Draw the ball + canvas.drawColor(BACKGROUND_COLOR); + canvas.drawOval(left, top, right, bottom, mYellowPaint); + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + if (mMode == 0) { + drawTouch(canvas); + } else { + drawBall(canvas); + } + } + + public void changeMode(MenuItem item) { + final int NUM_MODES = 2; + final String modes[] = {"Touch", "Ball"}; + mMode = (mMode + 1) % NUM_MODES; + invalidate(); + item.setTitle(modes[mMode]); + } + + private Paint mBluePaint, mGreenPaint, mYellowPaint, mRedPaint; + private int mMode; + + private boolean mTouching; + private float mTouchX, mTouchY; + private float mLastDrawnX, mLastDrawnY; + + private float mBallX, mBallY; + private float mVelocityX, mVelocityY; +} + +public class TouchLatencyActivity extends ActionBarActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_touch_latency); + + mTouchView = (TouchLatencyView) findViewById(R.id.canvasView); + } + + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_touch_latency, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + mTouchView.changeMode(item); + } + + return super.onOptionsItemSelected(item); + } + + private TouchLatencyView mTouchView; +} diff --git a/tests/TouchLatency/app/src/main/res/layout/activity_touch_latency.xml b/tests/TouchLatency/app/src/main/res/layout/activity_touch_latency.xml new file mode 100644 index 000000000000..8d20ff24bfe5 --- /dev/null +++ b/tests/TouchLatency/app/src/main/res/layout/activity_touch_latency.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/core/res/res/drawable/watch_switch_track_material.xml b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml similarity index 64% rename from core/res/res/drawable/watch_switch_track_material.xml rename to tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml index 00cdadb1b59d..1824f4a68995 100644 --- a/core/res/res/drawable/watch_switch_track_material.xml +++ b/tests/TouchLatency/app/src/main/res/menu/menu_touch_latency.xml @@ -1,23 +1,21 @@ - - - - - - - - - \ No newline at end of file +

    + + diff --git a/tests/TouchLatency/app/src/main/res/mipmap-hdpi/ic_launcher.png b/tests/TouchLatency/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000000..cde69bcccec6 Binary files /dev/null and b/tests/TouchLatency/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/tests/TouchLatency/app/src/main/res/mipmap-mdpi/ic_launcher.png b/tests/TouchLatency/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000000..c133a0cbd379 Binary files /dev/null and b/tests/TouchLatency/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/tests/TouchLatency/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/tests/TouchLatency/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000000..bfa42f0e7b91 Binary files /dev/null and b/tests/TouchLatency/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/tests/TouchLatency/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/tests/TouchLatency/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000000..324e72cdd748 Binary files /dev/null and b/tests/TouchLatency/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/tests/TouchLatency/app/src/main/res/values-w820dp/dimens.xml b/tests/TouchLatency/app/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 000000000000..1f222e1eb0bc --- /dev/null +++ b/tests/TouchLatency/app/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,21 @@ + + + + + 64dp + diff --git a/tests/TouchLatency/app/src/main/res/values/dimens.xml b/tests/TouchLatency/app/src/main/res/values/dimens.xml new file mode 100644 index 000000000000..5eeebd7dec7e --- /dev/null +++ b/tests/TouchLatency/app/src/main/res/values/dimens.xml @@ -0,0 +1,20 @@ + + + + + 0dp + 0dp + diff --git a/core/res/res/values-notround-watch/styles_material.xml b/tests/TouchLatency/app/src/main/res/values/strings.xml similarity index 82% rename from core/res/res/values-notround-watch/styles_material.xml rename to tests/TouchLatency/app/src/main/res/values/strings.xml index cd8521f48421..b97f095d501e 100644 --- a/core/res/res/values-notround-watch/styles_material.xml +++ b/tests/TouchLatency/app/src/main/res/values/strings.xml @@ -1,4 +1,4 @@ - + - + diff --git a/tests/TouchLatency/build.gradle b/tests/TouchLatency/build.gradle new file mode 100644 index 000000000000..d3ff69d6e7f9 --- /dev/null +++ b/tests/TouchLatency/build.gradle @@ -0,0 +1,19 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.1.0' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} diff --git a/tests/TouchLatency/gradle.properties b/tests/TouchLatency/gradle.properties new file mode 100644 index 000000000000..1d3591c8a4c9 --- /dev/null +++ b/tests/TouchLatency/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true \ No newline at end of file diff --git a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000000..8c0fb64a8698 Binary files /dev/null and b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.jar differ diff --git a/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..0c71e760dc93 --- /dev/null +++ b/tests/TouchLatency/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Apr 10 15:27:10 PDT 2013 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip diff --git a/tests/TouchLatency/gradlew b/tests/TouchLatency/gradlew new file mode 100755 index 000000000000..91a7e269e19d --- /dev/null +++ b/tests/TouchLatency/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/tests/TouchLatency/gradlew.bat b/tests/TouchLatency/gradlew.bat new file mode 100644 index 000000000000..aec99730b4e8 --- /dev/null +++ b/tests/TouchLatency/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/tests/TouchLatency/settings.gradle b/tests/TouchLatency/settings.gradle new file mode 100644 index 000000000000..e7b4def49cb5 --- /dev/null +++ b/tests/TouchLatency/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/tools/layoutlib/bridge/src/com/android/internal/view/animation/NativeInterpolatorFactoryHelper_Delegate.java b/tools/layoutlib/bridge/src/com/android/internal/view/animation/NativeInterpolatorFactoryHelper_Delegate.java index 0f39e8042883..ffce1a0496d9 100644 --- a/tools/layoutlib/bridge/src/com/android/internal/view/animation/NativeInterpolatorFactoryHelper_Delegate.java +++ b/tools/layoutlib/bridge/src/com/android/internal/view/animation/NativeInterpolatorFactoryHelper_Delegate.java @@ -104,7 +104,7 @@ private LutInterpolator(float[] values) { @Override public float getInterpolation(float input) { - float lutpos = input * mSize; + float lutpos = input * (mSize - 1); if (lutpos >= (mSize - 1)) { return mValues[mSize - 1]; } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java index b3ed9e1a0164..8dbbd076982f 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePackageManager.java @@ -126,6 +126,11 @@ public List queryPermissionsByGroup(String group, int flags) return null; } + @Override + public boolean isPermissionReviewModeEnabled() { + return false; + } + @Override public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) throws NameNotFoundException { diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index 9268a2b7cbe2..5fa080e0012d 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -52,6 +52,8 @@ interface IWifiManager List getConfiguredNetworks(); + boolean hasCarrierConfiguredNetworks(); + List getPrivilegedConfiguredNetworks(); WifiConfiguration getMatchingWifiConfig(in ScanResult scanResult); @@ -89,7 +91,7 @@ interface IWifiManager WifiInfo getConnectionInfo(); - boolean setWifiEnabled(boolean enable); + boolean setWifiEnabled(String packageName, boolean enable); int getWifiEnabledState(); diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 65d71a430392..ed0e60ff6145 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -100,10 +100,22 @@ private KeyMgmt() { } */ public static final int OSEN = 5; + /** + * IEEE 802.11r Fast BSS Transition with PSK authentication. + * @hide + */ + public static final int FT_PSK = 6; + + /** + * IEEE 802.11r Fast BSS Transition with EAP authentication. + * @hide + */ + public static final int FT_EAP = 7; + public static final String varName = "key_mgmt"; public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP", "IEEE8021X", - "WPA2_PSK", "OSEN" }; + "WPA2_PSK", "OSEN", "FT_PSK", "FT_EAP" }; } /** @@ -473,6 +485,12 @@ private Status() { } /** @hide **/ public static int INVALID_RSSI = -127; + /** + * @hide + * Set to true if this is a Carrier Network, else set to false. + */ + public boolean isCarrierNetwork = false; + /** * @hide * A summary of the RSSI and Band status for that configuration @@ -1553,6 +1571,7 @@ public String toString() { sbuf.append(" lcuid=" + lastConnectUid); sbuf.append(" userApproved=" + userApprovedAsString(userApproved)); sbuf.append(" noInternetAccessExpected=" + noInternetAccessExpected); + sbuf.append(" isCarrierNetwork=" + isCarrierNetwork); sbuf.append(" "); if (this.lastConnected != 0) { @@ -1918,6 +1937,7 @@ public WifiConfiguration(WifiConfiguration source) { userApproved = source.userApproved; numNoInternetAccessReports = source.numNoInternetAccessReports; noInternetAccessExpected = source.noInternetAccessExpected; + isCarrierNetwork = source.isCarrierNetwork; creationTime = source.creationTime; updateTime = source.updateTime; shared = source.shared; @@ -1990,6 +2010,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(userApproved); dest.writeInt(numNoInternetAccessReports); dest.writeInt(noInternetAccessExpected ? 1 : 0); + dest.writeInt(isCarrierNetwork ? 1 : 0); dest.writeInt(shared ? 1 : 0); dest.writeString(mPasspointManagementObjectTree); dest.writeInt(SIMNum); @@ -2062,6 +2083,7 @@ public WifiConfiguration createFromParcel(Parcel in) { config.userApproved = in.readInt(); config.numNoInternetAccessReports = in.readInt(); config.noInternetAccessExpected = in.readInt() != 0; + config.isCarrierNetwork = in.readInt() != 0; config.shared = in.readInt() != 0; config.mPasspointManagementObjectTree = in.readString(); config.SIMNum = in.readInt(); diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index b56a05b1d948..1ca5758044eb 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -19,6 +19,7 @@ import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; +import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.net.ConnectivityManager; import android.net.DhcpInfo; @@ -576,6 +577,28 @@ public class WifiManager { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK"; + /** + * Activity Action: Show UI to get user approval to enable WiFi. + *

    Input: {@link android.content.Intent#EXTRA_PACKAGE_NAME} string extra with + * the name of the app requesting the action. + *

    Output: Nothing. + * + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_REQUEST_ENABLE = "android.net.wifi.action.REQUEST_ENABLE"; + + /** + * Activity Action: Show UI to get user approval to disable WiFi. + *

    Input: {@link android.content.Intent#EXTRA_PACKAGE_NAME} string extra with + * the name of the app requesting the action. + *

    Output: Nothing. + * + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_REQUEST_DISABLE = "android.net.wifi.action.REQUEST_DISABLE"; + /** * Internally used Wi-Fi lock mode representing the case were no locks are held. * @hide @@ -737,6 +760,15 @@ public List getConfiguredNetworks() { } } + /** @hide */ + public boolean hasCarrierConfiguredNetworks() { + try { + return mService.hasCarrierConfiguredNetworks(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** @hide */ @SystemApi public List getPrivilegedConfiguredNetworks() { @@ -1460,7 +1492,7 @@ public DhcpInfo getDhcpInfo() { */ public boolean setWifiEnabled(boolean enabled) { try { - return mService.setWifiEnabled(enabled); + return mService.setWifiEnabled(mContext.getOpPackageName(), enabled); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); }