Set version to alpha 8. am: 381b322b97
am: 80565f603b -s ours
Change-Id: I42cc3ef4e65d8d602b1e9ac72def70d2cb72ef2f
diff --git a/api/26.0.0-SNAPSHOT.txt b/api/26.0.0-SNAPSHOT.txt
index fe0c575..13c52ca 100644
--- a/api/26.0.0-SNAPSHOT.txt
+++ b/api/26.0.0-SNAPSHOT.txt
@@ -233,6 +233,60 @@
}
+package android.support.content {
+
+ public class ContentPager {
+ ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner);
+ ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner, int);
+ method public static android.os.Bundle createArgs(int, int);
+ method public android.support.content.Query query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal, android.support.content.ContentPager.ContentCallback);
+ method public void reset();
+ field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
+ field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
+ field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
+ field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
+ field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+ field public static final java.lang.String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+ field public static final java.lang.String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+ field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+ field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+ field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+ }
+
+ public static abstract interface ContentPager.ContentCallback {
+ method public abstract void onCursorReady(android.support.content.Query, android.database.Cursor);
+ }
+
+ public static abstract class ContentPager.CursorDisposition implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract interface ContentPager.QueryRunner {
+ method public abstract void cancel(android.support.content.Query);
+ method public abstract boolean isRunning(android.support.content.Query);
+ method public abstract void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+ }
+
+ public static abstract interface ContentPager.QueryRunner.Callback {
+ method public abstract void onQueryFinished(android.support.content.Query, android.database.Cursor);
+ method public abstract android.database.Cursor runQueryInBackground(android.support.content.Query);
+ }
+
+ public final class LoaderQueryRunner implements android.support.content.ContentPager.QueryRunner {
+ ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
+ method public void cancel(android.support.content.Query);
+ method public boolean isRunning(android.support.content.Query);
+ method public void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+ }
+
+ public final class Query {
+ method public int getId();
+ method public int getLimit();
+ method public int getOffset();
+ method public android.net.Uri getUri();
+ }
+
+}
+
package android.support.customtabs {
public class CustomTabsCallback {
@@ -12189,6 +12243,7 @@
method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+ method public int getItemDecorationCount();
method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
method public int getMaxFlingVelocity();
method public int getMinFlingVelocity();
@@ -12212,6 +12267,7 @@
method public void onScrollStateChanged(int);
method public void onScrolled(int, int);
method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+ method public void removeItemDecorationAt(int);
method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
diff --git a/api/26.1.0-SNAPSHOT.txt b/api/27.0.0-SNAPSHOT.txt
similarity index 99%
rename from api/26.1.0-SNAPSHOT.txt
rename to api/27.0.0-SNAPSHOT.txt
index c0b0862..a6d52b1 100644
--- a/api/26.1.0-SNAPSHOT.txt
+++ b/api/27.0.0-SNAPSHOT.txt
@@ -233,6 +233,60 @@
}
+package android.support.content {
+
+ public class ContentPager {
+ ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner);
+ ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner, int);
+ method public static android.os.Bundle createArgs(int, int);
+ method public android.support.content.Query query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal, android.support.content.ContentPager.ContentCallback);
+ method public void reset();
+ field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
+ field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
+ field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
+ field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
+ field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+ field public static final java.lang.String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+ field public static final java.lang.String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+ field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+ field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+ field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+ }
+
+ public static abstract interface ContentPager.ContentCallback {
+ method public abstract void onCursorReady(android.support.content.Query, android.database.Cursor);
+ }
+
+ public static abstract class ContentPager.CursorDisposition implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract interface ContentPager.QueryRunner {
+ method public abstract void cancel(android.support.content.Query);
+ method public abstract boolean isRunning(android.support.content.Query);
+ method public abstract void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+ }
+
+ public static abstract interface ContentPager.QueryRunner.Callback {
+ method public abstract void onQueryFinished(android.support.content.Query, android.database.Cursor);
+ method public abstract android.database.Cursor runQueryInBackground(android.support.content.Query);
+ }
+
+ public final class LoaderQueryRunner implements android.support.content.ContentPager.QueryRunner {
+ ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
+ method public void cancel(android.support.content.Query);
+ method public boolean isRunning(android.support.content.Query);
+ method public void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+ }
+
+ public final class Query {
+ method public int getId();
+ method public int getLimit();
+ method public int getOffset();
+ method public android.net.Uri getUri();
+ }
+
+}
+
package android.support.customtabs {
public class CustomTabsCallback {
@@ -5609,8 +5663,7 @@
method public final int getPickerItemLayoutId();
method public final int getPickerItemTextViewId();
method public int getSelectedColumn();
- method public final deprecated java.lang.CharSequence getSeparator();
- method public final java.util.List<java.lang.CharSequence> getSeparators();
+ method public final java.lang.CharSequence getSeparator();
method public float getVisibleItemCount();
method public void onColumnValueChanged(int, int);
method public void removeOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
@@ -5621,7 +5674,6 @@
method public final void setPickerItemTextViewId(int);
method public void setSelectedColumn(int);
method public final void setSeparator(java.lang.CharSequence);
- method public final void setSeparators(java.util.List<java.lang.CharSequence>);
method public void setVisibleItemCount(float);
}
@@ -6965,10 +7017,6 @@
method public static java.lang.String[] matchesMany(java.lang.String[], java.lang.String);
}
- public final deprecated class ParallelExecutorCompat {
- method public static deprecated java.util.concurrent.Executor getParallelExecutor();
- }
-
public final class PermissionChecker {
method public static int checkCallingOrSelfPermission(android.content.Context, java.lang.String);
method public static int checkCallingPermission(android.content.Context, java.lang.String, java.lang.String);
@@ -7037,9 +7085,6 @@
public final class ConfigurationHelper {
method public static int getDensityDpi(android.content.res.Resources);
- method public static deprecated int getScreenHeightDp(android.content.res.Resources);
- method public static deprecated int getScreenWidthDp(android.content.res.Resources);
- method public static deprecated int getSmallestScreenWidthDp(android.content.res.Resources);
}
public final class ResourcesCompat {
@@ -8133,7 +8178,6 @@
public final class TextUtilsCompat {
method public static int getLayoutDirectionFromLocale(java.util.Locale);
method public static java.lang.String htmlEncode(java.lang.String);
- field public static final deprecated java.util.Locale ROOT;
}
}
@@ -12191,6 +12235,7 @@
method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+ method public int getItemDecorationCount();
method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
method public int getMaxFlingVelocity();
method public int getMinFlingVelocity();
@@ -12214,6 +12259,7 @@
method public void onScrollStateChanged(int);
method public void onScrolled(int, int);
method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+ method public void removeItemDecorationAt(int);
method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
diff --git a/app-toolkit/core-testing/src/main/AndroidManifest.xml b/app-toolkit/core-testing/src/main/AndroidManifest.xml
index 83e0d83..2d55b39 100644
--- a/app-toolkit/core-testing/src/main/AndroidManifest.xml
+++ b/app-toolkit/core-testing/src/main/AndroidManifest.xml
@@ -14,5 +14,10 @@
~ limitations under the License.
-->
-<manifest package="android.arch.core.testing">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.arch.core.testing">
+ <application>
+ <meta-data android:name="android.arch.core.testing.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/app-toolkit/dependencies.gradle b/app-toolkit/dependencies.gradle
index 07acc6b..c9e3dea 100644
--- a/app-toolkit/dependencies.gradle
+++ b/app-toolkit/dependencies.gradle
@@ -84,5 +84,4 @@
ext.tools.current_sdk = gradle.ext.currentSdk
ext.tools.build_tools_version = rootProject.ext.buildToolsVersion
ext.flatfoot = [:]
-ext.flatfoot.release_version = "1.0.0-alpha8"
ext.flatfoot.min_sdk = 14
diff --git a/app-toolkit/gradle/wrapper/gradle-wrapper.properties b/app-toolkit/gradle/wrapper/gradle-wrapper.properties
index 1b987ef..54575d6 100644
--- a/app-toolkit/gradle/wrapper/gradle-wrapper.properties
+++ b/app-toolkit/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=../../../../../tools/external/gradle/gradle-4.1-milestone-1-bin.zip
+distributionUrl=../../../../../tools/external/gradle/gradle-4.1-rc-2-bin.zip
diff --git a/app-toolkit/init.gradle b/app-toolkit/init.gradle
index fab8e17..fe32308 100644
--- a/app-toolkit/init.gradle
+++ b/app-toolkit/init.gradle
@@ -13,6 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+import android.support.LibraryVersions
import org.gradle.internal.os.OperatingSystem
def root = ext.supportRootFolder
@@ -20,7 +22,6 @@
if (ext.inAppToolkitProject) {
apply from: "${ext.supportRootFolder}/buildSrc/init.gradle"
- init.loadDefaultVersions()
init.setSdkInLocalPropertiesFile()
}
@@ -91,7 +92,7 @@
def zipFlatfootDocsTask = rootProject.tasks.create(name : "createFlatfootDocsArchive", type : Zip) {
from rootProject.docsDir
destinationDir distDir
- baseName = String.format("flatfoot-docs-%s", rootProject.ext.flatfoot.release_version)
+ baseName = String.format("flatfoot-docs-%s", LibraryVersions.FLATFOOT.toString())
}
buildServerAnchorTask.dependsOn zipFlatfootDocsTask
@@ -125,7 +126,7 @@
}
project.group = finalGroup
if (!project.version) {
- project.version = flatfoot.release_version
+ project.version = LibraryVersions.FLATFOOT.toString()
}
if (project.getPath().contains("integration-tests")) {
@@ -182,6 +183,10 @@
project.artifacts {
archives sourcesTask
}
+ project.android.defaultConfig {
+ // Update the version meta-data in each Manifest.
+ addManifestPlaceholders(["version" : project.version])
+ }
} else if(isJavaLibrary && project.name == "common") {
// it is a shared lib, enable sources.
def sourcesTask = project.tasks.create(name: "sourcesJar", type : Jar) {
diff --git a/app-toolkit/runtime/src/main/AndroidManifest.xml b/app-toolkit/runtime/src/main/AndroidManifest.xml
index 3f40068..a5660ce 100644
--- a/app-toolkit/runtime/src/main/AndroidManifest.xml
+++ b/app-toolkit/runtime/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.arch.core">
+ <application>
+ <meta-data android:name="android.arch.core.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/build.gradle b/build.gradle
index 360ec02..8c32175 100644
--- a/build.gradle
+++ b/build.gradle
@@ -19,7 +19,6 @@
apply from: 'buildSrc/repos.gradle'
apply from: 'buildSrc/init.gradle'
- init.loadDefaultVersions()
init.setSdkInLocalPropertiesFile()
repos.addMavenRepositories(repositories)
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index 8a7d69a..4946de2 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -20,11 +20,11 @@
libs.mockito_core = 'org.mockito:mockito-core:2.7.6'
libs.dexmaker_mockito = 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0'
libs.junit = 'junit:junit:4.12'
-libs.test_runner = 'com.android.support.test:runner:0.6-alpha'
-libs.espresso_core = 'com.android.support.test.espresso:espresso-core:2.3-alpha'
-libs.espresso_contrib = 'com.android.support.test.espresso:espresso-contrib:2.3-alpha'
+libs.test_runner = 'com.android.support.test:runner:1.0.0'
+libs.test_rules = 'com.android.support.test:rules:1.0.0'
+libs.espresso_core = 'com.android.support.test.espresso:espresso-core:3.0.0'
+libs.espresso_contrib = 'com.android.support.test.espresso:espresso-contrib:3.0.0'
libs.jacoco = 'org.jacoco:org.jacoco.core:0.7.8'
-libs.test_rules = 'com.android.support.test:rules:0.6-alpha'
def androidPluginVersionOverride = System.getenv("GRADLE_PLUGIN_VERSION")
@@ -32,7 +32,7 @@
libs.gradle = 'com.android.tools.build:gradle:' + androidPluginVersionOverride
} else {
// Keep gradle plugin version in sync with ub_supportlib-master manifest.
- libs.gradle = 'com.android.tools.build:gradle:3.0.0-alpha7'
+ libs.gradle = 'com.android.tools.build:gradle:3.0.0-alpha9'
}
// Other dependencies
diff --git a/buildSrc/diff_and_docs.gradle b/buildSrc/diff_and_docs.gradle
index 3011092..2c94849 100644
--- a/buildSrc/diff_and_docs.gradle
+++ b/buildSrc/diff_and_docs.gradle
@@ -14,20 +14,15 @@
* limitations under the License.
*/
+import android.support.LibraryVersions
+import android.support.Version
import android.support.checkapi.ApiXmlConversionTask
import android.support.checkapi.CheckApiTask
import android.support.checkapi.UpdateApiTask
import android.support.doclava.DoclavaTask
import android.support.jdiff.JDiffTask
-import android.support.Version
-
-import org.gradle.api.InvalidUserDataException
-
import groovy.io.FileType
-import groovy.transform.Field;
-
-import java.util.regex.Matcher
-import java.util.regex.Pattern
+import groovy.transform.Field
// Set up platform API files for federation.
if (project.androidApiTxt != null) {
@@ -490,7 +485,7 @@
}
if (hasApiFolder(rootProject)) {
- rootProject.version = rootProject.supportVersion
+ rootProject.version = LibraryVersions.SUPPORT_LIBRARY.toString();
initializeApiChecksForProject(rootProject)
}
diff --git a/buildSrc/init.gradle b/buildSrc/init.gradle
index 486a078..014e3dc 100644
--- a/buildSrc/init.gradle
+++ b/buildSrc/init.gradle
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+import android.support.LibraryVersions
import com.android.build.gradle.internal.coverage.JacocoPlugin
import com.android.build.gradle.internal.coverage.JacocoReportTask
import com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask
@@ -38,10 +39,6 @@
dataname: "SUPPORT_DATA"
]
-def loadDefaultVersions() {
- apply from: "${supportRootFolder}/buildSrc/versions.gradle"
-}
-
def enableDoclavaAndJDiff(p) {
p.configurations {
doclava
@@ -91,9 +88,11 @@
}
def setupRepoOutAndBuildNumber() {
+ // common support repo folder which works well for prebuilts.
ext.supportRepoOut = ''
+ // files in artifactoryRepoOut can be safely copied into a real artifactory.
+ ext.artifactoryRepoOut = ''
ext.buildNumber = "0"
-
/*
* With the build server you are given two env variables.
* The OUT_DIR is a temporary directory you can use to put things during the build.
@@ -121,6 +120,7 @@
project.buildDir = new File("$project.parent.buildDir/../$project.name/build")
}
ext.supportRepoOut = new File(buildDir, 'support_repo')
+ ext.artifactoryRepoOut = new File(buildDir, 'artifactory_repo')
ext.testApkDistOut = ext.distDir
ext.testResultsDistDir = new File(distDir, "host-test-reports")
ext.docsDir = new File(buildDir, 'javadoc')
@@ -167,7 +167,7 @@
project.ext.currentSdk = gradle.ext.currentSdk
apply plugin: 'maven'
- version = rootProject.ext.supportVersion
+ version = LibraryVersions.SUPPORT_LIBRARY.toString();
group = 'com.android.support'
project.plugins.whenPluginAdded { plugin ->
@@ -236,6 +236,7 @@
project.afterEvaluate {
Upload uploadTask = (Upload) project.tasks.uploadArchives;
uploadTask.repositories.mavenDeployer {
+
// Disable unique names for SNAPSHOTS so they can be updated in place.
setUniqueVersion(false)
}
@@ -255,11 +256,26 @@
}
}
+ // create a release task that produces artifactory friends artifacts
+ // a.k.a. unique versions for snapshots with their maven-metadata files.
+ task artifactoryRelease(type : Upload) {
+ configuration = uploadTask.configuration
+ repositories {
+ mavenDeployer {
+ repository(url: uri("$rootProject.ext.artifactoryRepoOut"))
+ setUniqueVersion(true)
+ }
+ }
+ }
+
// Before the upload, make sure the repo is ready.
uploadTask.dependsOn rootProject.tasks.prepareRepo
+ artifactoryRelease.dependsOn uploadTask
+
// Make the mainupload depend on this one.
mainUpload.dependsOn uploadTask
+ mainUpload.dependsOn artifactoryRelease
}
}
}
@@ -348,6 +364,5 @@
ext.init.setSdkInLocalPropertiesFile = this.&setSdkInLocalPropertiesFile
ext.init.setupRepoOutAndBuildNumber = this.&setupRepoOutAndBuildNumber
ext.init.setupRelease = this.&setupRelease
-ext.init.loadDefaultVersions = this.&loadDefaultVersions
ext.init.configureSubProjects = this.&configureSubProjects
ext.init.configureBuildOnServer = this.&configureBuildOnServer
diff --git a/buildSrc/release.gradle b/buildSrc/release.gradle
index 5033454..d9a0266 100644
--- a/buildSrc/release.gradle
+++ b/buildSrc/release.gradle
@@ -20,7 +20,7 @@
task createArchive(type : Zip) {
description "Creates a maven repository that includes just the libraries compiled in this" +
" project, without any history from prebuilts."
- from rootProject.ext.supportRepoOut
+ from rootProject.ext.artifactoryRepoOut
destinationDir rootProject.ext.distDir
into 'm2repository'
baseName = String.format("top-of-tree-m2repository-%s", project.ext.buildNumber)
@@ -34,5 +34,7 @@
doFirst {
rootProject.ext.supportRepoOut.deleteDir()
rootProject.ext.supportRepoOut.mkdirs()
+ rootProject.ext.artifactoryRepoOut.deleteDir()
+ rootProject.ext.artifactoryRepoOut.mkdirs()
}
}
diff --git a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
index 20376b2..7ebef19 100644
--- a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
+++ b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.groovy
@@ -52,7 +52,7 @@
library.defaultConfig {
// Update the version meta-data in each Manifest.
- addManifestPlaceholders(["support-version": project.rootProject.supportVersion,
+ addManifestPlaceholders(["support-version": LibraryVersions.SUPPORT_LIBRARY.toString(),
"target-sdk-version": project.currentSdk])
// Set test related options.
@@ -102,11 +102,17 @@
// TODO(aurimas): figure out the issue with missing translation check
disable 'MissingTranslation'
-
- // Set baseline file for all legacy lint warnings.
- baseline new File(project.projectDir, "/lint-baseline.xml")
}
+ // Set baseline file for all legacy lint warnings.
+ if (System.getenv("GRADLE_PLUGIN_VERSION") != null) {
+ library.lintOptions.check 'NewApi'
+ } else {
+ library.lintOptions.baseline new File(project.projectDir, "/lint-baseline.xml")
+
+ }
+
+
// Java 8 is only fully supported on API 24+ and not all Java 8 features are binary
// compatible with API < 24, so use Java 7 for both source AND target.
library.compileOptions {
diff --git a/buildSrc/src/main/java/android/support/LibraryVersions.java b/buildSrc/src/main/java/android/support/LibraryVersions.java
new file mode 100644
index 0000000..a99363e
--- /dev/null
+++ b/buildSrc/src/main/java/android/support/LibraryVersions.java
@@ -0,0 +1,37 @@
+/*
+ * 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 android.support;
+
+/**
+ * The list of versions codes of all the libraries in this project.
+ */
+public class LibraryVersions {
+ /**
+ * Version code of the support library components.
+ */
+ public static final Version SUPPORT_LIBRARY = new Version("27.0.0-SNAPSHOT");
+
+ /**
+ * Version code of the flatfoot libraries.
+ */
+ public static final Version FLATFOOT = new Version("1.0.0-alpha8");
+
+ /**
+ * Version code of the lifecycles library.
+ */
+ public static final Version LIFECYCLES = new Version("1.0.0-SNAPSHOT");
+}
diff --git a/buildSrc/src/main/java/android/support/Version.java b/buildSrc/src/main/java/android/support/Version.java
index 1338a1d..b88d8cf 100644
--- a/buildSrc/src/main/java/android/support/Version.java
+++ b/buildSrc/src/main/java/android/support/Version.java
@@ -68,4 +68,9 @@
public String getExtra() {
return mExtra;
}
+
+ @Override
+ public String toString() {
+ return mMajor + "." + mMinor + "." + mPatch + (mExtra != null ? mExtra : "");
+ }
}
diff --git a/compat/AndroidManifest.xml b/compat/AndroidManifest.xml
index 09383ee..cba2f24 100644
--- a/compat/AndroidManifest.xml
+++ b/compat/AndroidManifest.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
package="android.support.compat">
- <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.compat"/>
+ <uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.compat.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/compat/api/26.1.0-SNAPSHOT.txt b/compat/api/27.0.0-SNAPSHOT.txt
similarity index 99%
rename from compat/api/26.1.0-SNAPSHOT.txt
rename to compat/api/27.0.0-SNAPSHOT.txt
index b3b5173..a975912 100644
--- a/compat/api/26.1.0-SNAPSHOT.txt
+++ b/compat/api/27.0.0-SNAPSHOT.txt
@@ -655,10 +655,6 @@
field public static final deprecated int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
}
- public final deprecated class ParallelExecutorCompat {
- method public static deprecated java.util.concurrent.Executor getParallelExecutor();
- }
-
public final class SharedPreferencesCompat {
}
@@ -711,9 +707,6 @@
public final class ConfigurationHelper {
method public static int getDensityDpi(android.content.res.Resources);
- method public static deprecated int getScreenHeightDp(android.content.res.Resources);
- method public static deprecated int getScreenWidthDp(android.content.res.Resources);
- method public static deprecated int getSmallestScreenWidthDp(android.content.res.Resources);
}
public final class ResourcesCompat {
@@ -1042,7 +1035,6 @@
public final class TextUtilsCompat {
method public static int getLayoutDirectionFromLocale(java.util.Locale);
method public static java.lang.String htmlEncode(java.lang.String);
- field public static final deprecated java.util.Locale ROOT;
}
}
diff --git a/compat/build.gradle b/compat/build.gradle
index 7e9468b..289543a 100644
--- a/compat/build.gradle
+++ b/compat/build.gradle
@@ -3,14 +3,10 @@
dependencies {
api project(':support-annotations')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
androidTestImplementation project(':support-testutils')
}
diff --git a/compat/ics/android/support/v4/graphics/PaintCompatApi14.java b/compat/ics/android/support/v4/graphics/PaintCompatApi14.java
deleted file mode 100644
index 7a7de7c..0000000
--- a/compat/ics/android/support/v4/graphics/PaintCompatApi14.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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 android.support.v4.graphics;
-
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.v4.util.Pair;
-
-class PaintCompatApi14 {
- // U+DFFFD which is very end of unassigned plane.
- private static final String TOFU_STRING = "\uDB3F\uDFFD";
- private static final String EM_STRING = "m";
-
- private static final ThreadLocal<Pair<Rect, Rect>> sRectThreadLocal = new ThreadLocal<>();
-
- static boolean hasGlyph(@NonNull Paint paint, @NonNull String string) {
- final int length = string.length();
-
- if (length == 1 && Character.isWhitespace(string.charAt(0))) {
- // measureText + getTextBounds skips whitespace so we need to special case it here
- return true;
- }
-
- final float missingGlyphWidth = paint.measureText(TOFU_STRING);
- final float emGlyphWidth = paint.measureText(EM_STRING);
-
- final float width = paint.measureText(string);
-
- if (width == 0f) {
- // If the string width is 0, it can't be rendered
- return false;
- }
-
- if (string.codePointCount(0, string.length()) > 1) {
- // Heuristic to detect fallback glyphs for ligatures like flags and ZWJ sequences
- // Return false if string is rendered too widely
- if (width > 2 * emGlyphWidth) {
- return false;
- }
-
- // Heuristic to detect fallback glyphs for ligatures like flags and ZWJ sequences (2).
- // If width is greater than or equal to the sum of width of each code point, it is very
- // likely that the system is using fallback fonts to draw {@code string} in two or more
- // glyphs instead of a single ligature glyph. (hasGlyph returns false in this case.)
- // False detections are possible (the ligature glyph may happen to have the same width
- // as the sum width), but there are no good way to avoid them.
- // NOTE: This heuristic does not work with proportional glyphs.
- // NOTE: This heuristic does not work when a ZWJ sequence is partially combined.
- // E.g. If system has a glyph for "A ZWJ B" and not for "A ZWJ B ZWJ C", this heuristic
- // returns true for "A ZWJ B ZWJ C".
- float sumWidth = 0;
- int i = 0;
- while (i < length) {
- int charCount = Character.charCount(string.codePointAt(i));
- sumWidth += paint.measureText(string, i, i + charCount);
- i += charCount;
- }
- if (width >= sumWidth) {
- return false;
- }
- }
-
- if (width != missingGlyphWidth) {
- // If the widths are different then its not tofu
- return true;
- }
-
- // If the widths are the same, lets check the bounds. The chance of them being
- // different chars with the same bounds is extremely small
- final Pair<Rect, Rect> rects = obtainEmptyRects();
- paint.getTextBounds(TOFU_STRING, 0, TOFU_STRING.length(), rects.first);
- paint.getTextBounds(string, 0, length, rects.second);
- return !rects.first.equals(rects.second);
- }
-
- private static Pair<Rect, Rect> obtainEmptyRects() {
- Pair<Rect, Rect> rects = sRectThreadLocal.get();
- if (rects == null) {
- rects = new Pair<>(new Rect(), new Rect());
- sRectThreadLocal.set(rects);
- } else {
- rects.first.setEmpty();
- rects.second.setEmpty();
- }
- return rects;
- }
-}
diff --git a/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java b/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
index 3c17fda..f810253 100644
--- a/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
+++ b/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
@@ -21,58 +21,12 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Build;
-import android.support.annotation.RequiresApi;
import android.view.View;
/**
* Helper for accessing features in {@link android.accessibilityservice.AccessibilityService}.
*/
public final class AccessibilityServiceInfoCompat {
-
- static class AccessibilityServiceInfoBaseImpl {
- public int getCapabilities(AccessibilityServiceInfo info) {
- if (getCanRetrieveWindowContent(info)) {
- return CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
- }
- return 0;
- }
-
- public String loadDescription(AccessibilityServiceInfo info, PackageManager pm) {
- return null;
- }
- }
-
- @RequiresApi(16)
- static class AccessibilityServiceInfoApi16Impl extends AccessibilityServiceInfoBaseImpl {
- @Override
- public String loadDescription(AccessibilityServiceInfo info, PackageManager pm) {
- return info.loadDescription(pm);
- }
- }
-
- @RequiresApi(18)
- static class AccessibilityServiceInfoApi18Impl
- extends AccessibilityServiceInfoApi16Impl {
- @Override
- public int getCapabilities(AccessibilityServiceInfo info) {
- return info.getCapabilities();
- }
- }
-
- static {
- if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2
- IMPL = new AccessibilityServiceInfoApi18Impl();
- } else if (Build.VERSION.SDK_INT >= 16) { // JB
- IMPL = new AccessibilityServiceInfoApi16Impl();
- } else {
- IMPL = new AccessibilityServiceInfoBaseImpl();
- }
- }
-
- // Capabilities
-
- private static final AccessibilityServiceInfoBaseImpl IMPL;
-
/**
* Capability: This accessibility service can retrieve the active window content.
*/
@@ -330,7 +284,12 @@
*/
public static String loadDescription(
AccessibilityServiceInfo info, PackageManager packageManager) {
- return IMPL.loadDescription(info, packageManager);
+ if (Build.VERSION.SDK_INT >= 16) {
+ return info.loadDescription(packageManager);
+ } else {
+ //noinspection deprecation
+ return info.getDescription();
+ }
}
/**
@@ -412,7 +371,15 @@
* @see #CAPABILITY_CAN_FILTER_KEY_EVENTS
*/
public static int getCapabilities(AccessibilityServiceInfo info) {
- return IMPL.getCapabilities(info);
+ if (Build.VERSION.SDK_INT >= 18) {
+ return info.getCapabilities();
+ } else {
+ //noinspection deprecation
+ if (info.getCanRetrieveWindowContent()) {
+ return CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
+ }
+ return 0;
+ }
}
/**
diff --git a/compat/java/android/support/v4/content/ParallelExecutorCompat.java b/compat/java/android/support/v4/content/ParallelExecutorCompat.java
deleted file mode 100644
index 4dc4168..0000000
--- a/compat/java/android/support/v4/content/ParallelExecutorCompat.java
+++ /dev/null
@@ -1,40 +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 android.support.v4.content;
-
-import android.os.AsyncTask;
-
-import java.util.concurrent.Executor;
-
-/**
- * Helper for accessing a shared parallel Executor instance.
- *
- * @deprecated Use {@link AsyncTask} directly.
- */
-@Deprecated
-public final class ParallelExecutorCompat {
-
- /**
- * @deprecated Use {@link AsyncTask#THREAD_POOL_EXECUTOR} directly.
- */
- @Deprecated
- public static Executor getParallelExecutor() {
- return AsyncTask.THREAD_POOL_EXECUTOR;
- }
-
- private ParallelExecutorCompat() {}
-}
diff --git a/compat/java/android/support/v4/content/res/ConfigurationHelper.java b/compat/java/android/support/v4/content/res/ConfigurationHelper.java
index a337671..39b0e4a 100644
--- a/compat/java/android/support/v4/content/res/ConfigurationHelper.java
+++ b/compat/java/android/support/v4/content/res/ConfigurationHelper.java
@@ -31,45 +31,6 @@
}
/**
- * Returns the current height of the available screen space, in dp units.
- *
- * <p>Uses {@code Configuration.screenHeightDp} when available, otherwise an approximation
- * is computed and returned.</p>
- *
- * @deprecated Use {@link Configuration#screenHeightDp} directly.
- */
- @Deprecated
- public static int getScreenHeightDp(@NonNull Resources resources) {
- return resources.getConfiguration().screenHeightDp;
- }
-
- /**
- * Returns the current width of the available screen space, in dp units.
- *
- * <p>Uses {@code Configuration.screenWidthDp} when available, otherwise an approximation
- * is computed and returned.</p>
- *
- * @deprecated Use {@link Configuration#screenWidthDp} directly.
- */
- @Deprecated
- public static int getScreenWidthDp(@NonNull Resources resources) {
- return resources.getConfiguration().screenWidthDp;
- }
-
- /**
- * Returns The smallest screen size an application will see in normal operation, in dp units.
- *
- * <p>Uses {@code Configuration.smallestScreenWidthDp} when available, otherwise an
- * approximation is computed and returned.</p>
- *
- * @deprecated Use {@link Configuration#smallestScreenWidthDp} directly.
- */
- @Deprecated
- public static int getSmallestScreenWidthDp(@NonNull Resources resources) {
- return resources.getConfiguration().smallestScreenWidthDp;
- }
-
- /**
* Returns the target screen density being rendered to.
*
* <p>Uses {@code Configuration.densityDpi} when available, otherwise an approximation
diff --git a/compat/java/android/support/v4/graphics/PaintCompat.java b/compat/java/android/support/v4/graphics/PaintCompat.java
index 95eee0c..b651fe6 100644
--- a/compat/java/android/support/v4/graphics/PaintCompat.java
+++ b/compat/java/android/support/v4/graphics/PaintCompat.java
@@ -17,13 +17,20 @@
package android.support.v4.graphics;
import android.graphics.Paint;
+import android.graphics.Rect;
import android.os.Build;
import android.support.annotation.NonNull;
+import android.support.v4.util.Pair;
/**
* Helper for accessing features in {@link Paint}.
*/
public final class PaintCompat {
+ // U+DFFFD which is very end of unassigned plane.
+ private static final String TOFU_STRING = "\uDB3F\uDFFD";
+ private static final String EM_STRING = "m";
+
+ private static final ThreadLocal<Pair<Rect, Rect>> sRectThreadLocal = new ThreadLocal<>();
/**
* Determine whether the typeface set on the paint has a glyph supporting the
@@ -37,7 +44,75 @@
if (Build.VERSION.SDK_INT >= 23) {
return paint.hasGlyph(string);
}
- return PaintCompatApi14.hasGlyph(paint, string);
+ final int length = string.length();
+
+ if (length == 1 && Character.isWhitespace(string.charAt(0))) {
+ // measureText + getTextBounds skips whitespace so we need to special case it here
+ return true;
+ }
+
+ final float missingGlyphWidth = paint.measureText(TOFU_STRING);
+ final float emGlyphWidth = paint.measureText(EM_STRING);
+
+ final float width = paint.measureText(string);
+
+ if (width == 0f) {
+ // If the string width is 0, it can't be rendered
+ return false;
+ }
+
+ if (string.codePointCount(0, string.length()) > 1) {
+ // Heuristic to detect fallback glyphs for ligatures like flags and ZWJ sequences
+ // Return false if string is rendered too widely
+ if (width > 2 * emGlyphWidth) {
+ return false;
+ }
+
+ // Heuristic to detect fallback glyphs for ligatures like flags and ZWJ sequences (2).
+ // If width is greater than or equal to the sum of width of each code point, it is very
+ // likely that the system is using fallback fonts to draw {@code string} in two or more
+ // glyphs instead of a single ligature glyph. (hasGlyph returns false in this case.)
+ // False detections are possible (the ligature glyph may happen to have the same width
+ // as the sum width), but there are no good way to avoid them.
+ // NOTE: This heuristic does not work with proportional glyphs.
+ // NOTE: This heuristic does not work when a ZWJ sequence is partially combined.
+ // E.g. If system has a glyph for "A ZWJ B" and not for "A ZWJ B ZWJ C", this heuristic
+ // returns true for "A ZWJ B ZWJ C".
+ float sumWidth = 0;
+ int i = 0;
+ while (i < length) {
+ int charCount = Character.charCount(string.codePointAt(i));
+ sumWidth += paint.measureText(string, i, i + charCount);
+ i += charCount;
+ }
+ if (width >= sumWidth) {
+ return false;
+ }
+ }
+
+ if (width != missingGlyphWidth) {
+ // If the widths are different then its not tofu
+ return true;
+ }
+
+ // If the widths are the same, lets check the bounds. The chance of them being
+ // different chars with the same bounds is extremely small
+ final Pair<Rect, Rect> rects = obtainEmptyRects();
+ paint.getTextBounds(TOFU_STRING, 0, TOFU_STRING.length(), rects.first);
+ paint.getTextBounds(string, 0, length, rects.second);
+ return !rects.first.equals(rects.second);
+ }
+
+ private static Pair<Rect, Rect> obtainEmptyRects() {
+ Pair<Rect, Rect> rects = sRectThreadLocal.get();
+ if (rects == null) {
+ rects = new Pair<>(new Rect(), new Rect());
+ sRectThreadLocal.set(rects);
+ } else {
+ rects.first.setEmpty();
+ rects.second.setEmpty();
+ }
+ return rects;
}
private PaintCompat() {}
diff --git a/compat/java/android/support/v4/net/ConnectivityManagerCompat.java b/compat/java/android/support/v4/net/ConnectivityManagerCompat.java
index 5a39586..cdddb68 100644
--- a/compat/java/android/support/v4/net/ConnectivityManagerCompat.java
+++ b/compat/java/android/support/v4/net/ConnectivityManagerCompat.java
@@ -32,7 +32,6 @@
import android.net.NetworkInfo;
import android.os.Build;
import android.support.annotation.IntDef;
-import android.support.annotation.RequiresApi;
import android.support.annotation.RequiresPermission;
import android.support.annotation.RestrictTo;
@@ -43,14 +42,6 @@
* Helper for accessing features in {@link ConnectivityManager}.
*/
public final class ConnectivityManagerCompat {
-
- interface ConnectivityManagerCompatImpl {
- boolean isActiveNetworkMetered(ConnectivityManager cm);
-
- @RestrictBackgroundStatus
- int getRestrictBackgroundStatus(ConnectivityManager cm);
- }
-
/** @hide */
@RestrictTo(LIBRARY_GROUP)
@Retention(RetentionPolicy.SOURCE)
@@ -85,10 +76,25 @@
*/
public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3;
- static class ConnectivityManagerCompatBaseImpl implements ConnectivityManagerCompatImpl {
- @SuppressWarnings("deprecation")
- @Override
- public boolean isActiveNetworkMetered(ConnectivityManager cm) {
+ /**
+ * Returns if the currently active data network is metered. A network is
+ * classified as metered when the user is sensitive to heavy data usage on
+ * that connection due to monetary costs, data limitations or
+ * battery/performance issues. You should check this before doing large
+ * data transfers, and warn the user or delay the operation until another
+ * network is available.
+ * <p>This method requires the caller to hold the permission
+ * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
+ *
+ * @return {@code true} if large transfers should be avoided, otherwise
+ * {@code false}.
+ */
+ @SuppressWarnings("deprecation")
+ @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
+ public static boolean isActiveNetworkMetered(ConnectivityManager cm) {
+ if (Build.VERSION.SDK_INT >= 16) {
+ return cm.isActiveNetworkMetered();
+ } else {
final NetworkInfo info = cm.getActiveNetworkInfo();
if (info == null) {
// err on side of caution
@@ -113,58 +119,6 @@
return true;
}
}
-
- @Override
- public int getRestrictBackgroundStatus(ConnectivityManager cm) {
- return RESTRICT_BACKGROUND_STATUS_ENABLED;
- }
- }
-
- @RequiresApi(16)
- static class ConnectivityManagerCompatApi16Impl extends ConnectivityManagerCompatBaseImpl {
- @Override
- public boolean isActiveNetworkMetered(ConnectivityManager cm) {
- return cm.isActiveNetworkMetered();
- }
- }
-
- @RequiresApi(24)
- static class ConnectivityManagerCompatApi24Impl extends ConnectivityManagerCompatApi16Impl {
- @Override
- public int getRestrictBackgroundStatus(ConnectivityManager cm) {
- //noinspection ResourceType
- return cm.getRestrictBackgroundStatus();
- }
- }
-
- private static final ConnectivityManagerCompatImpl IMPL;
-
- static {
- if (Build.VERSION.SDK_INT >= 24) {
- IMPL = new ConnectivityManagerCompatApi24Impl();
- } else if (Build.VERSION.SDK_INT >= 16) {
- IMPL = new ConnectivityManagerCompatApi16Impl();
- } else {
- IMPL = new ConnectivityManagerCompatBaseImpl();
- }
- }
-
- /**
- * Returns if the currently active data network is metered. A network is
- * classified as metered when the user is sensitive to heavy data usage on
- * that connection due to monetary costs, data limitations or
- * battery/performance issues. You should check this before doing large
- * data transfers, and warn the user or delay the operation until another
- * network is available.
- * <p>This method requires the caller to hold the permission
- * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
- *
- * @return {@code true} if large transfers should be avoided, otherwise
- * {@code false}.
- */
- @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
- public static boolean isActiveNetworkMetered(ConnectivityManager cm) {
- return IMPL.isActiveNetworkMetered(cm);
}
/**
@@ -174,6 +128,7 @@
* potentially-stale value from
* {@link ConnectivityManager#EXTRA_NETWORK_INFO}. May be {@code null}.
*/
+ @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
public static NetworkInfo getNetworkInfoFromBroadcast(ConnectivityManager cm, Intent intent) {
final NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (info != null) {
@@ -193,7 +148,11 @@
*/
@RestrictBackgroundStatus
public static int getRestrictBackgroundStatus(ConnectivityManager cm) {
- return IMPL.getRestrictBackgroundStatus(cm);
+ if (Build.VERSION.SDK_INT >= 24) {
+ return cm.getRestrictBackgroundStatus();
+ } else {
+ return RESTRICT_BACKGROUND_STATUS_ENABLED;
+ }
}
private ConnectivityManagerCompat() {}
diff --git a/compat/java/android/support/v4/text/TextUtilsCompat.java b/compat/java/android/support/v4/text/TextUtilsCompat.java
index 2a77e7e..ee58ab0 100644
--- a/compat/java/android/support/v4/text/TextUtilsCompat.java
+++ b/compat/java/android/support/v4/text/TextUtilsCompat.java
@@ -29,13 +29,7 @@
* Backwards compatible version of {@link TextUtils}.
*/
public final class TextUtilsCompat {
- /**
- * @deprecated This was never meant to be public. You can create your own empty {@code Locale}
- * by calling the constructor with empty strings.
- */
- @Deprecated
- public static final Locale ROOT = new Locale("", "");
-
+ private static final Locale ROOT = new Locale("", "");
private static final String ARAB_SCRIPT_SUBTAG = "Arab";
private static final String HEBR_SCRIPT_SUBTAG = "Hebr";
@@ -132,6 +126,5 @@
}
}
-
private TextUtilsCompat() {}
}
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
index 924b482..cb77fd5 100644
--- a/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
@@ -17,7 +17,6 @@
package android.support.v4.view.accessibility;
import android.os.Build;
-import android.support.annotation.RequiresApi;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityRecord;
@@ -25,79 +24,6 @@
* Helper for accessing features in {@link AccessibilityEvent}.
*/
public final class AccessibilityEventCompat {
-
- static class AccessibilityEventCompatBaseImpl {
- public void setContentChangeTypes(AccessibilityEvent event, int types) {
- }
-
- public int getContentChangeTypes(AccessibilityEvent event) {
- return 0;
- }
-
- public void setMovementGranularity(AccessibilityEvent event, int granularity) {
- }
-
- public int getMovementGranularity(AccessibilityEvent event) {
- return 0;
- }
-
- public void setAction(AccessibilityEvent event, int action) {
- }
-
- public int getAction(AccessibilityEvent event) {
- return 0;
- }
- }
-
- @RequiresApi(16)
- static class AccessibilityEventCompatApi16Impl extends AccessibilityEventCompatBaseImpl {
- @Override
- public void setMovementGranularity(AccessibilityEvent event, int granularity) {
- event.setMovementGranularity(granularity);
- }
-
- @Override
- public int getMovementGranularity(AccessibilityEvent event) {
- return event.getMovementGranularity();
- }
-
- @Override
- public void setAction(AccessibilityEvent event, int action) {
- event.setAction(action);
- }
-
- @Override
- public int getAction(AccessibilityEvent event) {
- return event.getAction();
- }
- }
-
- @RequiresApi(19)
- static class AccessibilityEventCompatApi19Impl extends AccessibilityEventCompatApi16Impl {
-
- @Override
- public void setContentChangeTypes(AccessibilityEvent event, int types) {
- event.setContentChangeTypes(types);
- }
-
- @Override
- public int getContentChangeTypes(AccessibilityEvent event) {
- return event.getContentChangeTypes();
- }
- }
-
- private static final AccessibilityEventCompatBaseImpl IMPL;
-
- static {
- if (Build.VERSION.SDK_INT >= 19) { // KitKat
- IMPL = new AccessibilityEventCompatApi19Impl();
- } else if (Build.VERSION.SDK_INT >= 16) { // Jellybean
- IMPL = new AccessibilityEventCompatApi16Impl();
- } else {
- IMPL = new AccessibilityEventCompatBaseImpl();
- }
- }
-
/**
* Represents the event of a hover enter over a {@link android.view.View}.
* @deprecated Use {@link AccessibilityEvent#TYPE_VIEW_HOVER_ENTER} directly.
@@ -335,7 +261,9 @@
* @see #getContentChangeTypes(AccessibilityEvent)
*/
public static void setContentChangeTypes(AccessibilityEvent event, int changeTypes) {
- IMPL.setContentChangeTypes(event, changeTypes);
+ if (Build.VERSION.SDK_INT >= 19) {
+ event.setContentChangeTypes(changeTypes);
+ }
}
/**
@@ -352,7 +280,11 @@
* </ul>
*/
public static int getContentChangeTypes(AccessibilityEvent event) {
- return IMPL.getContentChangeTypes(event);
+ if (Build.VERSION.SDK_INT >= 19) {
+ return event.getContentChangeTypes();
+ } else {
+ return 0;
+ }
}
/**
@@ -363,7 +295,9 @@
* @throws IllegalStateException If called from an AccessibilityService.
*/
public void setMovementGranularity(AccessibilityEvent event, int granularity) {
- IMPL.setMovementGranularity(event, granularity);
+ if (Build.VERSION.SDK_INT >= 16) {
+ event.setMovementGranularity(granularity);
+ }
}
/**
@@ -372,7 +306,11 @@
* @return The granularity.
*/
public int getMovementGranularity(AccessibilityEvent event) {
- return IMPL.getMovementGranularity(event);
+ if (Build.VERSION.SDK_INT >= 16) {
+ return event.getMovementGranularity();
+ } else {
+ return 0;
+ }
}
/**
@@ -393,7 +331,9 @@
* @see AccessibilityNodeInfoCompat#performAction(int)
*/
public void setAction(AccessibilityEvent event, int action) {
- IMPL.setAction(event, action);
+ if (Build.VERSION.SDK_INT >= 16) {
+ event.setAction(action);
+ }
}
/**
@@ -402,6 +342,10 @@
* @return The action.
*/
public int getAction(AccessibilityEvent event) {
- return IMPL.getAction(event);
+ if (Build.VERSION.SDK_INT >= 16) {
+ return event.getAction();
+ } else {
+ return 0;
+ }
}
}
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
index 395af49..ce5d024 100644
--- a/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
@@ -19,7 +19,6 @@
import android.os.Build;
import android.os.Parcelable;
import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityRecord;
@@ -30,69 +29,6 @@
* Helper for accessing {@link AccessibilityRecord}.
*/
public class AccessibilityRecordCompat {
-
- static class AccessibilityRecordCompatBaseImpl {
- public int getMaxScrollX(AccessibilityRecord record) {
- return 0;
- }
-
- public int getMaxScrollY(AccessibilityRecord record) {
- return 0;
- }
-
- public void setMaxScrollX(AccessibilityRecord record, int maxScrollX) {
- }
-
- public void setMaxScrollY(AccessibilityRecord record, int maxScrollY) {
- }
-
- public void setSource(AccessibilityRecord record, View root, int virtualDescendantId) {
- }
- }
-
- @RequiresApi(15)
- static class AccessibilityRecordCompatApi15Impl extends AccessibilityRecordCompatBaseImpl {
- @Override
- public int getMaxScrollX(AccessibilityRecord record) {
- return record.getMaxScrollX();
- }
-
- @Override
- public int getMaxScrollY(AccessibilityRecord record) {
- return record.getMaxScrollY();
- }
-
- @Override
- public void setMaxScrollX(AccessibilityRecord record, int maxScrollX) {
- record.setMaxScrollX(maxScrollX);
- }
-
- @Override
- public void setMaxScrollY(AccessibilityRecord record, int maxScrollY) {
- record.setMaxScrollY(maxScrollY);
- }
- }
-
- @RequiresApi(16)
- static class AccessibilityRecordCompatApi16Impl extends AccessibilityRecordCompatApi15Impl {
- @Override
- public void setSource(AccessibilityRecord record, View root, int virtualDescendantId) {
- record.setSource(root, virtualDescendantId);
- }
- }
-
- static {
- if (Build.VERSION.SDK_INT >= 16) { // JellyBean
- IMPL = new AccessibilityRecordCompatApi16Impl();
- } else if (Build.VERSION.SDK_INT >= 15) { // ICS MR1
- IMPL = new AccessibilityRecordCompatApi15Impl();
- } else {
- IMPL = new AccessibilityRecordCompatBaseImpl();
- }
- }
-
- private static final AccessibilityRecordCompatBaseImpl IMPL;
-
private final AccessibilityRecord mRecord;
/**
@@ -197,7 +133,9 @@
*/
public static void setSource(@NonNull AccessibilityRecord record, View root,
int virtualDescendantId) {
- IMPL.setSource(record, root, virtualDescendantId);
+ if (Build.VERSION.SDK_INT >= 16) {
+ record.setSource(root, virtualDescendantId);
+ }
}
/**
@@ -538,7 +476,11 @@
* @return The max scroll.
*/
public static int getMaxScrollX(AccessibilityRecord record) {
- return IMPL.getMaxScrollX(record);
+ if (Build.VERSION.SDK_INT >= 15) {
+ return record.getMaxScrollX();
+ } else {
+ return 0;
+ }
}
/**
@@ -560,7 +502,9 @@
* @param maxScrollX The max scroll.
*/
public static void setMaxScrollX(AccessibilityRecord record, int maxScrollX) {
- IMPL.setMaxScrollX(record, maxScrollX);
+ if (Build.VERSION.SDK_INT >= 15) {
+ record.setMaxScrollX(maxScrollX);
+ }
}
/**
@@ -582,7 +526,11 @@
* @return The max scroll.
*/
public static int getMaxScrollY(AccessibilityRecord record) {
- return IMPL.getMaxScrollY(record);
+ if (Build.VERSION.SDK_INT >= 15) {
+ return record.getMaxScrollY();
+ } else {
+ return 0;
+ }
}
/**
@@ -604,7 +552,9 @@
* @param maxScrollY The max scroll.
*/
public static void setMaxScrollY(AccessibilityRecord record, int maxScrollY) {
- IMPL.setMaxScrollY(record, maxScrollY);
+ if (Build.VERSION.SDK_INT >= 15) {
+ record.setMaxScrollY(maxScrollY);
+ }
}
/**
diff --git a/compat/java/android/support/v4/widget/TextViewCompat.java b/compat/java/android/support/v4/widget/TextViewCompat.java
index d7ca21e..5654c3e 100644
--- a/compat/java/android/support/v4/widget/TextViewCompat.java
+++ b/compat/java/android/support/v4/widget/TextViewCompat.java
@@ -44,13 +44,13 @@
/**
* The TextView does not auto-size text (default).
*/
- public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0;
+ public static final int AUTO_SIZE_TEXT_TYPE_NONE = TextView.AUTO_SIZE_TEXT_TYPE_NONE;
/**
* The TextView scales text size both horizontally and vertically to fit within the
* container.
*/
- public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1;
+ public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM;
/** @hide */
@RestrictTo(LIBRARY_GROUP)
diff --git a/compat/lint-baseline.xml b/compat/lint-baseline.xml
index 3919eba..e961253 100644
--- a/compat/lint-baseline.xml
+++ b/compat/lint-baseline.xml
@@ -1,37 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<issues format="4" by="lint 3.0.0-alpha7">
- <issue
- id="MissingPermission"
- message="Missing permissions required by ConnectivityManager.getActiveNetworkInfo: android.permission.ACCESS_NETWORK_STATE"
- errorLine1=" final NetworkInfo info = cm.getActiveNetworkInfo();"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/net/ConnectivityManagerCompat.java"
- line="92"
- column="38"/>
- </issue>
-
- <issue
- id="MissingPermission"
- message="Missing permissions required by ConnectivityManager.isActiveNetworkMetered: android.permission.ACCESS_NETWORK_STATE"
- errorLine1=" return cm.isActiveNetworkMetered();"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/net/ConnectivityManagerCompat.java"
- line="127"
- column="20"/>
- </issue>
-
- <issue
- id="MissingPermission"
- message="Missing permissions required by ConnectivityManager.getNetworkInfo: android.permission.ACCESS_NETWORK_STATE"
- errorLine1=" return cm.getNetworkInfo(info.getType());"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/net/ConnectivityManagerCompat.java"
- line="180"
- column="20"/>
- </issue>
-
</issues>
diff --git a/content/Android.mk b/content/Android.mk
new file mode 100644
index 0000000..eff8215
--- /dev/null
+++ b/content/Android.mk
@@ -0,0 +1,29 @@
+# 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_MODULE := android-support-content
+LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_SHARED_ANDROID_LIBRARIES := \
+ android-support-compat \
+ android-support-annotations
+LOCAL_JAR_EXCLUDE_FILES := none
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/content/AndroidManifest.xml b/content/AndroidManifest.xml
new file mode 100644
index 0000000..8304504
--- /dev/null
+++ b/content/AndroidManifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="android.support.content">
+ <uses-sdk android:minSdkVersion="14" />
+ <application>
+ <meta-data android:name="android.support.content.VERSION"
+ android:value="${support-version}" />
+ </application>
+</manifest>
diff --git a/content/api/0.0.0.txt b/content/api/0.0.0.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/content/api/0.0.0.txt
diff --git a/content/api/27.0.0-SNAPSHOT.txt b/content/api/27.0.0-SNAPSHOT.txt
new file mode 100644
index 0000000..e0b4fa3
--- /dev/null
+++ b/content/api/27.0.0-SNAPSHOT.txt
@@ -0,0 +1,54 @@
+package android.support.content {
+
+ public class ContentPager {
+ ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner);
+ ctor public ContentPager(android.content.ContentResolver, android.support.content.ContentPager.QueryRunner, int);
+ method public static android.os.Bundle createArgs(int, int);
+ method public android.support.content.Query query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal, android.support.content.ContentPager.ContentCallback);
+ method public void reset();
+ field public static final int CURSOR_DISPOSITION_COPIED = 1; // 0x1
+ field public static final int CURSOR_DISPOSITION_PAGED = 2; // 0x2
+ field public static final int CURSOR_DISPOSITION_REPAGED = 3; // 0x3
+ field public static final int CURSOR_DISPOSITION_WRAPPED = 4; // 0x4
+ field public static final java.lang.String EXTRA_HONORED_ARGS = "android.content.extra.HONORED_ARGS";
+ field public static final java.lang.String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+ field public static final java.lang.String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+ field public static final java.lang.String EXTRA_TOTAL_COUNT = "android.content.extra.TOTAL_COUNT";
+ field public static final java.lang.String QUERY_ARG_LIMIT = "android:query-arg-limit";
+ field public static final java.lang.String QUERY_ARG_OFFSET = "android:query-arg-offset";
+ }
+
+ public static abstract interface ContentPager.ContentCallback {
+ method public abstract void onCursorReady(android.support.content.Query, android.database.Cursor);
+ }
+
+ public static abstract class ContentPager.CursorDisposition implements java.lang.annotation.Annotation {
+ }
+
+ public static abstract interface ContentPager.QueryRunner {
+ method public abstract void cancel(android.support.content.Query);
+ method public abstract boolean isRunning(android.support.content.Query);
+ method public abstract void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+ }
+
+ public static abstract interface ContentPager.QueryRunner.Callback {
+ method public abstract void onQueryFinished(android.support.content.Query, android.database.Cursor);
+ method public abstract android.database.Cursor runQueryInBackground(android.support.content.Query);
+ }
+
+ public final class LoaderQueryRunner implements android.support.content.ContentPager.QueryRunner {
+ ctor public LoaderQueryRunner(android.content.Context, android.app.LoaderManager);
+ method public void cancel(android.support.content.Query);
+ method public boolean isRunning(android.support.content.Query);
+ method public void query(android.support.content.Query, android.support.content.ContentPager.QueryRunner.Callback);
+ }
+
+ public final class Query {
+ method public int getId();
+ method public int getLimit();
+ method public int getOffset();
+ method public android.net.Uri getUri();
+ }
+
+}
+
diff --git a/content/api/removed.txt b/content/api/removed.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/content/api/removed.txt
diff --git a/content/build.gradle b/content/build.gradle
new file mode 100644
index 0000000..93ef5f8
--- /dev/null
+++ b/content/build.gradle
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+apply plugin: android.support.SupportLibraryPlugin
+
+dependencies {
+ api project(':support-annotations')
+ api project(':support-compat')
+
+ androidTestImplementation libs.junit
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+}
+
+android {
+ defaultConfig {
+ minSdkVersion 14
+ }
+
+ sourceSets {
+ main.java.srcDirs = ['src']
+ main.res.srcDir 'res'
+ }
+}
+
+supportLibrary {
+ name 'Android Support Content'
+ inceptionYear '2017'
+ description 'Library providing support for paging across content exposed via a ContentProvider. Use of this library allows a client to avoid expensive interprocess "cursor window swaps" on the UI thread.'
+}
diff --git a/content/lint-baseline.xml b/content/lint-baseline.xml
new file mode 100644
index 0000000..e961253
--- /dev/null
+++ b/content/lint-baseline.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="4" by="lint 3.0.0-alpha7">
+
+</issues>
diff --git a/content/src/android/support/content/ContentPager.java b/content/src/android/support/content/ContentPager.java
new file mode 100644
index 0000000..71cb832
--- /dev/null
+++ b/content/src/android/support/content/ContentPager.java
@@ -0,0 +1,707 @@
+/*
+ * 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 android.support.content;
+
+import static android.support.v4.util.Preconditions.checkArgument;
+import static android.support.v4.util.Preconditions.checkState;
+
+import android.content.ContentResolver;
+import android.database.CrossProcessCursor;
+import android.database.Cursor;
+import android.database.CursorWindow;
+import android.database.CursorWrapper;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.os.OperationCanceledException;
+import android.support.annotation.GuardedBy;
+import android.support.annotation.IntDef;
+import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresPermission;
+import android.support.annotation.VisibleForTesting;
+import android.support.annotation.WorkerThread;
+import android.support.v4.util.LruCache;
+import android.util.Log;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * {@link ContentPager} provides support for loading "paged" data on a background thread
+ * using the {@link ContentResolver} framework. This provides an effective compatibility
+ * layer for the ContentResolver "paging" support added in Android O. Those Android O changes,
+ * like this class, help reduce or eliminate the occurrence of expensive inter-process
+ * shared memory operations (aka "CursorWindow swaps") happening on the UI thread when
+ * working with remote providers.
+ *
+ * <p>The list of terms used in this document:
+ *
+ * <ol>"The provider" is a {@link android.content.ContentProvider} supplying data identified
+ * by a specific content {@link Uri}. A provider is the source of data, and for the sake of
+ * this documents, the provider resides in a remote process.
+
+ * <ol>"supports paging" A provider supports paging when it returns a pre-paged {@link Cursor}
+ * that honors the paging contract. See @link ContentResolver#QUERY_ARG_OFFSET} and
+ * {@link ContentResolver#QUERY_ARG_LIMIT} for details on the contract.
+
+ * <ol>"CursorWindow swaps" The process by which new data is loaded into a shared memory
+ * via a CursorWindow instance. This is a prominent contributor to UI jank in applications
+ * that use Cursor as backing data for UI elements like {@code RecyclerView}.
+ *
+ * <p><b>Details</b>
+ *
+ * <p>Data will be loaded from a content uri in one of two ways, depending on the runtime
+ * environment and if the provider supports paging.
+ *
+ * <li>If the system is Android O and greater and the provider supports paging, the Cursor
+ * will be returned, effectively unmodified, to a {@link ContentCallback} supplied by
+ * your application.
+ *
+ * <li>If the system is less than Android O or the provider does not support paging, the
+ * loader will fetch an unpaged Cursor from the provider. The unpaged Cursor will be held
+ * by the ContentPager, and data will be copied into a new cursor in a background thread.
+ * The new cursor will be returned to a {@link ContentCallback} supplied by your application.
+ *
+ * <p>In either cases, when an application employs this library it can generally assume
+ * that there will be no CursorWindow swap. But picking the right limit for records can
+ * help reduce or even eliminate some heavy lifting done to guard against swaps.
+ *
+ * <p>How do we avoid that entirely?
+ *
+ * <p><b>Picking a reasonable item limit</b>
+ *
+ * <p>Authors are encouraged to experiment with limits using real data and the widest column
+ * projection they'll use in their app. The total number of records that will fit into shared
+ * memory varies depending on multiple factors.
+ *
+ * <li>The number of columns being requested in the cursor projection. Limit the number
+ * of columns, to reduce the size of each row.
+ * <li>The size of the data in each column.
+ * <li>the Cursor type.
+ *
+ * <p>If the cursor is running in-process, there may be no need for paging. Depending on
+ * the Cursor implementation chosen there may be no shared memory/CursorWindow in use.
+ * NOTE: If the provider is running in your process, you should implement paging support
+ * inorder to make your app run fast and to consume the fewest resources possible.
+ *
+ * <p>In common cases where there is a low volume (in the hundreds) of records in the dataset
+ * being queried, all of the data should easily fit in shared memory. A debugger can be handy
+ * to understand with greater accuracy how many results can fit in shared memory. Inspect
+ * the Cursor object returned from a call to
+ * {@link ContentResolver#query(Uri, String[], String, String[], String)}. If the underlying
+ * type is a {@link android.database.CrossProcessCursor} or
+ * {@link android.database.AbstractWindowedCursor} it'll have a {@link CursorWindow} field.
+ * Check {@link CursorWindow#getNumRows()}. If getNumRows returns less than
+ * {@link Cursor#getCount}, then you've found something close to the max rows that'll
+ * fit in a page. If the data in row is expected to be relatively stable in size, reduce
+ * row count by 15-20% to get a reasonable max page size.
+ *
+ * <p><b>What if the limit I guessed was wrong?</b>
+
+ * <p>The library includes safeguards that protect against situations where an author
+ * specifies a record limit that exceeds the number of rows accessible without a CursorWindow swap.
+ * In such a circumstance, the Cursor will be adapted to report a count ({Cursor#getCount})
+ * that reflects only records available without CursorWindow swap. But this involves
+ * extra work that can be eliminated with a correct limit.
+ *
+ * <p>In addition to adjusted coujnt, {@link #EXTRA_SUGGESTED_LIMIT} will be included
+ * in cursor extras. When EXTRA_SUGGESTED_LIMIT is present in extras, the client should
+ * strongly consider using this value as the limit for subsequent queries as doing so should
+ * help avoid the ned to wrap pre-paged cursors.
+ *
+ * <p><b>Lifecycle and cleanup</b>
+ *
+ * <p>Cursors resulting from queries are owned by the requesting client. So they must be closed
+ * by the client at the appropriate time.
+ *
+ * <p>However, the library retains an internal cache of content that needs to be cleaned up.
+ * In order to cleanup, call {@link #reset()}.
+ *
+ * <p><b>Projections</b>
+ *
+ * <p>Note that projection is ignored when determining the identity of a query. When
+ * adding or removing projection, clients should call {@link #reset()} to clear
+ * cached data.
+ */
+public class ContentPager {
+
+ @VisibleForTesting
+ static final String CURSOR_DISPOSITION = "android.support.v7.widget.CURSOR_DISPOSITION";
+
+ @IntDef(value = {
+ ContentPager.CURSOR_DISPOSITION_COPIED,
+ ContentPager.CURSOR_DISPOSITION_PAGED,
+ ContentPager.CURSOR_DISPOSITION_REPAGED,
+ ContentPager.CURSOR_DISPOSITION_WRAPPED
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface CursorDisposition {}
+
+ /** The cursor size exceeded page size. A new cursor with with page data was created. */
+ public static final int CURSOR_DISPOSITION_COPIED = 1;
+
+ /**
+ * The cursor was provider paged.
+ */
+ public static final int CURSOR_DISPOSITION_PAGED = 2;
+
+ /** The cursor was pre-paged, but total size was larger than CursorWindow size. */
+ public static final int CURSOR_DISPOSITION_REPAGED = 3;
+
+ /**
+ * The cursor was not pre-paged, but total size was smaller than page size.
+ * Cursor wrapped to supply data in extras only.
+ */
+ public static final int CURSOR_DISPOSITION_WRAPPED = 4;
+
+ /** @see ContentResolver#EXTRA_HONORED_ARGS */
+ public static final String EXTRA_HONORED_ARGS = ContentResolver.EXTRA_HONORED_ARGS;
+
+ /** @see ContentResolver#EXTRA_TOTAL_COUNT */
+ public static final String EXTRA_TOTAL_COUNT = ContentResolver.EXTRA_TOTAL_COUNT;
+
+ /** @see ContentResolver#QUERY_ARG_OFFSET */
+ public static final String QUERY_ARG_OFFSET = ContentResolver.QUERY_ARG_OFFSET;
+
+ /** @see ContentResolver#QUERY_ARG_LIMIT */
+ public static final String QUERY_ARG_LIMIT = ContentResolver.QUERY_ARG_LIMIT;
+
+ /** Denotes the requested limit, if the limit was not-honored. */
+ public static final String EXTRA_REQUESTED_LIMIT = "android-support:extra-ignored-limit";
+
+ /** Specifies a limit likely to fit in CursorWindow limit. */
+ public static final String EXTRA_SUGGESTED_LIMIT = "android-support:extra-suggested-limit";
+
+ private static final boolean DEBUG = false;
+ private static final String TAG = "ContentPager";
+ private static final int DEFAULT_CURSOR_CACHE_SIZE = 1;
+
+ private final QueryRunner mQueryRunner;
+ private final QueryRunner.Callback mQueryCallback;
+ private final ContentResolver mResolver;
+ private final Object mContentLock = new Object();
+ private final @GuardedBy("mContentLock") Set<Query> mActiveQueries = new HashSet<>();
+ private final @GuardedBy("mContentLock") CursorCache mCursorCache;
+
+ private final Stats mStats = new Stats();
+
+ /**
+ * Creates a new ContentPager with a default cursor cache size of 1.
+ */
+ public ContentPager(ContentResolver resolver, QueryRunner queryRunner) {
+ this(resolver, queryRunner, DEFAULT_CURSOR_CACHE_SIZE);
+ }
+
+ /**
+ * Creates a new ContentPager.
+ *
+ * @param cursorCacheSize Specifies the size of the unpaged cursor cache. If you will
+ * only be querying a single content Uri, 1 is sufficient. If you wish to use
+ * a single ContentPager for queries against several independent Uris this number
+ * should be increased to reflect that. Remember that adding or modifying a
+ * query argument creates a new Uri.
+ * @param resolver The content resolver to use when performing queries.
+ * @param queryRunner The query running to use. This provides a means of executing
+ * queries on a background thread.
+ */
+ public ContentPager(
+ @NonNull ContentResolver resolver,
+ @NonNull QueryRunner queryRunner,
+ int cursorCacheSize) {
+
+ checkArgument(resolver != null, "'resolver' argument cannot be null.");
+ checkArgument(queryRunner != null, "'queryRunner' argument cannot be null.");
+ checkArgument(cursorCacheSize > 0, "'cursorCacheSize' argument must be greater than 0.");
+
+ mResolver = resolver;
+ mQueryRunner = queryRunner;
+ mQueryCallback = new QueryRunner.Callback() {
+
+ @WorkerThread
+ @Override
+ public @Nullable Cursor runQueryInBackground(Query query) {
+ return loadContentInBackground(query);
+ }
+
+ @MainThread
+ @Override
+ public void onQueryFinished(Query query, Cursor cursor) {
+ ContentPager.this.onCursorReady(query, cursor);
+ }
+ };
+
+ mCursorCache = new CursorCache(cursorCacheSize);
+ }
+
+ /**
+ * Initiates loading of content.
+ * For details on all params but callback, see
+ * {@link ContentResolver#query(Uri, String[], Bundle, CancellationSignal)}.
+ *
+ * @param uri The URI, using the content:// scheme, for the content to retrieve.
+ * @param projection A list of which columns to return. Passing null will return
+ * the default project as determined by the provider. This can be inefficient,
+ * so it is best to supply a projection.
+ * @param queryArgs A Bundle containing any arguments to the query.
+ * @param cancellationSignal A signal to cancel the operation in progress, or null if none.
+ * If the operation is canceled, then {@link OperationCanceledException} will be thrown
+ * when the query is executed.
+ * @param callback The callback that will receive the query results.
+ *
+ * @return A Query object describing the query.
+ */
+ @MainThread
+ public @NonNull Query query(
+ @NonNull @RequiresPermission.Read Uri uri,
+ @Nullable String[] projection,
+ @NonNull Bundle queryArgs,
+ @Nullable CancellationSignal cancellationSignal,
+ @NonNull ContentCallback callback) {
+
+ checkArgument(uri != null, "'uri' argument cannot be null.");
+ checkArgument(queryArgs != null, "'queryArgs' argument cannot be null.");
+ checkArgument(callback != null, "'callback' argument cannot be null.");
+
+ Query query = new Query(uri, projection, queryArgs, cancellationSignal, callback);
+
+ if (DEBUG) Log.d(TAG, "Handling query: " + query);
+
+ if (!mQueryRunner.isRunning(query)) {
+ synchronized (mContentLock) {
+ mActiveQueries.add(query);
+ }
+ mQueryRunner.query(query, mQueryCallback);
+ }
+
+ return query;
+ }
+
+ /**
+ * Clears any cached data. This method must be called in order to cleanup runtime state
+ * (like cursors).
+ */
+ @MainThread
+ public void reset() {
+ synchronized (mContentLock) {
+ if (DEBUG) Log.d(TAG, "Clearing un-paged cursor cache.");
+ mCursorCache.evictAll();
+
+ for (Query query : mActiveQueries) {
+ if (DEBUG) Log.d(TAG, "Canceling running query: " + query);
+ mQueryRunner.cancel(query);
+ query.cancel();
+ }
+
+ mActiveQueries.clear();
+ }
+ }
+
+ @WorkerThread
+ private Cursor loadContentInBackground(Query query) {
+ if (DEBUG) Log.v(TAG, "Loading cursor for query: " + query);
+ mStats.increment(Stats.EXTRA_TOTAL_QUERIES);
+
+ synchronized (mContentLock) {
+ // We have a existing unpaged-cursor for this query. Instead of running a new query
+ // via ContentResolver, we'll just copy results from that.
+ // This is the "compat" behavior.
+ if (mCursorCache.hasEntry(query.getUri())) {
+ if (DEBUG) Log.d(TAG, "Found unpaged results in cache for: " + query);
+ return createPagedCursor(query);
+ }
+ }
+
+ // We don't have an unpaged query, so we run the query using ContentResolver.
+ // It may be that no query for this URI has ever been run, so no unpaged
+ // results have been saved. Or, it may be the the provider supports paging
+ // directly, and is returning a pre-paged result set...so no unpaged
+ // cursor will ever be set.
+ Cursor cursor = query.run(mResolver);
+ mStats.increment(Stats.EXTRA_RESOLVED_QUERIES);
+
+ // for the window. If so, communicate the overflow back to the client.
+ if (cursor == null) {
+ Log.e(TAG, "Query resulted in null cursor. " + query);
+ return null;
+ }
+
+ if (isProviderPaged(cursor)) {
+ return processProviderPagedCursor(query, cursor);
+ }
+
+ // Cache the unpaged results so we can generate pages from them on subsequent queries.
+ synchronized (mContentLock) {
+ mCursorCache.put(query.getUri(), cursor);
+ return createPagedCursor(query);
+ }
+ }
+
+ @WorkerThread
+ @GuardedBy("mContentLock")
+ private Cursor createPagedCursor(Query query) {
+ Cursor unpaged = mCursorCache.get(query.getUri());
+ checkState(unpaged != null, "No un-paged cursor in cache, or can't retrieve it.");
+
+ mStats.increment(Stats.EXTRA_COMPAT_PAGED);
+
+ if (DEBUG) Log.d(TAG, "Synthesizing cursor for page: " + query);
+ int count = Math.min(query.getLimit(), unpaged.getCount());
+
+ // don't wander off the end of the cursor.
+ if (query.getOffset() + query.getLimit() > unpaged.getCount()) {
+ count = unpaged.getCount() % query.getLimit();
+ }
+
+ if (DEBUG) Log.d(TAG, "Cursor count: " + count);
+
+ Cursor result = null;
+ // If the cursor isn't advertising support for paging, but is in-fact smaller
+ // than the page size requested, we just decorate the cursor with paging data,
+ // and wrap it without copy.
+ if (query.getOffset() == 0 && unpaged.getCount() < query.getLimit()) {
+ result = new CursorView(
+ unpaged, unpaged.getCount(), CURSOR_DISPOSITION_WRAPPED);
+ } else {
+ // This creates an in-memory copy of the data that fits the requested page.
+ // ContentObservers registered on InMemoryCursor are directly registered
+ // on the unpaged cursor.
+ result = new InMemoryCursor(
+ unpaged, query.getOffset(), count, CURSOR_DISPOSITION_COPIED);
+ }
+
+ mStats.includeStats(result.getExtras());
+ return result;
+ }
+
+ @WorkerThread
+ private @Nullable Cursor processProviderPagedCursor(Query query, Cursor cursor) {
+
+ CursorWindow window = getWindow(cursor);
+ int windowSize = cursor.getCount();
+ if (window != null) {
+ if (DEBUG) Log.d(TAG, "Returning provider-paged cursor.");
+ windowSize = window.getNumRows();
+ }
+
+ // Android O paging APIs are *all* about avoiding CursorWindow swaps,
+ // because the swaps need to happen on the UI thread in jank-inducing ways.
+ // But, the APIs don't *guarantee* that no window-swapping will happen
+ // when traversing a cursor.
+ //
+ // Here in the support lib, we can guarantee there is no window swapping
+ // by detecting mismatches between requested sizes and window sizes.
+ // When a mismatch is detected we can return a cursor that reports
+ // a size bounded by its CursorWindow size, and includes a suggested
+ // size to use for subsequent queries.
+
+ if (DEBUG) Log.d(TAG, "Cursor window overflow detected. Returning re-paged cursor.");
+
+ int disposition = (cursor.getCount() <= windowSize)
+ ? CURSOR_DISPOSITION_PAGED
+ : CURSOR_DISPOSITION_REPAGED;
+
+ Cursor result = new CursorView(cursor, windowSize, disposition);
+ Bundle extras = result.getExtras();
+
+ // If the orig cursor reports a size larger than the window, suggest a better limit.
+ if (cursor.getCount() > windowSize) {
+ extras.putInt(EXTRA_REQUESTED_LIMIT, query.getLimit());
+ extras.putInt(EXTRA_SUGGESTED_LIMIT, (int) (windowSize * .85));
+ }
+
+ mStats.increment(Stats.EXTRA_PROVIDER_PAGED);
+ mStats.includeStats(extras);
+ return result;
+ }
+
+ private CursorWindow getWindow(Cursor cursor) {
+ if (cursor instanceof CursorWrapper) {
+ return getWindow(((CursorWrapper) cursor).getWrappedCursor());
+ }
+ if (cursor instanceof CrossProcessCursor) {
+ return ((CrossProcessCursor) cursor).getWindow();
+ }
+ // TODO: Any other ways we can find/access windows?
+ return null;
+ }
+
+ // Called in the foreground when the cursor is ready for the client.
+ @MainThread
+ private void onCursorReady(Query query, Cursor cursor) {
+ synchronized (mContentLock) {
+ mActiveQueries.remove(query);
+ }
+
+ query.getCallback().onCursorReady(query, cursor);
+ }
+
+ /**
+ * @return true if the cursor extras contains all of the signs of being paged.
+ * Technically we could also check SDK version since facilities for paging
+ * were added in SDK 26, but if it looks like a duck and talks like a duck
+ * itsa duck (especially if it helps with testing).
+ */
+ @WorkerThread
+ private boolean isProviderPaged(Cursor cursor) {
+ Bundle extras = cursor.getExtras();
+ extras = extras != null ? extras : Bundle.EMPTY;
+ String[] honoredArgs = extras.getStringArray(EXTRA_HONORED_ARGS);
+
+ return (extras.containsKey(EXTRA_TOTAL_COUNT)
+ && honoredArgs != null
+ && contains(honoredArgs, QUERY_ARG_OFFSET)
+ && contains(honoredArgs, QUERY_ARG_LIMIT));
+ }
+
+ private static <T> boolean contains(T[] array, T value) {
+ for (T element : array) {
+ if (value.equals(element)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @return Bundle populated with existing extras (if any) as well as
+ * all usefule paging related extras.
+ */
+ static Bundle buildExtras(
+ @Nullable Bundle extras, int recordCount, @CursorDisposition int cursorDisposition) {
+
+ if (extras == null || extras == Bundle.EMPTY) {
+ extras = new Bundle();
+ } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ extras = extras.deepCopy();
+ }
+ // else we modify cursor extras directly, cuz that's our only choice.
+
+ extras.putInt(CURSOR_DISPOSITION, cursorDisposition);
+ if (!extras.containsKey(EXTRA_TOTAL_COUNT)) {
+ extras.putInt(EXTRA_TOTAL_COUNT, recordCount);
+ }
+
+ if (!extras.containsKey(EXTRA_HONORED_ARGS)) {
+ extras.putStringArray(EXTRA_HONORED_ARGS, new String[]{
+ ContentPager.QUERY_ARG_OFFSET,
+ ContentPager.QUERY_ARG_LIMIT
+ });
+ }
+
+ return extras;
+ }
+
+ /**
+ * Builds a Bundle with offset and limit values suitable for with
+ * {@link #query(Uri, String[], Bundle, CancellationSignal, ContentCallback)}.
+ *
+ * @param offset must be greater than or equal to 0.
+ * @param limit can be any value. Only values greater than or equal to 0 are respected.
+ * If any other value results in no upper limit on results. Note that a well
+ * behaved client should probably supply a reasonable limit. See class
+ * documentation on how to select a limit.
+ *
+ * @return Mutable Bundle pre-populated with offset and limits vales.
+ */
+ public static @NonNull Bundle createArgs(int offset, int limit) {
+ checkArgument(offset >= 0);
+ Bundle args = new Bundle();
+ args.putInt(ContentPager.QUERY_ARG_OFFSET, offset);
+ args.putInt(ContentPager.QUERY_ARG_LIMIT, limit);
+ return args;
+ }
+
+ /**
+ * Callback by which a client receives results of a query.
+ */
+ public interface ContentCallback {
+ /**
+ * Called when paged cursor is ready. Null, if query failed.
+ * @param query The query having been executed.
+ * @param cursor the query results. Null if query couldn't be executed.
+ */
+ @MainThread
+ void onCursorReady(@NonNull Query query, @Nullable Cursor cursor);
+ }
+
+ /**
+ * Provides support for adding extras to a cursor. This is necessary
+ * as a cursor returning an extras Bundle that is either Bundle.EMPTY
+ * or null, cannot have information added to the cursor. On SDKs earlier
+ * than M, there is no facility to replace the Bundle.
+ */
+ private static final class CursorView extends CursorWrapper {
+ private final Bundle mExtras;
+ private final int mSize;
+
+ CursorView(Cursor delegate, int size, @CursorDisposition int disposition) {
+ super(delegate);
+ mSize = size;
+
+ mExtras = buildExtras(delegate.getExtras(), delegate.getCount(), disposition);
+ }
+
+ @Override
+ public int getCount() {
+ return mSize;
+ }
+
+ @Override
+ public Bundle getExtras() {
+ return mExtras;
+ }
+ }
+
+ /**
+ * LruCache holding at most {@code maxSize} cursors. Once evicted a cursor
+ * is immediately closed. The only cursor's held in this cache are
+ * unpaged results. For this purpose the cache is keyed by the URI,
+ * not the entire query. Cursors that are pre-paged by the provider
+ * are never cached.
+ */
+ private static final class CursorCache extends LruCache<Uri, Cursor> {
+ CursorCache(int maxSize) {
+ super(maxSize);
+ }
+
+ @WorkerThread
+ @Override
+ protected void entryRemoved(
+ boolean evicted, Uri uri, Cursor oldCursor, Cursor newCursor) {
+ if (!oldCursor.isClosed()) {
+ oldCursor.close();
+ }
+ }
+
+ /** @return true if an entry is present for the Uri. */
+ @WorkerThread
+ @GuardedBy("mContentLock")
+ boolean hasEntry(Uri uri) {
+ return get(uri) != null;
+ }
+ }
+
+ /**
+ * Implementations of this interface provide the mechanism
+ * for execution of queries off the UI thread.
+ */
+ public interface QueryRunner {
+ /**
+ * Execute a query.
+ * @param query The query that will be run. This value should be handed
+ * back to the callback when ready to run in the background.
+ * @param callback The callback that should be called to both execute
+ * the query (in the background) and to receive the results
+ * (in the foreground).
+ */
+ void query(@NonNull Query query, @NonNull Callback callback);
+
+ /**
+ * @param query The query in question.
+ * @return true if the query is already running.
+ */
+ boolean isRunning(@NonNull Query query);
+
+ /**
+ * Attempt to cancel a (presumably) running query.
+ * @param query The query in question.
+ */
+ void cancel(@NonNull Query query);
+
+ /**
+ * Callback that receives a cursor once a query as been executed on the Runner.
+ */
+ interface Callback {
+ /**
+ * Method called on background thread where actual query is executed. This is provided
+ * by ContentPager.
+ * @param query The query to be executed.
+ */
+ @Nullable Cursor runQueryInBackground(@NonNull Query query);
+
+ /**
+ * Called on main thread when query has completed.
+ * @param query The completed query.
+ * @param cursor The results in Cursor form. Null if not successfully completed.
+ */
+ void onQueryFinished(@NonNull Query query, @Nullable Cursor cursor);
+ }
+ }
+
+ static final class Stats {
+
+ /** Identifes the total number of queries handled by ContentPager. */
+ static final String EXTRA_TOTAL_QUERIES = "android-support:extra-total-queries";
+
+ /** Identifes the number of queries handled by content resolver. */
+ static final String EXTRA_RESOLVED_QUERIES = "android-support:extra-resolved-queries";
+
+ /** Identifes the number of pages produced by way of copying. */
+ static final String EXTRA_COMPAT_PAGED = "android-support:extra-compat-paged";
+
+ /** Identifes the number of pages produced directly by a page-supporting provider. */
+ static final String EXTRA_PROVIDER_PAGED = "android-support:extra-provider-paged";
+
+ // simple stats objects tracking paged result handling.
+ private int mTotalQueries;
+ private int mResolvedQueries;
+ private int mCompatPaged;
+ private int mProviderPaged;
+
+ private void increment(String prop) {
+ switch (prop) {
+ case EXTRA_TOTAL_QUERIES:
+ ++mTotalQueries;
+ break;
+
+ case EXTRA_RESOLVED_QUERIES:
+ ++mResolvedQueries;
+ break;
+
+ case EXTRA_COMPAT_PAGED:
+ ++mCompatPaged;
+ break;
+
+ case EXTRA_PROVIDER_PAGED:
+ ++mProviderPaged;
+ break;
+
+ default:
+ throw new IllegalArgumentException("Unknown property: " + prop);
+ }
+ }
+
+ private void reset() {
+ mTotalQueries = 0;
+ mResolvedQueries = 0;
+ mCompatPaged = 0;
+ mProviderPaged = 0;
+ }
+
+ void includeStats(Bundle bundle) {
+ bundle.putInt(EXTRA_TOTAL_QUERIES, mTotalQueries);
+ bundle.putInt(EXTRA_RESOLVED_QUERIES, mResolvedQueries);
+ bundle.putInt(EXTRA_COMPAT_PAGED, mCompatPaged);
+ bundle.putInt(EXTRA_PROVIDER_PAGED, mProviderPaged);
+ }
+ }
+}
diff --git a/content/src/android/support/content/InMemoryCursor.java b/content/src/android/support/content/InMemoryCursor.java
new file mode 100644
index 0000000..097709a
--- /dev/null
+++ b/content/src/android/support/content/InMemoryCursor.java
@@ -0,0 +1,279 @@
+/*
+ * 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 android.support.content;
+
+import static android.support.v4.util.Preconditions.checkArgument;
+
+import android.database.AbstractCursor;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.database.CursorIndexOutOfBoundsException;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.RestrictTo;
+
+/**
+ * A {@link Cursor} implementation that stores information in-memory, in a type-safe fashion.
+ * Values are stored, when possible, as primitives to avoid the need for the autoboxing (as is
+ * necessary when working with MatrixCursor).
+ *
+ * <p>Unlike {@link android.database.MatrixCursor}, this cursor is not mutable at runtime.
+ * It exists solely as a destination for data copied by {@link ContentPager} from a source
+ * Cursor when a page is being synthesized. It is not anticipated at this time that this
+ * will be useful outside of this package. As such it is immutable once constructed.
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+final class InMemoryCursor extends AbstractCursor {
+
+ private static final int NUM_TYPES = 5;
+
+ private final String[] mColumnNames;
+ private final int mRowCount;
+
+ // This is an index of column, by type. Maps back to position
+ // in native array.
+ // E.g. if we have columns typed like [string, int, int, string, int, int]
+ // the values in this index will be:
+ // mTypedColumnIndex[string][0] == 0
+ // mTypedColumnIndex[int][1] == 0
+ // mTypedColumnIndex[int][2] == 1
+ // mTypedColumnIndex[string][3] == 1
+ // mTypedColumnIndex[int][4] == 2
+ // mTypedColumnIndex[int][4] == 3
+ // This allows us to calculate the number of cells by type in a row
+ // which, in turn, allows us to calculate the size of the primitive storage arrays.
+ // We also use this information to lookup a particular typed value given
+ // the row offset and column offset.
+ private final int[][] mTypedColumnIndex;
+
+ // simple index to column to type.
+ private final int[] mColumnType;
+
+ // count of number of columns by type.
+ private final int[] mColumnTypeCount;
+
+ private final Bundle mExtras;
+
+ private final ObserverRelay mObserverRelay;
+
+ // Row data decomposed by type.
+ private long[] mLongs;
+ private double[] mDoubles;
+ private byte[][] mBlobs;
+ private String[] mStrings;
+
+ /**
+ * @param cursor source of data to copy. Ownership is reserved to the called, meaning
+ * we won't ever close it.
+ */
+ InMemoryCursor(Cursor cursor, int offset, int length, int disposition) {
+ checkArgument(offset < cursor.getCount());
+
+ // NOTE: The cursor could simply be saved to a field, but we choose to wrap
+ // in a dedicated relay class to avoid hanging directly onto a reference
+ // to the cursor...so future authors are not enticed to think there's
+ // a live link between the delegate cursor and this cursor.
+ mObserverRelay = new ObserverRelay(cursor);
+
+ mColumnNames = cursor.getColumnNames();
+ mRowCount = Math.min(length, cursor.getCount() - offset);
+ int numColumns = cursor.getColumnCount();
+
+ mExtras = ContentPager.buildExtras(cursor.getExtras(), cursor.getCount(), disposition);
+
+ mColumnType = new int[numColumns];
+ mTypedColumnIndex = new int[NUM_TYPES][numColumns];
+ mColumnTypeCount = new int[NUM_TYPES];
+
+ if (!cursor.moveToFirst()) {
+ throw new RuntimeException("Can't position cursor to first row.");
+ }
+
+ for (int col = 0; col < numColumns; col++) {
+ int type = cursor.getType(col);
+ mColumnType[col] = type;
+ mTypedColumnIndex[type][col] = mColumnTypeCount[type]++;
+ }
+
+ mLongs = new long[mRowCount * mColumnTypeCount[FIELD_TYPE_INTEGER]];
+ mDoubles = new double[mRowCount * mColumnTypeCount[FIELD_TYPE_FLOAT]];
+ mBlobs = new byte[mRowCount * mColumnTypeCount[FIELD_TYPE_BLOB]][];
+ mStrings = new String[mRowCount * mColumnTypeCount[FIELD_TYPE_STRING]];
+
+ for (int row = 0; row < mRowCount; row++) {
+ if (!cursor.moveToPosition(offset + row)) {
+ throw new RuntimeException("Unable to position cursor.");
+ }
+
+ // Now copy data from the row into primitive arrays.
+ for (int col = 0; col < mColumnType.length; col++) {
+ int type = mColumnType[col];
+ int position = getCellPosition(row, col, type);
+
+ switch(type) {
+ case FIELD_TYPE_NULL:
+ throw new UnsupportedOperationException("Not implemented.");
+ case FIELD_TYPE_INTEGER:
+ mLongs[position] = cursor.getLong(col);
+ break;
+ case FIELD_TYPE_FLOAT:
+ mDoubles[position] = cursor.getDouble(col);
+ break;
+ case FIELD_TYPE_BLOB:
+ mBlobs[position] = cursor.getBlob(col);
+ break;
+ case FIELD_TYPE_STRING:
+ mStrings[position] = cursor.getString(col);
+ break;
+ }
+ }
+ }
+ }
+
+ @Override
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ // Returns the "cell" position for a specific row+column+type.
+ private int getCellPosition(int row, int col, int type) {
+ return (row * mColumnTypeCount[type]) + mTypedColumnIndex[type][col];
+ }
+
+ @Override
+ public int getCount() {
+ return mRowCount;
+ }
+
+ @Override
+ public String[] getColumnNames() {
+ return mColumnNames;
+ }
+
+ @Override
+ public short getShort(int column) {
+ checkValidColumn(column);
+ checkValidPosition();
+ return (short) mLongs[getCellPosition(getPosition(), column, FIELD_TYPE_INTEGER)];
+ }
+
+ @Override
+ public int getInt(int column) {
+ checkValidColumn(column);
+ checkValidPosition();
+ return (int) mLongs[getCellPosition(getPosition(), column, FIELD_TYPE_INTEGER)];
+ }
+
+ @Override
+ public long getLong(int column) {
+ checkValidColumn(column);
+ checkValidPosition();
+ return mLongs[getCellPosition(getPosition(), column, FIELD_TYPE_INTEGER)];
+ }
+
+ @Override
+ public float getFloat(int column) {
+ checkValidColumn(column);
+ checkValidPosition();
+ return (float) mDoubles[getCellPosition(getPosition(), column, FIELD_TYPE_FLOAT)];
+ }
+
+ @Override
+ public double getDouble(int column) {
+ checkValidColumn(column);
+ checkValidPosition();
+ return mDoubles[getCellPosition(getPosition(), column, FIELD_TYPE_FLOAT)];
+ }
+
+ @Override
+ public byte[] getBlob(int column) {
+ checkValidColumn(column);
+ checkValidPosition();
+ return mBlobs[getCellPosition(getPosition(), column, FIELD_TYPE_BLOB)];
+ }
+
+ @Override
+ public String getString(int column) {
+ checkValidColumn(column);
+ checkValidPosition();
+ return mStrings[getCellPosition(getPosition(), column, FIELD_TYPE_STRING)];
+ }
+
+ @Override
+ public int getType(int column) {
+ checkValidColumn(column);
+ return mColumnType[column];
+ }
+
+ @Override
+ public boolean isNull(int column) {
+ checkValidColumn(column);
+ switch (mColumnType[column]) {
+ case FIELD_TYPE_STRING:
+ return getString(column) != null;
+ case FIELD_TYPE_BLOB:
+ return getBlob(column) != null;
+ default:
+ return false;
+ }
+ }
+
+ private void checkValidPosition() {
+ if (getPosition() < 0) {
+ throw new CursorIndexOutOfBoundsException("Before first row.");
+ }
+ if (getPosition() >= mRowCount) {
+ throw new CursorIndexOutOfBoundsException("After last row.");
+ }
+ }
+
+ private void checkValidColumn(int column) {
+ if (column < 0 || column >= mColumnNames.length) {
+ throw new CursorIndexOutOfBoundsException(
+ "Requested column: " + column + ", # of columns: " + mColumnNames.length);
+ }
+ }
+
+ @Override
+ public void registerContentObserver(ContentObserver observer) {
+ mObserverRelay.registerContentObserver(observer);
+ }
+
+ @Override
+ public void unregisterContentObserver(ContentObserver observer) {
+ mObserverRelay.unregisterContentObserver(observer);
+ }
+
+ private static class ObserverRelay extends ContentObserver {
+ private final Cursor mCursor;
+
+ ObserverRelay(Cursor cursor) {
+ super(new Handler(Looper.getMainLooper()));
+ mCursor = cursor;
+ }
+
+ void registerContentObserver(ContentObserver observer) {
+ mCursor.registerContentObserver(observer);
+ }
+
+ void unregisterContentObserver(ContentObserver observer) {
+ mCursor.unregisterContentObserver(observer);
+ }
+ }
+}
diff --git a/content/src/android/support/content/LoaderQueryRunner.java b/content/src/android/support/content/LoaderQueryRunner.java
new file mode 100644
index 0000000..800307b
--- /dev/null
+++ b/content/src/android/support/content/LoaderQueryRunner.java
@@ -0,0 +1,95 @@
+/*
+ * 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 android.support.content;
+
+import static android.support.v4.util.Preconditions.checkArgument;
+
+import android.app.LoaderManager;
+import android.app.LoaderManager.LoaderCallbacks;
+import android.content.Context;
+import android.content.Loader;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+/**
+ * A {@link ContentPager.QueryRunner} that executes queries using a {@link LoaderManager}.
+ * Use this when preparing {@link ContentPager} to run in an Activity or Fragment scope.
+ */
+public final class LoaderQueryRunner implements ContentPager.QueryRunner {
+
+ private static final boolean DEBUG = false;
+ private static final String TAG = "LoaderQueryRunner";
+ private static final String CONTENT_URI_KEY = "contentUri";
+
+ private final Context mContext;
+ private final LoaderManager mLoaderMgr;
+
+ public LoaderQueryRunner(@NonNull Context context, @NonNull LoaderManager loaderMgr) {
+ mContext = context;
+ mLoaderMgr = loaderMgr;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked") // feels spurious. But can't commit line :80 w/o this.
+ public void query(final @NonNull Query query, @NonNull final Callback callback) {
+ if (DEBUG) Log.d(TAG, "Handling query: " + query);
+
+ LoaderCallbacks callbacks = new LoaderCallbacks<Cursor>() {
+ @Override
+ public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
+ if (DEBUG) Log.i(TAG, "Loading results for query: " + query);
+ checkArgument(id == query.getId(), "Id doesn't match query id.");
+
+ return new android.content.CursorLoader(mContext) {
+ @Override
+ public Cursor loadInBackground() {
+ return callback.runQueryInBackground(query);
+ }
+ };
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
+ if (DEBUG) Log.i(TAG, "Finished loading: " + query);
+ mLoaderMgr.destroyLoader(query.getId());
+ callback.onQueryFinished(query, cursor);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ if (DEBUG) Log.w(TAG, "Ignoring loader reset for query: " + query);
+ }
+ };
+
+ mLoaderMgr.restartLoader(query.getId(), null, callbacks);
+ }
+
+ @Override
+ public boolean isRunning(@NonNull Query query) {
+ Loader<Cursor> loader = mLoaderMgr.getLoader(query.getId());
+ return loader != null && loader.isStarted();
+ // Hmm, when exactly would the loader not be started? Does it imply that it will
+ // be starting at some point?
+ }
+
+ @Override
+ public void cancel(@NonNull Query query) {
+ mLoaderMgr.destroyLoader(query.getId());
+ }
+}
diff --git a/content/src/android/support/content/Query.java b/content/src/android/support/content/Query.java
new file mode 100644
index 0000000..a5d1ee5
--- /dev/null
+++ b/content/src/android/support/content/Query.java
@@ -0,0 +1,194 @@
+/*
+ * 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 android.support.content;
+
+import static android.support.v4.util.Preconditions.checkArgument;
+
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+import android.util.Log;
+
+import java.util.Arrays;
+
+/**
+ * Encapsulates information related to calling {@link ContentResolver#query},
+ * including the logic determining the best query method to call.
+ */
+public final class Query {
+
+ private static final boolean DEBUG = true;
+ private static final String TAG = "Query";
+
+ private final Uri mUri;
+ private final @Nullable String[] mProjection;
+ private final Bundle mQueryArgs;
+
+ private final int mId;
+ private final int mOffset;
+ private final int mLimit;
+
+ private final CancellationSignal mCancellationSignal;
+ private final ContentPager.ContentCallback mCallback;
+
+ @VisibleForTesting
+ Query(
+ @NonNull Uri uri,
+ @Nullable String[] projection,
+ @NonNull Bundle args,
+ @Nullable CancellationSignal cancellationSignal,
+ @NonNull ContentPager.ContentCallback callback) {
+
+ checkArgument(uri != null);
+ checkArgument(args != null);
+ checkArgument(callback != null);
+
+ this.mUri = uri;
+ this.mProjection = projection;
+ this.mQueryArgs = args;
+ this.mCancellationSignal = cancellationSignal;
+ this.mCallback = callback;
+
+ this.mOffset = args.getInt(ContentPager.QUERY_ARG_OFFSET, -1);
+ this.mLimit = args.getInt(ContentPager.QUERY_ARG_LIMIT, -1);
+
+ // NOTE: We omit mProjection and other details from ID. If a client wishes
+ // to request a page with a different mProjection or sorting, they should
+ // wait for first request to finish. Same goes for mCallback.
+ this.mId = uri.hashCode() << 16 | (mOffset | (mLimit << 8));
+
+ checkArgument(mOffset >= 0); // mOffset must be set, mLimit is optional.
+ }
+
+ /**
+ * @return the id for this query. Derived from Uri as well as paging arguments.
+ */
+ public int getId() {
+ return mId;
+ }
+
+ /**
+ * @return the Uri.
+ */
+ public @NonNull Uri getUri() {
+ return mUri;
+ }
+
+ /**
+ * @return the offset.
+ */
+ public int getOffset() {
+ return mOffset;
+ }
+
+ /**
+ * @return the limit.
+ */
+ public int getLimit() {
+ return mLimit;
+ }
+
+ @NonNull ContentPager.ContentCallback getCallback() {
+ return mCallback;
+ }
+
+ @Nullable Cursor run(@NonNull ContentResolver resolver) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ return resolver.query(
+ mUri,
+ mProjection,
+ mQueryArgs,
+ mCancellationSignal);
+ }
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ if (DEBUG) Log.d(TAG, "Falling back to pre-O query method.");
+ return resolver.query(
+ mUri,
+ mProjection,
+ null,
+ null,
+ null,
+ mCancellationSignal);
+ }
+
+ if (DEBUG) Log.d(TAG, "Falling back to pre-jellybean query method.");
+ return resolver.query(
+ mUri,
+ mProjection,
+ null,
+ null,
+ null);
+ }
+
+ void cancel() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ if (mCancellationSignal != null && !mCancellationSignal.isCanceled()) {
+ if (DEBUG) {
+ Log.d(TAG, "Attemping to cancel query provider processings: " + this);
+ }
+ mCancellationSignal.cancel();
+ }
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+
+ if (this == obj) {
+ return true;
+ }
+
+ if (!(obj instanceof Query)) {
+ return false;
+ }
+
+ Query other = (Query) obj;
+
+ return mId == other.mId
+ && mUri.equals(other.mUri)
+ && mOffset == other.mOffset
+ && mLimit == other.mLimit;
+ }
+
+ @Override
+ public int hashCode() {
+ return getId();
+ }
+
+ @Override
+ public String toString() {
+ return "Query{"
+ + "id:" + mId
+ + " uri:" + mUri
+ + " projection:" + Arrays.toString(mProjection)
+ + " offset:" + mOffset
+ + " limit:" + mLimit
+ + " cancellationSignal:" + mCancellationSignal
+ + " callback:" + mCallback
+ + "}";
+ }
+}
diff --git a/content/tests/AndroidManifest.xml b/content/tests/AndroidManifest.xml
new file mode 100644
index 0000000..4a815c4
--- /dev/null
+++ b/content/tests/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="android.support.content.test">
+ <uses-sdk android:minSdkVersion="14" />
+
+ <application android:supportsRtl="true">
+ <activity android:name="android.support.content.TestActivity" />
+
+ <!-- Must be run in-process for some of the test instrumentation to work correctly -->
+ <provider android:name="android.support.content.TestContentProvider"
+ android:authorities="android.support.content.test.testpagingprovider"
+ android:multiprocess="false" />
+ </application>
+</manifest>
diff --git a/content/tests/NO_DOCS b/content/tests/NO_DOCS
new file mode 100644
index 0000000..4dad694
--- /dev/null
+++ b/content/tests/NO_DOCS
@@ -0,0 +1,17 @@
+# 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.
+
+Having this file, named NO_DOCS, in a directory will prevent
+Android javadocs from being generated for java files under
+the directory. This is especially useful for test projects.
diff --git a/content/tests/java/android/support/content/ContentPagerTest.java b/content/tests/java/android/support/content/ContentPagerTest.java
new file mode 100644
index 0000000..fd682c6
--- /dev/null
+++ b/content/tests/java/android/support/content/ContentPagerTest.java
@@ -0,0 +1,431 @@
+/*
+ * 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 android.support.content;
+
+import static android.support.content.ContentPager.createArgs;
+import static android.support.content.TestContentProvider.PAGED_URI;
+import static android.support.content.TestContentProvider.PAGED_WINDOWED_URI;
+import static android.support.content.TestContentProvider.UNPAGED_URI;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertFalse;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.Nullable;
+import android.support.content.ContentPager.ContentCallback;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class ContentPagerTest {
+
+ private ContentResolver mResolver;
+ private TestQueryRunner mRunner;
+ private TestContentCallback mCallback;
+ private ContentPager mPager;
+
+ @Rule
+ public ActivityTestRule<Activity> mActivityRule = new ActivityTestRule(TestActivity.class);
+
+ @Before
+ public void setUp() {
+ mRunner = new TestQueryRunner();
+ mResolver = mActivityRule.getActivity().getContentResolver();
+ mCallback = new TestContentCallback();
+ mPager = new ContentPager(mResolver, mRunner);
+ }
+
+ @Test
+ public void testRelaysProviderPagedResults() throws Throwable {
+ int offset = 0;
+ int limit = 10;
+
+ // NOTE: Paging on Android O is accompolished by way of ContentResolver#query that
+ // accepts a Bundle. That means on older platforms we either have to cook up
+ // a special way of paging that doesn't use the bundle (that's what we do here)
+ // or we simply skip testing how we deal with provider paged results.
+ Uri uriWithTestPagingData = TestContentProvider.forcePagingSpec(PAGED_URI, offset, limit);
+
+ Query query = mPager.query(
+ uriWithTestPagingData,
+ null,
+ createArgs(offset, limit),
+ null,
+ mCallback);
+
+ mCallback.assertNumPagesLoaded(1);
+ mCallback.assertPageLoaded(query);
+ Cursor cursor = mCallback.getCursor(query);
+ Bundle extras = cursor.getExtras();
+
+ assertExpectedRecords(cursor, query.getOffset());
+
+ assertEquals(
+ ContentPager.CURSOR_DISPOSITION_PAGED,
+ extras.getInt(ContentPager.CURSOR_DISPOSITION, -1));
+
+ assertEquals(
+ TestContentProvider.DEFAULT_RECORD_COUNT,
+ extras.getInt(ContentResolver.EXTRA_TOTAL_COUNT));
+
+ assertHasHonoredArgs(
+ extras,
+ ContentResolver.QUERY_ARG_LIMIT,
+ ContentResolver.QUERY_ARG_OFFSET);
+
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_PROVIDER_PAGED));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+ }
+
+ @Test
+ public void testLimitsPagedResultsToWindowSize() throws Throwable {
+ int offset = 0;
+ int limit = 10;
+
+ // NOTE: Paging on Android O is accompolished by way of ContentResolver#query that
+ // accepts a Bundle. That means on older platforms we either have to cook up
+ // a special way of paging that doesn't use the bundle (that's what we do here)
+ // or we simply skip testing how we deal with provider paged results.
+ Uri uriWithTestPagingData = TestContentProvider.forcePagingSpec(
+ PAGED_WINDOWED_URI, offset, limit);
+
+ Query query = mPager.query(
+ uriWithTestPagingData,
+ null,
+ createArgs(offset, limit),
+ null,
+ mCallback);
+
+ mCallback.assertNumPagesLoaded(1);
+ mCallback.assertPageLoaded(query);
+ Cursor cursor = mCallback.getCursor(query);
+ Bundle extras = cursor.getExtras();
+
+ assertExpectedRecords(cursor, query.getOffset());
+
+ assertEquals(
+ ContentPager.CURSOR_DISPOSITION_REPAGED,
+ extras.getInt(ContentPager.CURSOR_DISPOSITION, -1));
+
+ assertEquals(
+ TestContentProvider.DEFAULT_RECORD_COUNT,
+ extras.getInt(ContentResolver.EXTRA_TOTAL_COUNT));
+
+
+ assertEquals(limit, extras.getInt(ContentPager.EXTRA_REQUESTED_LIMIT));
+
+ assertEquals(7, extras.getInt(ContentPager.EXTRA_SUGGESTED_LIMIT));
+
+ assertHasHonoredArgs(
+ extras,
+ ContentResolver.QUERY_ARG_LIMIT,
+ ContentResolver.QUERY_ARG_OFFSET);
+
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_PROVIDER_PAGED));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+ }
+
+ @Test
+ public void testAdaptsUnpagedToPaged() throws Throwable {
+ Query query = mPager.query(
+ UNPAGED_URI,
+ null,
+ createArgs(0, 10),
+ null,
+ mCallback);
+
+ mCallback.assertNumPagesLoaded(1);
+ mCallback.assertPageLoaded(query);
+ Cursor cursor = mCallback.getCursor(query);
+ Bundle extras = cursor.getExtras();
+
+ assertExpectedRecords(cursor, query.getOffset());
+
+ assertEquals(
+ ContentPager.CURSOR_DISPOSITION_COPIED,
+ extras.getInt(ContentPager.CURSOR_DISPOSITION));
+
+ assertEquals(
+ TestContentProvider.DEFAULT_RECORD_COUNT,
+ extras.getInt(ContentResolver.EXTRA_TOTAL_COUNT));
+
+ assertHasHonoredArgs(
+ extras,
+ ContentResolver.QUERY_ARG_LIMIT,
+ ContentResolver.QUERY_ARG_OFFSET);
+
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_COMPAT_PAGED));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+ }
+
+ @Test
+ public void testCachesUnpagedCursor() throws Throwable {
+ mPager.query(
+ UNPAGED_URI,
+ null,
+ createArgs(0, 10),
+ null,
+ mCallback);
+
+ mPager.query(
+ UNPAGED_URI,
+ null,
+ createArgs(10, 10),
+ null,
+ mCallback);
+
+ // Rerun the same query as the first...extra exercise to ensure we can return
+ // to previously loaded results.
+ Query query = mPager.query(
+ UNPAGED_URI,
+ null,
+ createArgs(0, 10),
+ null,
+ mCallback);
+
+ mCallback.assertNumPagesLoaded(3);
+ Cursor cursor = mCallback.getCursor(query);
+ Bundle extras = cursor.getExtras();
+
+ assertEquals(
+ 3,
+ extras.getInt(ContentPager.Stats.EXTRA_COMPAT_PAGED));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+ assertEquals(
+ 3,
+ extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+ }
+
+ @Test
+ public void testWrapsCursorsThatJustHappenToFitInPageRange() throws Throwable {
+
+ // NOTE: Paging on Android O is accompolished by way of ContentResolver#query that
+ // accepts a Bundle. That means on older platforms we either have to cook up
+ // a special way of paging that doesn't use the bundle (that's what we do here)
+ // or we simply skip testing how we deal with provider paged results.
+ Uri uri = TestContentProvider.forceRecordCount(UNPAGED_URI, 22);
+
+ Query query = mPager.query(
+ uri,
+ null,
+ createArgs(0, 44),
+ null,
+ mCallback);
+
+ mCallback.assertNumPagesLoaded(1);
+ // mCallback.assertPageLoaded(pageId);
+ mCallback.assertPageLoaded(query);
+ Cursor cursor = mCallback.getCursor(query);
+ Bundle extras = cursor.getExtras();
+
+ assertExpectedRecords(cursor, query.getOffset());
+
+ assertEquals(
+ ContentPager.CURSOR_DISPOSITION_WRAPPED,
+ extras.getInt(ContentPager.CURSOR_DISPOSITION));
+
+ assertEquals(
+ 22,
+ extras.getInt(ContentResolver.EXTRA_TOTAL_COUNT));
+
+ assertHasHonoredArgs(
+ extras,
+ ContentResolver.QUERY_ARG_LIMIT,
+ ContentResolver.QUERY_ARG_OFFSET);
+
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_COMPAT_PAGED));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+ }
+
+ @Test
+ public void testCorrectlyCopiesRecords_EndOfResults() throws Throwable {
+ // finally, check the last page.
+ int limit = 100;
+ // This will be the size of the last page. Should be 67.
+ int leftOvers = TestContentProvider.DEFAULT_RECORD_COUNT % limit;
+ int offset = TestContentProvider.DEFAULT_RECORD_COUNT - leftOvers;
+
+ Query query = mPager.query(
+ UNPAGED_URI,
+ null,
+ createArgs(offset, limit),
+ null,
+ mCallback);
+
+ mCallback.assertNumPagesLoaded(1);
+ mCallback.assertPageLoaded(query);
+ Cursor cursor = mCallback.getCursor(query);
+ assertEquals(leftOvers, cursor.getCount());
+ Bundle extras = cursor.getExtras();
+
+ assertExpectedRecords(cursor, query.getOffset());
+
+ assertEquals(
+ ContentPager.CURSOR_DISPOSITION_COPIED,
+ extras.getInt(ContentPager.CURSOR_DISPOSITION));
+
+ assertHasHonoredArgs(
+ extras,
+ ContentResolver.QUERY_ARG_LIMIT,
+ ContentResolver.QUERY_ARG_OFFSET);
+
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_COMPAT_PAGED));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_RESOLVED_QUERIES));
+ assertEquals(
+ 1,
+ extras.getInt(ContentPager.Stats.EXTRA_TOTAL_QUERIES));
+ }
+
+ @Test
+ public void testCancelsRunningQueriesOnReset() throws Throwable {
+ mRunner.runQuery = false;
+ Query query = mPager.query(
+ UNPAGED_URI,
+ null,
+ createArgs(0, 10),
+ null,
+ mCallback);
+
+ assertTrue(mRunner.isRunning(query));
+
+ mPager.reset();
+
+ assertFalse(mRunner.isRunning(query));
+ }
+
+ @Test
+ public void testRelaysContentChangeNotificationsOnPagedCursors() throws Throwable {
+
+ TestContentObserver observer = new TestContentObserver(
+ new Handler(Looper.getMainLooper()));
+ observer.expectNotifications(1);
+
+ Query query = mPager.query(
+ UNPAGED_URI,
+ null,
+ createArgs(10, 99),
+ null,
+ mCallback);
+
+ Cursor cursor = mCallback.getCursor(query);
+ cursor.registerContentObserver(observer);
+
+ mResolver.notifyChange(UNPAGED_URI, null);
+
+ assertTrue(observer.mNotifiedLatch.await(1000, TimeUnit.MILLISECONDS));
+ }
+
+ private void assertExpectedRecords(Cursor cursor, int offset) {
+ for (int row = 0; row < cursor.getCount(); row++) {
+ assertTrue(cursor.moveToPosition(row));
+ int unpagedRow = offset + row;
+ for (int column = 0; column < cursor.getColumnCount(); column++) {
+ TestContentProvider.assertExpectedCellValue(cursor, unpagedRow, column);
+ }
+ }
+ }
+
+ private static void assertHasHonoredArgs(Bundle extras, String... expectedArgs) {
+ List<String> honored = Arrays.asList(
+ extras.getStringArray(ContentResolver.EXTRA_HONORED_ARGS));
+
+ for (String arg : expectedArgs) {
+ assertTrue(honored.contains(arg));
+ }
+ }
+
+ private static final class TestContentCallback implements ContentCallback {
+
+ private int mPagesLoaded;
+ private Map<Query, Cursor> mCursors = new HashMap<>();
+
+ @Override
+ public void onCursorReady(Query query, Cursor cursor) {
+ mPagesLoaded++;
+ mCursors.put(query, cursor);
+ }
+
+ private void assertPageLoaded(Query query) {
+ assertTrue(mCursors.containsKey(query));
+ assertNotNull(mCursors.get(query));
+ }
+
+ private void assertNumPagesLoaded(int expected) {
+ assertEquals(expected, mPagesLoaded);
+ }
+
+ private @Nullable Cursor getCursor(Query query) {
+ return mCursors.get(query);
+ }
+ }
+}
diff --git a/content/tests/java/android/support/content/LoaderQueryRunnerTest.java b/content/tests/java/android/support/content/LoaderQueryRunnerTest.java
new file mode 100644
index 0000000..a0ddd9a
--- /dev/null
+++ b/content/tests/java/android/support/content/LoaderQueryRunnerTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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 android.support.content;
+
+import static android.support.content.ContentPager.createArgs;
+import static android.support.content.TestContentProvider.UNPAGED_URI;
+
+import android.app.Activity;
+import android.database.Cursor;
+import android.os.Looper;
+import android.support.content.ContentPager.ContentCallback;
+import android.support.content.ContentPager.QueryRunner;
+import android.support.test.filters.MediumTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class LoaderQueryRunnerTest {
+
+ @Rule
+ public ActivityTestRule<Activity> mActivityRule = new ActivityTestRule(TestActivity.class);
+
+ private Activity mActivity;
+ private QueryRunner mRunner;
+ private TestQueryCallback mCallback;
+
+ @Before
+ public void setUp() {
+ mActivity = mActivityRule.getActivity();
+ mRunner = new LoaderQueryRunner(mActivity, mActivity.getLoaderManager());
+ mCallback = new TestQueryCallback();
+ }
+
+ @Test
+ public void testRunsQuery() throws Throwable {
+ int offset = 0;
+ int limit = 10;
+
+ // Note: For some when running this test via tradefed (vs gradle) this
+ // looper setup code doesn't work when run *in setUp*. Works fine in Gradle.
+ // So this test fails when run on treehugger or run via tradefed.
+ // To work around that issue we prepare the looper here.
+ //
+ // "Wait!" you say, why do you need to prepare a looper? We're using
+ // a CursorLoader under the hoods which deep down creates an handler
+ // to listen for content changes. That's not critical to our test
+ // since we're waiting on results w/ latches, but we need to avoid the error.
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
+
+ ContentCallback dummyContentCallback = new ContentCallback() {
+ @Override
+ public void onCursorReady(Query query, Cursor cursor) {
+ // Nothing to see here. Move along.
+ }
+ };
+ Query query = new Query(
+ UNPAGED_URI,
+ null,
+ createArgs(offset, limit),
+ null,
+ dummyContentCallback);
+
+ mCallback.reset(1);
+ mRunner.query(query, mCallback);
+
+ mCallback.waitFor(10);
+ mCallback.assertQueried(query.getId());
+ mCallback.assertReceivedContent(UNPAGED_URI, query.getId());
+ }
+}
diff --git a/content/tests/java/android/support/content/QueryTest.java b/content/tests/java/android/support/content/QueryTest.java
new file mode 100644
index 0000000..8943874
--- /dev/null
+++ b/content/tests/java/android/support/content/QueryTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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 android.support.content;
+
+import static junit.framework.Assert.assertTrue;
+
+import android.database.Cursor;
+import android.net.Uri;
+import android.support.content.ContentPager.ContentCallback;
+import android.support.test.filters.MediumTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@MediumTest
+@RunWith(AndroidJUnit4.class)
+public class QueryTest {
+
+ private static final Uri URI_HAMMY = Uri.parse("content://hammy");
+ private static final Uri URI_CHEESY = Uri.parse("content://cheesy");
+
+ private static final ContentCallback sCallback = new ContentCallback() {
+ @Override
+ public void onCursorReady(Query query, Cursor cursor) {
+ // nothing to see here. Move along.
+ }
+ };
+
+ @Test
+ public void testDistinctIdsForDifferentUris() throws Throwable {
+ Query queryA = new Query(
+ URI_HAMMY,
+ null,
+ ContentPager.createArgs(0, 10),
+ null,
+ sCallback);
+
+ Query queryB = new Query(
+ URI_CHEESY,
+ null,
+ ContentPager.createArgs(0, 10),
+ null,
+ sCallback);
+
+ assertDistinctIds(queryA, queryB);
+ }
+
+ @Test
+ public void testDistinctIdsForDifferentPagingArgs() throws Throwable {
+ Query queryA = new Query(
+ URI_HAMMY,
+ null,
+ ContentPager.createArgs(0, 10),
+ null,
+ sCallback);
+
+ Query queryB = new Query(
+ URI_HAMMY,
+ null,
+ ContentPager.createArgs(10, 10),
+ null,
+ sCallback);
+
+ assertDistinctIds(queryA, queryB);
+ }
+
+ private void assertDistinctIds(Query a, Query b) {
+ String msg = String.format(
+ "id A (%d) and id B (%d) are equal, but should not be.",
+ a.getId(),
+ b.getId());
+ assertTrue(msg, a.getId() != b.getId());
+ }
+}
diff --git a/buildSrc/versions.gradle b/content/tests/java/android/support/content/TestActivity.java
similarity index 81%
rename from buildSrc/versions.gradle
rename to content/tests/java/android/support/content/TestActivity.java
index 43caec7..dc85c44 100644
--- a/buildSrc/versions.gradle
+++ b/content/tests/java/android/support/content/TestActivity.java
@@ -14,6 +14,12 @@
* limitations under the License.
*/
-// Version code of the support library components.
-ext.supportVersion = "26.1.0-SNAPSHOT"
+package android.support.content;
+import android.app.Activity;
+
+/**
+ * TestActivity.
+ */
+public class TestActivity extends Activity {
+}
diff --git a/content/tests/java/android/support/content/TestContentObserver.java b/content/tests/java/android/support/content/TestContentObserver.java
new file mode 100644
index 0000000..be0004b
--- /dev/null
+++ b/content/tests/java/android/support/content/TestContentObserver.java
@@ -0,0 +1,48 @@
+/*
+ * 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 android.support.content;
+
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.support.annotation.VisibleForTesting;
+
+import java.util.concurrent.CountDownLatch;
+
+final class TestContentObserver extends ContentObserver {
+
+ @VisibleForTesting
+ public CountDownLatch mNotifiedLatch;
+
+ TestContentObserver(Handler handler) {
+ super(handler);
+ }
+
+ void expectNotifications(int count) {
+ mNotifiedLatch = new CountDownLatch(count);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ mNotifiedLatch.countDown();
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ mNotifiedLatch.countDown();
+ }
+}
diff --git a/content/tests/java/android/support/content/TestContentProvider.java b/content/tests/java/android/support/content/TestContentProvider.java
new file mode 100644
index 0000000..e474240
--- /dev/null
+++ b/content/tests/java/android/support/content/TestContentProvider.java
@@ -0,0 +1,396 @@
+/*
+ * 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 android.support.content;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.content.ContentProvider;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.database.AbstractWindowedCursor;
+import android.database.Cursor;
+import android.database.CursorWindow;
+import android.database.MatrixCursor;
+import android.database.MatrixCursor.RowBuilder;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+
+/**
+ * A stub data paging provider used for testing of paging support.
+ * Ignores client supplied projections.
+ */
+public final class TestContentProvider extends ContentProvider {
+
+ public static final String AUTHORITY = "android.support.content.test.testpagingprovider";
+
+ public static final String UNPAGED_PATH = "/un-paged";
+ public static final String PAGED_PATH = "/paged";
+ public static final String PAGED_WINDOWED_PATH = PAGED_PATH + "/windowed";
+
+ public static final Uri UNPAGED_URI = new Uri.Builder()
+ .scheme("content")
+ .authority(AUTHORITY)
+ .path(UNPAGED_PATH)
+ .build();
+ public static final Uri PAGED_URI = new Uri.Builder()
+ .scheme("content")
+ .authority(AUTHORITY)
+ .path(PAGED_PATH)
+ .build();
+ public static final Uri PAGED_WINDOWED_URI = new Uri.Builder()
+ .scheme("content")
+ .authority(AUTHORITY)
+ .path(PAGED_WINDOWED_PATH)
+ .build();
+
+ public static final String COLUMN_POS = "ColumnPos";
+ public static final String COLUMN_A = "ColumnA";
+ public static final String COLUMN_B = "ColumnB";
+ public static final String COLUMN_C = "ColumnC";
+ public static final String COLUMN_D = "ColumnD";
+ public static final String[] PROJECTION = {
+ COLUMN_POS,
+ COLUMN_A,
+ COLUMN_B,
+ COLUMN_C,
+ COLUMN_D
+ };
+
+ @VisibleForTesting
+ public static final String RECORD_COUNT = "test-record-count";
+
+ @VisibleForTesting
+ public static final int DEFAULT_RECORD_COUNT = 567;
+
+ private static final String TAG = "TestPagingProvider";
+
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Override
+ public Cursor query(
+ Uri uri, @Nullable String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return query(uri, projection, null, null);
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] ignored, Bundle queryArgs,
+ CancellationSignal cancellationSignal) {
+
+ queryArgs = queryArgs != null ? queryArgs : Bundle.EMPTY;
+
+ int recordCount = getIntValue(RECORD_COUNT, queryArgs, uri, DEFAULT_RECORD_COUNT);
+ if (recordCount < 0) {
+ throw new RuntimeException("Recordset size must be >= 0");
+ }
+
+ Cursor cursor = null;
+ switch (uri.getPath()) {
+ case UNPAGED_PATH:
+ cursor = buildUnpagedResults(recordCount);
+ break;
+ case PAGED_PATH:
+ cursor = buildPagedResults(uri, queryArgs, recordCount);
+ break;
+ case PAGED_WINDOWED_PATH:
+ cursor = buildPagedWindowedResults(uri, queryArgs, recordCount);
+ break;
+ default:
+ throw new IllegalArgumentException("Unrecognized path: " + uri.getPath());
+ }
+
+ cursor.setNotificationUri(getContext().getContentResolver(), uri);
+
+ return cursor;
+ }
+
+ /**
+ * Return a int value specified in Bundle key, Uri query arg, or fallback default value.
+ */
+ private static int getIntValue(String key, Bundle queryArgs, Uri uri, int defaultValue) {
+ int value = queryArgs.getInt(key, Integer.MIN_VALUE);
+ if (value != Integer.MIN_VALUE) {
+ return value;
+ }
+
+ @Nullable String argValue = uri.getQueryParameter(key);
+ if (argValue != null) {
+ try {
+ return Integer.parseInt(argValue);
+ } catch (NumberFormatException ignored) {
+ }
+ }
+
+ return defaultValue;
+ }
+
+ private MatrixCursor buildPagedResults(Uri uri, Bundle queryArgs, int recordsetSize) {
+ int offset = getIntValue(ContentResolver.QUERY_ARG_OFFSET, queryArgs, uri, 0);
+ int limit = getIntValue(ContentResolver.QUERY_ARG_LIMIT, queryArgs, uri, recordsetSize);
+
+ MatrixCursor c = createInMemoryCursor();
+ Bundle extras = c.getExtras();
+
+ // Calculate the number of items to include in the cursor.
+ int numItems = constrain(recordsetSize - offset, 0, limit);
+
+ // Build the paged result set.
+ for (int i = offset; i < offset + numItems; i++) {
+ fillRow(c.newRow(), i);
+ }
+
+ extras.putStringArray(ContentResolver.EXTRA_HONORED_ARGS, new String[] {
+ ContentResolver.QUERY_ARG_OFFSET,
+ ContentResolver.QUERY_ARG_LIMIT
+ });
+ extras.putInt(ContentResolver.EXTRA_TOTAL_COUNT, recordsetSize);
+ return c;
+ }
+
+ private AbstractWindowedCursor buildPagedWindowedResults(
+ Uri uri, Bundle queryArgs, int recordsetSize) {
+ int offset = getIntValue(ContentResolver.QUERY_ARG_OFFSET, queryArgs, uri, 0);
+ int limit = getIntValue(ContentResolver.QUERY_ARG_LIMIT, queryArgs, uri, recordsetSize);
+
+ int windowSize = limit - 1;
+
+ TestWindowedCursor c = new TestWindowedCursor(PROJECTION, recordsetSize);
+ CursorWindow window = c.getWindow();
+ window.setNumColumns(PROJECTION.length);
+
+ Bundle extras = c.getExtras();
+
+ // Build the unpaged result set.
+ for (int row = 0; row < windowSize; row++) {
+ if (!window.allocRow()) {
+ break;
+ }
+ if (!fillRow(window, row)) {
+ window.freeLastRow();
+ break;
+ }
+ }
+
+ extras.putStringArray(ContentResolver.EXTRA_HONORED_ARGS, new String[] {
+ ContentResolver.QUERY_ARG_OFFSET,
+ ContentResolver.QUERY_ARG_LIMIT
+ });
+ extras.putInt(ContentResolver.EXTRA_TOTAL_COUNT, recordsetSize);
+ return c;
+ }
+
+ private MatrixCursor buildUnpagedResults(int recordsetSize) {
+ MatrixCursor c = createInMemoryCursor();
+
+ // Build the unpaged result set.
+ for (int i = 0; i < recordsetSize; i++) {
+ fillRow(c.newRow(), i);
+ }
+
+ return c;
+ }
+
+ /**
+ * Returns data type of the given object's value.
+ *<p>
+ * Returned values are
+ * <ul>
+ * <li>{@link Cursor#FIELD_TYPE_NULL}</li>
+ * <li>{@link Cursor#FIELD_TYPE_INTEGER}</li>
+ * <li>{@link Cursor#FIELD_TYPE_FLOAT}</li>
+ * <li>{@link Cursor#FIELD_TYPE_STRING}</li>
+ * <li>{@link Cursor#FIELD_TYPE_BLOB}</li>
+ *</ul>
+ *</p>
+ */
+ public static int getTypeOfObject(Object obj) {
+ if (obj == null) {
+ return Cursor.FIELD_TYPE_NULL;
+ } else if (obj instanceof byte[]) {
+ return Cursor.FIELD_TYPE_BLOB;
+ } else if (obj instanceof Float || obj instanceof Double) {
+ return Cursor.FIELD_TYPE_FLOAT;
+ } else if (obj instanceof Long || obj instanceof Integer
+ || obj instanceof Short || obj instanceof Byte) {
+ return Cursor.FIELD_TYPE_INTEGER;
+ } else {
+ return Cursor.FIELD_TYPE_STRING;
+ }
+ }
+
+ private MatrixCursor createInMemoryCursor() {
+ MatrixCursor c = new MatrixCursor(PROJECTION);
+ Bundle extras = new Bundle();
+ c.setExtras(extras);
+ return c;
+ }
+
+ private void fillRow(RowBuilder row, int rowId) {
+ row.add(createCellValue(rowId, 0));
+ row.add(createCellValue(rowId, 1));
+ row.add(createCellValue(rowId, 2));
+ row.add(createCellValue(rowId, 3));
+ row.add(createCellValue(rowId, 4));
+ }
+
+ /**
+ * @return true if the row was successfully populated. If false, caller should freeLastRow.
+ */
+ private static boolean fillRow(CursorWindow window, int row) {
+ if (!window.putLong((int) createCellValue(row, 0), row, 0)) {
+ return false;
+ }
+ for (int i = 1; i < PROJECTION.length; i++) {
+ if (!window.putString((String) createCellValue(row, i), row, i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private static Object createCellValue(int row, int col) {
+ switch(col) {
+ case 0:
+ return row;
+ case 1:
+ return "--aaa--" + row;
+ case 2:
+ return "**bbb**" + row;
+ case 3:
+ return ("^^ccc^^" + row);
+ case 4:
+ return "##ddd##" + row;
+ default:
+ throw new IllegalArgumentException("Unsupported column: " + col);
+ }
+ }
+
+ /**
+ * Asserts that the value at the current cursor position x column
+ * is expected test data for the supplied row.
+ *
+ * <p>Cursor must be pre-positioned.
+ *
+ * @param cursor must be prepositioned to the row to be tested.
+ * @param row row value expected to be reflected in cell. This can be different
+ * than the cursor position due to paging.
+ * @param column
+ */
+ @VisibleForTesting
+ public static void assertExpectedCellValue(Cursor cursor, int row, int column) {
+ int type = cursor.getType(column);
+ switch(type) {
+ case Cursor.FIELD_TYPE_NULL:
+ throw new UnsupportedOperationException("Not implemented.");
+ case Cursor.FIELD_TYPE_INTEGER:
+ assertEquals(createCellValue(row, column), cursor.getInt(column));
+ break;
+ case Cursor.FIELD_TYPE_FLOAT:
+ assertEquals(createCellValue(row, column), cursor.getDouble(column));
+ break;
+ case Cursor.FIELD_TYPE_BLOB:
+ assertEquals(createCellValue(row, column), cursor.getBlob(column));
+ break;
+ case Cursor.FIELD_TYPE_STRING:
+ assertEquals(createCellValue(row, column), cursor.getString(column));
+ break;
+ default:
+ throw new UnsupportedOperationException("Unknown column type: " + type);
+ }
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ throw new UnsupportedOperationException();
+ }
+
+ private static int constrain(int amount, int low, int high) {
+ return amount < low ? low : (amount > high ? high : amount);
+ }
+
+ /**
+ * Returns a Uri that includes paging information embedded in the URI.
+ * This allows a test client to force paged results when running on older SDKs...
+ * pre Android O SDKs lacking the ContentResolver#query w/ Bundle override
+ * necessary for paging.
+ */
+ public static Uri forcePagingSpec(Uri uri, int offset, int limit) {
+ assert (uri.getPath().equals(TestContentProvider.PAGED_PATH)
+ || uri.getPath().equals(TestContentProvider.PAGED_WINDOWED_PATH));
+ return uri.buildUpon()
+ .appendQueryParameter(ContentResolver.QUERY_ARG_OFFSET, String.valueOf(offset))
+ .appendQueryParameter(ContentResolver.QUERY_ARG_LIMIT, String.valueOf(limit))
+ .build();
+ }
+
+ public static Uri forceRecordCount(Uri uri, int recordCount) {
+ return uri.buildUpon()
+ .appendQueryParameter(RECORD_COUNT, String.valueOf(recordCount))
+ .build();
+ }
+
+ private static final class TestWindowedCursor extends AbstractWindowedCursor {
+
+ private final String[] mProjection;
+ private final int mCount;
+ private final Bundle mExtras;
+
+ TestWindowedCursor(String[] projection, int count) {
+ mProjection = projection;
+ mCount = count;
+ mExtras = new Bundle();
+
+ setWindow(new CursorWindow("stevie"));
+ }
+
+ @Override
+ public Bundle getExtras() {
+ return mExtras;
+ }
+
+ @Override
+ public int getCount() {
+ return mCount;
+ }
+
+ @Override
+ public String[] getColumnNames() {
+ return mProjection;
+ }
+ }
+}
diff --git a/content/tests/java/android/support/content/TestQueryCallback.java b/content/tests/java/android/support/content/TestQueryCallback.java
new file mode 100644
index 0000000..2ed975d
--- /dev/null
+++ b/content/tests/java/android/support/content/TestQueryCallback.java
@@ -0,0 +1,147 @@
+/*
+ * 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 android.support.content;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.util.Pair;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+final class TestQueryCallback implements ContentPager.QueryRunner.Callback {
+
+ private static final String URI_KEY = "testUri";
+ private static final String URI_PAGE_ID = "testPageId";
+
+ private CollectorLatch<Query> mQueryLatch;
+ private CollectorLatch<Pair<Integer, Cursor>> mReplyLatch;
+
+ @Override
+ public @Nullable Cursor runQueryInBackground(Query query) {
+ mQueryLatch.accept(query);
+ Bundle extras = new Bundle();
+ extras.putParcelable(URI_KEY, query.getUri());
+ extras.putInt(URI_PAGE_ID, query.getId());
+ MatrixCursor cursor = new MatrixCursor(new String[]{"id"}, 0);
+ cursor.setExtras(extras);
+ return cursor;
+ }
+
+ @Override
+ public void onQueryFinished(Query query, Cursor cursor) {
+ mReplyLatch.accept(new Pair<>(query.getId(), cursor));
+ }
+
+ public void reset(int expectedCount) throws InterruptedException {
+ mQueryLatch = new CollectorLatch<>(expectedCount);
+ mReplyLatch = new CollectorLatch<>(expectedCount);
+ }
+
+ public void waitFor(int seconds) throws InterruptedException {
+ assertTrue(mQueryLatch.await(seconds, TimeUnit.SECONDS));
+ assertTrue(mReplyLatch.await(seconds, TimeUnit.SECONDS));
+ }
+
+ public void assertQueried(final int expectedPageId) {
+ mQueryLatch.assertHasItem(new Matcher<Query>() {
+ @Override
+ public boolean matches(Query query) {
+ return expectedPageId == query.getId();
+ }
+ });
+ }
+
+ public void assertReceivedContent(Uri expectedUri, final int expectedPageId) {
+ mReplyLatch.assertHasItem(new Matcher<Pair<Integer, Cursor>>() {
+ @Override
+ public boolean matches(Pair<Integer, Cursor> value) {
+ return expectedPageId == value.first;
+ }
+ });
+ List<Pair<Integer, Cursor>> collected = mReplyLatch.getCollected();
+ Cursor cursor = null;
+
+ for (Pair<Integer, Cursor> pair : collected) {
+ if (expectedPageId == pair.first) {
+ cursor = pair.second;
+ }
+ }
+
+ assertEquals(0, cursor.getCount()); // we don't add any records to our test cursor.
+ Bundle extras = cursor.getExtras();
+ assertNotNull(extras);
+ assertTrue(extras.containsKey(URI_KEY));
+ assertEquals(extras.getParcelable(URI_KEY), expectedUri);
+ assertTrue(extras.containsKey(URI_PAGE_ID));
+ assertEquals(extras.getInt(URI_PAGE_ID), expectedPageId);
+ }
+
+ private static final class CollectorLatch<T> extends CountDownLatch {
+
+ private final List<T> mCollected = new ArrayList<>();
+
+ CollectorLatch(int count) {
+ super(count);
+ }
+
+ void accept(@Nullable T value) {
+ onReceived(value);
+ super.countDown();
+ }
+
+ @Override
+ public void countDown() {
+ throw new UnsupportedOperationException("Count is incremented by calls to accept.");
+ }
+
+ void onReceived(@Nullable T value) {
+ mCollected.add(value);
+ }
+
+ List<T> getCollected() {
+ return mCollected;
+ }
+
+ public void assertHasItem(Matcher<T> matcher) {
+ T item = null;
+ for (T val : mCollected) {
+ if (matcher.matches(val)) {
+ item = val;
+ }
+ }
+ assertNotNull(item);
+ }
+
+ public @Nullable T get(int index) {
+ return mCollected.get(index);
+ }
+ }
+
+ interface Matcher<T> {
+ boolean matches(T value);
+ }
+}
diff --git a/content/tests/java/android/support/content/TestQueryRunner.java b/content/tests/java/android/support/content/TestQueryRunner.java
new file mode 100644
index 0000000..957d814
--- /dev/null
+++ b/content/tests/java/android/support/content/TestQueryRunner.java
@@ -0,0 +1,53 @@
+/*
+ * 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 android.support.content;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Test friendly synchronous QueryRunner. Not suitable for use
+ * in production code.
+ */
+public final class TestQueryRunner implements ContentPager.QueryRunner {
+
+ // if false, we'll skip calling through to the mCallback when query is called
+ // this simulates async processing, and allows tests to check that cancel
+ // is handled correctly.
+ public boolean runQuery = true;
+
+ private final Set<Query> mRunning = new HashSet<>();
+
+ @Override
+ public void query(Query query, Callback callback) {
+ if (runQuery) {
+ callback.onQueryFinished(query, callback.runQueryInBackground(query));
+ } else {
+ mRunning.add(query);
+ }
+ }
+
+ @Override
+ public boolean isRunning(Query query) {
+ return mRunning.contains(query);
+ }
+
+ @Override
+ public void cancel(Query query) {
+ mRunning.remove(query);
+ }
+}
diff --git a/core-ui/AndroidManifest.xml b/core-ui/AndroidManifest.xml
index b952b5e..715f92c 100644
--- a/core-ui/AndroidManifest.xml
+++ b/core-ui/AndroidManifest.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
package="android.support.coreui">
- <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.coreui"/>
+ <uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.coreui.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/core-ui/api/26.1.0-SNAPSHOT.txt b/core-ui/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from core-ui/api/26.1.0-SNAPSHOT.txt
rename to core-ui/api/27.0.0-SNAPSHOT.txt
diff --git a/core-ui/build.gradle b/core-ui/build.gradle
index 0cbea4a..6f88e9a 100644
--- a/core-ui/build.gradle
+++ b/core-ui/build.gradle
@@ -4,14 +4,10 @@
api project(':support-annotations')
api project(':support-compat')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
androidTestImplementation project(':support-testutils')
}
@@ -29,10 +25,6 @@
buildTypes.all {
consumerProguardFiles 'proguard-rules.pro'
}
-
- testOptions {
- unitTests.returnDefaultValues = true
- }
}
supportLibrary {
diff --git a/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java b/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
index e3f2462..602df70 100644
--- a/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
+++ b/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
@@ -994,7 +994,7 @@
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
boolean result;
- final int save = canvas.save(Canvas.CLIP_SAVE_FLAG);
+ final int save = canvas.save();
if (mCanSlide && !lp.slideable && mSlideableView != null) {
// Clip against the slider; no sense drawing what will immediately be covered.
diff --git a/core-ui/lint-baseline.xml b/core-ui/lint-baseline.xml
index 8961812..1062fea 100644
--- a/core-ui/lint-baseline.xml
+++ b/core-ui/lint-baseline.xml
@@ -12,15 +12,4 @@
column="47"/>
</issue>
- <issue
- id="WrongConstant"
- message="Must be one or more of: Canvas.ALL_SAVE_FLAG"
- errorLine1=" final int save = canvas.save(Canvas.CLIP_SAVE_FLAG);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="java/android/support/v4/widget/SlidingPaneLayout.java"
- line="997"
- column="38"/>
- </issue>
-
</issues>
diff --git a/core-utils/Android.mk b/core-utils/Android.mk
index b22c376..5ea200e 100644
--- a/core-utils/Android.mk
+++ b/core-utils/Android.mk
@@ -29,10 +29,7 @@
LOCAL_SRC_FILES := \
$(call all-java-files-under,gingerbread) \
$(call all-java-files-under,kitkat) \
- $(call all-java-files-under,api20) \
$(call all-java-files-under,api21) \
- $(call all-java-files-under,api23) \
- $(call all-java-files-under,api24) \
$(call all-java-files-under,java)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_SHARED_ANDROID_LIBRARIES := \
diff --git a/core-utils/AndroidManifest.xml b/core-utils/AndroidManifest.xml
index 5c10a5b..c24e023 100644
--- a/core-utils/AndroidManifest.xml
+++ b/core-utils/AndroidManifest.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
package="android.support.coreutils">
- <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.coreutils"/>
+ <uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.coreutils.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/core-utils/api/26.1.0-SNAPSHOT.txt b/core-utils/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from core-utils/api/26.1.0-SNAPSHOT.txt
rename to core-utils/api/27.0.0-SNAPSHOT.txt
diff --git a/core-utils/build.gradle b/core-utils/build.gradle
index c6e98f0..239516f 100644
--- a/core-utils/build.gradle
+++ b/core-utils/build.gradle
@@ -4,14 +4,10 @@
api project(':support-annotations')
api project(':support-compat')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
}
android {
diff --git a/customtabs/AndroidManifest.xml b/customtabs/AndroidManifest.xml
index 4069dae..6a25c8a 100644
--- a/customtabs/AndroidManifest.xml
+++ b/customtabs/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.customtabs">
<uses-sdk android:minSdkVersion="15"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.customtabs.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/customtabs/api/26.1.0-SNAPSHOT.txt b/customtabs/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from customtabs/api/26.1.0-SNAPSHOT.txt
rename to customtabs/api/27.0.0-SNAPSHOT.txt
diff --git a/customtabs/build.gradle b/customtabs/build.gradle
index 17e8cb9..fe2b1cf 100644
--- a/customtabs/build.gradle
+++ b/customtabs/build.gradle
@@ -4,12 +4,8 @@
api project(':support-compat')
api project(':support-annotations')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
androidTestImplementation project(':support-testutils')
}
diff --git a/design/AndroidManifest.xml b/design/AndroidManifest.xml
index afae16e..aa02181 100644
--- a/design/AndroidManifest.xml
+++ b/design/AndroidManifest.xml
@@ -14,11 +14,10 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
package="android.support.design">
- <uses-sdk android:minSdkVersion="14"
- tools:overrideLibrary="android.support.transition"/>
+ <uses-sdk android:minSdkVersion="14" />
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.design.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/design/api/26.1.0-SNAPSHOT.txt b/design/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from design/api/26.1.0-SNAPSHOT.txt
rename to design/api/27.0.0-SNAPSHOT.txt
diff --git a/design/src/android/support/design/widget/BottomSheetBehavior.java b/design/src/android/support/design/widget/BottomSheetBehavior.java
index a28d3be..aaa9b80 100644
--- a/design/src/android/support/design/widget/BottomSheetBehavior.java
+++ b/design/src/android/support/design/widget/BottomSheetBehavior.java
@@ -312,7 +312,9 @@
if (mState == STATE_DRAGGING && action == MotionEvent.ACTION_DOWN) {
return true;
}
- mViewDragHelper.processTouchEvent(event);
+ if (mViewDragHelper != null) {
+ mViewDragHelper.processTouchEvent(event);
+ }
// Record the velocity
if (action == MotionEvent.ACTION_DOWN) {
reset();
diff --git a/design/src/android/support/design/widget/CoordinatorLayout.java b/design/src/android/support/design/widget/CoordinatorLayout.java
index 818e3a6..d97d4e6 100644
--- a/design/src/android/support/design/widget/CoordinatorLayout.java
+++ b/design/src/android/support/design/widget/CoordinatorLayout.java
@@ -232,7 +232,7 @@
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
- resetTouchBehaviors();
+ resetTouchBehaviors(false);
if (mNeedsPreDrawListener) {
if (mOnPreDrawListener == null) {
mOnPreDrawListener = new OnPreDrawListener();
@@ -251,7 +251,7 @@
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
- resetTouchBehaviors();
+ resetTouchBehaviors(false);
if (mNeedsPreDrawListener && mOnPreDrawListener != null) {
final ViewTreeObserver vto = getViewTreeObserver();
vto.removeOnPreDrawListener(mOnPreDrawListener);
@@ -373,20 +373,25 @@
* in response to an UP or CANCEL event, when intercept is request-disallowed
* and similar cases where an event stream in progress will be aborted.
*/
- private void resetTouchBehaviors() {
- if (mBehaviorTouchView != null) {
- final Behavior b = ((LayoutParams) mBehaviorTouchView.getLayoutParams()).getBehavior();
+ private void resetTouchBehaviors(boolean notifyOnInterceptTouchEvent) {
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ final Behavior b = lp.getBehavior();
if (b != null) {
final long now = SystemClock.uptimeMillis();
final MotionEvent cancelEvent = MotionEvent.obtain(now, now,
MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0);
- b.onTouchEvent(this, mBehaviorTouchView, cancelEvent);
+ if (notifyOnInterceptTouchEvent) {
+ b.onInterceptTouchEvent(this, child, cancelEvent);
+ } else {
+ b.onTouchEvent(this, child, cancelEvent);
+ }
cancelEvent.recycle();
}
- mBehaviorTouchView = null;
}
- final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
@@ -493,7 +498,7 @@
// Make sure we reset in case we had missed a previous important event.
if (action == MotionEvent.ACTION_DOWN) {
- resetTouchBehaviors();
+ resetTouchBehaviors(true);
}
final boolean intercepted = performIntercept(ev, TYPE_ON_INTERCEPT);
@@ -503,7 +508,7 @@
}
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
- resetTouchBehaviors();
+ resetTouchBehaviors(true);
}
return intercepted;
@@ -548,7 +553,7 @@
}
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
- resetTouchBehaviors();
+ resetTouchBehaviors(false);
}
return handled;
@@ -558,7 +563,7 @@
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
super.requestDisallowInterceptTouchEvent(disallowIntercept);
if (disallowIntercept && !mDisallowInterceptReset) {
- resetTouchBehaviors();
+ resetTouchBehaviors(false);
mDisallowInterceptReset = true;
}
}
diff --git a/design/tests/AndroidManifest.xml b/design/tests/AndroidManifest.xml
index c4673b3..756d7c1 100755
--- a/design/tests/AndroidManifest.xml
+++ b/design/tests/AndroidManifest.xml
@@ -89,6 +89,10 @@
android:name="android.support.design.widget.AppBarWithScrollbarsActivity"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar"/>
+ <activity
+ android:name="android.support.design.widget.AppBarHorizontalScrollingActivity"
+ android:theme="@style/Theme.AppCompat.NoActionBar"/>
+
</application>
</manifest>
diff --git a/design/tests/res/layout/design_appbar_horizontal_scrolling.xml b/design/tests/res/layout/design_appbar_horizontal_scrolling.xml
new file mode 100644
index 0000000..131a07e
--- /dev/null
+++ b/design/tests/res/layout/design_appbar_horizontal_scrolling.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<android.support.design.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <android.support.design.widget.AppBarLayout
+ android:id="@+id/app_bar"
+ android:layout_width="match_parent"
+ android:layout_height="200dp"
+ android:fitsSystemWindows="true">
+
+ <android.support.design.widget.CollapsingToolbarLayout
+ android:id="@+id/toolbar_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true"
+ app:contentScrim="?attr/colorPrimary"
+ app:layout_scrollFlags="scroll|exitUntilCollapsed">
+
+ <HorizontalScrollView
+ android:id="@+id/hsv"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <View
+ android:layout_width="200dp"
+ android:layout_height="200dp"
+ android:background="#ff0000"/>
+
+ <View
+ android:layout_width="900dp"
+ android:layout_height="200dp"
+ android:background="#00ff00"/>
+
+ <View
+ android:layout_width="900dp"
+ android:layout_height="200dp"
+ android:background="#0000ff"/>
+ </LinearLayout>
+ </HorizontalScrollView>
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ app:layout_collapseMode="pin"/>
+
+ </android.support.design.widget.CollapsingToolbarLayout>
+ </android.support.design.widget.AppBarLayout>
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+ <Button
+ android:id="@+id/button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="24dp"
+ android:text="@string/text1"/>
+
+ </FrameLayout>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingActivity.java b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingActivity.java
new file mode 100644
index 0000000..960dbd9
--- /dev/null
+++ b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingActivity.java
@@ -0,0 +1,36 @@
+/*
+ * 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 android.support.design.widget;
+
+import android.os.Bundle;
+import android.support.design.test.R;
+import android.support.v7.widget.Toolbar;
+
+public class AppBarHorizontalScrollingActivity extends BaseTestActivity {
+ @Override
+ protected int getContentViewLayoutResId() {
+ return R.layout.design_appbar_horizontal_scrolling;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ }
+}
diff --git a/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingTest.java b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingTest.java
new file mode 100644
index 0000000..ccda8b0
--- /dev/null
+++ b/design/tests/src/android/support/design/widget/AppBarHorizontalScrollingTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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 android.support.design.widget;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.swipeLeft;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.verify;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.os.SystemClock;
+import android.support.design.test.R;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.HorizontalScrollView;
+
+import org.junit.Test;
+
+/**
+ * Testing that if we have a {@link AppBarLayout} child that intercepts touch events (such as
+ * {@link HorizontalScrollView} that handles horizontal swipes), that does not interfere with
+ * event handling after the event sequence is no longer being intercepted by that child.
+ */
+@LargeTest
+public class AppBarHorizontalScrollingTest extends
+ BaseInstrumentationTestCase<AppBarHorizontalScrollingActivity> {
+
+ public AppBarHorizontalScrollingTest() {
+ super(AppBarHorizontalScrollingActivity.class);
+ }
+
+ @Test
+ public void testScrollAndClick() throws Throwable {
+ final Activity activity = mActivityTestRule.getActivity();
+ final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+
+ final Button button = activity.findViewById(R.id.button);
+ final View.OnClickListener mockClickListener = mock(View.OnClickListener.class);
+ button.setOnClickListener(mockClickListener);
+
+ // Emulate a click on the button to verify that the registered listener is invoked
+ // prior to performing a horizontal swipe across the app bar
+ final int[] buttonXY = new int[2];
+ button.getLocationOnScreen(buttonXY);
+ final int buttonWidth = button.getWidth();
+ final int buttonHeight = button.getHeight();
+ final float emulatedTapX = buttonXY[0] + buttonWidth / 2.0f;
+ final float emulatedTapY = buttonXY[1] + buttonHeight / 2.0f;
+
+ emulateButtonClick(instrumentation, emulatedTapX, emulatedTapY);
+ verify(mockClickListener).onClick(button);
+ reset(mockClickListener);
+
+ final HorizontalScrollView hsv = activity.findViewById(R.id.hsv);
+ final int scrollXBefore = hsv.getScrollX();
+ // Now scroll / swipe horizontally across our scrollable content in the app bar
+ onView(withId(R.id.app_bar)).perform(swipeLeft());
+ assertTrue("Horizontal scroll performed", hsv.getScrollX() > scrollXBefore);
+
+ // And emulate another click on the button to verify that the registered listener is still
+ // invoked immediately after performing the horizontal swipe across the app bar
+ emulateButtonClick(instrumentation, emulatedTapX, emulatedTapY);
+ verify(mockClickListener).onClick(button);
+ }
+
+ private void emulateButtonClick(Instrumentation instrumentation, float emulatedTapX,
+ float emulatedTapY) {
+ // Note that the reason to not use Espresso's click() view action is so that we can
+ // faithfully emulate what was happening in the reported bug. We don't want the events
+ // to be sent directly to the button, but rather be processed by the parent coordinator
+ // layout, so that we reproduce what is happening as the events are processed at the level
+ // of that parent.
+
+ // Inject DOWN event
+ long downTime = SystemClock.uptimeMillis();
+ MotionEvent eventDown = MotionEvent.obtain(
+ downTime, downTime, MotionEvent.ACTION_DOWN, emulatedTapX, emulatedTapY, 1);
+ instrumentation.sendPointerSync(eventDown);
+
+ // Inject MOVE event
+ long moveTime = SystemClock.uptimeMillis();
+ MotionEvent eventMove = MotionEvent.obtain(
+ moveTime, moveTime, MotionEvent.ACTION_MOVE, emulatedTapX, emulatedTapY, 1);
+ instrumentation.sendPointerSync(eventMove);
+
+ // Inject UP event
+ long upTime = SystemClock.uptimeMillis();
+ MotionEvent eventUp = MotionEvent.obtain(
+ upTime, upTime, MotionEvent.ACTION_UP, emulatedTapX, emulatedTapY, 1);
+ instrumentation.sendPointerSync(eventUp);
+
+ // Wait for the system to process all events in the queue
+ instrumentation.waitForIdleSync();
+ }
+}
diff --git a/design/tests/src/android/support/design/widget/BaseTestActivity.java b/design/tests/src/android/support/design/widget/BaseTestActivity.java
index bdeb231..4662001 100755
--- a/design/tests/src/android/support/design/widget/BaseTestActivity.java
+++ b/design/tests/src/android/support/design/widget/BaseTestActivity.java
@@ -17,6 +17,7 @@
package android.support.design.widget;
import android.os.Bundle;
+import android.support.annotation.LayoutRes;
import android.support.design.testutils.RecreatedAppCompatActivity;
import android.view.WindowManager;
@@ -44,6 +45,7 @@
overridePendingTransition(0, 0);
}
+ @LayoutRes
protected abstract int getContentViewLayoutResId();
protected void onContentViewSet() {}
diff --git a/droiddoc.mk b/droiddoc.mk
deleted file mode 100644
index 0913f5f..0000000
--- a/droiddoc.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-# 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.
-#
-
-# API Level information for the Support Library, which is currently
-# included as part of the core framework docs build.
-SUPPORT_PATH := $(call my-dir)
-
-framework_docs_LOCAL_DROIDDOC_OPTIONS += \
- -since $(SUPPORT_PATH)/api/22.0.0.txt 22.0.0 \
- -since $(SUPPORT_PATH)/api/22.1.0.txt 22.1.0 \
- -since $(SUPPORT_PATH)/api/22.2.0.txt 22.2.0 \
- -since $(SUPPORT_PATH)/api/22.2.1.txt 22.2.1 \
- -since $(SUPPORT_PATH)/api/23.0.0.txt 23.0.0 \
- -since $(SUPPORT_PATH)/api/23.1.0.txt 23.1.0 \
- -since $(SUPPORT_PATH)/api/23.1.1.txt 23.1.1 \
- -since $(SUPPORT_PATH)/api/23.2.0.txt 23.2.0 \
- -since $(SUPPORT_PATH)/api/23.2.1.txt 23.2.1 \
- -since $(SUPPORT_PATH)/api/23.4.0.txt 23.4.0 \
- -since $(SUPPORT_PATH)/api/24.0.0.txt 24.0.0 \
- -since $(SUPPORT_PATH)/api/24.1.0.txt 24.1.0 \
- -since $(SUPPORT_PATH)/api/24.2.0.txt 24.2.0 \
- -since $(SUPPORT_PATH)/api/25.0.0.txt 25.0.0 \
- -since $(SUPPORT_PATH)/api/25.1.0.txt 25.1.0 \
- -since $(SUPPORT_PATH)/api/25.2.0.txt 25.2.0 \
- -since $(SUPPORT_PATH)/api/25.3.0.txt 25.3.0 \
- -since $(SUPPORT_PATH)/api/25.4.0.txt 25.4.0 \
- -since $(SUPPORT_PATH)/api/26.0.0-alpha1.txt 26.0.0-alpha1 \
- -since $(SUPPORT_PATH)/api/26.0.0-beta1.txt 26.0.0-beta1 \
- -since $(SUPPORT_PATH)/api/26.0.0-beta2.txt 26.0.0-beta2
diff --git a/dynamic-animation/AndroidManifest.xml b/dynamic-animation/AndroidManifest.xml
index f818402..a46ea43 100644
--- a/dynamic-animation/AndroidManifest.xml
+++ b/dynamic-animation/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.dynamicanimation">
<uses-sdk android:minSdkVersion="16"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.dynamicanimation.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/dynamic-animation/api/26.1.0-SNAPSHOT.txt b/dynamic-animation/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from dynamic-animation/api/26.1.0-SNAPSHOT.txt
rename to dynamic-animation/api/27.0.0-SNAPSHOT.txt
diff --git a/dynamic-animation/build.gradle b/dynamic-animation/build.gradle
index 2667bef..8ceaaf3 100644
--- a/dynamic-animation/build.gradle
+++ b/dynamic-animation/build.gradle
@@ -3,14 +3,10 @@
dependencies {
api project(':support-core-utils')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
}
android {
diff --git a/emoji/appcompat/AndroidManifest.xml b/emoji/appcompat/AndroidManifest.xml
index b44bda7..8261137 100644
--- a/emoji/appcompat/AndroidManifest.xml
+++ b/emoji/appcompat/AndroidManifest.xml
@@ -18,6 +18,7 @@
package="android.support.text.emoji.appcompat">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.text.emoji.appcompat.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/emoji/appcompat/api/26.1.0-SNAPSHOT.txt b/emoji/appcompat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from emoji/appcompat/api/26.1.0-SNAPSHOT.txt
rename to emoji/appcompat/api/27.0.0-SNAPSHOT.txt
diff --git a/emoji/appcompat/build.gradle b/emoji/appcompat/build.gradle
index 05bff7f..a545352 100644
--- a/emoji/appcompat/build.gradle
+++ b/emoji/appcompat/build.gradle
@@ -23,8 +23,6 @@
}
android {
- compileSdkVersion project.ext.currentSdk
-
defaultConfig {
minSdkVersion 14
}
diff --git a/emoji/bundled/AndroidManifest.xml b/emoji/bundled/AndroidManifest.xml
index 3d3a684..a2b14cf 100644
--- a/emoji/bundled/AndroidManifest.xml
+++ b/emoji/bundled/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.text.emoji.bundled">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.text.emoji.bundled.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
\ No newline at end of file
diff --git a/emoji/bundled/api/26.1.0-SNAPSHOT.txt b/emoji/bundled/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from emoji/bundled/api/26.1.0-SNAPSHOT.txt
rename to emoji/bundled/api/27.0.0-SNAPSHOT.txt
diff --git a/emoji/bundled/build.gradle b/emoji/bundled/build.gradle
index 1309a72..10eecb2 100644
--- a/emoji/bundled/build.gradle
+++ b/emoji/bundled/build.gradle
@@ -5,8 +5,6 @@
}
android {
- compileSdkVersion project.ext.currentSdk
-
defaultConfig {
minSdkVersion 14
}
diff --git a/emoji/core/AndroidManifest.xml b/emoji/core/AndroidManifest.xml
index 1a7b7f4..1143f40 100644
--- a/emoji/core/AndroidManifest.xml
+++ b/emoji/core/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.text.emoji">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.text.emoji.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/emoji/core/api/26.1.0-SNAPSHOT.txt b/emoji/core/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from emoji/core/api/26.1.0-SNAPSHOT.txt
rename to emoji/core/api/27.0.0-SNAPSHOT.txt
diff --git a/emoji/core/build.gradle b/emoji/core/build.gradle
index 75d1b45..31de0d0 100644
--- a/emoji/core/build.gradle
+++ b/emoji/core/build.gradle
@@ -16,20 +16,14 @@
api project(':support-compat')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
androidTestImplementation project(':support-testutils')
}
android {
- compileSdkVersion project.ext.currentSdk
-
defaultConfig {
minSdkVersion 14
}
diff --git a/exifinterface/AndroidManifest.xml b/exifinterface/AndroidManifest.xml
index 344b99b..8c449f7 100644
--- a/exifinterface/AndroidManifest.xml
+++ b/exifinterface/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.exifinterface">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.exifinterface.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/exifinterface/api/26.1.0-SNAPSHOT.txt b/exifinterface/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from exifinterface/api/26.1.0-SNAPSHOT.txt
rename to exifinterface/api/27.0.0-SNAPSHOT.txt
diff --git a/exifinterface/build.gradle b/exifinterface/build.gradle
index 26b6069..5a9d602 100644
--- a/exifinterface/build.gradle
+++ b/exifinterface/build.gradle
@@ -3,9 +3,7 @@
dependencies {
api project(':support-annotations')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
}
android {
diff --git a/fragment/AndroidManifest.xml b/fragment/AndroidManifest.xml
index 725fe43..4d532bd 100644
--- a/fragment/AndroidManifest.xml
+++ b/fragment/AndroidManifest.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
package="android.support.fragment">
- <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.fragment"/>
+ <uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.fragment.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/fragment/api/26.1.0-SNAPSHOT.txt b/fragment/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from fragment/api/26.1.0-SNAPSHOT.txt
rename to fragment/api/27.0.0-SNAPSHOT.txt
diff --git a/fragment/build.gradle b/fragment/build.gradle
index 0f030c4..b484bc4 100644
--- a/fragment/build.gradle
+++ b/fragment/build.gradle
@@ -6,14 +6,10 @@
api project(':support-core-utils')
api project(':support-annotations')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
}
android {
diff --git a/fragment/java/android/support/v4/app/Fragment.java b/fragment/java/android/support/v4/app/Fragment.java
index f8e3d47..7639568 100644
--- a/fragment/java/android/support/v4/app/Fragment.java
+++ b/fragment/java/android/support/v4/app/Fragment.java
@@ -39,7 +39,6 @@
import android.support.v4.util.SimpleArrayMap;
import android.support.v4.view.LayoutInflaterCompat;
import android.util.AttributeSet;
-import android.util.Log;
import android.util.SparseArray;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
@@ -57,119 +56,6 @@
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
-final class FragmentState implements Parcelable {
- final String mClassName;
- final int mIndex;
- final boolean mFromLayout;
- final int mFragmentId;
- final int mContainerId;
- final String mTag;
- final boolean mRetainInstance;
- final boolean mDetached;
- final Bundle mArguments;
- final boolean mHidden;
-
- Bundle mSavedFragmentState;
-
- Fragment mInstance;
-
- public FragmentState(Fragment frag) {
- mClassName = frag.getClass().getName();
- mIndex = frag.mIndex;
- mFromLayout = frag.mFromLayout;
- mFragmentId = frag.mFragmentId;
- mContainerId = frag.mContainerId;
- mTag = frag.mTag;
- mRetainInstance = frag.mRetainInstance;
- mDetached = frag.mDetached;
- mArguments = frag.mArguments;
- mHidden = frag.mHidden;
- }
-
- public FragmentState(Parcel in) {
- mClassName = in.readString();
- mIndex = in.readInt();
- mFromLayout = in.readInt() != 0;
- mFragmentId = in.readInt();
- mContainerId = in.readInt();
- mTag = in.readString();
- mRetainInstance = in.readInt() != 0;
- mDetached = in.readInt() != 0;
- mArguments = in.readBundle();
- mHidden = in.readInt() != 0;
- mSavedFragmentState = in.readBundle();
- }
-
- public Fragment instantiate(FragmentHostCallback host, FragmentContainer container,
- Fragment parent, FragmentManagerNonConfig childNonConfig) {
- if (mInstance == null) {
- final Context context = host.getContext();
- if (mArguments != null) {
- mArguments.setClassLoader(context.getClassLoader());
- }
-
- if (container != null) {
- mInstance = container.instantiate(context, mClassName, mArguments);
- } else {
- mInstance = Fragment.instantiate(context, mClassName, mArguments);
- }
-
- if (mSavedFragmentState != null) {
- mSavedFragmentState.setClassLoader(context.getClassLoader());
- mInstance.mSavedFragmentState = mSavedFragmentState;
- }
- mInstance.setIndex(mIndex, parent);
- mInstance.mFromLayout = mFromLayout;
- mInstance.mRestored = true;
- mInstance.mFragmentId = mFragmentId;
- mInstance.mContainerId = mContainerId;
- mInstance.mTag = mTag;
- mInstance.mRetainInstance = mRetainInstance;
- mInstance.mDetached = mDetached;
- mInstance.mHidden = mHidden;
- mInstance.mFragmentManager = host.mFragmentManager;
-
- if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
- "Instantiated fragment " + mInstance);
- }
- mInstance.mChildNonConfig = childNonConfig;
- return mInstance;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(mClassName);
- dest.writeInt(mIndex);
- dest.writeInt(mFromLayout ? 1 : 0);
- dest.writeInt(mFragmentId);
- dest.writeInt(mContainerId);
- dest.writeString(mTag);
- dest.writeInt(mRetainInstance ? 1 : 0);
- dest.writeInt(mDetached ? 1 : 0);
- dest.writeBundle(mArguments);
- dest.writeInt(mHidden? 1 : 0);
- dest.writeBundle(mSavedFragmentState);
- }
-
- public static final Parcelable.Creator<FragmentState> CREATOR
- = new Parcelable.Creator<FragmentState>() {
- @Override
- public FragmentState createFromParcel(Parcel in) {
- return new FragmentState(in);
- }
-
- @Override
- public FragmentState[] newArray(int size) {
- return new FragmentState[size];
- }
- };
-}
-
/**
* Static library support version of the framework's {@link android.app.Fragment}.
* Used to write apps that run on platforms prior to Android 3.0. When running
diff --git a/fragment/java/android/support/v4/app/FragmentState.java b/fragment/java/android/support/v4/app/FragmentState.java
new file mode 100644
index 0000000..dbe6327
--- /dev/null
+++ b/fragment/java/android/support/v4/app/FragmentState.java
@@ -0,0 +1,137 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.Log;
+
+final class FragmentState implements Parcelable {
+ final String mClassName;
+ final int mIndex;
+ final boolean mFromLayout;
+ final int mFragmentId;
+ final int mContainerId;
+ final String mTag;
+ final boolean mRetainInstance;
+ final boolean mDetached;
+ final Bundle mArguments;
+ final boolean mHidden;
+
+ Bundle mSavedFragmentState;
+
+ Fragment mInstance;
+
+ FragmentState(Fragment frag) {
+ mClassName = frag.getClass().getName();
+ mIndex = frag.mIndex;
+ mFromLayout = frag.mFromLayout;
+ mFragmentId = frag.mFragmentId;
+ mContainerId = frag.mContainerId;
+ mTag = frag.mTag;
+ mRetainInstance = frag.mRetainInstance;
+ mDetached = frag.mDetached;
+ mArguments = frag.mArguments;
+ mHidden = frag.mHidden;
+ }
+
+ FragmentState(Parcel in) {
+ mClassName = in.readString();
+ mIndex = in.readInt();
+ mFromLayout = in.readInt() != 0;
+ mFragmentId = in.readInt();
+ mContainerId = in.readInt();
+ mTag = in.readString();
+ mRetainInstance = in.readInt() != 0;
+ mDetached = in.readInt() != 0;
+ mArguments = in.readBundle();
+ mHidden = in.readInt() != 0;
+ mSavedFragmentState = in.readBundle();
+ }
+
+ public Fragment instantiate(FragmentHostCallback host, FragmentContainer container,
+ Fragment parent, FragmentManagerNonConfig childNonConfig) {
+ if (mInstance == null) {
+ final Context context = host.getContext();
+ if (mArguments != null) {
+ mArguments.setClassLoader(context.getClassLoader());
+ }
+
+ if (container != null) {
+ mInstance = container.instantiate(context, mClassName, mArguments);
+ } else {
+ mInstance = Fragment.instantiate(context, mClassName, mArguments);
+ }
+
+ if (mSavedFragmentState != null) {
+ mSavedFragmentState.setClassLoader(context.getClassLoader());
+ mInstance.mSavedFragmentState = mSavedFragmentState;
+ }
+ mInstance.setIndex(mIndex, parent);
+ mInstance.mFromLayout = mFromLayout;
+ mInstance.mRestored = true;
+ mInstance.mFragmentId = mFragmentId;
+ mInstance.mContainerId = mContainerId;
+ mInstance.mTag = mTag;
+ mInstance.mRetainInstance = mRetainInstance;
+ mInstance.mDetached = mDetached;
+ mInstance.mHidden = mHidden;
+ mInstance.mFragmentManager = host.mFragmentManager;
+
+ if (FragmentManagerImpl.DEBUG) {
+ Log.v(FragmentManagerImpl.TAG, "Instantiated fragment " + mInstance);
+ }
+ }
+ mInstance.mChildNonConfig = childNonConfig;
+ return mInstance;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mClassName);
+ dest.writeInt(mIndex);
+ dest.writeInt(mFromLayout ? 1 : 0);
+ dest.writeInt(mFragmentId);
+ dest.writeInt(mContainerId);
+ dest.writeString(mTag);
+ dest.writeInt(mRetainInstance ? 1 : 0);
+ dest.writeInt(mDetached ? 1 : 0);
+ dest.writeBundle(mArguments);
+ dest.writeInt(mHidden ? 1 : 0);
+ dest.writeBundle(mSavedFragmentState);
+ }
+
+ public static final Parcelable.Creator<FragmentState> CREATOR =
+ new Parcelable.Creator<FragmentState>() {
+ @Override
+ public FragmentState createFromParcel(Parcel in) {
+ return new FragmentState(in);
+ }
+
+ @Override
+ public FragmentState[] newArray(int size) {
+ return new FragmentState[size];
+ }
+ };
+}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 2a386c4..4e68a5b 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=../../../../tools/external/gradle/gradle-4.1-milestone-1-bin.zip
+distributionUrl=../../../../tools/external/gradle/gradle-4.1-rc-2-bin.zip
diff --git a/graphics/drawable/animated/AndroidManifest.xml b/graphics/drawable/animated/AndroidManifest.xml
index b59fa47..ec4a4a6 100644
--- a/graphics/drawable/animated/AndroidManifest.xml
+++ b/graphics/drawable/animated/AndroidManifest.xml
@@ -17,6 +17,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.support.graphics.drawable.animated">
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.graphics.drawable.animated.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/graphics/drawable/animated/api/26.1.0-SNAPSHOT.txt b/graphics/drawable/animated/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from graphics/drawable/animated/api/26.1.0-SNAPSHOT.txt
rename to graphics/drawable/animated/api/27.0.0-SNAPSHOT.txt
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
index f218e0b..3dcf04c 100644
--- a/graphics/drawable/animated/build.gradle
+++ b/graphics/drawable/animated/build.gradle
@@ -4,12 +4,8 @@
api project(':support-vector-drawable')
api project(':support-core-ui')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
}
android {
diff --git a/graphics/drawable/static/AndroidManifest.xml b/graphics/drawable/static/AndroidManifest.xml
index 14821a8..d8427ca 100644
--- a/graphics/drawable/static/AndroidManifest.xml
+++ b/graphics/drawable/static/AndroidManifest.xml
@@ -17,6 +17,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.support.graphics.drawable">
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.graphics.drawable.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/graphics/drawable/static/api/26.1.0-SNAPSHOT.txt b/graphics/drawable/static/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from graphics/drawable/static/api/26.1.0-SNAPSHOT.txt
rename to graphics/drawable/static/api/27.0.0-SNAPSHOT.txt
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index e820bb1..d3b517f 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -4,9 +4,7 @@
api project(':support-annotations')
api project(':support-compat')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
}
android {
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
index b68ef1b..2c7ae41 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
@@ -47,8 +47,8 @@
import android.support.v4.graphics.PathParser;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.util.ArrayMap;
+import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
-import android.util.LayoutDirection;
import android.util.Log;
import android.util.Xml;
@@ -820,7 +820,7 @@
private boolean needMirroring() {
if (Build.VERSION.SDK_INT >= 17) {
return isAutoMirrored()
- && DrawableCompat.getLayoutDirection(this) == LayoutDirection.RTL;
+ && DrawableCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;
} else {
return false;
}
@@ -1642,13 +1642,14 @@
/////////////////////////////////////////////////////
// Variables below need to be copied (deep copy if applicable) for mutation.
private int[] mThemeAttrs;
-
+ private static final int FILL_TYPE_WINDING = 0;
int mStrokeColor = Color.TRANSPARENT;
float mStrokeWidth = 0;
int mFillColor = Color.TRANSPARENT;
float mStrokeAlpha = 1.0f;
- int mFillRule = 0; // 0 is default value as "non-zero" fill type.
+ // Default fill rule is winding, or as known as "non-zero".
+ int mFillRule = FILL_TYPE_WINDING;
float mFillAlpha = 1.0f;
float mTrimPathStart = 0;
float mTrimPathEnd = 1;
diff --git a/lifecycle/common/build.gradle b/lifecycle/common/build.gradle
index 1b64d9d..d237d30 100644
--- a/lifecycle/common/build.gradle
+++ b/lifecycle/common/build.gradle
@@ -1,3 +1,5 @@
+import android.support.LibraryVersions
+
apply plugin: 'java'
apply plugin: 'maven'
@@ -10,4 +12,4 @@
}
createAndroidCheckstyle(project)
-version = "1.0.0-SNAPSHOT"
\ No newline at end of file
+version = LibraryVersions.LIFECYCLES.toString()
\ No newline at end of file
diff --git a/lifecycle/reactivestreams/src/main/AndroidManifest.xml b/lifecycle/reactivestreams/src/main/AndroidManifest.xml
index 2210041..c7b09a2 100644
--- a/lifecycle/reactivestreams/src/main/AndroidManifest.xml
+++ b/lifecycle/reactivestreams/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.arch.lifecycle.reactivestreams">
+ <application>
+ <meta-data android:name="android.arch.lifecycle.reactivestreams.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/lifecycle/runtime/build.gradle b/lifecycle/runtime/build.gradle
index 36d9126..926b9a2 100644
--- a/lifecycle/runtime/build.gradle
+++ b/lifecycle/runtime/build.gradle
@@ -1,3 +1,5 @@
+import android.support.LibraryVersions
+
apply plugin: 'com.android.library'
apply plugin: 'maven'
@@ -44,4 +46,4 @@
}
createAndroidCheckstyle(project)
-version = "1.0.0-SNAPSHOT"
+version = LibraryVersions.LIFECYCLES.toString()
diff --git a/lifecycle/runtime/src/main/AndroidManifest.xml b/lifecycle/runtime/src/main/AndroidManifest.xml
index 274a076..5641eac 100644
--- a/lifecycle/runtime/src/main/AndroidManifest.xml
+++ b/lifecycle/runtime/src/main/AndroidManifest.xml
@@ -17,4 +17,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.arch.lifecycle">
+ <application>
+ <meta-data android:name="android.arch.lifecycle.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/media-compat/AndroidManifest.xml b/media-compat/AndroidManifest.xml
index f5e74a2..8a65eba 100644
--- a/media-compat/AndroidManifest.xml
+++ b/media-compat/AndroidManifest.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
package="android.support.mediacompat">
- <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.mediacompat"/>
+ <uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.mediacompat.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/media-compat/api/26.1.0-SNAPSHOT.txt b/media-compat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from media-compat/api/26.1.0-SNAPSHOT.txt
rename to media-compat/api/27.0.0-SNAPSHOT.txt
diff --git a/media-compat/build.gradle b/media-compat/build.gradle
index 3d8463a..8d192ed 100644
--- a/media-compat/build.gradle
+++ b/media-compat/build.gradle
@@ -4,14 +4,10 @@
api project(':support-annotations')
api project(':support-compat')
- androidTestImplementation(libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation(libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
androidTestImplementation project(':support-testutils')
}
diff --git a/paging/runtime/src/main/AndroidManifest.xml b/paging/runtime/src/main/AndroidManifest.xml
index 95247e5..75dcf2c 100644
--- a/paging/runtime/src/main/AndroidManifest.xml
+++ b/paging/runtime/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.arch.util.paging.runtime">
+ <application>
+ <meta-data android:name="android.arch.util.paging.runtime.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/percent/AndroidManifest.xml b/percent/AndroidManifest.xml
index 58eebfe..db8dfa2 100644
--- a/percent/AndroidManifest.xml
+++ b/percent/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.percent">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.percent.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/percent/api/26.1.0-SNAPSHOT.txt b/percent/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from percent/api/26.1.0-SNAPSHOT.txt
rename to percent/api/27.0.0-SNAPSHOT.txt
diff --git a/percent/build.gradle b/percent/build.gradle
index 4738118..17d1a96 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -3,12 +3,8 @@
dependencies {
api project(':support-compat')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
}
android {
diff --git a/recommendation/AndroidManifest.xml b/recommendation/AndroidManifest.xml
index 09017e0..031e250 100644
--- a/recommendation/AndroidManifest.xml
+++ b/recommendation/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.recommendation">
<uses-sdk android:minSdkVersion="21"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.recommendation.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/recommendation/api/26.1.0-SNAPSHOT.txt b/recommendation/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from recommendation/api/26.1.0-SNAPSHOT.txt
rename to recommendation/api/27.0.0-SNAPSHOT.txt
diff --git a/recommendation/build.gradle b/recommendation/build.gradle
index 8b660f2..5da5c61 100644
--- a/recommendation/build.gradle
+++ b/recommendation/build.gradle
@@ -1,7 +1,7 @@
apply plugin: android.support.SupportLibraryPlugin
dependencies {
- api project(':support-v4')
+ api project(':support-annotations')
}
android {
@@ -12,8 +12,6 @@
sourceSets {
main.java.srcDirs = ['src']
main.res.srcDir 'res'
- main.assets.srcDir 'assets'
- main.resources.srcDir 'src'
}
}
diff --git a/room/db-impl/src/main/AndroidManifest.xml b/room/db-impl/src/main/AndroidManifest.xml
index 9350b90..89d09af 100644
--- a/room/db-impl/src/main/AndroidManifest.xml
+++ b/room/db-impl/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.arch.persistence.db.framework">
+ <application>
+ <meta-data android:name="android.arch.persistence.db.framework.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/room/db/src/main/AndroidManifest.xml b/room/db/src/main/AndroidManifest.xml
index 8a27324..5894255 100644
--- a/room/db/src/main/AndroidManifest.xml
+++ b/room/db/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.arch.persistence.db">
+ <application>
+ <meta-data android:name="android.arch.persistence.db.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/room/runtime/src/main/AndroidManifest.xml b/room/runtime/src/main/AndroidManifest.xml
index 54a5b36..79ffb93 100644
--- a/room/runtime/src/main/AndroidManifest.xml
+++ b/room/runtime/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.arch.persistence.room">
+ <application>
+ <meta-data android:name="android.arch.persistence.room.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/room/rxjava2/src/main/AndroidManifest.xml b/room/rxjava2/src/main/AndroidManifest.xml
index 33279c6..958f331 100644
--- a/room/rxjava2/src/main/AndroidManifest.xml
+++ b/room/rxjava2/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.arch.persistence.room.rxjava2">
+ <application>
+ <meta-data android:name="android.arch.persistence.room.rxjava2.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/room/testing/src/main/AndroidManifest.xml b/room/testing/src/main/AndroidManifest.xml
index 594f016..3e6414c 100644
--- a/room/testing/src/main/AndroidManifest.xml
+++ b/room/testing/src/main/AndroidManifest.xml
@@ -16,4 +16,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.arch.persistence.room.testing">
+ <application>
+ <meta-data android:name="android.arch.persistence.room.testing.VERSION"
+ android:value="${version}" />
+ </application>
</manifest>
diff --git a/samples/Support13Demos/build.gradle b/samples/Support13Demos/build.gradle
index 4c015ae..f647e40 100644
--- a/samples/Support13Demos/build.gradle
+++ b/samples/Support13Demos/build.gradle
@@ -15,7 +15,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -33,8 +32,8 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
diff --git a/samples/Support4Demos/build.gradle b/samples/Support4Demos/build.gradle
index e265698..e9d6b5a 100644
--- a/samples/Support4Demos/build.gradle
+++ b/samples/Support4Demos/build.gradle
@@ -15,7 +15,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -33,8 +32,8 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
diff --git a/samples/Support7Demos/build.gradle b/samples/Support7Demos/build.gradle
index 2e3ac33..65b19ea 100644
--- a/samples/Support7Demos/build.gradle
+++ b/samples/Support7Demos/build.gradle
@@ -21,7 +21,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -38,8 +37,7 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
-
diff --git a/samples/SupportAnimationDemos/build.gradle b/samples/SupportAnimationDemos/build.gradle
index d1ea614..ea8038e 100644
--- a/samples/SupportAnimationDemos/build.gradle
+++ b/samples/SupportAnimationDemos/build.gradle
@@ -15,7 +15,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -32,8 +31,8 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
diff --git a/samples/SupportAppNavigation/build.gradle b/samples/SupportAppNavigation/build.gradle
index c7d03b8..fdd72b6 100644
--- a/samples/SupportAppNavigation/build.gradle
+++ b/samples/SupportAppNavigation/build.gradle
@@ -47,7 +47,7 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
diff --git a/samples/SupportContentDemos/.gitignore b/samples/SupportContentDemos/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/samples/SupportContentDemos/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/samples/SupportContentDemos/build.gradle b/samples/SupportContentDemos/build.gradle
new file mode 100644
index 0000000..7e204b1
--- /dev/null
+++ b/samples/SupportContentDemos/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+apply plugin: 'com.android.application'
+
+dependencies {
+ implementation project(':design')
+ implementation project(':appcompat-v7')
+ implementation project(':support-content')
+}
+
+android {
+ compileSdkVersion project.ext.currentSdk
+
+ defaultConfig {
+ applicationId "com.example.android.support.content.demos"
+ minSdkVersion 14
+ targetSdkVersion project.ext.currentSdk
+ }
+
+ lintOptions {
+ abortOnError true
+ disable "SetTextI18n", "AppCompatResource", "WrongConstant", "AllowBackup",
+ "GoogleAppIndexingWarning", "AlwaysShowAction"
+ }
+}
diff --git a/samples/SupportContentDemos/src/main/AndroidManifest.xml b/samples/SupportContentDemos/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f647d8e
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/AndroidManifest.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.android.support.content.demos">
+
+ <application
+ android:allowBackup="true"
+ android:icon="@mipmap/ic_launcher"
+ android:label="@string/app_name"
+ android:roundIcon="@mipmap/ic_launcher_round"
+ android:supportsRtl="true"
+ android:theme="@style/AppTheme">
+ <activity
+ android:name=".ContentPagerDemoActivity"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme.NoActionBar">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ </activity>
+
+ <provider
+ android:name=".UnpagedDemoDataProvider"
+ android:authorities="com.example.android.support.content.demos"
+ android:enabled="true"
+ android:exported="false">
+ </provider>
+ </application>
+
+</manifest>
diff --git a/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java b/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java
new file mode 100644
index 0000000..a496dd3
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/ContentPagerDemoActivity.java
@@ -0,0 +1,225 @@
+/*
+ * 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.example.android.support.content.demos;
+
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.content.ContentPager;
+import android.support.content.ContentPager.ContentCallback;
+import android.support.content.LoaderQueryRunner;
+import android.support.content.Query;
+import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.Snackbar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.Locale;
+
+/**
+ * ContentPager demo activity.
+ */
+public class ContentPagerDemoActivity extends AppCompatActivity {
+
+ private static final int PAGE_SIZE = 20;
+
+ private RecyclerView mRecycler;
+ private ContentPager mPager;
+ private Adapter mAdapter;
+ private FloatingActionButton mFab;
+ private Menu mMenu;
+ private int mCurrentPage = -1;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_demo);
+
+ ContentPager.QueryRunner runner = new LoaderQueryRunner(this, getLoaderManager());
+ mPager = new ContentPager(getContentResolver(), runner);
+ mAdapter = new Adapter(mPager, PAGE_SIZE);
+
+ mRecycler = (RecyclerView) findViewById(R.id.list);
+ mRecycler.setLayoutManager(new LinearLayoutManager(this));
+ mRecycler.setAdapter(mAdapter);
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ mPager.reset();
+ }
+
+ @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_demo, menu);
+ mMenu = menu;
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+
+ switch (item.getItemId()) {
+ case R.id.action_load:
+ onLoadContent();
+ break;
+ case R.id.action_previous:
+ onLoadPreviousPage();
+ break;
+ case R.id.action_next:
+ onLoadNextPage();
+ break;
+ }
+ // 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_load) {
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void onLoadContent() {
+ mAdapter.reset(UnpagedDemoDataProvider.URI);
+ mCurrentPage = 0;
+ mAdapter.loadPage(mCurrentPage);
+
+ updateOptionsMenu();
+ }
+
+ private void onLoadNextPage() {
+ mAdapter.loadPage(mCurrentPage + 1);
+
+ updateOptionsMenu();
+ }
+
+ private void onLoadPreviousPage() {
+ mAdapter.loadPage(mCurrentPage - 1);
+
+ updateOptionsMenu();
+ }
+
+ private void updateOptionsMenu() {
+ MenuItem prev = mMenu.findItem(R.id.action_previous);
+ MenuItem next = mMenu.findItem(R.id.action_next);
+
+ int lastPage = (UnpagedDemoDataProvider.TOTAL_SIZE / PAGE_SIZE) - 1;
+ prev.setEnabled(mCurrentPage > 0);
+ next.setEnabled(mCurrentPage < lastPage);
+ }
+
+ private void msg(String msg) {
+ Snackbar.make(
+ mRecycler,
+ msg, Snackbar.LENGTH_LONG)
+ .setAction("Action", null).show();
+ }
+
+ private final class Adapter extends RecyclerView.Adapter<Holder> implements ContentCallback {
+
+ private final ContentPager mPager;
+ private final int mPageSize;
+
+ private Uri mUri;
+ private Cursor mCursor;
+
+ private Adapter(ContentPager pager, int pageSize) {
+ mPager = pager;
+ mPageSize = pageSize;
+ }
+
+ private void reset(Uri uri) {
+ mUri = uri;
+ mCursor = null;
+ }
+
+ void loadPage(int page) {
+ if (page < 0 || page >= (UnpagedDemoDataProvider.TOTAL_SIZE / PAGE_SIZE)) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ mCurrentPage = page;
+ int offset = mCurrentPage * mPageSize;
+ mPager.query(mUri, null, ContentPager.createArgs(offset, mPageSize), null, this);
+ }
+
+ @Override
+ public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return new Holder(new TextView(ContentPagerDemoActivity.this));
+ }
+
+ @Override
+ public void onBindViewHolder(Holder holder, int position) {
+ if (!mCursor.moveToPosition(position)) {
+ holder.view.setText("Nope, couldn't position cursor to: " + position);
+ return;
+ }
+
+ holder.view.setText(String.format(Locale.US,
+ "%d.%d (%d): %s",
+ mCurrentPage,
+ mCursor.getInt(0),
+ mCursor.getLong(2),
+ mCursor.getString(1)));
+ }
+
+ @Override
+ public int getItemCount() {
+ return mCursor == null ? 0 : mCursor.getCount();
+ }
+
+ @Override
+ public void onCursorReady(@NonNull Query query, Cursor cursor) {
+ if (cursor == null) {
+ msg("Content query returned a null cursor: " + query.getUri());
+ }
+
+ mCurrentPage = query.getOffset() / mPageSize;
+ mCursor = cursor;
+ notifyDataSetChanged();
+ }
+
+ private int getCorpusSize(Bundle extras) {
+ return extras.getInt(ContentPager.EXTRA_TOTAL_COUNT, -1);
+ }
+ }
+
+ private class Holder extends RecyclerView.ViewHolder {
+
+ public final TextView view;
+
+ private Holder(TextView view) {
+ super(view);
+ this.view = view;
+ }
+ }
+}
diff --git a/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/UnpagedDemoDataProvider.java b/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/UnpagedDemoDataProvider.java
new file mode 100644
index 0000000..75b8c55
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/java/com/example/android/support/content/demos/UnpagedDemoDataProvider.java
@@ -0,0 +1,81 @@
+/*
+ * 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.example.android.support.content.demos;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+
+/**
+ * Provides test data for Content Pager Demo app.
+ */
+public class UnpagedDemoDataProvider extends ContentProvider {
+
+ public static final Uri URI =
+ Uri.parse("content://com.example.android.support.content.demos/poodles");
+
+ static final int TOTAL_SIZE = 100;
+ private static final String[] COLUMNS = new String[] {
+ "id",
+ "name",
+ "time"
+ };
+
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection,
+ String[] selectionArgs, String sortOrder) {
+ MatrixCursor cursor = new MatrixCursor(COLUMNS);
+ Object[] values = new Object[3];
+
+ for (int i = 0; i < TOTAL_SIZE; i++) {
+ values[0] = i;
+ values[1] = "I'm row number " + i;
+ values[2] = System.currentTimeMillis();
+ cursor.addRow(values);
+ }
+
+ return cursor;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection,
+ String[] selectionArgs) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+}
diff --git a/samples/SupportContentDemos/src/main/res/layout/activity_demo.xml b/samples/SupportContentDemos/src/main/res/layout/activity_demo.xml
new file mode 100644
index 0000000..f557f40
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/layout/activity_demo.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="com.example.android.support.content.demos.ContentPagerDemoActivity">
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ android:theme="@style/AppTheme.AppBarOverlay"
+ app:popupTheme="@style/AppTheme.PopupOverlay"/>
+
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
+</LinearLayout>
diff --git a/samples/SupportContentDemos/src/main/res/menu/menu_demo.xml b/samples/SupportContentDemos/src/main/res/menu/menu_demo.xml
new file mode 100644
index 0000000..7f0310c
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/menu/menu_demo.xml
@@ -0,0 +1,38 @@
+<!--
+ ~ 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.
+ -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="com.example.android.support.content.demos.ContentPagerDemoActivity">
+
+ <item android:id="@+id/action_load"
+ android:orderInCategory="100"
+ android:title="@string/action_load"
+ app:showAsAction="always"/>
+
+ <item android:id="@+id/action_previous"
+ android:orderInCategory="100"
+ android:title="@string/action_previous"
+ android:enabled="false"
+ app:showAsAction="always"/>
+
+ <item android:id="@+id/action_next"
+ android:orderInCategory="100"
+ android:title="@string/action_next"
+ android:enabled="false"
+ app:showAsAction="always"/>
+</menu>
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9a078e3
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..efc028a
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..3af2608
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9bec2e6
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..aee44e1
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..34947cd
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/samples/SupportContentDemos/src/main/res/values/colors.xml b/samples/SupportContentDemos/src/main/res/values/colors.xml
new file mode 100644
index 0000000..86b4304
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/values/colors.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<resources>
+ <color name="colorPrimary">#3F51B5</color>
+ <color name="colorPrimaryDark">#303F9F</color>
+ <color name="colorAccent">#FF4081</color>
+</resources>
diff --git a/samples/SupportContentDemos/src/main/res/values/strings.xml b/samples/SupportContentDemos/src/main/res/values/strings.xml
new file mode 100644
index 0000000..523dafe
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/values/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<resources>
+ <string name="app_name">Pager Demo</string>
+ <string name="action_load">Load</string>
+ <string name="action_previous">Previous</string>
+ <string name="action_next">Next</string>
+</resources>
diff --git a/samples/SupportContentDemos/src/main/res/values/styles.xml b/samples/SupportContentDemos/src/main/res/values/styles.xml
new file mode 100644
index 0000000..afb6bad
--- /dev/null
+++ b/samples/SupportContentDemos/src/main/res/values/styles.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<resources>
+
+ <!-- Base application theme. -->
+ <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+ <!-- Customize your theme here. -->
+ <item name="colorPrimary">@color/colorPrimary</item>
+ <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+ <item name="colorAccent">@color/colorAccent</item>
+ </style>
+ <style name="AppTheme.NoActionBar">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ </style>
+ <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
+ <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/>
+
+</resources>
diff --git a/samples/SupportDesignDemos/build.gradle b/samples/SupportDesignDemos/build.gradle
index 9dbf54b..ca4c12d 100644
--- a/samples/SupportDesignDemos/build.gradle
+++ b/samples/SupportDesignDemos/build.gradle
@@ -16,7 +16,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -33,8 +32,8 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
diff --git a/samples/SupportEmojiDemos/build.gradle b/samples/SupportEmojiDemos/build.gradle
index c5be42e..70b2909 100644
--- a/samples/SupportEmojiDemos/build.gradle
+++ b/samples/SupportEmojiDemos/build.gradle
@@ -54,7 +54,7 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/build.gradle b/samples/SupportLeanbackDemos/build.gradle
index 014cd16..1a69d94 100644
--- a/samples/SupportLeanbackDemos/build.gradle
+++ b/samples/SupportLeanbackDemos/build.gradle
@@ -16,7 +16,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -33,8 +32,8 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
diff --git a/samples/SupportLeanbackJank/build.gradle b/samples/SupportLeanbackJank/build.gradle
index 6db5dcf..2d40ef3 100644
--- a/samples/SupportLeanbackJank/build.gradle
+++ b/samples/SupportLeanbackJank/build.gradle
@@ -14,6 +14,13 @@
targetSdkVersion project.ext.currentSdk
}
+ buildTypes {
+ release {
+ minifyEnabled true
+ proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
+ }
+ }
+
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
diff --git a/samples/SupportLeanbackJank/res/raw/bbb_360p.mp4 b/samples/SupportLeanbackJank/res/raw/bbb_360p.mp4
new file mode 100644
index 0000000..46c9723
--- /dev/null
+++ b/samples/SupportLeanbackJank/res/raw/bbb_360p.mp4
Binary files differ
diff --git a/samples/SupportLeanbackJank/res/values/dimens.xml b/samples/SupportLeanbackJank/res/values/dimens.xml
index e2b1f9f..5557953 100644
--- a/samples/SupportLeanbackJank/res/values/dimens.xml
+++ b/samples/SupportLeanbackJank/res/values/dimens.xml
@@ -19,4 +19,6 @@
<dimen name="grid_item_height">100dp</dimen>
<dimen name="card_width">156dp</dimen>
<dimen name="card_height">88dp</dimen>
+ <dimen name="shadow_unfocused_z">0dp</dimen>
+ <dimen name="shadow_focused_z">10dp</dimen>
</resources>
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java
index 6d04cb0..7ce55a4 100644
--- a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java
+++ b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/IntentKeys.java
@@ -28,9 +28,10 @@
// Define values for WHICH_VIDEO.
public static final int NO_VIDEO = 0;
- public static final int VIDEO_480P_60FPS = 1;
- public static final int VIDEO_1080P_60FPS = 2;
- public static final int VIDEO_2160P_60FPS = 3;
+ public static final int VIDEO_360P_60FPS = 1;
+ public static final int VIDEO_480P_60FPS = 2;
+ public static final int VIDEO_1080P_60FPS = 3;
+ public static final int VIDEO_2160P_60FPS = 4;
private IntentKeys() {
}
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java
index d301c4e..61ab7c6 100644
--- a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java
+++ b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/presenter/CardPresenter.java
@@ -16,12 +16,16 @@
package com.google.android.leanbackjank.presenter;
+import android.net.Uri;
import android.support.v17.leanback.widget.ImageCardView;
import android.support.v17.leanback.widget.Presenter;
import android.support.v4.content.res.ResourcesCompat;
import android.view.ViewGroup;
import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.resource.drawable.GlideDrawable;
+import com.bumptech.glide.request.RequestListener;
+import com.bumptech.glide.request.target.Target;
import com.google.android.leanbackjank.R;
import com.google.android.leanbackjank.model.VideoInfo;
@@ -46,37 +50,44 @@
ImageCardView cardView = new ImageCardView(parent.getContext()) {
@Override
public void setSelected(boolean selected) {
- updateCardBackgroundColor(this, selected);
+ findViewById(R.id.info_field).setBackgroundColor(
+ selected ? mSelectedBackgroundColor : mDefaultBackgroundColor);
super.setSelected(selected);
}
};
cardView.setFocusable(true);
cardView.setFocusableInTouchMode(true);
- updateCardBackgroundColor(cardView, false);
return new ViewHolder(cardView);
}
- private void updateCardBackgroundColor(ImageCardView view, boolean selected) {
- int color = selected ? mSelectedBackgroundColor : mDefaultBackgroundColor;
-
- // Both background colors should be set because the view's
- // background is temporarily visible during animations.
- view.setBackgroundColor(color);
- view.findViewById(R.id.info_field).setBackgroundColor(color);
- }
-
@Override
public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
VideoInfo videoInfo = (VideoInfo) item;
- ImageCardView cardView = (ImageCardView) viewHolder.view;
+ final ImageCardView cardView = (ImageCardView) viewHolder.view;
cardView.setTitleText(videoInfo.getTitle());
cardView.setContentText(videoInfo.getStudio());
cardView.setMainImageDimensions(mCardWidth, mCardHeight);
+ cardView.setBackgroundColor(mDefaultBackgroundColor);
Glide.with(cardView.getContext())
.load(videoInfo.getImageUri())
+ .listener(new RequestListener<Uri, GlideDrawable>() {
+ @Override
+ public boolean onException(Exception e, Uri uri, Target<GlideDrawable> target,
+ boolean b) {
+ return false;
+ }
+
+ @Override
+ public boolean onResourceReady(GlideDrawable glideDrawable, Uri uri,
+ Target<GlideDrawable> target, boolean b, boolean b1) {
+ // Remove the background color to reduce overdraw.
+ cardView.setBackground(null);
+ return false;
+ }
+ })
.into(cardView.getMainImageView());
}
diff --git a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java
index 42abf3e..6869e46 100644
--- a/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java
+++ b/samples/SupportLeanbackJank/src/com/google/android/leanbackjank/ui/MainFragment.java
@@ -17,6 +17,7 @@
package com.google.android.leanbackjank.ui;
import android.content.Intent;
+import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.support.v17.leanback.app.BackgroundManager;
@@ -27,6 +28,7 @@
import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.Presenter;
import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.ShadowOverlayHelper;
import android.support.v4.content.res.ResourcesCompat;
import com.google.android.leanbackjank.IntentDefaults;
@@ -90,6 +92,8 @@
resource = R.raw.testvideo_1080p_60fps;
} else if (whichVideo == IntentKeys.VIDEO_480P_60FPS) {
resource = R.raw.bbb_480p;
+ } else if (whichVideo == IntentKeys.VIDEO_360P_60FPS) {
+ resource = R.raw.bbb_360p;
}
Uri uri = Uri.parse("android.resource://" + getActivity().getPackageName() + "/"
+ resource);
@@ -129,7 +133,16 @@
private void loadVideoData(int categoryCount, int entriesPerCat, boolean disableShadows,
boolean useSingleBitmap, int cardWidth, int cardHeight) {
- ListRowPresenter listRowPresenter = new ListRowPresenter();
+ ListRowPresenter listRowPresenter = new ListRowPresenter() {
+ @Override
+ protected ShadowOverlayHelper.Options createShadowOverlayOptions() {
+ Resources res = getResources();
+ ShadowOverlayHelper.Options options = new ShadowOverlayHelper.Options();
+ options.dynamicShadowZ(res.getDimension(R.dimen.shadow_unfocused_z),
+ res.getDimension(R.dimen.shadow_focused_z));
+ return options;
+ }
+ };
listRowPresenter.setShadowEnabled(!disableShadows);
mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
HashMap<String, List<VideoInfo>> data = VideoProvider.buildMedia(categoryCount,
diff --git a/samples/SupportPercentDemos/build.gradle b/samples/SupportPercentDemos/build.gradle
index f52f293..251678d 100644
--- a/samples/SupportPercentDemos/build.gradle
+++ b/samples/SupportPercentDemos/build.gradle
@@ -15,7 +15,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -32,8 +31,8 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
diff --git a/samples/SupportPreferenceDemos/build.gradle b/samples/SupportPreferenceDemos/build.gradle
index 0ed8424..6e78088 100644
--- a/samples/SupportPreferenceDemos/build.gradle
+++ b/samples/SupportPreferenceDemos/build.gradle
@@ -20,7 +20,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -37,7 +36,7 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
diff --git a/samples/SupportTransitionDemos/build.gradle b/samples/SupportTransitionDemos/build.gradle
index 720e2a2..6b34453 100644
--- a/samples/SupportTransitionDemos/build.gradle
+++ b/samples/SupportTransitionDemos/build.gradle
@@ -16,7 +16,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -33,8 +32,8 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
aaptOptions {
diff --git a/samples/SupportVectorDrawableDemos/build.gradle b/samples/SupportVectorDrawableDemos/build.gradle
index a3a4db6..c47967c 100644
--- a/samples/SupportVectorDrawableDemos/build.gradle
+++ b/samples/SupportVectorDrawableDemos/build.gradle
@@ -34,7 +34,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -51,8 +50,8 @@
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
}
}
diff --git a/samples/SupportWearDemos/build.gradle b/samples/SupportWearDemos/build.gradle
index df63aac..e980793 100644
--- a/samples/SupportWearDemos/build.gradle
+++ b/samples/SupportWearDemos/build.gradle
@@ -31,7 +31,6 @@
sourceSets {
main.manifest.srcFile 'AndroidManifest.xml'
main.java.srcDirs = ['src']
- main.aidl.srcDirs = ['src']
main.res.srcDirs = ['res']
}
@@ -53,4 +52,3 @@
targetCompatibility JavaVersion.VERSION_1_8
}
}
-
diff --git a/settings.gradle b/settings.gradle
index 6dd5d37..c281bb1 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -100,6 +100,9 @@
include ':support-emoji-appcompat'
project(':support-emoji-appcompat').projectDir = new File(rootDir, 'emoji/appcompat')
+include ':support-content'
+project(':support-content').projectDir = new File(rootDir, 'content')
+
/////////////////////////////
//
// Samples
@@ -108,6 +111,9 @@
File samplesRoot = new File(rootDir, 'samples')
+include ':support-content-demos'
+project(':support-content-demos').projectDir = new File(samplesRoot, 'SupportContentDemos')
+
include ':support-design-demos'
project(':support-design-demos').projectDir = new File(samplesRoot, 'SupportDesignDemos')
@@ -193,4 +199,4 @@
///// FLATFOOT START
-///// FLATFOOT END
\ No newline at end of file
+///// FLATFOOT END
diff --git a/transition/AndroidManifest.xml b/transition/AndroidManifest.xml
index 309b695..1b70510 100644
--- a/transition/AndroidManifest.xml
+++ b/transition/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.transition">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.transition.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/transition/api/26.1.0-SNAPSHOT.txt b/transition/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from transition/api/26.1.0-SNAPSHOT.txt
rename to transition/api/27.0.0-SNAPSHOT.txt
diff --git a/transition/build.gradle b/transition/build.gradle
index a7b8fca..5756785 100644
--- a/transition/build.gradle
+++ b/transition/build.gradle
@@ -5,14 +5,10 @@
api project(':support-compat')
compileOnly project(':support-fragment')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
androidTestImplementation project(':support-v4')
androidTestImplementation project(':appcompat-v7')
}
diff --git a/tv-provider/AndroidManifest.xml b/tv-provider/AndroidManifest.xml
index f07d090..f7569a6 100644
--- a/tv-provider/AndroidManifest.xml
+++ b/tv-provider/AndroidManifest.xml
@@ -19,6 +19,7 @@
<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
<uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" />
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.media.tv.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/tv-provider/api/26.1.0-SNAPSHOT.txt b/tv-provider/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from tv-provider/api/26.1.0-SNAPSHOT.txt
rename to tv-provider/api/27.0.0-SNAPSHOT.txt
diff --git a/tv-provider/build.gradle b/tv-provider/build.gradle
index 2a129f4..e9e204e 100644
--- a/tv-provider/build.gradle
+++ b/tv-provider/build.gradle
@@ -4,9 +4,7 @@
api project(':support-annotations')
api project(':support-compat')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
}
android {
diff --git a/v13/AndroidManifest.xml b/v13/AndroidManifest.xml
index 6eea520..6f5a696 100644
--- a/v13/AndroidManifest.xml
+++ b/v13/AndroidManifest.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
package="android.support.v13">
- <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.v13"/>
+ <uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v13.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v13/api/26.1.0-SNAPSHOT.txt b/v13/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v13/api/26.1.0-SNAPSHOT.txt
rename to v13/api/27.0.0-SNAPSHOT.txt
diff --git a/v13/build.gradle b/v13/build.gradle
index 8019c0e..95ff484 100644
--- a/v13/build.gradle
+++ b/v13/build.gradle
@@ -4,14 +4,10 @@
api project(':support-annotations')
api project(':support-v4')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
}
android {
diff --git a/v14/preference/AndroidManifest.xml b/v14/preference/AndroidManifest.xml
index 95bab75..18cc666 100644
--- a/v14/preference/AndroidManifest.xml
+++ b/v14/preference/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.v14.preference">
<uses-sdk android:minSdkVersion="14" />
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v14.preference.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v14/preference/api/26.1.0-SNAPSHOT.txt b/v14/preference/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v14/preference/api/26.1.0-SNAPSHOT.txt
rename to v14/preference/api/27.0.0-SNAPSHOT.txt
diff --git a/v17/leanback/AndroidManifest.xml b/v17/leanback/AndroidManifest.xml
index 9176231..23c5c00 100644
--- a/v17/leanback/AndroidManifest.xml
+++ b/v17/leanback/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.v17.leanback">
<uses-sdk android:minSdkVersion="17"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v17.leanback.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v17/leanback/api/26.1.0-SNAPSHOT.txt b/v17/leanback/api/27.0.0-SNAPSHOT.txt
similarity index 99%
rename from v17/leanback/api/26.1.0-SNAPSHOT.txt
rename to v17/leanback/api/27.0.0-SNAPSHOT.txt
index fb2aebc..bc0eecc 100644
--- a/v17/leanback/api/26.1.0-SNAPSHOT.txt
+++ b/v17/leanback/api/27.0.0-SNAPSHOT.txt
@@ -3154,8 +3154,7 @@
method public final int getPickerItemLayoutId();
method public final int getPickerItemTextViewId();
method public int getSelectedColumn();
- method public final deprecated java.lang.CharSequence getSeparator();
- method public final java.util.List<java.lang.CharSequence> getSeparators();
+ method public final java.lang.CharSequence getSeparator();
method public float getVisibleItemCount();
method public void onColumnValueChanged(int, int);
method public void removeOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
@@ -3166,7 +3165,6 @@
method public final void setPickerItemTextViewId(int);
method public void setSelectedColumn(int);
method public final void setSeparator(java.lang.CharSequence);
- method public final void setSeparators(java.util.List<java.lang.CharSequence>);
method public void setVisibleItemCount(float);
}
diff --git a/v17/leanback/res/values-af/strings.xml b/v17/leanback/res/values-af/strings.xml
index a9ef3e8..5e5c649 100644
--- a/v17/leanback/res/values-af/strings.xml
+++ b/v17/leanback/res/values-af/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediakontroles word versteek; druk D-paneel om te wys"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Voltooi"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Gaan voort"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-foutkode %1$d ekstra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"BEGIN HIER"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Volgende"</string>
diff --git a/v17/leanback/res/values-am/strings.xml b/v17/leanback/res/values-am/strings.xml
index 5ac73a5..2427364 100644
--- a/v17/leanback/res/values-am/strings.xml
+++ b/v17/leanback/res/values-am/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"የሚዲያ መቆጣጠሪያዎች ተደብቀዋል። d-pad ን ለማሳየት ይጫኑ"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ጨርስ"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ቀጥል"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">"፦"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"የMediaPlayer ስህተት ኮድ %1$d ተጨማሪ %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ይጀምሩ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ቀጣይ"</string>
diff --git a/v17/leanback/res/values-ar/strings.xml b/v17/leanback/res/values-ar/strings.xml
index 11f0d8c..90cd489 100644
--- a/v17/leanback/res/values-ar/strings.xml
+++ b/v17/leanback/res/values-ar/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"تم إخفاء عناصر التحكم في الوسائط، يمكنك الضغط على d-pad لإظهارها"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"إنهاء"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"متابعة"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"رمز الخطأ في MediaPlayer %1$d بالإضافة إلى %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"البدء"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"التالية"</string>
diff --git a/v17/leanback/res/values-az/strings.xml b/v17/leanback/res/values-az/strings.xml
index 31d4304..e3fe52b 100644
--- a/v17/leanback/res/values-az/strings.xml
+++ b/v17/leanback/res/values-az/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Media idarəetmələri gizlidir, göstərmək üçün d-pad\'i basın"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Bitir"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Davam edin"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Media Pleyer xəta kodu %1$d əlavə %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"BAŞLAYIN"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Növbəti"</string>
diff --git a/v17/leanback/res/values-b+sr+Latn/strings.xml b/v17/leanback/res/values-b+sr+Latn/strings.xml
index 1a002b4..4659835 100644
--- a/v17/leanback/res/values-b+sr+Latn/strings.xml
+++ b/v17/leanback/res/values-b+sr+Latn/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrole za medije su skrivene, pritisnite kontrole za kretanje da biste ih prikazali"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dovrši"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Nastavi"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Kôd greške MediaPlayer-a %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAPOČNITE"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Dalje"</string>
diff --git a/v17/leanback/res/values-be/strings.xml b/v17/leanback/res/values-be/strings.xml
index b5860f1..85c3e7c 100644
--- a/v17/leanback/res/values-be/strings.xml
+++ b/v17/leanback/res/values-be/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Адключыць высокую якасць"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Уключыць схаваныя цітры"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Адключыць схаваныя цітры"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Калі ласка, увядзіце выяву ў рэжыме Выяў"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Перайсці ў рэжым \"Відарыс у відарысе\""</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Элементы кіравання мультымедыя паказаны"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Элементы кіравання мультымедыя схаваны. Каб паказаць іх, націсніце пераключальнік напрамкаў"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Завяршыць"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Далей"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Код памылкі MediaPlayer %1$d дадаткова %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ПАЧАЦЬ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Далей"</string>
diff --git a/v17/leanback/res/values-bg/strings.xml b/v17/leanback/res/values-bg/strings.xml
index d98e8c4..d8c9325 100644
--- a/v17/leanback/res/values-bg/strings.xml
+++ b/v17/leanback/res/values-bg/strings.xml
@@ -47,15 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Деактивиране на високото качество"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Активиране на субтитрите"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Деактивиране на субтитрите"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Вход в режима „Картина в картина“"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Вход в режима „Картина в картината“"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Контролите за мултимедия са показани"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Контролите за мултимедия са скрити. Натиснете контролния пад, за да се покажат"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Край"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Напред"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"Код на грешката на MediaPlayer %1$d (допълнително: %2$d)"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ПЪРВИ СТЪПКИ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Напред"</string>
</resources>
diff --git a/v17/leanback/res/values-bn/strings.xml b/v17/leanback/res/values-bn/strings.xml
index 37f0e48..949faac 100644
--- a/v17/leanback/res/values-bn/strings.xml
+++ b/v17/leanback/res/values-bn/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"সাবটাইটেল সক্ষম করুন"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"সাবটাইটেল অক্ষম করুন"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ছবি মোডে ছবি লগান"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"মিডিয়ার নিয়ন্ত্রণগুলি দেখানো হয়েছে"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"মিডিয়ার নিয়ন্ত্রণগুলি লুকানো আছে, দেখার জন্য ডি-প্যাড টিপুন"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"শেষ করুন"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"চালিয়ে যান"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer ত্রুটি কোড %1$d অতিরিক্ত %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"শুরু করা যাক"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"পরবর্তী"</string>
</resources>
diff --git a/v17/leanback/res/values-bs/strings.xml b/v17/leanback/res/values-bs/strings.xml
index 804d6ca..12f404e 100644
--- a/v17/leanback/res/values-bs/strings.xml
+++ b/v17/leanback/res/values-bs/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrole za medije su skrivene. Pritisnite d-pad da ih prikažete"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Završiti"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Nastaviti"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Kôd greške MediaPlayera %1$d dodatno %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAPOČNITE"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Naprijed"</string>
diff --git a/v17/leanback/res/values-ca/strings.xml b/v17/leanback/res/values-ca/strings.xml
index 74c9700..943a6c3 100644
--- a/v17/leanback/res/values-ca/strings.xml
+++ b/v17/leanback/res/values-ca/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"S\'han amagat els controls multimèdia; prem el teclat direccional per mostrar-los"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalitza"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continua"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Codi d\'error de MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMENÇA"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Següent"</string>
diff --git a/v17/leanback/res/values-cs/strings.xml b/v17/leanback/res/values-cs/strings.xml
index 17b4dfc..c99f631 100644
--- a/v17/leanback/res/values-cs/strings.xml
+++ b/v17/leanback/res/values-cs/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Vypnout vysokou kvalitu"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Zapnout titulky"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Vypnout titulky"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Přejít do režimu Obraz v obraze"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Přejít do režimu obraz v obraze"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Ovládací prvky médií jsou zobrazeny"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Ovládací prvky médií jsou skryty, zobrazíte je stisknutím křížového ovladače"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončit"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Pokračovat"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Kód chyby přehrávače MediaPlayer %1$d, další %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAČÍNÁME"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Další"</string>
diff --git a/v17/leanback/res/values-da/strings.xml b/v17/leanback/res/values-da/strings.xml
index 3c6843f..97c4a32 100644
--- a/v17/leanback/res/values-da/strings.xml
+++ b/v17/leanback/res/values-da/strings.xml
@@ -47,15 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Deaktiver høj kvalitet"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivér undertekster"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Deaktiver undertekster"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Tilføj billedet i billedtilstand"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Tilstand med integreret billede"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Knapperne til afspilning er synlige"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Knapperne til afspilning er skjult. Tryk på D-pad\'en for at se dem"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Afslut"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsæt"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-fejlkode %1$d ekstra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"KOM GODT I GANG"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Næste"</string>
</resources>
diff --git a/v17/leanback/res/values-de/strings.xml b/v17/leanback/res/values-de/strings.xml
index ff9a409..e50c4ed 100644
--- a/v17/leanback/res/values-de/strings.xml
+++ b/v17/leanback/res/values-de/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Hohe Qualität deaktivieren"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Untertitel aktivieren"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Untertitel deaktivieren"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Bild-in-Bild-Modus aktivieren"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Bild-im-Bild-Modus aktivieren"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Mediensteuerelemente eingeblendet"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediensteuerelemente ausgeblendet. Drücke das Steuerkreuz, um die Steuerelemente wieder einzublenden."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fertigstellen"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Weiter"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-Fehlercode %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"JETZT STARTEN"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Weiter"</string>
diff --git a/v17/leanback/res/values-el/strings.xml b/v17/leanback/res/values-el/strings.xml
index 795a501..c0f039f 100644
--- a/v17/leanback/res/values-el/strings.xml
+++ b/v17/leanback/res/values-el/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Απόκρυψη στοιχείων ελέγχου μέσων, πιέστε το d-pad για εμφάνιση"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Τέλος"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Συνέχεια"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Κωδικός σφάλματος MediaPlayer %1$d επιπλέον %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ΕΝΑΡΞΗ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Επόμενο"</string>
diff --git a/v17/leanback/res/values-en-rAU/strings.xml b/v17/leanback/res/values-en-rAU/strings.xml
index 03dedda..c15bd3b 100644
--- a/v17/leanback/res/values-en-rAU/strings.xml
+++ b/v17/leanback/res/values-en-rAU/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Media controls hidden, press d-pad to show"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer error code %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"GET STARTED"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Next"</string>
diff --git a/v17/leanback/res/values-en-rGB/strings.xml b/v17/leanback/res/values-en-rGB/strings.xml
index 03dedda..c15bd3b 100644
--- a/v17/leanback/res/values-en-rGB/strings.xml
+++ b/v17/leanback/res/values-en-rGB/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Media controls hidden, press d-pad to show"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer error code %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"GET STARTED"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Next"</string>
diff --git a/v17/leanback/res/values-en-rIN/strings.xml b/v17/leanback/res/values-en-rIN/strings.xml
index 03dedda..c15bd3b 100644
--- a/v17/leanback/res/values-en-rIN/strings.xml
+++ b/v17/leanback/res/values-en-rIN/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Media controls hidden, press d-pad to show"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer error code %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"GET STARTED"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Next"</string>
diff --git a/v17/leanback/res/values-es-rUS/strings.xml b/v17/leanback/res/values-es-rUS/strings.xml
index cf84f62..41fe3f4 100644
--- a/v17/leanback/res/values-es-rUS/strings.xml
+++ b/v17/leanback/res/values-es-rUS/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Los controles de medios están ocultos; presiona el control direccional para mostrarlos"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Código de error de MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMENZAR"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Siguiente"</string>
diff --git a/v17/leanback/res/values-es/strings.xml b/v17/leanback/res/values-es/strings.xml
index bae575f..afd9195 100644
--- a/v17/leanback/res/values-es/strings.xml
+++ b/v17/leanback/res/values-es/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Controles multimedia ocultos (pulsa la cruceta para mostrarlos)"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Código de error de MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"EMPEZAR"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Siguiente"</string>
diff --git a/v17/leanback/res/values-et/strings.xml b/v17/leanback/res/values-et/strings.xml
index 34a4f0c..d87aba3 100644
--- a/v17/leanback/res/values-et/strings.xml
+++ b/v17/leanback/res/values-et/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Meedia juhtnupud on peidetud, kuvamiseks vajutage DPAD-i"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Lõpeta"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jätka"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayeri veakood %1$d, lisa %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ALUSTAGE"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Järgmine"</string>
diff --git a/v17/leanback/res/values-eu/strings.xml b/v17/leanback/res/values-eu/strings.xml
index 980ac8b..416d8a0 100644
--- a/v17/leanback/res/values-eu/strings.xml
+++ b/v17/leanback/res/values-eu/strings.xml
@@ -47,13 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desgaitu kalitate handiko erreprodukzioa"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Gaitu azpitituluak"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desgaitu azpitituluak"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Aktibatu \"Argazkia argazkian\" modua"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Aktibatu \"Pantaila txiki gainjarri\" modua"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Multimedia kontrolatzeko aukerak ikusgai"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Ezkutatuta daude multimedia kontrolatzeko aukerak. Erakusteko, sakatu nabigazio-gurutzea."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Amaitu"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jarraitu"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer errore-kodea: %1$d (%2$d gehigarria)"</string>
- <string name="lb_onboarding_get_started" msgid="6961440391306351139">"LEHEN URRATSAK"</string>
+ <string name="lb_onboarding_get_started" msgid="6961440391306351139">"HASI ERABILTZEN"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Hurrengoa"</string>
</resources>
diff --git a/v17/leanback/res/values-fa/strings.xml b/v17/leanback/res/values-fa/strings.xml
index 320d819..daa6bab 100644
--- a/v17/leanback/res/values-fa/strings.xml
+++ b/v17/leanback/res/values-fa/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"فعال کردن زیرنویس"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"غیرفعال کردن زیرنویس"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"وارد حالت تصویر در تصویر شوید"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"کنترلهای رسانه نشان داده میشوند"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"کنترلهای رسانه پنهان هستند، برای نمایش آنها d-pad (پد کنترل) را فشار دهید"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"پایان"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ادامه"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"کد خطای MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"شروع به کار"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"بعدی"</string>
</resources>
diff --git a/v17/leanback/res/values-fi/strings.xml b/v17/leanback/res/values-fi/strings.xml
index 863fcd5..bc83b9d 100644
--- a/v17/leanback/res/values-fi/strings.xml
+++ b/v17/leanback/res/values-fi/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediasäätimet piilotettu, näytä painamalla ohjaimen nuolia."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Valmis"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jatka"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayerin virhekoodi %1$d ylimääräinen %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ALOITA"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seuraava"</string>
diff --git a/v17/leanback/res/values-fr-rCA/strings.xml b/v17/leanback/res/values-fr-rCA/strings.xml
index d8ec857..300c087 100644
--- a/v17/leanback/res/values-fr-rCA/strings.xml
+++ b/v17/leanback/res/values-fr-rCA/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Les commandes multimédias sont masquées, appuyez sur le pavé directionnel pour les afficher."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Terminer"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuer"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Code d\'erreur MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMMENCER"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Suivant"</string>
diff --git a/v17/leanback/res/values-fr/strings.xml b/v17/leanback/res/values-fr/strings.xml
index d3208a8..b659bed 100644
--- a/v17/leanback/res/values-fr/strings.xml
+++ b/v17/leanback/res/values-fr/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Désactiver la haute qualité"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activer les sous-titres"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Désactiver les sous-titres"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Activer le mode PIP"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Activer le mode Picture-in-picture"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Les commandes multimédias sont affichées"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Les commandes multimédias sont masquées. Appuyez sur le pavé directionnel pour les afficher"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Terminer"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuer"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Code d\'erreur MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMMENCER"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Suivant"</string>
diff --git a/v17/leanback/res/values-gl/strings.xml b/v17/leanback/res/values-gl/strings.xml
index 6c5cfb5..5406b8a 100644
--- a/v17/leanback/res/values-gl/strings.xml
+++ b/v17/leanback/res/values-gl/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desactivar alta calidade"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activar subtítulos"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desactivar subtítulos"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Activar o modo Imaxe superposta"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Activar o modo Pantalla superposta"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Móstranse os controis de recursos multimedia"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Os controis de recursos multimedia están ocultos. Preme d-pad para mostralos"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Código de erro de MediaPlayer %1$d %2$d de máis"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"INTRODUCIÓN"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seguinte"</string>
diff --git a/v17/leanback/res/values-gu/strings.xml b/v17/leanback/res/values-gu/strings.xml
index 2be274d..12796b3 100644
--- a/v17/leanback/res/values-gu/strings.xml
+++ b/v17/leanback/res/values-gu/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ઉપશીર્ષક સક્ષમ કરો"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"વિગતવાર ઉપશીર્ષકોને અક્ષમ કરો"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ચિત્ર મોડમાં ચિત્ર દાખલ કરો"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"મીડિયા નિયંત્રણો બતાવેલા છે"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"મીડિયા નિયંત્રણો છુપાયેલા છે, તે બતાવવા માટે d-પૅડ દબાવો"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"સમાપ્ત કરો"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ચાલુ રાખો"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer ભૂલ કોડ %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"પ્રારંભ કરો"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"આગલું"</string>
</resources>
diff --git a/v17/leanback/res/values-hi/strings.xml b/v17/leanback/res/values-hi/strings.xml
index 41b0b11..91ff72a 100644
--- a/v17/leanback/res/values-hi/strings.xml
+++ b/v17/leanback/res/values-hi/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"मीडिया नियंत्रण छिपे हुए हैं, दिखाने के लिए डी-पैड दबाएं"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त करें"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"जारी रखें"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer गड़बड़ी कोड %1$d अतिरिक्त %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"प्रारंभ करें"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"अगला"</string>
diff --git a/v17/leanback/res/values-hr/strings.xml b/v17/leanback/res/values-hr/strings.xml
index 02e5386..6ff3ed8 100644
--- a/v17/leanback/res/values-hr/strings.xml
+++ b/v17/leanback/res/values-hr/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Medijske kontrole skrivene su, pritisnite D-pad za prikaz"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Završi"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Nastavi"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Kôd pogreške MediaPlayera: %1$d, dodatno %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"POČETAK"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Dalje"</string>
diff --git a/v17/leanback/res/values-hu/strings.xml b/v17/leanback/res/values-hu/strings.xml
index 7e67bed..c0f89c3 100644
--- a/v17/leanback/res/values-hu/strings.xml
+++ b/v17/leanback/res/values-hu/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Feliratok engedélyezése"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Feliratok letiltása"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Kép a képben mód indítása"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Médiavezérlők megjelenítve"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"A médiavezérlők el vannak rejtve. Megjelenítésükhöz nyomja le a d-padet."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Befejezés"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Folytatás"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-hibakód: %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"KEZDŐ LÉPÉSEK"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Következő"</string>
</resources>
diff --git a/v17/leanback/res/values-hy/strings.xml b/v17/leanback/res/values-hy/strings.xml
index e71bc52..dfaed6e 100644
--- a/v17/leanback/res/values-hy/strings.xml
+++ b/v17/leanback/res/values-hy/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Մեդիայի կառավարման տարրերը թաքցված են։ Ցուցադրելու համար սեղմեք D-pad-ը"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Վերջ"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Շարունակել"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Մեդիա նվագարկչի սխալի կոդ %1$d լրացուցիչ %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ՍԿՍԵԼ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Հաջորդը"</string>
diff --git a/v17/leanback/res/values-in/strings.xml b/v17/leanback/res/values-in/strings.xml
index c5b0568..68f4b55 100644
--- a/v17/leanback/res/values-in/strings.xml
+++ b/v17/leanback/res/values-in/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Nonaktifkan Kualitas Tinggi"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktifkan Pembuatan Teks"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Nonaktifkan Pembuatan Teks"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Masukkan Foto Dalam Mode Foto"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Masuk Mode Picture In Picture"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Kontrol media ditampilkan"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrol media disembunyikan, tekan d-pad untuk menampilkannya"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Selesai"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Lanjutkan"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Kode error MediaPlayer %1$d ekstra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"MULAI"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Berikutnya"</string>
diff --git a/v17/leanback/res/values-is/strings.xml b/v17/leanback/res/values-is/strings.xml
index afd1709..3d49bda 100644
--- a/v17/leanback/res/values-is/strings.xml
+++ b/v17/leanback/res/values-is/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Spilunarstýringar faldar, ýttu á stefnuhnappa til að sýna þær"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Ljúka"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Halda áfram"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Villukóði MediaPlayer %1$d aukalegt %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"HEFJAST HANDA"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Áfram"</string>
diff --git a/v17/leanback/res/values-it/strings.xml b/v17/leanback/res/values-it/strings.xml
index f08671b..5db967d 100644
--- a/v17/leanback/res/values-it/strings.xml
+++ b/v17/leanback/res/values-it/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disattiva alta qualità"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Attiva sottotitoli"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disattiva sottotitoli"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Attiva modalità Picture-in-picture"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Attiva modalità Picture in picture"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Controlli multimediali visualizzati"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Controlli multimediali nascosti, premi il d-pad per visualizzarli"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fine"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continua"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Codice di errore MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"INIZIA"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Avanti"</string>
diff --git a/v17/leanback/res/values-iw/strings.xml b/v17/leanback/res/values-iw/strings.xml
index 8431583..0f79a99 100644
--- a/v17/leanback/res/values-iw/strings.xml
+++ b/v17/leanback/res/values-iw/strings.xml
@@ -31,8 +31,8 @@
<string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"העברה קדימה של %1$dX"</string>
<string name="lb_playback_controls_rewind" msgid="2227196334132350684">"הרץ אחורה"</string>
<string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"העברה לאחור של %1$dX"</string>
- <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"דלג אל הפריט הבא"</string>
- <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"דלג אל הפריט הקודם"</string>
+ <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"ברצוני לדלג אל הפריט הבא"</string>
+ <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"ברצוני לדלג אל הפריט הקודם"</string>
<string name="lb_playback_controls_more_actions" msgid="2330770008796987655">"עוד פעולות"</string>
<string name="lb_playback_controls_thumb_up" msgid="6530420347129222601">"בטל בחירה באגודל כלפי מעלה"</string>
<string name="lb_playback_controls_thumb_up_outline" msgid="1577637924003500946">"בחר באגודל כלפי מעלה"</string>
@@ -47,15 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"השבת איכות גבוהה"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"הפעל כתוביות"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"השבת כתוביות"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"הזן את התמונה במצב תמונה"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"עבור למצב תמונה בתוך תמונה"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"פקדי המדיה מוצגים"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"פקדי המדיה מוסתרים. הקש על ה-d-pad כדי להציג אותם"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"סיום"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"המשך"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"קוד שגיאה %1$d של MediaPlayer ועוד %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"התחל"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"הבא"</string>
</resources>
diff --git a/v17/leanback/res/values-ja/strings.xml b/v17/leanback/res/values-ja/strings.xml
index 613b7a7..88fe50f 100644
--- a/v17/leanback/res/values-ja/strings.xml
+++ b/v17/leanback/res/values-ja/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"高品質を無効にする"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"字幕を有効にする"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"字幕を無効にする"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"PIP モードに移動"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ピクチャー イン ピクチャー モードに移動"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"メディア コントロールは表示されています"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"メディア コントロールは非表示になっています。表示するには D-pad を押してください"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完了"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"続行"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer エラーコード: %1$d、追加: %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"使ってみる"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"次へ"</string>
diff --git a/v17/leanback/res/values-ka/strings.xml b/v17/leanback/res/values-ka/strings.xml
index 0913a1d..7879ecc 100644
--- a/v17/leanback/res/values-ka/strings.xml
+++ b/v17/leanback/res/values-ka/strings.xml
@@ -51,15 +51,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"მაღალი ხარისხის გამორთვა"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"დახურული წარწერების ჩართვა"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"დახურული წარწერების გაუქმება"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"რეჟიმზე „სურათი სურათში“ გადასვლა"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"რეჟიმზე „ეკრანი ეკრანში“ გადასვლა"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"ნაჩვენებია მედიის მართვის საშუალებები"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"მედიის მართვის საშუალებები დამალულია, გამოსაჩენად დააჭირეთ D-pad-ს"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"დასრულება"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"გაგრძელება"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-ის შეცდომის კოდი: %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"დაწყება"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"შემდეგი"</string>
</resources>
diff --git a/v17/leanback/res/values-kk/strings.xml b/v17/leanback/res/values-kk/strings.xml
index 22c67b2..36902f5 100644
--- a/v17/leanback/res/values-kk/strings.xml
+++ b/v17/leanback/res/values-kk/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Мультимедияны басқару элементтері жасырын, оларды көрсету үшін d-тақтасын басыңыз"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Аяқтау"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Жалғастыру"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer қате коды %1$d, қосымша %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ІСКЕ КІРІСУ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Келесі"</string>
diff --git a/v17/leanback/res/values-km/strings.xml b/v17/leanback/res/values-km/strings.xml
index 4c3d61c..270dff7 100644
--- a/v17/leanback/res/values-km/strings.xml
+++ b/v17/leanback/res/values-km/strings.xml
@@ -47,15 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"បិទគុណភាពខ្ពស់"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"បើកការដាក់ចំណងដែលបានបិទ"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"បិទការដាក់ចំណងដែលបានបិទ"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"បញ្ចូលរូបភាពនៅក្នុងរបៀបរូបភាព"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ចូលមុខងាររូបក្នុងរូប"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"ការគ្រប់គ្រងមេឌៀត្រូវបានបង្ហាញ"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ការគ្រប់គ្រងមេឌៀត្រូវបានលាក់ សូមចុច d-pad ដើម្បីបង្ហាញ"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"បញ្ចប់"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"បន្ត"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">"៖"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"លេខកូដបញ្ហា MediaPlayer %1$d និង %2$d បន្ថែម"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ចាប់ផ្ដើម"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"បន្ទាប់"</string>
</resources>
diff --git a/v17/leanback/res/values-kn/strings.xml b/v17/leanback/res/values-kn/strings.xml
index 7132cef..dd14e38 100644
--- a/v17/leanback/res/values-kn/strings.xml
+++ b/v17/leanback/res/values-kn/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ಚಿತ್ರವನ್ನು ಚಿತ್ರ ಮೋಡ್ನಲ್ಲಿ ಪ್ರವೇಶಿಸಿ"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"ಮಾಧ್ಯಮ ನಿಯಂತ್ರಣಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ಮಾಧ್ಯಮ ನಿಯಂತ್ರಣಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ, ತೋರಿಸಲು d-pad ಒತ್ತಿರಿ"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ಪೂರ್ಣಗೊಳಿಸು"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ಮುಂದುವರಿಸು"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"ಮೀಡಿಯಾ ಪ್ಲೇಯರ್ ದೋಷ ಕೋಡ್ %1$d ಹೆಚ್ಚುವರಿ %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ಪ್ರಾರಂಭಿಸಿ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ಮುಂದೆ"</string>
</resources>
diff --git a/v17/leanback/res/values-ko/strings.xml b/v17/leanback/res/values-ko/strings.xml
index f6e5136..0c8fb19 100644
--- a/v17/leanback/res/values-ko/strings.xml
+++ b/v17/leanback/res/values-ko/strings.xml
@@ -47,15 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"고화질 사용 중지"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"자막 사용 설정"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"자막 사용 중지"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"사진 모드에서 사진 입력"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"PIP 모드 시작"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"미디어 컨트롤이 표시되었습니다."</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"미디어 컨트롤이 숨겨져 있습니다. 표시하려면 D-Pad를 누르세요."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"완료"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"계속"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer 오류 코드 %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"시작하기"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"다음"</string>
</resources>
diff --git a/v17/leanback/res/values-ky/strings.xml b/v17/leanback/res/values-ky/strings.xml
index f24a0a6..80c7af2 100644
--- a/v17/leanback/res/values-ky/strings.xml
+++ b/v17/leanback/res/values-ky/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Жабык субтитрлерди иштетүү"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Жабык субтитрлерди өчүрүү"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Сүрөт режиминде сүрөт киргизүү"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Медиа файлды башкаруу көрсөтүлдү"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Медиа файлды башкаруу жашырылган, көрүү үчүн d-pad көзөмөлдөө каражатын басыңыз"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Бүтүрүү"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Улантуу"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer\'деги катанын коду: 1$d, кошумча: %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"БАШТАДЫК"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Кийинки"</string>
</resources>
diff --git a/v17/leanback/res/values-lo/strings.xml b/v17/leanback/res/values-lo/strings.xml
index 92b7c90..7fb28b8 100644
--- a/v17/leanback/res/values-lo/strings.xml
+++ b/v17/leanback/res/values-lo/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ເປີດນຳໃຊ້ຄຳບັນຍາຍແບບປິດ"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ປິດນຳໃຊ້ຄຳບັນຍາຍແບບປິດ"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ປ້ອນຮູບພາບໃນໂໝດຮູບພາບ"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"ສະແດງຕົວຄວບຄຸມມີເດຍແລ້ວ"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ເຊື່ອງຕົວຄວບຄຸມມີເດຍແລ້ວ, ກົດປຸ່ມທິດທາງເພື່ອສະແດງ"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ສໍາເລັດ"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ສືບຕໍ່"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"ລະຫັດ MediaPlayer ຜິດພາດ %1$d ພິເສດ %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ເລີ່ມຕົ້ນນຳໃຊ້"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ຕໍ່ໄປ"</string>
</resources>
diff --git a/v17/leanback/res/values-lt/strings.xml b/v17/leanback/res/values-lt/strings.xml
index 0f6bfce..b9d6076 100644
--- a/v17/leanback/res/values-lt/strings.xml
+++ b/v17/leanback/res/values-lt/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Įgalinti subtitrus"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Išjungti subtitrus"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Įjungti vaizdo vaizde režimą"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Medijos valdikliai rodomi"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Medijos valdikliai paslėpti. Paspauskite krypčių valdiklius, kad rodytumėte"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Baigti"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Tęsti"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"%1$d ir %2$d „MediaPlayer“ klaidos kodas"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"PRADĖTI"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Kitas"</string>
</resources>
diff --git a/v17/leanback/res/values-lv/strings.xml b/v17/leanback/res/values-lv/strings.xml
index 2b17bab..8f69284 100644
--- a/v17/leanback/res/values-lv/strings.xml
+++ b/v17/leanback/res/values-lv/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Iespējot slēgtos parakstus"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Atspējot slēgtos parakstus"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Aktivizēt režīmu Attēls attēlā"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Multivides vadīklas ir redzamas."</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Multivides vadīklas ir paslēptas. Nospiediet virzienu tastatūru, lai tās tiktu parādītas."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Pabeigt"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Turpināt"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer kļūdas kods: %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"SĀKT DARBU"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Nākamā"</string>
</resources>
diff --git a/v17/leanback/res/values-mk/strings.xml b/v17/leanback/res/values-mk/strings.xml
index 5284f64..d694167 100644
--- a/v17/leanback/res/values-mk/strings.xml
+++ b/v17/leanback/res/values-mk/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Контролите за аудио-визуелните медиуми се скриени, притиснете на подлогата за насока за да ги прикажете"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Заврши"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Продолжи"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Код за грешка на MediaPlayer %1$d дополнително %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ЗАПОЧНИ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Следно"</string>
diff --git a/v17/leanback/res/values-ml/strings.xml b/v17/leanback/res/values-ml/strings.xml
index 012bf44..41ac9d5 100644
--- a/v17/leanback/res/values-ml/strings.xml
+++ b/v17/leanback/res/values-ml/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"അടച്ച അടിക്കുറിപ്പ് നൽകൽ പ്രവർത്തനക്ഷമമാക്കുക"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"അടച്ച അടിക്കുറിപ്പ് നൽകൽ പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"\'ചിത്രത്തിനുള്ളിൽ ചിത്രം\' മോഡിലേക്ക് പ്രവേശിക്കുക"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"മീഡിയ നിയന്ത്രണങ്ങൾ കാണിച്ചിരിക്കുന്നു"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"മീഡിയ നിയന്ത്രണങ്ങൾ മറച്ചിരിക്കുന്നു, കാണിക്കുന്നതിന് ഡി-പാഡ് അമർത്തുക"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"പൂര്ത്തിയാക്കുക"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"തുടരുക"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"മീഡിയ പ്ലെയർ പിശക് കോഡ്: %1$d, കൂടെ %2$d എന്നതും"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ആരംഭിക്കുക"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"അടുത്തത്"</string>
</resources>
diff --git a/v17/leanback/res/values-mn/strings.xml b/v17/leanback/res/values-mn/strings.xml
index 5cd8f4d..63d4392 100644
--- a/v17/leanback/res/values-mn/strings.xml
+++ b/v17/leanback/res/values-mn/strings.xml
@@ -47,15 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Өндөр чанарыг идэвхгүйжүүлэх"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Текст тайлбарыг идэвхжүүлэх"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Текст тайлбарыг идэвхгүйжүүлэх"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Зургийн горимд зураг оруулна уу"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Дэлгэцэн доторх дэлгэц горимд оруулна уу"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Медиа удирдлага харагдаж байна"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Медиа удирдлага нуугдсан байна, харуулахын тулд d-pad-г дарна уу"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Дуусгах"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Үргэлжлүүлэх"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-н алдааны код %1$d нэмэлт %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ЭХЭЛЦГЭЭЕ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Дараах"</string>
</resources>
diff --git a/v17/leanback/res/values-mr/strings.xml b/v17/leanback/res/values-mr/strings.xml
index ccadd10..79a7b0c 100644
--- a/v17/leanback/res/values-mr/strings.xml
+++ b/v17/leanback/res/values-mr/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"उपशीर्षके सक्षम करा"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"उपशीर्षके अक्षम करा"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"चित्र मोडमध्ये चित्र प्रविष्ट करा"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"मीडिया नियंत्रणे दर्शवली आहेत"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"मीडिया नियंत्रणे लपलेली आहेत, दर्शवण्यासाठी d-pad दाबा"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"सुरू ठेवा"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"मीडियाप्लेअर एरर कोड %1$d अतिरिक्त %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"प्रारंभ करा"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"पुढील"</string>
</resources>
diff --git a/v17/leanback/res/values-ms/strings.xml b/v17/leanback/res/values-ms/strings.xml
index 5a66aac..8cad319 100644
--- a/v17/leanback/res/values-ms/strings.xml
+++ b/v17/leanback/res/values-ms/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Dayakan Kapsyen Tertutup"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Lumpuhkan Kapsyen Tertutup"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Masukkan Gambar Dalam Mod Gambar"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Kawalan media ditunjukkan"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kawalan media disembunyikan, tekan d-pad untuk menunjukkan"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Selesai"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Teruskan"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"Kod ralat MediaPlayer %1$d tambahan %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"MULAKAN"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seterusnya"</string>
</resources>
diff --git a/v17/leanback/res/values-my/strings.xml b/v17/leanback/res/values-my/strings.xml
index 563ee04..5ba51af 100644
--- a/v17/leanback/res/values-my/strings.xml
+++ b/v17/leanback/res/values-my/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"အရည်အသွေးကောင်းအား ပိတ်ထားရန်"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"စာတမ်းထိုး ဖွင့်ရန်"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"စာတမ်းထိုးအား ပိတ်ထားရန်"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ဓာတ်ပုံမုဒ်တွင် ဓာတ်ပုံထည့်ပါ"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"တစ်ခုပေါ်တစ်ခု ထပ်၍ဖွင့်ခြင်းမုဒ်ကို ထည့်ပါ"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"မီဒီယာ ခလုတ်များကို ပြထားပါသည်"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"မီဒီယာခလုတ်များကို ဝှက်ထားပါသည်။ ပြရန် d-pad ကို နှိပ်ပါ"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ပြီးပြီ"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ဆက်လုပ်ရန်"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">"−"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer မှားယွင်းမှုကုဒ် %1$d နှင့် အပို %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"စတင်ပါ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ရှေ့သို့"</string>
diff --git a/v17/leanback/res/values-nb/strings.xml b/v17/leanback/res/values-nb/strings.xml
index bdcd016..1e924a8 100644
--- a/v17/leanback/res/values-nb/strings.xml
+++ b/v17/leanback/res/values-nb/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediekontrollene er skjult – trykk på styrepilene for å vise dem"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fullfør"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsett"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer-feilkode %1$d ekstra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"KOM I GANG"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Neste"</string>
diff --git a/v17/leanback/res/values-ne/strings.xml b/v17/leanback/res/values-ne/strings.xml
index 1dd2da6..c6579a6 100644
--- a/v17/leanback/res/values-ne/strings.xml
+++ b/v17/leanback/res/values-ne/strings.xml
@@ -50,14 +50,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"बन्द क्याप्सनहरु सक्षम"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"बन्द क्याप्सनहरु असक्षम"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"चित्रलाई चित्र मोडमा प्रविष्ट गर्नुहोस्"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"मिडियाका नियन्त्रणहरू देखाएइका छन्"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"मिडियाका नियन्त्रणहरू लुकेका छन्, देखाउनका लागि d-pad लाई थिच्नुहोस्"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त गर्नुहोस्"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"जारी राख्नुहोस्"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer को त्रुटि सम्बन्धी कोड %1$d अतिरिक्त %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"सुरु गरौँ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"अर्को"</string>
</resources>
diff --git a/v17/leanback/res/values-nl/strings.xml b/v17/leanback/res/values-nl/strings.xml
index c8bc8c8..2b236b0 100644
--- a/v17/leanback/res/values-nl/strings.xml
+++ b/v17/leanback/res/values-nl/strings.xml
@@ -47,15 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Hoge kwaliteit uitschakelen"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ondertiteling inschakelen"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Ondertiteling uitschakelen"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Beeld-in-beeld-modus openen"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Scherm-in-scherm-modus openen"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Opties voor mediabediening worden weergegeven"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Opties voor mediabediening verborgen. Druk op de D-pad om ze weer te geven."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Voltooien"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Doorgaan"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"-"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"Mediaspeler: foutcode %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"AAN DE SLAG"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Volgende"</string>
</resources>
diff --git a/v17/leanback/res/values-pa/strings.xml b/v17/leanback/res/values-pa/strings.xml
index 404bf3b..fe8fbd7 100644
--- a/v17/leanback/res/values-pa/strings.xml
+++ b/v17/leanback/res/values-pa/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ਬੰਦ ਕੈਪਸ਼ਨਿੰਗ ਸਮਰੱਥ ਬਣਾਓ"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ਬੰਦ ਕੈਪਸ਼ਨਿੰਗ ਅਸਮਰੱਥ ਬਣਾਓ"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"ਤਸਵੀਰ ਮੋਡ ਵਿੱਚ ਤਸਵੀਰ ਦਾਖਲ ਕਰੋ"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"ਮੀਡੀਆ ਕੰਟਰੋਲ ਵਿਖਾਏ ਗਏ"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ਮੀਡੀਆ ਕੰਟਰੋਲ ਲੁਕੇ ਹੋਏ ਹਨ, ਵਿਖਾਉਣ ਲਈ ਡੀ-ਪੈਡ ਦਬਾਓ"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ਖ਼ਤਮ"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ਜਾਰੀ ਰੱਖੋ"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer ਗੜਬੜ ਕੋਡ %1$d ਵਾਧੂ %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ਸ਼ੁਰੂਆਤ ਕਰੋ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ਅੱਗੇ"</string>
</resources>
diff --git a/v17/leanback/res/values-pl/strings.xml b/v17/leanback/res/values-pl/strings.xml
index b986598..879c064 100644
--- a/v17/leanback/res/values-pl/strings.xml
+++ b/v17/leanback/res/values-pl/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Włącz napisy"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Wyłącz napisy"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Włącz tryb obrazu w obrazie"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Elementy sterujące multimediami są wyświetlone"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Elementy sterujące multimediami są ukryte. Naciśnij pad kierunkowy, by je wyświetlić"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Zakończ"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Dalej"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer – kod błędu %1$d, dodatkowo %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ROZPOCZNIJ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Dalej"</string>
</resources>
diff --git a/v17/leanback/res/values-pt-rBR/strings.xml b/v17/leanback/res/values-pt-rBR/strings.xml
index c5f238e..1076b87 100644
--- a/v17/leanback/res/values-pt-rBR/strings.xml
+++ b/v17/leanback/res/values-pt-rBR/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Os controles de mídia estão ocultos. Pressione o botão direcional para exibi-los"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Código de erro do MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"PRIMEIROS PASSOS"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Próximo"</string>
diff --git a/v17/leanback/res/values-pt-rPT/strings.xml b/v17/leanback/res/values-pt-rPT/strings.xml
index 41ea488..315828d 100644
--- a/v17/leanback/res/values-pt-rPT/strings.xml
+++ b/v17/leanback/res/values-pt-rPT/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desativar alta qualidade"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ativar legendas"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desativar legendas"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Entrar no modo Imagem na imagem"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Entrar no modo de ecrã no ecrã"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Controlos de multimédia apresentados"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Controlos de multimédia ocultados, prima o teclado direcional para mostrar"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Código de erro do MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"INICIAR"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seguinte"</string>
diff --git a/v17/leanback/res/values-pt/strings.xml b/v17/leanback/res/values-pt/strings.xml
index c5f238e..1076b87 100644
--- a/v17/leanback/res/values-pt/strings.xml
+++ b/v17/leanback/res/values-pt/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Os controles de mídia estão ocultos. Pressione o botão direcional para exibi-los"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Código de erro do MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"PRIMEIROS PASSOS"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Próximo"</string>
diff --git a/v17/leanback/res/values-ro/strings.xml b/v17/leanback/res/values-ro/strings.xml
index 325632e..a362541 100644
--- a/v17/leanback/res/values-ro/strings.xml
+++ b/v17/leanback/res/values-ro/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Comenzile media sunt ascunse. Apăsați pe butonul direcțional pentru a le afișa."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizați"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuați"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Cod de eroare MediaPlayer %1$d suplimentar %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ÎNCEPEȚI"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Înainte"</string>
diff --git a/v17/leanback/res/values-ru/strings.xml b/v17/leanback/res/values-ru/strings.xml
index 8631587..8d045cf 100644
--- a/v17/leanback/res/values-ru/strings.xml
+++ b/v17/leanback/res/values-ru/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Элементы управления скрыты. Нажмите D-pad, чтобы показать их."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Готово"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Далее"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Код ошибки медиапроигрывателя: %1$d (дополнительный: %2$d)"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"НАЧАТЬ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Далее"</string>
diff --git a/v17/leanback/res/values-si/strings.xml b/v17/leanback/res/values-si/strings.xml
index b92e6ec..54f2f08 100644
--- a/v17/leanback/res/values-si/strings.xml
+++ b/v17/leanback/res/values-si/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"වැසුණු ශිර්ෂ කිරීම සබල කරන ලදි"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"වැසුණු ශිර්ෂ කිරීම අබල කරන ලදි"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"පින්තූරය-තුළ-පින්තූරය ප්රකාරයට ඇතුළු වන්න"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"මාධ්ය පාලක පෙන්වා ඇත"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"මාධ්ය පාලක සඟවා ඇත, පෙන්වීමට d-pad ඔබන්න"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"අවසානය"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"දිගටම කර ගෙන යන්න"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer දෝෂ කේතය %1$d අමතර %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ආරම්භ කරන්න"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ඊළඟ"</string>
</resources>
diff --git a/v17/leanback/res/values-sk/strings.xml b/v17/leanback/res/values-sk/strings.xml
index 731d62b..fe45e2c 100644
--- a/v17/leanback/res/values-sk/strings.xml
+++ b/v17/leanback/res/values-sk/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Zakázať médiá vo vysokej kvalite"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Zapnúť skryté titulky"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Vypnúť skryté titulky"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Vložiť obrázok v režime obrázka"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Prejsť do režimu obraz v obraze"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Ovládacie prvky médií sa zobrazujú"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Ovládacie prvky médií sú skryté, zobrazíte ich stlačením krížového ovládača"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončiť"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Pokračovať"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Kód chyby MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAČÍNAME"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Ďalej"</string>
diff --git a/v17/leanback/res/values-sl/strings.xml b/v17/leanback/res/values-sl/strings.xml
index 2fd75f7..d47b3af 100644
--- a/v17/leanback/res/values-sl/strings.xml
+++ b/v17/leanback/res/values-sl/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Omogoči podnapise"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Onemogoči podnapise"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Vklop načina za sliko v sliki"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Kontrolniki predstavnosti so prikazani"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrolniki predstavnosti so skriti, za prikaz pritisnite smerni gumb"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončaj"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Naprej"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"Koda napake MediaPlayer %1$d dodatno %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAČNITE"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Naprej"</string>
</resources>
diff --git a/v17/leanback/res/values-sq/strings.xml b/v17/leanback/res/values-sq/strings.xml
index c34f5ba..4057cae 100644
--- a/v17/leanback/res/values-sq/strings.xml
+++ b/v17/leanback/res/values-sq/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Çaktivizo \"Cilësinë e lartë\""</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivizo titrat"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Çaktivizo titrat me sekuencë kohore"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Fut një fotografi në modalitetin e fotografisë"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Aktivizo modalitetin e figurës brenda figurës"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Kontrollet e medias të shfaqura"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Kontrollet e medias të fshehura, shtyp bllokun e drejtimit për t\'i shfaqur"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Përfundo"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Vazhdo"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Kodi i gabimit i MediaPlayer %1$d shtesa %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"FILLO"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Përpara"</string>
diff --git a/v17/leanback/res/values-sr/strings.xml b/v17/leanback/res/values-sr/strings.xml
index 705aafe..e22d127 100644
--- a/v17/leanback/res/values-sr/strings.xml
+++ b/v17/leanback/res/values-sr/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Контроле за медије су скривене, притисните контроле за кретање да бисте их приказали"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Доврши"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Настави"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Кôд грешке MediaPlayer-а %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ЗАПОЧНИТЕ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Даље"</string>
diff --git a/v17/leanback/res/values-sv/strings.xml b/v17/leanback/res/values-sv/strings.xml
index d528d53..80a9050 100644
--- a/v17/leanback/res/values-sv/strings.xml
+++ b/v17/leanback/res/values-sv/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Mediakontrollerna är dolda och visas om du trycker på styrkorset"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Slutför"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsätt"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Felkod för MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"KOM IGÅNG"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Nästa"</string>
diff --git a/v17/leanback/res/values-sw/strings.xml b/v17/leanback/res/values-sw/strings.xml
index 19fbc54..8672cd6 100644
--- a/v17/leanback/res/values-sw/strings.xml
+++ b/v17/leanback/res/values-sw/strings.xml
@@ -47,13 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Zima Ubora wa Juu"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Washa manukuu"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Zima manukuu"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Weka Picha Katika Hali ya Picha"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Weka Hali ya Picha ndani ya Picha Nyingine"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Inaonyesha udhibiti wa maudhui"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Imeficha udhibiti wa maudhui, bonyeza d-pad ili uuonyeshe"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Kamilisha"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Endelea"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Msimbo wa hitilafu wa Kichezaji Maudhui %1$d %2$d zaidi"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ANZA KUTUMIA"</string>
- <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Inayofuata"</string>
+ <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Endelea"</string>
</resources>
diff --git a/v17/leanback/res/values-ta/strings.xml b/v17/leanback/res/values-ta/strings.xml
index ca53421..f5d84e2 100644
--- a/v17/leanback/res/values-ta/strings.xml
+++ b/v17/leanback/res/values-ta/strings.xml
@@ -47,12 +47,14 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"உயர் தரத்தை முடக்கு"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"விரிவான வசனங்களை இயக்கு"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"விரிவான வசனங்களை முடக்கு"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"பிக்ச்சர் இன் பிக்ச்சர் பயன்முறைக்குச் செல்"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"பிக்ச்சர்-இன்-பிக்ச்சர் பயன்முறைக்குச் செல்"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"மீடியா கட்டுப்பாடுகள் காட்டப்படுகின்றன"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"மீடியா கட்டுப்பாடுகள் மறைக்கப்பட்டுள்ளன. கட்டுப்பாடுகளைக் காட்ட, டிபேடை அழுத்தவும்"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"முடி"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"தொடர்க"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer பிழைக் குறியீடு: %1$d கூடுதல் %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"தொடங்குக"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"அடுத்து"</string>
diff --git a/v17/leanback/res/values-te/strings.xml b/v17/leanback/res/values-te/strings.xml
index d0ab476..6b8d1f4 100644
--- a/v17/leanback/res/values-te/strings.xml
+++ b/v17/leanback/res/values-te/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"సంవృత శీర్షికలను ప్రారంభించు"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"సంవృత శీర్షికలను నిలిపివేయి"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"చిత్రంలో చిత్రం మోడ్లోకి ప్రవేశించండి"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"మీడియా నియంత్రణలు చూపబడ్డాయి"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"మీడియా నియంత్రణలు దాచబడ్డాయి, చూపించడానికి d-ప్యాడ్ నొక్కండి"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ముగించు"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"కొనసాగించు"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer ఎర్రర్ కోడ్ %1$d అదనంగా %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ప్రారంభించు"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"తదుపరి"</string>
</resources>
diff --git a/v17/leanback/res/values-th/strings.xml b/v17/leanback/res/values-th/strings.xml
index 2ab6b50..0dae8eb 100644
--- a/v17/leanback/res/values-th/strings.xml
+++ b/v17/leanback/res/values-th/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"เปิดใช้คำบรรยาย"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ปิดใช้คำบรรยาย"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"เข้าสู่โหมดการแสดงผลหลายแหล่งพร้อมกัน"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"แสดงการควบคุมสื่ออยู่"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"ซ่อนการควบคุมสื่ออยู่ กด d-pad เพื่อแสดง"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"เสร็จสิ้น"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ต่อไป"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"รหัสข้อผิดพลาด MediaPlayer %1$d เพิ่มเติม %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"เริ่มต้นใช้งาน"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ถัดไป"</string>
</resources>
diff --git a/v17/leanback/res/values-tl/strings.xml b/v17/leanback/res/values-tl/strings.xml
index 735e7ec..0214efc 100644
--- a/v17/leanback/res/values-tl/strings.xml
+++ b/v17/leanback/res/values-tl/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"I-enable ang Paglalagay ng Subtitle"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"I-disable ang Paglalagay ng Subtitle"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Pumasok sa Picture In Picture Mode"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Ipinapakita ang mga kontrol ng media"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Nakatago ang mga kontrol ng media, pindutin ang d-pad upang ipakita"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Tapusin"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Magpatuloy"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"Code ng error na %1$d ng MediaPlayer na may extra na %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"MAGSIMULA"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Susunod"</string>
</resources>
diff --git a/v17/leanback/res/values-tr/strings.xml b/v17/leanback/res/values-tr/strings.xml
index f04c2b1..1f7fe3a 100644
--- a/v17/leanback/res/values-tr/strings.xml
+++ b/v17/leanback/res/values-tr/strings.xml
@@ -47,15 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Yüksek Kalitede Oynatmayı Devre Dışı Bırak"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Altyazıları Etkinleştir"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Altyazıları Devre Dışı Bırak"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Resim İçinde Resim Moduna Geç"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Pencere İçinde Pencere Moduna Geç"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"."</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Medya denetimleri gösteriliyor"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Medya denetimleri gizli durumda. Görüntülemek için d-pad\'e basın."</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Son"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Devam"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer hata kodu %1$d ekstra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"BAŞLA"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Sonraki"</string>
</resources>
diff --git a/v17/leanback/res/values-uk/strings.xml b/v17/leanback/res/values-uk/strings.xml
index 12a9ebf..1829560 100644
--- a/v17/leanback/res/values-uk/strings.xml
+++ b/v17/leanback/res/values-uk/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Елементи керування медіа сховано. Натисніть цифрову панель, щоб показати їх"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Закінчити"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Продовжити"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Код помилки MediaPlayer: %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"ПОЧАТИ"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Далі"</string>
diff --git a/v17/leanback/res/values-ur/strings.xml b/v17/leanback/res/values-ur/strings.xml
index a5343a2..f5b7a25 100644
--- a/v17/leanback/res/values-ur/strings.xml
+++ b/v17/leanback/res/values-ur/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"سب ٹائٹلز کو فعال کریں"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"سب ٹائٹلز کو غیر فعال کریں"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"\'تصویر میں تصویر موڈ\' میں داخل ہوں"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"میڈیا کنٹرولز عیاں ہیں"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"میڈیا کنٹرولز مخفی ہیں، شو کرنے کیلئے d-pad دبائیں"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"مکمل کریں"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"جاری رکھیں"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"میڈیا پلیئر کی خرابی کا کوڈ %1$d اضافی %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"شروع کریں"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"اگلا"</string>
</resources>
diff --git a/v17/leanback/res/values-uz/strings.xml b/v17/leanback/res/values-uz/strings.xml
index f09f78f..9719bc6 100644
--- a/v17/leanback/res/values-uz/strings.xml
+++ b/v17/leanback/res/values-uz/strings.xml
@@ -47,13 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Yuqori sifatni o‘chirib qo‘yish"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Taglavhalarni yoqish"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Taglavhalarni o‘chirib qo‘yish"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Tasvir ichida tasvir rejimiga kirish"</string>
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Tasvir ustida tasvir rejimiga kirish"</string>
<string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Boshqaruv elementlari ochiq"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Boshqaruv elementlari berkitilgan, ochish uchun D-pad tugmasini bosing"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Tugatish"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Davom etish"</string>
- <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer xatosi kodi: %1$d, %2$d"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"Media pleyer xatoligi kodi: %1$d (yana: %2$d)"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"BOSHLADIK"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Keyingisi"</string>
</resources>
diff --git a/v17/leanback/res/values-vi/strings.xml b/v17/leanback/res/values-vi/strings.xml
index fb8c229..0de7ca4 100644
--- a/v17/leanback/res/values-vi/strings.xml
+++ b/v17/leanback/res/values-vi/strings.xml
@@ -47,15 +47,15 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Tắt chế độ chất lượng cao"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Bật phụ đề"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Tắt phụ đề"</string>
- <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Vào ảnh ở chế độ ảnh"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Vào chế độ ảnh trong ảnh"</string>
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"Điều khiển phương tiện được hiển thị"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Điều khiển phương tiện bị ẩn, nhấn d-pad để hiển thị"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Hoàn tất"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Tiếp tục"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"Mã lỗi MediaPlayer %1$d %2$d bổ sung"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"BẮT ĐẦU"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Tiếp theo"</string>
</resources>
diff --git a/v17/leanback/res/values-zh-rCN/strings.xml b/v17/leanback/res/values-zh-rCN/strings.xml
index 1990d40..d635311 100644
--- a/v17/leanback/res/values-zh-rCN/strings.xml
+++ b/v17/leanback/res/values-zh-rCN/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"开启字幕"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"关闭字幕"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"进入画中画模式"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"媒体控件已显示"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"媒体控件已隐藏,按 D-pad 即可显示"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"继续"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer 错误代码:%1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"开始使用"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"下一页"</string>
</resources>
diff --git a/v17/leanback/res/values-zh-rHK/strings.xml b/v17/leanback/res/values-zh-rHK/strings.xml
index 00df362..2da2e73 100644
--- a/v17/leanback/res/values-zh-rHK/strings.xml
+++ b/v17/leanback/res/values-zh-rHK/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"啟用字幕"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"停用字幕"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"進入「畫中畫模式」"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"畫面已顯示媒體控制項"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"畫面已隱藏媒體控制項,按十字鍵即可顯示"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"繼續"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer 錯誤代碼:%1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"開始使用"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"下一頁"</string>
</resources>
diff --git a/v17/leanback/res/values-zh-rTW/strings.xml b/v17/leanback/res/values-zh-rTW/strings.xml
index 421d0ff..721dc6e 100644
--- a/v17/leanback/res/values-zh-rTW/strings.xml
+++ b/v17/leanback/res/values-zh-rTW/strings.xml
@@ -48,14 +48,14 @@
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"啟用字幕"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"停用字幕"</string>
<string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"進入子母畫面模式"</string>
- <!-- no translation found for lb_playback_time_separator (3208380806582304911) -->
- <skip />
+ <string name="lb_playback_time_separator" msgid="3208380806582304911">"/"</string>
<string name="lb_playback_controls_shown" msgid="6382160135512023238">"媒體控制項已顯示"</string>
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"媒體控制項已隱藏,按下 D-Pad 即可顯示"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"繼續"</string>
- <!-- no translation found for lb_media_player_error (3650250994187305396) -->
- <skip />
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+ <string name="lb_media_player_error" msgid="3650250994187305396">"MediaPlayer 錯誤代碼:%1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"開始使用"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"繼續"</string>
</resources>
diff --git a/v17/leanback/res/values-zu/strings.xml b/v17/leanback/res/values-zu/strings.xml
index 06f5641..6812abd 100644
--- a/v17/leanback/res/values-zu/strings.xml
+++ b/v17/leanback/res/values-zu/strings.xml
@@ -53,6 +53,8 @@
<string name="lb_playback_controls_hidden" msgid="8940984081242033574">"Izilawuli zemidiya zifihliwe, cindezela ku-d-pad ukuze uzibonise"</string>
<string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Qeda"</string>
<string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Qhubeka"</string>
+ <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+ <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
<string name="lb_media_player_error" msgid="3650250994187305396">"Ikhodi yephutha le-MediaPlayer %1$d extra %2$d"</string>
<string name="lb_onboarding_get_started" msgid="6961440391306351139">"QALISA"</string>
<string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Okulandelayo"</string>
diff --git a/v17/leanback/res/values/strings.xml b/v17/leanback/res/values/strings.xml
index 1d6c417..aef086a 100644
--- a/v17/leanback/res/values/strings.xml
+++ b/v17/leanback/res/values/strings.xml
@@ -91,6 +91,11 @@
<!-- Title of standard Continue action for GuidedStepFragment -->
<string name="lb_guidedaction_continue_title">Continue</string>
+ <!-- Separator for date picker [CHAR LIMIT=2] -->
+ <string name="lb_date_separator">/</string>
+ <!-- Separator for time picker [CHAR LIMIT=2] -->
+ <string name="lb_time_separator">:</string>
+
<!-- Error string for MediaPlayer -->
<string name="lb_media_player_error">MediaPlayer error code %1$d extra %2$d</string>
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
index 2744dec..7725bf3 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
@@ -29,7 +29,6 @@
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
-import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
@@ -75,6 +74,7 @@
super(context, attrs, defStyleAttr);
updateCurrentLocale();
+ setSeparator(mConstant.dateSeparator);
final TypedArray attributesArray = context.obtainStyledAttributes(attrs,
R.styleable.lbDatePicker);
@@ -120,98 +120,6 @@
}
/**
- * Returns the best localized representation of the date for the given date format and the
- * current locale.
- *
- * @param datePickerFormat The date format skeleton (e.g. "dMy") used to gather the
- * appropriate representation of the date in the current locale.
- *
- * @return The best localized representation of the date for the given date format
- */
- String getBestYearMonthDayPattern(String datePickerFormat) {
- final String yearPattern;
- if (PickerUtility.SUPPORTS_BEST_DATE_TIME_PATTERN) {
- yearPattern = android.text.format.DateFormat.getBestDateTimePattern(mConstant.locale,
- datePickerFormat);
- } else {
- final java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(
- getContext());
- if (dateFormat instanceof SimpleDateFormat) {
- yearPattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();
- } else {
- yearPattern = DATE_FORMAT;
- }
- }
- return TextUtils.isEmpty(yearPattern) ? DATE_FORMAT : yearPattern;
- }
-
- /**
- * Extracts the separators used to separate date fields (including before the first and after
- * the last date field). The separators can vary based on the individual locale date format,
- * defined in the Unicode CLDR and cannot be supposed to be "/".
- *
- * See http://unicode.org/cldr/trac/browser/trunk/common/main
- *
- * For example, for Croatian in dMy format, the best localized representation is "d. M. y". This
- * method returns {"", ".", ".", "."}, where the first separator indicates nothing needs to be
- * displayed to the left of the day field, "." needs to be displayed tos the right of the day
- * field, and so forth.
- *
- * @return The ArrayList of separators to populate between the actual date fields in the
- * DatePicker.
- */
- List<CharSequence> extractSeparators() {
- // Obtain the time format string per the current locale (e.g. h:mm a)
- String hmaPattern = getBestYearMonthDayPattern(mDatePickerFormat);
-
- List<CharSequence> separators = new ArrayList<>();
- StringBuilder sb = new StringBuilder();
- char lastChar = '\0';
- // See http://www.unicode.org/reports/tr35/tr35-dates.html for date formats
- final char[] dateFormats = {'Y', 'y', 'M', 'm', 'D', 'd'};
- boolean processingQuote = false;
- for (int i = 0; i < hmaPattern.length(); i++) {
- char c = hmaPattern.charAt(i);
- if (c == ' ') {
- continue;
- }
- if (c == '\'') {
- if (!processingQuote) {
- sb.setLength(0);
- processingQuote = true;
- } else {
- processingQuote = false;
- }
- continue;
- }
- if (processingQuote) {
- sb.append(c);
- } else {
- if (isAnyOf(c, dateFormats)) {
- if (c != lastChar) {
- separators.add(sb.toString());
- sb.setLength(0);
- }
- } else {
- sb.append(c);
- }
- }
- lastChar = c;
- }
- separators.add(sb.toString());
- return separators;
- }
-
- private static boolean isAnyOf(char c, char[] any) {
- for (int i = 0; i < any.length; i++) {
- if (c == any[i]) {
- return true;
- }
- }
- return false;
- }
-
- /**
* Changes format of showing dates. For example "YMD".
* @param datePickerFormat Format of showing dates.
*/
@@ -220,22 +128,16 @@
datePickerFormat = new String(
android.text.format.DateFormat.getDateFormatOrder(getContext()));
}
+ datePickerFormat = datePickerFormat.toUpperCase();
if (TextUtils.equals(mDatePickerFormat, datePickerFormat)) {
return;
}
mDatePickerFormat = datePickerFormat;
- List<CharSequence> separators = extractSeparators();
- if (separators.size() != (datePickerFormat.length() + 1)) {
- throw new IllegalStateException("Separators size: " + separators.size() + " must equal"
- + " the size of datePickerFormat: " + datePickerFormat.length() + " + 1");
- }
- setSeparators(separators);
mYearColumn = mMonthColumn = mDayColumn = null;
mColYearIndex = mColDayIndex = mColMonthIndex = -1;
- String dateFieldsPattern = datePickerFormat.toUpperCase();
ArrayList<PickerColumn> columns = new ArrayList<PickerColumn>(3);
- for (int i = 0; i < dateFieldsPattern.length(); i++) {
- switch (dateFieldsPattern.charAt(i)) {
+ for (int i = 0; i < datePickerFormat.length(); i++) {
+ switch (datePickerFormat.charAt(i)) {
case 'Y':
if (mYearColumn != null) {
throw new IllegalArgumentException("datePicker format error");
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
index 486e877..28d7aeb 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
@@ -20,7 +20,6 @@
import android.support.v17.leanback.widget.OnChildViewHolderSelectedListener;
import android.support.v17.leanback.widget.VerticalGridView;
import android.support.v7.widget.RecyclerView;
-import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.KeyEvent;
@@ -34,7 +33,6 @@
import android.widget.TextView;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
/**
@@ -76,53 +74,23 @@
private float mVisibleItems = 1;
private int mSelectedColumn = 0;
- private List<CharSequence> mSeparators = new ArrayList<>();
+ private CharSequence mSeparator;
private int mPickerItemLayoutId = R.layout.lb_picker_item;
private int mPickerItemTextViewId = 0;
/**
* Gets separator string between columns.
- *
- * @return The separator that will be populated between all the Picker columns.
- * @deprecated Use {@link #getSeparators()}
*/
public final CharSequence getSeparator() {
- return mSeparators.get(0);
+ return mSeparator;
}
/**
* Sets separator String between Picker columns.
- *
* @param separator Separator String between Picker columns.
*/
public final void setSeparator(CharSequence separator) {
- setSeparators(Arrays.asList(separator));
- }
-
- /**
- * Returns the list of separators that will be populated between the picker column fields.
- *
- * @return The list of separators populated between the picker column fields.
- */
- public final List<CharSequence> getSeparators() {
- return mSeparators;
- }
-
- /**
- * Sets the list of separators that will be populated between the Picker columns. The
- * number of the separators should be either 1 indicating the same separator used between all
- * the columns fields (and nothing will be placed before the first and after the last column),
- * or must be one unit larger than the number of columns passed to {@link #setColumns(List)}.
- * In the latter case, the list of separators corresponds to the positions before the first
- * column all the way to the position after the last column.
- * An empty string for a given position indicates no separators needs to be placed for that
- * position, otherwise a TextView with the given String will be created and placed there.
- *
- * @param separators The list of separators to be populated between the Picker columns.
- */
- public final void setSeparators(List<CharSequence> separators) {
- mSeparators.clear();
- mSeparators.addAll(separators);
+ mSeparator = separator;
}
/**
@@ -148,7 +116,6 @@
* layout provided by {@link Picker#getPickerItemLayoutId()} or 0 if the
* layout provided by {@link Picker#getPickerItemLayoutId()} is a {link
* TextView}.
- *
* @param textViewId View id of TextView inside a Picker item, or 0 if the Picker item is a
* TextView.
*/
@@ -158,6 +125,9 @@
/**
* Creates a Picker widget.
+ * @param context
+ * @param attrs
+ * @param defStyleAttr
*/
public Picker(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
@@ -170,8 +140,7 @@
mVisibleColumnAlpha = 0.5f; //getFloat(R.dimen.picker_item_visible_column_item_alpha);
mInvisibleColumnAlpha = 0f; //getFloat(R.dimen.picker_item_invisible_column_item_alpha);
- mAlphaAnimDuration =
- 200; // mContext.getResources().getInteger(R.integer.dialog_animation_duration);
+ mAlphaAnimDuration = 200; // mContext.getResources().getInteger(R.integer.dialog_animation_duration);
mDecelerateInterpolator = new DecelerateInterpolator(2.5F);
mAccelerateInterpolator = new AccelerateInterpolator(2.5F);
@@ -183,8 +152,7 @@
/**
* Get nth PickerColumn.
- *
- * @param colIndex Index of PickerColumn.
+ * @param colIndex Index of PickerColumn.
* @return PickerColumn at colIndex or null if {@link #setColumns(List)} is not called yet.
*/
public PickerColumn getColumnAt(int colIndex) {
@@ -196,7 +164,6 @@
/**
* Get number of PickerColumns.
- *
* @return Number of PickerColumns or 0 if {@link #setColumns(List)} is not called yet.
*/
public int getColumnsCount() {
@@ -208,30 +175,9 @@
/**
* Set columns and create Views.
- *
- * @param columns The actual focusable columns of a picker which are scrollable if the field
- * takes more than one value (e.g. for a DatePicker, day, month, and year fields
- * and for TimePicker, hour, minute, and am/pm fields form the columns).
+ * @param columns PickerColumns to be shown in the Picker.
*/
public void setColumns(List<PickerColumn> columns) {
- if (mSeparators.size() == 0) {
- throw new IllegalStateException("Separators size is: " + mSeparators.size()
- + ". At least one separator must be provided");
- } else if (mSeparators.size() == 1) {
- CharSequence separator = mSeparators.get(0);
- mSeparators.clear();
- mSeparators.add("");
- for (int i = 0; i < columns.size() - 1; i++) {
- mSeparators.add(separator);
- }
- mSeparators.add("");
- } else {
- if (mSeparators.size() != (columns.size() + 1)) {
- throw new IllegalStateException("Separators size: " + mSeparators.size() + " must"
- + "equal the size of columns: " + columns.size() + " + 1");
- }
- }
-
mColumnViews.clear();
mPickerView.removeAllViews();
mColumns = new ArrayList<PickerColumn>(columns);
@@ -240,13 +186,6 @@
}
LayoutInflater inflater = LayoutInflater.from(getContext());
int totalCol = getColumnsCount();
-
- if (!TextUtils.isEmpty(mSeparators.get(0))) {
- TextView separator = (TextView) inflater.inflate(
- R.layout.lb_picker_separator, mPickerView, false);
- separator.setText(mSeparators.get(0));
- mPickerView.addView(separator);
- }
for (int i = 0; i < totalCol; i++) {
final int colIndex = i;
final VerticalGridView columnView = (VerticalGridView) inflater.inflate(
@@ -263,16 +202,16 @@
// as a result of the picker getting activated, otherwise the cached views with the
// wrong alphas could be laid out.
columnView.setItemViewCacheSize(0);
-
mColumnViews.add(columnView);
+
// add view to root
mPickerView.addView(columnView);
- if (!TextUtils.isEmpty(mSeparators.get(i + 1))) {
- // add a separator if not the last element
+ // add a separator if not the last element
+ if (i != totalCol - 1 && getSeparator() != null) {
TextView separator = (TextView) inflater.inflate(
R.layout.lb_picker_separator, mPickerView, false);
- separator.setText(mSeparators.get(i + 1));
+ separator.setText(getSeparator());
mPickerView.addView(separator);
}
@@ -285,9 +224,8 @@
/**
* When column labels change or column range changes, call this function to re-populate the
* selection list. Note this function cannot be called from RecyclerView layout/scroll pass.
- *
* @param columnIndex Index of column to update.
- * @param column New column to update.
+ * @param column New column to update.
*/
public void setColumnAt(int columnIndex, PickerColumn column) {
mColumns.set(columnIndex, column);
@@ -301,9 +239,8 @@
/**
* Manually set current value of a column. The function will update UI and notify listeners.
- *
- * @param columnIndex Index of column to update.
- * @param value New value of the column.
+ * @param columnIndex Index of column to update.
+ * @param value New value of the column.
* @param runAnimation True to scroll to the value or false otherwise.
*/
public void setColumnValue(int columnIndex, int value, boolean runAnimation) {
@@ -333,7 +270,6 @@
/**
* Register a callback to be invoked when the picker's value has changed.
- *
* @param listener The callback to ad
*/
public void addOnValueChangedListener(PickerValueListener listener) {
@@ -345,7 +281,6 @@
/**
* Remove a previously installed value changed callback
- *
* @param listener The callback to remove.
*/
public void removeOnValueChangedListener(PickerValueListener listener) {
@@ -376,7 +311,7 @@
if (columnShownAsActivated) {
setOrAnimateAlpha(view, animate, mFocusedAlpha, -1, mDecelerateInterpolator);
} else {
- setOrAnimateAlpha(view, animate, mUnfocusedAlpha, -1, mDecelerateInterpolator);
+ setOrAnimateAlpha(view, animate, mUnfocusedAlpha, -1, mDecelerateInterpolator);
}
} else {
// set alpha for remaining items in the column
@@ -408,12 +343,11 @@
/**
* Classes extending {@link Picker} can override this function to supply the
* behavior when a list has been scrolled. Subclass may call {@link #setColumnValue(int, int,
- * boolean)} and or {@link #setColumnAt(int, PickerColumn)}. Subclass should not directly call
+ * boolean)} and or {@link #setColumnAt(int,PickerColumn)}. Subclass should not directly call
* {@link PickerColumn#setCurrentValue(int)} which does not update internal state or notify
* listeners.
- *
* @param columnIndex index of which column was changed.
- * @param newValue A new value desired to be set on the column.
+ * @param newValue A new value desired to be set on the column.
*/
public void onColumnValueChanged(int columnIndex, int newValue) {
PickerColumn column = mColumns.get(columnIndex);
@@ -491,37 +425,35 @@
private final OnChildViewHolderSelectedListener mColumnChangeListener = new
OnChildViewHolderSelectedListener() {
- @Override
- public void onChildViewHolderSelected(RecyclerView parent,
- RecyclerView.ViewHolder child,
- int position, int subposition) {
- PickerScrollArrayAdapter pickerScrollArrayAdapter =
- (PickerScrollArrayAdapter) parent
- .getAdapter();
+ @Override
+ public void onChildViewHolderSelected(RecyclerView parent, RecyclerView.ViewHolder child,
+ int position, int subposition) {
+ PickerScrollArrayAdapter pickerScrollArrayAdapter = (PickerScrollArrayAdapter) parent
+ .getAdapter();
- int colIndex = mColumnViews.indexOf(parent);
- updateColumnAlpha(colIndex, true);
- if (child != null) {
- int newValue = mColumns.get(colIndex).getMinValue() + position;
- onColumnValueChanged(colIndex, newValue);
- }
- }
+ int colIndex = mColumnViews.indexOf(parent);
+ updateColumnAlpha(colIndex, true);
+ if (child != null) {
+ int newValue = mColumns.get(colIndex).getMinValue() + position;
+ onColumnValueChanged(colIndex, newValue);
+ }
+ }
- };
+ };
@Override
public boolean dispatchKeyEvent(android.view.KeyEvent event) {
if (isActivated()) {
final int keyCode = event.getKeyCode();
switch (keyCode) {
- case KeyEvent.KEYCODE_DPAD_CENTER:
- case KeyEvent.KEYCODE_ENTER:
- if (event.getAction() == KeyEvent.ACTION_UP) {
- performClick();
- }
- break;
- default:
- return super.dispatchKeyEvent(event);
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ case KeyEvent.KEYCODE_ENTER:
+ if (event.getAction() == KeyEvent.ACTION_UP) {
+ performClick();
+ }
+ break;
+ default:
+ return super.dispatchKeyEvent(event);
}
return true;
}
@@ -569,11 +501,9 @@
}
}
}
-
/**
* Returns number of visible items showing in a column when it's activated. The default value
* is 3.
- *
* @return Number of visible items showing in a column when it's activated.
*/
public float getActivatedVisibleItemCount() {
@@ -583,7 +513,6 @@
/**
* Changes number of visible items showing in a column when it's activated. The default value
* is 3.
- *
* @param visiblePickerItems Number of visible items showing in a column when it's activated.
*/
public void setActivatedVisibleItemCount(float visiblePickerItems) {
@@ -601,7 +530,6 @@
/**
* Returns number of visible items showing in a column when it's not activated. The default
* value is 1.
- *
* @return Number of visible items showing in a column when it's not activated.
*/
public float getVisibleItemCount() {
@@ -611,7 +539,6 @@
/**
* Changes number of visible items showing in a column when it's not activated. The default
* value is 1.
- *
* @param pickerItems Number of visible items showing in a column when it's not activated.
*/
public void setVisibleItemCount(float pickerItems) {
@@ -678,7 +605,6 @@
* Change current selected column. Picker shows multiple items on selected column if Picker has
* focus. Picker shows multiple items on all column if Picker has no focus (e.g. a Touchscreen
* screen).
- *
* @param columnIndex Index of column to activate.
*/
public void setSelectedColumn(int columnIndex) {
@@ -692,7 +618,6 @@
/**
* Get current activated column index.
- *
* @return Current activated column index.
*/
public int getSelectedColumn() {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerUtility.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerUtility.java
index bff278a..1e3a28f 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerUtility.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/PickerUtility.java
@@ -17,7 +17,7 @@
package android.support.v17.leanback.widget.picker;
import android.content.res.Resources;
-import android.os.Build;
+import android.support.v17.leanback.R;
import java.text.DateFormatSymbols;
import java.util.Calendar;
@@ -29,13 +29,11 @@
*/
class PickerUtility {
- // Whether the API version supports the use of {@link DateFormat#getBestDateTimePattern()}
- static final boolean SUPPORTS_BEST_DATE_TIME_PATTERN =
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
public static class DateConstant {
public final Locale locale;
public final String[] months;
public final String[] days;
+ public final String dateSeparator;
private DateConstant(Locale locale, Resources resources) {
this.locale = locale;
@@ -44,6 +42,7 @@
Calendar calendar = Calendar.getInstance(locale);
days = createStringIntArrays(calendar.getMinimum(Calendar.DAY_OF_MONTH),
calendar.getMaximum(Calendar.DAY_OF_MONTH), "%02d");
+ dateSeparator = resources.getString(R.string.lb_date_separator);
}
}
@@ -53,6 +52,7 @@
public final String[] hours24;
public final String[] minutes;
public final String[] ampm;
+ public final String timeSeparator;
private TimeConstant(Locale locale, Resources resources) {
this.locale = locale;
@@ -61,6 +61,7 @@
hours24 = createStringIntArrays(0, 23, "%02d");
minutes = createStringIntArrays(0, 59, "%02d");
ampm = symbols.getAmPmStrings();
+ timeSeparator = resources.getString(R.string.lb_time_separator);
}
}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java
index 09a0ea9..29059ba 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/TimePicker.java
@@ -18,17 +18,18 @@
import android.content.Context;
import android.content.res.TypedArray;
+import android.os.Build;
import android.support.annotation.IntRange;
import android.support.v17.leanback.R;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.view.View;
+import android.view.ViewGroup;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
-import java.util.List;
import java.util.Locale;
/**
@@ -61,6 +62,8 @@
PickerColumn mHourColumn;
PickerColumn mMinuteColumn;
PickerColumn mAmPmColumn;
+ private ViewGroup mPickerView;
+ private View mAmPmSeparatorView;
int mColHourIndex;
int mColMinuteIndex;
int mColAmPmIndex;
@@ -73,8 +76,6 @@
private int mCurrentMinute;
private int mCurrentAmPmIndex;
- private String mTimePickerFormat;
-
/**
* Constructor called when inflating a TimePicker widget. This version uses a default style of
* 0, so the only attribute values applied are those in the Context's Theme and the given
@@ -104,6 +105,8 @@
mConstant = PickerUtility.getTimeConstantInstance(Locale.getDefault(),
context.getResources());
+ setSeparator(mConstant.timeSeparator);
+ mPickerView = findViewById(R.id.picker);
final TypedArray attributesArray = context.obtainStyledAttributes(attrs,
R.styleable.lbTimePicker);
mIs24hFormat = attributesArray.getBoolean(R.styleable.lbTimePicker_is24HourFormat,
@@ -111,17 +114,25 @@
boolean useCurrentTime = attributesArray.getBoolean(R.styleable.lbTimePicker_useCurrentTime,
true);
- // The following 2 methods must be called after setting mIs24hFormat since this attribute is
- // used to extract the time format string.
- updateColumns();
- updateColumnsRange();
+ updateColumns(getTimePickerFormat());
+
+ // The column range for the minute and AM/PM column is static and does not change, whereas
+ // the hour column range can change depending on whether 12 or 24 hour format is set at
+ // any given time.
+ updateHourColumn(false);
+ updateMin(mMinuteColumn, 0);
+ updateMax(mMinuteColumn, 59);
+
+ updateMin(mAmPmColumn, 0);
+ updateMax(mAmPmColumn, 1);
+
+ updateAmPmColumn();
if (useCurrentTime) {
Calendar currentDate = PickerUtility.getCalendarForLocale(null,
mConstant.locale);
setHour(currentDate.get(Calendar.HOUR_OF_DAY));
setMinute(currentDate.get(Calendar.MINUTE));
- setAmPmValue();
}
}
@@ -142,104 +153,22 @@
}
/**
- * @return The best localized representation of time for the current locale
- */
- String getBestHourMinutePattern() {
- final String hourPattern;
- if (PickerUtility.SUPPORTS_BEST_DATE_TIME_PATTERN) {
- hourPattern = DateFormat.getBestDateTimePattern(mConstant.locale, mIs24hFormat ? "Hma"
- : "hma");
- } else {
- final java.text.DateFormat dateFormat =
- SimpleDateFormat.getTimeInstance(SimpleDateFormat.FULL, mConstant.locale);
- if (dateFormat instanceof SimpleDateFormat) {
- String defaultPattern = ((SimpleDateFormat) dateFormat).toPattern();
- defaultPattern = defaultPattern.replace("s", "");
- if (mIs24hFormat) {
- defaultPattern = defaultPattern.replace('h', 'H');
- }
- hourPattern = defaultPattern;
- } else {
- hourPattern = mIs24hFormat ? "H:mma" : "h:mma";
- }
- }
- return TextUtils.isEmpty(hourPattern) ? "h:mma" : hourPattern;
- }
-
- /**
- * Extracts the separators used to separate time fields (including before the first and after
- * the last time field). The separators can vary based on the individual locale and 12 or
- * 24 hour time format, defined in the Unicode CLDR and cannot be supposed to be ":".
- *
- * See http://unicode.org/cldr/trac/browser/trunk/common/main
- *
- * For example, for english in 12 hour format
- * (time pattern of "h:mm a"), this will return {"", ":", "", ""}, where the first separator
- * indicates nothing needs to be displayed to the left of the hour field, ":" needs to be
- * displayed to the right of hour field, and so forth.
- *
- * @return The ArrayList of separators to populate between the actual time fields in the
- * TimePicker.
- */
- List<CharSequence> extractSeparators() {
- // Obtain the time format string per the current locale (e.g. h:mm a)
- String hmaPattern = getBestHourMinutePattern();
-
- List<CharSequence> separators = new ArrayList<>();
- StringBuilder sb = new StringBuilder();
- char lastChar = '\0';
- // See http://www.unicode.org/reports/tr35/tr35-dates.html for hour formats
- final char[] timeFormats = {'H', 'h', 'K', 'k', 'm', 'M', 'a'};
- boolean processingQuote = false;
- for (int i = 0; i < hmaPattern.length(); i++) {
- char c = hmaPattern.charAt(i);
- if (c == ' ') {
- continue;
- }
- if (c == '\'') {
- if (!processingQuote) {
- sb.setLength(0);
- processingQuote = true;
- } else {
- processingQuote = false;
- }
- continue;
- }
- if (processingQuote) {
- sb.append(c);
- } else {
- if (isAnyOf(c, timeFormats)) {
- if (c != lastChar) {
- separators.add(sb.toString());
- sb.setLength(0);
- }
- } else {
- sb.append(c);
- }
- }
- lastChar = c;
- }
- separators.add(sb.toString());
- return separators;
- }
-
- private static boolean isAnyOf(char c, char[] any) {
- for (int i = 0; i < any.length; i++) {
- if (c == any[i]) {
- return true;
- }
- }
- return false;
- }
-
- /**
*
* @return the time picker format string based on the current system locale and the layout
* direction
*/
- private String extractTimeFields() {
+ private String getTimePickerFormat() {
// Obtain the time format string per the current locale (e.g. h:mm a)
- String hmaPattern = getBestHourMinutePattern();
+ String hmaPattern;
+ if (Build.VERSION.SDK_INT >= 18) {
+ hmaPattern = DateFormat.getBestDateTimePattern(mConstant.locale, "hma");
+ } else {
+ // getTimeInstance is not very reliable and it may not include 'a' (for AM/PM)
+ // in the returned pattern string. In those cases, we assume that am/pm appears at the
+ // end of the fields. Need to find a more reliable way for API below 18.
+ hmaPattern = ((SimpleDateFormat) java.text.DateFormat
+ .getTimeInstance(java.text.DateFormat.FULL, mConstant.locale)).toPattern();
+ }
boolean isRTL = TextUtils.getLayoutDirectionFromLocale(mConstant.locale) == View
.LAYOUT_DIRECTION_RTL;
@@ -248,35 +177,21 @@
// Hour will always appear to the left of minutes regardless of layout direction.
String timePickerFormat = isRTL ? "mh" : "hm";
- if (is24Hour()) {
- return timePickerFormat;
- } else {
- return isAmPmAtEnd ? (timePickerFormat + "a") : ("a" + timePickerFormat);
- }
+ return isAmPmAtEnd ? (timePickerFormat + "a") : ("a" + timePickerFormat);
}
- private void updateColumns() {
- String timePickerFormat = getBestHourMinutePattern();
- if (TextUtils.equals(timePickerFormat, mTimePickerFormat)) {
- return;
+ private void updateColumns(String timePickerFormat) {
+ if (TextUtils.isEmpty(timePickerFormat)) {
+ timePickerFormat = "hma";
}
- mTimePickerFormat = timePickerFormat;
-
- String timeFieldsPattern = extractTimeFields();
- List<CharSequence> separators = extractSeparators();
- if (separators.size() != (timeFieldsPattern.length() + 1)) {
- throw new IllegalStateException("Separators size: " + separators.size() + " must equal"
- + " the size of timeFieldsPattern: " + timeFieldsPattern.length() + " + 1");
- }
- setSeparators(separators);
- timeFieldsPattern = timeFieldsPattern.toUpperCase();
+ timePickerFormat = timePickerFormat.toUpperCase();
mHourColumn = mMinuteColumn = mAmPmColumn = null;
mColHourIndex = mColMinuteIndex = mColAmPmIndex = -1;
ArrayList<PickerColumn> columns = new ArrayList<>(3);
- for (int i = 0; i < timeFieldsPattern.length(); i++) {
- switch (timeFieldsPattern.charAt(i)) {
+ for (int i = 0; i < timePickerFormat.length(); i++) {
+ switch (timePickerFormat.charAt(i)) {
case 'H':
columns.add(mHourColumn = new PickerColumn());
mHourColumn.setStaticLabels(mConstant.hours24);
@@ -299,28 +214,38 @@
}
}
setColumns(columns);
+ mAmPmSeparatorView = mPickerView.getChildAt(mColAmPmIndex == 0 ? 1 :
+ (2 * mColAmPmIndex - 1));
}
- private void updateColumnsRange() {
- // updateHourColumn(false);
+ /**
+ * Updates the range in the hour column and notifies column changed if notifyChanged is true.
+ * Hour column can have either [0-23] or [1-12] depending on whether the 24 hour format is set
+ * or not.
+ *
+ * @param notifyChanged {code true} if we should notify data set changed on the hour column,
+ * {@code false} otherwise.
+ */
+ private void updateHourColumn(boolean notifyChanged) {
updateMin(mHourColumn, mIs24hFormat ? 0 : 1);
updateMax(mHourColumn, mIs24hFormat ? 23 : 12);
-
- updateMin(mMinuteColumn, 0);
- updateMax(mMinuteColumn, 59);
-
- if (mAmPmColumn != null) {
- updateMin(mAmPmColumn, 0);
- updateMax(mAmPmColumn, 1);
+ if (notifyChanged) {
+ setColumnAt(mColHourIndex, mHourColumn);
}
}
/**
- * Updates the value of AM/PM column for a 12 hour time format. The correct value should already
- * be calculated before this method is called by calling setHour.
+ * Updates AM/PM column depending on whether the 24 hour format is set or not. The visibility of
+ * this column is set to {@code GONE} for a 24 hour format, and {@code VISIBLE} in 12 hour
+ * format. This method also updates the value of this column for a 12 hour format.
*/
- private void setAmPmValue() {
- if (!is24Hour()) {
+ private void updateAmPmColumn() {
+ if (mIs24hFormat) {
+ mColumnViews.get(mColAmPmIndex).setVisibility(GONE);
+ mAmPmSeparatorView.setVisibility(GONE);
+ } else {
+ mColumnViews.get(mColAmPmIndex).setVisibility(VISIBLE);
+ mAmPmSeparatorView.setVisibility(VISIBLE);
setColumnValue(mColAmPmIndex, mCurrentAmPmIndex, false);
}
}
@@ -336,7 +261,7 @@
throw new IllegalArgumentException("hour: " + hour + " is not in [0-23] range in");
}
mCurrentHour = hour;
- if (!is24Hour()) {
+ if (!mIs24hFormat) {
if (mCurrentHour >= HOURS_IN_HALF_DAY) {
mCurrentAmPmIndex = PM_INDEX;
if (mCurrentHour > HOURS_IN_HALF_DAY) {
@@ -348,7 +273,7 @@
mCurrentHour = HOURS_IN_HALF_DAY;
}
}
- setAmPmValue();
+ updateAmPmColumn();
}
setColumnValue(mColHourIndex, mCurrentHour, false);
}
@@ -376,6 +301,9 @@
* @see #getMinute()
*/
public void setMinute(@IntRange(from = 0, to = 59) int minute) {
+ if (mCurrentMinute == minute) {
+ return;
+ }
if (minute < 0 || minute > 59) {
throw new IllegalArgumentException("minute: " + minute + " is not in [0-59] range.");
}
@@ -406,14 +334,10 @@
}
// the ordering of these statements is important
int currentHour = getHour();
- int currentMinute = getMinute();
mIs24hFormat = is24Hour;
- updateColumns();
- updateColumnsRange();
-
+ updateHourColumn(true);
setHour(currentHour);
- setMinute(currentMinute);
- setAmPmValue();
+ updateAmPmColumn();
}
/**
diff --git a/v17/leanback/tests/AndroidManifest.xml b/v17/leanback/tests/AndroidManifest.xml
index dc8c963..b21246e 100644
--- a/v17/leanback/tests/AndroidManifest.xml
+++ b/v17/leanback/tests/AndroidManifest.xml
@@ -22,11 +22,11 @@
<activity android:name="android.support.v17.leanback.widget.GridActivity"
android:exported="true"/>
- <activity android:name="android.support.v17.leanback.widget.picker.TimePickerActivity"
+ <activity android:name="android.support.v17.leanback.widget.TimePickerActivity"
android:exported="true"
android:theme="@style/Theme.Leanback"/>
- <activity android:name="android.support.v17.leanback.widget.picker.DatePickerActivity"
+ <activity android:name="android.support.v17.leanback.widget.DatePickerActivity"
android:exported="true"
android:theme="@style/Theme.Leanback"/>
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerActivity.java
similarity index 95%
rename from v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerActivity.java
index dda9c91..eda702f 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerActivity.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerActivity.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.support.v17.leanback.widget.picker;
+package android.support.v17.leanback.widget;
import android.app.Activity;
import android.os.Bundle;
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerTest.java
similarity index 82%
rename from v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerTest.java
index c25838e..e2d2e99 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/DatePickerTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/DatePickerTest.java
@@ -14,11 +14,10 @@
* limitations under the License.
*/
-package android.support.v17.leanback.widget.picker;
+package android.support.v17.leanback.widget;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import android.content.Context;
@@ -28,19 +27,16 @@
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.v17.leanback.test.R;
+import android.support.v17.leanback.widget.picker.DatePicker;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
-import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.Arrays;
-import java.util.List;
-
@LargeTest
@RunWith(AndroidJUnit4.class)
public class DatePickerTest {
@@ -59,13 +55,9 @@
new ActivityTestRule<>(DatePickerActivity.class, false, false);
private DatePickerActivity mActivity;
- @Before
- public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
- }
-
public void initActivity(Intent intent) throws Throwable {
mActivity = mActivityTestRule.launchActivity(intent);
+ mContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
mDatePickerView = (DatePicker) mActivity.findViewById(R.id.date_picker);
mDatePickerInnerView = (ViewGroup) mDatePickerView.findViewById(R.id.picker);
mDatePickerView.setActivatedVisibleItemCount(3);
@@ -383,86 +375,6 @@
}
}
- @Test
- public void testExtractSeparatorsForDifferentLocales() throws Throwable {
- // date pattern for en_US (English)
- DatePicker datePicker = new DatePicker(mContext, null) {
- @Override
- String getBestYearMonthDayPattern(String datePickerFormat) {
- return "M/d/y";
- }
- };
- List<CharSequence> actualSeparators = datePicker.extractSeparators();
- List<String> expectedSeparators = Arrays.asList(new String[]{"", "/", "/", ""});
- assertEquals(expectedSeparators, actualSeparators);
-
- // date pattern for fa_IR (Farsi)
- datePicker = new DatePicker(mContext, null) {
- @Override
- String getBestYearMonthDayPattern(String datePickerFormat) {
- return "y/M/d";
- }
- };
- actualSeparators = datePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[]{"", "/", "/", ""});
- assertEquals(expectedSeparators, actualSeparators);
-
- // date pattern for ar_EG (Arabic)
- datePicker = new DatePicker(mContext, null) {
- @Override
- String getBestYearMonthDayPattern(String datePickerFormat) {
- return "d/M/y";
- }
- };
- actualSeparators = datePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[]{"", "/", "/", ""});
- assertEquals(expectedSeparators, actualSeparators);
-
- // date pattern for cs_CZ (Czech)
- datePicker = new DatePicker(mContext, null) {
- @Override
- String getBestYearMonthDayPattern(String datePickerFormat) {
- return "d. M. y";
- }
- };
- actualSeparators = datePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[]{"", ".", ".", ""});
- assertEquals(expectedSeparators, actualSeparators);
-
- // date pattern for hr_HR (Croatian)
- datePicker = new DatePicker(mContext, null) {
- @Override
- String getBestYearMonthDayPattern(String datePickerFormat) {
- return "dd. MM. y.";
- }
- };
- actualSeparators = datePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[]{"", ".", ".", "."});
- assertEquals(expectedSeparators, actualSeparators);
-
- // date pattern for hr_HR (Bulgarian)
- datePicker = new DatePicker(mContext, null) {
- @Override
- String getBestYearMonthDayPattern(String datePickerFormat) {
- return "d.MM.y 'r'.";
- }
- };
- actualSeparators = datePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[]{"", ".", ".", "r."});
- assertEquals(expectedSeparators, actualSeparators);
-
- // date pattern for en_XA (English pseudo-locale)
- datePicker = new DatePicker(mContext, null) {
- @Override
- String getBestYearMonthDayPattern(String datePickerFormat) {
- return "[M/d/y]";
- }
- };
- actualSeparators = datePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[]{"[", "/", "/", "]"});
- assertEquals(expectedSeparators, actualSeparators);
- }
-
private void sendKeys(int ...keys) {
for (int i = 0; i < keys.length; i++) {
InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keys[i]);
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerActivity.java
similarity index 95%
rename from v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerActivity.java
index 6cf7042..11c4d3c 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerActivity.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerActivity.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.support.v17.leanback.widget.picker;
+package android.support.v17.leanback.widget;
import android.app.Activity;
import android.os.Bundle;
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerTest.java
similarity index 80%
rename from v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerTest.java
index 980eb1f..7146d31 100644
--- a/v17/leanback/tests/java/android/support/v17/leanback/widget/picker/TimePickerTest.java
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/TimePickerTest.java
@@ -14,11 +14,10 @@
* limitations under the License.
*/
-package android.support.v17.leanback.widget.picker;
+package android.support.v17.leanback.widget;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
import android.content.Context;
import android.content.Intent;
@@ -27,18 +26,15 @@
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.v17.leanback.test.R;
+import android.support.v17.leanback.widget.picker.TimePicker;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
-import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.Arrays;
-import java.util.List;
-
@LargeTest
@RunWith(AndroidJUnit4.class)
public class TimePickerTest {
@@ -47,6 +43,8 @@
private static final long TRANSITION_LENGTH = 1000;
private static final long UPDATE_LENGTH = 1000;
+
+ Context mContext;
View mViewAbove;
TimePicker mTimePicker12HourView;
TimePicker mTimePicker24HourView;
@@ -56,12 +54,6 @@
public ActivityTestRule<TimePickerActivity> mActivityTestRule =
new ActivityTestRule<>(TimePickerActivity.class, false, false);
private TimePickerActivity mActivity;
- private Context mContext;
-
- @Before
- public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
- }
public void initActivity(Intent intent) throws Throwable {
mActivity = mActivityTestRule.launchActivity(intent);
@@ -75,7 +67,7 @@
}
});
- if (intent.getIntExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ if (intent.getIntExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets) == R.layout.timepicker_with_other_widgets) {
mViewAbove = mActivity.findViewById(R.id.above_picker);
mViewBelow = mActivity.findViewById(R.id.below_picker);
@@ -87,7 +79,7 @@
mTimePicker24HourView.setActivated(!mTimePicker24HourView.isActivated());
}
});
- } else if (intent.getIntExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ } else if (intent.getIntExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets) == R.layout.timepicker_alone) {
// A layout with only a TimePicker widget that is initially activated.
mActivityTestRule.runOnUiThread(new Runnable() {
@@ -103,10 +95,9 @@
@Test
public void testSetHourIn24hFormat() throws Throwable {
Intent intent = new Intent();
- intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets);
initActivity(intent);
-
mActivityTestRule.runOnUiThread(new Runnable() {
@Override
public void run() {
@@ -161,7 +152,7 @@
@Test
public void testSetHourIn12hFormat() throws Throwable {
Intent intent = new Intent();
- intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets);
initActivity(intent);
mActivityTestRule.runOnUiThread(new Runnable() {
@@ -218,7 +209,7 @@
@Test
public void testSetMinuteIn24hFormat() throws Throwable {
Intent intent = new Intent();
- intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets);
initActivity(intent);
mActivityTestRule.runOnUiThread(new Runnable() {
@@ -255,7 +246,7 @@
@Test
public void testSetMinuteIn12hFormat() throws Throwable {
Intent intent = new Intent();
- intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets);
initActivity(intent);
mActivityTestRule.runOnUiThread(new Runnable() {
@@ -293,7 +284,7 @@
@Test
public void testAmToPmTransition() throws Throwable {
Intent intent = new Intent();
- intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets);
initActivity(intent);
mActivityTestRule.runOnUiThread(new Runnable() {
@@ -335,7 +326,7 @@
@Test
public void testPmToAmTransition() throws Throwable {
Intent intent = new Intent();
- intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets);
initActivity(intent);
mActivityTestRule.runOnUiThread(new Runnable() {
@@ -377,7 +368,7 @@
@Test
public void test12To24HourFormatTransition() throws Throwable {
Intent intent = new Intent();
- intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets);
initActivity(intent);
mActivityTestRule.runOnUiThread(new Runnable() {
@@ -409,7 +400,7 @@
@Test
public void test24To12HourFormatTransition() throws Throwable {
Intent intent = new Intent();
- intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_with_other_widgets);
initActivity(intent);
mActivityTestRule.runOnUiThread(new Runnable() {
@@ -442,7 +433,7 @@
public void testInitiallyActiveTimePicker()
throws Throwable {
Intent intent = new Intent();
- intent.putExtra(TimePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ intent.putExtra(DatePickerActivity.EXTRA_LAYOUT_RESOURCE_ID,
R.layout.timepicker_alone);
initActivity(intent);
@@ -482,106 +473,12 @@
sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
Thread.sleep(TRANSITION_LENGTH);
assertThat("The third column of TimePicker should hold focus after scrolling right",
- mTimePickerInnerView.getChildAt(3).hasFocus(), is(true));
+ mTimePickerInnerView.getChildAt(4).hasFocus(), is(true));
sendKeys(KeyEvent.KEYCODE_DPAD_UP);
Thread.sleep(TRANSITION_LENGTH);
assertThat("The third column of TimePicker should still hold focus after scrolling down",
- mTimePickerInnerView.getChildAt(3).hasFocus(), is(true));
- }
-
- @Test
- public void testExtractSeparatorsForDifferentLocales() throws Throwable {
- // A typical time pattern for different locales in 12-hour format
- TimePicker timePicker = new TimePicker(mContext, null) {
- @Override
- String getBestHourMinutePattern() {
- return "h:mm a";
- }
- };
- List<CharSequence> actualSeparators = timePicker.extractSeparators();
- List<String> expectedSeparators = Arrays.asList(new String[] {"", ":", "", ""});
- assertEquals(expectedSeparators, actualSeparators);
-
- // time pattern for ja_JP in 12 hour format
- timePicker = new TimePicker(mContext, null) {
- @Override
- String getBestHourMinutePattern() {
- return "aK:mm";
- }
-
- @Override
- public boolean is24Hour() {
- return false;
- }
- };
- actualSeparators = timePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[] {"", "", ":", ""});
- assertEquals(expectedSeparators, actualSeparators);
-
- // time pattern for fr_CA in 24 hour format
- timePicker = new TimePicker(mContext, null) {
- @Override
- String getBestHourMinutePattern() {
- return "HH 'h' mm";
- }
-
- @Override
- public boolean is24Hour() {
- return true;
- }
- };
- actualSeparators = timePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[] {"", "h", ""});
- assertEquals(expectedSeparators, actualSeparators);
-
- // time pattern for hsb_DE in 24 hour format
- timePicker = new TimePicker(mContext, null) {
- @Override
- String getBestHourMinutePattern() {
- return "H:mm 'hodz'";
- }
-
- @Override
- public boolean is24Hour() {
- return true;
- }
- };
- actualSeparators = timePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[] {"", ":", "hodz"});
- assertEquals(expectedSeparators, actualSeparators);
-
- // time pattern for ko_KR in 12 hour format
- timePicker = new TimePicker(mContext, null) {
- @Override
- String getBestHourMinutePattern() {
- return "a h:mm";
- }
-
- @Override
- public boolean is24Hour() {
- return false;
- }
- };
- actualSeparators = timePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[] {"", "", ":", ""});
- assertEquals(expectedSeparators, actualSeparators);
-
- // time pattern for fa_IR in 24 hour format
- timePicker = new TimePicker(mContext, null) {
- @Override
- String getBestHourMinutePattern() {
- return "H:mm";
- }
-
- @Override
- public boolean is24Hour() {
- return true;
- }
- };
- actualSeparators = timePicker.extractSeparators();
- expectedSeparators = Arrays.asList(new String[] {"", ":", ""});
- assertEquals(expectedSeparators, actualSeparators);
+ mTimePickerInnerView.getChildAt(4).hasFocus(), is(true));
}
private void sendKeys(int ...keys) {
diff --git a/v17/preference-leanback/AndroidManifest.xml b/v17/preference-leanback/AndroidManifest.xml
index e2cfe35..c34c254 100644
--- a/v17/preference-leanback/AndroidManifest.xml
+++ b/v17/preference-leanback/AndroidManifest.xml
@@ -16,9 +16,10 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.support.v17.preference"
- android:versionCode="1"
- android:versionName="1.0">
+ package="android.support.v17.preference">
<uses-sdk android:minSdkVersion="17" />
- <application />
+ <application>
+ <meta-data android:name="android.support.v17.preference.VERSION"
+ android:value="${support-version}" />
+ </application>
</manifest>
diff --git a/v17/preference-leanback/api/26.1.0-SNAPSHOT.txt b/v17/preference-leanback/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v17/preference-leanback/api/26.1.0-SNAPSHOT.txt
rename to v17/preference-leanback/api/27.0.0-SNAPSHOT.txt
diff --git a/v4/AndroidManifest.xml b/v4/AndroidManifest.xml
index 470f5c2..c179eb2 100644
--- a/v4/AndroidManifest.xml
+++ b/v4/AndroidManifest.xml
@@ -14,10 +14,10 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
package="android.support.v4">
- <uses-sdk android:minSdkVersion="14" tools:overrideLibrary="android.support.v4"/>
+ <uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v4.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v7/appcompat/AndroidManifest.xml b/v7/appcompat/AndroidManifest.xml
index 7de91ff..786d361 100644
--- a/v7/appcompat/AndroidManifest.xml
+++ b/v7/appcompat/AndroidManifest.xml
@@ -14,11 +14,10 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
package="android.support.v7.appcompat">
- <uses-sdk android:minSdkVersion="14"
- tools:overrideLibrary="android.support.graphics.drawable.animated"/>
+ <uses-sdk android:minSdkVersion="14" />
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v7.appcompat.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v7/appcompat/api/26.1.0-SNAPSHOT.txt b/v7/appcompat/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/appcompat/api/26.1.0-SNAPSHOT.txt
rename to v7/appcompat/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index 102c779..90662f8 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -6,14 +6,10 @@
api project(':support-vector-drawable')
api project(':animated-vector-drawable')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
androidTestImplementation project(':support-testutils')
}
diff --git a/v7/appcompat/lint-baseline.xml b/v7/appcompat/lint-baseline.xml
index febede9..3ae048f 100644
--- a/v7/appcompat/lint-baseline.xml
+++ b/v7/appcompat/lint-baseline.xml
@@ -3,72 +3,6 @@
<issue
id="WrongConstant"
- message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
- errorLine1=" ? TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatButton.java"
- line="274"
- column="23"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
- errorLine1=" : TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatButton.java"
- line="275"
- column="23"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
- errorLine1=" return TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatButton.java"
- line="281"
- column="16"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
- errorLine1=" ? TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatTextView.java"
- line="280"
- column="23"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
- errorLine1=" : TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatTextView.java"
- line="281"
- column="23"/>
- </issue>
-
- <issue
- id="WrongConstant"
- message="Must be one of: TextView.AUTO_SIZE_TEXT_TYPE_NONE, TextView.AUTO_SIZE_TEXT_TYPE_UNIFORM"
- errorLine1=" return TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE;"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/v7/widget/AppCompatTextView.java"
- line="287"
- column="16"/>
- </issue>
-
- <issue
- id="WrongConstant"
message="Must be one or more of: ActionBar.DISPLAY_USE_LOGO, ActionBar.DISPLAY_SHOW_HOME, ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_CUSTOM"
errorLine1=" setDisplayOptions(options, 0xffffffff);"
errorLine2=" ~~~~~~~~~~">
diff --git a/v7/appcompat/res/values-af/strings.xml b/v7/appcompat/res/values-af/strings.xml
index b00b917..15ed3b2 100644
--- a/v7/appcompat/res/values-af/strings.xml
+++ b/v7/appcompat/res/values-af/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Stemsoektog"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Kies \'n program"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Sien alles"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deel met %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Deel met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deel met"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
<string name="abc_capital_off" msgid="121134116657445385">"AF"</string>
diff --git a/v7/appcompat/res/values-am/strings.xml b/v7/appcompat/res/values-am/strings.xml
index 9a57819..42bbc06 100644
--- a/v7/appcompat/res/values-am/strings.xml
+++ b/v7/appcompat/res/values-am/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"የድምፅ ፍለጋ"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"መተግበሪያ ይምረጡ"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ሁሉንም ይመልከቱ"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ከ%s ጋር ያጋሩ"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"ከ<xliff:g id="APPLICATION_NAME">%s</xliff:g> ጋር አጋራ"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ከሚከተለው ጋር ያጋሩ"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"በርቷል"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ጠፍቷል"</string>
diff --git a/v7/appcompat/res/values-ar/strings.xml b/v7/appcompat/res/values-ar/strings.xml
index a884a9f..3278162 100644
--- a/v7/appcompat/res/values-ar/strings.xml
+++ b/v7/appcompat/res/values-ar/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"البحث الصوتي"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"اختيار تطبيق"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"عرض الكل"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"مشاركة مع %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"مشاركة مع <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"مشاركة مع"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"تشغيل"</string>
<string name="abc_capital_off" msgid="121134116657445385">"إيقاف"</string>
diff --git a/v7/appcompat/res/values-az/strings.xml b/v7/appcompat/res/values-az/strings.xml
index 6f6fa9c..29e00dd 100644
--- a/v7/appcompat/res/values-az/strings.xml
+++ b/v7/appcompat/res/values-az/strings.xml
@@ -20,7 +20,7 @@
<string name="abc_action_bar_home_description" msgid="4600421777120114993">"Evə naviqasiya et"</string>
<string name="abc_action_bar_up_description" msgid="1594238315039666878">"Yuxarı get"</string>
<string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Digər variantlar"</string>
- <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Dağıt"</string>
+ <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Yığışdırın"</string>
<string name="abc_searchview_description_search" msgid="8264924765203268293">"Axtarış"</string>
<string name="abc_search_hint" msgid="7723749260725869598">"Axtarış..."</string>
<string name="abc_searchview_description_query" msgid="2550479030709304392">"Axtarış sorğusu"</string>
@@ -29,9 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Səsli axtarış"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Tətbiq seçin"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Hamısına baxın"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for abc_shareactionprovider_share_with_application (7165123711973476752) -->
- <skip />
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ilə paylaşın"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bununla paylaşın"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"AKTİV"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DEAKTİV"</string>
diff --git a/v7/appcompat/res/values-b+sr+Latn/strings.xml b/v7/appcompat/res/values-b+sr+Latn/strings.xml
index 06caa95..c3462f6 100644
--- a/v7/appcompat/res/values-b+sr+Latn/strings.xml
+++ b/v7/appcompat/res/values-b+sr+Latn/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovna pretraga"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Izbor aplikacije"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Prikaži sve"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deli sa aplikacijom %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Deljenje sa aplikacijom <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deli sa"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČI"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČI"</string>
diff --git a/v7/appcompat/res/values-be/strings.xml b/v7/appcompat/res/values-be/strings.xml
index 42e9583..99ee19f 100644
--- a/v7/appcompat/res/values-be/strings.xml
+++ b/v7/appcompat/res/values-be/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Галасавы пошук"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Выбраць праграму"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Прагледзець усё"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Абагуліць з %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Абагуліць праз праграму <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Абагуліць з"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"УКЛ."</string>
<string name="abc_capital_off" msgid="121134116657445385">"ВЫКЛ."</string>
diff --git a/v7/appcompat/res/values-bg/strings.xml b/v7/appcompat/res/values-bg/strings.xml
index 85ece2d..1d37d0d 100644
--- a/v7/appcompat/res/values-bg/strings.xml
+++ b/v7/appcompat/res/values-bg/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Гласово търсене"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Изберете приложение"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Вижте всички"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Споделяне със: %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Споделяне със: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Споделяне със:"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
<string name="abc_capital_off" msgid="121134116657445385">"ИЗКЛ."</string>
diff --git a/v7/appcompat/res/values-bn/strings.xml b/v7/appcompat/res/values-bn/strings.xml
index 2602be0..5959799 100644
--- a/v7/appcompat/res/values-bn/strings.xml
+++ b/v7/appcompat/res/values-bn/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"ভয়েস অনুসন্ধান"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"একটি অ্যাপ্লিকেশান বেছে নিন"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"সবগুলো দেখুন"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s এর সাথে শেয়ার করুন"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> এর সাথে শেয়ার করুন"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"এর সাথে শেয়ার করুন"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"চালু"</string>
<string name="abc_capital_off" msgid="121134116657445385">"বন্ধ"</string>
diff --git a/v7/appcompat/res/values-bs/strings.xml b/v7/appcompat/res/values-bs/strings.xml
index 3c15659..3687875 100644
--- a/v7/appcompat/res/values-bs/strings.xml
+++ b/v7/appcompat/res/values-bs/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="abc_action_mode_done" msgid="4076576682505996667">"Završeno"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Gotovo"</string>
<string name="abc_action_bar_home_description" msgid="4600421777120114993">"Vrati se na početnu stranicu"</string>
<string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigiraj prema gore"</string>
<string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Više opcija"</string>
@@ -26,10 +26,10 @@
<string name="abc_searchview_description_query" msgid="2550479030709304392">"Pretraži upit"</string>
<string name="abc_searchview_description_clear" msgid="3691816814315814921">"Obriši upit"</string>
<string name="abc_searchview_description_submit" msgid="8928215447528550784">"Pošalji upit"</string>
- <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pretraživanje glasom"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovno pretraživanje"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Odaberite aplikaciju"</string>
- <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Vidi sve"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Podijeli sa %s"</string>
+ <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Prikaži sve"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Podijeli koristeći aplikaciju <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Podijeli sa"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČI"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČI"</string>
diff --git a/v7/appcompat/res/values-ca/strings.xml b/v7/appcompat/res/values-ca/strings.xml
index 568b72d..03ebec3 100644
--- a/v7/appcompat/res/values-ca/strings.xml
+++ b/v7/appcompat/res/values-ca/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Cerca per veu"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecciona una aplicació"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Mostra\'ls tots"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Comparteix amb %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Comparteix amb <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Comparteix amb"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAT"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAT"</string>
diff --git a/v7/appcompat/res/values-cs/strings.xml b/v7/appcompat/res/values-cs/strings.xml
index 727721b..05cd4e0 100644
--- a/v7/appcompat/res/values-cs/strings.xml
+++ b/v7/appcompat/res/values-cs/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Hlasové vyhledávání"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Vybrat aplikaci"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Zobrazit vše"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Sdílet pomocí %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Sdílet s aplikací <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Sdílet pomocí"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ZAPNUTO"</string>
<string name="abc_capital_off" msgid="121134116657445385">"VYPNUTO"</string>
diff --git a/v7/appcompat/res/values-da/strings.xml b/v7/appcompat/res/values-da/strings.xml
index 21981f1..813885a 100644
--- a/v7/appcompat/res/values-da/strings.xml
+++ b/v7/appcompat/res/values-da/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Talesøgning"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Vælg en app"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Se alle"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Del med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"TIL"</string>
<string name="abc_capital_off" msgid="121134116657445385">"FRA"</string>
diff --git a/v7/appcompat/res/values-de/strings.xml b/v7/appcompat/res/values-de/strings.xml
index 184ba98..0b57259 100644
--- a/v7/appcompat/res/values-de/strings.xml
+++ b/v7/appcompat/res/values-de/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Sprachsuche"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"App auswählen"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Alle ansehen"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Freigeben für %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Mit <xliff:g id="APPLICATION_NAME">%s</xliff:g> teilen"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Freigeben für"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"An"</string>
<string name="abc_capital_off" msgid="121134116657445385">"Aus"</string>
diff --git a/v7/appcompat/res/values-el/strings.xml b/v7/appcompat/res/values-el/strings.xml
index 4954e50..ec7a666 100644
--- a/v7/appcompat/res/values-el/strings.xml
+++ b/v7/appcompat/res/values-el/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Φωνητική αναζήτηση"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Επιλέξτε κάποια εφαρμογή"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Προβολή όλων"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Κοινή χρήση με %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Κοινή χρήση με <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Κοινή χρήση με"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
diff --git a/v7/appcompat/res/values-en-rAU/strings.xml b/v7/appcompat/res/values-en-rAU/strings.xml
index ed11ab6..a4d048c 100644
--- a/v7/appcompat/res/values-en-rAU/strings.xml
+++ b/v7/appcompat/res/values-en-rAU/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Voice search"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Choose an app"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"See all"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
<string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-en-rGB/strings.xml b/v7/appcompat/res/values-en-rGB/strings.xml
index ed11ab6..a4d048c 100644
--- a/v7/appcompat/res/values-en-rGB/strings.xml
+++ b/v7/appcompat/res/values-en-rGB/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Voice search"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Choose an app"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"See all"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
<string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-en-rIN/strings.xml b/v7/appcompat/res/values-en-rIN/strings.xml
index ed11ab6..a4d048c 100644
--- a/v7/appcompat/res/values-en-rIN/strings.xml
+++ b/v7/appcompat/res/values-en-rIN/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Voice search"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Choose an app"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"See all"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Share with <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
<string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-es-rUS/strings.xml b/v7/appcompat/res/values-es-rUS/strings.xml
index 84a8ab3..0cc8a70 100644
--- a/v7/appcompat/res/values-es-rUS/strings.xml
+++ b/v7/appcompat/res/values-es-rUS/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Búsqueda por voz"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Elige una aplicación."</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver todo"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ACTIVADO"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DESACTIVADO"</string>
diff --git a/v7/appcompat/res/values-es/strings.xml b/v7/appcompat/res/values-es/strings.xml
index 31fb801..3e0828b 100644
--- a/v7/appcompat/res/values-es/strings.xml
+++ b/v7/appcompat/res/values-es/strings.xml
@@ -29,9 +29,9 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Búsqueda por voz"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Seleccionar una aplicación"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver todo"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"SÍ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"NO"</string>
+ <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVADO"</string>
+ <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVADO"</string>
<string name="search_menu_title" msgid="146198913615257606">"Buscar"</string>
</resources>
diff --git a/v7/appcompat/res/values-et/strings.xml b/v7/appcompat/res/values-et/strings.xml
index 9f34e02..3a3dcbf 100644
--- a/v7/appcompat/res/values-et/strings.xml
+++ b/v7/appcompat/res/values-et/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Häälotsing"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Valige rakendus"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Kuva kõik"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jagamine kasutajaga %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Jagamine rakendusega <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jagamine:"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"SEES"</string>
<string name="abc_capital_off" msgid="121134116657445385">"VÄLJAS"</string>
diff --git a/v7/appcompat/res/values-eu/strings.xml b/v7/appcompat/res/values-eu/strings.xml
index ab18c68..a651036 100644
--- a/v7/appcompat/res/values-eu/strings.xml
+++ b/v7/appcompat/res/values-eu/strings.xml
@@ -26,10 +26,10 @@
<string name="abc_searchview_description_query" msgid="2550479030709304392">"Bilaketa-kontsulta"</string>
<string name="abc_searchview_description_clear" msgid="3691816814315814921">"Garbitu kontsulta"</string>
<string name="abc_searchview_description_submit" msgid="8928215447528550784">"Bidali kontsulta"</string>
- <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ahots bidezko bilaketa"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ahozko bilaketa"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Aukeratu aplikazio bat"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ikusi guztiak"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partekatu %s erabiltzailearekin"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Partekatu <xliff:g id="APPLICATION_NAME">%s</xliff:g> aplikazioarekin"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partekatu hauekin"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"AKTIBATUTA"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DESAKTIBATUTA"</string>
diff --git a/v7/appcompat/res/values-fa/strings.xml b/v7/appcompat/res/values-fa/strings.xml
index 99af06a..9b844b0 100644
--- a/v7/appcompat/res/values-fa/strings.xml
+++ b/v7/appcompat/res/values-fa/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"جستجوی گفتاری"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"انتخاب برنامه"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"مشاهده همه"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"اشتراکگذاری با %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"اشتراکگذاری با <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"اشتراکگذاری با"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"روشن"</string>
<string name="abc_capital_off" msgid="121134116657445385">"خاموش"</string>
diff --git a/v7/appcompat/res/values-fi/strings.xml b/v7/appcompat/res/values-fi/strings.xml
index a7713b0..e9bd952 100644
--- a/v7/appcompat/res/values-fi/strings.xml
+++ b/v7/appcompat/res/values-fi/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Puhehaku"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Valitse sovellus"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Näytä kaikki"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jakaminen: %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Jaa sovelluksessa <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jakaminen:"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"KÄYTÖSSÄ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"POIS KÄYTÖSTÄ"</string>
diff --git a/v7/appcompat/res/values-fr-rCA/strings.xml b/v7/appcompat/res/values-fr-rCA/strings.xml
index de9ad41..a3e763b 100644
--- a/v7/appcompat/res/values-fr-rCA/strings.xml
+++ b/v7/appcompat/res/values-fr-rCA/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Recherche vocale"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Sélectionnez une application"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Voir toutes les chaînes"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Partager avec <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
diff --git a/v7/appcompat/res/values-fr/strings.xml b/v7/appcompat/res/values-fr/strings.xml
index d3eb762..1e412ec 100644
--- a/v7/appcompat/res/values-fr/strings.xml
+++ b/v7/appcompat/res/values-fr/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Recherche vocale"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Sélectionner une application"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Tout afficher"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Partager avec <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager avec"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
diff --git a/v7/appcompat/res/values-gl/strings.xml b/v7/appcompat/res/values-gl/strings.xml
index 30185b8..2af80a1 100644
--- a/v7/appcompat/res/values-gl/strings.xml
+++ b/v7/appcompat/res/values-gl/strings.xml
@@ -26,10 +26,10 @@
<string name="abc_searchview_description_query" msgid="2550479030709304392">"Consulta de busca"</string>
<string name="abc_searchview_description_clear" msgid="3691816814315814921">"Borrar consulta"</string>
<string name="abc_searchview_description_submit" msgid="8928215447528550784">"Enviar consulta"</string>
- <string name="abc_searchview_description_voice" msgid="893419373245838918">"Busca de voz"</string>
+ <string name="abc_searchview_description_voice" msgid="893419373245838918">"Busca por voz"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Escoller unha aplicación"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver todas"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAR"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAR"</string>
diff --git a/v7/appcompat/res/values-gu/strings.xml b/v7/appcompat/res/values-gu/strings.xml
index a52fd66..7a243ed 100644
--- a/v7/appcompat/res/values-gu/strings.xml
+++ b/v7/appcompat/res/values-gu/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"વૉઇસ શોધ"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"એક ઍપ્લિકેશન પસંદ કરો"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"બધું જુઓ"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s સાથે શેર કરો"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>ની સાથે શેર કરો"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"આની સાથે શેર કરો"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ચાલુ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"બંધ"</string>
diff --git a/v7/appcompat/res/values-hi/strings.xml b/v7/appcompat/res/values-hi/strings.xml
index cfabcf7..30d3001 100644
--- a/v7/appcompat/res/values-hi/strings.xml
+++ b/v7/appcompat/res/values-hi/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"ध्वनि खोज"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"कोई एप्लिकेशन चुनें"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"सभी देखें"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s के साथ साझा करें"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> के साथ साझा करें"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"इसके द्वारा साझा करें"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
<string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
diff --git a/v7/appcompat/res/values-hr/strings.xml b/v7/appcompat/res/values-hr/strings.xml
index 78aa1d3..27a1c2e 100644
--- a/v7/appcompat/res/values-hr/strings.xml
+++ b/v7/appcompat/res/values-hr/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovno pretraživanje"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Odabir aplikacije"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Prikaži sve"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dijeljenje sa: %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Dijeli putem aplikacije <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dijeljenje sa"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČENO"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČENO"</string>
diff --git a/v7/appcompat/res/values-hu/strings.xml b/v7/appcompat/res/values-hu/strings.xml
index bdaba78..d3e413f 100644
--- a/v7/appcompat/res/values-hu/strings.xml
+++ b/v7/appcompat/res/values-hu/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Hangalapú keresés"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Válasszon ki egy alkalmazást"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Összes megtekintése"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Megosztás a következővel: %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Megosztás a következő alkalmazással: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Megosztás a következővel:"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"BE"</string>
<string name="abc_capital_off" msgid="121134116657445385">"KI"</string>
diff --git a/v7/appcompat/res/values-hy/strings.xml b/v7/appcompat/res/values-hy/strings.xml
index 872901e..1c41ef6 100644
--- a/v7/appcompat/res/values-hy/strings.xml
+++ b/v7/appcompat/res/values-hy/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Ձայնային որոնում"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Ընտրել ծրագիր"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Տեսնել բոլորը"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Կիսվել %s-ի միջոցով"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Ուղարկել <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ին"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Կիսվել"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ՄԻԱՑՎԱԾ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ԱՆՋԱՏՎԱԾ"</string>
diff --git a/v7/appcompat/res/values-in/strings.xml b/v7/appcompat/res/values-in/strings.xml
index 27f1a92..2e9fbb7 100644
--- a/v7/appcompat/res/values-in/strings.xml
+++ b/v7/appcompat/res/values-in/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Penelusuran suara"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pilih aplikasi"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Lihat semua"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bagikan dengan %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Bagikan ke <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bagikan dengan"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"AKTIF"</string>
<string name="abc_capital_off" msgid="121134116657445385">"NONAKTIF"</string>
diff --git a/v7/appcompat/res/values-is/strings.xml b/v7/appcompat/res/values-is/strings.xml
index 7a95c6d..3f61d84 100644
--- a/v7/appcompat/res/values-is/strings.xml
+++ b/v7/appcompat/res/values-is/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Raddleit"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Veldu forrit"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Sjá allt"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deila með %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Deila með <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deila með"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"KVEIKT"</string>
<string name="abc_capital_off" msgid="121134116657445385">"SLÖKKT"</string>
diff --git a/v7/appcompat/res/values-it/strings.xml b/v7/appcompat/res/values-it/strings.xml
index 9597b8b..fbd2c58 100644
--- a/v7/appcompat/res/values-it/strings.xml
+++ b/v7/appcompat/res/values-it/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Ricerca vocale"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Scegli un\'applicazione"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Visualizza tutte"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Condividi con %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Condividi tramite <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Condividi con"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
<string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-iw/strings.xml b/v7/appcompat/res/values-iw/strings.xml
index 4163b9a..9ac2072 100644
--- a/v7/appcompat/res/values-iw/strings.xml
+++ b/v7/appcompat/res/values-iw/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"חיפוש קולי"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"בחר אפליקציה"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ראה הכל"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"שתף עם %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"שתף עם <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"שתף עם"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"פועל"</string>
<string name="abc_capital_off" msgid="121134116657445385">"כבוי"</string>
diff --git a/v7/appcompat/res/values-ja/strings.xml b/v7/appcompat/res/values-ja/strings.xml
index 4c7811c..c4d0e20 100644
--- a/v7/appcompat/res/values-ja/strings.xml
+++ b/v7/appcompat/res/values-ja/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"音声検索"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"アプリの選択"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"すべて表示"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sと共有"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>と共有"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"共有"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
<string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
diff --git a/v7/appcompat/res/values-ka/strings.xml b/v7/appcompat/res/values-ka/strings.xml
index 8df5d11..3b077a3 100644
--- a/v7/appcompat/res/values-ka/strings.xml
+++ b/v7/appcompat/res/values-ka/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"ხმოვანი ძიება"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"აპის არჩევა"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ყველას ნახვა"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-თან გაზიარება"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"გაუზიარეთ <xliff:g id="APPLICATION_NAME">%s</xliff:g>-ს"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"გაზიარება:"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ჩართულია"</string>
<string name="abc_capital_off" msgid="121134116657445385">"გამორთულია"</string>
diff --git a/v7/appcompat/res/values-kk/strings.xml b/v7/appcompat/res/values-kk/strings.xml
index 2035353..c32045b 100644
--- a/v7/appcompat/res/values-kk/strings.xml
+++ b/v7/appcompat/res/values-kk/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Дауыс арқылы іздеу"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Қолданбаны таңдау"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Барлығын көру"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s бөлісу"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> қолданбасымен бөлісу"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Бөлісу"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ҚОСУЛЫ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ӨШІРУЛІ"</string>
diff --git a/v7/appcompat/res/values-km/strings.xml b/v7/appcompat/res/values-km/strings.xml
index b0db2b5..ffe289a 100644
--- a/v7/appcompat/res/values-km/strings.xml
+++ b/v7/appcompat/res/values-km/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"ការស្វែងរកសំឡេង"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ជ្រើសកម្មវិធី"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"មើលទាំងអស់"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ចែករំលែកជាមួយ %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"ចែករំលែកជាមួយ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ចែករំលែកជាមួយ"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"បើក"</string>
<string name="abc_capital_off" msgid="121134116657445385">"បិទ"</string>
diff --git a/v7/appcompat/res/values-kn/strings.xml b/v7/appcompat/res/values-kn/strings.xml
index 057f602..4218bd6 100644
--- a/v7/appcompat/res/values-kn/strings.xml
+++ b/v7/appcompat/res/values-kn/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"ಧ್ವನಿ ಹುಡುಕಾಟ"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ಒಂದು ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ಎಲ್ಲವನ್ನೂ ನೋಡಿ"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ಆನ್"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ಆಫ್"</string>
diff --git a/v7/appcompat/res/values-ko/strings.xml b/v7/appcompat/res/values-ko/strings.xml
index 21d822f..6c84a2a 100644
--- a/v7/appcompat/res/values-ko/strings.xml
+++ b/v7/appcompat/res/values-ko/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"음성 검색"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"앱 선택"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"전체 보기"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s와(과) 공유"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>와(과) 공유"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"공유 대상"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"사용"</string>
<string name="abc_capital_off" msgid="121134116657445385">"사용 안함"</string>
diff --git a/v7/appcompat/res/values-ky/strings.xml b/v7/appcompat/res/values-ky/strings.xml
index e6f811a..66202f7 100644
--- a/v7/appcompat/res/values-ky/strings.xml
+++ b/v7/appcompat/res/values-ky/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Үн аркылуу издөө"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Колдонмо тандоо"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Бардыгын көрүү"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s аркылуу бөлүшүү"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> аркылуу бөлүшүү"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Бөлүшүү"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"КҮЙҮК"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ӨЧҮК"</string>
diff --git a/v7/appcompat/res/values-lo/strings.xml b/v7/appcompat/res/values-lo/strings.xml
index 44e222f..1b92df0 100644
--- a/v7/appcompat/res/values-lo/strings.xml
+++ b/v7/appcompat/res/values-lo/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"ຊອກຫາດ້ວຍສຽງ"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ເລືອກແອັບຯ"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ເບິ່ງທັງຫມົດ"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ແບ່ງປັນກັບ %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"ແບ່ງປັນດ້ວຍ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ແບ່ງປັນກັບ"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ເປີດ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ປິດ"</string>
diff --git a/v7/appcompat/res/values-lt/strings.xml b/v7/appcompat/res/values-lt/strings.xml
index d88c48e..5793069 100644
--- a/v7/appcompat/res/values-lt/strings.xml
+++ b/v7/appcompat/res/values-lt/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Paieška balsu"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pasirinkti programą"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Peržiūrėti viską"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bendrinti naudojant „%s“"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Bendrinti naudojant programą „<xliff:g id="APPLICATION_NAME">%s</xliff:g>“"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bendrinti naudojant"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ĮJUNGTI"</string>
<string name="abc_capital_off" msgid="121134116657445385">"IŠJUNGTA"</string>
diff --git a/v7/appcompat/res/values-lv/strings.xml b/v7/appcompat/res/values-lv/strings.xml
index 0f35a3e..67e18d3 100644
--- a/v7/appcompat/res/values-lv/strings.xml
+++ b/v7/appcompat/res/values-lv/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Meklēšana ar balsi"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Izvēlieties lietotni"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Skatīt visu"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kopīgot ar %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Kopīgot ar lietojumprogrammu <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kopīgot ar:"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"IESLĒGTS"</string>
<string name="abc_capital_off" msgid="121134116657445385">"IZSLĒGTS"</string>
diff --git a/v7/appcompat/res/values-mk/strings.xml b/v7/appcompat/res/values-mk/strings.xml
index 4ea23cd..b12a235 100644
--- a/v7/appcompat/res/values-mk/strings.xml
+++ b/v7/appcompat/res/values-mk/strings.xml
@@ -29,9 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Гласовно пребарување"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Избери апликација"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Види ги сите"</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for abc_shareactionprovider_share_with_application (7165123711973476752) -->
- <skip />
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Сподели со <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Сподели со"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ВКЛУЧЕНО"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ИСКЛУЧЕНО"</string>
diff --git a/v7/appcompat/res/values-ml/strings.xml b/v7/appcompat/res/values-ml/strings.xml
index cd89c76..9033f8a 100644
--- a/v7/appcompat/res/values-ml/strings.xml
+++ b/v7/appcompat/res/values-ml/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"ശബ്ദതിരയൽ"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ഒരു അപ്ലിക്കേഷൻ തിരഞ്ഞെടുക്കുക"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"എല്ലാം കാണുക"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s എന്നതുമായി പങ്കിടുക"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-മായി പങ്കിടുക"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ഇവരുമായി പങ്കിടുക"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ഓൺ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ഓഫ്"</string>
diff --git a/v7/appcompat/res/values-mn/strings.xml b/v7/appcompat/res/values-mn/strings.xml
index cda3d84..56036ea 100644
--- a/v7/appcompat/res/values-mn/strings.xml
+++ b/v7/appcompat/res/values-mn/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Дуут хайлт"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Апп сонгох"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Бүгдийг харах"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-тай хуваалцах"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>-тай хуваалцах"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Хуваалцах"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ИДЭВХТЭЙ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ИДЭВХГҮЙ"</string>
diff --git a/v7/appcompat/res/values-mr/strings.xml b/v7/appcompat/res/values-mr/strings.xml
index 4c97b99..e813edc 100644
--- a/v7/appcompat/res/values-mr/strings.xml
+++ b/v7/appcompat/res/values-mr/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"व्हॉइस शोध"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"एक अॅप निवडा"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"सर्व पहा"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s सह सामायिक करा"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सह शेअर करा"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"यांच्यासह सामायिक करा"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
<string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
diff --git a/v7/appcompat/res/values-ms/strings.xml b/v7/appcompat/res/values-ms/strings.xml
index 4fe302a..18f84ce 100644
--- a/v7/appcompat/res/values-ms/strings.xml
+++ b/v7/appcompat/res/values-ms/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Carian suara"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pilih apl"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Lihat semua"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kongsi dengan %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Kongsi dengan <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kongsi dengan"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"HIDUP"</string>
<string name="abc_capital_off" msgid="121134116657445385">"MATI"</string>
diff --git a/v7/appcompat/res/values-my/strings.xml b/v7/appcompat/res/values-my/strings.xml
index 830f6ed..cbc8791 100644
--- a/v7/appcompat/res/values-my/strings.xml
+++ b/v7/appcompat/res/values-my/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"အသံဖြင့် ရှာဖွေခြင်း"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"အက်ပ်တစ်ခုခုကို ရွေးချယ်ပါ"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"အားလုံးကို ကြည့်ရန်"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ကို မျှဝေပါရန်"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ဖြင့် မျှဝေရန်"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"မျှဝေဖို့ ရွေးပါ"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ဖွင့်"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ပိတ်"</string>
diff --git a/v7/appcompat/res/values-nb/strings.xml b/v7/appcompat/res/values-nb/strings.xml
index 2a9da65..6005234 100644
--- a/v7/appcompat/res/values-nb/strings.xml
+++ b/v7/appcompat/res/values-nb/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Talesøk"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Velg en app"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Se alle"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Del med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
diff --git a/v7/appcompat/res/values-ne/strings.xml b/v7/appcompat/res/values-ne/strings.xml
index 8625fe2..0d23bd7 100644
--- a/v7/appcompat/res/values-ne/strings.xml
+++ b/v7/appcompat/res/values-ne/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"भ्वाइस खोजी"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"एउटा अनुप्रयोग छान्नुहोस्"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"सबै हेर्नुहोस्"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s सँग साझेदारी गर्नुहोस्"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> सँग आदान-प्रदान गर्नुहोस्"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"साझेदारी गर्नुहोस्..."</string>
<string name="abc_capital_on" msgid="3405795526292276155">"सक्रिय गर्नुहोस्"</string>
<string name="abc_capital_off" msgid="121134116657445385">"निष्क्रिय पार्नुहोस्"</string>
diff --git a/v7/appcompat/res/values-nl/strings.xml b/v7/appcompat/res/values-nl/strings.xml
index 5ca1d93..e0d2044 100644
--- a/v7/appcompat/res/values-nl/strings.xml
+++ b/v7/appcompat/res/values-nl/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Gesproken zoekopdracht"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Een app selecteren"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Alles weergeven"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Delen met %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Delen met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Delen met"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
<string name="abc_capital_off" msgid="121134116657445385">"UIT"</string>
diff --git a/v7/appcompat/res/values-pa/strings.xml b/v7/appcompat/res/values-pa/strings.xml
index f495b8f..bc2e6ea 100644
--- a/v7/appcompat/res/values-pa/strings.xml
+++ b/v7/appcompat/res/values-pa/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"ਵੌਇਸ ਖੋਜ"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ਇੱਕ ਐਪ ਚੁਣੋ"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ਸਭ ਦੇਖੋ"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ਇਸ ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ਤੇ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ਬੰਦ"</string>
diff --git a/v7/appcompat/res/values-pl/strings.xml b/v7/appcompat/res/values-pl/strings.xml
index ec49385..d706241 100644
--- a/v7/appcompat/res/values-pl/strings.xml
+++ b/v7/appcompat/res/values-pl/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Wyszukiwanie głosowe"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Wybierz aplikację"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Zobacz wszystkie"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Udostępnij dla %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Udostępnij przez: <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Udostępnij dla"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"WŁ."</string>
<string name="abc_capital_off" msgid="121134116657445385">"WYŁ."</string>
diff --git a/v7/appcompat/res/values-pt-rBR/strings.xml b/v7/appcompat/res/values-pt-rBR/strings.xml
index 12828e3..90461ec 100644
--- a/v7/appcompat/res/values-pt-rBR/strings.xml
+++ b/v7/appcompat/res/values-pt-rBR/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecione um app"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartilhar com %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartilhar com"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
diff --git a/v7/appcompat/res/values-pt-rPT/strings.xml b/v7/appcompat/res/values-pt-rPT/strings.xml
index 3e59366..40f6499 100644
--- a/v7/appcompat/res/values-pt-rPT/strings.xml
+++ b/v7/appcompat/res/values-pt-rPT/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Escolher uma aplicação"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partilhar com %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Partilhar com a aplicação <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partilhar com"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ATIVADO"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DESATIVADO"</string>
diff --git a/v7/appcompat/res/values-pt/strings.xml b/v7/appcompat/res/values-pt/strings.xml
index 12828e3..90461ec 100644
--- a/v7/appcompat/res/values-pt/strings.xml
+++ b/v7/appcompat/res/values-pt/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecione um app"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartilhar com %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Compartilhar com <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartilhar com"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
diff --git a/v7/appcompat/res/values-ro/strings.xml b/v7/appcompat/res/values-ro/strings.xml
index a896f19..6d04be9 100644
--- a/v7/appcompat/res/values-ro/strings.xml
+++ b/v7/appcompat/res/values-ro/strings.xml
@@ -29,9 +29,9 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Căutare vocală"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Alegeți o aplicație"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Afișați-le pe toate"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Trimiteți la %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Trimiteți folosind <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Trimiteți la"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAȚI"</string>
+ <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAT"</string>
<string name="abc_capital_off" msgid="121134116657445385">"DEZACTIVAȚI"</string>
<string name="search_menu_title" msgid="146198913615257606">"Căutați"</string>
</resources>
diff --git a/v7/appcompat/res/values-ru/strings.xml b/v7/appcompat/res/values-ru/strings.xml
index f82381b..2b28958 100644
--- a/v7/appcompat/res/values-ru/strings.xml
+++ b/v7/appcompat/res/values-ru/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Голосовой поиск"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Выбрать приложение"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Показать все"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Открыть доступ пользователю %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Открыть доступ приложению \"<xliff:g id="APPLICATION_NAME">%s</xliff:g>\""</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Открыть доступ"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
<string name="abc_capital_off" msgid="121134116657445385">"ОТКЛ."</string>
diff --git a/v7/appcompat/res/values-si/strings.xml b/v7/appcompat/res/values-si/strings.xml
index 9539746..7631288 100644
--- a/v7/appcompat/res/values-si/strings.xml
+++ b/v7/appcompat/res/values-si/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"හඬ සෙවීම"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"යෙදුමක් තෝරන්න"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"සියල්ල බලන්න"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s සමඟ බෙදාගන්න"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> සමඟ බෙදා ගන්න"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"සමඟ බෙදාගන්න"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ක්රියාත්මකයි"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ක්රියාවිරහිතයි"</string>
diff --git a/v7/appcompat/res/values-sk/strings.xml b/v7/appcompat/res/values-sk/strings.xml
index cc864b2..03faf14 100644
--- a/v7/appcompat/res/values-sk/strings.xml
+++ b/v7/appcompat/res/values-sk/strings.xml
@@ -29,9 +29,9 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Hlasové vyhľadávanie"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Zvoľte aplikáciu"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Zobraziť všetko"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Zdieľať pomocou %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Zdieľať s aplikáciou <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Zdieľať pomocou"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ZAP."</string>
- <string name="abc_capital_off" msgid="121134116657445385">"VYP."</string>
+ <string name="abc_capital_on" msgid="3405795526292276155">"ZAPNUTÉ"</string>
+ <string name="abc_capital_off" msgid="121134116657445385">"VYPNUTÉ"</string>
<string name="search_menu_title" msgid="146198913615257606">"Vyhľadávanie"</string>
</resources>
diff --git a/v7/appcompat/res/values-sl/strings.xml b/v7/appcompat/res/values-sl/strings.xml
index 5bd2dbf..22b8bd4 100644
--- a/v7/appcompat/res/values-sl/strings.xml
+++ b/v7/appcompat/res/values-sl/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Glasovno iskanje"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Izbira aplikacije"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Pokaži vse"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deljenje z:"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Deljenje z drugimi prek aplikacije <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deljenje z"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"VKLOPLJENO"</string>
<string name="abc_capital_off" msgid="121134116657445385">"IZKLOPLJENO"</string>
diff --git a/v7/appcompat/res/values-sq/strings.xml b/v7/appcompat/res/values-sq/strings.xml
index aff2307..1a1f02e 100644
--- a/v7/appcompat/res/values-sq/strings.xml
+++ b/v7/appcompat/res/values-sq/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Kërkim me zë"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Zgjidh një aplikacion"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Shikoji të gjitha"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Shpërnda publikisht me %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Ndaje me <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Shpërnda publikisht me"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"AKTIV"</string>
<string name="abc_capital_off" msgid="121134116657445385">"JOAKTIV"</string>
diff --git a/v7/appcompat/res/values-sr/strings.xml b/v7/appcompat/res/values-sr/strings.xml
index 602cc6d..5678341 100644
--- a/v7/appcompat/res/values-sr/strings.xml
+++ b/v7/appcompat/res/values-sr/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Гласовна претрага"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Избор апликације"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Прикажи све"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Дели са апликацијом %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Дељење са апликацијом <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Дели са"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"УКЉУЧИ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ИСКЉУЧИ"</string>
diff --git a/v7/appcompat/res/values-sv/strings.xml b/v7/appcompat/res/values-sv/strings.xml
index 832ecc5..62d470f 100644
--- a/v7/appcompat/res/values-sv/strings.xml
+++ b/v7/appcompat/res/values-sv/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Röstsökning"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Välj en app"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Visa alla"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dela med %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Dela med <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dela med"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
diff --git a/v7/appcompat/res/values-sw/strings.xml b/v7/appcompat/res/values-sw/strings.xml
index a5f412a..c575ae0 100644
--- a/v7/appcompat/res/values-sw/strings.xml
+++ b/v7/appcompat/res/values-sw/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Tafuta kwa kutamka"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Chagua programu"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Angalia zote"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Shiriki na %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Shiriki ukitumia <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Shiriki na:"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"IMEWASHWA"</string>
<string name="abc_capital_off" msgid="121134116657445385">"IMEZIMWA"</string>
diff --git a/v7/appcompat/res/values-ta/strings.xml b/v7/appcompat/res/values-ta/strings.xml
index 4d15da8..7daeaaf 100644
--- a/v7/appcompat/res/values-ta/strings.xml
+++ b/v7/appcompat/res/values-ta/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"குரல் தேடல்"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"பயன்பாட்டைத் தேர்வுசெய்க"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"எல்லாம் காட்டு"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s உடன் பகிர்"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> மூலம் பகிர்"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"இதனுடன் பகிர்"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"இயக்கு"</string>
<string name="abc_capital_off" msgid="121134116657445385">"முடக்கு"</string>
diff --git a/v7/appcompat/res/values-te/strings.xml b/v7/appcompat/res/values-te/strings.xml
index f31f637..93f9aec 100644
--- a/v7/appcompat/res/values-te/strings.xml
+++ b/v7/appcompat/res/values-te/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"వాయిస్ శోధన"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"అనువర్తనాన్ని ఎంచుకోండి"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"అన్నీ చూడండి"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sతో భాగస్వామ్యం చేయి"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>తో భాగస్వామ్యం చేయండి"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"వీరితో భాగస్వామ్యం చేయి"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"ఆన్ చేయి"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ఆఫ్ చేయి"</string>
diff --git a/v7/appcompat/res/values-th/strings.xml b/v7/appcompat/res/values-th/strings.xml
index 1dcd0ca..f8ea1cd 100644
--- a/v7/appcompat/res/values-th/strings.xml
+++ b/v7/appcompat/res/values-th/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"ค้นหาด้วยเสียง"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"เลือกแอป"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ดูทั้งหมด"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"แชร์กับ %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"แชร์ทาง <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"แชร์กับ"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"เปิด"</string>
<string name="abc_capital_off" msgid="121134116657445385">"ปิด"</string>
diff --git a/v7/appcompat/res/values-tl/strings.xml b/v7/appcompat/res/values-tl/strings.xml
index 8bc2f9d..1ad2689 100644
--- a/v7/appcompat/res/values-tl/strings.xml
+++ b/v7/appcompat/res/values-tl/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Paghahanap gamit ang boses"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Pumili ng isang app"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Tingnan lahat"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Ibahagi sa/kay %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Ibahagi gamit ang <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Ibahagi sa/kay"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"I-ON"</string>
<string name="abc_capital_off" msgid="121134116657445385">"I-OFF"</string>
diff --git a/v7/appcompat/res/values-tr/strings.xml b/v7/appcompat/res/values-tr/strings.xml
index adf2b47..fae41d3 100644
--- a/v7/appcompat/res/values-tr/strings.xml
+++ b/v7/appcompat/res/values-tr/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Sesli arama"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Bir uygulama seçin"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Tümünü göster"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ile paylaş"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ile paylaş"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Şununla paylaş"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"AÇ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"KAPAT"</string>
diff --git a/v7/appcompat/res/values-uk/strings.xml b/v7/appcompat/res/values-uk/strings.xml
index bfd0027..afc74ff 100644
--- a/v7/appcompat/res/values-uk/strings.xml
+++ b/v7/appcompat/res/values-uk/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Голосовий пошук"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Вибрати програму"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Переглянути всі"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Надіслати через %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Поділитися через додаток <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Надіслати через"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"УВІМК."</string>
<string name="abc_capital_off" msgid="121134116657445385">"ВИМК."</string>
diff --git a/v7/appcompat/res/values-ur/strings.xml b/v7/appcompat/res/values-ur/strings.xml
index e0d13e7..60ec34a 100644
--- a/v7/appcompat/res/values-ur/strings.xml
+++ b/v7/appcompat/res/values-ur/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"صوتی تلاش"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ایک ایپ منتخب کریں"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"سبھی دیکھیں"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s کے ساتھ اشتراک کریں"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> کے ساتھ اشتراک کریں"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"اشتراک کریں مع"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"آن"</string>
<string name="abc_capital_off" msgid="121134116657445385">"آف"</string>
diff --git a/v7/appcompat/res/values-uz/strings.xml b/v7/appcompat/res/values-uz/strings.xml
index ef8cc2a..632e0b9 100644
--- a/v7/appcompat/res/values-uz/strings.xml
+++ b/v7/appcompat/res/values-uz/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Ovozli qidiruv"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Dastur tanlang"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Barchasini ko‘rish"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sga ruxsat berish"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> orqali ulashish"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Ruxsat berish"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"YONIQ"</string>
<string name="abc_capital_off" msgid="121134116657445385">"O‘CHIQ"</string>
diff --git a/v7/appcompat/res/values-vi/strings.xml b/v7/appcompat/res/values-vi/strings.xml
index 8d97f7e..9587bed 100644
--- a/v7/appcompat/res/values-vi/strings.xml
+++ b/v7/appcompat/res/values-vi/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Tìm kiếm bằng giọng nói"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Chọn một ứng dụng"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Xem tất cả"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Chia sẻ với %s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Chia sẻ với <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Chia sẻ với"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"BẬT"</string>
<string name="abc_capital_off" msgid="121134116657445385">"TẮT"</string>
diff --git a/v7/appcompat/res/values-zh-rCN/strings.xml b/v7/appcompat/res/values-zh-rCN/strings.xml
index 110e25c..7b23457 100644
--- a/v7/appcompat/res/values-zh-rCN/strings.xml
+++ b/v7/appcompat/res/values-zh-rCN/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"语音搜索"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"选择应用"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"查看全部"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"通过%s分享"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"使用<xliff:g id="APPLICATION_NAME">%s</xliff:g>分享"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享方式"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"开启"</string>
<string name="abc_capital_off" msgid="121134116657445385">"关闭"</string>
diff --git a/v7/appcompat/res/values-zh-rHK/strings.xml b/v7/appcompat/res/values-zh-rHK/strings.xml
index b639e4b..fc32117 100644
--- a/v7/appcompat/res/values-zh-rHK/strings.xml
+++ b/v7/appcompat/res/values-zh-rHK/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"語音搜尋"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"選擇應用程式"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"顯示全部"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"使用「<xliff:g id="APPLICATION_NAME">%s</xliff:g>」分享"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享對象"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
<string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
diff --git a/v7/appcompat/res/values-zh-rTW/strings.xml b/v7/appcompat/res/values-zh-rTW/strings.xml
index 5c9656d..35be873 100644
--- a/v7/appcompat/res/values-zh-rTW/strings.xml
+++ b/v7/appcompat/res/values-zh-rTW/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"語音搜尋"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"選擇應用程式"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"查看全部"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"與「<xliff:g id="APPLICATION_NAME">%s</xliff:g>」分享"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"選擇分享對象"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
<string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
diff --git a/v7/appcompat/res/values-zu/strings.xml b/v7/appcompat/res/values-zu/strings.xml
index 79b0079..e84ba7a 100644
--- a/v7/appcompat/res/values-zu/strings.xml
+++ b/v7/appcompat/res/values-zu/strings.xml
@@ -29,7 +29,7 @@
<string name="abc_searchview_description_voice" msgid="893419373245838918">"Ukusesha ngezwi"</string>
<string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Khetha uhlelo lokusebenza"</string>
<string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Buka konke"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Yabelana no-%s"</string>
+ <string name="abc_shareactionprovider_share_with_application" msgid="3300176832234831527">"Yabelana ne-<xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Yabelana no-"</string>
<string name="abc_capital_on" msgid="3405795526292276155">"VULIWE"</string>
<string name="abc_capital_off" msgid="121134116657445385">"VALIWE"</string>
diff --git a/v7/cardview/AndroidManifest.xml b/v7/cardview/AndroidManifest.xml
index 8fcf55a..af07bbc 100644
--- a/v7/cardview/AndroidManifest.xml
+++ b/v7/cardview/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.v7.cardview">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v7.cardview.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v7/cardview/api/26.1.0-SNAPSHOT.txt b/v7/cardview/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/cardview/api/26.1.0-SNAPSHOT.txt
rename to v7/cardview/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/gridlayout/AndroidManifest.xml b/v7/gridlayout/AndroidManifest.xml
index b6cb783..c18f5a1 100644
--- a/v7/gridlayout/AndroidManifest.xml
+++ b/v7/gridlayout/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.v7.gridlayout">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v7.gridlayout.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v7/gridlayout/api/26.1.0-SNAPSHOT.txt b/v7/gridlayout/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/gridlayout/api/26.1.0-SNAPSHOT.txt
rename to v7/gridlayout/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/gridlayout/build.gradle b/v7/gridlayout/build.gradle
index 9ec6714..db85eda 100644
--- a/v7/gridlayout/build.gradle
+++ b/v7/gridlayout/build.gradle
@@ -4,12 +4,8 @@
api project(':support-compat')
api project(':support-core-ui')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
}
android {
@@ -20,8 +16,6 @@
sourceSets {
main.java.srcDir 'src'
main.res.srcDir 'res'
- main.assets.srcDir 'assets'
- main.resources.srcDir 'src'
}
}
diff --git a/v7/mediarouter/AndroidManifest.xml b/v7/mediarouter/AndroidManifest.xml
index c4577f9..c2c4ee3 100644
--- a/v7/mediarouter/AndroidManifest.xml
+++ b/v7/mediarouter/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.v7.mediarouter">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v7.mediarouter.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v7/mediarouter/api/26.1.0-SNAPSHOT.txt b/v7/mediarouter/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/mediarouter/api/26.1.0-SNAPSHOT.txt
rename to v7/mediarouter/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/mediarouter/build.gradle b/v7/mediarouter/build.gradle
index 54c720b..59ecb17 100644
--- a/v7/mediarouter/build.gradle
+++ b/v7/mediarouter/build.gradle
@@ -4,12 +4,8 @@
api project(":appcompat-v7")
api project(":palette-v7")
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
androidTestImplementation libs.test_rules
}
diff --git a/v7/mediarouter/res/values-be/strings.xml b/v7/mediarouter/res/values-be/strings.xml
index 2d80bca..396088f 100644
--- a/v7/mediarouter/res/values-be/strings.xml
+++ b/v7/mediarouter/res/values-be/strings.xml
@@ -22,7 +22,7 @@
<string name="mr_cast_button_disconnected" msgid="816305490427819240">"Кнопка трансляцыі. Адключана"</string>
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"Кнопка трансляцыі. Ідзе падключэнне"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"Кнопка трансляцыі. Падключана"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Трансляваць на"</string>
+ <string name="mr_chooser_title" msgid="414301941546135990">"Трансліраваць на"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук прылад"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Адлучыць"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"Спыніць трансляцыю"</string>
diff --git a/v7/mediarouter/res/values-bs/strings.xml b/v7/mediarouter/res/values-bs/strings.xml
index 245b9da..ab9575e 100644
--- a/v7/mediarouter/res/values-bs/strings.xml
+++ b/v7/mediarouter/res/values-bs/strings.xml
@@ -18,11 +18,11 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Dugme za prebacivanje"</string>
- <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme za prebacivanje. Veza je prekinuta"</string>
- <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme za prebacivanje. Povezivanje"</string>
- <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme za prebacivanje. Povezan"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Prebacujte na"</string>
+ <string name="mr_button_content_description" msgid="3698378085901466129">"Dugme za emitiranje"</string>
+ <string name="mr_cast_button_disconnected" msgid="816305490427819240">"Dugme za emitiranje. Veza je prekinuta"</string>
+ <string name="mr_cast_button_connecting" msgid="2187642765091873834">"Dugme za emitiranje. Povezivanje"</string>
+ <string name="mr_cast_button_connected" msgid="5088427771788648085">"Dugme za emitiranje. Povezano"</string>
+ <string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zaustavi prebacivanje"</string>
diff --git a/v7/mediarouter/res/values-fr/strings.xml b/v7/mediarouter/res/values-fr/strings.xml
index be50201..47a7c6b 100644
--- a/v7/mediarouter/res/values-fr/strings.xml
+++ b/v7/mediarouter/res/values-fr/strings.xml
@@ -23,7 +23,7 @@
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"Icône Cast. Connexion…"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"Icône Cast. Connecté"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Caster sur"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils en cours…"</string>
+ <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils…"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Déconnecter"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"Arrêter la diffusion"</string>
<string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
diff --git a/v7/mediarouter/res/values-gl/strings.xml b/v7/mediarouter/res/values-gl/strings.xml
index 7e38bb4..e509ab7 100644
--- a/v7/mediarouter/res/values-gl/strings.xml
+++ b/v7/mediarouter/res/values-gl/strings.xml
@@ -22,7 +22,7 @@
<string name="mr_cast_button_disconnected" msgid="816305490427819240">"Botón de emitir. Desconectado"</string>
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"Botón de emitir. Conectando"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"Botón de emitir. Conectado"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emitir en"</string>
+ <string name="mr_chooser_title" msgid="414301941546135990">"Emitir a"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"Deter emisión"</string>
diff --git a/v7/mediarouter/res/values-iw/strings.xml b/v7/mediarouter/res/values-iw/strings.xml
index 3e7bc50..02f50ff 100644
--- a/v7/mediarouter/res/values-iw/strings.xml
+++ b/v7/mediarouter/res/values-iw/strings.xml
@@ -22,7 +22,7 @@
<string name="mr_cast_button_disconnected" msgid="816305490427819240">"לחצן הפעלת Cast. מנותק"</string>
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"לחצן הפעלת Cast. מתחבר"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"לחצן הפעלת Cast. מחובר"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"העבר אל"</string>
+ <string name="mr_chooser_title" msgid="414301941546135990">"העברה אל"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"מחפש מכשירים"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"נתק"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"הפסק את ההעברה"</string>
diff --git a/v7/mediarouter/res/values-ka/strings.xml b/v7/mediarouter/res/values-ka/strings.xml
index 57b76e9..22480ca 100644
--- a/v7/mediarouter/res/values-ka/strings.xml
+++ b/v7/mediarouter/res/values-ka/strings.xml
@@ -22,8 +22,8 @@
<string name="mr_cast_button_disconnected" msgid="816305490427819240">"ტრანსლირების ღილაკი. გათიშული"</string>
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"ტრანსლირების ღილაკი. მიმდინარეობს დაკავშირება"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"ტრანსლირების ღილაკი. დაკავშირებული"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირებული"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"მიმდინარეობს მოწყობილობების მოძიება"</string>
+ <string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირება:"</string>
+ <string name="mr_chooser_searching" msgid="6349900579507521956">"მოწყობილობების მოძიება..."</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"კავშირის გაწყვეტა"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"ტრანსლირების შეწყვეტა"</string>
<string name="mr_controller_close_description" msgid="7333862312480583260">"დახურვა"</string>
diff --git a/v7/mediarouter/res/values-km/strings.xml b/v7/mediarouter/res/values-km/strings.xml
index e9bef13..f9f339d 100644
--- a/v7/mediarouter/res/values-km/strings.xml
+++ b/v7/mediarouter/res/values-km/strings.xml
@@ -22,8 +22,8 @@
<string name="mr_cast_button_disconnected" msgid="816305490427819240">"ខាសប៊ូតុង៖ បានកាត់ផ្តាច់"</string>
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"ខាសប៊ូតុង៖ កំពុងភ្ជាប់"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"ខាសប៊ូតុង៖ បានភ្ជាប់ហើយ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ខាសទៅ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ស្វែងរកឧបករណ៍"</string>
+ <string name="mr_chooser_title" msgid="414301941546135990">"បញ្ជូនទៅ"</string>
+ <string name="mr_chooser_searching" msgid="6349900579507521956">"កំពុងស្វែងរកឧបករណ៍"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ផ្ដាច់"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"ឈប់ភ្ជាប់"</string>
<string name="mr_controller_close_description" msgid="7333862312480583260">"បិទ"</string>
diff --git a/v7/mediarouter/res/values-lo/strings.xml b/v7/mediarouter/res/values-lo/strings.xml
index e0703e8..d50ae66 100644
--- a/v7/mediarouter/res/values-lo/strings.xml
+++ b/v7/mediarouter/res/values-lo/strings.xml
@@ -22,7 +22,7 @@
<string name="mr_cast_button_disconnected" msgid="816305490427819240">"ປຸ່ມສົ່ງສັນຍານ. ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"ປຸ່ມສົ່ງສັນຍານ. ກຳລັງເຊື່ອມຕໍ່"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"ປຸ່ມສົ່ງສັນຍານ. ເຊື່ອມຕໍ່ແລ້ວ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ຄາສທ໌ຫາ"</string>
+ <string name="mr_chooser_title" msgid="414301941546135990">"ສົ່ງສັນຍານຫາ"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"ກຳລັງຊອກຫາອຸປະກອນ"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ຕັດການເຊື່ອມຕໍ່"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"ຢຸດການສົ່ງສັນຍານ"</string>
diff --git a/v7/mediarouter/res/values-mk/strings.xml b/v7/mediarouter/res/values-mk/strings.xml
index ae1bfee..d5b9365 100644
--- a/v7/mediarouter/res/values-mk/strings.xml
+++ b/v7/mediarouter/res/values-mk/strings.xml
@@ -23,7 +23,7 @@
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"Копче за Cast. Се поврзува"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"Копче за Cast. Поврзано"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Емитувај на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Наоѓање уреди"</string>
+ <string name="mr_chooser_searching" msgid="6349900579507521956">"Се бараат уреди"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Исклучи"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"Сопри го емитувањето"</string>
<string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
diff --git a/v7/mediarouter/res/values-my/strings.xml b/v7/mediarouter/res/values-my/strings.xml
index eb33498..fb0074d 100644
--- a/v7/mediarouter/res/values-my/strings.xml
+++ b/v7/mediarouter/res/values-my/strings.xml
@@ -22,7 +22,7 @@
<string name="mr_cast_button_disconnected" msgid="816305490427819240">"ကာစ်ခလုတ်။ ချိတ်ဆက်မထားပါ"</string>
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"ကာစ်ခလုတ်။ ချိတ်ဆက်နေသည်"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"ကာစ်ခလုတ်။ ချိတ်ဆက်ထားသည်"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"သို့ ကာစ်တ်လုပ်ရန်"</string>
+ <string name="mr_chooser_title" msgid="414301941546135990">"ကာစ်လုပ်ရန် စက်"</string>
<string name="mr_chooser_searching" msgid="6349900579507521956">"စက်ပစ္စည်းများ ရှာဖွေခြင်း"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ဆက်သွယ်မှု ဖြတ်ရန်"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"ကာစ်လုပ်ခြင်း ရပ်ရန်"</string>
diff --git a/v7/mediarouter/res/values-nb/strings.xml b/v7/mediarouter/res/values-nb/strings.xml
index d31aa73..7c99442 100644
--- a/v7/mediarouter/res/values-nb/strings.xml
+++ b/v7/mediarouter/res/values-nb/strings.xml
@@ -23,7 +23,7 @@
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"Cast-knappen. Kobler til"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"Cast-knappen. Tilkoblet"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finner enheter"</string>
+ <string name="mr_chooser_searching" msgid="6349900579507521956">"Søker etter enheter"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Koble fra"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"Stopp castingen"</string>
<string name="mr_controller_close_description" msgid="7333862312480583260">"Lukk"</string>
diff --git a/v7/mediarouter/res/values-pa/strings.xml b/v7/mediarouter/res/values-pa/strings.xml
index e058e18..f1a1a30 100644
--- a/v7/mediarouter/res/values-pa/strings.xml
+++ b/v7/mediarouter/res/values-pa/strings.xml
@@ -22,8 +22,8 @@
<string name="mr_cast_button_disconnected" msgid="816305490427819240">"ਕਾਸਟ ਬਟਨ। ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"ਕਾਸਟ ਬਟਨ। ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ਇਸ ਨਾਲ ਕਾਸਟ ਕਰੋ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ਡਿਵਾਈਸਾਂ ਲੱਭ ਰਿਹਾ ਹੈ"</string>
+ <string name="mr_chooser_title" msgid="414301941546135990">"ਏਥੇ ਕਾਸਟ ਕਰੋ"</string>
+ <string name="mr_chooser_searching" msgid="6349900579507521956">"ਡੀਵਾਈਸਾਂ ਨੂੰ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"ਕਾਸਟ ਕਰਨਾ ਬੰਦ ਕਰੋ"</string>
<string name="mr_controller_close_description" msgid="7333862312480583260">"ਬੰਦ ਕਰੋ"</string>
diff --git a/v7/mediarouter/res/values-sk/strings.xml b/v7/mediarouter/res/values-sk/strings.xml
index 2df58ef..43a769a 100644
--- a/v7/mediarouter/res/values-sk/strings.xml
+++ b/v7/mediarouter/res/values-sk/strings.xml
@@ -23,7 +23,7 @@
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"Tlačidlo prenosu. Pripája sa"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"Tlačidlo prenosu. Pripojené"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Prenos do"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Vyhľadávanie zariadení"</string>
+ <string name="mr_chooser_searching" msgid="6349900579507521956">"Hľadajú sa zariadenia"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojiť"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"Zastaviť prenášanie"</string>
<string name="mr_controller_close_description" msgid="7333862312480583260">"Zavrieť"</string>
diff --git a/v7/mediarouter/res/values-sq/strings.xml b/v7/mediarouter/res/values-sq/strings.xml
index 9f75316..d3cae18 100644
--- a/v7/mediarouter/res/values-sq/strings.xml
+++ b/v7/mediarouter/res/values-sq/strings.xml
@@ -23,7 +23,7 @@
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"Butoni i transmetimit. Po lidhet"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"Butoni i transmetimit. Je i lidhur"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Transmeto te"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Gjetja e pajisjeve"</string>
+ <string name="mr_chooser_searching" msgid="6349900579507521956">"Po kërkon pajisje"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Shkëpute"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"Ndalo transmetimin"</string>
<string name="mr_controller_close_description" msgid="7333862312480583260">"Mbyll"</string>
diff --git a/v7/mediarouter/res/values-uz/strings.xml b/v7/mediarouter/res/values-uz/strings.xml
index fae6076..2f9a8a2 100644
--- a/v7/mediarouter/res/values-uz/strings.xml
+++ b/v7/mediarouter/res/values-uz/strings.xml
@@ -33,7 +33,7 @@
<string name="mr_controller_expand_group" msgid="8062427022744266907">"Yoyish"</string>
<string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yig‘ish"</string>
<string name="mr_controller_album_art" msgid="6422801843540543585">"Albom muqovasi"</string>
- <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Ovoz balandligi slayderi"</string>
+ <string name="mr_controller_volume_slider" msgid="2361785992211841709">"Tovush balandligi slayderi"</string>
<string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Multimedia tanlamagan"</string>
<string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hech qanday ma’lumot yo‘q"</string>
<string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekranni translatsiya qilish"</string>
diff --git a/v7/mediarouter/res/values-vi/strings.xml b/v7/mediarouter/res/values-vi/strings.xml
index 5801c4f..3fbc252 100644
--- a/v7/mediarouter/res/values-vi/strings.xml
+++ b/v7/mediarouter/res/values-vi/strings.xml
@@ -23,7 +23,7 @@
<string name="mr_cast_button_connecting" msgid="2187642765091873834">"Nút truyền. Đang kết nối"</string>
<string name="mr_cast_button_connected" msgid="5088427771788648085">"Nút truyền. Đã kết nối"</string>
<string name="mr_chooser_title" msgid="414301941546135990">"Truyền tới"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Tìm thiết bị"</string>
+ <string name="mr_chooser_searching" msgid="6349900579507521956">"Đang tìm thiết bị"</string>
<string name="mr_controller_disconnect" msgid="1227264889412989580">"Ngắt kết nối"</string>
<string name="mr_controller_stop_casting" msgid="8857886794086583226">"Dừng truyền"</string>
<string name="mr_controller_close_description" msgid="7333862312480583260">"Đóng"</string>
diff --git a/v7/palette/AndroidManifest.xml b/v7/palette/AndroidManifest.xml
index 8e5ffaa..491cc8e 100644
--- a/v7/palette/AndroidManifest.xml
+++ b/v7/palette/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.v7.palette">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v7.palette.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v7/palette/api/26.1.0-SNAPSHOT.txt b/v7/palette/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/palette/api/26.1.0-SNAPSHOT.txt
rename to v7/palette/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/palette/build.gradle b/v7/palette/build.gradle
index e4670a7..f945327 100644
--- a/v7/palette/build.gradle
+++ b/v7/palette/build.gradle
@@ -4,9 +4,7 @@
api project(':support-compat')
api project(':support-core-utils')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
}
android {
diff --git a/v7/preference/AndroidManifest.xml b/v7/preference/AndroidManifest.xml
index 772b410..c8df9a0 100644
--- a/v7/preference/AndroidManifest.xml
+++ b/v7/preference/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.v7.preference">
<uses-sdk android:minSdkVersion="14" />
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v7.preference.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v7/preference/api/26.1.0-SNAPSHOT.txt b/v7/preference/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from v7/preference/api/26.1.0-SNAPSHOT.txt
rename to v7/preference/api/27.0.0-SNAPSHOT.txt
diff --git a/v7/preference/build.gradle b/v7/preference/build.gradle
index 65e78f0..ee31034 100644
--- a/v7/preference/build.gradle
+++ b/v7/preference/build.gradle
@@ -21,14 +21,10 @@
api project(':appcompat-v7')
api project(':recyclerview-v7')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
}
android {
diff --git a/v7/recyclerview/AndroidManifest.xml b/v7/recyclerview/AndroidManifest.xml
index 5b03882..04d095c 100644
--- a/v7/recyclerview/AndroidManifest.xml
+++ b/v7/recyclerview/AndroidManifest.xml
@@ -17,6 +17,7 @@
package="android.support.v7.recyclerview">
<uses-sdk android:minSdkVersion="14"/>
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.v7.recyclerview.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/v7/recyclerview/api/26.1.0-SNAPSHOT.txt b/v7/recyclerview/api/27.0.0-SNAPSHOT.txt
similarity index 99%
rename from v7/recyclerview/api/26.1.0-SNAPSHOT.txt
rename to v7/recyclerview/api/27.0.0-SNAPSHOT.txt
index 4e7e14d..9b4500a 100644
--- a/v7/recyclerview/api/26.1.0-SNAPSHOT.txt
+++ b/v7/recyclerview/api/27.0.0-SNAPSHOT.txt
@@ -307,6 +307,7 @@
method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
method public android.support.v7.widget.RecyclerView.ItemDecoration getItemDecorationAt(int);
+ method public int getItemDecorationCount();
method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
method public int getMaxFlingVelocity();
method public int getMinFlingVelocity();
@@ -330,6 +331,7 @@
method public void onScrollStateChanged(int);
method public void onScrolled(int, int);
method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+ method public void removeItemDecorationAt(int);
method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index cde85e5..beec61e 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -5,22 +5,16 @@
api project(':support-compat')
api project(':support-core-ui')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
androidTestImplementation libs.junit
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
androidTestImplementation project(':support-testutils')
testImplementation libs.junit
testImplementation libs.mockito_core
- testImplementation ("$libs.test_runner") {
- exclude module: 'support-annotations'
- }
+ testImplementation libs.test_runner, { exclude module: 'support-annotations' }
}
android {
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index 5bb9100..eacae37 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -1488,14 +1488,38 @@
* @return the ItemDecoration at index position, or null if invalid index.
*/
public ItemDecoration getItemDecorationAt(int index) {
- if (index < 0 || index >= mItemDecorations.size()) {
- return null;
+ final int size = getItemDecorationCount();
+ if (index < 0 || index >= size) {
+ throw new IndexOutOfBoundsException(index + " is an invalid index for size " + size);
}
return mItemDecorations.get(index);
}
/**
+ * Returns the number of {@link ItemDecoration} currently added to this RecyclerView.
+ *
+ * @return number of ItemDecorations currently added added to this RecyclerView.
+ */
+ public int getItemDecorationCount() {
+ return mItemDecorations.size();
+ }
+
+ /**
+ * Removes the {@link ItemDecoration} associated with the supplied index position.
+ *
+ * @param index The index position of the ItemDecoration to be removed.
+ */
+ public void removeItemDecorationAt(int index) {
+ final int size = getItemDecorationCount();
+ if (index < 0 || index >= size) {
+ throw new IndexOutOfBoundsException(index + " is an invalid index for size " + size);
+ }
+
+ removeItemDecoration(getItemDecorationAt(index));
+ }
+
+ /**
* Remove an {@link ItemDecoration} from this RecyclerView.
*
* <p>The given decoration will no longer impact the measurement and drawing of
diff --git a/v7/recyclerview/src/android/support/v7/widget/SnapHelper.java b/v7/recyclerview/src/android/support/v7/widget/SnapHelper.java
index d85a27a..4c41370 100644
--- a/v7/recyclerview/src/android/support/v7/widget/SnapHelper.java
+++ b/v7/recyclerview/src/android/support/v7/widget/SnapHelper.java
@@ -229,6 +229,10 @@
return new LinearSmoothScroller(mRecyclerView.getContext()) {
@Override
protected void onTargetFound(View targetView, RecyclerView.State state, Action action) {
+ if (mRecyclerView == null) {
+ // The associated RecyclerView has been removed so there is no action to take.
+ return;
+ }
int[] snapDistances = calculateDistanceToFinalSnap(mRecyclerView.getLayoutManager(),
targetView);
final int dx = snapDistances[0];
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
index dba3770..401b359 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/RecyclerViewFastScrollerTest.java
@@ -260,6 +260,7 @@
getInstrumentation().waitForIdleSync();
RecyclerView view = (RecyclerView) getActivity().findViewById(
android.support.v7.recyclerview.test.R.id.recycler_view);
+ assertTrue(view.getItemDecorationCount() == 1);
assertTrue(view.getItemDecorationAt(0) instanceof FastScroller);
FastScroller scroller = (FastScroller) view.getItemDecorationAt(0);
assertNotNull(scroller.getHorizontalThumbDrawable());
@@ -268,6 +269,22 @@
assertNotNull(scroller.getVerticalTrackDrawable());
}
+ @Test
+ public void removeFastScrollerSuccessful() throws Throwable {
+ setContentView(android.support.v7.recyclerview.test.R.layout.fast_scrollbar_test_rv);
+ getInstrumentation().waitForIdleSync();
+ final RecyclerView view = (RecyclerView) getActivity().findViewById(
+ android.support.v7.recyclerview.test.R.id.recycler_view);
+ assertTrue(view.getItemDecorationCount() == 1);
+ mActivityRule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ view.removeItemDecorationAt(0);
+ assertTrue(view.getItemDecorationCount() == 0);
+ }
+ });
+ }
+
@UiThreadTest
@Test
public void initWithBadDrawables() throws Throwable {
diff --git a/wear/AndroidManifest.xml b/wear/AndroidManifest.xml
index 5fa5a83..0541f36 100644
--- a/wear/AndroidManifest.xml
+++ b/wear/AndroidManifest.xml
@@ -16,6 +16,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.support.wear">
<application>
- <meta-data android:name="android.support.VERSION" android:value="${support-version}" />
+ <meta-data android:name="android.support.wear.VERSION"
+ android:value="${support-version}" />
</application>
</manifest>
diff --git a/wear/api/26.1.0-SNAPSHOT.txt b/wear/api/27.0.0-SNAPSHOT.txt
similarity index 100%
rename from wear/api/26.1.0-SNAPSHOT.txt
rename to wear/api/27.0.0-SNAPSHOT.txt
diff --git a/wear/build.gradle b/wear/build.gradle
index 4507e2c..12ab4d2 100644
--- a/wear/build.gradle
+++ b/wear/build.gradle
@@ -6,14 +6,10 @@
api project(':percent')
api project(':recyclerview-v7')
- androidTestImplementation (libs.test_runner) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation (libs.espresso_core) {
- exclude module: 'support-annotations'
- }
- androidTestImplementation libs.mockito_core
- androidTestImplementation libs.dexmaker_mockito
+ androidTestImplementation libs.test_runner, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.espresso_core, { exclude module: 'support-annotations' }
+ androidTestImplementation libs.mockito_core, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
+ androidTestImplementation libs.dexmaker_mockito, { exclude group: 'net.bytebuddy' } // DexMaker has it"s own MockMaker
}
android {
diff --git a/wear/lint-baseline.xml b/wear/lint-baseline.xml
index 81531cf..e961253 100644
--- a/wear/lint-baseline.xml
+++ b/wear/lint-baseline.xml
@@ -1,30 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<issues format="4" by="lint 3.0.0-alpha7">
- <issue
- id="DuplicateIds"
- message="Duplicate id `@+id/off`, already defined earlier in this layout"
- errorLine1=" android:id="@+id/off""
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="res/drawable-v21/ws_switch_thumb_material_anim.xml"
- line="27"
- column="9"/>
- <location
- file="res/drawable-v21/ws_switch_thumb_material_anim.xml"
- line="19"
- column="9"/>
- </issue>
-
- <issue
- id="ResourceAsColor"
- message="Should pass resolved color instead of resource id here: `getResources().getColor(android.R.color.darker_gray)`"
- errorLine1=" mCircleColor = ColorStateList.valueOf(android.R.color.darker_gray);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/android/support/wear/widget/CircledImageView.java"
- line="148"
- column="51"/>
- </issue>
-
</issues>
diff --git a/wear/res/drawable-v21/ws_switch_thumb_material_anim.xml b/wear/res/drawable-v21/ws_switch_thumb_material_anim.xml
index 15423e5..56e6864 100644
--- a/wear/res/drawable-v21/ws_switch_thumb_material_anim.xml
+++ b/wear/res/drawable-v21/ws_switch_thumb_material_anim.xml
@@ -24,7 +24,7 @@
android:drawable="@drawable/ws_switch_thumb_mtrl_14w"
android:state_checked="true" />
<item
- android:id="@+id/off"
+ android:id="@id/off"
android:drawable="@drawable/ws_switch_thumb_mtrl_14w" />
<transition
android:fromId="@id/off"
diff --git a/wear/src/android/support/wear/widget/CircledImageView.java b/wear/src/android/support/wear/widget/CircledImageView.java
index e21a1ab..03ed8c9 100644
--- a/wear/src/android/support/wear/widget/CircledImageView.java
+++ b/wear/src/android/support/wear/widget/CircledImageView.java
@@ -145,7 +145,7 @@
mCircleColor = a.getColorStateList(R.styleable.CircledImageView_background_color);
if (mCircleColor == null) {
- mCircleColor = ColorStateList.valueOf(android.R.color.darker_gray);
+ mCircleColor = ColorStateList.valueOf(context.getColor(android.R.color.darker_gray));
}
mCircleRadius = a.getDimension(R.styleable.CircledImageView_background_radius, 0);