diff --git a/Android.mk b/Android.mk index bdb45550fa16d837e1c75ece8675b5590bd02aa0..7f06a7a02ad5bdeb40e909294bf329c7384991df 100644 --- a/Android.mk +++ b/Android.mk @@ -203,6 +203,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 d74526b72150fbd8013a3c0e7006632486267319..fcbd1b519268bec551bcdec9855c689d978ea4e1 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 d6c00589e7c2ab414b58d587d909cd36f001236d..618a7ed34708f3219a1812e4759c0747cdf8aca5 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.InstrumentationInfo; 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.os.UserHandle; 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 class Am extends BaseCommand { " 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 class Am extends BaseCommand { "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 class Am extends BaseCommand { "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 class Am extends BaseCommand { 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 @@ public class Am extends BaseCommand { 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 @@ public class Am extends BaseCommand { 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 d4a9326fc0d446b60c083664b1a4f284ef92122b..82c12e63f33af8d2608bff8c649338c2685cb0a0 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -71,15 +71,26 @@ static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootani 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". @@ -92,7 +103,7 @@ static const std::vector PLAY_SOUND_BOOTREASON_BLACKLIST { // --------------------------------------------------------------------------- BootAnimation::BootAnimation() : Thread(false), mClockEnabled(true), mTimeIsAccurate(false), - mTimeCheckThread(NULL) { + mTimeFormat12Hour(false), mTimeCheckThread(NULL) { mSession = new SurfaceComposerClient(); // If the system has already booted, the animation is not being used for a boot. @@ -178,15 +189,14 @@ 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; } -status_t BootAnimation::initTexture(const Animation::Frame& frame) +status_t BootAnimation::initTexture(FileMap* map, int* width, int* height) { - //StopWatch watch("blah"); - SkBitmap bitmap; - SkMemoryStream stream(frame.map->getDataPtr(), frame.map->getDataLength()); + SkMemoryStream stream(map->getDataPtr(), map->getDataLength()); SkImageDecoder* codec = SkImageDecoder::Factory(&stream); if (codec != NULL) { codec->setDitherImage(false); @@ -199,7 +209,7 @@ status_t BootAnimation::initTexture(const Animation::Frame& frame) // 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 frame.map; + 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. @@ -245,6 +255,9 @@ status_t BootAnimation::initTexture(const Animation::Frame& frame) glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); + *width = w; + *height = h; + return NO_ERROR; } @@ -436,7 +449,6 @@ bool BootAnimation::android() return false; } - void BootAnimation::checkExit() { // Allow surface flinger to gracefully request shutdown char value[PROPERTY_VALUE_MAX]; @@ -447,6 +459,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 @@ -493,69 +546,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; @@ -576,9 +668,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) { @@ -586,15 +679,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)) { @@ -603,6 +696,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) { @@ -646,6 +740,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; @@ -730,7 +832,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; } @@ -768,10 +870,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()) { @@ -788,8 +891,8 @@ bool BootAnimation::movie() releaseAnimation(animation); - if (clockTextureInitialized) { - glDeleteTextures(1, &mClock.name); + if (clockFontInitialized) { + glDeleteTextures(1, &animation->clockFont.texture.name); } return false; @@ -845,7 +948,8 @@ bool BootAnimation::playAnimation(const Animation& animation) glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } - initTexture(frame); + int w, h; + initTexture(frame.map, &w, &h); } const int xc = animationX + frame.trimX; @@ -867,8 +971,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); @@ -947,6 +1051,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); @@ -992,6 +1097,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 c0ae6b6edb101892710240fd70a333e48afa8b8b..26b25cd89d1a929db2a779f22715601962c08b3e 100644 --- a/cmds/bootanimation/BootAnimation.h +++ b/cmds/bootanimation/BootAnimation.h @@ -74,6 +74,13 @@ private: GLuint name; }; + struct Font { + FileMap* map; + Texture texture; + int char_width; + int char_height; + }; + struct Animation { struct Frame { String8 name; @@ -90,8 +97,12 @@ private: 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; @@ -108,6 +119,7 @@ private: String8 audioConf; String8 fileName; ZipFileRO* zip; + Font clockFont; }; /** @@ -118,10 +130,13 @@ private: enum ImageID { IMG_OEM = 0, IMG_SYS = 1, IMG_ENC = 2 }; const char *getAnimationFileName(ImageID image); status_t initTexture(Texture* texture, AssetManager& asset, const char* name); - status_t initTexture(const Animation::Frame& frame); + 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; @@ -134,7 +149,6 @@ private: sp mSession; AssetManager mAssets; Texture mAndroid[2]; - Texture mClock; int mWidth; int mHeight; bool mUseNpotTextures = false; @@ -145,6 +159,7 @@ private: 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 8e9791f8b731fc20ed0d48ab9890baa0290b99ca..02a92b9c19ff6145289ca00fd31b16e0574304a9 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 class NfcCommand extends Svc.Command { 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 a6ef25fc4479d8640427b2419d54b2a2205c934a..4dcb05e4f85dafbbddfbcb56eb976cbc98ebd3a1 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 class UsbCommand extends Svc.Command { 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 94214ff9694fb80c84d4cd607319f7f99c0c1e44..633dd9787cb116bf37ca145842be2cf75d1eea5a 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 class WifiCommand extends Svc.Command { 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 751bbe825bca3eed0c70efa5435375c878127255..ef6d55ffb4830fea5a67710822ce880cde2d481f 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 class UiObject { * * @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 ddeb8e78627104506123cf3ce279d34e2183b5ed..19aa11a3b1aaacd7d4aedab0b7c1e7e60a3ff007 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 class UiAutomationShellWrapper { * 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 163e7d2661b91bca0185eef7ea81d75acc228158..b311c218de30faa61af6caa6b263393cee8b5f60 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 4dca8e24d4357babcf868747020280f313cc9129..a291ef5cbb1e757c0e297ac46176fe09e60b6a4a 100644 --- a/core/java/android/accounts/AbstractAccountAuthenticator.java +++ b/core/java/android/accounts/AbstractAccountAuthenticator.java @@ -707,7 +707,7 @@ public abstract class AbstractAccountAuthenticator { * @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 abstract class AbstractAccountAuthenticator { * 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 0c21c4ff55e7a7c0907af540d4c968db4febf645..4707bed3ee1438bc6a641463cd6c4552c9bae907 100644 --- a/core/java/android/animation/ObjectAnimator.java +++ b/core/java/android/animation/ObjectAnimator.java @@ -38,8 +38,8 @@ import java.lang.ref.WeakReference; * * {@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 7e16e3ece5495583d979b18ba2fbd5c2f9b44bd2..d472c37cd64d666cf4f233aec723e2ba74d972d9 100644 --- a/core/java/android/animation/ValueAnimator.java +++ b/core/java/android/animation/ValueAnimator.java @@ -49,8 +49,8 @@ import java.util.HashMap; * * {@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 e4880b0f6a43b817c18585a1492c23b9249b8058..3cb3b0b96eae0f768c0a394e762265ef7643a7c2 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2946,8 +2946,11 @@ public class Activity extends ContextThemeWrapper * @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 class Activity extends ContextThemeWrapper * @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 class Activity extends ContextThemeWrapper * 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 class Activity extends ContextThemeWrapper * * @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 class Activity extends ContextThemeWrapper * * @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 class Activity extends ContextThemeWrapper * 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 class Activity extends ContextThemeWrapper * 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 class Activity extends ContextThemeWrapper * 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 class Activity extends ContextThemeWrapper * @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 class Activity extends ContextThemeWrapper * @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 fd962d9110b6cbd54574265e3f62407426dbc531..da7d711194deddaff8ab96d4960ea5ac4f737a84 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -75,7 +75,39 @@ import java.util.ArrayList; 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 @@ -2158,13 +2198,13 @@ public class ActivityManager { 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 d4f80a01ea53451fe033b6575f47756fe037f556..28f84771e10ce8df0976889503321f02671467d5 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 2d22f26069f331a07f4b7ab837b1bf473f4236f5..9d2ef9147388799d3a0d592675457aa6f3118b44 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -62,6 +62,7 @@ import android.os.Bundle; 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; @@ -5012,7 +5013,7 @@ public final class ActivityThread { 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; @@ -5025,6 +5026,7 @@ public final class ActivityThread { if (packages != null) { ThreadedRenderer.setupDiskCache(cacheDir); RenderScriptCacheDir.setupDiskCache(cacheDir); + GraphicsEnvironment.setupGraphicsEnvironment(context); } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -5319,7 +5321,7 @@ public final class ActivityThread { 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 66ab8ec0662ee170a0f49c82aba5bdce271daa50..43c4eedcdabf270cfdc14ede350c9db7385fdf63 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -443,8 +443,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 9fa8a5d2faee06e9c597a4626afab450954c0ea4..eb5613a05fb8a4bfcc0f397a53f23fecd68a23e8 100644 --- a/core/java/android/app/ApplicationErrorReport.java +++ b/core/java/android/app/ApplicationErrorReport.java @@ -378,6 +378,11 @@ public class ApplicationErrorReport implements Parcelable { 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 9cea49102925428d202e3db45a22a95c75adfff5..320d8408cb6630ab89d82367c6a5a6321d6cb916 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -291,6 +291,12 @@ public class ApplicationPackageManager extends PackageManager { 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 6e2c464e9a371bfc50eb6e85d5c0b9380ab43bb9..72ccf72d2d05087418faed43cd8cf1182b623079 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -185,6 +185,11 @@ public class Dialog implements DialogInterface, Window.Callback, 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 @@ public class Dialog implements DialogInterface, Window.Callback, @Nullable Message cancelCallback) { this(context); mCancelable = cancelable; + updateWindowForCancelable(); mCancelMessage = cancelCallback; } @@ -207,6 +213,7 @@ public class Dialog implements DialogInterface, Window.Callback, @Nullable OnCancelListener cancelListener) { this(context); mCancelable = cancelable; + updateWindowForCancelable(); setOnCancelListener(cancelListener); } @@ -742,7 +749,7 @@ public class Dialog implements DialogInterface, Window.Callback, /** @hide */ @Override - public void onWindowDismissed(boolean finishTask) { + public void onWindowDismissed(boolean finishTask, boolean suppressWindowTransition) { dismiss(); } @@ -1187,6 +1194,7 @@ public class Dialog implements DialogInterface, Window.Callback, */ public void setCancelable(boolean flag) { mCancelable = flag; + updateWindowForCancelable(); } /** @@ -1200,6 +1208,7 @@ public class Dialog implements DialogInterface, Window.Callback, public void setCanceledOnTouchOutside(boolean cancel) { if (cancel && !mCancelable) { mCancelable = true; + updateWindowForCancelable(); } mWindow.setCloseOnTouchOutside(cancel); @@ -1351,4 +1360,8 @@ public class Dialog implements DialogInterface, Window.Callback, } } } + + private void updateWindowForCancelable() { + mWindow.setCloseOnSwipeEnabled(mCancelable); + } } diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index 5dead2850942dc21118fe86c6b6565a38b5996ba..6b2838626ded06677598a7885d91d80c87441e2d 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -1115,7 +1115,7 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene * * @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 391065787683d2af1b84789da681a2db89404f31..1850cebf4f079455de74de73dc40559f5db7434c 100644 --- a/core/java/android/app/KeyguardManager.java +++ b/core/java/android/app/KeyguardManager.java @@ -21,18 +21,20 @@ import android.annotation.RequiresPermission; 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 class KeyguardManager { 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 class KeyguardManager { 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 class KeyguardManager { } - 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 55744b935f51795bd0ba5620e204597cef81cded..4c9b9778d7b54fb529902d07363f3d3b93fb3073 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -320,10 +320,10 @@ final class SystemServiceRegistry { }}); 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 0077db1eb31767e2da749012826aace9e428ae9e..bab993f855e9b272e5d251bd15ba8d51f3f5389c 100644 --- a/core/java/android/app/TaskStackBuilder.java +++ b/core/java/android/app/TaskStackBuilder.java @@ -226,7 +226,7 @@ public class TaskStackBuilder { * 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 class TaskStackBuilder { * {@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 0000000000000000000000000000000000000000..bab40f5add384fe5dd45916c6256746f719270b3 --- /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 0000000000000000000000000000000000000000..b6b14f24a096d45466a259733ac075d42907aa88 --- /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 dd70b5dfd1f049dd605cee3b43cf2cdb201c3c0a..cbd5a6d548328b0af0bcbedc50724c4527723755 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 class DeviceAdminReceiver extends BroadcastReceiver { 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 class DeviceAdminReceiver extends BroadcastReceiver { 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 df497b7564ab46bebfabf9b69ecc612d22c05b14..592026cda79b8940bf6e6ed5b1319b1e07158fb1 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -25,6 +25,7 @@ import android.annotation.SdkConstant.SdkConstantType; 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 @@ public class DevicePolicyManager { * @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 @@ public class DevicePolicyManager { * @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 @@ public class DevicePolicyManager { 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. @@ -6625,6 +6635,83 @@ public class DevicePolicyManager { } } + /** + * 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(); + } + } + /** * CM: check if secure keyguard is required * @hide diff --git a/core/java/android/app/admin/DnsEvent.aidl b/core/java/android/app/admin/DnsEvent.aidl new file mode 100644 index 0000000000000000000000000000000000000000..6da962a0a828b4c28455987574d32a0236079b98 --- /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 0000000000000000000000000000000000000000..4ff8e1cba53153bd78533bcd8bcba9d9670877ff --- /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 9051d2b5d289d73c25a053b20ca6e83477c05099..c00cf57d3d7b82bde93ef8f2600e9da106134a89 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; @@ -313,5 +314,9 @@ 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); + boolean requireSecureKeyguard(int userHandle); } diff --git a/core/java/android/app/admin/NetworkEvent.aidl b/core/java/android/app/admin/NetworkEvent.aidl new file mode 100644 index 0000000000000000000000000000000000000000..5fa5dbfabb5f8351f977550783f7e9940762e40a --- /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 0000000000000000000000000000000000000000..0de2665f90a8ddf797da12697a422831d0c3e8a1 --- /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 2858991fbdf4df5ade6590ec29ef47901fb07297..91b87d74694d4be9fce1168688e8a334d29b592d 100644 --- a/core/java/android/app/admin/SecurityLog.java +++ b/core/java/android/app/admin/SecurityLog.java @@ -144,8 +144,7 @@ public class SecurityLog { } /** - * 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 a793d0c12ee9627765f814430664bdf8dbe8811d..d3a14853cf1ee61691da02eb7c5d0d7bc7e4b628 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -493,7 +493,7 @@ public abstract class BackupAgent extends ContextWrapper { *

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 bb5f7a1d606ee35d6a67a75ff16b9c7afbe39a71..5d99ada9a0245f6f7bd43385a0ca8c4de56818f2 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -347,8 +347,9 @@ public class AppWidgetHostView extends FrameLayout { } /** - * 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 4d2c547d30a3ceddafdbdde474cbd133fdc401da..50f7096855eb79e7774723a1b96ce4bac3dbbf3b 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -202,6 +202,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 @@ -257,6 +274,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.

@@ -643,42 +683,12 @@ public final class BluetoothAdapter { @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 @@ -708,61 +718,50 @@ public final class BluetoothAdapter { 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 */ @@ -771,13 +770,14 @@ public final class BluetoothAdapter { 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(ActivityThread.currentPackageName()); + return mManagerService.enable(packageName); } catch (RemoteException e) { Log.e(TAG, "", e); } @@ -817,10 +817,10 @@ public final class BluetoothAdapter { 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; } @@ -857,12 +857,12 @@ public final class BluetoothAdapter { 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) @@ -901,8 +901,8 @@ public final class BluetoothAdapter { @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 { @@ -939,7 +939,7 @@ public final class BluetoothAdapter { 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; } @@ -958,7 +958,7 @@ public final class BluetoothAdapter { 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; } @@ -1502,6 +1502,37 @@ public final class BluetoothAdapter { 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 @@ -1880,34 +1911,6 @@ public final class BluetoothAdapter { * @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; } @@ -2061,7 +2064,7 @@ public final class BluetoothAdapter { 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); @@ -2091,7 +2094,7 @@ public final class BluetoothAdapter { 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);} } @@ -2100,7 +2103,7 @@ public final class BluetoothAdapter { } public void onBrEdrDown() { - if (DBG) Log.i(TAG, "onBrEdrDown:"); + if (VDBG) Log.i(TAG, "onBrEdrDown: " + mService); } }; @@ -2111,11 +2114,11 @@ public final class BluetoothAdapter { */ 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; } @@ -2151,22 +2154,6 @@ public final class BluetoothAdapter { */ 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 552c8d3b0143dc390d4bd17298aae4c4d9a7582d..0eca4d670d3d6fd8c2682ef684cd996cbce8786d 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 final class BluetoothGatt implements BluetoothProfile { 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 final class BluetoothGatt implements BluetoothProfile { 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 final class BluetoothGatt implements BluetoothProfile { 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 final class BluetoothGatt implements BluetoothProfile { 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 final class BluetoothGatt implements BluetoothProfile { mServices = new ArrayList(); mConnState = CONN_STATE_IDLE; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; } /** @@ -516,6 +528,7 @@ public final class BluetoothGatt implements BluetoothProfile { 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 da79b586cf66d52c94c09935d4663831bff78cff..3b9ee291d6051f8da87e623264a229f04966670a 100644 --- a/core/java/android/bluetooth/BluetoothProfile.java +++ b/core/java/android/bluetooth/BluetoothProfile.java @@ -136,6 +136,13 @@ public interface BluetoothProfile { */ public static final int PBAP_CLIENT = 17; + /** + * 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; + /** * DUN * @hide diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl index 3049255f81ac2351d64cdf8f596299014300307c..54c68d368e850756bb19af3b0ccd36eed69daf81 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 dd6f23699b6a9b818f490db9419d8d9d9d2f5f5a..5afd77418222963f754d520c6a717a76720767f5 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(String callingPackage); - 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 8e659e04d705308658ada65bfb33080fd20bcfee..9e87230c686e4d6f2e15a60b648ae387d23aee8d 100644 --- a/core/java/android/bluetooth/OobData.java +++ b/core/java/android/bluetooth/OobData.java @@ -30,7 +30,23 @@ import android.util.Log; * @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 class OobData implements Parcelable { 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 class OobData implements Parcelable { @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 10e6fb23324913db561555970d3f75f22df9d82e..a7a86158edeecd36d46b51912822f5c76e2e6ada 100644 --- a/core/java/android/content/BroadcastReceiver.java +++ b/core/java/android/content/BroadcastReceiver.java @@ -27,189 +27,25 @@ import android.util.Log; 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 abstract class BroadcastReceiver { 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 abstract class BroadcastReceiver { mSendingUser = userId; mFlags = flags; } - + /** * Version of {@link BroadcastReceiver#setResultCode(int) * BroadcastReceiver.setResultCode(int)} for @@ -331,7 +167,7 @@ public abstract class BroadcastReceiver { mResultData = data; mResultExtras = extras; } - + /** * Version of {@link BroadcastReceiver#getAbortBroadcast() * BroadcastReceiver.getAbortBroadcast()} for @@ -350,7 +186,7 @@ public abstract class BroadcastReceiver { checkSynchronousHint(); mAbortBroadcast = true; } - + /** * Version of {@link BroadcastReceiver#clearAbortBroadcast() * BroadcastReceiver.clearAbortBroadcast()} for @@ -359,7 +195,7 @@ public abstract class BroadcastReceiver { 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 abstract class BroadcastReceiver { 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 abstract class BroadcastReceiver { throw new IllegalStateException("Broadcast already finished"); } mFinished = true; - + try { if (mResultExtras != null) { mResultExtras.setAllowFds(false); @@ -448,7 +284,7 @@ public abstract class BroadcastReceiver { Log.e("BroadcastReceiver", e.getMessage(), e); } } - + public BroadcastReceiver() { } @@ -468,14 +304,15 @@ public abstract class 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 abstract class 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 abstract class 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 abstract class BroadcastReceiver { 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 abstract class BroadcastReceiver { * 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 abstract class BroadcastReceiver { /** * 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 abstract class BroadcastReceiver { * {@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 abstract class BroadcastReceiver { /** * 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 abstract class BroadcastReceiver { * 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 abstract class BroadcastReceiver { * 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 abstract class BroadcastReceiver { * {@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 abstract class BroadcastReceiver { 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 abstract class BroadcastReceiver { * {@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 abstract class BroadcastReceiver { checkSynchronousHint(); mPendingResult.mAbortBroadcast = true; } - + /** * Clears the flag indicating that this receiver should abort the current * broadcast. @@ -701,7 +543,7 @@ public abstract class BroadcastReceiver { mPendingResult.mAbortBroadcast = false; } } - + /** * Returns true if the receiver is currently processing an ordered * broadcast. @@ -709,7 +551,7 @@ public abstract class BroadcastReceiver { 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 abstract class BroadcastReceiver { 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 abstract class BroadcastReceiver { 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 abstract class BroadcastReceiver { 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 3a2f471e96ebcfd767caf99fb89e86661990d815..ab37cd80b81d45b6da7768fc5cbe07495b1c4a0b 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1668,7 +1668,7 @@ public abstract class Context { * * @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 abstract class Context { * @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 class Context { * 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 class Context { * 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 class Context { * {@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 861aae5a8794047f0a784baf531bb595e4bb78d4..2142aae2ec74abc34448bd6c3254e4420b43f9cb 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -8145,7 +8145,7 @@ public class Intent implements Parcelable, Cloneable { * @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 541ebbd32f11214b265806a64f1b550307a37c1b..74d2f114aae5c25c76e1df17425e4728c0375bb4 100644 --- a/core/java/android/content/SyncRequest.java +++ b/core/java/android/content/SyncRequest.java @@ -175,7 +175,7 @@ public class SyncRequest implements Parcelable { } /** - * 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 class SyncRequest implements Parcelable { * @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 0263431f9950e48902c3809eb9bb1d74662bb226..ce029ab39251358f3881eea3900d5f688785cbcd 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2839,6 +2839,14 @@ public abstract class PackageManager { 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. @@ -3305,7 +3313,8 @@ public abstract class PackageManager { * 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 @@ -3330,7 +3339,8 @@ public abstract class PackageManager { * #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 f5bcf64417a666a9d7e2ec949ab486dbdd0c73d7..9bb212886861d457c825e2f5e7d6feab5fa203b5 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -168,4 +168,17 @@ public abstract class PackageManagerInternal { * @return Whether was launched. */ public abstract boolean wasPackageEverLaunched(String packageName, int userId); + + /** + * 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 a93870ece823a26579fc9df82842416f89168067..f7c4d592b3a92da36611a10ccf8866aff77e180b 100644 --- a/core/java/android/content/pm/ShortcutManager.java +++ b/core/java/android/content/pm/ShortcutManager.java @@ -193,7 +193,11 @@ import java.util.List; * The following list includes descriptions for the different attributes within a static shortcut: *

*
{@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 @@ import java.util.List; * *
{@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 13ba6cc37d225734435258bada9ba3807044de33..c915b18b8a80d6c8512b64f2d11d86d03cf9767c 100644 --- a/core/java/android/hardware/display/DisplayManagerInternal.java +++ b/core/java/android/hardware/display/DisplayManagerInternal.java @@ -167,6 +167,8 @@ public abstract class DisplayManagerInternal { 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 abstract class DisplayManagerInternal { 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 abstract class DisplayManagerInternal { 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 abstract class DisplayManagerInternal { boostScreenBrightness = other.boostScreenBrightness; dozeScreenBrightness = other.dozeScreenBrightness; dozeScreenState = other.dozeScreenState; - useTwilight = other.useTwilight; } @Override @@ -266,8 +268,7 @@ public abstract class DisplayManagerInternal { && lowPowerMode == other.lowPowerMode && boostScreenBrightness == other.boostScreenBrightness && dozeScreenBrightness == other.dozeScreenBrightness - && dozeScreenState == other.dozeScreenState - && useTwilight == other.useTwilight; + && dozeScreenState == other.dozeScreenState; } @Override @@ -287,8 +288,7 @@ public abstract class DisplayManagerInternal { + ", 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 abstract class DisplayManagerInternal { 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 f17fd55bd22aaca62c6081f60af4f2d070b64420..c5ae1f54aed6039de63ecb378cddcde0aed4ea77 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -710,7 +710,7 @@ public class FingerprintManager { /** * 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 6e4c9de1c8ef7aa2b3a7aa03b2483e2c32867e2d..00b0bffdd1f5344e37f8a31413158d39962e454e 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 708d651a58aec92fe05745bd7b158a950a188a66..c346700a979fef398055c9f43247ffe1a92c00b3 100644 --- a/core/java/android/hardware/usb/UsbEndpoint.java +++ b/core/java/android/hardware/usb/UsbEndpoint.java @@ -75,8 +75,8 @@ public class UsbEndpoint implements Parcelable { * 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 cb2720ab98489f080c92a42616138037383a4c6c..3df57bcb704f8ba2760fb148fc290978f1943ce1 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -530,33 +530,23 @@ public class UsbManager { * {@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 353eb885fa6aa4c6bfc735ef63510f3e108d3b60..750d4f9387ed26260646a01763618232116d946e 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -2404,16 +2404,16 @@ public class InputMethodService extends AbstractInputMethodService { } 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 7b66ea2a536ec9649dbc09cf5b13c8cf994627e7..0ce579b4e800002f691b4867dd1335b17c0ee7ae 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -89,6 +89,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. @@ -224,6 +231,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 8f634bbf0cc9a113e71da730c8cf96c6eabbeaf4..6f07b31538336f5de6abd0494f594e6f9b6233b4 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 0000000000000000000000000000000000000000..49436beadc51b9cd708255ec1b16673fab8f8edb --- /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 35e3065b078f05cc418181bdfb47fba9784f2042..a677d7342dadb3dc198b1e9031d94efd803eacfd 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 67378bd0cd81e6bf31ae3148faffa863b88260b0..09af05c0dfbac396c3860eafb943c0d3ccc4c92a 100644 --- a/core/java/android/net/Uri.java +++ b/core/java/android/net/Uri.java @@ -1746,8 +1746,8 @@ public abstract class Uri implements Parcelable, Comparable { * 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 4fc6b7aaf8425815d8a7db460812d048bd52a20f..6176b2c58deb40deb41b299a20509366685dbbb3 100644 --- a/core/java/android/net/metrics/DnsEvent.java +++ b/core/java/android/net/metrics/DnsEvent.java @@ -21,7 +21,7 @@ import android.os.Parcel; 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 a5b4eb5aff86f7920c3e28bb5de7b770e5317333..e0a026ed678d1937bd3c868d41b83050a8482791 100644 --- a/core/java/android/net/metrics/IpManagerEvent.java +++ b/core/java/android/net/metrics/IpManagerEvent.java @@ -38,9 +38,15 @@ public final class IpManagerEvent implements Parcelable { public static final int PROVISIONING_OK = 1; public static final int PROVISIONING_FAIL = 2; public static final int COMPLETE_LIFECYCLE = 3; + /** @hide */ public static final int ERROR_STARTING_IPV4 = 4; + /** @hide */ public static final int ERROR_STARTING_IPV6 = 5; + /** @hide */ public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6; /** {@hide} */ - @IntDef(value = {PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE}) + @IntDef(value = { + PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE, + ERROR_STARTING_IPV4, ERROR_STARTING_IPV6, ERROR_STARTING_IPREACHABILITYMONITOR, + }) @Retention(RetentionPolicy.SOURCE) public @interface EventType {} @@ -95,6 +101,7 @@ public final class IpManagerEvent implements Parcelable { final static class Decoder { static final SparseArray 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 3b3fa6976fc982181a7ee57103b47b62ef00bf93..06674950a044d5a49724b7afece6c8fe6f4c890c 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 1a31b56f1ffb62f8a46d51af360e1ecb17b7ba68..a724ec12ed324b9100f3fe3beba0fb36ab276394 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 final class ValidationProbeEvent implements Parcelable { } }; + /** @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 final class ValidationProbeEvent implements Parcelable { @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 a0c2efd407ba0387936c732bf175ab7ec5bd41b3..0bb05b5a22a288a5e1e6f2b82e757ce30840027a 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 0000000000000000000000000000000000000000..e4cdbce09796f1cd21aa9c05e94e2299d462cbd3 --- /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 eeb641d33c20d4da561c1dc8f577e7b6e89b95a6..394866941d43e74f9f7f5b50f0057b5c2ed680fe 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 eba27991c314eec9b45abe7738a45830a77cf3cf..f4ff6a3b6477d2cbfa5418667404eab7e995c775 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -49,23 +49,23 @@ import android.util.Log; * 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 @@ import android.util.Log; * 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 final class PowerManager { } /** - * 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 c36b48886f370ae7ded4bf575fb327cbbe4b5417..287092320921b9e5bce1c49db66cb5c9f9cdac01 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -1432,9 +1432,6 @@ public final class StrictMode { 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 final class StrictMode { 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 @@ public final class StrictMode { /* 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 final class StrictMode { * @hide */ public static class ViolationInfo { - public String message; + public final String message; /** * Stack and other stuff info. @@ -2379,6 +2351,7 @@ public final class StrictMode { * Create an uninitialized instance of ViolationInfo */ public ViolationInfo() { + message = null; crashInfo = null; policy = 0; } @@ -2425,7 +2398,9 @@ public final class StrictMode { @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 final class StrictMode { */ 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 final class StrictMode { */ 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 final class StrictMode { * 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 9e778cf36970e8536992c71cf9e8daea3015a71c..cad5e9ff31a51279dcf37558bb530edbc63a72dc 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -973,9 +973,8 @@ public class UserManager { /** {@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(); } @@ -1072,8 +1071,7 @@ public class UserManager { /** {@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(); } @@ -1086,10 +1084,8 @@ public class UserManager { /** {@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 93afb4376cf293a6add1599caa6837d9a714da46..e42704ca2141cdca947098d2740392f2bed13195 100644 --- a/core/java/android/os/UserManagerInternal.java +++ b/core/java/android/os/UserManagerInternal.java @@ -134,6 +134,12 @@ public abstract class UserManagerInternal { */ 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 b1cad0538d312ce193c12456b71fb4205fbee336..ec1e102c92896fb41a5b7bfe84740e8e55bf1851 100644 --- a/core/java/android/preference/Preference.java +++ b/core/java/android/preference/Preference.java @@ -719,6 +719,9 @@ public class Preference implements Comparable { * @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 dd2a5dea9611cfcbf32d16eef2f5bfd52814b92c..c83bd3e78e97136a20b1cb61d8bba6cfac88b343 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2818,6 +2818,15 @@ public final class Settings { 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. */ @@ -3873,6 +3882,7 @@ public final class Settings { 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); @@ -5546,6 +5556,13 @@ public final class Settings { */ 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. * @@ -6118,6 +6135,36 @@ public final class Settings { 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 @@ -6309,6 +6356,14 @@ public final class Settings { 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 @@ -6420,12 +6475,6 @@ public final class Settings { */ 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 ':'. @@ -6551,6 +6600,12 @@ public final class Settings { */ 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"; + /** * Whether to include options in power menu for rebooting into recovery or bootloader * @hide @@ -6648,6 +6703,7 @@ public final class Settings { DOZE_ENABLED, DOZE_PULSE_ON_PICK_UP, DOZE_PULSE_ON_DOUBLE_TAP, + NFC_PAYMENT_DEFAULT_COMPONENT, ADVANCED_REBOOT, CAMERA_GESTURE_DISABLED }; @@ -7035,6 +7091,12 @@ public final class Settings { */ 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 @@ -7337,6 +7399,13 @@ public final class Settings { */ 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} */ @@ -7762,6 +7831,13 @@ public final class Settings { 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. @@ -8189,12 +8265,46 @@ public final class Settings { */ 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"; @@ -9575,6 +9685,24 @@ public final class Settings { * @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 5099eebf6eb1600000495e4ee17c6115f6282214..1e5416382f8c5c3593bcf212fe15d3d8a7211ef5 100644 --- a/core/java/android/provider/VoicemailContract.java +++ b/core/java/android/provider/VoicemailContract.java @@ -30,6 +30,7 @@ import android.provider.CallLog.Calls; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telecom.Voicemail; + import java.util.List; /** @@ -317,6 +318,48 @@ public class VoicemailContract { */ 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 8689dce3fef5505ca439de4ed44c324264730a9d..641e1ada6eaa2382a0866779769c353fe4d764b1 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 455e1b25df18e258e4c29e4aeb57e3532c6f2dbf..813acc232289eb791a25b8fc3eecac70558e60f5 100644 --- a/core/java/android/service/carrier/CarrierService.java +++ b/core/java/android/service/carrier/CarrierService.java @@ -107,12 +107,12 @@ public abstract class CarrierService extends Service { *

* 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 c1da0f107995af9f44c5b3935d833cd149c3b6f1..abb48aefdd4b17456ec7dd542ad47f3ba937b514 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -785,7 +785,7 @@ public abstract class NotificationListenerService extends Service { } /** - * 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 b3f2c2a5c447f5f0f92ed628ebf67403b3780541..519ccd2560f633bd249adaceab8d92e27a13c2e6 100644 --- a/core/java/android/text/Editable.java +++ b/core/java/android/text/Editable.java @@ -94,10 +94,10 @@ extends CharSequence, GetChars, Spannable, Appendable 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 dc8e4b93e093929916538b7566b81f52f77b9c27..cdf7e8b092210efe399624be2935f1303638c95b 100644 --- a/core/java/android/text/SpannableStringBuilder.java +++ b/core/java/android/text/SpannableStringBuilder.java @@ -21,6 +21,7 @@ import android.graphics.Canvas; 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 class SpannableStringBuilder implements CharSequence, GetChars, Spannable 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 class SpannableStringBuilder implements CharSequence, GetChars, Spannable * @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 class SpannableStringBuilder implements CharSequence, GetChars, Spannable // 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 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable 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 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable } 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 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable */ 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 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable 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 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable } 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 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable 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 856dd0bff36e93b4c774993d13ad5fb2605e1c41..b0bff680f390a209e67220be9d420686bc38770a 100644 --- a/core/java/android/text/style/ImageSpan.java +++ b/core/java/android/text/style/ImageSpan.java @@ -43,7 +43,7 @@ public class ImageSpan extends DynamicDrawableSpan { } /** - * @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 e9153ddba8310594fbadb6ec13e121e453e76dbd..29e667f5abc5fde46b1591bd696089ce0d972854 100644 --- a/core/java/android/text/style/TtsSpan.java +++ b/core/java/android/text/style/TtsSpan.java @@ -798,7 +798,7 @@ public class TtsSpan implements ParcelableSpan { /** * 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 class TtsSpan implements ParcelableSpan { * 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 class TtsSpan implements ParcelableSpan { * 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 class TtsSpan implements ParcelableSpan { * @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 class TtsSpan implements ParcelableSpan { * @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 class TtsSpan implements ParcelableSpan { * 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 class TtsSpan implements ParcelableSpan { * 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 class TtsSpan implements ParcelableSpan { * 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 85a4bf9d9e8f92e4b6d61b8e828c4e2fc0593604..e29155821eaafcadb44a073551389e724cfd4506 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 final class Display { * 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 final class Display { 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 2b938d0df7eb44104a03b1f07126bc36a0e9ed0e..7d1b76b8becb93472ee77ccf083e4c7a758ac17d 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 55dd6bb64fe65ba29c5f71ed9257ed9dbe7a3790..a70eb2279cca2eebb74b739d028650a476da5fde 100644 --- a/core/java/android/view/KeyCharacterMap.java +++ b/core/java/android/view/KeyCharacterMap.java @@ -673,8 +673,8 @@ public class KeyCharacterMap implements Parcelable { * * @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 b77be8c00e697063609964029ed605d710559b8b..694232f9dfd5c0d0b876661a97b6970348b1ab0e 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 5f40ad520d0cea934740849744f28e7b3be265ed..984078a982081b48d12b81e6c0c55119f99141d8 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -12940,7 +12940,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * 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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * 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 @@ public class View implements Drawable.Callback, KeyEvent.Callback, 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 4d584a3df4fb829beaf9b73f3565bbd2c4f48fea..8b8525f2f1b5399b6971fe3ff75e811a681edaae 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 class ViewConfiguration { mOverflingDistance = OVERFLING_DISTANCE; mFadingMarqueeEnabled = true; mGlobalActionsKeyTimeout = GLOBAL_ACTIONS_KEY_TIMEOUT; + mScrollFactor = SCROLL_FACTOR; } /** @@ -351,6 +366,8 @@ public class ViewConfiguration { 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 class ViewConfiguration { 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 class ViewConfiguration { 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 b770bd50c277c36916f00d21cb40395850f9b683..8fa5d70b41c04c684ab81617c397aa01b7297224 100644 --- a/core/java/android/view/ViewOverlay.java +++ b/core/java/android/view/ViewOverlay.java @@ -238,7 +238,19 @@ public class ViewOverlay { @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 f07b1d38557bc460d0bbe4f9ac8f50fa61485492..fa095c2e02bec78946f50de38fc917d32439dff0 100755 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -6086,7 +6086,8 @@ public final class ViewRootImpl implements ViewParent, 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 87616408e10db852567e70bcd191869db8b8799f..3ee02771aee373c2e1eb17778ae38b80d407bd11 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 abstract class Window { * 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 abstract class Window { } /** @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 abstract class Window { * @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 2dfa8cdd3db9e6850286607f6aa67f1307575df3..286f5f7c1bf9bfc39dd28c344820dfc1f840f52f 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -353,7 +353,18 @@ public final class AccessibilityManager { 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 df2f18c217358f0888b381b27de6a802d12f8b89..7fa49c1a6c8fe2417f43a89bef5e6f42904f9069 100644 --- a/core/java/android/view/animation/LayoutAnimationController.java +++ b/core/java/android/view/animation/LayoutAnimationController.java @@ -150,7 +150,7 @@ public class LayoutAnimationController { * 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 f54edf14bbe18de11cb3b20cbd565b266e651b36..3a855195426626d75247831c4bb22e5880a39045 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -740,9 +740,26 @@ public class WebView extends AbsoluteLayout } /** - * 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 class WebView extends AbsoluteLayout } /** - * 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 cdff41685b80197932c8fd5697a793b8ae35e703..cc2c6cc348033305f282a687ae5df5828c68f96c 100644 --- a/core/java/android/webkit/WebViewDatabase.java +++ b/core/java/android/webkit/WebViewDatabase.java @@ -44,7 +44,7 @@ public abstract class WebViewDatabase { * * @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 abstract class WebViewDatabase { 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 46da9d3c28b7f4b6f652c8bef9f0f5208a53f8db..49d195539445fda9683254556314d2018e7b38b6 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -21,6 +21,7 @@ import android.annotation.DrawableRes; 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 abstract class AbsListView extends AdapterView implements Te 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 @@ public abstract class AbsListView extends AdapterView implements Te 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 @@ public abstract class AbsListView extends AdapterView implements Te } layoutChildren(); - mInLayout = false; mOverscrollMax = (b - t) / OVERSCROLL_LIMIT_DIVISOR; @@ -2175,6 +2182,7 @@ public abstract class AbsListView extends AdapterView implements Te mInLayout = false; } } + mInLayout = false; } /** @@ -2704,6 +2712,9 @@ public abstract class AbsListView extends AdapterView implements Te * fail to relayout them properly to accommodate for new bounds. */ void handleBoundsChange() { + if (mInLayout) { + return; + } final int childCount = getChildCount(); if (childCount > 0) { mDataChanged = true; @@ -4208,21 +4219,26 @@ public abstract class AbsListView extends AdapterView implements Te @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) @@ -4232,8 +4248,8 @@ public abstract class AbsListView extends AdapterView implements Te 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 9d228cf667b162165860563ff95ab95d16918130..bbc50dafa57648d139444a4f62bb48b04656bf2f 100644 --- a/core/java/android/widget/ArrayAdapter.java +++ b/core/java/android/widget/ArrayAdapter.java @@ -312,10 +312,10 @@ public class ArrayAdapter extends BaseAdapter implements Filterable, ThemedSp } /** - * Control whether methods that change the list ({@link #add}, - * {@link #insert}, {@link #remove}, {@link #clear}) automatically call - * {@link #notifyDataSetChanged}. If set to false, caller must - * manually call notifyDataSetChanged() to have the changes + * Control whether methods that change the list ({@link #add}, {@link #addAll(Collection)}, + * {@link #addAll(Object[])}, {@link #insert}, {@link #remove}, {@link #clear}, + * {@link #sort(Comparator)}) automatically call {@link #notifyDataSetChanged}. If set to + * false, caller must manually call notifyDataSetChanged() to have the changes * reflected in the attached view. * * The default is true, and calling notifyDataSetChanged() diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index 00f368e3abe313ede051f8c053f7fd8eeec67a2f..918b6c0d65ff588dfd5dd3f3acc7263684e955a7 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -18,6 +18,7 @@ package android.widget; 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 class HorizontalScrollView extends FrameLayout { 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 @@ public class HorizontalScrollView extends FrameLayout { mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mOverscrollDistance = configuration.getScaledOverscrollDistance(); mOverflingDistance = configuration.getScaledOverflingDistance(); + mScrollFactor = configuration.getScaledScrollFactor(); } @Override @@ -719,30 +727,35 @@ public class HorizontalScrollView extends FrameLayout { @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 @@ public class HorizontalScrollView extends FrameLayout { @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 9b89491ce408c39ae73a788c185322f208d29c30..473585857d115b789c16e3602295ed5241c47e99 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -223,7 +223,7 @@ public class PopupWindow { 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 class PopupWindow { 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 @@ public class PopupWindow { * @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 @@ public class PopupWindow { 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 class PopupWindow { // 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 class PopupWindow { 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 @@ public class PopupWindow { } 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 @@ public class PopupWindow { * 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 class PopupWindow { // 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 d0d233ebe975e06bcd263873b41de12950856960..04ae2627e6dfe02d58956beca2dda93ad736f8fa 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -390,6 +390,7 @@ public class RemoteViews implements Parcelable, Filter { // 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 class RemoteViews implements Parcelable, Filter { 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 class RemoteViews implements Parcelable, Filter { * * 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 class RemoteViews implements Parcelable, Filter { * 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 class RemoteViews implements Parcelable, Filter { * 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 0555cd403b00581c0ca4811a26b90dfabfdeb23a..e696ff7229e8fa8a3e12405c8984f2793848594c 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 class ScrollView extends FrameLayout { 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 @@ public class ScrollView extends FrameLayout { mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); mOverscrollDistance = configuration.getScaledOverscrollDistance(); mOverflingDistance = configuration.getScaledOverflingDistance(); + mScrollFactor = configuration.getScaledScrollFactor(); } @Override @@ -777,30 +785,35 @@ public class ScrollView extends FrameLayout { @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 @@ public class ScrollView extends FrameLayout { @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 a585d75e5d7ab77e735cfab5df5a1c7cbc7f7c5c..49380b745564aacc65185cbfcee41e6eb555dac5 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 @@ public class TextClock extends TextView { } createTime(mTimeZone); - // Wait until onAttachedToWindow() to handle the ticker + // Wait until registering for events to handle the ticker chooseFormat(false); } @@ -501,7 +501,7 @@ public class TextClock extends TextView { 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 @@ public class TextClock extends TextView { } @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 @@ public class TextClock extends TextView { } 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 @@ public class TextClock extends TextView { } 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 be76b43dfcbab6df326134fbf2e70914e3dd23e8..d5aeec6751699de81eededf19b218fba9fbd27d8 100755 --- a/core/java/com/android/internal/app/AlertController.java +++ b/core/java/com/android/internal/app/AlertController.java @@ -888,7 +888,8 @@ public class AlertController { 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 1e26c92dd7644bbdc89430a0723aad6e7ef18fc2..0010073a2e916dbd0d90b470feb6675514cd518f 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 @@ public class ResolverActivity extends Activity { 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 @@ public class ResolverActivity extends Activity { } 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 3b3344e7d9346f6dca44edb3be0d24a39d45c968..f28315bdc7f3225c6d08aa37f91735fb7b7aabba 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 class BatteryStatsImpl extends BatteryStats { @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 class BatteryStatsImpl extends BatteryStats { @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 class BatteryStatsImpl extends BatteryStats { 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 class BatteryStatsImpl extends BatteryStats { * 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 class BatteryStatsImpl extends BatteryStats { 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 class BatteryStatsImpl extends BatteryStats { */ @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 class BatteryStatsImpl extends BatteryStats { 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 class BatteryStatsImpl extends BatteryStats { @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 @@ public class BatteryStatsImpl extends BatteryStats { 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 @@ public class BatteryStatsImpl extends BatteryStats { 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 @@ public class BatteryStatsImpl extends BatteryStats { } 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 20f84b52d1943be024d51f4df9d688980a8279ff..cabbcc2a1a7f70847ba983457f19000a56e6db9c 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 @@ public class ZygoteInit { } 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 92ab3246e354b3e427369f5701ddd836fe4332e6..8dfdc6a815a1becb8d19171f5b659d1be097f85d 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.Window.DECOR_CAPTION_SHADE_LIGHT; 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 class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind 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 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind 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 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind 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 878f3a69a504bd3f329c01f53fcf2c98108c54ea..3b280ad20d4199b0e7bc4301a62e19c12822fd16 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -2495,6 +2495,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { // 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 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) { - registerSwipeCallbacks(); + registerSwipeCallbacks(contentParent); } // Remaining setup -- of background and title -- that only applies @@ -2980,25 +2981,27 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { 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 class PhoneWindow extends Window implements MenuBuilder.Callback { @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 0000000000000000000000000000000000000000..a163ceb5f8f866fb8dce060e415d5aaba268a0bc --- /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 fc68b849ed2080f06a1c6e410faaa4711ea55f2a..04767b00bdff8a7d6d1df1d804afe1f143b29600 100644 --- a/core/java/com/android/internal/widget/DecorCaptionView.java +++ b/core/java/com/android/internal/widget/DecorCaptionView.java @@ -416,7 +416,8 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener, 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 358be604f84724aaed280425515d9fc72db3f3a5..a5d2bf3b68d3cf25361a4d5a58dd82bf883e8f5f 100644 --- a/core/java/com/android/internal/widget/ImageFloatingTextView.java +++ b/core/java/com/android/internal/widget/ImageFloatingTextView.java @@ -71,10 +71,14 @@ public class ImageFloatingTextView extends TextView { .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 df9b0ddc180473c114e5be41120ed27da783e9f1..6defd1e8d9f2a6ca88bab6142ee0f4e88a64954f 100644 --- a/core/java/com/android/internal/widget/LockPatternChecker.java +++ b/core/java/com/android/internal/widget/LockPatternChecker.java @@ -4,6 +4,7 @@ import android.os.AsyncTask; import com.android.internal.widget.LockPatternUtils.RequestThrottledException; +import java.util.ArrayList; import java.util.List; /** @@ -61,11 +62,19 @@ public final class LockPatternChecker { 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 @@ public final class LockPatternChecker { 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 0f9f5696ef92631ee9f4f17a7135b8f296eebea8..891afac06ed50a9ac9d6459c1ab9da08a00ca587 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.Resources; 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; @@ -148,6 +149,10 @@ public class LockPatternView extends View { private PatternExploreByTouchHelper mExploreByTouchHelper; private AudioManager mAudioManager; + private Drawable mSelectedDrawable; + private Drawable mNotSelectedDrawable; + private boolean mUseLockPatternDrawable; + private LockPatternUtils mLockPatternUtils; /** @@ -326,6 +331,12 @@ public class LockPatternView extends View { 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); @@ -685,6 +696,11 @@ public class LockPatternView extends View { final int height = h - mPaddingTop - mPaddingBottom; mSquareHeight = height / (float) mPatternSize; mExploreByTouchHelper.invalidateRoot(); + + if (mUseLockPatternDrawable) { + mNotSelectedDrawable.setBounds(mPaddingLeft, mPaddingTop, width, height); + mSelectedDrawable.setBounds(mPaddingLeft, mPaddingTop, width, height); + } } private int resolveMeasured(int measureSpec, int desired) @@ -1157,13 +1173,17 @@ public class LockPatternView extends View { 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); + if (mUseLockPatternDrawable) { + drawCellDrawable(canvas, i, j, cellState.radius, drawLookup[i][j]); } else { - drawCircle(canvas, (int) centerX, (int) centerY + translationY, - cellState.radius, drawLookup[i][j], cellState.alpha); + 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); + } } } } @@ -1257,6 +1277,30 @@ public class LockPatternView extends View { 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 d2a43b755f1839ff0bcf129c5bb4d21e18d38aec..cb123a13ad1da71c7544fdf8d3302ead7e6406e0 100644 --- a/core/java/com/android/internal/widget/MessagingLinearLayout.java +++ b/core/java/com/android/internal/widget/MessagingLinearLayout.java @@ -126,7 +126,8 @@ public class MessagingLinearLayout extends ViewGroup { // 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 @@ public class MessagingLinearLayout extends ViewGroup { // 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 @@ public class MessagingLinearLayout extends ViewGroup { 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 d88f4797cc1cadf7dba29e2299de59760bb23e57..6d814bf14bc0a9f9a8de7b111d19d256dadd76ec 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.VelocityTracker; 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 @@ import android.widget.FrameLayout; 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 class SwipeDismissLayout extends FrameLayout { /** * 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 class SwipeDismissLayout extends FrameLayout { 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 class SwipeDismissLayout extends FrameLayout { }; 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 @@ public class SwipeDismissLayout extends FrameLayout { 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 class SwipeDismissLayout extends FrameLayout { @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 class SwipeDismissLayout extends FrameLayout { 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 class SwipeDismissLayout extends FrameLayout { @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 class SwipeDismissLayout extends FrameLayout { 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 class SwipeDismissLayout extends FrameLayout { } 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 @@ public class SwipeDismissLayout extends FrameLayout { } 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 @@ public class SwipeDismissLayout extends FrameLayout { mVelocityTracker.recycle(); } mVelocityTracker = null; - mTranslationX = 0; mDownX = 0; + mLastX = Integer.MIN_VALUE; mDownY = 0; mSwiping = false; mDismissed = false; @@ -300,6 +313,7 @@ public class SwipeDismissLayout extends FrameLayout { } private void updateSwiping(MotionEvent ev) { + boolean oldSwiping = mSwiping; if (!mSwiping) { float deltaX = ev.getRawX() - mDownX; float deltaY = ev.getRawY() - mDownY; @@ -309,25 +323,46 @@ public class SwipeDismissLayout extends FrameLayout { 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 @@ public class SwipeDismissLayout extends FrameLayout { 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 3d32d86cd49c48ac82a8d122d25dfce6303cc180..4fd19c37bf4737556efb5c01bb2d8ccbf13f06dd 100644 --- a/core/java/com/android/internal/widget/WatchHeaderListView.java +++ b/core/java/com/android/internal/widget/WatchHeaderListView.java @@ -103,7 +103,8 @@ public class WatchHeaderListView extends ListView { @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 class WatchHeaderListView extends ListView { } private int getTopPanelCount() { - return mTopPanel == null ? 0 : 1; + return (mTopPanel == null || mTopPanel.getVisibility() == GONE) ? 0 : 1; } @Override @@ -143,33 +144,19 @@ public class WatchHeaderListView extends ListView { @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 class WatchHeaderListView extends ListView { @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 538cecaec6167ff4de1e9d12d04639c0e0d1f7e0..5b49611fa4b09554bed06c370ecb528b54eedbb9 100644 --- a/core/java/com/android/internal/widget/WatchListDecorLayout.java +++ b/core/java/com/android/internal/widget/WatchListDecorLayout.java @@ -306,8 +306,9 @@ public class WatchListDecorLayout extends FrameLayout 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 b3c47a74fb5916856167cac859303ef68cc60672..a11e511c20b8cac70cb70df1ba58d07a237cfcab 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 1fda0b7a09a7c8b95a4fcfae73848ae664495c19..32c90c0329c15e3c1e8bb8caef0891f396c04371 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 679e8829999242bc9bde38aa9598cba581492260..eb105d292a434b38b8bbf45966364f78a8a44b7e 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 0000000000000000000000000000000000000000..905a85adc551003fd9536e8b1aa36cc76ad7d9b0 --- /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 1a7294f1424391b64a2b8063c2fe6dcb74859410..ba2d24552b315293b0dd577f55dbfdc1107e6e61 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 #include @@ -42,6 +43,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); @@ -174,7 +176,7 @@ static void verifySystemIdmaps(const char* overlay_dir) } // Generic idmap parameters - const char* argv[7]; + const char* argv[8]; int argc = 0; struct stat st; @@ -185,17 +187,24 @@ static void verifySystemIdmaps(const char* overlay_dir) argv[argc++] = AssetManager::TARGET_APK_PATH; argv[argc++] = AssetManager::IDMAP_DIR; - // Directories to scan for overlays - // /vendor/overlay - - if (stat(overlay_dir, &st) == 0) { - argv[argc++] = overlay_dir; + // Directories to scan for overlays: if OVERLAY_THEME_DIR_PROPERTY is defined, + // use OVERLAY_DIR/ in addition to OVERLAY_DIR. + char subdir[PROP_VALUE_MAX]; + int len = __system_property_get(AssetManager::OVERLAY_THEME_DIR_PROPERTY, subdir); + if (len > 0) { + String8 overlayPath = String8(AssetManager::OVERLAY_DIR) + "/" + subdir; + if (stat(overlayPath.string(), &st) == 0) { + argv[argc++] = overlayPath.string(); + } + } + if (stat(AssetManager::OVERLAY_DIR, &st) == 0) { + argv[argc++] = AssetManager::OVERLAY_DIR; } // Finally, invoke idmap (if any overlay directory exists) if (argc > 5) { execv(AssetManager::IDMAP_BIN, (char* const*)argv); - ALOGE("failed to execl for idmap: %s", strerror(errno)); + ALOGE("failed to execv for idmap: %s", strerror(errno)); exit(1); // should never get here } else { exit(0); diff --git a/core/jni/android_view_PointerIcon.cpp b/core/jni/android_view_PointerIcon.cpp index 6b634dfbef3e5c9a43249a5c5f7c15eb6101d6a5..4150636cae12d048aaaa2c8203c8c20a7d835b3c 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 5b6b192d331a3841ce887d56678b49852b948a30..601d0370c487ea130d3a46c1587f2b4656237492 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 2c76dee97540a121c9e395d63bc28fab76043aed..e15a0b8c8953baaf5ff86fccc162ebc5732fa7f3 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -104,6 +104,7 @@ + @@ -465,6 +466,7 @@ + @@ -729,6 +731,7 @@ android:priority="400" /> - @@ -3432,10 +3437,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 ad40645e8943e0994b2aca8fc773e77411c4c993..5512c0ad8a83b8df0b5d396fb2dac9487a240a4d 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 cb65f229eb52cde95a810c2e934f67a42614f331..c5d126392eeb5c0ce5dd51b99dd83aa407d5bd42 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 493a1ea977178e12b9c1ea64a2265ad66a2cf38c..0000000000000000000000000000000000000000 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 0000000000000000000000000000000000000000..be927ae2612fd33b24e124f7ab866e74bd5b7ba2 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 46b8c0f9a8c481d5b12bca82b0ddf2fb3190a947..0000000000000000000000000000000000000000 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 ce69944f69b2954347b50ad730df3fa3757e515e..0000000000000000000000000000000000000000 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 d91204b554182f38e3a971c2376d84cb66567ad3..0000000000000000000000000000000000000000 --- 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 5d7a3fbf98c0d03adf272a8d693bc3ad9b86450b..0000000000000000000000000000000000000000 --- 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 f49a98d59d2d91d47ef034a96a1c08b71855ec4c..0000000000000000000000000000000000000000 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 96a52e3c2cc67323d6fbf6591494ef125b298eae..0000000000000000000000000000000000000000 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 26fe2864d7c322e706bc3bc30212ac4b5dbb53f1..0000000000000000000000000000000000000000 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 777eff01a0a0ef3b1cf867c53bbf68b1e8d3b37f..0000000000000000000000000000000000000000 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 008333c66e6017b50ee828f131d2d504935d5186..0000000000000000000000000000000000000000 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 8e103c1655e16935e724b8b262c71c9f3b39433d..0000000000000000000000000000000000000000 --- 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 87779b113dd0d24c6bfa86f763b8895798e58651..0000000000000000000000000000000000000000 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 0000000000000000000000000000000000000000..8f00d6c4cb666489961c8331fd9b78c3bd26c4e2 --- /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 0000000000000000000000000000000000000000..63e66ec2441026d3e41dfaceda6496f45d8e8918 --- /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 c6470935e5d2775586e86c09e704ec014ee4b8bf..01df0dae6259afbcbb2ad52abd00db60b941e779 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 cd02e0db2fd56181c5e5f732d3357d23adc24621..0000000000000000000000000000000000000000 --- 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 e6442177660504f86cc13b8de2d705f3e6fdcc31..0000000000000000000000000000000000000000 --- 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 9f92361e70ea631821a28847edf5339914850795..4470754f41550107eaf66a3e204ff572f55cd908 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 d4796a0326316fb62e2eaf8e76cb41fbbd815134..f78d9b62a509b1d85927b503a50ea193fc0f3e8a 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 2c6ba2f7575345dc7c781976f2bff2c2e026c79c..c7dc5d34204a0d9d81cabea7a34e24120e00d929 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 0000000000000000000000000000000000000000..371469c43b132be714da6e3b2057562db9120c60 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 0000000000000000000000000000000000000000..e47726058e3efb32aae2e0493615ac3cd5190270 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 0000000000000000000000000000000000000000..19a1bd3177997ecd24a4dc70f9df82fbf34246ac 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 0000000000000000000000000000000000000000..79dc7332b60d852fdc79b970b6d2331951a28ef1 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 0000000000000000000000000000000000000000..6d921c0709b84101e34b7c9769eb61d46a32b593 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 0000000000000000000000000000000000000000..ecee3e137ef6731e73680bbd52e6d672261d1a4e 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 0000000000000000000000000000000000000000..a04b944f391fd06f133e480a361bb04234a784c0 --- /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 0000000000000000000000000000000000000000..3689172f72aba237e9578485d2892c9dd9da33f3 --- /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 0000000000000000000000000000000000000000..51aced25e619f3c931ccfb1cee29655ef1563888 --- /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 0000000000000000000000000000000000000000..5a04b1ca0b2caca86b6400f8de5b0a7778fee635 --- /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 0000000000000000000000000000000000000000..7f7ca1416b7612513d1fb52f1c466d038e51452a 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 0000000000000000000000000000000000000000..52120b8bef0263677767b2bbbe8b254eddb58d67 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 0000000000000000000000000000000000000000..d6e9be9e5daf234bb8974d4033af069d581e6882 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 0000000000000000000000000000000000000000..8d76393a1b631dde2f2e72088e58a5942a165e7c 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 0000000000000000000000000000000000000000..ca9c66e994ff5f5f28d6a1c3b835bc95616b1b40 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 0000000000000000000000000000000000000000..1aa54422738054df52f10a21b14dae21348ef582 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 0000000000000000000000000000000000000000..c0d72d70d6dd96106671f0204188d1cfa6738009 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 0000000000000000000000000000000000000000..d7c0ec0fd25e0c999fa7fc56103376e96fff12e4 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 0000000000000000000000000000000000000000..5815ba9d3767d4d5a9cb3414e24c830d5a174160 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 0000000000000000000000000000000000000000..41da8c0eaaa6dcdb1a71ffffbae52904d8667578 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 0000000000000000000000000000000000000000..975eb01cea4a276a84611c3e71713480ea953ebe 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 0000000000000000000000000000000000000000..af2042be7f5983405cd48323f89a6f4890c6774a 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 0000000000000000000000000000000000000000..9e08264156e6a6c9bdc6d656643c4959b2c09615 --- /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 0000000000000000000000000000000000000000..eecea13b59e276e7caaec6b617050d90ed63fdf9 --- /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 0000000000000000000000000000000000000000..eecea13b59e276e7caaec6b617050d90ed63fdf9 --- /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 686fb976cf1c18c057b7377d0b87c8effd12b409..9e3e89338dabe28c6beef0d207f6d448e5a1b7bc 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 0000000000000000000000000000000000000000..ed2655cb0ac8cd68002c3e45056c45a4b9fec3af --- /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 0000000000000000000000000000000000000000..f46d5e0e7c8211526b44c16efa6ef5fc70eaeed8 --- /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 0000000000000000000000000000000000000000..d58672e9cb42e6fd81fe7f5cd6a8d819df313b8b --- /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 0000000000000000000000000000000000000000..365609c97d758916d75c22087c26ef241ee910b9 --- /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 fc840d9fa73fa1890d4516a1f28a880c881f211a..08eecef1da95a82acf0d07faebdd62f4f361d464 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 6f7ae02388a34d3162cdf8ff784df72e9466e592..dac1e324be81d29c4a922bcf02dd75f1cf9bb565 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 ce8e20a1218790c139177ef419cf90a308fdd7cc..960b927a0e64f6e9ef1f9afa9c20525d791442a3 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 0000000000000000000000000000000000000000..b8772bc5ea3cb02b05f72ec9516f0162fd04f6e8 --- /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 038b766c749bd617b469e7c741e8f6d37dfad305..3478bb544934b452418db4af706b949ce0f32acd 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 ae8f203a7ce618805d34ad2417e2fa4837132e30..22e66d5139361b56e9f9daa03a7bce19d4bee924 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 37d0c6bf1af68c5cd0a55c40950e55e0d1619aa1..a1a845abfe3abf2cd179e4af770b24c27a0073b0 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 228f72454c0a600b6c9d8854253dda7e96795d37..96bda1d0c285bf2ec5cd83ac597d0d7214828946 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 0000000000000000000000000000000000000000..788602bf09ba5dd9771d4704c2fc8fa394c9fd23 --- /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 b465d97339a2e5276cecd7fc7fad8e3d9e8d0e22..a6e93c99160df0052dde7f075a11674d29b3af28 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 763f2a416bfb56c1241ec8cd8ef3d266878a13df..dd8a45d26172c452e24426900d9d18a4c9da59f8 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 b0455857e79e78bc6828c73f0cc9fed5cfa7426b..6fbd2b279f0c1eee5b38ff199dcdc3ed8348b133 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 36e8e57b29880f6d9a7ae2018b7309294bd35957..731fe16196345e95a6f074ec97e1fce623160494 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 995272ad80efc3b7d31bd81f741399c2654466b1..77b693058e82d30818d89ff9ba554bbe0255f5b3 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 c6b7d3a70d97354ef8af0765e11592bbad372c79..ee56266390f1304b49318ed4bf17fa73a6305291 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 002be4164c9a87b6acb511552fb5c8709cb1e347..0000000000000000000000000000000000000000 --- 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 002be4164c9a87b6acb511552fb5c8709cb1e347..0000000000000000000000000000000000000000 --- 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 ee25ae4023ff2c20d94b20efcbc1f3c4de0bc58e..0000000000000000000000000000000000000000 --- 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 ee25ae4023ff2c20d94b20efcbc1f3c4de0bc58e..0000000000000000000000000000000000000000 --- 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 bec3dacb9101125e897288cf81b1f1ac15428254..0000000000000000000000000000000000000000 --- 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 bec3dacb9101125e897288cf81b1f1ac15428254..0000000000000000000000000000000000000000 --- 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 7420393d3e51423aeb282ec84a7aa524d39478e0..0000000000000000000000000000000000000000 --- 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 7420393d3e51423aeb282ec84a7aa524d39478e0..0000000000000000000000000000000000000000 --- 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 eae989f9cd198cb95ee8ef2c35d83c74a5c85392..0000000000000000000000000000000000000000 --- 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 eae989f9cd198cb95ee8ef2c35d83c74a5c85392..0000000000000000000000000000000000000000 --- 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 1d2cb69904b0c91dc643909c6885498c124d1e44..0000000000000000000000000000000000000000 --- 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 1d2cb69904b0c91dc643909c6885498c124d1e44..0000000000000000000000000000000000000000 --- 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 5641650b8691b2dff3b75dfd35c659b8ba1251b9..0000000000000000000000000000000000000000 --- 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 5641650b8691b2dff3b75dfd35c659b8ba1251b9..0000000000000000000000000000000000000000 --- 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 7436f9804c510e52b77581366a2e3e9ff7490c00..0000000000000000000000000000000000000000 --- 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 7436f9804c510e52b77581366a2e3e9ff7490c00..0000000000000000000000000000000000000000 --- 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 d283df56cbaf54f4c9905a25f74a49bfa4bbaa8d..0000000000000000000000000000000000000000 --- 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 d283df56cbaf54f4c9905a25f74a49bfa4bbaa8d..0000000000000000000000000000000000000000 --- 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 6d9b5014b61511774cda831fa9012879a70df06c..0000000000000000000000000000000000000000 --- 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 6d9b5014b61511774cda831fa9012879a70df06c..0000000000000000000000000000000000000000 --- 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 f004120a62e4085231f1e2702b7daeaa27cde165..0000000000000000000000000000000000000000 --- 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 f004120a62e4085231f1e2702b7daeaa27cde165..0000000000000000000000000000000000000000 --- 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 feb9f4faae32b23627145bf4177ab0cb1f88e7ab..0000000000000000000000000000000000000000 --- 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 feb9f4faae32b23627145bf4177ab0cb1f88e7ab..0000000000000000000000000000000000000000 --- 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 8962cdf28859073f00a6f04394d09fddc153e196..0000000000000000000000000000000000000000 --- 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 8962cdf28859073f00a6f04394d09fddc153e196..0000000000000000000000000000000000000000 --- 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 f73c41d01e9c343e5a8f18bf8ab156b20ee76818..0000000000000000000000000000000000000000 --- 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 f73c41d01e9c343e5a8f18bf8ab156b20ee76818..0000000000000000000000000000000000000000 --- 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 6f20fe0ecfd95557cf1807787b15ca465d392122..0000000000000000000000000000000000000000 --- 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 6f20fe0ecfd95557cf1807787b15ca465d392122..0000000000000000000000000000000000000000 --- 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 38b0806a1d58f4101fcbf0dd649c6ee1744d6ff2..0000000000000000000000000000000000000000 --- 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 38b0806a1d58f4101fcbf0dd649c6ee1744d6ff2..0000000000000000000000000000000000000000 --- 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 788c08868012478afd276e87f597b902fde00359..0000000000000000000000000000000000000000 --- 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 788c08868012478afd276e87f597b902fde00359..0000000000000000000000000000000000000000 --- 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 4a34874462da02e9c23e3158e0e5779e6c411bc8..0000000000000000000000000000000000000000 --- 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 4a34874462da02e9c23e3158e0e5779e6c411bc8..0000000000000000000000000000000000000000 --- 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 368dea0ed3959d094420acb70f071d54357b4565..0000000000000000000000000000000000000000 --- 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 368dea0ed3959d094420acb70f071d54357b4565..0000000000000000000000000000000000000000 --- 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 a58ad05c2ea7a82d77b472df2d7390113e3143c3..0000000000000000000000000000000000000000 --- 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 a58ad05c2ea7a82d77b472df2d7390113e3143c3..0000000000000000000000000000000000000000 --- 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 0e703b100102584803cbb6e6b845904e3ff041d7..0000000000000000000000000000000000000000 --- 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 0e703b100102584803cbb6e6b845904e3ff041d7..0000000000000000000000000000000000000000 --- 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 9244ae4398b1d11fd319978f0bda642700ebecbc..0000000000000000000000000000000000000000 --- 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 9244ae4398b1d11fd319978f0bda642700ebecbc..0000000000000000000000000000000000000000 --- 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 f325ef5267b9ae557eb7ab273f5080c3e360a085..0000000000000000000000000000000000000000 --- 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 f325ef5267b9ae557eb7ab273f5080c3e360a085..0000000000000000000000000000000000000000 --- 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 724e73433fcbc9f30b4939c9b589ccb1e9c73aa9..0000000000000000000000000000000000000000 --- 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 724e73433fcbc9f30b4939c9b589ccb1e9c73aa9..0000000000000000000000000000000000000000 --- 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 92fedd725fe6b310091ea224a6581294a86ada87..0000000000000000000000000000000000000000 --- 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 92fedd725fe6b310091ea224a6581294a86ada87..0000000000000000000000000000000000000000 --- 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 9748ead325a287cb1f42028cc491b5187b9ae308..0000000000000000000000000000000000000000 --- 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 9748ead325a287cb1f42028cc491b5187b9ae308..0000000000000000000000000000000000000000 --- 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 89a5ab0de880ce1fc24bfd5f43a96f207b6142a7..0000000000000000000000000000000000000000 --- 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 89a5ab0de880ce1fc24bfd5f43a96f207b6142a7..0000000000000000000000000000000000000000 --- 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 b301eda73f498625f32c93a771ea26da03ae971e..0000000000000000000000000000000000000000 --- 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 b301eda73f498625f32c93a771ea26da03ae971e..0000000000000000000000000000000000000000 --- 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 3e499d30039c5d60f01919629ca845468703d86a..0000000000000000000000000000000000000000 --- 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 3e499d30039c5d60f01919629ca845468703d86a..0000000000000000000000000000000000000000 --- 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 ae7b59cacfec3ea537817cc32d31d86ebaa9aa0e..0000000000000000000000000000000000000000 --- 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 ae7b59cacfec3ea537817cc32d31d86ebaa9aa0e..0000000000000000000000000000000000000000 --- 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 5b138f1e087c716751843ec91a509bf31a6ad80f..0000000000000000000000000000000000000000 --- 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 5b138f1e087c716751843ec91a509bf31a6ad80f..0000000000000000000000000000000000000000 --- 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 33a8b08fed499a8d09b2672f04bda6c6f380d6e7..0000000000000000000000000000000000000000 --- 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 33a8b08fed499a8d09b2672f04bda6c6f380d6e7..0000000000000000000000000000000000000000 --- 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 b1fbcb1324bdbc4266110879d85e2074f5423a4f..0000000000000000000000000000000000000000 --- 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 b1fbcb1324bdbc4266110879d85e2074f5423a4f..0000000000000000000000000000000000000000 --- 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 5ebbb22f409b2881298d5cd00ca8ffb9a5126fc5..0000000000000000000000000000000000000000 --- 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 5ebbb22f409b2881298d5cd00ca8ffb9a5126fc5..0000000000000000000000000000000000000000 --- 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 29c64eb4c04160dc9e5df3151c7df780c6ab936b..0000000000000000000000000000000000000000 --- 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 29c64eb4c04160dc9e5df3151c7df780c6ab936b..0000000000000000000000000000000000000000 --- 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 6ce5853de0cd49a4be9607339a0845f07fdc66ce..0000000000000000000000000000000000000000 --- 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 6ce5853de0cd49a4be9607339a0845f07fdc66ce..0000000000000000000000000000000000000000 --- 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 c570cc7e645f7d504ea9919f93a911b8363a5fa0..0000000000000000000000000000000000000000 --- 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 c570cc7e645f7d504ea9919f93a911b8363a5fa0..0000000000000000000000000000000000000000 --- 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 8852854b41105cd1c19b7b3ff1f8e2d1c240216b..0000000000000000000000000000000000000000 --- 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 8852854b41105cd1c19b7b3ff1f8e2d1c240216b..0000000000000000000000000000000000000000 --- 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 9902cdef45cb83bc63cd81046e1dedbbceb9705b..0000000000000000000000000000000000000000 --- 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 9902cdef45cb83bc63cd81046e1dedbbceb9705b..0000000000000000000000000000000000000000 --- 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 492658d294846fc26de258b804fd8f9f60e8e5ed..0000000000000000000000000000000000000000 --- 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 2caf8f8bc8077c728711f0aa82cd63cf6ae14d66..0000000000000000000000000000000000000000 --- 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 2caf8f8bc8077c728711f0aa82cd63cf6ae14d66..0000000000000000000000000000000000000000 --- 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 54eb40bbecd0dd97fa762b1e849e4fb712b7231a..0000000000000000000000000000000000000000 --- 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 54eb40bbecd0dd97fa762b1e849e4fb712b7231a..0000000000000000000000000000000000000000 --- 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 5d7a3fbf98c0d03adf272a8d693bc3ad9b86450b..0000000000000000000000000000000000000000 --- 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 4b59f21ec69a7d3c60b0fa394b3b5f5fb1ab1b4a..e34d0dce9bd82ac5f2da0a59bc81c3b4e7d9ab2c 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 54bddc753e3b78bf7cefa064bacb4b5dbf5ea77c..eb1208824d449f6adda3d221ed2c8a6785fe7e78 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 ee6b806c4b290cbe4549fc09feb6088f7c58075a..ef5831cfeb4fab890506b33cbc91f238d490be07 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 7c3f2a44eef0e5e27770f4c8211a38f2ad3dc2b4..4dd9a79a26ba94abbf3f3d0abad18f1ebaf4b6a9 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 50e1327f4a9cdff58ec23e94b46cff5dacf4e7a0..b1146f394533b523ee23c7e893fcfe5c50a76f5f 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 cadc0bc9ebd4b86df56b03809cb411b0d62950ca..715141400a97ab694b58ee3c2ede082f8322cfe9 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 4d8915b46202cfe67f083a24f87f302044e18dac..4def3fe3ebb73bc273f5ae6ec3925c59a1175c85 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 8d893e53a91cdf3855ee8e7c6382c73b71dafe35..3c8d3bce46278bcec27c2080bbc8225ba82a0e38 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 e8a3c028eeaa1ad3515d8ed1d34dbfdc0d0932c7..b809f3cfcabb15dd6b90c4a6f1c5283cbe6f02aa 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 137d924ac1fc4fe0699fd4c73a636de67db6eaf0..44bd36a9122d315bee959e6b4cffe98dc3cad74f 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 8037681ea37a771e7edf18f42b17525448061190..218221e073ccd907a785f2b96c956b9196cf949c 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 eb4d2555f9f4ed6784b137a6ff363313b7f0db14..12679774e1e3a5b081aec33b4ffed77b026e45bb 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 9817447eca56d8b8131ce9bb62bff6909a1dd632..77c4e48a452f0e32141e38c1e6308464313819bf 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 9e41023575f996e870d965810c89243bb879c759..0739f24651e11be1472f011c68b0574649bb3c71 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 c6e04d71c5dbf740f7c76c2893178ce4d3e092b7..d650f15c09b01e560635ab40dc59062268fbf53e 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 c6e04d71c5dbf740f7c76c2893178ce4d3e092b7..d650f15c09b01e560635ab40dc59062268fbf53e 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 c6e04d71c5dbf740f7c76c2893178ce4d3e092b7..d650f15c09b01e560635ab40dc59062268fbf53e 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 ea1c1a5bda83f220c87162df5e645157643c24b9..2db6686a0b6f6f7c8570134feb1c9ede2fa353de 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 c6d6663c2d6a626e80fccf68cd5d8ffad691003a..c140e0cf8b5a70d3dd4e117703ce00ecfde3f38e 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 9263b59b65b99bb5fbe04b5b976aaee82a3ab409..91891b58bf027814c37832101c33b30731df7601 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 97628fc768363d3a026a266eb0ef3231609c6795..1ab61c6174ccfd4d3f82281e7e2b5dbe4a8b62e5 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 128a66f394da4b519b6cb4c59da2d14eb2433f8e..1c9289b37599583c0e7139789a2b28db81c6f7ba 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 c4c223bd70855fbac9d3d3463efd09004cb69859..dce680d01b91487c634b4090a64100be4738406f 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 e52eeda9f7f3f577a61ed0506609ef6a7b185e00..5d63bae107b73fbaa036aae221b10ccd9b38f7a2 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 9da228e40d01d9e4e7325130830f963f37f7e834..faa5686593daa3d7d52749b0eda22a45e5492f7c 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 72757a6aae6b547281ba6c7d1aff53b499c85033..4ab2a9a9589fac04de679bcb9dcf0ccf71e7c157 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 a233361d579219f2f9ef3a28eee6e4ca585e73e6..290e885c9ce78e46da5cae3f85a90288f17ba547 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 ea45c1a1764226da8eb0c0bd28746a4dd60ccadf..96be6b0edeff57c53ada572edb9823c5a54e9e76 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 5f2d3d62d50e9da44cd1e49c06d6de4a37417c63..c3d1f6dbcb1bfb3060862928162436b94d5cbb0c 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 cd3659a7f0f9d54788dbe657652089664c6a0c88..9731aba90eef0900df6ee43c455ea183194dc0a4 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 160efff177e38b21bb64227f9e334839d1746ee7..14c9385749a48e7d8366ee7c5baf5e4c89f0b24a 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 fefca0ccd58b66cc4fa5469cbe757b06a1a0206f..aa90d5aa48ac9cb9fe90aabb0b4c22c9b2151881 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 cdc6d4228a9ed18225027cea9a8dd437af66510a..563563561356f00faee29fd689ad25748a9c0179 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 b82470fe2254cbc749a4c3cb27ebe90b9e128737..a1f8fc2bbc209ff2393e002d202988d52e998f63 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 36c52057f38a61f8a70fe84961a9fba681163b54..705cbe805ae567e3f75d6a543a2e7f26d00dd5d6 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 5550900543e40f023f1675551724ce78dd3ad378..2614d4fbddca59fb57fa569f2f63b1d237300f11 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 a8fed8b577b599c647ab4067dc205af9b948cec5..55de3c3de0fea4247bf3518d59bc68a7ffc9c34c 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 00264ad8969a0fc166bd06e59468abb1feaf0900..7f9bc230993c797a2fe57f7053f0fd45aca16c3d 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 feaef821e5350c1fdf95917a58f96bc684b89c5f..d00c8398848ddbd2c71d294352c0ce26b1831454 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 7cb97a7c56b78b54bd489df6fc2ff449ca74c2b5..ab8d33a7352fbb318549f9f0363b4c046b19c248 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 b23a96637c5784d28a1e0f9c5d25669ceb32d3f2..4e704d67767fbb4416f124a261ab89a08aedbbc0 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 4f48a944f79835d50c697184f1b60b2571f962a8..21a50870c0ddda8b1afd71f5fcbe3be946e70c72 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 18f285f96d8979244c0c384b6bb7c732e17099b5..84ea55a5e7474c1181cd39937ca5f0662ced040b 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 9952a7c5a109cea746b2dea56a60d658d8dee7a3..d3414518ad26c19074891b59c76c84809b6b959b 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 ff2e97482524838d3d033e5a9107b9fe44d7bbd7..b65eb4e5d83c775eb71ac0324db0a4f09e420d6e 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 d3640e5c41537177c98250f0033d4196d57a6435..3ed78181ffe6af045a7e621dbc69c844c354b7b7 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 895b770d771ce0ade5b57c456b208116890eab28..24150a782d22084d8749e8a39a9db854ff8fbea5 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 eb86a77e0e5d2b3b3ba913bf423d8e34b6c9f6a9..5d7aaa4510ff78edb121d664f807fba1b6cc99fb 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 423db1d195991c14e515f33d870823a40bc1ace1..09b405c2774e7ff2b7433f002e2da80f40bc7851 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 f936b85966a77323076b830e9674237dfaecce85..2f78573275785fe00cd301f4cf716cd182a8534d 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 8951643cfde01ae688b7bd93d0311f45cc05ccfb..5239d8f6a84ba405e112a21c00d3025a7b7643f1 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 e096aecd018878a65cc226c104827c8301309314..820963ff15123a2ff449471b29ce93e19132411f 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 80d331d6ec34e263419732e511256114535b544e..fbcb1d15e8fd8300f726b56dd350577640cf576e 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 691da31748c685b94d1e53ae759f809693e1c738..75b57cba1a8ff6e6f43038e064339c6dd96c38e4 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 3d5cfeddd91c8dfe5351bf6e9e2f5f9ef262b92d..75ee39d1d3ef771a490e291ab18352765de28ced 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 1f53e8dc1bfde1b5a8b1b5a59068fb87ff37acbe..4a15417fcfb6f0a146ca657530b1a9096062f6bd 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 f103aa91dcfe30a315c212f6e2a297f99d60a979..f0204d0f2d347831a650a29b3c63acd6d77b6685 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 9cacb117cf7ba99d7e9aafb00fbd9314bf08d8c5..9fdf55b8a31db4bce7ddb2c2322b2cf9525a97b2 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 9658e1e1579096b781323a7d0406ca975be8091f..fc26602b1eca1bbaac0522346750d5425474b26f 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 dbe29ee33993a30b047c7263b76974dbe123c46e..5a88c933ec63e75b69a7772de005163fb2efedce 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 4f3b09fd5ca6a5a385911a9b4505f87d3c689da9..5947ac27ef0cd265017722ef5e9ef18678f9ed41 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 64db1c2ad70b7dac5b2ee9a5592e7cca8f3f692c..eff872fd579e5932bf7344bfabc9c858e03e5445 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 4f3b09fd5ca6a5a385911a9b4505f87d3c689da9..5947ac27ef0cd265017722ef5e9ef18678f9ed41 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 192d9c1a1f95470d71794949b1a50bbc3a684058..40230fab26cd7f9466dbe005eb69f70cf89360f6 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 bf445ef3fd0e375e4e210e2916376f77adfd76e0..ae4a6eedf4fdfd7678c4a7add379c8abfd024fd6 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 a12f4992992949b0e2df448314e321c95bfb6e32..1d8c669ac55b49a8dbcb18254111e9bdb1d5bb17 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 f2de4e013a78840ebea18803ab69d9ad0d9cd2f6..c8f27b1724e361fc0a5d89bcd33ca55ee9d5a4a0 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 b1b14f9d22922d512984fca6b6fc7dbad46eea2a..a126950ca9dfd4e0270088c772f8634f13cbfdc2 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 f3c8e7bad0d6c9ad15795733ddb8e6e8a9cc7e9a..098f1940fe96a5d4ed5c65c188ecbaea03135bb3 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 a94c3b40d5dc05cb2cddb0a632d856743caf38ab..c2bcbf398d869be8607bc8e6526c26e32a406b93 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 a19643b13533ca63e0391fa7000df5243a033e95..99f1163742eb34ce68ef38fb61537f4941091c64 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 624b00466a757e02626b15630e09520f7eac0d46..339ac59d1a907fcb422cd6e5ff7be48901652689 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 395b049c1d2d700b16ce72adcc37014f889fdbcd..7bba6fe1e26f42c360ca5d92f8a8c16541b30038 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 d43282db768683d9f2452cce443be0218c8d536a..c2b919eac86b5a20dfe530271c242481f294aea9 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 cc750d6f37bbb66c90c1548e235fd0e821c40370..261ec7ff3eb9e5a17dc36a1d5b30c549bc95cb62 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 0000000000000000000000000000000000000000..11092b2cb9e953e3da8d9fef74e286a2a4fc918f --- /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 20226e9c856ac46650e432373ef5494a888cdd50..271e8855d40c0ff8a49dfe7fe04d41d15fabc9cd 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 072b69bcaefc9e29974d142efaed5083758419f9..cd67c80e56cb4aff9ee4460135c717eb68d798c1 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 c2515908dd7b3ca174467325ba2afabf6e64dbed..fbbca8929eb19873eec6d43025a2cf16ef0712f5 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 b0d84ea51ba481ee1368065e4f1ea1dc781cc3dc..0cabf8706a7dd33c5edc2fb38f7347b6a5fd3b4a 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 a089fd42feb62c79032ee11bed605476d89a78dd..1043e93b07c89ba96af722f1b1445db71a311dfc 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 704ade8e27ddd13624c929a0af92ca5b86f746af..aaf5253fa3c5e174aff092b9b48ab2c6bac73136 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 24a03b24e0661a9cde96764794bef852b4ce8fee..3136c33b51c68aab2700d8f8138d6d8750a0f4d7 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 e5a2889b70545e16d4e859107af0d903bd3a1d50..cc213e639ef90d7dcce20fb187a4af5636e92416 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 0bbfe3b8a8c1020b1377b681704552edddab1047..63af1e256183d3f47e3efdf996c13ba8bf781607 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 0000000000000000000000000000000000000000..79acf84b7e3f98fe4ed771c9331465ddc1ace9b9 --- /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 0000000000000000000000000000000000000000..79acf84b7e3f98fe4ed771c9331465ddc1ace9b9 --- /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 0000000000000000000000000000000000000000..aa822a32c97562f6a2a9debe5d8220c487833503 --- /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 0000000000000000000000000000000000000000..15786b4a23f89086fd1633d4abe24cee1bddc65c --- /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 45eb9812f137fd7908f83d0cbd98f199d682b669..72f589b3d337600404d27d2af3b218b557e7d48e 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 919519e5832ae8d9403b2f7af065d9a88d105660..d13d15468825366fb941391f12ac7f5ad83a1bae 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 81b53e71b5d7da774e2fe4ce18dd504547ec9cc5..03d3637b150db4a0451c149ad3d58ccee2451dd9 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 0000000000000000000000000000000000000000..4c8b39ca92a7b51f693cfda5a56a1b1a5c498eb4 --- /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 d579434d5e30b1b3fa1a32b3d33cb2ac4c0b87f0..3c4904ccf07d1cd22b3ad4ee78b3e5c61062ded4 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 a1c0921482adfeda3f0f03b5bbb13f1a22077571..46ed97d8318276c641074c0e81ee088fa8c5c675 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 a9f6e226510cf55880e5ae0eb69c24084f484145..0053c12d9d84df16a1147373fc05b8f024142f96 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 2313b26c1f8d55e9b095e65935fd3d1fefcc4485..4d210f6e2f9f740fc65dba6908222b16f8d6a600 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 4ae4367e8bc79e017665cdf46a2abeb89ad3cad8..0cf398b110858f3c57c3a20f7648c4f624d3ecf4 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 bab166a0550a18b41c9ebbf3dcc11d07f17852b3..7154e94124cce8303798af0a59f9b0cbe060683a 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -307,6 +307,7 @@ + @@ -377,6 +378,7 @@ + @@ -417,6 +419,7 @@ + @@ -485,6 +488,8 @@ + + @@ -724,6 +729,7 @@ + @@ -1108,6 +1114,8 @@ + + @@ -1115,6 +1123,9 @@ + + + @@ -1218,6 +1229,7 @@ + @@ -1411,7 +1423,6 @@ - @@ -1653,6 +1664,11 @@ + + + + + @@ -1670,6 +1686,8 @@ + + @@ -1701,6 +1719,7 @@ + @@ -1739,6 +1758,7 @@ + @@ -1769,6 +1789,9 @@ + + + @@ -1779,6 +1802,7 @@ + @@ -2724,6 +2748,10 @@ + + + + @@ -2817,4 +2845,10 @@ + + + + + + diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 0e98adea434af449b4668b7c744a48cf861a99df..b19858ef194de4b4d4882b4caa7913bf2d0a4f1c 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 0000000000000000000000000000000000000000..369d9b162d0959c2e0f9e840d55192bb7022306a --- /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 0000000000000000000000000000000000000000..9396e5206dd92a148f631f35de81f8836e3d2235 --- /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 0000000000000000000000000000000000000000..e0c9f1ed73a9a5f8f37e2d8636127bde4f0043aa --- /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 0000000000000000000000000000000000000000..76010db1058068444fdc67a18cc353dd48df2de2 --- /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 0000000000000000000000000000000000000000..891be3d93f7e65e92f77de2ad259019ca403d81c --- /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 0000000000000000000000000000000000000000..d048222a97bf4241619638336015f0842cd0a7ed --- /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 0000000000000000000000000000000000000000..c11dce29162228bb50fab01389fa4519d9630d81 --- /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 0000000000000000000000000000000000000000..e728c87784f0660b57adb118efd0e1e45b52da55 --- /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 0000000000000000000000000000000000000000..fb9d1fca1fb16cb28b79da21823d42793f7f9671 --- /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 0000000000000000000000000000000000000000..ffcebd00d4db7fb2a4ce75ea6d8132c100efa641 --- /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 0000000000000000000000000000000000000000..f9ca4c0ee0e5d3275767826b0bd26e636dd6fc93 --- /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 0000000000000000000000000000000000000000..63ee221ce452be9dfb05af03f411137f953d31d0 --- /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 0000000000000000000000000000000000000000..9e99e731d32243f3bd00e54207baf38b48efe510 --- /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 0000000000000000000000000000000000000000..ca17f87b749d0da1eb7a45d78d75221a327f07e6 --- /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 0000000000000000000000000000000000000000..aca6ab9d7242dcd455483b5aabf6f233591a8ac8 --- /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 0000000000000000000000000000000000000000..7a5df64927f5a3448de5bec726d828121cd7ba56 --- /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 0000000000000000000000000000000000000000..af4c24d781cc05512ae645bef002b328d0eb8b13 --- /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 0000000000000000000000000000000000000000..d8bd829fa0c574bf5acce136d107f713d25005e9 --- /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 0000000000000000000000000000000000000000..c3286a835eb091bb2eb1d381aaf33f5ff32b5dc7 --- /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 0000000000000000000000000000000000000000..6a862ffe1fc2aba7eac071abda740dee266f9d24 --- /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 0000000000000000000000000000000000000000..9881ce6849be80cfce787be94e37c648675f1fab --- /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 0000000000000000000000000000000000000000..65dc88b17d3bbf65f936adb8bcb1ee15b376b6b8 --- /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 0000000000000000000000000000000000000000..b119899d33d72aefb930d7a19b022384c9948cb7 --- /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 0000000000000000000000000000000000000000..d19abe3d9650875b4b7a6f8df8501de8d7444ca1 --- /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 0000000000000000000000000000000000000000..9c48ca4e112d9d0acac42337e3c60857f145c0f9 --- /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 0000000000000000000000000000000000000000..55afb300bec17e4ff2ba48c6353acbb778c2cdcf --- /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 0000000000000000000000000000000000000000..19d218907b7783ca7c560c16de8d61cf783546ed --- /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 0000000000000000000000000000000000000000..2f658abfdfb0566af41a4aa9a06786df09471036 --- /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 0000000000000000000000000000000000000000..f6d915847e09ad587cb785ba6e1a2a468ead7d2d --- /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 0000000000000000000000000000000000000000..b16c79f3caaced6d6aec9c2ebd67bb97803a8432 --- /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 0000000000000000000000000000000000000000..0f826e399bf5210e747981aec9b9fb769b34820c --- /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 0000000000000000000000000000000000000000..de60506169ae88137e4a821c5e230040f56fec31 --- /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 0000000000000000000000000000000000000000..4368791353f0731c29e4c1041c56b73e56d5ec63 --- /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 0000000000000000000000000000000000000000..0ef8e0d7e05aa99d9f5c627d28427733ade6a7c7 --- /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 0000000000000000000000000000000000000000..08df08521bbd12c5b04ab263accfc5863a3f6d54 --- /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 0000000000000000000000000000000000000000..b2aae91a2ff75e1c102b834d32bcb6ffcbea6c82 --- /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 0000000000000000000000000000000000000000..d88010f9b13fb5d6c15e9f8396ad8dc98cab8b29 --- /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 0000000000000000000000000000000000000000..bcbbaf0ef762d94f898c08245c9519275d09a515 --- /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 0000000000000000000000000000000000000000..bfadc87c424b2e4d5e2adf65f68004bbd89c6bc9 --- /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 0000000000000000000000000000000000000000..df273007c495b191fde6e54019ec4ba70c375add --- /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 0000000000000000000000000000000000000000..c91155c64fc4d981bbca9899590e295ca13efaf0 --- /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 0000000000000000000000000000000000000000..7e1276de83156d13fca5307fac73ab48f27fdfe2 --- /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 0000000000000000000000000000000000000000..e7326e7452cc96bdaf38d74540fe6712a742ce3d --- /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 0000000000000000000000000000000000000000..5f9d84e41eb06c635274b59638973d0d01754582 --- /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 0000000000000000000000000000000000000000..4ebfbdd970b0e9a48bf11a872a0851b2997cb0f8 --- /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 0000000000000000000000000000000000000000..a5e7ef8b6ad5592c4dbc07decc2dbf587b1cbefe --- /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 0000000000000000000000000000000000000000..978acb25a6f5e47392a1d41bfc032bbf749c092d --- /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 0000000000000000000000000000000000000000..821ac2352e55d91a58d9859005bec3206e90c34c --- /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 0000000000000000000000000000000000000000..062bb90d58e61ef40581033fdb33e9bfc1a74e42 --- /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 0000000000000000000000000000000000000000..7c6be7a6d74592427a1a6ae982de46a77c182507 --- /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 0000000000000000000000000000000000000000..eaf702c1d1ee298add57c6190e98d83335b7141d --- /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 0000000000000000000000000000000000000000..d6c4f1235fc629c98abe132587d2613503ec9f95 --- /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 0000000000000000000000000000000000000000..5d93bd9e57c1107d4f93b60927e656f7b8c34547 --- /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 0000000000000000000000000000000000000000..edafaa3da3e52425614c22df3412f98f057fbf1e --- /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 0000000000000000000000000000000000000000..9091eb67f0294518681672bb075f70d392f5e6c5 --- /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 0000000000000000000000000000000000000000..269519ec9eb498fedb0e13524d8f0efae97f6fe6 --- /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 0000000000000000000000000000000000000000..8b8446efb070368da5cd3e2334d7582097478863 --- /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 0000000000000000000000000000000000000000..4b3966cecf9e92375ed9eb476798b499b557cb27 --- /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 0000000000000000000000000000000000000000..3078b6a122315e1cda705057e2a3cf52a35bb55f --- /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 0000000000000000000000000000000000000000..444161432d107ede7bb8f6747629f9b710485bb8 --- /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 0000000000000000000000000000000000000000..379adb428d7ac545b7299f28d754984e982b1325 --- /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 0000000000000000000000000000000000000000..2b64f0601655df7d22ba65dd678b88022c395759 --- /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 0000000000000000000000000000000000000000..67422f96b561fe98124975fa5ef6f261bc6e2fbd --- /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 0000000000000000000000000000000000000000..0a71e6aa9f9d23afd073e0b162a3d9a43a06fb33 --- /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 0000000000000000000000000000000000000000..c798e246bc0e2a4fbaefc7a058fa355e17585ff5 --- /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 0000000000000000000000000000000000000000..3487eff977462bf974f64f08f42748d503fc6be7 --- /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 0000000000000000000000000000000000000000..c5f37183f2e8a524939dbd48c193d4be68dfa3cb --- /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 0000000000000000000000000000000000000000..753fb6a5d709ed09d0409528f9164d5ca53eb54b --- /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 0000000000000000000000000000000000000000..999b145ef932e1cd00027cc1865f1182585f544e --- /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 0000000000000000000000000000000000000000..989a41257b9fd31c76f54c564901e8d820d38803 --- /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 0000000000000000000000000000000000000000..3d404854c9420cc9093a2b807688ab77f4ad683b --- /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 0000000000000000000000000000000000000000..bb7ec40cd49a110bcf31f1c709c49a5a11506c72 --- /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 0000000000000000000000000000000000000000..c27112810a96a2ca2859c16f711a834dd2b31dc2 --- /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 0000000000000000000000000000000000000000..0657ab00aa63c2b98c9b5556ad2bcdc0fd3e2355 --- /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 0000000000000000000000000000000000000000..a7bb4e873e9c43a7f4c31328ca8d41a5020788f2 --- /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 0000000000000000000000000000000000000000..0cffcc30301e785e48ff6b3408fea0054a172c49 --- /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 0000000000000000000000000000000000000000..5ee015c51fe7b6e527e9f5c28bd6ccc363293fa1 --- /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 0000000000000000000000000000000000000000..74409a1d6943a1cdee4d42f906d5d56bca22e4d3 --- /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 0000000000000000000000000000000000000000..567a011bff4506a13bbbb5c4c9231d78b23b3920 --- /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 0000000000000000000000000000000000000000..a11c9f8f212303d9b9e9b45774b579dfad00c6f3 --- /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 0000000000000000000000000000000000000000..6f39b91bf6890aff11b7cb319e85d336b955d193 --- /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 0000000000000000000000000000000000000000..14824ee4fb5acd55fe2fe06ed3fa76a1cf3c4de6 --- /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 0000000000000000000000000000000000000000..6d904d2374d8b91b596b5065c3218e2847ebce62 --- /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 0000000000000000000000000000000000000000..fb480bb0a9fa2d4238db2ac54dad3de720580120 --- /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 0000000000000000000000000000000000000000..34409ff698f641fc60be388f27a1d126297593e0 --- /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 0000000000000000000000000000000000000000..2958388b84e80badcba0a52b5ab447963fe9f057 --- /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 0000000000000000000000000000000000000000..4050be57565663d27c26c2d13f94132f24652d24 --- /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 0000000000000000000000000000000000000000..1a9616a7e7b8c67043be1cb07ca2432af64c2119 --- /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 0000000000000000000000000000000000000000..a15728ff5fb95d3f406aa51b1a9f62297ef73b41 --- /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 0000000000000000000000000000000000000000..60200295354d9b06799413b26d999e6dad156190 --- /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 0000000000000000000000000000000000000000..105b2970e395dc1ff19544c488cad09a7faec292 --- /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 0000000000000000000000000000000000000000..55f18baa22637deb52ff9797ab10b4ae21b5673f --- /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 0000000000000000000000000000000000000000..0585d72b4d4af53cd50fa8b9add686ca0fd0d689 --- /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 0000000000000000000000000000000000000000..d98f1018dc7273f46252e71fd4cb8e42bb353971 --- /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 0000000000000000000000000000000000000000..8f7181852030ade50a2c108c72c6923d33803d48 --- /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 0000000000000000000000000000000000000000..ad5fd1ceb0d776ab1234b38e78f86070a862392b --- /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 0000000000000000000000000000000000000000..e5d0d8c047dc27b5831c922aa6724f6fc1009830 --- /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 0000000000000000000000000000000000000000..2e3e30b41608716ac74995075b0be549a255a352 --- /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 0000000000000000000000000000000000000000..9d4058442b38e23ecacc220508020b46fe29a1d5 --- /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 0000000000000000000000000000000000000000..9a8cb402fda482398837fe6d36c0f025f76652e9 --- /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 0000000000000000000000000000000000000000..6bb1866c09a82dc3f294abe801e0705eb802ecf1 --- /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 0000000000000000000000000000000000000000..a488cb61568163b45e86ba1f8904fed855b41e15 --- /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 0000000000000000000000000000000000000000..ef149cec71146b66bcd0ba6e1a48206c6c0e12fe --- /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 0000000000000000000000000000000000000000..c9423a483cc1bdc3c645bfd88bdfb92e4855d0de --- /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 0000000000000000000000000000000000000000..a43ca9f15f0ac5ce2129a1776c071b80ea00b081 --- /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 0000000000000000000000000000000000000000..99cdb64641de167e40b430ab2e48f5929be01ae7 --- /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 0000000000000000000000000000000000000000..dbbb24c369c171bb50fef6e3f46a95c465a6ed09 --- /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 0000000000000000000000000000000000000000..bfad8d847f00448129027f06a2f996d3e51b12d9 --- /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 0000000000000000000000000000000000000000..070d12ce513d88959a6d6c4efa2d26821c2b358b --- /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 0000000000000000000000000000000000000000..712b113713b87239608fa9a40914d2fb2ffde1bf --- /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 0000000000000000000000000000000000000000..4db82da11e945e354d2f09e39eb6b743b77eab7e --- /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 0000000000000000000000000000000000000000..1924404c0fb711c165681829a64e7b58c6d4eb3d --- /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 0000000000000000000000000000000000000000..d47dee04d9d3601493173faf94378247188ccb24 --- /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 0000000000000000000000000000000000000000..1540eb872709cf7a2f43b04f5f00c24c995e6892 --- /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 0000000000000000000000000000000000000000..8265878c9e9b57735aea5d40d7137139c41c33cc --- /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 0000000000000000000000000000000000000000..e6da73f487d3b1ced8d50a689ee905d05e754839 --- /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 0000000000000000000000000000000000000000..dcd6a787ae96f5acf4cd4e0015d737bde3d67ec7 --- /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 0000000000000000000000000000000000000000..7bb3a5a878d62b104075efeaa117c117340db53e --- /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 0000000000000000000000000000000000000000..24f5247c9fa150d1d41eba90500fd8eea240f40b --- /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 0000000000000000000000000000000000000000..f1a99529b22d08ce63edfcd98e2bad97c3a085e4 --- /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 0000000000000000000000000000000000000000..215cabf5d7641948a9b0ade22566baa76d25758d --- /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 0000000000000000000000000000000000000000..ffe49f3baa733340d3c916764afecbb333f1a72f --- /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 0000000000000000000000000000000000000000..72c26d9ed4f0f866bf8d035a89a8f408b6c9eecd --- /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 0000000000000000000000000000000000000000..259c00e4780f93311634987a035ca32e65061d9f --- /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 0000000000000000000000000000000000000000..6449baf882471917c655aff9b945f84e99361fb0 --- /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 0000000000000000000000000000000000000000..54510ebd101cba9133a36db1c7aaa8c625359e9b --- /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 0000000000000000000000000000000000000000..36f9836e4478484dc433ef201a923f413beaf70f --- /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 0000000000000000000000000000000000000000..61e22fee4ffc23dc283068da0a090f7206b1ec73 --- /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 0000000000000000000000000000000000000000..2f522da033c6b6d298ddc99d0fa88513df92db8f --- /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 0000000000000000000000000000000000000000..c3228f9033676f9ffe7b4147e18044104b17e240 --- /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 0000000000000000000000000000000000000000..76fb90c4eefea116f09e13435d91dcf6fe7d3b77 --- /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 0000000000000000000000000000000000000000..1776064fe6a993b1ff2656a80cee67a263811479 --- /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 0000000000000000000000000000000000000000..d849651acdea8029acf1ee87d308c7ad6a9f8a35 --- /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 0000000000000000000000000000000000000000..82a93996bb4a9fbea0eb710aff2611fe53fca95b --- /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 0000000000000000000000000000000000000000..9fd0f7e9a8e7d0ce83933197733b3ab8b30bb4bb --- /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 0000000000000000000000000000000000000000..f59e04defbda704e20aad3c938598bad95500f92 --- /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 0000000000000000000000000000000000000000..75a6568641c06486f3245e54c3b0db151cb425b6 --- /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 0000000000000000000000000000000000000000..5fdcd9429ad29470978222c3eeaa95169258a8d4 --- /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 0000000000000000000000000000000000000000..328fb784ee8b5df59a2b237bd9d0fdf3a4590f03 --- /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 0000000000000000000000000000000000000000..6fef890332181a019272c15e2d3cb3a8461a7e1e --- /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 0000000000000000000000000000000000000000..11fdf224dd018e4abd8bc62ece064fbd37710075 --- /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 0000000000000000000000000000000000000000..a8a5cef924a3e2940e8e50dc775042fb0056455c --- /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 0000000000000000000000000000000000000000..33a5f1c5d4c48184185674872dc69b240f80b673 --- /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 0000000000000000000000000000000000000000..6c3acd5debd6c40b568176c15f1dc920c855149e --- /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 0000000000000000000000000000000000000000..144adda16428422e1d95aec575cdacf177c1fd82 --- /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 0000000000000000000000000000000000000000..83e0d6b29e1a76496280986b248bf2651e9aec1b --- /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 0000000000000000000000000000000000000000..efb3815cd8d18ce4bf5fcf391a0416568533c77a --- /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 0000000000000000000000000000000000000000..0bbdc1ea1690819967b14cac8d4134519efbd388 --- /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 0000000000000000000000000000000000000000..e4fcc866d3e83c50904d0406db0cd0857d336c17 --- /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 0000000000000000000000000000000000000000..e0e20f1c4b64ce1e70ab2b176c6e23c54f44ad28 --- /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 0000000000000000000000000000000000000000..edafaa3da3e52425614c22df3412f98f057fbf1e --- /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 0000000000000000000000000000000000000000..b3dcd679821232b1afae2417c6fce41b99be39c3 --- /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 447a4c4e8345ce66e24272d1516dabf9850eb59e..4afe438c686f43a3e68c6925826215aad109ea8e 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -49,8 +49,8 @@ public class BitmapFactory { /** * 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 aa81b9196fe18e23597995ed716702544d4ec0d7..c6ef76a2180dedb190e33e13ceac85a4044831d3 100644 --- a/graphics/java/android/graphics/Outline.java +++ b/graphics/java/android/graphics/Outline.java @@ -112,7 +112,7 @@ public final class Outline { * 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 cfbe672a4cd60b46b71a43a2c4bd250ad36351b1..cac9537ab0231258a91c33c2d94c7e51978e9e0e 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -1404,7 +1404,7 @@ public class Paint { /** * 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 class Paint { /** * 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 c24d31334be003b6f8fd8aaa38a2eb53185636a6..659725ef59f664eb102896110879a3275040c6cd 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.RenderNodeAnimatorSetHelper; 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 @@ import java.util.ArrayList; * *
  • 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 @@ import java.util.ArrayList; *
  • 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 @@ import java.util.ArrayList; * 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 c2e302e184c90029ec03db6cadd3ec624746ecc9..bf32e4277d20ed54779ff9c64d3e692c07da96ac 100644
    --- a/graphics/java/android/graphics/drawable/Drawable.java
    +++ b/graphics/java/android/graphics/drawable/Drawable.java
    @@ -1315,7 +1315,7 @@ public abstract class Drawable {
              * 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 1ca15525c8a1aca39001f30813612676137f5119..d644beeb7d37f5e365b2034afc6acb735e9de58a 100644
    --- a/graphics/java/android/graphics/drawable/VectorDrawable.java
    +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
    @@ -76,36 +76,27 @@ import dalvik.system.VMRuntime;
      * 
    *
    android:name
    *
    Defines the name of this vector drawable.
    - *
    Animatable : No.
    *
    android:width
    *
    Used to define the intrinsic width of the drawable. * This support all the dimension units, normally specified with dp.
    - *
    Animatable : No.
    *
    android:height
    *
    Used to define the intrinsic height the drawable. * This support all the dimension units, normally specified with dp.
    - *
    Animatable : No.
    *
    android:viewportWidth
    *
    Used to define the width of the viewport space. Viewport is basically * the virtual canvas where the paths are drawn on.
    - *
    Animatable : No.
    *
    android:viewportHeight
    *
    Used to define the height of the viewport space. Viewport is basically * the virtual canvas where the paths are drawn on.
    - *
    Animatable : No.
    *
    android:tint
    *
    The color to apply to the drawable as a tint. By default, no tint is applied.
    - *
    Animatable : No.
    *
    android:tintMode
    - *
    The Porter-Duff blending mode for the tint color. The default value is src_in.
    - *
    Animatable : No.
    + *
    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 @@ import dalvik.system.VMRuntime; *
    *
    android:name
    *
    Defines the name of the group.
    - *
    Animatable : No.
    *
    android:rotation
    - *
    The degrees of rotation of the group.
    - *
    Animatable : Yes.
    + *
    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 @@ import dalvik.system.VMRuntime; *
    *
    android:name
    *
    Defines the name of the path.
    - *
    Animatable : No.
    *
    android:pathData
    *
    Defines path data using exactly same format as "d" attribute * in the SVG's path data. This is defined in the viewport space.
    - *
    Animatable : Yes.
    *
    android:fillColor
    *
    Specifies the color used to fill the path. May be a color or, for SDK 24+, a color state list * or a gradient color (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 2d5f4c2f90b90ba1da9dcc59a2bf25e4df6c99c8..b4a645fc8abac6dec8568646b5fafcd2d713cbdd 100644 --- a/include/androidfw/AssetManager.h +++ b/include/androidfw/AssetManager.h @@ -72,6 +72,12 @@ public: 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 70e4b6ff2e59081603b171bc39e5d554d2a7a8f7..00d786a93626d4fd69d27b582193229710fec395 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -626,6 +626,16 @@ public class KeyStore { } } + /** + * 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 5b36a43abdc2019e6d67b09045d9ab0cd173574f..565489115b697fbd57e7f46beeb2afb139699aaf 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -80,6 +80,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"; @@ -823,8 +824,8 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList, if (oap.path.find(OVERLAY_DIR) != -1) { const_cast(this)->mZipSet.closeZipFromPath(oap.path); ALOGD("close: %s and reset entry\n", oap.path.string()); - } - } + } + } #ifndef _WIN32 TEMP_FAILURE_RETRY(flock(fileno(fin), LOCK_UN)); diff --git a/libs/androidfw/LocaleData.cpp b/libs/androidfw/LocaleData.cpp index 038ef5839fe2f617e95bb1ee57e885b7eca90f97..889d166d853b6d5377a5f9c230feb88e040a8cf6 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 2bf9b12b6ce5c0322222e14718baedd9513607ec..10f4d46058ec51b94623a059620a52334d9da4ce 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 cc47f0052b731f357d2cfe2e112f36c09d076961..bddb01b97865ad18d4440ef4f0d3b350238c7748 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 aeee66106fb347f92f50f36f54c66823980f2c96..223605fa34edb453c51bdc2e8cac0eb2e184099e 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 a0c3d9db8ae1284aee5e7cb5d354292eba4754f5..54cd06504920420f4a8c2164544c897585307eaa 100644 --- a/libs/hwui/VectorDrawable.h +++ b/libs/hwui/VectorDrawable.h @@ -622,10 +622,15 @@ public: } 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 203eefefdedd53de38989992a0efa26358fab365..f9af9228cb407d68c49b12c590e6250ad437672b 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -3954,7 +3954,9 @@ public class AudioManager { * 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 @@ public class AudioManager { * 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 class AudioManager { * 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 47cbd7d7aefb2ca8de873c30eecaa9d7657acd14..c5a16c03e13fb3e02368f1758b254d26cd926528 100755 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -874,7 +874,7 @@ public class MediaRecorder * 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 31af6b512b31ac7a4ffa5337aaaade39c79cb06c..04448f04ef5cbe38fbdbff8fb49a516744263f16 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 79412d43af45b837e5b63b1d49e8d34a4b7f819b..00bdc69b5759b56053bcaef8f1fe5c81e7846bb3 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -368,6 +368,7 @@ public class Ringtone { private void destroyLocalPlayer() { if (mLocalPlayer != null) { + mLocalPlayer.setOnCompletionListener(null); mLocalPlayer.reset(); mLocalPlayer.release(); mLocalPlayer = null; @@ -464,8 +465,8 @@ public class Ringtone { } 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 e197141e02146257bc128f2971b9e93e0ed5250f..5f12742128bfb63b86671fa2839c1263fdcbc90b 100644 --- a/media/java/android/media/audiopolicy/AudioMixingRule.java +++ b/media/java/android/media/audiopolicy/AudioMixingRule.java @@ -224,7 +224,7 @@ public class AudioMixingRule { * {@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 class AudioMixingRule { * {@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 class AudioMixingRule { * {@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 8a210fd89f03daefb9267e6c76f377ad4b747817..1d297ef8dd62129d852e0aee4f8b190f6ea6100a 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 @@ EffectContext.createWithCurrentGlContext()} from your OpenGL ES 2.0 context.
  • 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 ed6455689e444d9e0479e50c7a914e6a864bd63a..ef9bf16747a42f33d173960a39a70ecf4496c440 100644 --- a/opengl/java/android/opengl/GLU.java +++ b/opengl/java/android/opengl/GLU.java @@ -203,8 +203,8 @@ public class GLU { * @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 440cb647c0245d7fc9fd46db1b2f25107ec2683b..2b69d5bfd5409a7095349e6bc6bfd13900b4146d 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 b84edbc65ddc5677c8527b4599af8bb09af777aa..1cbb770583a800adf20dd97ccbb247547747f9d9 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 aaeaf04498f10aecad83e1b79aaa9916bbea491b..cbc130df9c9a3eb24fb397d4cc5f58bf10e1584d 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 804f980b16744b7a4ea1208e5345bc12419c5b58..44d01deafe6bb68ae5b0e4eabb7e96af0d74a31f 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 bb8eb2cd0797714210ec08eb51666b778155404c..23a8655a3bb6879c1e46976a29de8d797c3dfe8e 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.lang.reflect.Method; 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 @@ public class CaptivePortalLoginActivity extends Activity { 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 @@ public class CaptivePortalLoginActivity extends Activity { } 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 class CaptivePortalLoginActivity extends Activity { @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 class CaptivePortalLoginActivity extends Activity { } 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 class CaptivePortalLoginActivity extends Activity { 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 class CaptivePortalLoginActivity extends Activity { // 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 a0462de2fdc88732f5955dcdd0a26d4ef19e1084..97add633fb0f510cf1dcba156413247ff6921a87 100644 --- a/packages/DocumentsUI/AndroidManifest.xml +++ b/packages/DocumentsUI/AndroidManifest.xml @@ -18,7 +18,7 @@ + android:icon="@drawable/picker_icon"> diff --git a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml index 75b0d861ec1a6d127adc4f9996202e10193fef9e..1c6a23d0117a3ad51c50b4f8e285b7e6d6f55571 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 42c8e9e12cecfd11bc98b1b2c740c3d5a10fc9c7..f49bbaa92962aeb1f38126918d79ec663d9715b9 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 e2214be0a846253bb627f9adf67ba03d691c2415..042ead1e56e29fc360c98335b6c374dafc525527 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 f2f59ede2b1ab29db5aab42a9b7c3a597595936a..cc27e8e9a0b55e2a93940ca7a34282d942fdfc33 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 fb9fed62ad072c7fafd348325b70d4911d5b4e1c..bae677ce7f5c86e38316859eddc211fce55b9352 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 27ac0a663215ba4a7a1ac5bf07371f66239c7f88..075f2560b3f5f4036ab4b47fd25ea18befe3d327 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 1eb499be5a78301e7e184a85461815e491a8b35e..7becf4e7776ace6c4606acc3b29a5f2b9e18f7ca 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 07c41f8096ace25aff8fc05fa7a56a5579136d69..7bcd8539ad03d2263fdf8c7b7f85f1ecaa3d8e0d 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 178e3b4fd7098e1da82cf070524c8129723e93f1..9b1a7b3fd4c96c1f2d3f105c8ccf98ea20de1389 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 d43f5f3544ebcc94d185afbcc7d545bcdd148d05..d06abedafe5c0a191120aabc8c2359a70bf48c51 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 393573985ab4330810540be1cb025dd79c4d2efc..e9dd8c2eec7aa69f451fb201cfd66de062342e95 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 53a26b609ce98ec561a692fb25a7affab8250dcc..5fd3c8c1437b37faa5e9c14538b0b8dcfb4d7369 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 24107c6027400f3089d54df1bf22b8d0875f5731..4ba5f4bbf6bb3972b676a6cf870490602df7be5f 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 1d0e01bac58875ac112172ed967cba2b4bbff18d..a0ac3296678c5b08f0cd869deced3019b788a604 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 0000000000000000000000000000000000000000..1c720e0b28e0ef62aeffe44375cfad9f585e156c --- /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 46e7fe0b305398134bc6628817956c2914a2bfa6..a04a930d48e7967ce85334b4b616670822c0c290 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java @@ -387,6 +387,12 @@ public abstract class BaseActivity extends Activity } 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 abstract class BaseActivity extends Activity 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 3b1ca77b680ad3db70c0e6fe83884a08d18bc167..233380e70a0d2d4b1296cbbfe2cad1acfd8c7fb9 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 class FilesActivity extends BaseActivity { 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 class FilesActivity extends BaseActivity { } } + // Do some "do what a I want" drawer fiddling, but don't + // do it if user already hit back recently and we recently + // did some fiddling. + @Override + boolean onBeforePopDir() { + int size = mState.stack.size(); + + if (mDrawer.isPresent() + && (System.currentTimeMillis() - mDrawerLastFiddled) > DRAWER_NO_FIDDLE_DELAY) { + // Close drawer if it is open. + if (mDrawer.isOpen()) { + mDrawer.setOpen(false); + mDrawerLastFiddled = System.currentTimeMillis(); + return true; + } + + // Open the Close drawer if it is closed and we're at the top of a root. + if (size <= 1) { + mDrawer.setOpen(true); + // Remember so we don't just close it again if back is pressed again. + mDrawerLastFiddled = System.currentTimeMillis(); + return true; + } + } + + return false; + } + // Turns out only DocumentsActivity was ever calling saveStackBlocking. // There may be a case where we want to contribute entries from // Behavior here in FilesActivity, but it isn't yet obvious. diff --git a/packages/Keyguard/res/values-b+sr+Latn/strings.xml b/packages/Keyguard/res/values-b+sr+Latn/strings.xml index 570f4bc96f86709b57ff1e33d24730a80237d781..800612520436affda2fd747e7c61937e1fda26c9 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 1a2a8dde99c16c957b327af04ee55584cf6e6476..64c01bb356e731a0b4bf1f77d611c2ba15542ea7 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 ebea6eeb198964ec3e97c5e969b1efcf3ffbabc0..0fb741684e0c88994ed52a8c36cfd8b5ae40b1c7 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 4aacf8fb927a378fa5d74f2ce27eee3d326fece7..ae92f6b4b84ece728919d5fa822d13e90d52832f 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 c44381efc8176f3bd21bd69a065440982b15abb4..fe87df8e5f5d3c8a91c2b93fc56c06c37a72935f 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 840cae79665adc16df8d70159db38bd98b972e96..23c0b50f9c30a58de30d6f2fab245e4e4f433378 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 527c8e65b3845885ebcb32c969f4e6a96c3ac21f..4a1d67b8d94a5dc0f9930c016cee7a65b774a3d0 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 58863d1d2ea37a37d99f31624af8e4f9d5e6184a..32d8045a620ec361f7ffab6d0b0dc54e6ad4678e 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 54bf4a9771ecf3296a365befe331e99cd18efbbe..7e61c7cedff98a8c66c8b6e75f57e0549919f4c2 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 905daec931e6145133cdb8ff96e0dde69204bbd7..6f65337a1d61682cee8cfb614d695185b9380979 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 f357f96822b22fd589b92e30743df6adc9fd909f..49eb847b11737d0c83b25136f1e6e2547b9fd045 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 dea4cffb3ded7b820b0be8d942dce399c8cb4e21..c511172076c0152039457d1d3abce3ecfbfdf9ed 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 1823711acd597f2cf9b8ab5cf0ba7893c93dc919..f1e24b80fad9684577b991ce40beea72ae765775 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java @@ -349,6 +349,34 @@ public class MtpDocumentsProvider extends DocumentsProvider { 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 @@ public class MtpDocumentsProvider extends DocumentsProvider { 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 @@ public class MtpDocumentsProvider extends DocumentsProvider { } } + @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 d19b46083f91fac3a0873f3481aa4d895fda5aab..8831ae292fe642e34da328d34aefa68f4e71bfaa 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 android.test.suitebuilder.annotation.MediumTest; 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 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { 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 class MtpDocumentsProviderTest extends AndroidTestCase { } } + 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 class MtpDocumentsProviderTest extends AndroidTestCase { 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 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { 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 9a81489544cb516393e9b6040e14aad2fc41837a..4dba64848d4ebbf9004c4cf5f0ba07144726b50c 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.ArrayList; 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 @@ public class TestMtpManager extends MtpManager { @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 d23e1bc93595e44dc9639634707b03227ed945ee..9751ca283b7d88ede1590f48e46481a85237197c 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 c2b84d0165ca4f097adb828f5e38153bddf30bc9..a75874415d856a02af172abf6e01529e6ca1ac8b 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 cc04d66462788bb8c78618ce0f1c4131f0b2ffbd..42b8f90b5ae57e03bf13d67c543d88205303efdd 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 8095f0fab92e1a780c4f900bf5434bc96fcc0905..009076468dc1d0bf69790b0f5def9e52e0cb4c3c 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 6d03880d5399ec9215ff3c7efb88d29a41239d42..0519083eb4af47f5a4635e49b7d188e6f7d7e4db 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 f4b9d6190f4addfc1fd1928d591ce66207618a60..487ac0128159630995896d6f678f95b7c0a1ed26 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 7e1f37e554a3a5970baa248e76055f503893a7a8..743ab6069c27c80d0871c40dbbc02a8959dd1e16 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 c3597a740f786e8bbdc0c123ecc53e4ce53efa35..da1509d9f741a9f9f4f05e6824d8d0842e67898c 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 3b66b380bb72499a95c4830f94ba8b309f904bc9..c96fd914786de06a14cdf88a1342eb91cfc5dca4 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 1944a4b3dc8386c687f60c92b5d1fd9b6d48ff3f..e9e9458e32f802b424567a8912e265ffa255d817 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 66f2f87fa31e90f9ad5dad61b91a3236cac57aef..9379f27e6a112849b2269d1396928e146170579c 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 cfda4ab177d976afbbfabc886de0e2177e696c10..ed12c5d5c65ed72b00a874cc91d6415145357e52 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 e65feff40590fd6e90e46623bf7628bf5a4ffb92..4714e70a07786e21dc380daff705e78a224b8398 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 5aac49e14443c56b59025a4e1882cd8fb24719c8..29f6be1966bc59ce12b2b6ef0cbbeb2e1644a56f 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 345c0bb5adcfde89eb3fbb4ec2df3340f01a5dd2..071a481b9ec448ee9061c95f03c3a6a0d496b86a 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 52077fb7c481c407b0deb999f8c4c8001536b6c2..75533ee440ae876ad07dc8765594c292cf8df641 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 eba51b37dc792531ac2997abd5669655038920c2..088ed1bd70ea6bec2ed01831aedd82b4d21ae224 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 4ad361bd39b919c49ed076c8648c044f5aee6435..cf25afa8c8a20b544a5e6591c60e32b418f660bd 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 8c7c4e0df94e11c8076dbb0622d13e28139a7662..6d86f48d7efb8902536a69f783bb0dc372031632 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 20ae6b0ce23ab079cbee0ac6f736a60a4b2fc61f..5e4f1551f1beb2a4e437dffc41cb0d2e2f2003a2 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 bbc1266cd5544901753562eb718c9afe33532d71..f975d921385c566f2176ab0d52b6a6efa97e5525 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 108d8dccd4191ce28b63f8780fa5a8867db918bf..9a549f2f1bebb43c37760f12bc73e0b345c72d51 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 d93dbac8965d700d13d9b1dd0c94d031023bfca6..b6a96c887f7754c0109917496d27906256af3359 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 6bbc11c73d28da8c76b1c9a59c9ad0b4db240b3a..6db0608331fc9e72a5676cedc45d1162721721a6 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 a571affde0777bcb1f78aa99099db83a58eb101f..2fecfea48cb353ec7b79065fab3eca36122ad458 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 a571affde0777bcb1f78aa99099db83a58eb101f..2fecfea48cb353ec7b79065fab3eca36122ad458 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 a571affde0777bcb1f78aa99099db83a58eb101f..2fecfea48cb353ec7b79065fab3eca36122ad458 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 924c18ad92fd206ecfa35350fda93fb25e5a3da2..c55aabe15705f2ec5ce2e501faa3a80b9d015a9c 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 7824949072223d0c2e7c9bd4524b52c99236b552..0062154ef63831dd529fd920f9c86b7937154e6a 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 5f76b9fd9723b435ce0e39a7e1cc22796a5aea30..09170614cb004dbaf22bb52911d97e72a019cb69 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 abcf2828e2c014ff8330acbfc78acef54fbcd55a..d3251fe395662a43dcb0d5fd270adcd378bebacf 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 c573b687967e1086481c19b3752d4d4043fcccca..e87a3e98af8930f4b9bb684e2d7271d6ac531abc 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 05f786addec2309a1fd8a2411faba8ad6d35ce32..f610fe4e2d4b2a46b4fd72f4a57aa3cd5a1967d1 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 25384434313c80634925076fd70311b2dbe8b233..4b4413f9c2fb2d75e9aa074764368c88675da953 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 3b5491f5ca33d3585a4c6d09a43235f0d541ae54..44dc8f894533328b41426309b8a9e0aca7dfec56 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 dcd45a85dd301d165e1a64b023b7cd0cee2fb067..a8ba929c5425b8cf762d2672d9d78c6e5c6ee12c 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 554ca40a751b052148d25f8c90c94f57f23d5784..43f930e5e5e33d109736c01a110c292f3df35ec5 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 fb6f181e6b20d32083dbe3dc6dbe33396bc76c29..5580580fdeb6efdd4069e4d3892b52fc26101cfb 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 619826d274f495f0235347ee2b182a05e701b683..a92d87b4b491477b2ce8e4d6f954aaaa66ad4379 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 e389c0093a9e930e53187134b0362df49c15d4d3..07ed9234b41bb65870056fe9c70e0ba4c2f8c1b6 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 e93cbfcdf54733788401e4f4fdd66486e57ec757..9a08bd9faa77526c4a3e09a9f230d57eee1fe406 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 8d2d78efc45c5b0f720667691323880d62114dfe..3f3d2d071dcc26794c3bf13c224e7823439457ec 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 0e0d32f0065d93bc9ebfef36a6f3bdf0a330164c..6fe3ae259d188152f243b66bda93bbcc370b1dc3 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 d1c177bcd44d98384772503c25a93d63347340bb..f588300534f0de4e0c132484f23a4282afe46642 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 c566e79a7f0a2b27205b8e6c041f1958c74fd88a..f60352d4e4560ca76932803658b6821089fe996a 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 4523380ca44734cc21a98291e87414ae819d52b4..567f1ab5cdd29c3f609d154c377b58769b924815 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 1761adb503d893340bfb01abc8f886f3d973f443..06ab96c1f1c61b7a75273cb2b62e6ab8254fded7 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 a39d4b2ce0ec2cdca4f0c8aa140e7d7e609d8e4a..97cc334f61eebaeb4be75c60f8da2f74da1d1c4f 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 c636feb73aa65a6bc43dda52debed41fad87545d..4bc9bd608410f743761edf9b8a93998f8f6060b6 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 94ce5f1596405a152408b226ae1231174a5faeeb..3a0857d6b12ef6ccbfaedde47ef0c1e4d3bc253f 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 5f6d69976932a6c677694360db22766a9797d1ed..bf2cc75163d5d3942cad38bc06ebdf994099b7f6 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 ce10d356a2d3892f2376a59dc7632f76b725d018..8f726e5ea9153224d1cd8d966bb08fc83826baba 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 6910b375d7a024d72d8c2b60e1d1b31df0d06f0e..105f9703ae0237c27049e9cab66754e93517ac35 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 711551b01c74535302f5a7d38f19c83cdde035d6..2f71bd9ef51232a6073849d1ffbf25da4c5c809b 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 abf36e35891a7ace7a99c36288d9f08bb03f3246..6dcedfe7ec609ba3e84aeea61fa4ffab9999a235 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 cab29de0f6a1e35e885562e596dc71a549553109..69a1df4009c5300ffea181d60fc78999eeac81e2 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 90bf867403d02b690e6c5c10e51fa368383c0cd4..4297af9e1d7a1d15cc4a1a70915c8b6056988857 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 725a39d0a3625eea54a34ae621993b590b3194be..850a6551019aab1a3bb19c68b0b54c333bb541b4 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 01565acd2cebfb4a38b6547ef6723a2f820779c9..56b185cc82b71865b0d357fd1cd84db55490fc98 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 5121f4460ac35748517baaaad0d9066de037a8e3..1fe98c86471e5be24c555cf24b0b119f85546ac8 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 5ee18d54dc0961c82a2d2081d9dae2a8707aade6..789f16935244af6299d86a185017606edc85cbc9 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 fabfd637c6ed09949bee684529ab7e7735d03cbe..0f7eba6ba68b4df99af15e240c80187b0f822b41 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 571a93133677129be29ca969486b7d25797b2e7a..fae52cde817716c2000926ca102b36e76640576a 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 834c849a227f7fcc5d0bc26c003bcb2f0eff03f0..8b23f4846450dc390c7a23c47f9cce87df4acd73 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 01b39a0308fb90a8a168251cc56c089c1c23e083..a4af10aaa5dd40abe4534a6a86b28743eabfd0e3 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 4cdd4fa559a14e4753a99e008a8652a353094ab9..d1903103cda3e1b4774b94e5527f6aeba16e20f9 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 feb78df79078f0739df1cb1dbcf305048f1a200c..7d7da84d155fa44212ab63d38782e69cb851e379 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 f21ee6df9385eb4152c735eb8e905722ef142230..052e45bc9c43ee6f318cbdef2b33543a611e5342 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 bcdf81293e2d63facf5e35084999bcf4e738e1c2..b2a8fccdeef8dd127df9ad00e5bd7f24e2170559 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 ef4ec778ee04aafefaca5f81a832acef16b0309d..54563c1412967e0f6a573604516b77a94a0da7dc 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 b6e9b4f35a97f6feceb0681f2eafb6f3655722b8..77aa19b97cb284c74ea273362044d6a8c47143fb 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 ef4ec778ee04aafefaca5f81a832acef16b0309d..54563c1412967e0f6a573604516b77a94a0da7dc 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 a5ee78ae2c2cd8aa6fd03ac39a81f51953ec5145..2730406d707e02a22d5658c83b9833fa5b1d46d0 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 b24a705ba106616293a9e2eb6e81678bf1bf65e7..dcd33502041499321d8bdff683339ef43561509f 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 e3acfaee3fe86cccb9ebdd347a66718da8093e77..0d5ef4d9aa48375068a0fea7fc430950f52823b1 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 74a2b4693eb0b923871ee7a0383d738b43e1ff3c..3880dbfc1afdbd257d2a805eb9d63ea72bb35a13 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 788b97ce5714225eb7c299124ff32e3bf2911e88..f74a2e23681ffebedcf448d55be96be91fd8ac40 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 d6419ddabc5ad271ba565bd4ee309bf579e9eb36..1b5c4a2f9528d5e378f9d7d42dc602cf69fc060d 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 f8b3b4bccd3c5346225c4634ef82649eeabb7c91..ccb6517276b71de15c8ecc0d40366ae52b671a21 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 389e03a8288979933b517dc381361d2221057741..e7feb03b865f3d02176aed24fea24cfa28ee9c06 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 ff6687cc78f4a1c823800b8f4bb066f0f2559e5a..466eb76053953ccd657fd430cda7a1924c50b409 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 86f58fc83e61672edd16d5ec35eaf9be03c05537..6c5d34e9bb4b7acb9e632c6c5fcd0ebf56a6a2d6 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 13265760eaf9e607b909da902e8af83035fe9575..00d818b021be4ab1c8279dc3e942e094523419f2 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 5d302d08e89c96df92392618bfd1ef95b72e8e80..6fecb2caffc624d9009aedde077d5abc0bf05306 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 c2232ee76e96835a71eb8781cc83293855516a3c..aa0c66792917e6802777093f19b5edb8f9132cb3 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 2541a3f6bc3165f808d740642ec426f45367241d..06e0f2b40ef356eb4b3052f60bbb07fb6f633aec 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 1829677eaf9d26ed34d27670cfff820c8fff9009..dd45ec618a5c3dacc7b6ea1f47d7532658c8d83f 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 8bcf20b241d29da271af25e1adf89b48632ab8fc..3299db84b5a5ffd5c836903f5c9ff3a05fbb8b5b 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 a0c72a09e1843920afe4c0e3e13ca03f31ffe05a..4fd51ee3574addbcc719652a8f6e71207290cef3 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 b99117768d33314573885e0366edf3301ac71e65..77192c31829f58b7cd7669ea7a43d4b1f8d21531 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 29c4c7313c6f6b4ad82201d0efc69565dd30387e..516e634ce6398507e857d1b348f3cca34e8de89d 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 c77b7864ace646b459905b2d5d67188780432b1b..f64acfe52761ef185d97ab8d9c9a819c55f8d7b5 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 fb180ff59659ab4f6089782b3b6212a3bf7bbcb1..ae2f5e08b07f96162ed0362d2485eb8b6564ede9 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 2f9d4282386d9be93463118f94618740b79a79ae..dcf7c3d51f2c1cb079cdd8743b1c6de6dbc6b17c 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 0aa76a024d5ba02c469a9ee6a00b18d9227f1fb5..64f21b50c0bc6fcdda717fac54e723a5631a2859 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 c312d04bdef38a2f83d70425d3380c6fd44ec393..f9bd24ba69f3afac9d6d52c5a88a1bbba9f652d4 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -872,4 +872,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 381f903a97016b28ec3a4bc7152ac1104839d17b..e7c8c0b975b045ee2e7ef93028d7f29d518c9add 100644 --- a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java @@ -185,12 +185,18 @@ public class HelpUtils { {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 ed1cf9e05e0964bd2d0df896a39c8f3d33793b2c..9f90004e6dbf29e5b97ca63609ffe4fd0c1198f3 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java @@ -314,16 +314,16 @@ public final class BluetoothEventManager { 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 0000000000000000000000000000000000000000..ca8edf5513fd7eea6406e055c65e9d49f6690879 --- /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 0000000000000000000000000000000000000000..de762791a0a91ed056006e641c52b6d95485b116 --- /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 0000000000000000000000000000000000000000..95bb18d19188346ecf00d01ca8dbc36c3607b6fc --- /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 234ae712c49e0c0e1bfebf9c95ff392ce8529160..28575a9c6decb3a364d4d5fd3ab49edc2107b111 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 class AccessPoint implements Comparable { 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 0000000000000000000000000000000000000000..5d843c1a80cab0af9c3596dee4c96c62f7087678 --- /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 7bd6c5399bc904e1c19f56965d0eb7cc93e71c0c..ce2b4e5713d260ad3c6c2f4e13a16a29bbee75dc 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -71,6 +71,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 @@ -157,6 +158,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 b0c3696fcb32447bdc11d85b0d3e93c199b8f958..0d00a4779ee7d28b8747805d8555031eb410304c 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -2700,6 +2700,8 @@ class DatabaseHelper extends SQLiteOpenHelper { 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 cae6451ae6b9a34517ed05c3c75b385dd398c846..faf18078d7ab8453c705d7bcf9bea613c108356e 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 class SettingsProvider extends ContentProvider { } 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 @@ public class SettingsProvider extends ContentProvider { 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 3675eebd6b40aa106d85c1121cf14c4dc0ad1ac3..801b40e4cc9cdbbde61a2c0ec607fe46f0397fa9 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 d444d786e5948563cd75ea921fc643c07d8fb265..69d526a04a1f638ad443c3927774d02063ca1107 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 4ea35519718e59b9c0cd0dde7af48344adb1dda2..969e5556d6bfbfbbd0b101ea747f9c053af37b13 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -264,7 +264,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 0000000000000000000000000000000000000000..74f9256340c378f1a99e1a07c6e0557e27b49657 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 0000000000000000000000000000000000000000..4de10b6dc5d786c36cc3ac60683fb7f3fad94191 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 0000000000000000000000000000000000000000..965d2f5f40636b692540f515fd71c31028aafef8 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 0000000000000000000000000000000000000000..a123262566a069c63e8d73e52cc5271b60be20d0 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 0000000000000000000000000000000000000000..0a95ddda616a2a9a14b01c54b40b67f23d3cdeec 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 0000000000000000000000000000000000000000..1e2c75196c42c484d216d533241148628c289e5d 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 0000000000000000000000000000000000000000..fac2da82fabae3be2812f1fd68c2b949184c9e40 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 0000000000000000000000000000000000000000..63739b9dec30379fd47ee2408ad380b347cf2d80 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 0000000000000000000000000000000000000000..bb24c8bbe10a2be931fa967d0d1a686870141201 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 0000000000000000000000000000000000000000..711fd7a5db4877bae5d2e17113d8f73a28d3985a 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 0000000000000000000000000000000000000000..bbb00a0c986ec63188303642eae7e9578ff449ae 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 0000000000000000000000000000000000000000..43f77c0456c05c4c54497dfac61d0b5fcf188149 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 0000000000000000000000000000000000000000..872af0933db388d763386a290e40d537b5fecec6 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 0000000000000000000000000000000000000000..ea7ac93614713c3a0367b472ad1a588e51ac55c8 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 0000000000000000000000000000000000000000..fe07f814e3d21c4f5c552e21ce459b8e737c150b 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 0000000000000000000000000000000000000000..4193b218219ac9bcfa114c1893d1d242ff92b895 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 0000000000000000000000000000000000000000..56c26383c36cda9e5958cb2aaaf0f7233303fa6f 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 0000000000000000000000000000000000000000..c3aa434e945ce61e9f22926a6c7e867234db25e2 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 0000000000000000000000000000000000000000..41a7209d28f9475033c526f0d4208efd41dbd93c 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 0000000000000000000000000000000000000000..faaef603d947715ebeafba267ec50075f125e218 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 0000000000000000000000000000000000000000..c8e40d086072ddc9c7c74e131ba9c668fc504439 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 0000000000000000000000000000000000000000..26124850f62e201e0708400b0a73f4fb372e3c2a 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 0000000000000000000000000000000000000000..3b831a3cd619380be2888936c8ef33df307b580d 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 0000000000000000000000000000000000000000..3c377827f516d73a486e463dc02ad2e0bbd47010 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 0000000000000000000000000000000000000000..b2baa099aca60818a12918e0039b80f5b9f6f8eb 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 0000000000000000000000000000000000000000..37590a5381b675061d60b188811631b33dbc66b9 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 0000000000000000000000000000000000000000..4940d5c4f78bb9e1ef111b0ef3f55c1e4935da89 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 0000000000000000000000000000000000000000..7ad2a29cce6a69366584fbec8914759fa4aa9313 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 0000000000000000000000000000000000000000..6fb19aedf5baf75149930009b684421b36174418 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 0000000000000000000000000000000000000000..b336ccd2b5a19e8fb420997b10a8376eb7204e2a 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 0000000000000000000000000000000000000000..49d2c3a3cde1f4d66721f07a1947fe73de9b38ae 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 0000000000000000000000000000000000000000..216f2c77dd9fe876bf15cd7fb44cbbbf41d50d4e 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 0000000000000000000000000000000000000000..a8c2786cb348b3e19041c4b22600ee0ad58e162a 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 0000000000000000000000000000000000000000..ca35888dec1300a8d48fef16bdf91f1a4333671f 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 0000000000000000000000000000000000000000..4d239564a5f55bdd5657bef1c7ce4fa3e6644254 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 0000000000000000000000000000000000000000..74abc313b89cced36ec2ed005b4b90dc72d43d51 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 0000000000000000000000000000000000000000..89bed92dd17c5015de07a51b5536cf9820e8ed70 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 0000000000000000000000000000000000000000..8d4f5f3048e73df22d4d4b3437d88b9a0c6e628a 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 0000000000000000000000000000000000000000..83e96a2f095c2cad5a558ef942643893fc63d01f 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 0000000000000000000000000000000000000000..636c0c15f76bfd88902070a5e25d9f39c601bf18 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 0000000000000000000000000000000000000000..bcf9cacc45ae4ff2aa79ae960be44e4e48800e87 --- /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 0000000000000000000000000000000000000000..1972f6e4427c95596b0201466f97cafc00ad2907 --- /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 0000000000000000000000000000000000000000..2cce5325a48c39f6741bab6df7f7b049e3d2648b --- /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 66f64c9183297f448c8aafae4c73f6875c795a2f..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..4987f9bcf6107acda1f77ebec239459ddca367da --- /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 363e231cf03c3a314c84dcebc64b7b25a7be7752..4baa472acb88d155563471c7eb2453ae682f32a9 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 c943f3d2a61621d24cb5ff99e73f959aa8d63d3e..fdc6f146f93f9af380becfc0bde1592054c0abaf 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 a20ec8e7623df2f3ec4ec584597afcf58cd80970..8b10074974686254040991675ab77af7bace0e4b 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 967db261fab10545f53036d6c50f38c7fc2ed0cf..50ee64a321b84cc750591c6f080c6e025c797122 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 0000000000000000000000000000000000000000..2ba04fd31c0fdc9834667b1dca847fc58b3b2053 --- /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 0000000000000000000000000000000000000000..1c9b9ac5f5f23fbd017e354b2d922ec465f95286 --- /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 c8e5b61241961252ac7cab34d30c644125e7aadf..015e4a2006bb8f384d62779cad3f14142e010a05 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 0000000000000000000000000000000000000000..d573d6b881d268b41dfcd736fd17a33e978fa0de --- /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 0000000000000000000000000000000000000000..8cece1149ce76c07c00638376fd494ce88abeb31 --- /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 73f26e2bb57cf3dd55fdcb85c59c9a1751da8403..e4ea08edbc8995f7f2e96a5ae1f6470b356825f7 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 98f09f4e5d5120e29e477a4f35f09460cfd5d16a..47216edb3962507e7ae1d516b619f1212700d977 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 c954e41107c8287639315e0eb65652fc2f2b40c8..88be6be1ab6bceed8a5dd0ed190ab8ac4af487aa 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 d2f93d2fc7c7a586f922a5dc13843fbc76cedbf2..564eb01d28028824a83735c770dbcd87691ba63e 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 19d58d5207808c8f19743b6215c776134f713d3e..f90693b4770bc3f0f22cb14a37761539fa126b35 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 7538a9a06f4eb8dc0381aa0ee04dea20b0bc3664..c20e2fd54b5807aea7456eeb3a9b479c6c77dd0f 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 b1841429807d19d326ea1344dd8c41cea042b7cc..3012a0c4eda8c5c402787822c97a6dc86eb541be 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 2cd7b04501072167c5971a45f1532da6cbee864d..577196ee7e1ce3eb03c12a4ab66d0a8bc7814b75 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 3fc98fd0d0b42a7e6d8c7d8b71a2077892d1889f..59c4a0d82cb20e4b6c398a7970dcb032a95e0b02 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 483f766f4f46234673dc66a489450277ac6df68c..28e1bdd10ebcc781723fe6a5029a5d5a8e604c87 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 6adcde3d34e2b8e64e0a1e6f05747e327c164007..69bbcc012c978432178ed5d111907c444959e0ad 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 7de602a2f1f0913d7d17ecfb21938212aea976ee..2135bba74e356883def5cdb99d60c4465a4ccc50 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 fc6d9a07303f6478c0caf25a2a690c82ea66ef4f..19b2643536dcab75708947849df5109946d40815 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 a9b8bb506afe337df3b64f97d2f53935d6e6873b..11eeb3ef3b61a3ef073682fac80175e8401a84fe 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 bed0f5c431a478d6f861082e555165a02073dda7..1f5e22708a0ef714eaaba25d604b457ee097e4ea 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 bed0f5c431a478d6f861082e555165a02073dda7..1f5e22708a0ef714eaaba25d604b457ee097e4ea 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 bed0f5c431a478d6f861082e555165a02073dda7..1f5e22708a0ef714eaaba25d604b457ee097e4ea 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 485d2e0ffa1728be04122e65b480bbee7f893b66..45b09557e15ad8d68dd8c869c6e4aefd870a07ea 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 0e0f412459f5cfa22938d6ed969d6acf06123f9f..0745e595243b83ab210418966ad76da9a525374a 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 0cdf8d20a18eb00b39537546bfdcb2a2e7139b16..468404f7d01b24cfedce970b8d80315a347f95df 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 94941104f021465af1c797bad5353ffa5b322494..d48f480e49d960d3c9e262d9a27421eed7982ce7 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 abb7e1ee51f38b92aa8a0cd875d1f89f2c2fe510..e28f332829309b784a0447853f67bcf26f82e6e3 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 910ac29b7b057e7e067921efb42e12d8feb74302..a68e733f31757c7422c44bef79a985890b0d0ea5 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 8c5e46f747a07a4d57382937ca7a0dd26fcc763b..e99aa43fc332630dd33c02be5e57ecc314daa35b 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 4b58a6d376df86589bbbbad91170a48a5f657969..ffb2ecd536e55d37694f9ea9900a416eb5480882 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 449c747814d5c2b02092cce440b899ed32e71232..da2d5ca958529cb5ec48b82a37fa12bdd717b448 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 5287576dfdee1473b16f7acefdd6d3521008a4f7..2884505ff22acb3e13136e07c2ce64147bedb179 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 5c24fe2cf3a915ec04bc62ae6b27b7be1a821b85..d1c0b383760771edcd005dd9bb3c066a082f02df 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 df3ccf1e5fc1e27a7e7df87eb80e71a30c62edea..8dc10aefc6933b2307a5748995a9578455cbe1c4 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 425212a56186982a9c700a32988e6f19651e5c84..0e29ed01813aad24ac6ecc10cdb756e2b49fb3d8 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 77b1c824a7f4cc5a8199381a06e51d835f1bf3bf..4ff11d189ab7f1993f4f5934848222a616f77e7a 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 d006addad516c9fb9dbbb5528c22f5f1157ca717..ea8a166d92bcd3cd479d29534ecff26ac350ed5c 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 26b1e74b0cfc38b9d172d311c6f462b6d12fc172..03c56ce4b6346bc2d7206910adb2be47679d6fc8 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 d056637fe93b136df033814a92ba8f6a5f5efb54..f7b022a57c29bef31508313ffaafa9b65a882ada 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 19a94a3c53e39bc59a7d30f49be8c995001deee5..7c3e5394d1659a651913d9ed619788f1ccd959c1 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 8d51fe635aa7e179847d5ce9282f3c775ac958d3..f5e71fb78e51e297c87a5df56526569352db33c3 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 258c90450e4824f67f05fa4c0bd71b77967238ae..290875582fe18708c22c90b2a94d6fc316f8172e 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 25ede612d22dc400900ccb330924397c6972e0bf..eeb54dc86d79255ad00858808d4da870f720d274 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 f839eb648181cfa4909e48f3aa44ac5dd6b6e044..ba6b7f524e793f7b7581ee0b607e4d8657688d46 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 8d9b2dd546b51e18730510b4cfd4ad135f8d42f3..33a8fddc2a280719443bca84a1eee95b8d8567c9 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 b3f121c359b5b4b5dffadcec0059993d5faf1aec..3cfd7150193b492a1a83e233daedb3fd93b32a1f 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 cb404cb30a027c93581cbf7ea56eba609d5a7ea7..bc2ec413205d47109ff4fb64cf4bbcbacb47c522 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 76350ccf56c7690fc1470421ed9d39d9af55ed20..f7f9fc74fa90ce42e3d28ff2d28849ff59358357 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 480d88a2c09c47b8f4f61903ddc9de932faaa3ca..49164cf644ab61c1719d9d0f803175e79062fa8e 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 564a29c5f05d7fe587a6b0ee20c2c0b9ad7e2e8c..3a3e792f615b9bbcb77eb022535e9c1f129b7c0c 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 602fdc9fb385935ebb5c3dc57d6ac210449de6cd..2173146172d39cf6f81ed34f4c435e0e36ee381b 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 ddabf900734c78b5450c1b95a43ccc0671d883a2..523b8f799b2969343c5ca606252ba499d4863e87 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 df9e7993ea7b0871079bfba4a9baaca07f4f8fc1..621ef7a47b1d1f5243ac77a9e44ad7ab1a9f4392 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 006b9bbd5605cee73f60453412045958d1ed6d43..f35531c81da04259205bfcea97a3c475d1b0804f 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 df0faeb287eea493493cc094e0603b5c6d4d9b96..5bbf9ec54a274e8f23828ae841267c4a1891f88a 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 92ee06e0ef54c9d251f13ac8e5c442896ac27dd3..9a71701646d40d8c01bde40552a93dbff4ec4bf8 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 02cb082305a9b285fda953b94af1dfd618538cd6..6cf88b0cdf6b3df7025e875e3758c09977b00cf2 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 79d4b846464b681c83c68830f88d1062778a6462..9298cdc73e5bf6778249f2366d6cb9bc7b20ec73 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 d762d07736d5e99b50ebaad4e5cb0084e2fa8d45..48624ebaa67684359f7f59e9c49b50672b9aa1e7 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 a2a43650dcdf9db0e48d4fe690ff88bfc9bf1f6c..d858accdbc0396e94f9a4b1c1f38d0a4884009fb 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 e000541ed10e1bad2c6caf74a7c463f4f2a0afef..2a9b3c7d8dea7afa3be6c550462607a4a43b3a9a 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 46ab85badcab4c4c80d416f6eaa27dfc38c19643..ea281c1a846dde94c66b13b0926c68b72dd5228b 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 d6e02d6c045443f3d918f50b7b802c34a72e3c32..dbb0373e161f449ddb05140149a693c79620c629 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 25aeb5fbfb5c01239bd8f9b67f5f50a511188a09..5d0459e9a99432e67a74bbe758a3a54b27848929 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 79f1c7d87226ab9da5536599a689383e912dbc1b..2375ca9bb8e8e5d1008ca14f92800335cfe82329 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 25aeb5fbfb5c01239bd8f9b67f5f50a511188a09..5d0459e9a99432e67a74bbe758a3a54b27848929 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 408edf31892090eb30fd716184e29816bafa49f8..09921c290168d7e9eac7547d8adc21dcd53c338a 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 7efd8fa63a2f4b584645d3c4ca9fa9ec92a1bf85..2deffa821b07cc1094ef5aaf0e0cb5da925bcd7f 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 749231d54782ec511fd3c0f075a63ec0ffd392a7..eb98025f2daaee719b4400317c69f7b9951c8411 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 8dd25693fa580fd23e2909bc537084f873001deb..a514b49d8263842eb193e3ce6e873f71787db8e2 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 fc81a23b8abf33d0e9f0b0bc6428434f779efb84..64270aeb90ee88a38f9421ad50eda8b424bf08c0 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 68f56852d98df438259a0df1d2d5e5596f58c43c..5ca33bf964f6c89ee2db2d8e364cad83a9c3e528 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 d313054956693bdc69f0d817da03a58fd28d2a91..29150ca991c90b656b1a8083431f328578a27159 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 8176422c8a7abc510f0f9063ec7285dc4469ca3e..a277c12db79ac5de663b8efd2728f23231117b33 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 f8b825ad868b056285aa595627aaf7c1e67e060c..a716a786b58ff342446e1f9931528a8f381ac210 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 0000000000000000000000000000000000000000..d8f9ef4e9b2fda6914a94c41fcce807c40e19a02 --- /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 0000000000000000000000000000000000000000..2cff97692d9dccc29c1296b34a9eb8167a61bf52 --- /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 0080f8e5301e04d00d9a760f7a5c8ac7972f3b9f..3b2c5d28c88f8941888347a8e550426580cc11b2 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 a1a85fc3ffc2cd0cb19d53e35824cd8e7aae5daa..9fb732bbb96a79f08e15de1ffc66372395fb5607 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 805431d5125822e48395c166a38fd09189cda85b..7d8e9eeafddbe9e4cb8f2ca55892d3af35064ecb 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 89af1894a798251d07b164ba2f1c0cff52eb6508..c38a08cabe40b1965846d985cd77a81d53f56fad 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 c17e9fc3cbe89dc3856cd03d9b24daa1978ea093..9023038afac1f5ec5aaf062dac1f28e047986bcc 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 92f137211f865690f8a23b3302d78851d9115fed..c023a4ddb62edf020105290e37c4529744ab448b 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 b7b87eb29902dc3ade916606c41051e0336523f5..3a1cafb97a2f4b2bacb34671983fd930adb45c78 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 61195c587bc061d85ac81e440efa70b97278fd23..5b0806ed803c4d8f29ac74577f4aef075500ef34 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 6aaab66f2c45886148587e6f1fa6e3a9ab5777ed..8e237458c7d3170ed97eb1eef83c54d6781d82f0 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 f10d538683258b532baa42baf04b1932f0bece1d..edf438bb1bb2ef56e6084470bc0cc5546a393ae3 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 8405fe509bc3dbedcc0645a06e0679e9fa9ea7f5..6b61a5d4726bff8d8d86242798d5c779fa68d9ff 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 b4f2b27dc7eb8fa021c2fdffd50d890a33265b8e..0c8b514fc0973e802e0695e17edf509c6d6d3687 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 c6e40444b845e9bb5cf2251f73887175d4483fce..b1e81b93ecc4874ad17ffa2d1dba6998005c6fab 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 d69b57dfd8addc94ef4cbdcb765ddf27778772c2..863f1f39584c1fbc57bf4ce2d6fe0f5c215851ce 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -284,6 +284,14 @@ false + + 0 + + + -1 + false false + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index b68756cdf51163d7952b59bb226aec47906b309b..38af096a6d7917c708c8631b91b9bb475d11815d 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 0000000000000000000000000000000000000000..febf65b834ee616210d30cc4ca6fd90f9d2dbec8 --- /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 94d79f27e67f9186bcafeab7e6f244f25c1b003f..ac1d4424da0ffde3204f58d4b54aa17aee573a17 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 3a7f03af40918c22b001f717686c206aa8b6f68c..4cd32e8f8f81c0dcd8a9b484def44f01457f71d0 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1019,6 +1019,12 @@ Network monitoring + + VPN + + + Network Logging + Disable VPN @@ -1026,16 +1032,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 @@ -1050,13 +1069,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 @@ -1088,7 +1107,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 @@ -1642,4 +1663,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 1cac8354c6ec29cb3df3029506a0394dca5550dc..2c2d501bc163ced6585dd37c2540dee0f5a9f3c1 100644 --- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java +++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java @@ -328,7 +328,8 @@ public class ExpandHelper implements Gefingerpoken { 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; } @@ -392,7 +393,8 @@ public class ExpandHelper implements Gefingerpoken { @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); @@ -487,7 +489,8 @@ public class ExpandHelper implements Gefingerpoken { 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; } @@ -535,28 +538,37 @@ public class ExpandHelper implements Gefingerpoken { 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; @@ -584,6 +596,9 @@ public class ExpandHelper implements Gefingerpoken { mFlingAnimationUtils.apply(mScaleAnimation, currentHeight, targetHeight, velocity); mScaleAnimation.start(); } else { + if (targetHeight != currentHeight) { + mScaler.setHeight(targetHeight); + } mCallback.setUserExpandedChild(mResizedView, nowExpanded); mCallback.setUserLockedChild(mResizedView, false); } @@ -606,7 +621,7 @@ public class ExpandHelper implements Gefingerpoken { * 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 19ae2954bb2ab16f4c93fa92af05fee4757067a2..b9ae585c339c541d265a7887fd898b476e636a61 100644 --- a/packages/SystemUI/src/com/android/systemui/Prefs.java +++ b/packages/SystemUI/src/com/android/systemui/Prefs.java @@ -49,6 +49,7 @@ public final class Prefs { 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 ce09e420a66681f91d62ad6960497c69caff6313..f96a8c4bc2132ceb21348eb9af13704d3116ecde 100755 --- 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 android.widget.ImageView; 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; @@ -285,7 +286,7 @@ public class AssistManager { @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 1338d9d547932fcec3eba4d9500fbdfc21917e3d..71ddba5ffdcc55128fdc801d8f6c31aa1633e933 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 class FalsingLog { 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 class FalsingLog { 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 class FalsingLog { 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 664e88676d9ad7e53a6d3d6c09489447551572d7..1abea37519e6c71a2059166dea6cdd128601f949 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 @@ public class FalsingManager implements SensorEventListener { private void onSessionStart() { if (FalsingLog.ENABLED) { FalsingLog.i("onSessionStart", "classifierEnabled=" + isClassiferEnabled()); + clearPendingWtf(); } mBouncerOn = false; mSessionActive = true; @@ -172,13 +174,35 @@ public class FalsingManager implements SensorEventListener { 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 class FalsingManager implements SensorEventListener { 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 class FalsingManager implements SensorEventListener { FalsingLog.i("onScreenTurningOn", new StringBuilder() .append("from=").append(mScreenOn ? 1 : 0) .toString()); + clearPendingWtf(); } mScreenOn = true; if (sessionEntrypoint()) { @@ -313,7 +345,11 @@ public class FalsingManager implements SensorEventListener { 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 9e0406af004c45a98ab64b31f162317f8595efe2..e43834710dc2507a533e27da52fcc91fa748529b 100755 --- 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; @@ -66,6 +68,8 @@ import android.view.animation.AnimationUtils; import cyanogenmod.app.Profile; import cyanogenmod.app.ProfileManager; +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; @@ -202,6 +206,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; @@ -338,6 +343,7 @@ public class KeyguardViewMediator extends SystemUI { private boolean mWakeAndUnlocking; private IKeyguardDrawnCallback mDrawnCallback; + private boolean mLockWhenSimRemoved; private boolean mIsPerUserLock; @@ -432,7 +438,7 @@ public class KeyguardViewMediator extends SystemUI { 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," @@ -443,11 +449,16 @@ public class KeyguardViewMediator extends SystemUI { 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 " @@ -459,7 +470,7 @@ public class KeyguardViewMediator extends SystemUI { } 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."); @@ -469,21 +480,38 @@ public class KeyguardViewMediator extends SystemUI { + "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(); @@ -641,9 +669,12 @@ public class KeyguardViewMediator extends SystemUI { mShowKeyguardWakeLock = mPM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "show keyguard"); mShowKeyguardWakeLock.setReferenceCounted(false); mProfileManager = ProfileManager.getInstance(mContext); - 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); @@ -1245,7 +1276,7 @@ public class KeyguardViewMediator extends SystemUI { // 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() @@ -1419,6 +1450,10 @@ public class KeyguardViewMediator extends SystemUI { } } } + } else if (Intent.ACTION_SHUTDOWN.equals(intent.getAction())) { + synchronized (KeyguardViewMediator.this){ + mShuttingDown = true; + } } } }; @@ -1983,6 +2018,7 @@ public class KeyguardViewMediator extends SystemUI { 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 b831235d1179e6596c624bce3225412f9c74208b..367c51c21a91cfd1eb816f833e7bf5012445db51 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.os.UserHandle; 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 class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 class PowerNotificationWarnings implements PowerUI.WarningsUI { 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 2f6db3099b9d36ca94beab8e634999ff3d18a42d..8fd305187198c76a452451170837bc6234ee068c 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java @@ -21,20 +21,24 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.res.Resources; import android.database.ContentObserver; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; 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.os.Vibrator; 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; @@ -47,11 +51,15 @@ import java.util.Arrays; 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; @@ -63,11 +71,18 @@ 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; + // For filtering ACTION_POWER_DISCONNECTED on boot private boolean mIgnoredFirstPowerBroadcast; 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)); @@ -83,6 +98,8 @@ public class PowerUI extends SystemUI { false, obs, UserHandle.USER_ALL); updateBatteryWarningLevels(); mReceiver.init(); + + initTemperatureWarning(); } void updateBatteryWarningLevels() { @@ -254,6 +271,107 @@ public class PowerUI extends SystemUI { } } + 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); @@ -280,6 +398,10 @@ public class PowerUI extends SystemUI { 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); } @@ -291,6 +413,8 @@ public class PowerUI extends SystemUI { 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 a172e19ff750b98ec3098f10b16787c711547416..cab2608e2317ac94c70257b1b6a36b03ad196b2e 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 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha 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 ccb28e95802e0c713984ce61917d1b1e5c6e0091..03c7588bca9cf3e10ce3f1cd41dc0510909812bb 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.Handler; 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 class QSFooter implements OnClickListener, DialogInterface.OnClickListene 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 class QSFooter implements OnClickListener, DialogInterface.OnClickListene } private void handleClick() { + showDeviceMonitoringDialog(); + } + + public void showDeviceMonitoringDialog() { mHost.collapsePanels(); // TODO: Delay dialog creation until after panels are collapsed. createDialog(); @@ -113,17 +127,29 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene } 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 class QSFooter implements OnClickListener, DialogInterface.OnClickListene } 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 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene 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 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene } } 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 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene @Override public void run() { mFooterIcon.setImageResource(mFooterIconId); + mFooterIcon2.setImageResource(mFooterIcon2Id); } }; @@ -230,6 +291,7 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene } 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 class QSFooter implements OnClickListener, DialogInterface.OnClickListene } } + 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 2bb1f8a581955f555f183c9baec04be547b3db5a..2acd7cab9282e0e0f43a303ef812b5ab74b23e67 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -518,6 +518,10 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { 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 2fda6eac6e0bfc8b01083ac9c77619fef001153f..f743a4bf1a82588782eec47aefcd78ee325b47dd 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 abstract class QSTile { 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 2fd62f1ebf264d1fa373dc39e84954d14c3b44c4..dfd2b77f7e79b97f7f7379f9fd3e1224b5956167 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 @@ package com.android.systemui.qs.external; 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 @@ public class CustomTile extends QSTile implements TileChangeListen 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 @@ public class CustomTile extends QSTile implements TileChangeListen 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 0de5105485dc25dc36be48acdd97f47ef3a23dd5..b34e881c17089757e30a6b439ead8c2627c304e4 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.QSTile; 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 @@ public class CellularTile extends QSTile { 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 class CellularTile extends QSTile { @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 class CellularTile extends QSTile { mInfo.activityOut = activityOut; mInfo.enabledDesc = description; mInfo.isDataTypeIconWide = qsType != 0 && isWide; + mInfo.roaming = roaming; refreshState(mInfo); } @@ -280,6 +282,8 @@ public class CellularTile extends QSTile { 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 9ce1f316c23f2c120c9449329748568fb1630cda..2e922e9f7bd307f9770c9006785f1fd8077e4895 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.qs.SignalTileView; 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 class WifiTile extends QSTile { } } - 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 5b25f0525d92fc8b5a6c577922f05d63307a0694..ba50c663a6bd1981ebfaa24e98b32956f4aafbef 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.recents.tv.RecentsTvImpl; 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 70642edde3ef4caa3c983c3e34aff6e60c0672eb..764397b938812bcc79dc8b59858146fe49cfa56b 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.Handler; 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 android.view.WindowManager.LayoutParams; 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.UserInteractionEvent; 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 class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD // 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 class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD 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 class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD } 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 class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD 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 914035bc525cb44b2879174f2755d30bb0228d5c..a7f6b70d281e1b21e5e1830c941bb89dea2ee967 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 class RecentsActivityLaunchState { /** * 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 class RecentsActivityLaunchState { 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 73c6e6e89c58df775a1273cbe60856f9aee4e77e..711f0c679b6de149edae1c55b88a79c36824a852 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.Context; 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 class RecentsConfiguration { 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 42d1b61a4addfe918a410ef74451b3ac971dbaf0..d34f5c4c2b985509e580f8425769b0d73817bbd1 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.DockedTopTaskEvent; 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.TaskStackView; 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 class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener 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 class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener 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 class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener 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 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener 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 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener 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 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener 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 a81487852e660515a8472f3e9739581f9118d338..02f6393666aa51920cd3be17a5730561961f2a43 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java +++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java @@ -234,21 +234,21 @@ public class ScreenPinningRequest implements View.OnClickListener { .setVisibility(View.INVISIBLE); } - final int description; if (hasNavigationBar()) { - description = R.string.screen_pinning_description; - final int backBgVisibility = - mAccessibilityService.isEnabled() ? View.INVISIBLE : View.VISIBLE; + boolean touchExplorationEnabled = mAccessibilityService.isTouchExplorationEnabled(); + ((TextView) mLayout.findViewById(R.id.screen_pinning_description)) + .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); } else { - description = R.string.screen_pinning_description_no_navbar; ((ViewGroup) buttons.getParent()).removeView(buttons); + ((TextView) mLayout.findViewById(R.id.screen_pinning_description)) + .setText(R.string.screen_pinning_description_no_navbar); } - ((TextView) mLayout.findViewById(R.id.screen_pinning_description)) - .setText(description); - addView(mLayout, getRequestLayoutParams(isLandscape)); } 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 0000000000000000000000000000000000000000..24913a4c2ca63ef670b234e8aa695dd329cc9c86 --- /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 0000000000000000000000000000000000000000..5508d269f03f9512c37067bf394df6ad5e30dd0b --- /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 930ed795af9fc9aeb2b8ba89534995936026b3b3..4b4db8236d1e3b3e159adead616d5488c6066252 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -78,6 +78,7 @@ import android.view.accessibility.AccessibilityManager; import com.android.internal.app.AssistUtils; import com.android.internal.os.BackgroundThread; import com.android.systemui.R; +import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsDebugFlags; import com.android.systemui.recents.RecentsImpl; import com.android.systemui.recents.model.Task; @@ -413,8 +414,7 @@ public class SystemServicesProxy { } return (homeStackVisibleNotOccluded && topActivity != null && topActivity.getPackageName().equals(RecentsImpl.RECENTS_PACKAGE) - && (topActivity.getClassName().equals(RecentsImpl.RECENTS_ACTIVITY) - || topActivity.getClassName().equals(RecentsTvImpl.RECENTS_TV_ACTIVITY))); + && Recents.RECENTS_ACTIVITIES.contains(topActivity.getClassName())); } catch (RemoteException e) { e.printStackTrace(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java index 2c5c437bfab0bff55d3c95a84bdce9ee9d1f8997..d64fc364cc86142ffbe1c8e9d60374109c04e95a 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 class Utilities { 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 9b48e4d02623c50043429b1a826fb8edb74b40d8..0ca4cb9031a48b8f3f4f67e7a2e5fac56e3dac1d 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.Bitmap; 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.RecentsConfiguration; 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 class RecentsTaskLoadPlan { 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 class RecentsTaskLoadPlan { 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 class RecentsTaskLoadPlan { 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 class RecentsTaskLoadPlan { 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 745f5a5a773e6a14c7f81d7288f4bdc90ce70130..9b25ef8faafd1bff7ef996c3d12604029a6f436c 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 @@ public class TaskStack { */ 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 class TaskStack { 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 class TaskStack { * @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 class TaskStack { 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 253d06a5f5f81883c938ed68c89f632194cffab2..dba085e37427029ba5c79ea9b032a50bd8a01b01 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 class AnimateableViewBounds extends ViewOutlineProvider { 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 d64a67600513466c33fbc0e285ceb55603d0f00b..79a774f7fba062db60effcb7b07429410f0685b9 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.graphics.drawable.Drawable; 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 @@ class FakeShadowDrawable extends Drawable { 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 808b5fbed1c2b9a040018735ae6add809fa79c96..5dee40f56a058c75d6cdc5f8de7caba20c7769c9 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -92,11 +92,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; @@ -108,8 +108,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; @@ -138,6 +138,10 @@ public class RecentsView extends FrameLayout { 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) { @@ -196,7 +200,6 @@ public class RecentsView extends FrameLayout { * 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 */); } @@ -213,7 +216,7 @@ public class RecentsView extends FrameLayout { * Returns the current TaskStack. */ public TaskStack getStack() { - return mStack; + return mTaskStackView.getStack(); } /* @@ -252,8 +255,7 @@ public class RecentsView extends FrameLayout { /** 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, @@ -348,7 +350,7 @@ public class RecentsView extends FrameLayout { 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)); @@ -449,8 +451,9 @@ public class RecentsView extends FrameLayout { 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) { @@ -526,8 +529,7 @@ public class RecentsView extends FrameLayout { 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 */); } }; @@ -548,7 +550,7 @@ public class RecentsView extends FrameLayout { 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 { @@ -610,7 +612,7 @@ public class RecentsView extends FrameLayout { 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); } @@ -772,7 +774,7 @@ public class RecentsView extends FrameLayout { 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); @@ -787,7 +789,7 @@ public class RecentsView extends FrameLayout { * @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() @@ -809,8 +811,8 @@ public class RecentsView extends FrameLayout { 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 493e6187c83e475fa2215662be02e80553c512aa..f1314aba1b466000f542b29625989928399e225c 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 @@ public class TaskStackAnimationHelper { 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 @@ public class TaskStackAnimationHelper { public TaskStackAnimationHelper(Context context, TaskStackView stackView) { mStackView = stackView; + mEnterAndExitFromHomeTranslationOffset = Recents.getConfiguration().isGridEnabled + ? 0 : DOUBLE_FRAME_OFFSET_MS; } /** @@ -260,7 +263,7 @@ public class TaskStackAnimationHelper { 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 class TaskStackAnimationHelper { 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 class TaskStackAnimationHelper { /** * 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 class TaskStackAnimationHelper { 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 fce7f9d51ea49aec16e0e10cea8bcd21b57f0525..5ab650729d97e1bfb43bdbf3fbb015ee29f1c2f6 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.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.TaskGridLayoutAlgorithm; import java.io.PrintWriter; import java.lang.annotation.Retention; @@ -212,6 +213,13 @@ public class TaskStackLayoutAlgorithm { } } + /** + * @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 TaskStackLayoutAlgorithm { // 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 TaskStackLayoutAlgorithm { @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 TaskStackLayoutAlgorithm { @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 TaskStackLayoutAlgorithm { // 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 class TaskStackLayoutAlgorithm { 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 class TaskStackLayoutAlgorithm { 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 class TaskStackLayoutAlgorithm { 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 class TaskStackLayoutAlgorithm { public boolean setSystemInsets(Rect systemInsets) { boolean changed = !mSystemInsets.equals(systemInsets); mSystemInsets.set(systemInsets); + mTaskGridLayoutAlgorithm.setSystemInsets(systemInsets); return changed; } @@ -471,6 +497,9 @@ public class TaskStackLayoutAlgorithm { updateFrontBackTransforms(); } + + // Initialize the grid layout + mTaskGridLayoutAlgorithm.initialize(windowRect); } /** @@ -722,6 +751,11 @@ public class TaskStackLayoutAlgorithm { } } + 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 class TaskStackLayoutAlgorithm { 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 class TaskStackLayoutAlgorithm { * 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 class TaskStackLayoutAlgorithm { * 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 class TaskStackLayoutAlgorithm { */ 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 @@ public class TaskStackLayoutAlgorithm { 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 fc580a5ecc19c2165fe0ee71612296ce854bb49b..3c5a14149d651334ce805458cd2810b936452867 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.FREEFORM_WORKSPACE_STACK_ID; 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.EnterRecentsWindowAnimationC 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.dragndrop.DragStartInitializeDropT 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } }); 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal * 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal * * @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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal * * @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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal /** * 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } } + // 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 d44aa844003f024f16104ec398f5940368d2022e..003138fa75aec5ac17fdcf8c1e3d480567d8f35b 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 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { /** 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 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { 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 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { 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 4ecdd77880011141dca9e51ff9d8575cb3199390..94e9df0f453b7f19047e73502f43c90e1047689c 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.misc.Utilities; 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 class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks 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 class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks 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 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks * 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 class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks 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 class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks /** * Update the task view when the configuration changes. */ - void onConfigurationChanged() { + protected void onConfigurationChanged() { mHeaderView.onConfigurationChanged(); } @@ -261,7 +269,6 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks return super.onInterceptTouchEvent(ev); } - @Override protected void measureContents(int width, int height) { int widthWithoutPadding = width - mPaddingLeft - mPaddingRight; @@ -360,12 +367,12 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks } /** Enables/disables handling touch on this task view. */ - void setTouchEnabled(boolean enabled) { + public void setTouchEnabled(boolean enabled) { setOnClickListener(enabled ? this : null); } /** Animates this task view if the user does not interact with the stack after a certain time. */ - void startNoUserInteractionAnimation() { + public void startNoUserInteractionAnimation() { mHeaderView.startNoUserInteractionAnimation(); } @@ -666,10 +673,16 @@ public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks @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 class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks 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 691e599aacf362a0b3e88ba8005491006283a63c..dc666e90fbdb49d70d86bfa7b24bfb2ff8bd6cfa 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 class TaskViewHeader extends FrameLayout 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 class TaskViewHeader extends FrameLayout // 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 class TaskViewHeader extends FrameLayout 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 class TaskViewHeader extends FrameLayout 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 @@ public class TaskViewHeader extends FrameLayout } } + /** + * 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 @@ public class TaskViewHeader extends FrameLayout * 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 class TaskViewHeader extends FrameLayout 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 c46adf15861fb68c7251e27774c3bae02d37fea6..83e2eb124bf785fe28ccfaebe3110967de0d4dd7 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 @@ package com.android.systemui.recents.views; 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.View; 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 class TaskViewThumbnail extends View { 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 @@ public class TaskViewThumbnail extends View { (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 class TaskViewThumbnail extends View { // 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 class TaskViewThumbnail extends View { } } + /** 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 @@ public class TaskViewThumbnail extends View { 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 0000000000000000000000000000000000000000..a029478c204595d230d1af049f051597cae6796a --- /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 0000000000000000000000000000000000000000..290727600286686792f10569aebf85669bedb054 --- /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 0000000000000000000000000000000000000000..afc0033eb81c60df108c7a42f49245de9ec3a490 --- /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 0000000000000000000000000000000000000000..4f175368aceb32cf9f0500001673854b3889a4fb --- /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 0000000000000000000000000000000000000000..86ed583b07aa8ce5cdcaddae3aa6eb488f0e02f2 --- /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 c9ce3e2901cdb48ab8872c16a3b0291c889e30f8..693e2d665a79ddaca045865c58d2dff99beffd19 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.WindowManager; 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 @@ class SaveImageInBackgroundTask extends AsyncTask { .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 @@ class SaveImageInBackgroundTask extends AsyncTask { mParams.clearContext(); // Cancel the posted notification - mNotificationManager.cancel(R.id.notification_screenshot); + mNotificationManager.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT); } } @@ -876,7 +879,7 @@ class GlobalScreenshot { Notification n = new Notification.BigTextStyle(b) .bigText(errorMsg) .build(); - nManager.notify(R.id.notification_screenshot, n); + nManager.notify(SystemMessage.NOTE_GLOBAL_SCREENSHOT, n); } /** @@ -888,7 +891,7 @@ class GlobalScreenshot { // Clear the notification final NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancel(R.id.notification_screenshot); + nm.cancel(SystemMessage.NOTE_GLOBAL_SCREENSHOT); } } @@ -906,7 +909,7 @@ class GlobalScreenshot { 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 cde1f7dfac50f86bda3b544a06c73f8af74741f5..6df338725ab89993c8bb1cef60f22a445ea1d726 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.RemoteException; 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 @@ public class BrightnessController implements ToggleSlider.Listener { 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 class BrightnessController implements ToggleSlider.Listener { 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 class BrightnessController implements ToggleSlider.Listener { 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 class BrightnessController implements ToggleSlider.Listener { 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 class BrightnessController implements ToggleSlider.Listener { } }; + 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 class BrightnessController implements ToggleSlider.Listener { 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 class BrightnessController implements ToggleSlider.Listener { 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 class BrightnessController implements ToggleSlider.Listener { 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 class BrightnessController implements ToggleSlider.Listener { 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 class BrightnessController implements ToggleSlider.Listener { 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 @@ public class BrightnessController implements ToggleSlider.Listener { 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 bc4654823f777b17d3612ce686aa18d7c05d5578..6b30c0cf25dff104ccf6ea874050ee43b66edd31 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 abstract class ActivatableNotificationView extends ExpandableOutlineView 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 abstract class ActivatableNotificationView extends ExpandableOutlineView boolean wasActivated = mActivated; result = handleTouchEventDimmed(event); if (wasActivated && result && event.getAction() == MotionEvent.ACTION_UP) { - mFalsingManager.onNotificationDoubleTap(); removeCallbacks(mTapTimeoutRunnable); } } else { @@ -283,9 +287,21 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView 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 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView && 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 081b2ae6de0faf7b7399c85d5af2a02dc9030c8f..ce8a9fcb78d65795e3223568d25d28f66bd4bdf7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -89,6 +89,7 @@ import android.widget.Toast; 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; @@ -104,6 +105,7 @@ import com.android.systemui.assist.AssistManager; 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; @@ -119,6 +121,7 @@ import java.util.HashSet; 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; import static android.service.notification.NotificationListenerService.Ranking.IMPORTANCE_MIN; @@ -128,8 +131,7 @@ import static android.service.notification.NotificationListenerService.Ranking.i 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; @@ -183,6 +185,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(); @@ -551,7 +556,7 @@ public abstract class BaseStatusBar extends SystemUI implements } 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); @@ -882,7 +887,7 @@ public abstract class BaseStatusBar extends SystemUI implements NotificationManager noMan = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - noMan.notify(R.id.notification_hidden, note.build()); + noMan.notify(SystemMessage.NOTE_HIDDEN_NOTIFICATIONS, note.build()); } } @@ -991,12 +996,12 @@ public abstract class BaseStatusBar extends SystemUI implements // 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(); @@ -1006,14 +1011,8 @@ public abstract class BaseStatusBar extends SystemUI implements 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. @@ -2028,8 +2027,7 @@ public abstract class BaseStatusBar extends SystemUI implements Runnable removeRunnable = new Runnable() { @Override public void run() { - performRemoveNotification(parentToCancelFinal, - true); + performRemoveNotification(parentToCancelFinal); } }; if (isCollapsing()) { @@ -2280,9 +2278,8 @@ public abstract class BaseStatusBar extends SystemUI implements */ 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; @@ -2290,14 +2287,23 @@ public abstract class BaseStatusBar extends SystemUI implements 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(); @@ -2314,7 +2320,9 @@ public abstract class BaseStatusBar extends SystemUI implements } } 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 @@ -2324,6 +2332,14 @@ public abstract class BaseStatusBar extends SystemUI implements 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 @@ -2563,9 +2579,7 @@ public abstract class BaseStatusBar extends SystemUI implements return false; } - boolean inUse = mPowerManager.isScreenOn() - && (!mStatusBarKeyguardViewManager.isShowing() - || mStatusBarKeyguardViewManager.isOccluded()); + boolean inUse = mPowerManager.isScreenOn(); try { inUse = inUse && !mDreamManager.isDreaming(); } catch (RemoteException e) { @@ -2605,7 +2619,9 @@ public abstract class BaseStatusBar extends SystemUI implements 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 bf09351d6c200a25eb6436efa96664c6558ca057..f4935d97c934235581dcfd305dce1dbd97bfc7c5 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.internal.util.NotificationColorUtil; 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 class ExpandableNotificationRow extends ActivatableNotificationView { return mStatusBarNotification; } + public NotificationData.Entry getEntry() { + return mEntry; + } + public boolean isHeadsUp() { return mIsHeadsUp; } @@ -451,10 +456,15 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { * 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) { @@ -1206,7 +1216,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { 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()) { @@ -1347,6 +1357,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { NotificationContentView showingLayout = getShowingLayout(); showingLayout.updateBackgroundColor(animated); mPrivateLayout.updateExpandButtons(isExpandable()); + showingLayout.setDark(isDark(), false /* animate */, 0 /* delay */); mShowingPublicInitialized = true; } @@ -1504,11 +1515,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { @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 58d57f68d699b6c686609892582eb9f994a51437..8fdc32234aa5c26f5c448bba162bff494869c9a2 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 @@ public class NotificationContentView extends FrameLayout { 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 class NotificationContentView extends FrameLayout { 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 @@ public class NotificationContentView extends FrameLayout { 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 class NotificationContentView extends FrameLayout { 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 c0968b51422793fe51059e40fc16781411febc65..fb1166978b8fd3d51cda292998fb74f261851573 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -396,20 +396,6 @@ public class NotificationData { 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/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index 5217471f9814b73ba56903e4eb1b370e25dde318..72bcda4475cfca0ab4384acbe46eb1bf91fa3d07 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 class SignalClusterView @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 class SignalClusterView state.mMobileDescription = statusIcon.contentDescription; state.mMobileTypeDescription = typeContentDescription; state.mIsMobileTypeIconWide = statusType != 0 && isWide; + state.mRoaming = roaming; apply(); } @@ -587,7 +588,8 @@ public class SignalClusterView 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) @@ -601,6 +603,7 @@ public class SignalClusterView 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) { @@ -636,6 +639,7 @@ public class SignalClusterView (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId)); mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE); + mMobileRoaming.setVisibility(mRoaming ? View.VISIBLE : View.GONE); return mMobileVisible; } @@ -695,6 +699,8 @@ public class SignalClusterView 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 0000000000000000000000000000000000000000..4a52acccd4f069742d429927ece6239b87ac9523 --- /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 0000000000000000000000000000000000000000..eaf552cda399a3a5c35a679ee3f787adc8d7ad04 --- /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 5014c61434357d14f58c29922fb01a26a12ab1aa..a43a241b3a473036f2d1d60d1cf6e4bbc83f6223 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 implements Drawable.Callback { private int mImageResource = -1; private Drawable mImageDrawable; private View mCurrentView; + private boolean mVertical; public ButtonDispatcher(int id) { mId = id; @@ -49,13 +50,6 @@ public class ButtonDispatcher implements Drawable.Callback { 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); @@ -76,6 +70,10 @@ public class ButtonDispatcher implements Drawable.Callback { ((ButtonInterface) view).setImageDrawable(mImageDrawable); updateDrawable(); } + + if (view instanceof ButtonInterface) { + ((ButtonInterface) view).setVertical(mVertical); + } } public int getId() { @@ -218,6 +216,17 @@ public class ButtonDispatcher implements Drawable.Callback { } } + 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. */ @@ -228,7 +237,7 @@ public class ButtonDispatcher implements Drawable.Callback { 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 9bb49362c56031e3e982948d9bea053f507bd99e..695b500363e2719b7cd7fb63b3ae5b51eb554f97 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 @@ import com.android.systemui.statusbar.policy.AccessibilityController; */ 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 class LockIcon extends KeyguardAffordanceView { } 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 class LockIcon extends KeyguardAffordanceView { 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 d5fb9055410a3e8b3270b07913f17a0466a2fe92..422bae40652cdf840d812377cbed29b3a4190cf6 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 @@ package com.android.systemui.statusbar.phone; 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; @@ -65,12 +67,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; @@ -78,6 +81,10 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi 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() { @@ -206,17 +213,17 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi 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) { @@ -225,7 +232,7 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi 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); } } @@ -238,27 +245,17 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi } @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 (MENU_IME_ALWAYS_SHOW.equals(button)) { @@ -286,15 +283,15 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi 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; } @@ -333,37 +330,22 @@ public class NavigationBarInflaterView extends FrameLayout implements TunerServi 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 050e0245ba69bbc687b4cdf9910c7c258da57dba..2d73a4a31a49e779b888079287e8a0c74f68e8fa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -592,6 +592,7 @@ public class NavigationBarView extends LinearLayout implements TunerService.Tuna getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener); mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone); + mDeadZone.setDisplayRotation(mCurrentRotation); mDeadZone.setStartFromRight(mLeftInLandscape); // force the low profile & disabled states into compliance @@ -605,6 +606,8 @@ public class NavigationBarView extends LinearLayout implements TunerService.Tuna 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 2c8339a1dc2215325cd2e940d3f62b570a1f8da7..f25e59941b11a67dc10f99be2e78376be50096c3 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.ExpandableNotificationRow; 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 @@ import java.util.Map; /** * 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 d51d1e90e7042df6c9f224b36579e20da0618494..acdeac4dcba6fa5579226589311b7d1175c6150e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -63,6 +63,7 @@ import com.android.systemui.statusbar.StatusBarState; 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.policy.WeatherController; import com.android.systemui.statusbar.policy.WeatherControllerImpl; import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; @@ -80,7 +81,7 @@ public class NotificationPanelView extends PanelView implements ExpandableView.OnHeightChangedListener, View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener, KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener, - HeadsUpManager.OnHeadsUpChangedListener, WeatherController.Callback, TunerService.Tunable { + OnHeadsUpChangedListener, WeatherController.Callback, TunerService.Tunable { 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 ab9eae0b37c471cb2ff18c00b89c20b9951ddd85..d4006de8afb2e6a976f862e1499ff1be90624917 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -37,6 +37,7 @@ import android.annotation.NonNull; 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; @@ -117,6 +118,7 @@ import android.view.ViewStub; 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.FrameLayout; @@ -177,6 +179,7 @@ import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.SignalClusterView; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.VisualizerView; +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; @@ -189,12 +192,14 @@ import com.android.systemui.statusbar.policy.EncryptionHelper; 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; @@ -207,7 +212,6 @@ import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; 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.tuner.TunerService; import com.android.systemui.volume.VolumeComponent; @@ -227,7 +231,7 @@ import static android.service.notification.NotificationListenerService.Ranking.i public class PhoneStatusBar extends BaseStatusBar implements DemoMode, DragDownHelper.DragDownCallback, ActivityStarter, OnUnlockMethodChangedListener, - HeadsUpManager.OnHeadsUpChangedListener, TunerService.Tunable { + OnHeadsUpChangedListener, VisualStabilityManager.Callback, TunerService.Tunable { static final String TAG = "PhoneStatusBar"; public static final boolean DEBUG = BaseStatusBar.DEBUG; public static final boolean SPEW = false; @@ -671,9 +675,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, */ protected boolean mStartedGoingToSleep; - private static final int VISIBLE_LOCATIONS = StackViewState.LOCATION_FIRST_HUN - | StackViewState.LOCATION_MAIN_AREA; - private final OnChildLocationsChangedListener mNotificationLocationsChangedListener = new OnChildLocationsChangedListener() { @Override @@ -722,8 +723,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, 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) { @@ -772,6 +772,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private RankingMap mLatestRankingMap; private boolean mNoAnimationOnNextBarModeChange; private FalsingManager mFalsingManager; + private long mLastLockToAppLongPress; private KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -873,6 +874,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, @Override public boolean onTouch(View v, MotionEvent event) { checkUserAutohide(v, event); + checkRemoteInputOutside(event); if (event.getAction() == MotionEvent.ACTION_DOWN) { if (mExpandedVisible) { animateCollapsePanels(); @@ -902,9 +904,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, 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( @@ -934,6 +938,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mStackScroller.setGroupManager(mGroupManager); mStackScroller.setHeadsUpManager(mHeadsUpManager); mGroupManager.setOnGroupChangeListener(mStackScroller); + mVisualStabilityManager.setVisibilityLocationProvider(mStackScroller); inflateOverflowContainer(); inflateEmptyShadeView(); @@ -1131,6 +1136,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, 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); filter.addAction(cyanogenmod.content.Intent.ACTION_SCREEN_CAMERA_GESTURE); context.registerReceiverAsUser(mBroadcastReceiver, UserHandle.ALL, filter, null, null); @@ -1328,8 +1334,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, 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); + } } } } @@ -1460,29 +1468,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } }; - 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) { @@ -1567,11 +1552,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, 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); @@ -1743,8 +1728,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, 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)) { @@ -1845,8 +1833,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } 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 @@ -1862,12 +1857,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } @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 @@ -1896,6 +1891,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, final int N = activeNotifications.size(); for (int i=0; i flag clear @@ -3871,6 +3906,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, onCameraLaunchGestureDetected(StatusBarManager.CAMERA_LAUNCH_SOURCE_SCREEN_GESTURE); } + else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) { + mQSPanel.showDeviceMonitoringDialog(); + } } }; @@ -4741,13 +4779,17 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, 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. @@ -4795,6 +4837,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mState = state; mVisualizerView.setStatusBarState(state); mGroupManager.setStatusBarState(state); + mHeadsUpManager.setStatusBarState(state); mFalsingManager.setStatusBarState(state); mStatusBarWindowManager.setStatusBarState(state); updateReportRejectedTouchVisibility(); @@ -4843,7 +4886,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, public void onTrackingStopped(boolean expand) { if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) { if (!expand && !mUnlockMethodCache.canSkipBouncer()) { - showBouncer(); + showBouncerIfKeyguard(); } } } @@ -4934,7 +4977,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, || !mShowLockscreenNotifications || mFalsingManager.shouldEnforceBouncer(); if (isLockscreenPublicMode() && fullShadeNeedsBouncer) { mLeaveOpenOnKeyguardHide = true; - showBouncer(); + showBouncerIfKeyguard(); mDraggedDownRow = row; mPendingRemoteInputView = null; } else { @@ -5090,6 +5133,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mWakeUpComingFromTouch = false; mWakeUpTouchLocation = null; mStackScroller.setAnimationsEnabled(false); + mVisualStabilityManager.setScreenOn(false); updateVisibleToUser(); if (mLaunchCameraOnFinishedGoingToSleep) { mLaunchCameraOnFinishedGoingToSleep = false; @@ -5108,6 +5152,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, public void onStartedWakingUp() { mDeviceInteractive = true; mStackScroller.setAnimationsEnabled(true); + mVisualStabilityManager.setScreenOn(true); mNotificationPanel.setTouchDisabled(false); updateVisibleToUser(); } @@ -5134,16 +5179,59 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } /** - * 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) { @@ -5152,6 +5240,18 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, 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 e816e81afadfcd165df4cdc11b1b13369ee2bb6f..00e95eeb8b9072de5b9f7fc693436ee44592a956 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java @@ -29,6 +29,7 @@ import android.os.UserManager; import android.provider.AlarmClock; import android.provider.CalendarContract; import android.util.AttributeSet; +import android.util.SparseBooleanArray; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -47,6 +48,10 @@ import com.android.systemui.qs.QuickQSPanel; 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; @@ -55,7 +60,8 @@ import com.android.systemui.statusbar.policy.WeatherController; 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"; @@ -99,6 +105,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); @@ -281,7 +289,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements 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); @@ -291,15 +299,21 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements } 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); } } @@ -421,6 +435,29 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements } } + @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 35e084db9cd7e28de809b53ce62173e7edfba0ba..9f2d446275d05b01a7098f2802f9c4f7bb269940 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.R; 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 @@ import com.android.systemui.statusbar.stack.StackStateAnimator; * 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 3142ddfe9fb71fe40112c76b7eb3fddfe1beb64b..616d2105520252c8cdf202de1ef2c43baacef482 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 class CallbackHandler extends Handler implements EmergencyListener, Signa 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 c7c2446e78f61213af050a0d0ef31148dd0a8a51..dafaf3cc4dc02ee27274fa657b88768548dd156a 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.os.SystemClock; 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; @@ -55,6 +56,7 @@ public class DeadZone extends View { private boolean mVertical; private boolean mStartFromRight; private long mLastPokeTime; + private int mDisplayRotation; private final Runnable mDebugFlash = new Runnable() { @Override @@ -205,4 +207,8 @@ public class DeadZone extends View { // 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 8abfb89b3f694df1b24264f2df64a203681cc372..a2d1baf96da8da508c8f5972e0f85654f56a30bf 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 @@ import java.util.List; 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 @@ public class EmergencyCryptkeeperText extends TextView { super.onAttachedToWindow(); mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext); mKeyguardUpdateMonitor.registerCallback(mCallback); + getContext().registerReceiver(mReceiver, + new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); update(); } @@ -67,6 +78,7 @@ public class EmergencyCryptkeeperText extends TextView { 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 f6c0942d7ed0008edfd3723b844cf5292392cfbe..edca70443c5e7ce2e5fa187a3fa2f64cfecb2e28 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.Handler; 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.internal.logging.MetricsLogger; 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 @@ import java.util.Stack; * 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 class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL 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 class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL 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 @@ public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL } 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 class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL } } + @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 class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL 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 class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL 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 class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL } } - 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 ddbc75765b3820bb814a98ce1b2d5b512960f373..089c6e725e7c1b38b60d42906d7d6ca1932bd2be 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -303,7 +303,7 @@ public class KeyButtonView extends ImageView implements ButtonDispatcher.ButtonI } @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 71f4b5a8bc3bd939f44a3b19776962fbc86f484d..866c5aef931e1bba64353e2bcfc80763039e92cb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -231,10 +231,8 @@ public class MobileSignalController extends SignalController< 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); @@ -254,13 +252,11 @@ public class MobileSignalController extends SignalController< 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 @@ -417,10 +413,9 @@ public class MobileSignalController extends SignalController< 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; } @@ -553,6 +548,7 @@ public class MobileSignalController extends SignalController< boolean carrierNetworkChangeMode; boolean isDefault; boolean userSetup; + boolean roaming; @Override public void copyFrom(State s) { @@ -567,6 +563,7 @@ public class MobileSignalController extends SignalController< airplaneMode = state.airplaneMode; carrierNetworkChangeMode = state.carrierNetworkChangeMode; userSetup = state.userSetup; + roaming = state.roaming; } @Override @@ -577,6 +574,7 @@ public class MobileSignalController extends SignalController< 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(','); @@ -596,7 +594,8 @@ public class MobileSignalController extends SignalController< && ((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 5f1b8719c9b00bc4ab49382d0348b7f4f45d0c86..ad5f24b8f3629f1e348e20d4009920b769c3128c 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 @@ public interface NetworkController { 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 0ec9b49170c8efa44e794ee3d6273b769c87280c..d68bbb9e972e868b527e3c3986581b663c47f8fe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -788,9 +788,11 @@ public class NetworkControllerImpl extends BroadcastReceiver datatype.equals("h+") ? TelephonyIcons.HP : 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) { @@ -798,6 +800,10 @@ public class NetworkControllerImpl extends BroadcastReceiver : 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 0000000000000000000000000000000000000000..5444f06df9b5ddb7fe9b6fe615ad7cf2668f40c1 --- /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 014afae7bf5a6472b8978b8df27dc25790523b85..63d4381e4aaaae6cdf340304a57885f58ed20ba6 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 07d3b596bc056005978cf5d49f32ecb4b73f7a32..65a119ac0f1c7ec1dbf0422e2a281a6941581fa6 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 class SecurityControllerImpl implements SecurityController { 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 dce889f831dab00ce4858f32b5e25eaac44748d1..0000000000000000000000000000000000000000 --- 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 aeb10a96fb8c55cebe030776fea19da191d909f1..2d5c655467b7d61b34c12b3f3e6db6e0c8c0182e 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 @@ -225,7 +223,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; @@ -440,21 +438,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 27ba003c6ef17c1818c36abc4f6dd4fc230b068a..85888a3b2082dc24e515fca2cea4a3209e7b10fa 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.view.ViewGroup; 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 @@ public class UserSwitcherController { 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 @@ public class UserSwitcherController { 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 d7920a9b1e7b3f890af6e24268b2acf7c7d7e3a6..24aae3852d9bcac7d888916efd1c315c40567f54 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.HybridGroupManager; 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 class NotificationChildrenContainer extends ViewGroup { * 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 class NotificationChildrenContainer extends ViewGroup { 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 class NotificationChildrenContainer extends ViewGroup { } 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 a6fe4382475eb47dfe21a3f066aad5fbe0a7724e..9c9699000150ac83d78d183f16b48a334efce723 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.StackScrollerDecorView; 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 @@ import java.util.HashSet; 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"; @@ -536,21 +537,19 @@ public class NotificationStackScrollLayout extends ViewGroup 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) { @@ -1023,6 +1022,19 @@ public class NotificationStackScrollLayout extends ViewGroup 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); } @@ -4581,5 +4593,4 @@ public class NotificationStackScrollLayout extends ViewGroup 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 ecdee4eaecbac16b0a0d46db2de44f11953b8815..f22a4107e205ab88c795e8289592a01f073b7621 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 f9defb53536ee2c0d7aa4019538c0c32ef2dfb1f..5cd8c906a894209a83b6e0b7e851609060fcb432 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.Log; 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 @@ import java.util.List; 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 class StorageNotification extends SystemUI { @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 class StorageNotification extends SystemUI { 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 @@ public class StorageNotification extends SystemUI { 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 @@ public class StorageNotification extends SystemUI { .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 @@ public class StorageNotification extends SystemUI { .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 @@ public class StorageNotification extends SystemUI { * @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) { @@ -313,9 +314,11 @@ public class StorageNotification extends SystemUI { } 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); } } @@ -498,7 +501,7 @@ public class StorageNotification extends SystemUI { .setOngoing(true); SystemUI.overrideNotificationAppName(mContext, builder); - mNotificationManager.notifyAsUser(move.packageName, MOVE_ID, + mNotificationManager.notifyAsUser(move.packageName, SystemMessage.NOTE_STORAGE_MOVE, builder.build(), UserHandle.ALL); } @@ -506,7 +509,8 @@ public class StorageNotification extends SystemUI { 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; } @@ -547,8 +551,8 @@ public class StorageNotification extends SystemUI { .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 15c163f6e2813f43f0b7693e714c250bc1ee6629..00cd04f9ddfd87e68aedfdb8329e200868d1f19c 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -544,8 +544,9 @@ public class ZenModePanel extends LinearLayout { setToMidnight(nextAlarm); if (weekRange.compareTo(nextAlarm) >= 0) { - return ZenModeConfig.toNextAlarmCondition(mContext, now, - nextAlarmMs, ActivityManager.getCurrentUser()); + return ZenModeConfig.toTimeCondition(mContext, nextAlarmMs, + Math.round((nextAlarmMs - now) / (float) MINUTES_MS), + ActivityManager.getCurrentUser(), true); } } return null; diff --git a/packages/SystemUI/tests/src/com/android/systemui/notification/VisualStabilityManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/notification/VisualStabilityManagerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..3b8d6b51d5d7163bd53d2b6dba8f83c9bc78472a --- /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 19cb24322095826e95d1645feae42e38edca9ae8..d01ecb190b35d289cd72cb8cdb36edd64e589feb 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 org.mockito.MockitoAnnotations; 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 class CallbackHandlerTest extends AndroidTestCase { 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 class CallbackHandlerTest extends AndroidTestCase { 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 38cac1e7403157c002308cfb08c88a9f321f43b5..29b6976dc57c591c72050f628cba2a424321f376 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.io.StringWriter; 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 @@ public class NetworkControllerBaseTest extends SysuiTestCase { 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 @@ public class NetworkControllerBaseTest extends SysuiTestCase { } 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 542c39021ee90709b7a9a140d5940c7b4660a0de..fce1172ff625161a990494f0861b8585df81177c 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 class NetworkControllerDataTest extends NetworkControllerBaseTest { 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 08da382a2fbe2e22ecd13b5833aa8f8e0b6704ed..1912bf042e8b21902402a9271e68d7691d7945df 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 class NetworkControllerSignalTest extends NetworkControllerBaseTest { 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 class NetworkControllerSignalTest extends NetworkControllerBaseTest { 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 d7c4e1e06514b7da2bd922f516cdf2fafa6362c8..15658a42c9015f5ac255a0f2bef7df5622aec32d 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 class NetworkControllerWifiTest extends NetworkControllerBaseTest { 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 ff934ef18677a2281dd2b793c6e03e991d600b9c..4254a0ba200ab00cad3ba77c8d16ca879e25ab43 100644 --- a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java +++ b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java @@ -217,9 +217,6 @@ public class WallpaperBackupAgent extends BackupAgent { 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 class WallpaperBackupAgent extends BackupAgent { 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 735afce21cdb7c107d3e1990015c1b55dbfbb2ef..bdcd36b8ea1c981b27735d3519c13b36d9b1dc1f 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -2213,10 +2213,44 @@ 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; + // OPEN: QS NFC tile shown // ACTION: QS NFC tile tapped // CATEGORY: QUICK_SETTINGS - QS_NFC = 497; + QS_NFC = 499; + + // 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 0000000000000000000000000000000000000000..5b917761a6f6f938838ea19d7bdaea183ed5894e --- /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 c04191bb095d4ce8177f632675604f802a2842d5..49a71b430ac67b4b3c0939a36c1b3b3d92e9971c 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java +++ b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java @@ -2441,10 +2441,10 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { * @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 e00178f8ea411923923dfc2e230d947e4f7ed23c..34ccb7b82c87c7c77d9519d26816cc146ea25885 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 class AccessibilityManagerService extends IAccessibilityManager.Stub { @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 class AccessibilityManagerService extends IAccessibilityManager.Stub { 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 class AccessibilityManagerService extends IAccessibilityManager.Stub { sendDownAndUpKeyEvents(KeyEvent.KEYCODE_HOME); } return true; case AccessibilityService.GLOBAL_ACTION_RECENTS: { - openRecents(); - } return true; + return openRecents(); + } case AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS: { expandNotifications(); } return true; @@ -3385,14 +3394,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { Binder.restoreCallingIdentity(token); } - private void openRecents() { + private boolean openRecents() { final long token = Binder.clearCallingIdentity(); - - StatusBarManagerInternal statusBarService = LocalServices.getService( - StatusBarManagerInternal.class); - statusBarService.toggleRecentApps(); - - Binder.restoreCallingIdentity(token); + try { + StatusBarManagerInternal statusBarService = LocalServices.getService( + StatusBarManagerInternal.class); + if (statusBarService == null) { + return false; + } + statusBarService.toggleRecentApps(); + } finally { + Binder.restoreCallingIdentity(token); + } + return true; } private void showGlobalActions() { diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index bfa0b91203411c0fd4678f25074b4e5e73f3071e..6c03c1e5640c9b0a4dd5ce0bad054f53c33d900f 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.List; 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku // 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku // 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku // 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } 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); @@ -3431,11 +3436,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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: { @@ -3443,11 +3448,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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: { @@ -3463,13 +3468,13 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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; } } @@ -3785,7 +3790,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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); @@ -3812,18 +3817,18 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku */ 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: @@ -3837,7 +3842,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku default: update = PendingHostUpdate.viewDataChanged(appWidgetId, id); } - outUpdates.put(time, update); + outUpdates.put(requestId, update); } return true; } @@ -3919,8 +3924,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku 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 21393dafb888243b43f8be33afa73125f0816426..b5c91ed8a3c47ae4391639406259bc93c01b0ac5 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 f93c716ae162321e4a88853e514de5c96de5712a..d56492521276b242b2cfefd4815c1bfffca7f1f8 100644 --- a/services/core/java/com/android/server/AnyMotionDetector.java +++ b/services/core/java/com/android/server/AnyMotionDetector.java @@ -97,6 +97,15 @@ public class AnyMotionDetector { /** 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 class AnyMotionDetector { 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 class AnyMotionDetector { mWakeLock.acquire(); Message wakelockTimeoutMsg = Message.obtain(mHandler, mWakelockTimeout); mHandler.sendMessageDelayed(wakelockTimeoutMsg, WAKELOCK_TIMEOUT_MILLIS); + mWakelockTimeoutIsActive = true; startOrientationMeasurementLocked(); } } @@ -157,17 +170,20 @@ public class AnyMotionDetector { 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 @@ public class AnyMotionDetector { } Message measurementTimeoutMsg = Message.obtain(mHandler, mMeasurementTimeout); mHandler.sendMessageDelayed(measurementTimeoutMsg, ACCELEROMETER_DATA_TIMEOUT_MILLIS); + mMeasurementTimeoutIsActive = true; } } @@ -191,8 +208,9 @@ public class AnyMotionDetector { 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 @@ public class AnyMotionDetector { 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 @@ public class AnyMotionDetector { " milliseconds."); Message msg = Message.obtain(mHandler, mSensorRestart); mHandler.sendMessageDelayed(msg, ORIENTATION_MEASUREMENT_INTERVAL_MILLIS); + mSensorRestartIsActive = true; } } return status; @@ -283,6 +303,7 @@ public class AnyMotionDetector { } if (status != RESULT_UNKNOWN) { mHandler.removeCallbacks(mWakelockTimeout); + mWakelockTimeoutIsActive = false; mCallback.onAnyMotionResult(status); } } @@ -296,7 +317,10 @@ public class AnyMotionDetector { @Override public void run() { synchronized (mLock) { - startOrientationMeasurementLocked(); + if (mSensorRestartIsActive == true) { + mSensorRestartIsActive = false; + startOrientationMeasurementLocked(); + } } } }; @@ -306,14 +330,18 @@ public class AnyMotionDetector { 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 class AnyMotionDetector { @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 4f36c65b00bd922cb6024aba6f2516d88a7f0af4..3656d40b4fe57deacfb176c0f5fda9db3510024e 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -32,6 +32,7 @@ import android.bluetooth.IBluetoothManager; 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; @@ -39,10 +40,12 @@ import android.content.Context; 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.database.ContentObserver; import android.os.Binder; +import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -56,13 +59,16 @@ import android.os.UserManager; 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; + class BluetoothManagerService extends IBluetoothManager.Stub { private static final String TAG = "BluetoothManagerService"; private static final boolean DBG = true; @@ -102,6 +108,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; @@ -119,7 +126,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. @@ -135,16 +141,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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } } - 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { /** * 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } } - 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 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } } - public boolean enableNoAutoConnect() + public boolean enableNoAutoConnect(String packageName) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH ADMIN permission"); @@ -654,50 +707,72 @@ class BluetoothManagerService extends IBluetoothManager.Stub { synchronized(mReceiver) { mQuietEnableExternal = true; mEnableExternal = true; - sendEnableMsg(true); + sendEnableMsg(true, packageName); } return true; } - public boolean enable(String callingPackage) { - if ((Binder.getCallingUid() != Process.SYSTEM_UID) && - (!checkIfCallerIsForegroundUser())) { - Slog.w(TAG,"enable(): not allowed for non-active and non system user"); - return false; + public boolean enable(String packageName) throws RemoteException { + final int callingUid = Binder.getCallingUid(); + final boolean callerSystem = UserHandle.getAppId(callingUid) == Process.SYSTEM_UID; + + 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 (!isEnabled() && mPermissionReviewRequired + && startConsentUiIfNeeded(packageName, callingUid, + BluetoothAdapter.ACTION_REQUEST_ENABLE)) { + return false; + } } - mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, - "Need BLUETOOTH ADMIN permission"); 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)); } AppOpsManager appOps = (AppOpsManager) mContext .getSystemService(Context.APP_OPS_SERVICE); - int callingUid = Binder.getCallingUid(); + if (appOps.noteOp(AppOpsManager.OP_BLUETOOTH_CHANGE, callingUid, - callingPackage) != AppOpsManager.MODE_ALLOWED) + packageName) != AppOpsManager.MODE_ALLOWED) return false; 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) { @@ -707,21 +782,48 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 { @@ -736,16 +838,13 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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 { @@ -829,7 +928,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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); @@ -1015,7 +1114,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { * 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."); @@ -1034,7 +1132,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { * 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."); @@ -1106,34 +1203,33 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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; mHandler.sendMessage(msg); } - 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); @@ -1151,7 +1247,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { @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"); @@ -1189,7 +1284,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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; @@ -1200,8 +1295,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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; } } @@ -1239,6 +1335,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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); @@ -1254,31 +1351,25 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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: @@ -1351,13 +1442,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub { //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"); } } @@ -1375,19 +1464,14 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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 @@ -1395,7 +1479,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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) && @@ -1405,7 +1489,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 @@ -1432,7 +1516,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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) { @@ -1443,7 +1527,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mBluetoothGatt = null; break; } else { - Slog.e(TAG, "Bad msg.arg1: " + msg.arg1); + Slog.e(TAG, "Unknown argument for service disconnect!"); break; } } finally { @@ -1480,8 +1564,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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 */ @@ -1489,7 +1572,13 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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"); @@ -1579,11 +1668,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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; @@ -1684,7 +1772,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { parentUser == foregroundUser || callingAppId == Process.NFC_UID || callingAppId == mSystemUiUid; - if (DBG) { + if (DBG && !valid) { Slog.d(TAG, "checkIfCallerIsForegroundUser: valid=" + valid + " callingUser=" + callingUser + " parentUser=" + parentUser @@ -1697,7 +1785,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } 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); @@ -1708,91 +1797,76 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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(); } + } else if (newState == BluetoothAdapter.STATE_ON) { + boolean isUp = (newState == BluetoothAdapter.STATE_ON); + sendBluetoothStateCallback(isUp); + 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; - } - else if (prevState == BluetoothAdapter.STATE_BLE_TURNING_OFF) { - // show prevState to TURNING_OFF - prevState = BluetoothAdapter.STATE_TURNING_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_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); } } @@ -1872,16 +1946,27 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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(); @@ -1902,6 +1987,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE); mState = BluetoothAdapter.STATE_OFF; + if (clearBle) { + clearBleApps(); + } + mEnable = false; if (mErrorRecoveryRetryCounter++ < MAX_ERROR_RESTART_RETRIES) { @@ -1918,19 +2007,50 @@ class BluetoothManagerService extends IBluetoothManager.Stub { 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 0f6976aed09e257379f27a251db7d4474f2dca6d..2424149af724681f4d34a2ad844aafb86f32606d 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -882,6 +882,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mAvoidBadWifiTracker = createAvoidBadWifiTracker( mContext, mHandler, () -> rematchForAvoidBadWifiUpdate()); + mAvoidBadWifiTracker.start(); } private NetworkRequest createInternetRequestForTransport( @@ -2307,11 +2308,19 @@ public class ConnectivityService extends IConnectivityManager.Stub 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) { @@ -2332,6 +2341,12 @@ public class ConnectivityService extends IConnectivityManager.Stub 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 0714920c42fea7214bc51243e45dce2759045a22..ea7b90e65ae2c42b8dcf13e9b25374e824f6eddd 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -213,7 +213,10 @@ public class DeviceIdleController extends SystemService 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 class DeviceIdleController extends SystemService } } - 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 @@ public class DeviceIdleController extends SystemService 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 @@ public class DeviceIdleController extends SystemService 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 @@ public class DeviceIdleController extends SystemService 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 @@ public class DeviceIdleController extends SystemService 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 @@ public class DeviceIdleController extends SystemService } } break; case MSG_FINISH_IDLE_OP: { + // mActiveIdleWakeLock is held at this point decActiveIdleOps(); } break; } @@ -1371,6 +1382,9 @@ public class DeviceIdleController extends SystemService 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 @@ public class DeviceIdleController extends SystemService 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 @@ public class DeviceIdleController extends SystemService } 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 8ca675a904c41e459364f898c01944741a0820f6..962ac6fc540f843147e41a692548cd139c346e2d 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.Environment; 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 @@ import java.io.PrintWriter; */ 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 @@ public class DiskStatsService extends Binder { 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 @@ public class DiskStatsService extends Binder { 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 07aa565642c65e8d78d494e5261403bcc65a8e46..122074ba4dac33982d266ac636e4644ac7782590 100644 --- a/services/core/java/com/android/server/DockObserver.java +++ b/services/core/java/com/android/server/DockObserver.java @@ -167,10 +167,17 @@ final class DockObserver extends SystemService { 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 23cf64a031af3d072464c27917500f5262f29f35..36a16cd0a18b60fbe8584bdd868832b711ead75e 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 class HardwarePropertiesManagerService extends IHardwarePropertiesManager * * @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 @@ public class HardwarePropertiesManagerService extends IHardwarePropertiesManager 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 a12c79de0c3121bd75ad4a8f8ec986983813dc5e..cd218f3e5958971beabaefdaab3ccee096b6b804 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -244,6 +244,17 @@ public class LockSettingsService extends ILockSettings.Stub { if (DEBUG) Slog.v(TAG, "Parent does not have a screen lock"); return; } + // Do not tie when the parent has no SID (but does have a screen lock). + // This can only happen during an upgrade path where SID is yet to be + // generated when the user unlocks for the first time. + try { + if (getGateKeeperService().getSecureUserId(parentId) == 0) { + return; + } + } catch (RemoteException e) { + Slog.e(TAG, "Failed to talk to GateKeeper service", e); + return; + } if (DEBUG) Slog.v(TAG, "Tie managed profile to parent now!"); byte[] randomLockSeed = new byte[] {}; try { @@ -588,6 +599,20 @@ public class LockSettingsService extends ILockSettings.Stub { Slog.e(TAG, "Unable to remove tied profile key", e); } } + + boolean isWatch = mContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_WATCH); + // Wear used to set DISABLE_LOCKSCREEN to 'true', but because Wear now allows accounts + // and device management the lockscreen must be re-enabled now for users that upgrade. + if (isWatch && getString("migrated_wear_lockscreen_disabled", null, 0) == null) { + final int userCount = users.size(); + for (int i = 0; i < userCount; i++) { + int id = users.get(i).id; + setBoolean(LockPatternUtils.DISABLE_LOCKSCREEN_KEY, false, id); + } + setString("migrated_wear_lockscreen_disabled", "true", 0); + Slog.i(TAG, "Migrated lockscreen_disabled for Wear devices"); + } } catch (RemoteException re) { Slog.e(TAG, "Unable to migrate old data", re); } diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java index 33f92344f6159970feabe7d44c0d1a2353acd95c..54b2a25aa3bbbfa0885d9b2685d1e7dcd245cdd6 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 class MmsServiceBroker extends SystemService { */ 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 @@ public class MmsServiceBroker extends SystemService { 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 356ccb3596a905d9acbb6e64bb0fc5e6320a0fab..fa5a52c712cd9c8a24f8034bbe2aed46a61ea7c3 100644 --- a/services/core/java/com/android/server/PinnerService.java +++ b/services/core/java/com/android/server/PinnerService.java @@ -63,7 +63,7 @@ public final class PinnerService extends SystemService { private BinderService mBinderService; - private final long MAX_CAMERA_PIN_SIZE = 50 * (1 << 20); //50MB max + private final long MAX_CAMERA_PIN_SIZE = 80 * (1 << 20); //80MB max private PinnerHandler mPinnerHandler = null; @@ -192,6 +192,9 @@ public final class PinnerService extends SystemService { if (isResolverActivity(cameraResolveInfo.activityInfo)) { + if (DEBUG) { + Slog.v(TAG, "cameraIntent returned resolverActivity"); + } return null; } diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java index 90f507c146bf35906bb731b0e95c6f6cabf6d7cf..a0c80fe666e103be2894a9bdc6fc79881959f527 100644 --- a/services/core/java/com/android/server/SystemServiceManager.java +++ b/services/core/java/com/android/server/SystemServiceManager.java @@ -35,6 +35,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(); @@ -245,6 +246,17 @@ public class SystemServiceManager { 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 4c0ee4e3b7977b5d4f45c01f9710db6eef390502..60b8623fabf740d5b9b82734dd14b8c1e72edddf 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 @@ public final class ActiveServices { // 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 @@ public final class ActiveServices { // 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 a3923b94ef930ec1c0f07728368386e80f27c5ef..2e73c72db93719b919526e603ef9cf78f9129502 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 @@ public final class ActivityManagerService extends ActivityManagerNative /** * 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; @@ -1551,8 +1560,8 @@ public final class ActivityManagerService extends ActivityManagerNative 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 POST_PRIVACY_NOTIFICATION_MSG = 90; static final int CANCEL_PRIVACY_NOTIFICATION_MSG = 91; @@ -1605,6 +1614,8 @@ public final class ActivityManagerService extends ActivityManagerNative // 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; @@ -2407,6 +2418,9 @@ public final class ActivityManagerService extends ActivityManagerNative } 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; @@ -2442,14 +2456,8 @@ public final class ActivityManagerService extends ActivityManagerNative } } 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; case POST_COMPONENT_PROTECTED_MSG: { INotificationManager inm = NotificationManager.getService(); @@ -2794,6 +2802,9 @@ public final class ActivityManagerService extends ActivityManagerNative 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(); @@ -3330,20 +3341,17 @@ public final class ActivityManagerService extends ActivityManagerNative 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) { @@ -6461,8 +6469,19 @@ public final class ActivityManagerService extends ActivityManagerNative } 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. @@ -6622,6 +6641,7 @@ public final class ActivityManagerService extends ActivityManagerNative // 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); @@ -6700,6 +6720,8 @@ public final class ActivityManagerService extends ActivityManagerNative mHandler.sendMessageDelayed(msg, CONTENT_PROVIDER_PUBLISH_TIMEOUT); } + checkTime(startTime, "attachApplicationLocked: before bindApplication"); + if (!normalMode) { Slog.i(TAG, "Launching preboot mode app: " + app); } @@ -6758,7 +6780,8 @@ public final class ActivityManagerService extends ActivityManagerNative 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, @@ -6766,8 +6789,10 @@ public final class ActivityManagerService extends ActivityManagerNative 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 @@ -6806,6 +6831,7 @@ public final class ActivityManagerService extends ActivityManagerNative 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; @@ -6816,6 +6842,7 @@ public final class ActivityManagerService extends ActivityManagerNative 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); @@ -6847,6 +6874,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (!didSomething) { updateOomAdjLocked(); + checkTime(startTime, "attachApplicationLocked: after updateOomAdjLocked"); } return true; @@ -6939,7 +6967,6 @@ public final class ActivityManagerService extends ActivityManagerNative // Some stack visibility might change (e.g. docked stack) mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); - applyVrModeIfNeededLocked(mFocusedActivity, true); } } } finally { @@ -11037,7 +11064,7 @@ public final class ActivityManagerService extends ActivityManagerNative // 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; } @@ -11869,6 +11896,7 @@ public final class ActivityManagerService extends ActivityManagerNative startTimeTrackingFocusedActivityLocked(); mTopProcessState = ActivityManager.PROCESS_STATE_TOP; mStackSupervisor.comeOutOfSleepIfNeededLocked(); + sendNotifyVrManagerOfSleepState(false); updateOomAdjLocked(); } else if (!mSleeping && shouldSleepLocked()) { mSleeping = true; @@ -11877,6 +11905,7 @@ public final class ActivityManagerService extends ActivityManagerNative } mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING; mStackSupervisor.goingToSleepLocked(); + sendNotifyVrManagerOfSleepState(true); updateOomAdjLocked(); // Initialize the wake times of all processes. @@ -12341,6 +12370,9 @@ public final class ActivityManagerService extends ActivityManagerNative 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: " @@ -17229,7 +17261,7 @@ public final class ActivityManagerService extends ActivityManagerNative 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, @@ -21188,6 +21220,9 @@ public final class ActivityManagerService extends ActivityManagerNative int numBServices = 0; for (int i=N-1; i>=0; i--) { ProcessRecord app = mLruProcesses.get(i); + if (app == null) { + continue; + } if (mEnableBServicePropagation && app.serviceb && (app.curAdj == ProcessList.SERVICE_B_ADJ)) { numBServices++; @@ -21399,6 +21434,9 @@ public final class ActivityManagerService extends ActivityManagerNative 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; @@ -22162,6 +22200,15 @@ public final class ActivityManagerService extends ActivityManagerNative } 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); @@ -22183,21 +22230,6 @@ public final class ActivityManagerService extends ActivityManagerNative 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 3f69712efa6fe447eca04ee35207d31bfb6b069f..55c4698528a810c1170424164001c7c68fe28411 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 @@ final class ActivityRecord { 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 @@ final class ActivityRecord { 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 229ec4ce2f0da91ffb51cfd617efb82ba7bca373..ebf541ebf28dd0434097a845d52f2a4f4656b92f 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -439,7 +439,8 @@ class ActivityStarter { // 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( @@ -1123,6 +1124,10 @@ class ActivityStarter { 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); } @@ -1555,6 +1560,16 @@ class ActivityStarter { 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; @@ -1563,13 +1578,8 @@ class ActivityStarter { // 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 8b8e2c4097c28dedd515090681a1e91f10e12b18..8f2e05f7dc030bb424c71521f5dd2cd00f4c4f3c 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 final class BroadcastQueue { } 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 class BroadcastQueue { } 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 @@ public final class BroadcastQueue { // 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 @@ public final class BroadcastQueue { // 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 9dd07a9a9f90a3e429a04b35b1fbd45c4b10039b..73a17c613c4d04096b406c8a6f58d94b50de98d6 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 3ab70ae5dbde5a335ba0f24afdde44b6b1edaa4c..ee4b727c7f25823c57e047dc50ac8cbfbfc87595 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 static com.android.server.am.UserState.STATE_RUNNING_UNLOCKING; 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.app.KeyguardManager; 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 @@ final class UserController { // 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 @@ final class UserController { } 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 @@ final class UserController { } } + 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 @@ final class UserController { 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 @@ final class UserController { @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 f5db48806de3d9f04ccea33e62be5d57b9c521b4..1cce6c8b5c1e9d79dc873b2e6057570426216f64 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -4326,21 +4326,23 @@ public class AudioService extends IAudioService.Stub { 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); } } } @@ -4377,6 +4379,12 @@ public class AudioService extends IAudioService.Stub { } } + 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 0000000000000000000000000000000000000000..d6de815c8ef41e7eda063e5d1f9ee5e46c70fae1 --- /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 f1ef947f347267d21b34e0ebcc6b7d55296d0c94..2a2d1abc6defa3aff9b1591984cd8b24a519d9ec 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 @@ final public class IpConnectivityEventBuilder { } 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 bcbcf54b03d28fe65c41c4227afb9a5380c63bf7..76c3528856fd10b2c0733d3edda9b5e4cee42a48 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 @@ package com.android.server.connectivity; 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 @@ final public class IpConnectivityMetrics extends SystemService { 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 @@ final public class IpConnectivityMetrics extends SystemService { 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 @@ final public class IpConnectivityMetrics extends SystemService { } } + 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 @@ final public class IpConnectivityMetrics extends SystemService { 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 @@ final public class IpConnectivityMetrics extends SystemService { 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 @@ final public class IpConnectivityMetrics extends SystemService { 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 8d206ef90b94a925fcbab1b70fb5d9996fb22904..3f056a54d1f4befa4e79cde7267d66a67a728341 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 @@ package com.android.server.connectivity; 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 class DnsEventListenerService extends IDnsEventListener.Stub { 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 class DnsEventListenerService extends IDnsEventListener.Stub { 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 class DnsEventListenerService extends IDnsEventListener.Stub { } }; - 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 class DnsEventListenerService extends IDnsEventListener.Stub { @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 class DnsEventListenerService extends IDnsEventListener.Stub { 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 class DnsEventListenerService extends IDnsEventListener.Stub { 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 6eb89facca76d17d741b93c23f37c27f8c4e3d4b..c40780e0d588e9946d23c3e196f0ae192c93438f 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 @@ import java.util.concurrent.TimeUnit; */ 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 @@ public class NetworkMonitor extends StateMachine { 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 class NetworkMonitor extends StateMachine { 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 class NetworkMonitor extends StateMachine { 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 class NetworkMonitor extends StateMachine { })); 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 @@ public class NetworkMonitor extends StateMachine { @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 @@ public class NetworkMonitor extends StateMachine { // Retest for captive portal occasionally. sendMessageDelayed(CMD_CAPTIVE_PORTAL_RECHECK, 0 /* no UID */, CAPTIVE_PORTAL_REEVALUATE_DELAY_MS); + mValidations++; } @Override @@ -632,7 +666,10 @@ public class NetworkMonitor extends StateMachine { @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 @@ public class NetworkMonitor extends StateMachine { 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 @@ public class NetworkMonitor extends StateMachine { } /** - * 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 @@ public class NetworkMonitor extends StateMachine { // 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 @@ public class NetworkMonitor extends StateMachine { } 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 class NetworkMonitor extends StateMachine { @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 @@ public class NetworkMonitor extends StateMachine { 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 @@ public class NetworkMonitor extends StateMachine { 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 @@ public class NetworkMonitor extends StateMachine { 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 @@ public class NetworkMonitor extends StateMachine { 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 @@ public class NetworkMonitor extends StateMachine { } 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 f7b01be48d887ea8b26e08d69eab7d37f432360c..4ff665787c45829abaa6f822d94ee966382bf23a 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 @@ package com.android.server.connectivity; 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.net.NetworkCapabilities; 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 class NetworkNotificationManager { 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 @@ public class NetworkNotificationManager { */ 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 class NetworkNotificationManager { } 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 class NetworkNotificationManager { 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 class NetworkNotificationManager { 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 class NetworkNotificationManager { 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 cf297f5dab2d88ab4afc11f121c25702064e9cd2..f0cf0d988827092a98e9a6a2849405351adb88b0 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -1168,7 +1168,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } } else { mUsbTetherRequested = true; - usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS); + usbManager.setCurrentFunction(UsbManager.USB_FUNCTION_RNDIS, false); } } else { final long ident = Binder.clearCallingIdentity(); @@ -1178,7 +1178,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering Binder.restoreCallingIdentity(ident); } if (mRndisEnabled) { - usbManager.setCurrentFunction(null); + usbManager.setCurrentFunction(null, false); } mUsbTetherRequested = false; } @@ -1841,9 +1841,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering // 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(); @@ -1861,14 +1860,14 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering 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 ede3bda5bea27bc8967f20a65f7b5152c641db9a..610a2ab5b53bd72fc04f63f3f4e5ce586dc237e4 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 class Vpn { 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 class Vpn { 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 @@ public class Vpn { 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 @@ public class Vpn { * 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 3075c55e0f6ed2b42d846117a031101d9e9a8235..52f17947d254603152275059c9942bd9295a9949 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 @@ package com.android.server.display; 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; @@ -66,9 +63,6 @@ class AutomaticBrightnessController { // 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; @@ -76,7 +70,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. @@ -85,9 +79,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; @@ -97,8 +88,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 @@ -121,6 +118,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. @@ -181,6 +181,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; @@ -189,24 +197,25 @@ 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 brighteningLightFastDebounceConfig, 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; mBrighteningLightFastDebounceConfig = brighteningLightFastDebounceConfig; mDarkeningLightDebounceConfig = darkeningLightDebounceConfig; @@ -214,12 +223,15 @@ class AutomaticBrightnessController { 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); @@ -227,42 +239,41 @@ class AutomaticBrightnessController { } 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:"); @@ -278,7 +289,6 @@ class AutomaticBrightnessController { 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); @@ -301,19 +311,27 @@ class AutomaticBrightnessController { 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); } @@ -325,8 +343,20 @@ class AutomaticBrightnessController { mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX); if (DEBUG) Slog.d(TAG, "handleLightSensorEvent: time=" + time + ", lux=" + 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) { @@ -344,6 +374,20 @@ class AutomaticBrightnessController { 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; @@ -354,8 +398,8 @@ class AutomaticBrightnessController { 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) { @@ -482,7 +526,7 @@ class AutomaticBrightnessController { // 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)); @@ -508,19 +552,6 @@ class AutomaticBrightnessController { } } - 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); @@ -530,8 +561,14 @@ class AutomaticBrightnessController { } } - 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=" @@ -635,13 +672,6 @@ class AutomaticBrightnessController { } }; - 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 971989b21219491a011bc1ad8b6b054a55f8e3bf..9c762cce7e0faf4c7c8973e2bfc049ce163e715c 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -220,6 +220,11 @@ public final class DisplayManagerService extends SystemService { private final DisplayViewport mTempDefaultViewport = new DisplayViewport(); private final DisplayViewport mTempExternalTouchViewport = new DisplayViewport(); + // The default color mode for default displays. Overrides the usual + // Display.Display.COLOR_MODE_DEFAULT for displays with the + // DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY flag set. + private final int mDefaultDisplayDefaultColorMode; + // Temporary list of deferred work to perform when setting the display state. // Only used by requestDisplayState. The field is self-synchronized and only // intended for use inside of the requestGlobalDisplayStateInternal function. @@ -232,6 +237,8 @@ public final class DisplayManagerService extends SystemService { mUiHandler = UiThread.getHandler(); mDisplayAdapterListener = new DisplayAdapterListener(); mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false); + mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger( + com.android.internal.R.integer.config_defaultDisplayDefaultColorMode); PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mGlobalDisplayBrightness = pm.getDefaultScreenBrightnessSetting(); @@ -703,6 +710,14 @@ public final class DisplayManagerService extends SystemService { } if (display != null && display.getPrimaryDisplayDeviceLocked() == device) { int colorMode = mPersistentDataStore.getColorMode(device); + if (colorMode == Display.COLOR_MODE_INVALID) { + if ((device.getDisplayDeviceInfoLocked().flags + & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0) { + colorMode = mDefaultDisplayDefaultColorMode; + } else { + colorMode = Display.COLOR_MODE_DEFAULT; + } + } display.setRequestedColorModeLocked(colorMode); } scheduleTraversalLocked(false); @@ -1043,6 +1058,7 @@ public final class DisplayManagerService extends SystemService { pw.println(" mNextNonDefaultDisplayId=" + mNextNonDefaultDisplayId); pw.println(" mDefaultViewport=" + mDefaultViewport); pw.println(" mExternalTouchViewport=" + mExternalTouchViewport); + pw.println(" mDefaultDisplayDefaultColorMode=" + mDefaultDisplayDefaultColorMode); pw.println(" mSingleDisplayDemoMode=" + mSingleDisplayDemoMode); pw.println(" mWifiDisplayScanRequestCount=" + mWifiDisplayScanRequestCount); diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 13604bec653e3eab9a206c57d5948fcc3813fc9f..82f07f8e6571a615a0f4bcb28d8a3ecdbf8b4d8f 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -73,7 +73,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. @@ -103,9 +103,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; @@ -160,6 +157,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; @@ -247,8 +247,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; @@ -312,9 +313,20 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 brighteningLightFastDebounce = resources.getInteger( @@ -340,6 +352,25 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 " @@ -364,9 +395,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call handler.getLooper(), sensorManager, screenAutoBrightnessSpline, lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum, mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate, - brighteningLightDebounce, brighteningLightFastDebounce, + initialLightSensorRate, brighteningLightDebounce, brighteningLightFastDebounce, darkeningLightDebounce, autoBrightnessResetAmbientLuxAfterWarmUp, - ambientLightHorizon, autoBrightnessAdjustmentMaxGamma); + ambientLightHorizon, autoBrightnessAdjustmentMaxGamma, mUseActiveDozeLightSensorConfig, + useNewSensorSamplesForDoze, luxLevels); + } } @@ -566,6 +599,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call brightness = mPowerRequest.dozeScreenBrightness; } break; + case DisplayPowerRequest.POLICY_VR: + state = Display.STATE_VR; + break; case DisplayPowerRequest.POLICY_DIM: case DisplayPowerRequest.POLICY_BRIGHT: default: @@ -607,6 +643,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // 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(); @@ -628,14 +665,15 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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. @@ -668,10 +706,16 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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. @@ -714,11 +758,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } // 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); } @@ -900,6 +945,23 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 3eba25fba6a164bb050c7e26a34ba21c4f695fe7..6b9a33fba592d164f6e92cadc182d265bffb3c50 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -476,6 +476,16 @@ final class LocalDisplayAdapter extends DisplayAdapter { } } + // 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); @@ -487,6 +497,15 @@ final class LocalDisplayAdapter extends DisplayAdapter { } } + 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 0000000000000000000000000000000000000000..a796871874c42c2b9a6922e772b4647f29f1181a --- /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 5616fb97bad765bb6712435d7ece0f5d3af5d699..47701b99860afe9f91d1e0c19f9c5296dc7ae887 100644 --- a/services/core/java/com/android/server/display/PersistentDataStore.java +++ b/services/core/java/com/android/server/display/PersistentDataStore.java @@ -183,11 +183,11 @@ final class PersistentDataStore { public int getColorMode(DisplayDevice device) { if (!device.hasStableUniqueId()) { - return Display.COLOR_MODE_DEFAULT; + return Display.COLOR_MODE_INVALID; } DisplayState state = getDisplayState(device.getUniqueId(), false); if (state == null) { - return Display.COLOR_MODE_DEFAULT; + return Display.COLOR_MODE_INVALID; } return state.getColorMode(); } diff --git a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java index 353f4506e1e9b53aedae51d1fc97e0a5824445f1..98771dfa1f3352764ae1482b7249d1145434a156 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 @@ public class EmergencyAffordanceService extends SystemService { } } } - 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 6c11794b189d78d481daa9f3d1bc92820eda1dbd..e6408238e4c2f60d0a2d969ba65a7f0824b5a4d9 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.Arrays; 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 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe 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 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe 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 class FingerprintService extends SystemService implements IBinder.DeathRe 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 class FingerprintService extends SystemService implements IBinder.DeathRe 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 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe 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 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe 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 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe * @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 class FingerprintService extends SystemService implements IBinder.DeathRe } } - /*** + /** * @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 745ddf96a93ba2a925167c019100c9badbbf25cb..7df6f364b466c39b0c6b8f52f48b6b685ca51b63 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 android.view.Display; 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; @@ -1805,6 +1806,7 @@ public class InputManagerService extends IInputManager.Stub // 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 5e495fab3f6e64b06235aef1da583acf531140ac..fb54d3bb946858e674a98078c57e6db68cf55828 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 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne 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 3a6d7ca5e901af5eda04378ec59947a2ebdaf892..1967eabe3d1588a06e5f6d20ce4f5cea7551c0f8 100644 --- a/services/core/java/com/android/server/lights/Light.java +++ b/services/core/java/com/android/server/lights/Light.java @@ -45,4 +45,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 5d4ad116e9ae563ef26138e22890dab9ef9ea2c0..9fbd4030da69e99f16b7a4655d45d24f0612535a 100644 --- a/services/core/java/com/android/server/lights/LightsService.java +++ b/services/core/java/com/android/server/lights/LightsService.java @@ -18,18 +18,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 { @@ -37,7 +32,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 { @@ -56,6 +50,13 @@ public class LightsService extends SystemService { @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); @@ -98,11 +99,9 @@ public class LightsService extends SystemService { @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); } @@ -116,17 +115,23 @@ public class LightsService extends SystemService { } } - 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. + } } } @@ -137,8 +142,14 @@ public class LightsService extends SystemService { } private void setLightLocked(int color, int mode, int onMS, int offMS, int brightnessMode) { - if (!mLocked && (mModesUpdate || color != mColor || mode != mMode || onMS != mOnMS || - offMS != mOffMS || mBrightnessMode != brightnessMode || mReset)) { + if (shouldBeInLowPersistenceMode()) { + brightnessMode = BRIGHTNESS_MODE_LOW_PERSISTENCE; + } else if (brightnessMode == BRIGHTNESS_MODE_LOW_PERSISTENCE) { + brightnessMode = mLastBrightnessMode; + } + + if ((mModesUpdate || color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS || + mBrightnessMode != brightnessMode)) { if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#" + Integer.toHexString(color) + ": brightnessMode=" + brightnessMode); mLastColor = mColor; @@ -147,7 +158,6 @@ public class LightsService extends SystemService { mMode = mode; mOnMS = onMS; mOffMS = offMS; - mLastBrightnessMode = mBrightnessMode; mBrightnessMode = brightnessMode; mModesUpdate = false; Trace.traceBegin(Trace.TRACE_TAG_POWER, "setLight(" + mId + ", 0x" @@ -161,6 +171,10 @@ public class LightsService extends SystemService { } } + private boolean shouldBeInLowPersistenceMode() { + return mVrModeEnabled && mUseLowPersistenceForVR; + } + private int mId; private int mColor; private int mMode; @@ -171,10 +185,11 @@ public class LightsService extends SystemService { private int mBrightnessMode; private int mLastBrightnessMode; private int mLastColor; - private boolean mLocked; private boolean mModesUpdate; private boolean mMultipleLeds; private boolean mReset = true; + private boolean mVrModeEnabled; + private boolean mUseLowPersistenceForVR; } public LightsService(Context context) { @@ -194,15 +209,6 @@ public class LightsService extends SystemService { @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() { @@ -213,30 +219,6 @@ public class LightsService extends SystemService { 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 1b0800852492c4b39ea721e7dabdd9e3dd41899c..bdf1463d5129f9453b9700373342bfbc5fcc68b8 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -417,6 +417,12 @@ public class GnssLocationProvider implements LocationProviderInterface { private int mYearOfHardware = 0; + // Set lower than the current ITAR limit of 600m/s to allow this to trigger even if GPS HAL + // stops output right at 600m/s, depriving this of the information of a device that reaches + // greater than 600m/s, and higher than the speed of sound to avoid impacting most use cases. + private static final float ITAR_SPEED_LIMIT_METERS_PER_SECOND = 400.0F; + private boolean mItarSpeedLimitExceeded = false; + private final IGnssStatusProvider mGnssStatusProvider = new IGnssStatusProvider.Stub() { @Override public void registerGnssStatusCallback(IGnssStatusListener callback) { @@ -1414,6 +1420,12 @@ public class GnssLocationProvider implements LocationProviderInterface { mStarted = true; mSingleShot = singleShot; mPositionMode = GPS_POSITION_MODE_STANDALONE; + // Notify about suppressed output, if speed limit was previously exceeded. + // Elsewhere, we check again with every speed output reported. + if (mItarSpeedLimitExceeded) { + Log.i(TAG, "startNavigating with ITAR limit in place. Output limited " + + "until slow enough speed reported."); + } boolean agpsEnabled = (Settings.Global.getInt(mContext.getContentResolver(), @@ -1500,7 +1512,17 @@ public class GnssLocationProvider implements LocationProviderInterface { * called from native code to update our position. */ private void reportLocation(int flags, double latitude, double longitude, double altitude, - float speed, float bearing, float accuracy, long timestamp) { + float speedMetersPerSecond, float bearing, float accuracy, long timestamp) { + if ((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) { + mItarSpeedLimitExceeded = speedMetersPerSecond > ITAR_SPEED_LIMIT_METERS_PER_SECOND; + } + + if (mItarSpeedLimitExceeded) { + Log.i(TAG, "Hal reported a speed in excess of ITAR limit." + + " GPS/GNSS Navigation output blocked."); + return; // No output of location allowed + } + if (VERBOSE) Log.v(TAG, "reportLocation lat: " + latitude + " long: " + longitude + " timestamp: " + timestamp); @@ -1520,7 +1542,7 @@ public class GnssLocationProvider implements LocationProviderInterface { mLocation.removeAltitude(); } if ((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) { - mLocation.setSpeed(speed); + mLocation.setSpeed(speedMetersPerSecond); } else { mLocation.removeSpeed(); } @@ -1704,23 +1726,29 @@ public class GnssLocationProvider implements LocationProviderInterface { * called from native code to report NMEA data received */ private void reportNmea(long timestamp) { - int length = native_read_nmea(mNmeaBuffer, mNmeaBuffer.length); - String nmea = new String(mNmeaBuffer, 0 /* offset */, length); - mListenerHelper.onNmeaReceived(timestamp, nmea); + if (!mItarSpeedLimitExceeded) { + int length = native_read_nmea(mNmeaBuffer, mNmeaBuffer.length); + String nmea = new String(mNmeaBuffer, 0 /* offset */, length); + mListenerHelper.onNmeaReceived(timestamp, nmea); + } } /** * called from native code - Gps measurements callback */ private void reportMeasurementData(GnssMeasurementsEvent event) { - mGnssMeasurementsProvider.onMeasurementsAvailable(event); + if (!mItarSpeedLimitExceeded) { + mGnssMeasurementsProvider.onMeasurementsAvailable(event); + } } /** * called from native code - GPS navigation message callback */ private void reportNavigationMessage(GnssNavigationMessage event) { - mGnssNavigationMessageProvider.onNavigationMessageAvailable(event); + if (!mItarSpeedLimitExceeded) { + mGnssNavigationMessageProvider.onNavigationMessageAvailable(event); + } } /** diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 07c60d5f5ffbf40fcf4866aeff756968a9f60462..6cdd7dc987a260ef83b057bf212b5ea244a3092d 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1024,7 +1024,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { */ private void notifyOverLimitNL(NetworkTemplate template) { if (!mOverLimitNotified.contains(template)) { - mContext.startActivity(buildNetworkOverLimitIntent(template)); + mContext.startActivity(buildNetworkOverLimitIntent(mContext.getResources(), template)); mOverLimitNotified.add(template); } } @@ -1070,7 +1070,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { 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)); @@ -1106,7 +1106,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { 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; @@ -1141,7 +1141,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { 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; @@ -3611,19 +3611,19 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { 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 b679117d086fb50b1238be797ceb4a75e7c2625f..8aa224568bee348e4450de5bc47e5a22ad6d3d79 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -146,7 +146,6 @@ import com.android.server.lights.LightsManager; 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 cyanogenmod.providers.CMSettings; @@ -245,7 +244,6 @@ public class NotificationManagerService extends SystemService { AudioManagerInternal mAudioManagerInternal; @Nullable StatusBarManagerInternal mStatusBar; Vibrator mVibrator; - private VrManagerInternal mVrManagerInternal; private WindowManagerInternal mWindowManagerInternal; final IBinder mForegroundToken = new Binder(); @@ -1284,7 +1282,6 @@ public class NotificationManagerService extends SystemService { // 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) { @@ -3804,7 +3801,8 @@ public class NotificationManagerService extends SystemService { 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 ded85f3da3d68ffa0448cf7c1e44e9e0af5ce8fd..5016ec0d4be0dae8922ede2ed38df16c72e9e55f 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 @@ final class DefaultPermissionGrantPolicy { 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 @@ final class DefaultPermissionGrantPolicy { 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 4cfa3d5d40cb338fa24483af208d8143bb28bcae..eff52933077475138f7b53b1c311d410b77e3c85 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -472,6 +472,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; @@ -1159,6 +1165,8 @@ public class PackageManagerService extends IPackageManager.Stub { final @NonNull String mServicesSystemSharedLibraryPackageName; final @NonNull String mSharedSystemSharedLibraryPackageName; + final boolean mPermissionReviewRequired; + private final PackageUsage mPackageUsage = new PackageUsage(); private final CompilerStats mCompilerStats = new CompilerStats(); @@ -2101,6 +2109,10 @@ public class PackageManagerService extends IPackageManager.Stub { } mContext = context; + + mPermissionReviewRequired = context.getResources().getBoolean( + R.bool.config_permissionReviewRequired); + mFactoryTest = factoryTest; mOnlyCore = onlyCore; mMetrics = new DisplayMetrics(); @@ -2340,12 +2352,17 @@ public class PackageManagerService extends IPackageManager.Stub { } } - // 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 + | PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0); + } + scanDirTracedLI(new File(VENDOR_OVERLAY_DIR), mDefParseFlags | PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR | PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0); @@ -4182,7 +4199,7 @@ public class PackageManagerService extends IPackageManager.Stub { // 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; @@ -4293,7 +4310,7 @@ public class PackageManagerService extends IPackageManager.Stub { // 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; @@ -5536,15 +5553,23 @@ public class PackageManagerService extends IPackageManager.Stub { 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); @@ -10218,7 +10243,8 @@ public class PackageManagerService extends IPackageManager.Stub { // 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)) { @@ -10297,14 +10323,32 @@ public class PackageManagerService extends IPackageManager.Stub { 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) { @@ -10313,7 +10357,8 @@ public class PackageManagerService extends IPackageManager.Stub { 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. @@ -16931,7 +16976,7 @@ public class PackageManagerService extends IPackageManager.Stub { // 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; } @@ -20815,7 +20860,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); // 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); } @@ -21410,7 +21455,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); 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; } @@ -21460,6 +21505,11 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); return mSettings.wasPackageEverLaunchedLPr(packageName, userId); } } + + @Override + 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 1f195a7a544b032669cc408fe3a3e6a373d1f276..e59d69f4c563ce2a90e68e21eedc6f29874dac7a 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 @@ abstract class ShortcutPackageItem { } 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 10f94b8b2aa1050b9f364158f486204aed710cf3..1a8c0a868075cdf085b09ba9e21a8c5145ecbfa8 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -238,10 +238,19 @@ public class ShortcutService extends IShortcutService.Stub { private static List 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; @@ -3726,6 +3735,16 @@ public class ShortcutService extends IShortcutService.Stub { } } + @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 ae94d7fc1c600907a569feb62c9d2ea95de35266..59300cad9dd4eb899d64a07d3ece59e0c2bdf575 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.IStopUserCallback; 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 class UserManagerService extends IUserManager.Stub { @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 class UserManagerService extends IUserManager.Stub { 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 @@ public class UserManagerService extends IUserManager.Stub { 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 class UserManagerService extends IUserManager.Stub { } } + @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(); @@ -2890,8 +2915,6 @@ public class UserManagerService extends IUserManager.Stub { applyUserRestrictionsLR(userId); } } - - maybeInitializeDemoMode(userId); } /** @@ -2924,29 +2947,6 @@ public class UserManagerService extends IUserManager.Stub { 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 @@ -3487,6 +3487,14 @@ public class UserManagerService extends IUserManager.Stub { || (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 e6ec6a67fe3af53d616862725e79b20bba48bf60..92729dc08b63fa8d798dad358e43d60fb0fa6192 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 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, // 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 @@ public class BurnInProtectionHelper implements DisplayManager.DisplayListener, // 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 baf0d72a3d2488635f0730a2facd285f2316bacc..c6420cb3274b970e70c93a17c80939b4a1ea98fe 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -164,6 +164,7 @@ import com.android.server.LocalServices; 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; @@ -221,6 +222,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; @@ -476,6 +482,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { volatile boolean mBackKeyHandled; volatile boolean mBeganFromNonInteractive; volatile int mPowerKeyPressCounter; + volatile int mBackKeyPressCounter; volatile boolean mEndCallKeyHandled; volatile boolean mCameraGestureTriggeredDuringGoingToSleep; volatile boolean mGoingToSleep; @@ -535,6 +542,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { int mDoublePressOnPowerBehavior; int mTriplePressOnPowerBehavior; int mLongPressOnBackBehavior; + int mPanicPressOnBackBehavior; int mShortPressOnSleepBehavior; int mShortPressWindowBehavior; boolean mAwake; @@ -763,6 +771,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { // (See CMSettings.Secure.RING_HOME_BUTTON_BEHAVIOR.) private int mRingHomeBehavior; + // Behavior of Back button while in-call and screen on + int mIncallBackBehavior; + Display mDisplay; private int mDisplayRotation; @@ -857,6 +868,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private static final int MSG_DISPATCH_VOLKEY_WITH_WAKE_LOCK = 20; private static final int MSG_CAMERA_LONG_PRESS = 21; private static final int MSG_TOGGLE_TORCH = 22; + private static final int MSG_BACK_DELAYED_PRESS = 23; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1; @@ -938,6 +950,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { break; case MSG_BACK_LONG_PRESS: backLongPress(); + finishBackKeyPress(); break; case MSG_DISPOSE_INPUT_CONSUMER: disposeInputConsumer((InputConsumer) msg.obj); @@ -967,6 +980,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { } break; } + case MSG_BACK_DELAYED_PRESS: + backMultiPressAction((Long) msg.obj, msg.arg1); + finishBackKeyPress(); + break; } } } @@ -998,6 +1015,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { resolver.registerContentObserver(CMSettings.System.getUriFor( CMSettings.System.TORCH_LONG_PRESS_POWER_GESTURE), 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); @@ -1259,6 +1279,74 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + 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()) { @@ -1394,6 +1482,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + private void finishBackKeyPress() { + mBackKeyPressCounter = 0; + } + private void cancelPendingPowerKeyAction() { if (!mPowerKeyHandled) { mPowerKeyHandled = true; @@ -1412,6 +1504,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + 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 " @@ -1535,8 +1639,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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; } } @@ -1582,6 +1691,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { return mLongPressOnBackBehavior != LONG_PRESS_BACK_NOTHING; } + private boolean hasPanicPressOnBackBehavior() { + return mPanicPressOnBackBehavior != PANIC_PRESS_BACK_NOTHING; + } + private void interceptScreenshotChord() { if (mScreenshotChordEnabled && mScreenshotChordVolumeDownKeyTriggered && mScreenshotChordPowerKeyTriggered @@ -1956,6 +2069,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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); @@ -2376,6 +2491,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { CMSettings.System.VOLBTN_MUSIC_CONTROLS, 1, UserHandle.USER_CURRENT) == 1); mVolumeAnswerCall = CMSettings.System.getIntForUser(resolver, CMSettings.System.VOLUME_ANSWER_CALL, 0, UserHandle.USER_CURRENT) == 1; + 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, @@ -6404,20 +6523,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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; } @@ -7331,6 +7441,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mKeyguardDelegate.onScreenTurnedOff(); } } + reportScreenStateToVrManager(false); } // Called on the DisplayManager's DisplayPowerController thread. @@ -7366,6 +7477,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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() { @@ -8990,6 +9110,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 6d69cab7869d0edb9bcdf16ccc491732607ea957..4de2b02894d97459c8a21892c468fded7ed4756b 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -145,6 +145,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; @@ -439,11 +441,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; @@ -535,8 +541,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(); @@ -640,6 +646,7 @@ public final class PowerManagerService extends SystemService mScreenBrightnessSettingDefault = pm.getDefaultScreenBrightnessSetting(); mButtonBrightnessSettingDefault = pm.getDefaultButtonBrightness(); mKeyboardBrightnessSettingDefault = pm.getDefaultKeyboardBrightness(); + mScreenBrightnessForVrSettingDefault = pm.getDefaultScreenBrightnessForVrSetting(); SensorManager sensorManager = new SystemSensorManager(mContext, mHandler.getLooper()); @@ -712,6 +719,9 @@ public final class PowerManagerService extends SystemService 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); @@ -730,15 +740,14 @@ public final class PowerManagerService extends SystemService 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(CMSettings.Secure.getUriFor( @@ -858,11 +867,17 @@ public final class PowerManagerService extends SystemService } } - 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; } @@ -879,9 +894,6 @@ public final class PowerManagerService extends SystemService 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, @@ -912,6 +924,10 @@ public final class PowerManagerService extends SystemService mDirty |= DIRTY_SETTINGS; } + private int getCurrentBrightnessSettingLocked() { + return mIsVrModeEnabled ? mScreenBrightnessForVrSetting : mScreenBrightnessSetting; + } + private void postAfterBootCompleted(Runnable r) { if (mBootCompleted) { BackgroundThread.getHandler().post(r); @@ -2182,6 +2198,7 @@ public final class PowerManagerService extends SystemService || !mDreamsSupportedConfig || !mDreamsEnabledSetting || !mDisplayPowerRequest.isBrightOrDim() + || mDisplayPowerRequest.isVr() || (mUserActivitySummary & (USER_ACTIVITY_SCREEN_BRIGHT | USER_ACTIVITY_SCREEN_DIM | USER_ACTIVITY_SCREEN_DREAM)) == 0 || !mBootCompleted) { @@ -2226,7 +2243,7 @@ public final class PowerManagerService extends SystemService 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. @@ -2240,6 +2257,9 @@ public final class PowerManagerService extends SystemService // 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; @@ -2273,8 +2293,7 @@ public final class PowerManagerService extends SystemService 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; @@ -2300,6 +2319,7 @@ public final class PowerManagerService extends SystemService + ", mWakeLockSummary=0x" + Integer.toHexString(mWakeLockSummary) + ", mUserActivitySummary=0x" + Integer.toHexString(mUserActivitySummary) + ", mBootCompleted=" + mBootCompleted + + ", mIsVrModeEnabled= " + mIsVrModeEnabled + ", mScreenBrightnessBoostInProgress=" + mScreenBrightnessBoostInProgress); } @@ -2330,6 +2350,10 @@ public final class PowerManagerService extends SystemService } } + private boolean shouldBoostScreenBrightness() { + return !mIsVrModeEnabled && mScreenBrightnessBoostInProgress; + } + private static boolean isValidBrightness(int value) { return value >= 0 && value <= 255; } @@ -2340,6 +2364,10 @@ public final class PowerManagerService extends SystemService } private int getDesiredScreenPolicyLocked() { + if (mIsVrModeEnabled) { + return DisplayPowerRequest.POLICY_VR; + } + if (mWakefulness == WAKEFULNESS_ASLEEP) { return DisplayPowerRequest.POLICY_OFF; } @@ -2443,7 +2471,7 @@ public final class PowerManagerService extends SystemService }; private boolean shouldUseProximitySensorLocked() { - return (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0; + return !mIsVrModeEnabled && (mWakeLockSummary & WAKE_LOCK_PROXIMITY_SCREEN_OFF) != 0; } /** @@ -3103,7 +3131,11 @@ public final class PowerManagerService extends SystemService 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); @@ -3230,6 +3262,14 @@ public final class PowerManagerService extends SystemService @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(); + } + } } }; @@ -4064,6 +4104,7 @@ public final class PowerManagerService extends SystemService 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 27e42122f3c2413a7083347ab5e4aa480aba9a91..d767eb00c2d216a3368a6209ee87c708dd221368 100644 --- a/services/core/java/com/android/server/power/ShutdownThread.java +++ b/services/core/java/com/android/server/power/ShutdownThread.java @@ -673,7 +673,7 @@ public final class ShutdownThread extends Thread { 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 0000000000000000000000000000000000000000..ee9c5bf2775d0a7466fc896558d57a6044be537a --- /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 0000000000000000000000000000000000000000..22299df93ef5d42b2b39e4a8d2d093b324b82e50 --- /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 0000000000000000000000000000000000000000..4035adedafe12c55249efedbc2b315cdf055ebc1 --- /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 0000000000000000000000000000000000000000..90f9f13916795ee02afb33d9a2a7d7f68a0480ca --- /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 db7df25da3dea847d411c0c732cf6f6a69e5f726..bb4d67e0309f6ec2ba0276b8cfc5d68d2bff5a8c 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 final class TwilightService extends SystemService @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 ad87a885348e6a2695817c5d172b6ecbd4ed91de..0fc1900166e26f31ac387819c55d3ce3f3399976 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 class VrManagerInternal { 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 fdadc8de717fd457a3a39fb52b8ac8e0920027b9..a9a6aa1000cfce1278f82adae64de7671ab77de0 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 @@ import java.util.Objects; * {@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 class VrManagerService extends SystemService implements EnabledComponentC } break; case MSG_PENDING_VR_STATE_CHANGE : { synchronized(mLock) { - VrManagerService.this.consumeAndApplyPendingStateLocked(); + if (mVrModeAllowed) { + VrManagerService.this.consumeAndApplyPendingStateLocked(); + } } } break; default : @@ -255,7 +320,6 @@ public class VrManagerService extends SystemService implements EnabledComponentC public void onEnabledComponentChanged() { synchronized (mLock) { int currentUser = ActivityManager.getCurrentUser(); - // Update listeners ArraySet enabledListeners = mComponentObserver.getEnabled(currentUser); @@ -268,12 +332,12 @@ public class VrManagerService extends SystemService implements EnabledComponentC } 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 @@ public class VrManagerService extends SystemService implements EnabledComponentC 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 @@ public class VrManagerService extends SystemService implements EnabledComponentC @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 class VrManagerService extends SystemService implements EnabledComponentC mComponentObserver.rebuildAll(); } + } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) { + synchronized (mLock) { + mVrModeAllowed = true; + } } } @@ -466,12 +539,16 @@ public class VrManagerService extends SystemService implements EnabledComponentC 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 @@ public class VrManagerService extends SystemService implements EnabledComponentC 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 @@ public class VrManagerService extends SystemService implements EnabledComponentC ? 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 class VrManagerService extends SystemService implements EnabledComponentC } }); } - logStateLocked(); + + if (!nothingChanged) { + logStateLocked(); + } return validUserComponent; } finally { @@ -663,16 +754,28 @@ public class VrManagerService extends SystemService implements EnabledComponentC 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 @@ public class VrManagerService extends SystemService implements EnabledComponentC 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 @@ public class VrManagerService extends SystemService implements EnabledComponentC /* * 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 @@ public class VrManagerService extends SystemService implements EnabledComponentC 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 d3fb10ad064c4fc246cd6e751ada38d5d6d0d6dd..da8fb5df2cb66449e14880f7eb73f450a9e1ce34 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 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { 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 cd46165b56b3c0cc298f51665b98d48d90c5cdba..d8e0b0b84281eda03dec9bb94752e51a3d612861 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.Debug; 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 class AppTransition implements Dump { }; mClipRevealTranslationY = (int) (CLIP_REVEAL_TRANSLATION_Y_DP * mContext.getResources().getDisplayMetrics().density); + mGridLayoutRecentsEnabled = SystemProperties.getBoolean("ro.recents.grid", false); } boolean isTransitionSet() { @@ -921,12 +925,12 @@ public class AppTransition implements Dump { 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 @@ public class AppTransition implements Dump { 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 @@ public class AppTransition implements Dump { // 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 @@ public class AppTransition implements Dump { // 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 @@ public class AppTransition implements Dump { 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 @@ public class AppTransition implements Dump { 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 ae41541310799dbb1efc1d4770554fe5a5fcc607..c57dfb676a7e0f383051121787773b45af38822d 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.DEBUG_SURFACE_TRACE 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 @@ class CircularDisplayMask { 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 @@ class CircularDisplayMask { 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 2ec4ace7f306fb65e47eba04f63566adf06cd3cf..f37c57ff1ec12637f744d457851cee33c0552f8b 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 @@ class WallpaperController { 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 f5ed9d1b8650228a2902fa191a34837907ea3a58..961f742f3e27feb3b9226a6b76dd6d4cd05ee657 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 @@ class WindowSurfaceController { 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 @@ class WindowSurfaceController { mAnimator.reclaimSomeSurfaceMemory("matrix", true); } } - return; } boolean setSizeInTransaction(int width, int height, boolean recoveringMemory) { @@ -318,6 +334,10 @@ class WindowSurfaceController { 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 c7d6b95083d20148fca29a6fa89f67d532153b20..e46490bb3fac981b123f608ea7b8250349150e88 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 f415c2c9173878f1e64c93b4d36c26cd6e947297..b91fc05d3ce3d371e2493ae71563ef482ecd0d6b 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -1531,7 +1531,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 87cc7d1986e396706d976b0a0d8f5bd1f6a60108..c8d5a277ef2dabfacd000ae1d204ff91d8937f0f 100644 --- a/services/core/jni/com_android_server_lights_LightsService.cpp +++ b/services/core/jni/com_android_server_lights_LightsService.cpp @@ -149,12 +149,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; state.ledsModes = 0 | (multipleLeds ? LIGHT_MODE_MULTIPLE_LEDS : 0); diff --git a/services/core/proto/ipconnectivity.proto b/services/core/proto/ipconnectivity.proto index e0d7f0984eb0db6753aee7449a314f1e3406151f..cf372bc90c7439e2042d2699271da60a26c1fe09 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 cafa1d941fe942c4983e285fbe391a1fc73b0826..7c7901036069046e9324f02ce65c6dc093cdbad8 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.Nullable; 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.DeviceAdminReceiver; 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.graphics.Color; 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; @@ -216,6 +221,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"; @@ -223,6 +229,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 @@ -302,6 +309,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, @@ -345,7 +353,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(); @@ -425,6 +439,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int mPasswordOwner = -1; long mLastMaximumTimeToLock = -1; boolean mUserSetupComplete = false; + boolean mPaired = false; int mUserProvisioningState; int mPermissionPolicy; @@ -471,6 +486,19 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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) { @@ -542,6 +570,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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"; @@ -580,6 +609,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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; @@ -636,6 +667,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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; @@ -844,6 +881,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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)); @@ -1030,6 +1076,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } 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)); @@ -1270,6 +1323,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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="); @@ -1396,6 +1451,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return mContext.getSystemService(NotificationManager.class); } + IIpConnectivityMetrics getIIpConnectivityMetrics() { + return (IIpConnectivityMetrics) IIpConnectivityMetrics.Stub.asInterface( + ServiceManager.getService(IpConnectivityLog.SERVICE_NAME)); + } + PowerManagerInternal getPowerManagerInternal() { return LocalServices.getService(PowerManagerInternal.class); } @@ -1408,6 +1468,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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)); @@ -1616,6 +1680,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mHasFeature = mContext.getPackageManager() .hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN); + mIsWatch = mContext.getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_WATCH); if (!mHasFeature) { // Skip the rest of the initialization return; @@ -1716,8 +1782,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } 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 @@ -1925,7 +1997,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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, @@ -2216,6 +2288,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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)); @@ -2384,6 +2460,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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 @@ -2603,7 +2683,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // 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) { @@ -4678,7 +4758,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - private void wipeDataLocked(boolean wipeExtRequested, String reason) { + private void wipeDataNoLock(boolean wipeExtRequested, String reason) { if (wipeExtRequested) { StorageManager sm = (StorageManager) mContext.getSystemService( Context.STORAGE_SERVICE); @@ -4698,13 +4778,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } 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 { @@ -4719,39 +4800,44 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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); } } @@ -4931,7 +5017,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } if (wipeData) { // Call without holding lock. - wipeDeviceOrUserLocked(false, identifier, + wipeDeviceNoLock(false, identifier, "reportFailedPasswordAttempt()"); } } finally { @@ -5650,8 +5736,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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) { @@ -5882,8 +5972,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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); @@ -6055,8 +6147,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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); } @@ -6072,8 +6166,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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)) { @@ -6169,6 +6265,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return hasUserSetupCompleted(UserHandle.getCallingUserId()); } + // This checks only if the Setup Wizard has run. Since Wear devices pair before + // completing Setup Wizard, and pairing involves transferring user data, calling + // logic may want to check mIsWatch or mPaired in addition to hasUserSetupCompleted(). private boolean hasUserSetupCompleted(int userHandle) { if (!mHasFeature) { return true; @@ -6176,6 +6275,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return getUserData(userHandle).mUserSetupComplete; } + private boolean hasPaired(int userHandle) { + if (!mHasFeature) { + return true; + } + return getUserData(userHandle).mPaired; + } + @Override public int getUserProvisioningState() { if (!mHasFeature) { @@ -6384,9 +6490,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * 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. @@ -6406,15 +6513,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } 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"); } @@ -6424,14 +6531,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * 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; @@ -6454,6 +6563,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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); } @@ -6517,6 +6629,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } + 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(), @@ -8213,14 +8335,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } /** - * 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++) { @@ -8235,6 +8358,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } } + 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); + } + } + } } } @@ -8244,6 +8377,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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); @@ -8252,12 +8386,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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 @@ -8641,6 +8778,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (hasUserSetupCompleted(callingUserId)) { return false; } + if (mIsWatch && hasPaired(UserHandle.USER_SYSTEM)) { + return false; + } return true; } else if (DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE.equals(action)) { if (!mInjector.userManagerIsSplitSystemUser()) { @@ -8657,7 +8797,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * 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; } @@ -8667,14 +8808,17 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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 { @@ -8702,7 +8846,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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); } } @@ -9036,12 +9181,33 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } 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()); } } } @@ -9275,8 +9441,25 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * - 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); @@ -9284,22 +9467,30 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { 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) { @@ -9307,28 +9498,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } 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); @@ -9385,4 +9554,128 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } } + + @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 0000000000000000000000000000000000000000..b82cb3cfbeaff278bd1287c451294a46eeb951f5 --- /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 0000000000000000000000000000000000000000..a56a3709f02ab70a679da8773f89503576738156 --- /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 6f2141708ede08631aad44abbc83188216f08332..ef4fc25264076a681444b607ee60079a559da205 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -176,6 +176,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 = @@ -221,6 +223,7 @@ public final class SystemServer { private boolean mOnlyCore; private boolean mFirstBoot; private boolean mIsAlarmBoot; + private final boolean mRuntimeRestart; /** * Start the sensor service. @@ -237,6 +240,8 @@ public final class SystemServer { 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 class AdbPortObserver extends ContentObserver { @@ -349,6 +354,7 @@ public final class SystemServer { // 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); @@ -593,9 +599,15 @@ public final class SystemServer { 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); @@ -624,8 +636,10 @@ public final class SystemServer { 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"); @@ -645,10 +659,12 @@ public final class SystemServer { 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); @@ -671,9 +687,11 @@ public final class SystemServer { 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); @@ -1261,6 +1279,9 @@ public final class SystemServer { //#Fixme:mSystemServiceManager.startService(WEAR_BLUETOOTH_SERVICE_CLASS); 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 4c7545240c2375813d9f65793114b408da3ef66f..0b47079c0d219fafa9222987b15da3fb5e9c8692 100644 --- a/services/net/java/android/net/apf/ApfFilter.java +++ b/services/net/java/android/net/apf/ApfFilter.java @@ -194,8 +194,10 @@ public class ApfFilter { { (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 @@ public class ApfFilter { // 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 @@ public class ApfFilter { // 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 @@ public class ApfFilter { *

  • 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 ba73ce84ae0b7111a245a80414f8085067eb635b..01a9845fe9df3336755ebf2b003a1de54b0222eb 100644 --- a/services/net/java/android/net/dhcp/DhcpPacket.java +++ b/services/net/java/android/net/dhcp/DhcpPacket.java @@ -25,8 +25,10 @@ import java.util.List; * 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 0000000000000000000000000000000000000000..884a8a75426680c1cb38f8e52e490ade2f5bfbf3 --- /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 f4dc46380052f631ce79846bf747cdc89792b3e4..6c62d4b4d40cd30e68546066d73985d8a3472c9f 100644 --- a/services/net/java/android/net/ip/IpManager.java +++ b/services/net/java/android/net/ip/IpManager.java @@ -374,6 +374,7 @@ public class IpManager extends StateMachine { 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 class IpManager extends StateMachine { 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 class IpManager extends StateMachine { 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 class IpManager extends StateMachine { 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 @@ public class IpManager extends StateMachine { // Shut down this IpManager instance altogether. public void shutdown() { stop(); + mAvoidBadWifiTracker.shutdown(); quit(); } @@ -574,7 +612,7 @@ public class IpManager extends StateMachine { } 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 class IpManager extends StateMachine { 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 @@ public class IpManager extends StateMachine { return shouldLog; } + // TODO: Migrate all Log.e(...) to logError(...). + private void logError(String fmt, Object... args) { + mLocalLog.log("ERROR " + String.format(fmt, args)); + } + private void getNetworkInterface() { try { mNetworkInterface = NetworkInterface.getByName(mInterfaceName); @@ -816,13 +865,7 @@ public class IpManager extends StateMachine { 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 @@ public class IpManager extends StateMachine { 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 @@ public class IpManager extends StateMachine { 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 @@ public class IpManager extends StateMachine { mNwService.setInterfaceConfig(mInterfaceName, ifcg); if (VDBG) Log.d(mTag, "IPv4 configuration succeeded"); } catch (IllegalStateException | RemoteException e) { - Log.e(mTag, "IPv4 configuration failed: ", e); + logError("IPv4 configuration failed: %s", e); return false; } return true; @@ -944,6 +993,12 @@ public class IpManager extends StateMachine { } } + private void doImmediateProvisioningFailure(int failureType) { + if (DBG) { Log.e(mTag, "onProvisioningFailure(): " + failureType); } + recordMetric(failureType); + mCallback.onProvisioningFailure(new LinkProperties(mLinkProperties)); + } + private boolean startIPv4() { // If we have a StaticIpConfiguration attempt to apply it and // handle the result accordingly. @@ -951,9 +1006,6 @@ public class IpManager extends StateMachine { if (setIPv4Address(mConfiguration.mStaticIpConfig.ipAddress)) { handleIPv4Success(new DhcpResults(mConfiguration.mStaticIpConfig)); } else { - if (VDBG) { Log.d(mTag, "onProvisioningFailure()"); } - recordMetric(IpManagerEvent.PROVISIONING_FAIL); - mCallback.onProvisioningFailure(new LinkProperties(mLinkProperties)); return false; } } else { @@ -972,16 +1024,40 @@ public class IpManager extends StateMachine { mNwService.setInterfaceIpv6PrivacyExtensions(mInterfaceName, true); mNwService.enableIpv6(mInterfaceName); } catch (RemoteException re) { - Log.e(mTag, "Unable to change interface settings: " + re); + logError("Unable to change interface settings: %s", re); return false; } catch (IllegalStateException ie) { - Log.e(mTag, "Unable to change interface settings: " + ie); + logError("Unable to change interface settings: %s", ie); return false; } return true; } + private boolean startIpReachabilityMonitor() { + try { + mIpReachabilityMonitor = new IpReachabilityMonitor( + mContext, + mInterfaceName, + new IpReachabilityMonitor.Callback() { + @Override + public void notifyLost(InetAddress ip, String logMsg) { + mCallback.onReachabilityLost(logMsg); + } + }, + mAvoidBadWifiTracker); + } catch (IllegalArgumentException iae) { + // Failed to start IpReachabilityMonitor. Log it and call + // onProvisioningFailure() immediately. + // + // See http://b/31038971. + logError("IpReachabilityMonitor failure: %s", iae); + mIpReachabilityMonitor = null; + } + + return (mIpReachabilityMonitor != null); + } + private void stopAllIP() { // We don't need to worry about routes, just addresses, because: // - disableIpv6() will clear autoconf IPv6 routes as well, and @@ -1153,6 +1229,7 @@ public class IpManager extends StateMachine { } class RunningState extends State { + private ConnectivityPacketTracker mPacketTracker; private boolean mDhcpActionInFlight; @Override @@ -1165,29 +1242,26 @@ public class IpManager extends StateMachine { 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 class IpManager extends StateMachine { mDhcpClient.doQuit(); } + if (mPacketTracker != null) { + mPacketTracker.stop(); + mPacketTracker = null; + } + if (mApfFilter != null) { mApfFilter.shutdown(); mApfFilter = null; @@ -1213,6 +1292,14 @@ public class IpManager extends StateMachine { 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 c14e811e05844aa6e300de59eb879bd5fba60917..2abaeb1ae35b639ef3e1507784fbc49c4060b56c 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 class AvoidBadWifiTracker { 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 class AvoidBadWifiTracker { } 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 class AvoidBadWifiTracker { } 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 0000000000000000000000000000000000000000..12fa1e57653ad26eba98dcfb1a6fd38af3b5badc --- /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 0000000000000000000000000000000000000000..5b068c0b24684167217a86ba4ae9ac27e168ea74 --- /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 0000000000000000000000000000000000000000..362f7570c124f3dde47d41022c7edb2c4d4dcb4b --- /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 6197c42d0146abff0d22e7f0bacc7cd39adc76db..c6804cdf2a1ac54614ae73e1aee91219608097cb 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.PendingIntent; 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.os.UserManager; 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 class RetailDemoModeService extends SystemService { 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 class RetailDemoModeService extends SystemService { 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 class RetailDemoModeService extends SystemService { } 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 @@ public class RetailDemoModeService extends SystemService { 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 class RetailDemoModeService extends SystemService { 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 class RetailDemoModeService extends SystemService { 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 @@ public class RetailDemoModeService extends SystemService { } 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 @@ public class RetailDemoModeService extends SystemService { // 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 @@ public class RetailDemoModeService extends SystemService { 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 @@ public class RetailDemoModeService extends SystemService { } 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 class RetailDemoModeService extends SystemService { 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 class RetailDemoModeService extends SystemService { 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 class RetailDemoModeService extends SystemService { 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 class RetailDemoModeService extends SystemService { @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 50e0662ad4d407e2844bf2db7f0dc668ba76c127..7886b5e9e3955c3559de4c628f6fa23e0d9b6ea2 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 f7c61d15bb5fef2862f00ad580902021d05c59e5..6092fddc6be8e3e5e9f49ec94d9dad22c8eaa893 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 class ApfTest extends AndroidTestCase { // 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 class ApfTest extends AndroidTestCase { 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 0000000000000000000000000000000000000000..e03350f29f952f0bd3da2c123d4b4b5dbc053fbd --- /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 0000000000000000000000000000000000000000..dd679bc20090140375f98e9a14b83e5b9c6b6af4 --- /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 4af1cf1a0df8b3aa203a0bd66819c3a113f10ab4..65f9399c5a80e6f348423b0757c8ae7f5cbd3a57 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 @@ public class ConnectivityServiceTest extends AndroidTestCase { 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 class ConnectivityServiceTest extends AndroidTestCase { 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 class ConnectivityServiceTest extends AndroidTestCase { 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 class ConnectivityServiceTest extends AndroidTestCase { return new Network(mNetworkAgent.netId); } + public ConditionVariable getPreventReconnectReceived() { + return mPreventReconnectReceived; + } + public ConditionVariable getDisconnectedCV() { return mDisconnected; } @@ -597,6 +602,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { @Override protected CaptivePortalProbeResult isCaptivePortal() { + if (!mIsCaptivePortalCheckEnabled) { return new CaptivePortalProbeResult(204); } return new CaptivePortalProbeResult(gen204ProbeResult, gen204ProbeRedirectUrl, null); } } @@ -743,6 +749,9 @@ public class ConnectivityServiceTest extends AndroidTestCase { 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 class ConnectivityServiceTest extends AndroidTestCase { 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 class ConnectivityServiceTest extends AndroidTestCase { 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 033b2c96c8f5f6a77d008eae53d241804e05e297..0000000000000000000000000000000000000000 --- 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 aed363524560798ed36281ca912439426e572d48..011e505c46c4085e0b9323d0eaf19afa64a87659 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.IpReachabilityEvent; 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { " 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { " 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { " 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 class IpConnectivityEventBuilderTest extends TestCase { "dropped_events: 0", "events <", " time_ms: 1", + " transport: 0", " validation_probe_event <", " latency_ms: 40730", " network_id <", @@ -248,11 +268,13 @@ public class IpConnectivityEventBuilderTest extends TestCase { " 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { " 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { " 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 class IpConnectivityEventBuilderTest extends TestCase { 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 class IpConnectivityEventBuilderTest extends TestCase { " 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 3fc89b9ff12d38029f3052aa4cf15524c1617b3a..450653cdb01f2a30aff46ed7ecc09b9d75e80817 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.IpReachabilityEvent; 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.ArgumentCaptor; 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 class IpConnectivityMetricsTest extends TestCase { assertEventsEqual(expectedEvent(3), got.get(2)); } + @SmallTest public void testLoggingEventsWithMultipleCallers() throws Exception { IpConnectivityLog logger = new IpConnectivityLog(mMockService); @@ -100,6 +102,7 @@ public class IpConnectivityMetricsTest extends TestCase { } } + @SmallTest public void testBufferFlushing() { String output1 = getdump("flush"); assertEquals("", output1); @@ -112,6 +115,29 @@ public class IpConnectivityMetricsTest extends TestCase { 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 class IpConnectivityMetricsTest extends TestCase { 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 class IpConnectivityMetricsTest extends TestCase { " 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 class IpConnectivityMetricsTest extends TestCase { " >", ">", "events <", + " time_ms: 600", + " transport: 0", " apf_statistics <", " dropped_ras: 2", " duration_ms: 45000", @@ -192,9 +224,10 @@ public class IpConnectivityMetricsTest extends TestCase { " 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 class IpConnectivityMetricsTest extends TestCase { " route_info_lifetime: -1", " router_lifetime: 2000", " >", - " time_ms: 700", - ">"); + ">", + "version: 2"); verifySerialization(want, getdump("flush")); } @@ -231,8 +264,7 @@ public class IpConnectivityMetricsTest extends TestCase { 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 @@ public class IpConnectivityMetricsTest extends TestCase { } 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 0000000000000000000000000000000000000000..97afa60f0c6d8db999f94980d5d290e1fb185a8f --- /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 0000000000000000000000000000000000000000..21c2de79d68b7c04413acf0c7389a507f4ee9b6e --- /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 0783afc0dfd462000e549d74fcb8acd570716cfe..956d83a2caf80147ed89360f422e72f65e9c6c4b 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.MockContentResolver; 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.io.File; 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 class DpmMockContext extends MockContext { 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 class DpmMockContext extends MockContext { 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 class DpmMockContext extends MockContext { } } ); + when(accountManager.getAccountsAsUser(anyInt())).thenReturn(new Account[0]); // Create a data directory. @@ -418,6 +423,8 @@ public class DpmMockContext extends MockContext { 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 0000000000000000000000000000000000000000..315d37cbd662dde3863c6662034c9de14a846006 --- /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 3cfdc329a97189a892f8d5abb36ca8a21c635b7d..cd48f36ade5223412df98a98cbbd58856f6be831 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 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { 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 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { 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 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { 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 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { 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 0000000000000000000000000000000000000000..29185e92d5edfd809002fd9707c15f84b64557a8 --- /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 0000000000000000000000000000000000000000..2aca702b809ca80c4bc9b5baf4b0feae04591a7d --- /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 0000000000000000000000000000000000000000..378908655cb0c93a27d604085e0c3d0694aae317 --- /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 0000000000000000000000000000000000000000..f1b3442f1cf7d1cefefe3aff8b44953f9cc2b841 --- /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 0000000000000000000000000000000000000000..751e4b56be1ed47ee0a241e2aaa0252151d8fb1d --- /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 f5b5b1d813fffa029bbaae82a69cbf7315c4baef..bb08278ef0943e8603305c0a8466638148cb7ecf 100644 --- 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.UsbAccessory; 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; @@ -110,9 +111,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; @@ -193,6 +194,15 @@ public class UsbDeviceManager { } }; + 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; @@ -217,6 +227,8 @@ public class UsbDeviceManager { } mContext.registerReceiver(mHostReceiver, new IntentFilter(UsbManager.ACTION_USB_PORT_CHANGED)); + mContext.registerReceiver(mChargingReceiver, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); } private UsbSettingsManager getCurrentSettings() { @@ -289,7 +301,7 @@ public class UsbDeviceManager { if (functions != null) { mAccessoryModeRequestTime = SystemClock.elapsedRealtime(); - setCurrentFunctions(functions); + setCurrentFunctions(functions, false); } } @@ -331,6 +343,7 @@ public class UsbDeviceManager { private int mUsbNotificationId; private int mAdbNotificationId; private int mCurrentUser = UserHandle.USER_NULL; + private boolean mUsbCharging; public UsbHandler(Looper looper) { super(looper); @@ -338,14 +351,23 @@ public class UsbDeviceManager { // 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); + if (mContext.getResources().getBoolean( com.android.internal.R.bool.config_usb_data_unlock)) { boolean mtpEnable = UsbManager.containsFunction(getDefaultFunctions(), @@ -354,6 +376,7 @@ public class UsbDeviceManager { UsbManager.USB_FUNCTION_PTP); if (mtpEnable || ptpEnable) mUsbDataUnlocked = true; } + String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim(); updateState(state); @@ -398,6 +421,14 @@ public class UsbDeviceManager { 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; @@ -436,7 +467,10 @@ public class UsbDeviceManager { 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) { @@ -462,29 +496,24 @@ public class UsbDeviceManager { 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; - // 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); + // Persist the adb setting + String newFunction = applyAdbFunction(SystemProperties.get( + USB_PERSISTENT_CONFIG_PROPERTY, UsbManager.USB_FUNCTION_NONE)); + SystemProperties.set(USB_PERSISTENT_CONFIG_PROPERTY, newFunction); + + // 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(); } @@ -496,10 +525,17 @@ public class UsbDeviceManager { /** * 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; @@ -536,7 +572,8 @@ public class UsbDeviceManager { } 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); @@ -607,7 +644,7 @@ public class UsbDeviceManager { // 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) { @@ -624,10 +661,6 @@ public class UsbDeviceManager { 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; } } @@ -736,14 +769,12 @@ public class UsbDeviceManager { @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, @@ -751,7 +782,7 @@ public class UsbDeviceManager { updateCurrentAccessory(); } else if (!mConnected) { // restore defaults when USB is disconnected - setEnabledFunctions(null, false); + setEnabledFunctions(null, false, false); } if (mBootCompleted) { updateUsbStateBroadcastIfNeeded(); @@ -759,7 +790,7 @@ public class UsbDeviceManager { } 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); @@ -769,18 +800,19 @@ public class UsbDeviceManager { 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(); @@ -808,8 +840,7 @@ public class UsbDeviceManager { 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; } @@ -853,7 +884,7 @@ public class UsbDeviceManager { } } 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) { @@ -975,6 +1006,7 @@ public class UsbDeviceManager { 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()); @@ -1011,14 +1043,10 @@ public class UsbDeviceManager { 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 d6dbe90584f51a46d2176c589a9081a50e9ce795..daccc00ad80c554c4cec670c2ffc8989fe078fa6 100644 --- 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 class UsbService extends IUsbManager.Stub { } @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 class UsbService extends IUsbManager.Stub { } if (mDeviceManager != null) { - mDeviceManager.setCurrentFunctions(function); + mDeviceManager.setCurrentFunctions(function, usbDataUnlocked); } else { throw new IllegalStateException("USB device mode not supported"); } @@ -319,12 +319,6 @@ public class UsbService extends IUsbManager.Stub { 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 fb3caa6b1227c47371c81ef73a0b3a024d4f3105..a388b7f59fdaaa5aaf1a0293c315d8b8b07abb52 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -366,6 +366,7 @@ public final class Call { 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; @@ -600,6 +601,15 @@ public final class Call { 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 2b1672209a3dfbd4decbc00ebfef184223faedea..f601d8b545ac95f81fa078a054f3a24ca4286af5 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 715c8780530a6f8940d48815bfca7d98909d1306..3792c6d0aafaaf708043d1e6f8f1b20b6207212b 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -818,6 +818,7 @@ public abstract class Connection extends Conferenceable { 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) {} @@ -1524,6 +1525,7 @@ public abstract class Connection extends Conferenceable { 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; @@ -1803,6 +1805,15 @@ public abstract class Connection extends Conferenceable { return mConnectionProperties; } + /** + * Returns the connection's supported audio routes. + * + * @hide + */ + public final int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + /** * Sets the value of the {@link #getAddress()} property. * @@ -2024,6 +2035,28 @@ public abstract class Connection extends Conferenceable { } } + /** + * 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 4d3bbdf9ef679b8df28d9d3df8b6ae032ac8aa93..15dafe7e9574f3a9abfd33f5f2938da1369568a1 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -797,6 +797,7 @@ public abstract class ConnectionService extends Service { connection.getState(), connection.getConnectionCapabilities(), connection.getConnectionProperties(), + connection.getSupportedAudioRoutes(), connection.getAddress(), connection.getAddressPresentation(), connection.getCallerDisplayName(), @@ -1207,6 +1208,7 @@ public abstract class ConnectionService extends Service { 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 68602692f8d36b046afba75d484fd3d86442216b..e6b567e388aa0c1fa1e658c30e8c87ddbebe59c4 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 ecc7755280c9eda6cedb47c3f02c7a5c2e9029ed..ec3d45932ee5fd27131d3bbecf18d2737999ab8f 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 final class ParcelableCall implements Parcelable { int capabilities, int properties, long createTimeMillis, + int supportedAudioRoutes, long connectTimeMillis, Uri handle, int handlePresentation, @@ -89,6 +91,7 @@ public final class ParcelableCall implements Parcelable { mCapabilities = capabilities; mProperties = properties; mCreateTimeMillis = createTimeMillis; + mSupportedAudioRoutes = supportedAudioRoutes; mConnectTimeMillis = connectTimeMillis; mHandle = handle; mHandlePresentation = handlePresentation; @@ -145,6 +148,11 @@ public final class ParcelableCall implements Parcelable { 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 final class ParcelableCall implements Parcelable { 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 final class ParcelableCall implements Parcelable { capabilities, properties, createTimeMillis, + supportedAudioRoutes, connectTimeMillis, handle, handlePresentation, @@ -366,6 +376,7 @@ public final class ParcelableCall implements Parcelable { 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 540f388384bbbb960d018e1d6d2f560f36fa11b5..e9dba686ff8244a4446bf628f008e7298b7944cd 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 final class ParcelableConnection implements Parcelable { int state, int capabilities, int properties, + int supportedAudioRoutes, Uri address, int addressPresentation, String callerDisplayName, @@ -74,6 +76,7 @@ public final class ParcelableConnection implements Parcelable { mState = state; mConnectionCapabilities = capabilities; mConnectionProperties = properties; + mSupportedAudioRoutes = supportedAudioRoutes; mAddress = address; mAddressPresentation = addressPresentation; mCallerDisplayName = callerDisplayName; @@ -117,6 +120,10 @@ public final class ParcelableConnection implements Parcelable { return mConnectionProperties; } + public int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + public Uri getHandle() { return mAddress; } @@ -210,12 +217,14 @@ public final class ParcelableConnection implements Parcelable { 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 final class ParcelableConnection implements Parcelable { 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 473e39457f5847ff2d1e969d731ee14a49076b82..692dfb73b59b76fb0a3efb7f247f1b6341fa99b0 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.lang.String; 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 final class PhoneAccount implements Parcelable { mIsEnabled = phoneAccount.isEnabled(); mExtras = phoneAccount.getExtras(); mGroupId = phoneAccount.getGroupId(); + mSupportedAudioRoutes = phoneAccount.getSupportedAudioRoutes(); } /** @@ -410,6 +404,18 @@ public final class PhoneAccount implements Parcelable { 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 final class PhoneAccount implements Parcelable { mShortDescription, mSupportedUriSchemes, mExtras, + mSupportedAudioRoutes, mIsEnabled, mGroupId); } @@ -448,6 +455,7 @@ public final class PhoneAccount implements Parcelable { CharSequence shortDescription, List supportedUriSchemes, Bundle extras, + int supportedAudioRoutes, boolean isEnabled, String groupId) { mAccountHandle = account; @@ -460,6 +468,7 @@ public final class PhoneAccount implements Parcelable { mShortDescription = shortDescription; mSupportedUriSchemes = Collections.unmodifiableList(supportedUriSchemes); mExtras = extras; + mSupportedAudioRoutes = supportedAudioRoutes; mIsEnabled = isEnabled; mGroupId = groupId; } @@ -532,6 +541,17 @@ public final class PhoneAccount implements Parcelable { 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 final class PhoneAccount implements Parcelable { 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 final class PhoneAccount implements Parcelable { out.writeByte((byte) (mIsEnabled ? 1 : 0)); out.writeBundle(mExtras); out.writeString(mGroupId); + out.writeInt(mSupportedAudioRoutes); } public static final Creator CREATOR @@ -731,6 +761,7 @@ public final class PhoneAccount implements Parcelable { mIsEnabled = in.readByte() == 1; mExtras = in.readBundle(); mGroupId = in.readString(); + mSupportedAudioRoutes = in.readInt(); } @Override @@ -740,7 +771,9 @@ public final class PhoneAccount implements Parcelable { .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 final class PhoneAccount implements Parcelable { * @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 @@ public final class PhoneAccount implements Parcelable { } 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 c91ac569c3b170f333c48dac127e10a347308db4..c06fb3aeb860b04c41fa0cc4534e5990735acbd7 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 1a5cdb31c261899014032419399b9bd543d6a658..936856d0b73ee93c062769220d89a907bee9cf01 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -65,6 +65,16 @@ public class 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 class 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 class 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 class 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 class 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 class 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 class 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 class 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 class 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 class CarrierConfigManager { sDefaults.putBoolean(KEY_BROADCAST_EMERGENCY_CALL_STATE_CHANGES_BOOL, false); sDefaults.putBoolean(KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL, false); sDefaults.putBoolean(KEY_DISABLE_SEVERE_WHEN_EXTREME_DISABLED_BOOL, true); + sDefaults.putLong(KEY_MESSAGE_EXPIRATION_TIME_LONG, 86400000L); sDefaults.putStringArray(KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{ "default:default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000," + "320000:5000,640000:5000,1280000:5000,1800000:5000", @@ -1114,6 +1213,7 @@ public class 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); @@ -1192,6 +1292,11 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, false); sDefaults.putBoolean(KEY_STK_DISABLE_LAUNCH_BROWSER_BOOL, false); sDefaults.putBoolean(KEY_MAP_ANONYMOUS_TO_RESTRICTED_BOOL, true); + 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); } /** @@ -1244,12 +1349,12 @@ public class CarrierConfigManager { * 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 da8ade7e555c321dfaebacc02c186efc26cacfb9..7f368d0fd81fe28e1ce1a58e0a6101a7cd08494c 100644 --- a/telephony/java/android/telephony/DisconnectCause.java +++ b/telephony/java/android/telephony/DisconnectCause.java @@ -288,6 +288,13 @@ public class DisconnectCause { public static final int NON_SELECTED_USER_CLEARING = 105; + /** + * 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 = 106; + //********************************************************************************************* // When adding a disconnect type: // 1) Please assign the new type the next id value below. @@ -296,14 +303,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: 106 + // NextId: 107 //********************************************************************************************* /** 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 = NON_SELECTED_USER_CLEARING; + public static final int MAXIMUM_VALID_VALUE = DIALED_CALL_FORWARDING_WHILE_ROAMING; /** Private constructor to avoid class instantiation. */ private DisconnectCause() { @@ -523,6 +530,8 @@ public class DisconnectCause { return "HO_NOT_FEASIBLE"; case NON_SELECTED_USER_CLEARING: return "NON_SELECTED_USER_CLEARING"; + 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 8ce793976880087be9c5e17942673e06ec1047af..7f5be18f817cfbf7244e066abcdcda6bb89d9f8d 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -30,6 +30,7 @@ import android.location.Country; 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 class PhoneNumberUtils * 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 class PhoneNumberUtils * @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 39b8f84297fcf4c21d83e18156a22794406e5752..372b127b131e1c0da06de942e8e98c16b006729f 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -367,13 +367,13 @@ public class TelephonyManager { * 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; @@ -1057,12 +1057,12 @@ public class TelephonyManager { /** * 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 @@ -1590,6 +1590,11 @@ public class TelephonyManager { /** * 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 @@ -1608,10 +1613,6 @@ public class TelephonyManager { * @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 04cb1f2787929bf815dfcae53decf8e996e869b7..98f8e0a207c29e683dda00e3c4a61fa22546f14b 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 d4104bd34db38cbea03d6dd83204308a35777f67..20c303e9550b67c30cbe7f6c5fe98c7f021c903f 100644 --- a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java +++ b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java @@ -438,7 +438,7 @@ public class CallerInfoAsyncQuery { // 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 31cacfb0d41946225cddf866887d4a209636292c..c6ab8446b52246014995a0eec771dae8b2456221 100644 --- a/test-runner/src/android/test/mock/MockPackageManager.java +++ b/test-runner/src/android/test/mock/MockPackageManager.java @@ -140,6 +140,12 @@ public class MockPackageManager extends PackageManager { 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 0000000000000000000000000000000000000000..cfb71643044b91d20b4d578e29d9f94910a0c112 --- /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 0000000000000000000000000000000000000000..73b5b6c2e7b83cad4dec92305b1925b16135df49 --- /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 0000000000000000000000000000000000000000..cd87cea19f1d1ab2ddb02db3d3cac19de93a0da8 --- /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 0000000000000000000000000000000000000000..796b96d1c402326528b4ba3c12ee9d92d0e212e9 --- /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 0000000000000000000000000000000000000000..689e5e0024da921defbc6874408b09f582d6dfd6 --- /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 0000000000000000000000000000000000000000..7133beb8efeee65bda54add1f8150149b202c663 --- /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 0000000000000000000000000000000000000000..de32a749cc70c2ce72120a8c6339737d54f0d83f --- /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 0000000000000000000000000000000000000000..717e3974919d06f49f9605119512061c7f55e619 --- /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 3463a4f546846daade85227b754b6395deccf41f..e4aa4dc6c3f0b3f26ae731ab9576c41992e1daf6 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 0000000000000000000000000000000000000000..7c139742f54d792e802556af72c98090437e542f --- /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 0000000000000000000000000000000000000000..8d20ff24bfe5aab5b73c1aaf37e486b10771385b --- /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 00cdadb1b59db482ca2339847f464124ae180a17..1824f4a6899582cd42f4bcbc049795c1ba04e0aa 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 0000000000000000000000000000000000000000..cde69bcccec65160d92116f20ffce4fce0b5245c 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 0000000000000000000000000000000000000000..c133a0cbd379f5af6dbf1a899a0293ca5eccfad0 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 0000000000000000000000000000000000000000..bfa42f0e7b91d006d22352c9ff2f134e504e3c1d 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 0000000000000000000000000000000000000000..324e72cdd7480cb983fa1bcc7ce686e51ef87fe7 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 0000000000000000000000000000000000000000..1f222e1eb0bc2911055b7c6fa67184131b7aabe0 --- /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 0000000000000000000000000000000000000000..5eeebd7dec7e4a0f9fda1d83829a7d94c840d953 --- /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 cd8521f4842196159e55b13dd670b3e1be2b27fa..b97f095d501e5e57f86009660e3db6a67704fc1d 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 0000000000000000000000000000000000000000..d3ff69d6e7f91950ff157ce7e6b7ab81f0a49d2d --- /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 0000000000000000000000000000000000000000..1d3591c8a4c9c29578c36c87f80c05a6aea3ee3f --- /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 0000000000000000000000000000000000000000..8c0fb64a8698b08ecc4158d828ca593c4928e9dd 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 0000000000000000000000000000000000000000..0c71e760dc93830dd3411fe50d6f5c86bf0a8f4d --- /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 0000000000000000000000000000000000000000..91a7e269e19dfc62e27137a0b57ef3e430cee4fd --- /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 0000000000000000000000000000000000000000..aec99730b4e8fcd90b57a0e8e01544fea7c31a89 --- /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 0000000000000000000000000000000000000000..e7b4def49cb53d9aa04228dd3edb14c9e635e003 --- /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 0f39e8042883f15fb9896258a166e3f0b86a1923..ffce1a0496d9783ac94d568a053e0c5360b54aaa 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 @@ public class NativeInterpolatorFactoryHelper_Delegate { @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 b3ed9e1a016496c26956d5868da5442e95d493b3..8dbbd076982f972b80ac44ed6ba928aad38891c5 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 class BridgePackageManager extends PackageManager { 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 eb2530287f4ebb44e3dd2d381c97e71d5ba5fc57..12e71087b5f5904acbac460b26d19297822d7cb9 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 a90414c5ae6688606377bc32d749a444342f40cd..9add7918915c74f389cd7ccfb090ba0c15c55adb 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -100,10 +100,22 @@ public class WifiConfiguration implements Parcelable { */ 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" }; } /** @@ -480,6 +492,12 @@ public class WifiConfiguration implements Parcelable { /** @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 @@ -1560,6 +1578,7 @@ public class WifiConfiguration implements Parcelable { sbuf.append(" lcuid=" + lastConnectUid); sbuf.append(" userApproved=" + userApprovedAsString(userApproved)); sbuf.append(" noInternetAccessExpected=" + noInternetAccessExpected); + sbuf.append(" isCarrierNetwork=" + isCarrierNetwork); sbuf.append(" "); if (this.lastConnected != 0) { @@ -1925,6 +1944,7 @@ public class WifiConfiguration implements Parcelable { userApproved = source.userApproved; numNoInternetAccessReports = source.numNoInternetAccessReports; noInternetAccessExpected = source.noInternetAccessExpected; + isCarrierNetwork = source.isCarrierNetwork; creationTime = source.creationTime; updateTime = source.updateTime; shared = source.shared; @@ -1998,6 +2018,7 @@ public class WifiConfiguration implements Parcelable { 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); @@ -2071,6 +2092,7 @@ public class WifiConfiguration implements Parcelable { 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 8d937619d5b80549d0d81639d0c0a8648b63a322..852316a2158095178dc3d00bce820ac13eeffbac 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -19,6 +19,7 @@ package android.net.wifi; 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; @@ -591,6 +592,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 @@ -752,6 +775,15 @@ public class WifiManager { } } + /** @hide */ + public boolean hasCarrierConfiguredNetworks() { + try { + return mService.hasCarrierConfiguredNetworks(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** @hide */ @SystemApi public List getPrivilegedConfiguredNetworks() { @@ -1475,7 +1507,7 @@ public class WifiManager { */ public boolean setWifiEnabled(boolean enabled) { try { - return mService.setWifiEnabled(enabled); + return mService.setWifiEnabled(mContext.getOpPackageName(), enabled); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); }