diff options
author | 2016-07-28 11:10:33 -0700 | |
---|---|---|
committer | 2016-07-29 09:14:56 -0700 | |
commit | 84220410098d72fc32a19f650ee27067b5e87183 (patch) | |
tree | 667bf634d83c017010fc5d558c993dc8eb5bf89a | |
parent | 9382c5a7e4f2e6b90d2fa0810a2074701483496f (diff) |
Delete orig DocumentsUI.
Bug: 29224737
Change-Id: I6d6327918adba699d2ed3652bc2dbea27f872284
456 files changed, 1 insertions, 50490 deletions
diff --git a/packages/DocumentsUI/Android.mk b/packages/DocumentsUI/Android.mk deleted file mode 100644 index 9d44a6deb0c8..000000000000 --- a/packages/DocumentsUI/Android.mk +++ /dev/null @@ -1,46 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := optional -LOCAL_PRIVILEGED_MODULE := true - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 -# The design lib requires that the client package use appcompat themes. -LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-appcompat -LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13 -# Supplies material design components, e.g. Snackbar. -LOCAL_STATIC_JAVA_LIBRARIES += android-support-design -LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-recyclerview -LOCAL_STATIC_JAVA_LIBRARIES += guava - -LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res -# Not quite sure why it is necessary to explicitly pull in resources from the -# appcompat lib, but the demo code indicates it's necessary (see -# development/samples/Support7Demos/Android.mk) -LOCAL_RESOURCE_DIR += \ - frameworks/support/v7/appcompat/res \ - frameworks/support/design/res \ - frameworks/support/v7/recyclerview/res - -# Again, required to pull in appcompat resources. See abovementioned demo code. -LOCAL_AAPT_FLAGS := \ - --auto-add-overlay \ - --extra-packages android.support.v7.appcompat \ - --extra-packages android.support.design \ - --extra-packages android.support.v7.recyclerview - -LOCAL_JACK_FLAGS := \ - -D jack.optimization.inner-class.accessors=true - -# Only enable asserts on userdebug/eng builds -ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) -LOCAL_JACK_FLAGS += -D jack.assert.policy=always -endif - -LOCAL_PACKAGE_NAME := DocumentsUI -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) -include $(call all-makefiles-under, $(LOCAL_PATH)) diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml deleted file mode 100644 index b224510fd9fc..000000000000 --- a/packages/DocumentsUI/AndroidManifest.xml +++ /dev/null @@ -1,126 +0,0 @@ -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.documentsui"> - - <uses-permission android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS" /> - <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> - <uses-permission android:name="android.permission.REMOVE_TASKS" /> - <uses-permission android:name="android.permission.WAKE_LOCK" /> - <uses-permission android:name="android.permission.CACHE_CONTENT" /> - <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> - - <application - android:name=".DocumentsApplication" - android:label="@string/app_label" - android:icon="@mipmap/ic_app_icon" - android:supportsRtl="true"> - - <activity - android:name=".DocumentsActivity" - android:theme="@style/DocumentsTheme" - android:icon="@drawable/ic_doc_text"> - <intent-filter> - <action android:name="android.intent.action.OPEN_DOCUMENT" /> - <category android:name="android.intent.category.DEFAULT" /> - <category android:name="android.intent.category.OPENABLE" /> - <data android:mimeType="*/*" /> - </intent-filter> - <intent-filter> - <action android:name="android.intent.action.CREATE_DOCUMENT" /> - <category android:name="android.intent.category.DEFAULT" /> - <category android:name="android.intent.category.OPENABLE" /> - <data android:mimeType="*/*" /> - </intent-filter> - <intent-filter android:priority="100"> - <action android:name="android.intent.action.GET_CONTENT" /> - <category android:name="android.intent.category.DEFAULT" /> - <category android:name="android.intent.category.OPENABLE" /> - <data android:mimeType="*/*" /> - </intent-filter> - <intent-filter> - <action android:name="android.intent.action.OPEN_DOCUMENT_TREE" /> - <category android:name="android.intent.category.DEFAULT" /> - </intent-filter> - </activity> - - <activity - android:name=".LauncherActivity" - android:label="@string/downloads_label" - android:icon="@mipmap/ic_launcher_downloads" - android:theme="@android:style/Theme.NoDisplay"> - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - <category android:name="android.intent.category.LAUNCHER" /> - </intent-filter> - </activity> - - <activity - android:name=".FilesActivity" - android:label="@string/downloads_label" - android:icon="@mipmap/ic_launcher_downloads" - android:documentLaunchMode="intoExisting" - android:theme="@style/DocumentsTheme"> - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - </intent-filter> - <intent-filter> - <action android:name="android.provider.action.BROWSE" /> - <category android:name="android.intent.category.DEFAULT" /> - <data android:mimeType="vnd.android.document/root" /> - </intent-filter> - <intent-filter> - <action android:name="android.intent.action.VIEW_DOWNLOADS" /> - <category android:name="android.intent.category.DEFAULT" /> - </intent-filter> - <intent-filter> - <action android:name="android.intent.action.VIEW" /> - <category android:name="android.intent.category.DEFAULT" /> - <data android:mimeType="application/zip" - android:host="com.android.providers.downloads.documents" - android:scheme="content" /> - <data android:mimeType="application/x-zip" - android:host="com.android.providers.downloads.documents" - android:scheme="content" /> - <data android:mimeType="application/x-zip-compressed" - android:host="com.android.providers.downloads.documents" - android:scheme="content" /> - </intent-filter> - </activity> - - <activity - android:name=".OpenExternalDirectoryActivity" - android:theme="@android:style/Theme.Translucent.NoTitleBar"> - <intent-filter> - <action android:name="android.os.storage.action.OPEN_EXTERNAL_DIRECTORY" /> - <category android:name="android.intent.category.DEFAULT" /> - </intent-filter> - </activity> - - <provider - android:name=".RecentsProvider" - android:authorities="com.android.documentsui.recents" - android:exported="false"/> - - <receiver android:name=".PackageReceiver"> - <intent-filter> - <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" /> - <action android:name="android.intent.action.PACKAGE_DATA_CLEARED" /> - <data android:scheme="package" /> - </intent-filter> - </receiver> - - <receiver android:name=".BootReceiver" android:enabled="false"> - <intent-filter> - <action android:name="android.intent.action.BOOT_COMPLETED" /> - </intent-filter> - </receiver> - - <!-- Run FileOperationService in a separate process so that we can use FileLock class to - wait until jumbo clip is done writing to disk before reading it. See ClipStorage for - details. --> - <service - android:name=".services.FileOperationService" - android:exported="false" - android:process=":com.android.documentsui.services"> - </service> - </application> -</manifest> diff --git a/packages/DocumentsUI/MOVED b/packages/DocumentsUI/MOVED new file mode 100644 index 000000000000..d1dc514a411f --- /dev/null +++ b/packages/DocumentsUI/MOVED @@ -0,0 +1 @@ +../../../../packages/apps/DocumentsUI diff --git a/packages/DocumentsUI/app-perf-tests/Android.mk b/packages/DocumentsUI/app-perf-tests/Android.mk deleted file mode 100644 index 3f12906b7f62..000000000000 --- a/packages/DocumentsUI/app-perf-tests/Android.mk +++ /dev/null @@ -1,18 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests -#LOCAL_SDK_VERSION := current - -LOCAL_SRC_FILES := $(call all-java-files-under, src) \ - -LOCAL_JAVA_LIBRARIES := android-support-v4 android.test.runner -LOCAL_STATIC_JAVA_LIBRARIES := mockito-target ub-uiautomator - -LOCAL_PACKAGE_NAME := DocumentsUIAppPerfTests -LOCAL_INSTRUMENTATION_FOR := DocumentsUI - -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) - diff --git a/packages/DocumentsUI/app-perf-tests/AndroidManifest.xml b/packages/DocumentsUI/app-perf-tests/AndroidManifest.xml deleted file mode 100644 index 0013b6b7be7e..000000000000 --- a/packages/DocumentsUI/app-perf-tests/AndroidManifest.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.documentsui.appperftests"> - - <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> - - <application> - <uses-library android:name="android.test.runner" /> - - <activity - android:name="com.android.documentsui.LauncherActivity" /> - </application> - - <!-- This package instrumentates itself, so the DocumentsUI process can be killed without - killing the testing package. --> - <instrumentation android:name="android.test.InstrumentationTestRunner" - android:targetPackage="com.android.documentsui.appperftests" - android:label="App performance tests for DocumentsUI" /> - -</manifest> diff --git a/packages/DocumentsUI/app-perf-tests/src/com/android/documentsui/FilesAppPerfTest.java b/packages/DocumentsUI/app-perf-tests/src/com/android/documentsui/FilesAppPerfTest.java deleted file mode 100644 index ce2fc13bc55a..000000000000 --- a/packages/DocumentsUI/app-perf-tests/src/com/android/documentsui/FilesAppPerfTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.app.Activity; -import android.app.ActivityManager; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.support.test.uiautomator.UiDevice; -import android.test.InstrumentationTestCase; -import android.test.suitebuilder.annotation.LargeTest; -import android.util.Log; - -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CountDownLatch; - -@LargeTest -public class FilesAppPerfTest extends InstrumentationTestCase { - - // Keys used to report metrics to APCT. - private static final String KEY_FILES_COLD_START_PERFORMANCE_MEDIAN = - "files-cold-start-performance-median"; - private static final String KEY_FILES_WARM_START_PERFORMANCE_MEDIAN = - "files-warm-start-performance-median"; - - private static final String TARGET_PACKAGE = "com.android.documentsui"; - - private static final int NUM_MEASUREMENTS = 10; - - private LauncherActivity mActivity; - private UiDevice mDevice; - - @Override - public void setUp() { - mDevice = UiDevice.getInstance(getInstrumentation()); - } - - public void testFilesColdStartPerformance() throws Exception { - runFilesStartPerformanceTest(true); - } - - public void testFilesWarmStartPerformance() throws Exception { - runFilesStartPerformanceTest(false); - } - - public void runFilesStartPerformanceTest(boolean cold) throws Exception { - long[] measurements = new long[NUM_MEASUREMENTS]; - for (int i = 0; i < NUM_MEASUREMENTS; i++) { - if (cold) { - // Kill all providers, as well as DocumentsUI to measure a cold start. - killProviders(); - mDevice.executeShellCommand("am force-stop " + TARGET_PACKAGE); - } - mDevice.waitForIdle(); - - LauncherActivity.testCaseLatch = new CountDownLatch(1); - mActivity = launchActivity(getInstrumentation().getTargetContext().getPackageName(), - LauncherActivity.class, null); - LauncherActivity.testCaseLatch.await(); - measurements[i] = LauncherActivity.measurement; - } - - reportMetrics(cold ? KEY_FILES_COLD_START_PERFORMANCE_MEDIAN - : KEY_FILES_WARM_START_PERFORMANCE_MEDIAN, measurements); - } - - private void reportMetrics(String key, long[] measurements) { - final Bundle status = new Bundle(); - Arrays.sort(measurements); - final long median = measurements[NUM_MEASUREMENTS / 2 - 1]; - status.putDouble(key, median); - - getInstrumentation().sendStatus(Activity.RESULT_OK, status); - } - - private void killProviders() throws Exception { - final Context context = getInstrumentation().getContext(); - final PackageManager pm = context.getPackageManager(); - final ActivityManager am = (ActivityManager) context.getSystemService( - Context.ACTIVITY_SERVICE); - final Intent intent = new Intent(DocumentsContract.PROVIDER_INTERFACE); - final List<ResolveInfo> providers = pm.queryIntentContentProviders(intent, 0); - for (ResolveInfo info : providers) { - final String packageName = info.providerInfo.packageName; - am.killBackgroundProcesses(packageName); - } - } -} diff --git a/packages/DocumentsUI/app-perf-tests/src/com/android/documentsui/LauncherActivity.java b/packages/DocumentsUI/app-perf-tests/src/com/android/documentsui/LauncherActivity.java deleted file mode 100644 index 21fc52e006b7..000000000000 --- a/packages/DocumentsUI/app-perf-tests/src/com/android/documentsui/LauncherActivity.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.EXTRA_BENCHMARK; - -import android.app.Activity; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Bundle; -import android.os.Handler; -import android.util.Log; - -import java.util.concurrent.CountDownLatch; - -public class LauncherActivity extends Activity { - private static final String TARGET_PACKAGE = "com.android.documentsui"; - private static final int BENCHMARK_REQUEST_CODE = 1986; - - public static CountDownLatch testCaseLatch = null; - public static long measurement = -1; - - private long mStartTime = -1; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - new Handler().post(new Runnable() { - @Override public void run() { - final Intent intent = new Intent("android.intent.action.OPEN_DOCUMENT"); - intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.putExtra(EXTRA_BENCHMARK, true); - intent.setType("*/*"); - - mStartTime = System.currentTimeMillis(); - startActivityForResult(intent, BENCHMARK_REQUEST_CODE); - } - }); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == BENCHMARK_REQUEST_CODE) { - measurement = System.currentTimeMillis() - mStartTime; - testCaseLatch.countDown(); - finish(); - } - } -} diff --git a/packages/DocumentsUI/lint.xml b/packages/DocumentsUI/lint.xml deleted file mode 100644 index 09661bab67fc..000000000000 --- a/packages/DocumentsUI/lint.xml +++ /dev/null @@ -1,36 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<lint> - <!-- - Lint configuration for the framework-lint tool (go/fwlint). See - http://tools.android.com/tips/lint for full docs on the lint tool. - --> - - <!-- min-sdk doesn't apply to platform apps. --> - <issue id="UsesMinSdkAttributes" severity="ignore" /> - - <!-- Protected permissions don't apply to system apps. --> - <issue id="ProtectedPermissions" severity="ignore" /> - - <!-- Other recommended suppressions copied from go/fwlint. --> - <issue id="Assert" severity="ignore" /> - <issue id="ClickableViewAccessibility" severity="ignore" /> - <issue id="GoogleAppIndexingWarning" severity="ignore" /> - <issue id="MissingPermission" severity="ignore" /> - <issue id="ParcelClassLoader" severity="ignore" /> - <issue id="ParcelCreator" severity="ignore" /> - <issue id="Registered" severity="ignore" /> - <issue id="RtlHardcoded" severity="ignore" /> - <issue id="ShiftFlags" severity="ignore" /> - <issue id="SuspiciousImport" severity="ignore" /> - - <!-- Don't lint automatically translated strings. --> - <issue id="all"> - <ignore path="res/values-*/strings.xml" /> - </issue> - - <!-- Don't warn about missing translations. --> - <issue id="MissingTranslation"> - <ignore path="res/values/strings.xml" /> - </issue> - -</lint> diff --git a/packages/DocumentsUI/perf-tests/Android.mk b/packages/DocumentsUI/perf-tests/Android.mk deleted file mode 100644 index 39a08f741066..000000000000 --- a/packages/DocumentsUI/perf-tests/Android.mk +++ /dev/null @@ -1,22 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests - -LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res -LOCAL_SRC_FILES := $(call all-java-files-under, src) \ - $(call all-java-files-under, ../tests/src/com/android/documentsui/bots) \ - ../tests/src/com/android/documentsui/ActivityTest.java \ - ../tests/src/com/android/documentsui/DocumentsProviderHelper.java \ - ../tests/src/com/android/documentsui/StubProvider.java - -LOCAL_JAVA_LIBRARIES := android-support-v4 android.test.runner -LOCAL_STATIC_JAVA_LIBRARIES := mockito-target ub-uiautomator ub-janktesthelper espresso-core - -LOCAL_PACKAGE_NAME := DocumentsUIPerfTests -LOCAL_INSTRUMENTATION_FOR := DocumentsUI - -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) - diff --git a/packages/DocumentsUI/perf-tests/AndroidManifest.xml b/packages/DocumentsUI/perf-tests/AndroidManifest.xml deleted file mode 100644 index 97353e7df73b..000000000000 --- a/packages/DocumentsUI/perf-tests/AndroidManifest.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.documentsui.perftests"> - - <application> - <uses-library android:name="android.test.runner" /> - <provider - android:name="com.android.documentsui.StressProvider" - android:authorities="com.android.documentsui.stressprovider" - android:exported="true" - android:grantUriPermissions="true" - android:permission="android.permission.MANAGE_DOCUMENTS" - android:enabled="true"> - <intent-filter> - <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> - </intent-filter> - </provider> - </application> - - <instrumentation android:name="android.test.InstrumentationTestRunner" - android:targetPackage="com.android.documentsui" - android:label="Performance tests for DocumentsUI" /> - -</manifest> diff --git a/packages/DocumentsUI/perf-tests/res/raw/earth_small.jpg b/packages/DocumentsUI/perf-tests/res/raw/earth_small.jpg Binary files differdeleted file mode 100644 index dd2da3e9081b..000000000000 --- a/packages/DocumentsUI/perf-tests/res/raw/earth_small.jpg +++ /dev/null diff --git a/packages/DocumentsUI/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java b/packages/DocumentsUI/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java deleted file mode 100644 index bf056f12fba5..000000000000 --- a/packages/DocumentsUI/perf-tests/src/com/android/documentsui/FilesActivityPerfTest.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.StressProvider.DEFAULT_AUTHORITY; -import static com.android.documentsui.StressProvider.STRESS_ROOT_0_ID; -import static com.android.documentsui.StressProvider.STRESS_ROOT_1_ID; - -import android.app.Activity; -import android.net.Uri; -import android.os.Bundle; -import android.os.RemoteException; -import android.test.suitebuilder.annotation.LargeTest; -import android.util.Log; -import android.view.KeyEvent; - -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.EventListener; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; -import java.util.concurrent.CountDownLatch; - -@LargeTest -public class FilesActivityPerfTest extends ActivityTest<FilesActivity> { - - // Constants starting with KEY_ are used to report metrics to APCT. - private static final String KEY_FILES_LISTED_PERFORMANCE_FIRST = - "files-listed-performance-first"; - - private static final String KEY_FILES_LISTED_PERFORMANCE_MEDIAN = - "files-listed-performance-median"; - - private static final String TESTED_URI = - "content://com.android.documentsui.stressprovider/document/STRESS_ROOT_1_DOC"; - - private static final int NUM_MEASUREMENTS = 10; - - public FilesActivityPerfTest() { - super(FilesActivity.class); - } - - @Override - protected RootInfo getInitialRoot() { - return rootDir0; - } - - @Override - protected String getTestingProviderAuthority() { - return DEFAULT_AUTHORITY; - } - - @Override - protected void setupTestingRoots() throws RemoteException { - rootDir0 = mDocsHelper.getRoot(STRESS_ROOT_0_ID); - rootDir1 = mDocsHelper.getRoot(STRESS_ROOT_1_ID); - } - - @Override - public void initTestFiles() throws RemoteException { - // Nothing to create, already done by StressProvider. - } - - public void testFilesListedPerformance() throws Exception { - final BaseActivity activity = getActivity(); - - final List<Long> measurements = new ArrayList<Long>(); - EventListener listener; - for (int i = 0; i < 10; i++) { - final CountDownLatch signal = new CountDownLatch(1); - listener = new EventListener() { - @Override - public void onDirectoryNavigated(Uri uri) { - if (uri != null && TESTED_URI.equals(uri.toString())) { - mStartTime = System.currentTimeMillis(); - } else { - mStartTime = -1; - } - } - - @Override - public void onDirectoryLoaded(Uri uri) { - if (uri == null || !TESTED_URI.equals(uri.toString())) { - return; - } - assertTrue(mStartTime != -1); - getInstrumentation().waitForIdle(new Runnable() { - @Override - public void run() { - assertTrue(mStartTime != -1); - measurements.add(System.currentTimeMillis() - mStartTime); - signal.countDown(); - } - }); - } - - private long mStartTime = -1; - }; - - try { - activity.addEventListener(listener); - bots.roots.openRoot(STRESS_ROOT_1_ID); - signal.await(); - } finally { - activity.removeEventListener(listener); - } - - assertEquals(i + 1, measurements.size()); - - // Go back to the empty root. - bots.roots.openRoot(STRESS_ROOT_0_ID); - } - - assertEquals(NUM_MEASUREMENTS, measurements.size()); - - final Bundle status = new Bundle(); - status.putDouble(KEY_FILES_LISTED_PERFORMANCE_FIRST, measurements.get(0)); - - final Long[] rawMeasurements = measurements.toArray(new Long[NUM_MEASUREMENTS]); - Arrays.sort(rawMeasurements); - - final long median = rawMeasurements[NUM_MEASUREMENTS / 2 - 1]; - status.putDouble(KEY_FILES_LISTED_PERFORMANCE_MEDIAN, median); - - getInstrumentation().sendStatus(Activity.RESULT_OK, status); - } -} diff --git a/packages/DocumentsUI/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java b/packages/DocumentsUI/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java deleted file mode 100644 index 9925d5b0c782..000000000000 --- a/packages/DocumentsUI/perf-tests/src/com/android/documentsui/FilesJankPerfTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.StressProvider.DEFAULT_AUTHORITY; -import static com.android.documentsui.StressProvider.STRESS_ROOT_0_ID; -import static com.android.documentsui.StressProvider.STRESS_ROOT_2_ID; - -import android.app.Activity; -import android.os.RemoteException; -import android.test.suitebuilder.annotation.LargeTest; - -import android.content.Intent; -import android.content.Context; -import android.support.test.jank.JankTest; -import android.support.test.jank.JankTestBase; -import android.support.test.uiautomator.UiDevice; -import android.support.test.jank.GfxMonitor; -import android.support.test.uiautomator.UiScrollable; -import android.util.Log; - -import com.android.documentsui.FilesActivity; -import com.android.documentsui.bots.RootsListBot; -import com.android.documentsui.bots.DirectoryListBot; - -@LargeTest -public class FilesJankPerfTest extends JankTestBase { - private static final String DOCUMENTSUI_PACKAGE = "com.android.documentsui"; - private static final int MAX_FLINGS = 10; - private static final int BOT_TIMEOUT = 5000; - - private RootsListBot mRootsListBot; - private DirectoryListBot mDirListBot; - private Activity mActivity = null; - - public void setUpInLoop() { - final UiDevice device = UiDevice.getInstance(getInstrumentation()); - final Context context = getInstrumentation().getTargetContext(); - mRootsListBot = new RootsListBot(device, context, BOT_TIMEOUT); - mDirListBot = new DirectoryListBot(device, context, BOT_TIMEOUT); - - final Intent intent = new Intent(context, FilesActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mActivity = getInstrumentation().startActivitySync(intent); - try { - device.setOrientationNatural(); - } catch (RemoteException e) { - } - } - - public void tearDownInLoop() { - if (mActivity != null) { - mActivity.finish(); - mActivity = null; - } - try { - final UiDevice device = UiDevice.getInstance(getInstrumentation()); - device.unfreezeRotation(); - } catch (RemoteException e) { - } - } - - public void setupAndOpenInLoop() throws Exception { - setUpInLoop(); - openRoot(); - } - - public void openRoot() throws Exception { - mRootsListBot.openRoot(STRESS_ROOT_2_ID); - } - - @JankTest(expectedFrames=0, beforeLoop="setUpInLoop", afterLoop="tearDownInLoop") - @GfxMonitor(processName=DOCUMENTSUI_PACKAGE) - public void testOpenRootJankPerformance() throws Exception { - openRoot(); - getInstrumentation().waitForIdleSync(); - } - - @JankTest(expectedFrames=0, beforeLoop="setupAndOpenInLoop", afterLoop="tearDownInLoop") - @GfxMonitor(processName=DOCUMENTSUI_PACKAGE) - public void testFlingJankPerformance() throws Exception { - new UiScrollable(mDirListBot.findDocumentsList().getSelector()).flingToEnd(MAX_FLINGS); - getInstrumentation().waitForIdleSync(); - } -} diff --git a/packages/DocumentsUI/perf-tests/src/com/android/documentsui/StressProvider.java b/packages/DocumentsUI/perf-tests/src/com/android/documentsui/StressProvider.java deleted file mode 100644 index f9b06f804bac..000000000000 --- a/packages/DocumentsUI/perf-tests/src/com/android/documentsui/StressProvider.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.content.pm.ProviderInfo; -import android.content.res.AssetFileDescriptor; -import android.database.Cursor; -import android.database.MatrixCursor.RowBuilder; -import android.database.MatrixCursor; -import android.graphics.Point; -import android.os.CancellationSignal; -import android.os.FileUtils; -import android.os.ParcelFileDescriptor; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Root; -import android.provider.DocumentsContract; -import android.provider.DocumentsProvider; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; - -/** - * Provider with thousands of files for testing loading time of directories in DocumentsUI. - * It doesn't support any file operations. - */ -public class StressProvider extends DocumentsProvider { - - public static final String DEFAULT_AUTHORITY = "com.android.documentsui.stressprovider"; - - // Empty root. - public static final String STRESS_ROOT_0_ID = "STRESS_ROOT_0"; - - // Root with thousands of directories. - public static final String STRESS_ROOT_1_ID = "STRESS_ROOT_1"; - - // Root with hundreds of files. - public static final String STRESS_ROOT_2_ID = "STRESS_ROOT_2"; - - private static final String STRESS_ROOT_0_DOC_ID = "STRESS_ROOT_0_DOC"; - private static final String STRESS_ROOT_1_DOC_ID = "STRESS_ROOT_1_DOC"; - private static final String STRESS_ROOT_2_DOC_ID = "STRESS_ROOT_2_DOC"; - - private static final int STRESS_ROOT_1_ITEMS = 10000; - private static final int STRESS_ROOT_2_ITEMS = 300; - - private static final String MIME_TYPE_IMAGE = "image/jpeg"; - private static final long REFERENCE_TIMESTAMP = 1459159369359L; - - private static final String[] DEFAULT_ROOT_PROJECTION = new String[] { - Root.COLUMN_ROOT_ID, Root.COLUMN_FLAGS, Root.COLUMN_TITLE, Root.COLUMN_DOCUMENT_ID, - Root.COLUMN_AVAILABLE_BYTES - }; - private static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] { - Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE, Document.COLUMN_DISPLAY_NAME, - Document.COLUMN_LAST_MODIFIED, Document.COLUMN_FLAGS, Document.COLUMN_SIZE, - }; - - private String mAuthority = DEFAULT_AUTHORITY; - - // Map from a root document id to children document ids. - private Map<String, ArrayList<StubDocument>> mChildDocuments = new HashMap<>(); - - private Map<String, StubDocument> mDocuments = new HashMap<>(); - private Map<String, StubRoot> mRoots = new HashMap<>(); - - @Override - public void attachInfo(Context context, ProviderInfo info) { - mAuthority = info.authority; - super.attachInfo(context, info); - } - - @Override - public boolean onCreate() { - StubDocument document; - - ArrayList<StubDocument> children = new ArrayList<StubDocument>(); - mChildDocuments.put(STRESS_ROOT_1_DOC_ID, children); - for (int i = 0; i < STRESS_ROOT_1_ITEMS; i++) { - document = StubDocument.createDirectory(i); - mDocuments.put(document.id, document); - children.add(document); - } - - children = new ArrayList<StubDocument>(); - mChildDocuments.put(STRESS_ROOT_2_DOC_ID, children); - for (int i = 0; i < STRESS_ROOT_2_ITEMS; i++) { - try { - document = StubDocument.createFile( - getContext(), MIME_TYPE_IMAGE, - com.android.documentsui.perftests.R.raw.earth_small, - STRESS_ROOT_1_ITEMS + i); - } catch (IOException e) { - return false; - } - mDocuments.put(document.id, document); - children.add(document); - } - - mRoots.put(STRESS_ROOT_0_ID, new StubRoot(STRESS_ROOT_0_ID, STRESS_ROOT_0_DOC_ID)); - mRoots.put(STRESS_ROOT_1_ID, new StubRoot(STRESS_ROOT_1_ID, STRESS_ROOT_1_DOC_ID)); - mRoots.put(STRESS_ROOT_2_ID, new StubRoot(STRESS_ROOT_2_ID, STRESS_ROOT_2_DOC_ID)); - - mDocuments.put(STRESS_ROOT_0_DOC_ID, StubDocument.createDirectory(STRESS_ROOT_0_DOC_ID)); - mDocuments.put(STRESS_ROOT_1_DOC_ID, StubDocument.createDirectory(STRESS_ROOT_1_DOC_ID)); - mDocuments.put(STRESS_ROOT_2_DOC_ID, StubDocument.createDirectory(STRESS_ROOT_2_DOC_ID)); - - return true; - } - - @Override - public Cursor queryRoots(String[] projection) throws FileNotFoundException { - final MatrixCursor result = new MatrixCursor(DEFAULT_ROOT_PROJECTION); - for (StubRoot root : mRoots.values()) { - includeRoot(result, root); - } - return result; - } - - @Override - public Cursor queryDocument(String documentId, String[] projection) - throws FileNotFoundException { - final MatrixCursor result = new MatrixCursor(DEFAULT_DOCUMENT_PROJECTION); - final StubDocument document = mDocuments.get(documentId); - includeDocument(result, document); - return result; - } - - @Override - public Cursor queryChildDocuments(String parentDocumentId, String[] projection, - String sortOrder) - throws FileNotFoundException { - final MatrixCursor result = new MatrixCursor(DEFAULT_DOCUMENT_PROJECTION); - final ArrayList<StubDocument> childDocuments = mChildDocuments.get(parentDocumentId); - if (childDocuments != null) { - for (StubDocument document : childDocuments) { - includeDocument(result, document); - } - } - return result; - } - - @Override - public AssetFileDescriptor openDocumentThumbnail(String docId, Point sizeHint, - CancellationSignal signal) - throws FileNotFoundException { - final StubDocument document = mDocuments.get(docId); - return getContext().getResources().openRawResourceFd(document.thumbnail); - } - - @Override - public ParcelFileDescriptor openDocument(String docId, String mode, - CancellationSignal signal) - throws FileNotFoundException { - throw new UnsupportedOperationException(); - } - - private void includeRoot(MatrixCursor result, StubRoot root) { - final RowBuilder row = result.newRow(); - row.add(Root.COLUMN_ROOT_ID, root.id); - row.add(Root.COLUMN_FLAGS, 0); - row.add(Root.COLUMN_TITLE, root.id); - row.add(Root.COLUMN_DOCUMENT_ID, root.documentId); - } - - private void includeDocument(MatrixCursor result, StubDocument document) { - final RowBuilder row = result.newRow(); - row.add(Document.COLUMN_DOCUMENT_ID, document.id); - row.add(Document.COLUMN_DISPLAY_NAME, document.id); - row.add(Document.COLUMN_SIZE, document.size); - row.add(Document.COLUMN_MIME_TYPE, document.mimeType); - row.add(Document.COLUMN_FLAGS, - document.thumbnail != -1 ? Document.FLAG_SUPPORTS_THUMBNAIL : 0); - row.add(Document.COLUMN_LAST_MODIFIED, document.lastModified); - } - - private static String getStubDocumentIdForFile(File file) { - return file.getAbsolutePath(); - } - - private static class StubDocument { - final String mimeType; - final String id; - final int size; - final long lastModified; - final int thumbnail; - - private StubDocument(String mimeType, String id, int size, long lastModified, - int thumbnail) { - this.mimeType = mimeType; - this.id = id; - this.size = size; - this.lastModified = lastModified; - this.thumbnail = thumbnail; - } - - public static StubDocument createDirectory(int index) { - return new StubDocument( - DocumentsContract.Document.MIME_TYPE_DIR, createRandomId(index), 0, - createRandomTime(index), -1); - } - - public static StubDocument createDirectory(String id) { - return new StubDocument(DocumentsContract.Document.MIME_TYPE_DIR, id, 0, 0, -1); - } - - public static StubDocument createFile(Context context, String mimeType, int thumbnail, - int index) throws IOException { - return new StubDocument( - mimeType, createRandomId(index), createRandomSize(index), - createRandomTime(index), thumbnail); - } - - private static String createRandomId(int index) { - final Random random = new Random(index); - final StringBuilder builder = new StringBuilder(); - for (int i = 0; i < 20; i++) { - builder.append((char) (random.nextInt(96) + 32)); - } - builder.append(index); // Append a number to guarantee uniqueness. - return builder.toString(); - } - - private static int createRandomSize(int index) { - final Random random = new Random(index); - return random.nextInt(1024 * 1024 * 100); // Up to 100 MB. - } - - private static long createRandomTime(int index) { - final Random random = new Random(index); - // Up to 30 days backwards from REFERENCE_TIMESTAMP. - return REFERENCE_TIMESTAMP - random.nextLong() % 1000L * 60 * 60 * 24 * 30; - } - } - - private static class StubRoot { - final String id; - final String documentId; - - public StubRoot(String id, String documentId) { - this.id = id; - this.documentId = documentId; - } - } -} diff --git a/packages/DocumentsUI/res/animator/dir_enter.xml b/packages/DocumentsUI/res/animator/dir_enter.xml deleted file mode 100644 index 570104e8272c..000000000000 --- a/packages/DocumentsUI/res/animator/dir_enter.xml +++ /dev/null @@ -1,36 +0,0 @@ -<!-- Copyright (C) 2013 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. ---> - -<set xmlns:android="http://schemas.android.com/apk/res/android" - android:ordering="together"> - - <objectAnimator - android:valueFrom="0f" - android:valueTo="1f" - android:propertyName="alpha" - android:valueType="floatType" - android:duration="200" - android:interpolator="@android:interpolator/decelerate_quad" /> - - <!-- position property maps to AnimationView.setPosition --> - <objectAnimator - android:propertyName="position" - android:valueFrom="1" - android:valueTo="0" - android:valueType="floatType" - android:duration="350" - android:interpolator="@android:interpolator/decelerate_quad" /> - -</set> diff --git a/packages/DocumentsUI/res/animator/dir_leave.xml b/packages/DocumentsUI/res/animator/dir_leave.xml deleted file mode 100644 index 5929625ecdc9..000000000000 --- a/packages/DocumentsUI/res/animator/dir_leave.xml +++ /dev/null @@ -1,37 +0,0 @@ -<!-- Copyright (C) 2013 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. ---> - -<set xmlns:android="http://schemas.android.com/apk/res/android" - android:ordering="together"> - - <objectAnimator - android:valueFrom="1f" - android:valueTo="0f" - android:propertyName="alpha" - android:valueType="floatType" - android:duration="150" - android:startOffset="100" - android:interpolator="@android:interpolator/decelerate_quad" /> - - <!-- position property maps to AnimationView.setPosition --> - <objectAnimator - android:valueFrom="0" - android:valueTo="1" - android:propertyName="position" - android:valueType="floatType" - android:duration="250" - android:interpolator="@android:interpolator/accelerate_quad" /> - -</set>
\ No newline at end of file diff --git a/packages/DocumentsUI/res/animator/fade_in.xml b/packages/DocumentsUI/res/animator/fade_in.xml deleted file mode 100644 index 3ce012b96f64..000000000000 --- a/packages/DocumentsUI/res/animator/fade_in.xml +++ /dev/null @@ -1,22 +0,0 @@ -<!-- Copyright (C) 2013 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. ---> - -<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" - android:valueFrom="0f" - android:valueTo="1f" - android:propertyName="alpha" - android:valueType="floatType" - android:duration="@android:integer/config_mediumAnimTime" - android:interpolator="@android:interpolator/decelerate_quad" /> diff --git a/packages/DocumentsUI/res/animator/fade_out.xml b/packages/DocumentsUI/res/animator/fade_out.xml deleted file mode 100644 index 8d02c77fc345..000000000000 --- a/packages/DocumentsUI/res/animator/fade_out.xml +++ /dev/null @@ -1,22 +0,0 @@ -<!-- Copyright (C) 2013 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. ---> - -<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" - android:valueFrom="1f" - android:valueTo="0f" - android:propertyName="alpha" - android:valueType="floatType" - android:duration="@android:integer/config_mediumAnimTime" - android:interpolator="@android:interpolator/decelerate_quad" /> diff --git a/packages/DocumentsUI/res/color/item_details.xml b/packages/DocumentsUI/res/color/item_details.xml deleted file mode 100644 index ac21fe348594..000000000000 --- a/packages/DocumentsUI/res/color/item_details.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item - android:state_enabled="true" - android:color="?android:attr/textColorPrimary" - android:alpha="0.54" /> -</selector> diff --git a/packages/DocumentsUI/res/color/item_doc_grid_border.xml b/packages/DocumentsUI/res/color/item_doc_grid_border.xml deleted file mode 100644 index e144af8a2c4a..000000000000 --- a/packages/DocumentsUI/res/color/item_doc_grid_border.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item - android:state_focused="true" - android:color="?android:attr/colorAccent"/> - <item - android:color="@android:color/transparent" /> -</selector> diff --git a/packages/DocumentsUI/res/color/item_doc_list_background_activated.xml b/packages/DocumentsUI/res/color/item_doc_list_background_activated.xml deleted file mode 100644 index 7d7a110864d9..000000000000 --- a/packages/DocumentsUI/res/color/item_doc_list_background_activated.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item - android:state_activated="true" - android:color="?android:attr/colorAccent" - android:alpha="0.1" /> - <item - android:color="@android:color/transparent" /> -</selector> diff --git a/packages/DocumentsUI/res/color/item_eject_icon.xml b/packages/DocumentsUI/res/color/item_eject_icon.xml deleted file mode 100644 index 15e7e8e60990..000000000000 --- a/packages/DocumentsUI/res/color/item_eject_icon.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_enabled="false" android:alpha="@*android:dimen/disabled_alpha_material_light" android:color="@*android:color/primary_text_default_material_light" /> - <item android:color="@*android:color/primary_text_default_material_light" /> -</selector> diff --git a/packages/DocumentsUI/res/color/item_root_icon.xml b/packages/DocumentsUI/res/color/item_root_icon.xml deleted file mode 100644 index e1d7e61941ab..000000000000 --- a/packages/DocumentsUI/res/color/item_root_icon.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2014 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. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item - android:state_activated="false" - android:color="@*android:color/secondary_text_material_light" /> - <item - android:state_activated="true" - android:color="@color/root_activated_color" /> -</selector> diff --git a/packages/DocumentsUI/res/color/item_root_primary_text.xml b/packages/DocumentsUI/res/color/item_root_primary_text.xml deleted file mode 100644 index a5a65b2a0339..000000000000 --- a/packages/DocumentsUI/res/color/item_root_primary_text.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2014 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. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_focused="true" android:state_activated="true" android:color="@color/root_activated_color" /> - <item android:state_focused="false" android:state_activated="true" android:color="@color/root_activated_color" /> - <item android:state_enabled="false" android:alpha="@*android:dimen/disabled_alpha_material_light" android:color="@*android:color/primary_text_default_material_light" /> - <item android:color="@*android:color/primary_text_default_material_light" /> -</selector> diff --git a/packages/DocumentsUI/res/color/item_title.xml b/packages/DocumentsUI/res/color/item_title.xml deleted file mode 100644 index 9fff2f1bc0d5..000000000000 --- a/packages/DocumentsUI/res/color/item_title.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item - android:state_enabled="true" - android:color="?android:attr/textColorPrimary" - android:alpha="0.87" /> - <item - android:state_enabled="false" - android:color="?android:attr/textColorPrimary" - android:alpha="0.54" /> -</selector> diff --git a/packages/DocumentsUI/res/color/root_activated.xml b/packages/DocumentsUI/res/color/root_activated.xml deleted file mode 100644 index 36a016d15133..000000000000 --- a/packages/DocumentsUI/res/color/root_activated.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_activated="true" android:color="?android:attr/colorAccent" /> - <item android:color="@*android:color/secondary_text_material_light" /> -</selector> diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differdeleted file mode 100644 index 67f890c2d7a5..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel_alpha.png Binary files differdeleted file mode 100644 index 1a9cd75a0d26..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_alpha.png Binary files differdeleted file mode 100644 index 4c3d9a497b64..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_alpha.png Binary files differdeleted file mode 100644 index da5607763654..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_folder_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_folder_alpha.png Binary files differdeleted file mode 100644 index 874fde798acc..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_hamburger_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_hamburger_alpha.png Binary files differdeleted file mode 100644 index 3f8ebd62bd1e..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_hamburger_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy_alpha.png Binary files differdeleted file mode 100644 index 9a9e5706fe8d..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete_alpha.png Binary files differdeleted file mode 100644 index dbbb602a0bb2..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am_alpha.png Binary files differdeleted file mode 100644 index 1d25a2d1f61c..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_alpha.png Binary files differdeleted file mode 100644 index c593e7ad854f..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share_alpha.png Binary files differdeleted file mode 100644 index 20ba48063e8e..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am_alpha.png Binary files differdeleted file mode 100644 index 5e664880452e..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid_alpha.png Binary files differdeleted file mode 100644 index 7e15a8c366a9..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list_alpha.png Binary files differdeleted file mode 100644 index c15537a863e3..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_alpha.png Binary files differdeleted file mode 100644 index d9aacea4c67e..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_alpha.png Binary files differdeleted file mode 100644 index 9e003f0e93f4..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differdeleted file mode 100644 index 9a048f14d1af..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel_alpha.png Binary files differdeleted file mode 100644 index 40a1a84e34f4..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_alpha.png Binary files differdeleted file mode 100644 index e768d1125c90..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_alpha.png Binary files differdeleted file mode 100644 index 5ef3dc0809e2..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_folder_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_folder_alpha.png Binary files differdeleted file mode 100644 index 44e0e376e37b..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_hamburger_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_hamburger_alpha.png Binary files differdeleted file mode 100644 index ef2a48c7ab61..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_hamburger_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy_alpha.png Binary files differdeleted file mode 100644 index c94cc28f136e..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete_alpha.png Binary files differdeleted file mode 100644 index 999aa4ccc3f8..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am_alpha.png Binary files differdeleted file mode 100644 index 6e6b8705ead1..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_alpha.png Binary files differdeleted file mode 100644 index 6b16343235c2..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share_alpha.png Binary files differdeleted file mode 100644 index f02d360aa290..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am_alpha.png Binary files differdeleted file mode 100644 index 04a12a439dec..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid_alpha.png Binary files differdeleted file mode 100644 index 5f968d5537cf..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list_alpha.png Binary files differdeleted file mode 100644 index 7a8eae9b530f..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_alpha.png Binary files differdeleted file mode 100644 index c2c845e8494b..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_alpha.png Binary files differdeleted file mode 100644 index f500d58ea429..000000000000 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differdeleted file mode 100644 index 073583e0a70a..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel_alpha.png Binary files differdeleted file mode 100644 index 6bc437298ab7..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_alpha.png Binary files differdeleted file mode 100644 index 2ea616491ae8..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_alpha.png Binary files differdeleted file mode 100644 index 46ed12a89bd7..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_folder_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_folder_alpha.png Binary files differdeleted file mode 100644 index 1a4e7c4d5a52..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_hamburger_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_hamburger_alpha.png Binary files differdeleted file mode 100644 index 4e0286b756a8..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_hamburger_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy_alpha.png Binary files differdeleted file mode 100644 index 1cf76a960302..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete_alpha.png Binary files differdeleted file mode 100644 index 796ccd22559a..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am_alpha.png Binary files differdeleted file mode 100644 index 49272b0f9486..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_alpha.png Binary files differdeleted file mode 100644 index 638190268616..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share_alpha.png Binary files differdeleted file mode 100644 index 81c80b700732..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am_alpha.png Binary files differdeleted file mode 100644 index 9e4fd61dd5cf..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid_alpha.png Binary files differdeleted file mode 100644 index 630188c07aab..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list_alpha.png Binary files differdeleted file mode 100644 index 73372f485447..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_alpha.png Binary files differdeleted file mode 100644 index f5afb24dc572..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_alpha.png Binary files differdeleted file mode 100644 index fe71c2591451..000000000000 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differdeleted file mode 100644 index b96cfd1ec840..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel_alpha.png Binary files differdeleted file mode 100644 index 51b4401ca053..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_alpha.png Binary files differdeleted file mode 100644 index ed36f700acb6..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_alpha.png Binary files differdeleted file mode 100644 index a81eeb9ee7ef..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_folder_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_folder_alpha.png Binary files differdeleted file mode 100644 index d7b2bfb3ea29..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_hamburger_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_hamburger_alpha.png Binary files differdeleted file mode 100644 index 7dae60b4e3b1..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_hamburger_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy_alpha.png Binary files differdeleted file mode 100644 index 074ea8807923..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete_alpha.png Binary files differdeleted file mode 100644 index 6d7cb81c566f..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am_alpha.png Binary files differdeleted file mode 100644 index 5c4360af8a40..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_alpha.png Binary files differdeleted file mode 100644 index 3ae490ef9be0..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share_alpha.png Binary files differdeleted file mode 100644 index 784933ad55a0..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am_alpha.png Binary files differdeleted file mode 100644 index cb9d1965823e..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid_alpha.png Binary files differdeleted file mode 100644 index 7560f6249cb6..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list_alpha.png Binary files differdeleted file mode 100644 index b9483c38bc7a..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_alpha.png Binary files differdeleted file mode 100644 index ce97c85dfa35..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_alpha.png Binary files differdeleted file mode 100644 index 1dad2a853f16..000000000000 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_breadcrumb_arrow_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_breadcrumb_arrow_am_alpha.png Binary files differdeleted file mode 100644 index 6f2dc5b810d2..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_breadcrumb_arrow_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_cancel_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_cancel_alpha.png Binary files differdeleted file mode 100644 index df42feecb812..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_cab_cancel_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_alert_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_alert_alpha.png Binary files differdeleted file mode 100644 index 3f4d539a41bc..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_alert_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_info_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_info_alpha.png Binary files differdeleted file mode 100644 index c8f86b925366..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_dialog_info_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_grid_folder_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_grid_folder_alpha.png Binary files differdeleted file mode 100644 index ca6be0e91437..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_grid_folder_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_hamburger_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_hamburger_alpha.png Binary files differdeleted file mode 100644 index 5c747ed00e39..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_hamburger_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_copy_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_copy_alpha.png Binary files differdeleted file mode 100644 index 1f6af72d0576..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_copy_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_delete_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_delete_alpha.png Binary files differdeleted file mode 100644 index f2b75c31107d..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_delete_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_new_folder_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_new_folder_am_alpha.png Binary files differdeleted file mode 100644 index 073d853323d0..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_new_folder_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_search_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_search_alpha.png Binary files differdeleted file mode 100644 index 21be572990b5..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_search_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_share_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_share_alpha.png Binary files differdeleted file mode 100644 index 5a8544ce5d6c..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_share_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_sortby_am_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_sortby_am_alpha.png Binary files differdeleted file mode 100644 index 631663aac476..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_sortby_am_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_grid_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_grid_alpha.png Binary files differdeleted file mode 100644 index 5d1e8d936d54..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_grid_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_list_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_list_alpha.png Binary files differdeleted file mode 100644 index 7c1506bb8976..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_menu_view_list_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_download_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_download_alpha.png Binary files differdeleted file mode 100644 index 8c83bffa7e44..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_download_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_recent_alpha.png b/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_recent_alpha.png Binary files differdeleted file mode 100644 index 68df97405d06..000000000000 --- a/packages/DocumentsUI/res/drawable-xxxhdpi/ic_root_recent_alpha.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable/band_select_overlay.xml b/packages/DocumentsUI/res/drawable/band_select_overlay.xml deleted file mode 100644 index ba4d5261e581..000000000000 --- a/packages/DocumentsUI/res/drawable/band_select_overlay.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ 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 - --> - -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <solid android:color="@color/band_select_background" /> - <stroke android:width="1dp" android:color="@color/band_select_border" /> -</shape> diff --git a/packages/DocumentsUI/res/drawable/breadcrumb_item_background.xml b/packages/DocumentsUI/res/drawable/breadcrumb_item_background.xml deleted file mode 100644 index c4bc77b3bb40..000000000000 --- a/packages/DocumentsUI/res/drawable/breadcrumb_item_background.xml +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<ripple - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res/com.android.documentsui" - android:color="?attr/colorControlHighlight"> - <item - android:id="@android:id/mask" - android:drawable="@android:color/white"/> - - <item> - <selector> - <item - app:state_highlighted="true" - android:drawable="@color/item_breadcrumb_background_hovered"/> - <item - app:state_highlighted="false" - android:drawable="@android:color/transparent"> - <corners - android:topLeftRadius="2dp" - android:topRightRadius="2dp" - android:bottomLeftRadius="2dp" - android:bottomRightRadius="2dp" - /> - </item> - </selector> - </item> -</ripple>
\ No newline at end of file diff --git a/packages/DocumentsUI/res/drawable/cabinet.xml b/packages/DocumentsUI/res/drawable/cabinet.xml deleted file mode 100644 index 843ffc74e593..000000000000 --- a/packages/DocumentsUI/res/drawable/cabinet.xml +++ /dev/null @@ -1,81 +0,0 @@ -<!-- -Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="672dp" - android:height="921dp" - android:viewportWidth="672.0" - android:viewportHeight="921.0"> - <path - android:pathData="M286,0c5,0,10,0,15,0c0.1,1.8,1.5,1.8,2.8,2.1c11.1,2,22.1,4,33.2,6.1c31.8,6.1,63.7,12.3,95.5,18.5 c16.1,3.1,32.1,6.2,48.2,9.3c26,4.9,52.1,9.3,78,14.6c10.8,2.2,21.6,4.6,32.3,6.5c11.3,2,22.6,4.7,34,6c7.9,0.9,7.9,1.1,7.9,9.2 c0,237.3,0,474.5,0,711.8c-1.5,0.9,-3,2,-4.6,2.8c-18.3,8.3,-36.6,16.6,-54.8,25c-29.3,13.4,-58.5,26.8,-87.8,40.3 c-23.5,10.9,-47,21.8,-70.4,32.8c-2.1,1,-4.2,1.5,-6.3,1.1c-6.8,-1.3,-13.6,-2.5,-20.1,-4.9c5.9,-0.3,11.4,1.9,17.1,2.9c5.9,1.1,5.9,1,5.9,-4.9 c0,-17.1,0.1,-34.3,0,-51.4c-0.3,-68.9,-0.7,-137.8,-1,-206.7c0,-35.8,0,-71.6,0.1,-107.4c0,-3.8,-0.6,-5.2,-4.7,-3.7c-7.9,2.9,-16,5.4,-24.1,7.8 c-14.1,4.3,-27.8,10,-42.2,13.2c0,-64,0,-127.9,-0.1,-191.9c0,-4.1,1.3,-5.9,5.1,-7c21,-6.6,42,-13.4,63,-20.2c2.3,-0.8,4.4,-1.8,4,-4.9 c0,-59.3,0,-118.7,0,-178c0,-1.3,-0.7,-2,-2,-2c-2.6,-0.4,-5.2,-0.7,-7.8,-1.2c-30.2,-5.3,-60.5,-10.6,-90.7,-16c-31.9,-5.6,-63.7,-11.3,-95.6,-16.9 c-24.9,-4.4,-49.8,-8.7,-74.6,-13.1C117.1,75.6,93.1,71.3,69,67c-0.3,-0.3,-0.7,-0.7,-1,-1c17.4,-5.3,34.8,-10.7,52.3,-15.9 c29.4,-8.7,58.8,-17.2,88.2,-25.8c24.3,-7.1,48.6,-14.2,72.9,-21.4C283.1,2.4,285.6,2.7,286,0z" - android:fillColor="#EFEFEE"/> - <path - android:pathData="M412,307c0.4,3,-1.7,4.1,-4,4.9c-21,6.8,-42,13.6,-63,20.2c-3.8,1.2,-5.1,3,-5.1,7C340,403.1,340,467,340,531 c-11.8,-1.2,-23.3,-4.5,-34.9,-6.5c-10,-1.7,-19.9,-4.6,-30.1,-5.5c-0.7,-0.3,-1.4,-0.9,-2.2,-1c-19.8,-4,-39.5,-8,-59.3,-12c-12.2,-2.4,-24.3,-4.7,-36.5,-7 c-0.9,-0.3,-1.8,-0.8,-2.8,-1c-24.5,-4.9,-48.9,-9.9,-73.5,-14.6C89.3,481.3,78,477.1,66,478c-0.7,-1.6,-2.1,-1.8,-3.6,-2.1 c-11.1,-2.2,-22.2,-4.7,-33.3,-6.7c-9.7,-1.7,-19.1,-4.9,-29.1,-5.3c0,-64.3,0,-128.7,0,-193c0.8,-0.2,1.6,-0.4,2.4,-0.7c19,-7.8,37.9,-15.9,57.1,-23.4 c5.4,-2.1,6.7,-4.8,6.6,-10.2c-0.2,-55.1,-0.1,-110.2,-0.1,-165.4c0,-1.9,-1.4,-4.6,1.9,-5.4c0.3,0.3,0.7,0.7,1,1c-1.3,4.9,-1,9.9,-1,14.9 c0,51.1,0,102.3,0,153.4c0,1.2,0,2.3,0,3.5c0.1,3.5,1.2,5.9,5.3,6.5c7,1.1,14,2.6,21,3.9c22.1,4.3,44.1,8.6,66.2,12.8 c27.3,5.2,54.6,10.1,81.9,15.3c21.8,4.1,43.5,8.5,65.2,12.6c28.1,5.4,56.2,10.8,84.3,15.8C398.4,306.8,405.1,310.5,412,307z M105,329c0,3.3,0,6.7,-0.1,10c-0.1,2.5,0.4,3.6,3.4,4.2c30,5.3,59.9,10.9,89.8,16.5c3.4,0.6,5.1,0.2,4.9,-3.7 c-0.2,-3.3,-0.1,-6.7,-0.1,-10c0.5,-3.6,-0.1,-6.3,-4.7,-6.1c-1.1,0.1,-2.2,-0.6,-3.4,-0.8c-28.3,-5,-56.6,-9.9,-84.9,-14.9 C105.6,323.4,104.5,325.2,105,329z M65.9,280.8c13.7,2.5,27.4,4.9,41.1,7.4c32.6,5.9,65.2,11.8,97.8,17.8 c41.4,7.6,82.8,15.2,124.2,22.8c6.8,1.2,13.3,1.4,20,-1.3c9.3,-3.6,18.9,-6.3,28.4,-9.4c6.4,-2.1,12.8,-4.2,19.2,-6.4 c-4.2,-2,-8.3,-3,-12.4,-3.8c-22.6,-4.2,-45.3,-8,-67.9,-12.6c-14.6,-3,-29.2,-5.6,-43.8,-8.5c-24,-4.6,-48,-9.2,-72,-13.7c-15.9,-3,-31.8,-6.2,-47.8,-9.2 c-19,-3.6,-38,-7.3,-57,-10.6c-9.9,-1.7,-19.6,-4.5,-29.7,-5.2C48,255.6,30.1,263,12.2,270.4c0,0.4,0,0.7,0,1.1 C30.1,274.6,48,277.7,65.9,280.8z" - android:fillColor="#EAEAEA"/> - <path - android:pathData="M672,782c-6,0.9,-11.1,4.3,-16.4,6.9c-30.8,15,-61.5,30.3,-92.3,45.4c-34.8,17.1,-69.5,34.3,-104.5,51.1 c-13,6.3,-26,12.8,-39,19.1c-1.5,0.7,-3.7,1,-3.9,3.4c-3.7,0,-7.3,0,-11,0c-0.4,-3,-3.1,-2.3,-4.7,-2.7c-19.3,-4.8,-38.6,-9.5,-57.9,-14.1 c-27.5,-6.5,-55.2,-12.7,-82.6,-19.4c-30.9,-7.5,-61.8,-15,-92.7,-22.1c-24.8,-5.8,-49.5,-12,-74.3,-18C70.8,826.5,48.9,821.3,27,816 c-1.1,-0.3,-2.3,-0.5,-3.3,-1c-3.2,-1.3,-3.5,-3.3,-0.7,-5.4c0.9,-0.7,2,-1.2,3.1,-1.7c12,-5.3,24,-10.7,36,-16c0.4,-0.2,0.9,-0.2,1.9,-0.3 c0,3.6,0,7,0,10.5c0,1.6,-0.5,3.5,2,3.9c0.7,2.8,3.2,2.5,5.2,3c39.3,9,78.7,18.1,118.1,27c43.9,10,87.7,20,131.6,29.9 c9.7,2.2,19.2,4.9,29.1,6c1.1,1.5,2.6,0.9,4,1l0,0c4.1,2,8.5,2.6,13,3l0,0c7.2,2.4,14.4,4.3,22,5l0,0c6.5,2.5,13.3,3.6,20.1,4.9 c2.1,0.4,4.2,-0.1,6.3,-1.1c23.5,-11,46.9,-21.9,70.4,-32.8c29.2,-13.5,58.5,-26.9,87.8,-40.3c18.3,-8.4,36.6,-16.6,54.8,-25 c1.6,-0.7,3.1,-1.9,4.6,-2.8c2,-2.9,1.1,-6.2,0.9,-9.2c-0.3,-4.7,1.9,-5.5,5.7,-4.7c10.8,2.2,21.6,4.6,32.5,6.9C672,778.7,672,780.3,672,782z " - android:fillColor="#E6E4E4"/> - <path - android:pathData="M350,872c-9.9,-1.1,-19.4,-3.9,-29.1,-6C277,856,233.1,846,189.2,836c-39.4,-9,-78.7,-18,-118.1,-27 c-2,-0.4,-4.5,-0.2,-5.2,-3c0,-85.7,0,-171.4,0.1,-257.1c6.5,0.1,12.7,2.3,19,3.6c26.4,5.4,52.8,10.9,79.2,16.5c25.9,5.4,51.8,11,77.7,16.4 c26.2,5.5,52.5,11,78.7,16.5c30.1,6.3,60.2,12.6,90.3,19c0.3,68.9,0.7,137.8,1,206.7c0.1,17.1,0,34.3,0,51.4c0,5.9,0,6,-5.9,4.9 c-5.7,-1.1,-11.2,-3.2,-17.1,-2.9c0,0,0,0,0,0c-7,-3.1,-14.2,-5.4,-22,-5c0,0,0,0,0,0c-3.9,-2.9,-8.4,-2.9,-13,-3c0,0,0,0,0,0 C352.9,871.5,351.4,872.1,350,872z M177,687c0,3.2,0.1,6.3,0,9.5c-0.1,2.7,0.7,4,3.8,4.6c29.7,5.8,59.3,11.7,89,17.7 c2.4,0.5,4.7,0.1,4.9,-2.6c0.4,-3.7,1.2,-7.6,-0.6,-11.2c1,-3,1.2,-5.3,-3,-6c-29.6,-5.4,-59.2,-10.8,-88.7,-16.5C177.7,681.6,176.5,682.8,177,687 z" - android:fillColor="#E5E5E5"/> - <path - android:pathData="M411,621c-30.1,-6.3,-60.2,-12.6,-90.3,-19c-26.2,-5.5,-52.5,-11,-78.7,-16.5c-25.9,-5.5,-51.8,-11,-77.7,-16.4 c-26.4,-5.5,-52.8,-11.1,-79.2,-16.5c-6.3,-1.3,-12.5,-3.5,-19,-3.6c0,-23.6,0,-47.3,0,-70.9c12,-0.9,23.2,3.3,34.7,5.5c24.5,4.6,49,9.7,73.5,14.6 c1,0.2,1.9,0.6,2.8,1c0,3.3,0.7,6.7,0.7,9.9c0,5.6,2.4,7.5,7.5,8.4c15.3,2.7,30.5,5.8,45.8,8.7c12,2.3,24,4.4,36.1,6.6 c1.9,0.3,4.8,1.5,4.7,-1.4c-0.2,-4.6,1.7,-8.2,3.3,-12.1c10.2,0.9,20,3.8,30.1,5.5c11.7,2,23.1,5.3,34.9,6.5 c14.5,-3.2,28.1,-8.9,42.2,-13.2c8.1,-2.5,16.2,-5,24.1,-7.8c4.1,-1.5,4.8,-0.1,4.7,3.7C411,549.4,411,585.2,411,621z" - android:fillColor="#D9D9D9"/> - <path - android:pathData="M412,307c-6.9,3.5,-13.6,-0.2,-20.1,-1.3c-28.2,-5,-56.2,-10.4,-84.3,-15.8c-21.8,-4.1,-43.5,-8.5,-65.2,-12.6 c-27.3,-5.2,-54.6,-10.1,-81.9,-15.3c-22.1,-4.2,-44.1,-8.5,-66.2,-12.8c-7,-1.3,-13.9,-2.9,-21,-3.9c-4.1,-0.6,-5.2,-3,-5.3,-6.5c0,-1.2,0,-2.3,0,-3.5 c0,-51.1,0,-102.3,0,-153.4c0,-5,-0.3,-10,1,-14.9c24.1,4.3,48.1,8.6,72.2,12.8c24.9,4.4,49.8,8.7,74.6,13.1c31.9,5.6,63.7,11.3,95.6,16.9 c30.2,5.3,60.5,10.6,90.7,16c2.6,0.5,5.2,0.8,7.8,1.2c0,1.3,0.7,2,2,2C412,188.3,412,247.7,412,307z M409,217.4c0,-25.5,0,-51,0,-76.5 c0,-10.9,0.1,-11.2,-10.7,-13.2c-23.4,-4.4,-46.8,-8.5,-70.3,-12.6c-24.1,-4.3,-48.2,-8.4,-72.3,-12.6c-17.7,-3.1,-35.5,-6.3,-53.2,-9.4 c-22.1,-3.9,-44.3,-7.6,-66.4,-11.5c-20,-3.5,-40,-7.1,-60.1,-10.5c-6,-1,-6.1,-0.8,-6.1,5.6c0,53,0,105.9,0,158.9c0,1,0,2,0,3 c0.2,2.6,1,4.1,4,4.6c10.1,1.7,20.1,3.9,30.2,5.8c27.3,5.1,54.6,10.1,81.9,15.2c22.1,4.2,44.1,8.6,66.2,12.8 c27.3,5.2,54.6,10.2,81.9,15.3c22.7,4.3,45.5,8.6,68.2,12.8c6.5,1.2,6.5,1.1,6.5,-5.7C409,272,409,244.7,409,217.4z" - android:fillColor="#E8E8E8"/> - <path - android:pathData="M412,129c-1.3,0,-2,-0.7,-2,-2C411.3,127,412,127.7,412,129z" - android:fillColor="#EAEAEA"/> - <path - android:pathData="M65.8,248.3c10.1,0.7,19.8,3.5,29.7,5.2c19,3.3,38,7,57,10.6c15.9,3,31.8,6.2,47.8,9.2 c24,4.6,48,9.1,72,13.7c14.6,2.8,29.3,5.5,43.8,8.5c22.5,4.6,45.3,8.4,67.9,12.6c4.1,0.8,8.2,1.8,12.4,3.8 c-6.4,2.1,-12.8,4.3,-19.2,6.4c-9.5,3.1,-19.1,5.8,-28.4,9.4c-6.7,2.6,-13.3,2.5,-20,1.3c-41.4,-7.6,-82.8,-15.2,-124.2,-22.8 c-32.6,-6,-65.2,-11.9,-97.8,-17.8c-13.7,-2.5,-27.4,-4.9,-41.1,-7.4C65.9,270,65.9,259.1,65.8,248.3z" - android:fillColor="#E6A3A3"/> - <path - android:pathData="M275,519c-1.5,3.9,-3.5,7.5,-3.3,12.1c0.1,2.9,-2.8,1.7,-4.7,1.4c-12,-2.2,-24.1,-4.3,-36.1,-6.6 c-15.3,-2.9,-30.5,-6,-45.8,-8.7c-5.1,-0.9,-7.5,-2.8,-7.5,-8.4c0,-3.2,-0.8,-6.5,-0.7,-9.9c12.2,2.3,24.4,4.6,36.5,7c19.8,3.9,39.5,8,59.3,12 C273.6,518.2,274.3,518.7,275,519z" - android:fillColor="#CBCBCA"/> - <path - android:pathData="M202.9,345.9c0,3.3,-0.1,6.7,0.1,10c0.2,3.9,-1.4,4.3,-4.9,3.7c-29.9,-5.6,-59.8,-11.2,-89.8,-16.5 c-3,-0.5,-3.5,-1.7,-3.4,-4.2c0.1,-3.3,0.1,-6.7,0.1,-10c21.7,3.9,43.4,7.9,65.2,11.6C181.1,342.4,191.8,345.3,202.9,345.9z" - android:fillColor="#CFCFCE"/> - <path - android:pathData="M65.8,248.3c0,10.9,0,21.7,0,32.6c-17.9,-3.1,-35.8,-6.2,-53.7,-9.3c0,-0.4,0,-0.7,0,-1.1 C30.1,263,48,255.6,65.8,248.3z" - android:fillColor="#E57474"/> - <path - android:pathData="M202.9,345.9c-11.1,-0.6,-21.8,-3.5,-32.6,-5.4c-21.8,-3.7,-43.5,-7.7,-65.2,-11.6c-0.6,-3.8,0.6,-5.6,4.8,-4.8 c28.3,5,56.6,9.9,84.9,14.9c1.1,0.2,2.3,0.8,3.4,0.8C202.8,339.6,203.4,342.3,202.9,345.9z" - android:fillColor="#BDBDBD"/> - <path - android:pathData="M367,876c7.8,-0.4,15,1.9,22,5C381.4,880.3,374.2,878.4,367,876z" - android:fillColor="#EFEFEE"/> - <path - android:pathData="M354,873c4.5,0.1,9.1,0.1,13,3C362.5,875.6,358.1,875,354,873z" - android:fillColor="#EFEFEE"/> - <path - android:pathData="M350,872c1.4,0.1,3,-0.5,4,1C352.6,872.9,351,873.5,350,872z" - android:fillColor="#EFEFEE"/> - <path - android:pathData="M274.1,705c1.9,3.6,1,7.5,0.6,11.2c-0.3,2.8,-2.5,3.1,-4.9,2.6c-29.7,-5.9,-59.3,-11.9,-89,-17.7 c-3.1,-0.6,-3.9,-1.9,-3.8,-4.6c0.1,-3.2,0,-6.3,0,-9.5c1.2,0,2.4,-0.1,3.5,0.1c19.2,3.8,38.4,7.7,57.6,11.4 C250.1,700.8,261.9,703.8,274.1,705z" - android:fillColor="#D6D6D5"/> - <path - android:pathData="M274.1,705c-12.1,-1.2,-24,-4.2,-35.9,-6.5c-19.2,-3.7,-38.4,-7.6,-57.6,-11.4c-1.1,-0.2,-2.3,-0.1,-3.5,-0.1 c-0.5,-4.2,0.7,-5.4,5.3,-4.5c29.5,5.7,59.1,11.1,88.7,16.5C275.3,699.7,275.1,702,274.1,705z" - android:fillColor="#C9C9C8"/> - <path - android:pathData="M409,217.4c0,27.3,0,54.6,0,82c0,6.8,0,6.9,-6.5,5.7c-22.7,-4.2,-45.5,-8.6,-68.2,-12.8 c-27.3,-5.1,-54.6,-10.1,-81.9,-15.3c-22.1,-4.2,-44.1,-8.6,-66.2,-12.8c-27.3,-5.2,-54.6,-10.1,-81.9,-15.2c-10.1,-1.9,-20.1,-4.1,-30.2,-5.8 c-3,-0.5,-3.9,-2.1,-4,-4.6c-0.1,-1,0,-2,0,-3c0,-53,0,-105.9,0,-158.9c0,-6.4,0,-6.6,6.1,-5.6c20,3.4,40,7,60.1,10.5c22.1,3.9,44.3,7.6,66.4,11.5 c17.7,3.1,35.5,6.3,53.2,9.4c24.1,4.2,48.2,8.4,72.3,12.6c23.4,4.1,46.9,8.2,70.3,12.6c10.8,2,10.7,2.3,10.7,13.2 C409,166.4,409,191.9,409,217.4z M283.9,146.9c0.4,-3.2,-0.2,-5.3,-4,-6c-29.7,-5,-59.4,-9.9,-89,-15.3c-4.8,-0.9,-5.2,0.7,-4.8,4.4 c0,3.5,-0.1,7,0,10.5c0,1.3,-0.4,3.2,1.4,3.3c2.9,0.1,5.3,1.8,8.1,2.3c13.8,2.4,27.6,4.9,41.4,7.4c13.3,2.4,26.5,5.1,39.8,7.4 c6.6,1.2,7.3,0.4,7.3,-6.5C284,151.9,283.9,149.4,283.9,146.9z" - android:fillColor="#E8E7E7"/> - <path - android:pathData="M283.9,146.9c0,2.5,0.1,5,0.1,7.5c0,6.9,-0.7,7.7,-7.3,6.5c-13.3,-2.4,-26.5,-5,-39.8,-7.4 c-13.8,-2.5,-27.6,-5.1,-41.4,-7.4c-2.8,-0.5,-5.2,-2.2,-8.1,-2.3c-1.8,-0.1,-1.4,-2,-1.4,-3.3c0,-3.5,0,-7,0,-10.5c1.9,0.3,3.9,0.7,5.8,1 c21.6,4,43.1,8.1,64.7,11.8C265.6,144.4,274.5,147.1,283.9,146.9z" - android:fillColor="#CFCFCE"/> - <path - android:pathData="M283.9,146.9c-9.3,0.2,-18.3,-2.5,-27.3,-4.1c-21.6,-3.7,-43.1,-7.8,-64.7,-11.8c-1.9,-0.4,-3.9,-0.7,-5.8,-1 c-0.4,-3.6,-0.1,-5.2,4.8,-4.4c29.6,5.4,59.3,10.4,89,15.3C283.7,141.6,284.3,143.7,283.9,146.9z" - android:fillColor="#BDBDBD"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/drag_shadow_background.xml b/packages/DocumentsUI/res/drawable/drag_shadow_background.xml deleted file mode 100644 index 49465cbabe3c..000000000000 --- a/packages/DocumentsUI/res/drawable/drag_shadow_background.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <solid android:color="@color/item_doc_background" /> - <stroke - android:width="1dp" - android:color="#ff9f9f9f" /> - <corners - android:bottomRightRadius="3dp" - android:bottomLeftRadius="3dp" - android:topLeftRadius="3dp" - android:topRightRadius="3dp"/> -</shape> diff --git a/packages/DocumentsUI/res/drawable/hourglass.xml b/packages/DocumentsUI/res/drawable/hourglass.xml deleted file mode 100644 index 9b8d0e2946ba..000000000000 --- a/packages/DocumentsUI/res/drawable/hourglass.xml +++ /dev/null @@ -1,168 +0,0 @@ -<!-- -Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="421dp" - android:height="909dp" - android:viewportWidth="421.0" - android:viewportHeight="909.0"> - <path - android:pathData="M36,122.9c-2.8,-2.6,-5.7,-5.1,-8.3,-7.8c-5.6,-6,-9.2,-12.9,-8.8,-21.5c0.3,-7.5,0.6,-15,-0.1,-22.5 c-1.2,-14.1,5.5,-23.9,16,-31.9c16.7,-12.8,36.1,-19.6,56.1,-25.1c23.8,-6.5,48,-10.2,72.5,-12.3C168.6,1.3,174,2.2,179,0 c19.3,0,38.7,0,58,0c6,2.1,12.4,1.3,18.6,1.8c30.2,2.7,59.9,7.6,88.5,17.5c16.5,5.7,32.6,12.6,45.2,25.4c6.5,6.6,10.3,14,9.8,23.6 c-0.4,7.8,-0.5,15.7,0,23.4c0.6,10.3,-3.4,18.4,-10.6,25.2c-2.2,2,-4.4,4,-6.6,6c-3,2,-6.1,4,-9.1,5.9c-9.2,4.5,-18.5,9,-28.2,12.3 c-42.4,14.5,-86.3,18.8,-130.8,19.6c-10.9,0.2,-21.9,-0.4,-32.9,-0.7c-4.6,-0.4,-9.2,-0.8,-13.9,-1.1c-18.9,-1.1,-37.5,-3.9,-56,-7.6 c-15.3,-3.1,-30.2,-7.6,-44.9,-12.6c-7.6,-3.7,-15.3,-7.4,-22.9,-11.1C41.1,125.8,38.6,124.3,36,122.9z M41,72c2.9,6.9,7.1,12.6,13.1,17.2 c13,10,27.9,15.8,43.4,20.6c28.2,8.8,57.2,12.8,86.5,14c31.8,1.2,63.7,0.8,95.3,-4.6c25.3,-4.4,50.1,-10,72.9,-22.2 c10.8,-5.8,20,-13.1,24.7,-24.9c2.3,-11,-2.3,-19.5,-10.2,-26.4c-10.5,-9.2,-23.1,-14.9,-36.2,-19.6C295.2,13.4,258.4,9.7,221.2,8.1 c-11.1,-0.5,-22.2,0,-33.4,0.6c-21.4,1,-42.6,3.1,-63.6,7.3c-22.2,4.5,-44.1,10.3,-63.4,22.6C48.9,46.3,38.4,55.4,41,72z" - android:fillColor="#9F9F9F"/> - <path - android:pathData="M0,829c3.7,-2.8,4.7,-7.6,7.8,-10.9c2.6,-2.8,4.9,-5.7,9.2,-7.6c0,3.4,-0.1,6.5,0,9.5c0,1.5,-0.7,3.5,1.7,4 c0.4,3.3,1.4,6.4,2.9,9.4c3.8,7.7,10,13,16.8,17.9c9.2,6.7,19.7,10.8,29.8,15.5c-0.7,2.4,1.3,0.7,1.8,1.1l0,0c1.5,2.1,3.7,2.2,6,2 l0,0c0.8,0.6,1.5,1.4,2.4,1.7c9.5,2.7,18.9,5.8,28.7,7.4c3.6,0.6,7,3.5,10.9,1.1c2.4,0.4,4.8,0.8,7.1,1.2c0.2,1.5,1.3,1.6,2.5,1.8 c6.6,0.9,13.3,2.4,19.9,2.8c5.1,0.3,10.3,2.9,15.4,0.3c0.4,0,0.8,0.1,1.1,0.1c0.3,2.2,2.1,1.8,3.5,1.8c3.8,0,7.6,0,11.5,0 c1.1,1.4,2.7,1,4.1,1c17.2,0,34.5,0,51.7,0c1.4,0,3,0.4,4.1,-1c3.8,0,7.6,0,11.5,0c1.4,0,3.2,0.4,3.5,-1.8c9.4,-1,18.7,-2.1,28.1,-3.1 c6,1.3,11.6,0.4,16.9,-2.8c21.2,-4.2,42.1,-9.3,61.8,-18.4c15.8,-7.3,30.8,-15.8,38,-33.1c2.4,-2,1.9,-4.8,2.2,-7.4c0.3,-3,0,-6,0.1,-9 c0,-1,-0.3,-2.1,0.7,-2.7c1.1,-0.7,1.7,0.5,2.5,1c7.2,5,12.1,11.7,14.8,20c0.4,1.2,0.6,2.2,2.1,2.3c0,3.3,0,6.7,0,10 c-1.5,0,-1.8,1.1,-2.2,2.2c-3.8,10.2,-11.2,17.5,-20.1,23.3c-20.8,13.6,-44.1,21.2,-68.1,26.7c-29.2,6.7,-58.7,11,-88.7,11.7 c-1.6,0,-3.5,-0.5,-3.9,2c-18.7,0,-37.3,0,-56,0c-0.3,-2.5,-2.3,-1.9,-3.9,-2c-5.6,-0.1,-11.2,-0.5,-16.9,-0.8c-18.5,-1.2,-36.8,-3.8,-55,-7.3 C79.9,893.9,54,887,30.2,874C19,867.9,8.5,860.9,2.5,849C2,848,1.4,847,0,847C0,841,0,835,0,829z" - android:fillColor="#E6E4E4"/> - <path - android:pathData="M372.9,128.9c3,-2,6.1,-4,9.1,-5.9c-0.2,2.7,0.2,5.4,1,8c-1.5,1.6,-0.3,1.8,1,2c0.3,1,0.7,2,1,3 c-1.5,1.6,-0.3,1.8,1,2c0.7,2,1.3,4,2,6c-1.5,1.6,-0.3,1.8,1,2c0.3,1.7,0.7,3.3,1,5c-1,2.3,-0.6,4.1,2,5c4.9,23.8,9,47.6,8,72 c-3.5,1.5,-2.1,3.8,-1,6c-1,6,-2,12,-3,18c-1.3,1,-1.3,2,0,3c0,0.7,0,1.3,0,2c-2.1,0.4,-2.6,1.3,-1,3c0,0.3,0,0.7,0,1 c-1.3,0.2,-2.5,0.4,-1,2c0.4,2.1,-0.7,4,-1,6c-1.3,0.2,-2.5,0.4,-1,2c-3.7,9.3,-7.3,18.7,-11,28c-2.7,1.2,-4.2,2.9,-3,6 c-3.4,6.9,-7.8,13.3,-12.2,19.5c-6.1,8.6,-12.4,17.3,-19.4,25.2c-7.3,8.3,-15.5,15.8,-23.9,23c-11.9,10.3,-24.9,19.3,-38.1,27.7 c-12.2,7.8,-25.4,14.1,-38.4,20.5c-12.1,6,-18.5,15.8,-21,28.6c-1.5,7.8,-0.5,15.4,2,22.8c1.2,3.5,3.7,6.1,5.6,9.2 c5.4,8.6,14.8,10.5,22.6,15c15.3,9,30.8,17.7,45.3,28.1c14.4,10.4,28.2,21.5,40.5,34.1c10.1,10.4,18.5,22.2,26.8,34.3 c6.5,9.5,11.3,19.6,16.1,29.8c-1.5,1.6,-0.3,1.8,1,2c0.7,2,1.3,4,2,6c-1,2.3,-0.6,4.1,2,5c0.7,1.2,1.2,2.5,1,4c-1,2.3,-0.6,4.1,2,5 c1.2,12.3,4.6,24.1,5.7,36.5c0.8,8.4,1.4,16.8,1,25.1c-0.3,5.9,-1.1,12,-1.9,18c-1.2,8.7,-2.3,17.4,-4.2,25.9 c-1.5,6.6,-3.7,13.1,-5.6,19.6c-1.8,3.1,-2.9,6.5,-3.9,9.9c-3.4,6.4,-5.6,13.6,-11.9,18.2c-0.1,-3.8,1.6,-7.1,3,-10.4 c8.7,-20.9,13,-42.8,14.7,-65.1c1,-12.9,0.2,-25.8,-1.7,-38.7c-2.7,-18.5,-7.8,-36.2,-15.8,-53.1c-7.3,-15.4,-16.8,-29.3,-27.7,-42.4 c-2.7,-3.2,-6.3,-5.7,-9.6,-8.6c0.4,0.8,0.7,1.4,1,1.9c0.7,1.1,1.5,2.2,2.3,3.3c16.5,21.5,28.5,45.2,34.2,71.7c0.7,3.3,3.1,6.9,0.3,10.4 c-1,-1.9,-2.1,-3.7,-3.1,-5.6c-3.3,-6.3,-6.1,-12.9,-11.7,-17.6c-0.4,-0.9,-0.8,-1.8,-1.3,-2.6c-4,-6.3,-10.4,-10.4,-14.8,-16.2c0,-5.4,-2.7,-9.9,-4.8,-14.5 c-8.4,-18.6,-20.4,-34.9,-32.9,-50.8c-8.4,-10.8,-15.5,-22.8,-28.7,-28.8c-5.3,-2.4,-10,-6,-15.1,-8.6c-5.1,-2.6,-9.9,-6.4,-16.3,-5.2 c-5.2,1,-10.4,2.1,-15.3,4.1c-29.3,11.9,-48.4,34.1,-61.8,61.9c-0.3,0.3,-0.7,0.6,-1,1c-7.1,0.8,-13.9,2.9,-20.7,5.1 c-32.6,10.6,-61,27.4,-82.3,54.9c-9.2,11.6,-15.4,24.7,-18.9,39c-1.5,-1.1,-1.1,-2.7,-1.1,-4.1c-0.1,-9.6,0.3,-19.2,1.8,-28.7 c3.7,-22.6,11.8,-43.5,24,-62.8c12.6,-20,28.6,-36.9,47,-51.7c21.3,-17.3,44.6,-31.3,69.3,-42.9c14.5,-6.8,20,-18.8,21.8,-33.1 c1.8,-13.3,-4.9,-24.1,-12.2,-34.4c-3.6,-5,-7.4,-9.8,-13.2,-12.5c-5.8,-2.8,-11.6,-5.7,-17.4,-8.7c-22,-11.6,-42.6,-25.1,-61.1,-41.7 c-20.7,-18.6,-37.9,-40,-48.8,-65.9c-6.7,-15.7,-10.9,-32.1,-12,-49c-1.8,-27.1,2.1,-53.6,11.7,-79.1c3.8,-10.1,7.1,-20.4,13.3,-29.4 c14.7,5,29.6,9.5,44.9,12.6c18.5,3.7,37.2,6.5,56,7.6c4.6,0.3,9.3,0.7,13.9,1.1c0.2,3.6,-1.5,6.8,-2.6,10 c-11.9,33.6,-17.8,68.2,-17.2,103.8c0.2,9.7,1.3,19.4,2.7,29.1c3.8,24.6,11.4,47.7,26,68.1c12.2,17.1,28.4,28.6,49,33.4 c4.7,1.1,9.5,2.2,14.5,-0.5c18.7,-10.2,36.8,-21.2,53.7,-34.2c15.4,-11.9,29.4,-25.3,41.5,-40.5c12.9,-16.2,23.4,-33.8,30.4,-53.4 c6.4,-17.6,10.3,-35.6,10.9,-54.3c0.5,-15.9,0.2,-31.9,-3,-47.6C383.8,158.7,380.1,143.3,372.9,128.9z" - android:fillColor="#EDECEC"/> - <path - android:pathData="M383,780c1.1,-3.4,2.1,-6.8,3.9,-9.9c7.8,7.1,12.8,15.2,12.2,26.4c-0.6,10.7,-0.3,21.5,-0.5,32.3 c-7.2,17.3,-22.2,25.8,-38,33.1c-19.7,9.1,-40.6,14.1,-61.8,18.4c-5.6,0.9,-11.3,1.9,-16.9,2.8c-9.4,1,-18.7,2.1,-28.1,3.1 c-5,0.3,-9.9,0.7,-14.9,1c-20,1.2,-40,0.9,-60,0c-5,-0.3,-9.9,-0.7,-14.9,-1c-0.4,0,-0.8,-0.1,-1.1,-0.1c-12.6,-1.6,-25.2,-3.2,-37.9,-4.8 c-2.4,-0.4,-4.8,-0.8,-7.1,-1.2c-2.6,-0.6,-5.1,-1.3,-7.7,-1.8c-11.6,-2,-22.6,-6.3,-34.2,-8.4c0,0,0,0,0,0c-1.7,-1.6,-3.7,-2.2,-6,-2c0,0,0,0,0,0 c-0.2,-1,-1.1,-0.9,-1.8,-1.1c-10.2,-4.7,-20.6,-8.8,-29.8,-15.5c-6.8,-4.9,-13,-10.2,-16.8,-17.9c-1.5,-3,-2.4,-6.1,-2.9,-9.4 c0.1,-10.3,0,-20.6,0.2,-30.9c0.1,-8.3,3.5,-15,10,-20.2c2,3.5,3.4,7.1,4.1,11c-1.1,0.8,-1,2,-1.1,3.1c-0.6,8.2,2.9,14.9,8.3,20.6 c8.9,9.6,20.4,15.4,32.3,20.2c17.9,7.2,36.5,11.9,55.4,15.4c20.1,3.7,40.3,5.7,60.6,6.5c21.4,0.8,42.8,0.4,64.2,-1.6 c19.8,-1.9,39.4,-4.6,58.7,-9.3c19.9,-4.8,39.3,-11.2,56.4,-22.9c7.8,-5.3,15.2,-11.3,17.4,-21C386.4,790.1,388.3,784.3,383,780z" - android:fillColor="#9F9F9F"/> - <path - android:pathData="M378,305c-1.2,-3.1,0.3,-4.8,3,-6C380.6,301.3,379.7,303.3,378,305z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M399,234c-1.1,-2.2,-2.5,-4.5,1,-6C399.7,230,400.8,232.2,399,234z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M392,156c-2.6,-0.9,-3,-2.7,-2,-5C391.4,152.4,391.6,154.2,392,156z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M389,636c-2.6,-0.9,-3,-2.7,-2,-5C388.4,632.4,388.6,634.2,389,636z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M392,645c-2.6,-0.9,-3,-2.7,-2,-5C391.4,641.4,391.6,643.2,392,645z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M396,255c-1.3,-1,-1.3,-2,0,-3C397.3,253,397.3,254,396,255z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M395,260c-1.6,-1.7,-1.1,-2.6,1,-3C395.7,258,395.3,259,395,260z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M384,133c-1.3,-0.2,-2.5,-0.4,-1,-2C383.8,131.4,384,132.2,384,133z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M385,625c-1.3,-0.2,-2.5,-0.4,-1,-2C384.8,623.4,385,624.2,385,625z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M392,271c-1.5,-1.6,-0.3,-1.8,1,-2C393,269.8,392.8,270.6,392,271z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M394,263c-1.5,-1.6,-0.3,-1.8,1,-2C395,261.8,394.8,262.6,394,263z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M386,138c-1.3,-0.2,-2.5,-0.4,-1,-2C385.8,136.4,386,137.2,386,138z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M389,146c-1.3,-0.2,-2.5,-0.4,-1,-2C388.8,144.4,389,145.2,389,146z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M33.1,783.9c-0.8,-3.9,-2.2,-7.6,-4.1,-11c-3.7,-11.7,-7.2,-23.5,-9.2,-35.5c-1.3,-7.6,-1.9,-15.4,-2.7,-23.2 c-0.6,-6.2,-0.9,-12.4,-1,-18.5c-0.2,-7.9,1.9,-15.7,2.3,-23.4c0.5,-10.1,2.9,-19.5,5.5,-29c6.3,-23.1,17.3,-43.9,31.5,-62.8 c23.4,-31.1,53.3,-54.7,86.9,-74.1c10.1,-5.8,20.3,-11.6,30.9,-16.2c11.7,-5.2,16.3,-14.9,18.8,-26.3c3.2,-14.9,-2.8,-26.6,-12.7,-37.1 c-1.8,-1.9,-3.9,-3.1,-6.2,-4.2c-23.7,-11.4,-46.4,-24.4,-67.2,-40.7c-16.2,-12.6,-31.3,-26.5,-44.2,-42.6c-16.2,-20.3,-28.8,-42.5,-36.2,-67.5 c-3.1,-10.6,-5.4,-21.3,-6.2,-32.4c-0.7,-9.6,-3.2,-19.3,-2,-28.8c0.8,-6.6,1.5,-13.4,1.9,-20c1,-15.2,4.9,-29.6,9.2,-44c1.7,-5.7,4,-11.3,6.4,-16.8 c0.9,-2.2,1.3,-4.4,1.3,-6.8c2.6,1.4,5.1,2.9,7.2,4.9c-0.6,0.8,-1.4,1.4,-1.8,2.3c-11.2,26.2,-16.2,53.8,-17.4,82.2 c-0.4,8.8,1,17.5,1.9,26.2c2,19.7,7.4,38.4,15.6,56.3c17.9,39.2,46.6,69.1,81.3,93.6c18.5,13.1,38.1,24.3,58.5,34.1 c3.3,1.6,6,3.7,8.1,6.5c8,10.6,12.6,22.1,9.6,35.7c-2.1,9.4,-6.5,17.9,-14.8,22.7c-8.2,4.7,-16.9,8.5,-25.3,12.9 c-22.5,12,-43.8,25.8,-62.6,43c-21.9,19.9,-40.8,42.1,-53.7,69.2C26.3,646.5,20.6,682,24.1,719c1.8,18.7,7,36.7,12.7,54.6 c5.9,18.7,18.2,30.9,35.3,38.9c15.4,7.2,31.5,12.2,48.1,15.8c1.6,0.4,4.3,-0.3,4.8,2.6c-18,-2.8,-35.4,-7.5,-52.3,-14.5 c-12.2,-5.1,-23.4,-11.4,-32.4,-21.4C37.2,791.7,36.5,787,33.1,783.9z" - android:fillColor="#EDECEC"/> - <path - android:pathData="M372.9,128.9c7.2,14.3,10.9,29.8,14.1,45.4c3.2,15.7,3.5,31.6,3,47.6c-0.6,18.7,-4.6,36.7,-10.9,54.3 c-7.1,19.6,-17.6,37.2,-30.4,53.4c-12.1,15.2,-26.1,28.6,-41.5,40.5c-16.9,13,-35,24,-53.7,34.2c-5,2.7,-9.8,1.6,-14.5,0.5 c-20.6,-4.8,-36.8,-16.3,-49,-33.4c-14.6,-20.4,-22.3,-43.5,-26,-68.1c-1.5,-9.7,-2.6,-19.4,-2.7,-29.1c-0.6,-35.6,5.4,-70.2,17.2,-103.8 c1.2,-3.3,2.8,-6.4,2.6,-10c11,0.2,21.9,0.9,32.9,0.7c44.4,-0.8,88.4,-5.2,130.8,-19.6C354.4,137.9,363.7,133.5,372.9,128.9z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M377,72c-4.6,11.9,-13.9,19.1,-24.7,24.9c-22.9,12.2,-47.6,17.9,-72.9,22.2c-31.6,5.4,-63.5,5.9,-95.3,4.6 c-29.3,-1.1,-58.3,-5.1,-86.5,-14C82.1,105,67.2,99.1,54.2,89.2C48.2,84.6,43.9,78.8,41,72c3.9,-1.8,4.6,-6.2,7.3,-9 c10.3,-10.5,22.9,-16.9,36.5,-21.8c19.7,-7.1,40,-11.5,60.7,-14.5c19.4,-2.8,38.9,-3.9,58.4,-4.5c17.9,-0.6,35.8,0.8,53.6,2.8 c15,1.6,29.9,3.5,44.5,7.1c20,4.9,39.7,10.7,57.2,22.1C366.5,58.8,371.5,65.5,377,72z" - android:fillColor="#8D8E8E"/> - <path - android:pathData="M125,831c-0.4,-2.9,-3.2,-2.3,-4.8,-2.6c-16.6,-3.7,-32.7,-8.7,-48.1,-15.8c-17.1,-8,-29.4,-20.2,-35.3,-38.9 c-5.7,-17.9,-10.9,-35.9,-12.7,-54.6c-3.6,-37.1,2.1,-72.5,18.4,-106.4c13,-27.1,31.9,-49.3,53.7,-69.2c18.8,-17.1,40.2,-30.9,62.6,-43 c8.4,-4.5,17.1,-8.2,25.3,-12.9c8.4,-4.8,12.7,-13.3,14.8,-22.7c3.1,-13.6,-1.6,-25.1,-9.6,-35.7c-2.1,-2.8,-4.8,-4.9,-8.1,-6.5 c-20.4,-9.9,-40,-21.1,-58.5,-34.1c-34.7,-24.6,-63.4,-54.5,-81.3,-93.6c-8.2,-17.9,-13.6,-36.6,-15.6,-56.3c-0.9,-8.7,-2.3,-17.5,-1.9,-26.2 c1.2,-28.3,6.2,-55.9,17.4,-82.2c0.4,-0.9,1.2,-1.5,1.8,-2.3c7.6,3.7,15.3,7.4,22.9,11.1c-6.2,9,-9.5,19.3,-13.3,29.4 c-9.6,25.5,-13.5,52,-11.7,79.1c1.1,16.9,5.4,33.3,12,49c11,25.9,28.1,47.4,48.8,65.9c18.5,16.6,39.1,30.2,61.1,41.7 c5.7,3,11.5,5.9,17.4,8.7c5.8,2.8,9.7,7.6,13.2,12.5c7.3,10.3,14,21.1,12.2,34.4c-1.9,14.3,-7.4,26.3,-21.8,33.1 c-24.7,11.6,-48,25.7,-69.3,42.9c-18.3,14.9,-34.3,31.7,-47,51.7c-12.2,19.3,-20.3,40.2,-24,62.8c-1.6,9.6,-2,19.1,-1.8,28.7 c0,1.4,-0.4,3.1,1.1,4.1c-0.6,14.9,0.1,29.8,3,44.5c4.2,21.4,9.1,42.6,26,58.4c-0.2,2.3,0.9,4.1,2.2,5.9c8.8,12.3,22,18.6,35.3,24.1 c26.4,10.9,54.2,16.1,82.4,19.1c1.7,0.2,3,0.4,3,2.4c-4.5,0.7,-9,0.9,-13.4,0.5c-13.2,-1,-26.5,-1.9,-39.6,-4.1c-0.6,-2.4,-1.7,-2.3,-3.1,-0.6 c-1.3,-0.1,-2.6,-0.3,-3.9,-0.4c-0.6,-2.3,-1.6,-2.4,-3.1,-0.7c-0.6,-0.1,-1.3,-0.2,-1.9,-0.3c-0.6,-2.4,-1.7,-2.4,-3.1,-0.6 C126.2,831.2,125.6,831.1,125,831z" - android:fillColor="#E8E8E7"/> - <path - android:pathData="M377,72c-5.4,-6.4,-10.5,-13.2,-17.7,-17.9C341.7,42.7,322.1,36.9,302,32c-14.6,-3.6,-29.5,-5.5,-44.5,-7.1 c-17.8,-1.9,-35.7,-3.3,-53.6,-2.8c-19.5,0.6,-39,1.7,-58.4,4.5c-20.7,3,-41,7.4,-60.7,14.5C71.3,46.1,58.7,52.4,48.4,63 c-2.7,2.8,-3.5,7.2,-7.3,9c-2.6,-16.6,7.9,-25.6,19.8,-33.3c19.3,-12.3,41.2,-18.2,63.4,-22.6c21,-4.2,42.2,-6.3,63.6,-7.3 c11.1,-0.5,22.3,-1,33.4,-0.6c37.2,1.5,74,5.3,109.4,17.9c13.1,4.6,25.6,10.4,36.2,19.6C374.7,52.5,379.3,61,377,72z" - android:fillColor="#808080"/> - <path - android:pathData="M179,887.2c20,0.9,40,1.2,60,0c0,0.3,0,0.5,0,0.8c-1.1,1.4,-2.7,1,-4.1,1c-17.2,0,-34.5,0,-51.7,0 c-1.4,0,-3,0.4,-4.1,-1C179,887.7,179,887.5,179,887.2z" - android:fillColor="#F4F3F2"/> - <path - android:pathData="M76,869.9c11.6,2.2,22.6,6.5,34.2,8.4c2.6,0.4,5.2,1.2,7.7,1.8c-3.9,2.3,-7.3,-0.6,-10.9,-1.1 c-9.8,-1.6,-19.2,-4.7,-28.7,-7.4C77.5,871.3,76.8,870.5,76,869.9z" - android:fillColor="#F4F3F2"/> - <path - android:pathData="M125.1,881.3c12.6,1.6,25.2,3.2,37.9,4.8c-5.2,2.6,-10.3,0,-15.4,-0.3c-6.7,-0.4,-13.3,-1.9,-19.9,-2.8 C126.3,882.9,125.2,882.8,125.1,881.3z" - android:fillColor="#F4F3F2"/> - <path - android:pathData="M282,883.1c5.6,-0.9,11.3,-1.9,16.9,-2.8C293.7,883.4,288.1,884.4,282,883.1z" - android:fillColor="#F4F3F2"/> - <path - android:pathData="M179,887.2c0,0.3,0,0.5,0,0.8c-3.8,0,-7.6,0,-11.5,0c-1.4,0,-3.2,0.4,-3.5,-1.8C169,886.5,174,886.9,179,887.2z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M239,888c0,-0.3,0,-0.5,0,-0.8c5,-0.3,9.9,-0.7,14.9,-1c-0.3,2.2,-2.1,1.8,-3.5,1.8C246.6,888,242.8,888,239,888z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M70,867.9c2.3,-0.2,4.3,0.4,6,2C73.8,870.1,71.6,870,70,867.9z" - android:fillColor="#F4F3F2"/> - <path - android:pathData="M68.2,866.8c0.7,0.2,1.6,0.2,1.8,1.1C69.5,867.4,67.6,869.2,68.2,866.8z" - android:fillColor="#F4F3F2"/> - <path - android:pathData="M165,584c0.3,-0.3,0.7,-0.6,1,-1c10.5,-1.3,21,-3.3,31.5,-3.8c20.8,-1.1,41.4,0.7,61.7,5.4 c30.5,7,57.8,20.3,81.8,40.5c4.4,5.9,10.8,10,14.8,16.2c0.5,0.8,0.9,1.7,1.3,2.6c-2.4,4.1,-4.7,8.1,-7.1,12.2c-4,3.7,-6.3,8.9,-11,12 c-1.6,-0.1,-2.8,0.5,-4.1,1.5c-12.6,9.3,-26.7,15.6,-41.5,20.1c-31,9.4,-62.6,13.3,-95.1,11.6c-12.3,-0.6,-24.5,-1.5,-36.5,-3.4 c-4.5,-0.7,-5.3,0.5,-4.8,4.2c-0.5,0,-1,0.1,-1.5,0c-17.8,-3.9,-34.7,-10.3,-50.9,-18.7c-1,-0.5,-1.6,-1.1,-1.6,-2.3c2.3,-0.3,4.1,1.1,6.1,2 c14.2,6.2,28.9,10.6,44.1,13.3c2.5,0.4,3,0.2,2.4,-2.3c-2.5,-9.3,-3.7,-18.7,-4.8,-28.3c-1.5,-13.7,-0.3,-27.1,1.7,-40.5 C154.6,610.8,159.7,597.4,165,584z" - android:fillColor="#E57474"/> - <path - android:pathData="M103,681c0.1,1.1,0.7,1.8,1.6,2.3c16.2,8.4,33.1,14.8,50.9,18.7c0.5,0.1,1,0,1.5,0c0.6,0.4,1.3,0.7,1.9,1.1 c-0.1,2.7,1,5.2,1.9,7.6c6.5,17.8,16.5,33.6,27.5,48.8c12.5,17.1,27.1,32.1,45.1,43.6c6.6,4.2,13.7,7.3,20.5,11 c-15.6,2.8,-31.4,2.5,-47.1,2.4c-9.9,0,-19.9,-0.2,-29.8,-1.1c-18.2,-1.6,-36.2,-3.9,-54,-8.3c-18.1,-4.4,-35.9,-9.5,-51,-21.1 c-16.9,-15.8,-21.8,-37,-26,-58.4c-2.9,-14.7,-3.6,-29.6,-3,-44.5c3.5,-14.4,9.7,-27.4,18.9,-39c3.4,4.8,6.2,10.1,10.3,14.2 c6,6.1,11.6,13,19.7,16.8c0.5,0.8,1.2,1,2.1,1c0,0,0,0,0,0c0.3,0.3,0.7,0.7,1,1c0,0,0,0,0,0c0.3,0.3,0.7,0.7,1,1l0,0 c1,1.3,2.4,1.8,4,2l0,0C100.7,681.2,101.9,681,103,681L103,681z" - android:fillColor="#E6A3A3"/> - <path - android:pathData="M341,625c-24,-20.1,-51.3,-33.5,-81.8,-40.5c-20.3,-4.7,-41,-6.5,-61.7,-5.4c-10.5,0.6,-21,2.5,-31.5,3.8 c13.4,-27.8,32.5,-49.9,61.8,-61.9c4.9,-2,10.1,-3.1,15.3,-4.1c6.3,-1.2,11.2,2.6,16.3,5.2c5.2,2.6,9.9,6.2,15.1,8.6 c13.3,6,20.3,18,28.7,28.8c12.5,16,24.6,32.2,32.9,50.8C338.3,615.2,341,619.7,341,625z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M91.9,675c-8,-3.8,-13.6,-10.7,-19.7,-16.8c-4.1,-4.1,-6.9,-9.4,-10.3,-14.2c21.3,-27.5,49.8,-44.3,82.3,-54.9 c6.8,-2.2,13.6,-4.3,20.7,-5.1c-5.3,13.4,-10.4,26.9,-12.5,41.2c-2,13.4,-3.2,26.8,-1.7,40.5c1.1,9.6,2.3,19,4.8,28.3 c0.7,2.5,0.1,2.7,-2.4,2.3c-15.2,-2.6,-29.9,-7.1,-44.1,-13.3c-2,-0.9,-3.7,-2.3,-6.1,-2c0,0,0,0,0,0c-0.7,-1.2,-1.9,-1,-3,-1c0,0,0,0,0,0 c-0.3,-2.7,-2.4,-1.8,-4,-2c0,0,0,0,0,0c-0.3,-0.3,-0.7,-0.7,-1,-1c0,0,0,0,0,0c-0.3,-0.3,-0.7,-0.7,-1,-1c0,0,0,0,0,0 C93.6,675.2,92.8,675,91.9,675z" - android:fillColor="#D86868"/> - <path - android:pathData="M135,832.8c1.3,0.1,2.6,0.3,3.9,0.4c0.9,0.8,2,0.7,3.1,0.6c13.1,2.2,26.4,3,39.6,4.1 c4.5,0.3,9,0.2,13.4,-0.5c3.1,0.3,6.3,0.7,9.4,0.8c22.6,0.4,45.2,-0.9,67.6,-4.1c23.9,-3.3,47.4,-8.2,69.8,-17.6 c10.7,-4.5,21.4,-9.3,29.3,-18.3l0,0.1c6.2,-4.6,8.5,-11.8,11.9,-18.2c5.2,4.3,3.3,10.1,2.2,15c-2.2,9.7,-9.6,15.7,-17.4,21 c-17.1,11.7,-36.5,18.1,-56.4,22.9c-19.3,4.7,-38.9,7.4,-58.7,9.3c-21.4,2,-42.8,2.5,-64.2,1.6c-20.3,-0.8,-40.5,-2.8,-60.6,-6.5 c-19,-3.5,-37.6,-8.2,-55.4,-15.4c-11.9,-4.8,-23.4,-10.6,-32.3,-20.2c-5.3,-5.8,-8.9,-12.4,-8.3,-20.6c0.1,-1.2,0,-2.4,1.1,-3.1 c3.3,3.1,4.1,7.8,7.2,11.1c9,9.9,20.2,16.3,32.4,21.4c16.8,7,34.3,11.7,52.3,14.5c0.6,0.1,1.2,0.2,1.9,0.3c0.9,0.8,2,0.7,3.1,0.6 c0.6,0.1,1.3,0.2,1.9,0.3C132.8,833,133.9,833,135,832.8z" - android:fillColor="#999899"/> - <path - android:pathData="M371.9,667c2.8,-3.5,0.4,-7.1,-0.3,-10.4c-5.7,-26.6,-17.7,-50.3,-34.2,-71.7c-0.8,-1,-1.5,-2.2,-2.3,-3.3 c-0.3,-0.5,-0.6,-1.1,-1,-1.9c3.4,3,6.9,5.4,9.6,8.6c10.8,13.1,20.4,27,27.7,42.4c8,16.9,13.1,34.6,15.8,53.1 c1.9,12.9,2.6,25.8,1.7,38.7c-1.7,22.4,-6,44.3,-14.7,65.1c-1.4,3.3,-3.1,6.6,-3,10.4c0,0,0,-0.1,0,-0.1c-1.8,-0.3,-3.3,0.4,-4.7,1.2 c-6.3,3.7,-12.6,7.3,-19.4,10.2c-24,10.3,-48.8,14.5,-74.7,9.2c-4.2,-0.9,-9.4,-0.2,-12.4,-4.8c13.8,-2,27.6,-4.4,41.1,-8 c10,-2.7,20,-5.4,29,-10.8c1.5,-0.5,3.2,-0.9,4.6,-1.6c10.6,-5.1,19.5,-12.1,25.3,-22.6c4.7,-3.1,8.2,-10.7,6.9,-15c0.3,-1.4,0.6,-2.9,1,-4.3 c5.4,-16.2,7.5,-33.1,9,-50C378,689.7,375.5,678.3,371.9,667z" - android:fillColor="#F1F0F0"/> - <path - android:pathData="M371.9,667c3.6,11.3,6.1,22.7,5.1,34.6c-1.5,16.9,-3.6,33.8,-9,50c-0.5,1.4,-0.7,2.9,-1,4.3 c-2.3,5,-4.6,10,-6.9,15c-5.8,10.5,-14.7,17.5,-25.3,22.6c-1.5,0.7,-3.1,1.1,-4.6,1.6c-0.3,-2.1,0.3,-3.9,1.1,-5.7 c3.4,-7.4,6.4,-14.9,8.9,-22.6c6,-18.1,10,-36.5,12,-55.6c1.2,-11.6,0.9,-23.2,0.6,-34.8c-0.2,-6.8,-0.7,-13.8,-2.8,-20.5 c2.4,-4.1,4.7,-8.1,7.1,-12.2c5.6,4.7,8.4,11.3,11.7,17.6C369.8,663.3,370.8,665.2,371.9,667z" - android:fillColor="#E6A3A3"/> - <path - android:pathData="M260,814c2.9,4.6,8.1,3.9,12.4,4.8c25.9,5.3,50.7,1.1,74.7,-9.2c6.7,-2.9,13.1,-6.4,19.4,-10.2 c1.4,-0.9,2.9,-1.6,4.7,-1.2c-7.9,9.1,-18.6,13.8,-29.3,18.3c-22.3,9.4,-45.9,14.3,-69.8,17.6c-22.4,3.1,-45,4.4,-67.6,4.1 c-3.1,-0.1,-6.3,-0.5,-9.4,-0.8c-0.1,-2,-1.4,-2.2,-3,-2.4c-28.3,-3,-56,-8.2,-82.4,-19.1c-13.4,-5.5,-26.5,-11.8,-35.3,-24.1c-1.3,-1.8,-2.4,-3.6,-2.2,-5.9 c15.1,11.6,32.9,16.7,51,21.1c17.7,4.4,35.8,6.6,54,8.3c10,0.9,20,1.1,29.8,1.1c15.7,0.1,31.5,0.4,47.1,-2.4 C256,814,258,814,260,814z" - android:fillColor="#EDECEC"/> - <path - android:pathData="M130,831.9c-1.1,0.1,-2.2,0.2,-3.1,-0.6C128.3,829.5,129.4,829.5,130,831.9z" - android:fillColor="#EDECEC"/> - <path - android:pathData="M135,832.8c-1.1,0.1,-2.2,0.2,-3.1,-0.7C133.4,830.5,134.4,830.6,135,832.8z" - android:fillColor="#EDECEC"/> - <path - android:pathData="M142,833.8c-1.1,0.1,-2.2,0.2,-3.1,-0.6C140.3,831.5,141.4,831.5,142,833.8z" - android:fillColor="#EDECEC"/> - <path - android:pathData="M260,814c-2,0,-4,0,-6,0c-6.8,-3.7,-13.9,-6.8,-20.5,-11c-18,-11.5,-32.7,-26.4,-45.1,-43.6c-11,-15.2,-21,-31,-27.5,-48.8 c-0.9,-2.5,-2,-4.9,-1.9,-7.7c0.7,0,1.4,-0.1,2,0.1c16.2,4.6,33.1,5.3,49.6,5.3c10,0,20.1,-0.2,30.2,-1.3c19.5,-2,38.7,-5.3,57,-12.4 c15.6,-6,30.1,-13.9,41.3,-26.9c4.7,-3.1,7,-8.3,11,-12c2.1,6.7,2.6,13.7,2.8,20.5c0.3,11.6,0.6,23.1,-0.6,34.8c-2,19,-6,37.5,-12,55.6 c-2.6,7.7,-5.5,15.3,-8.9,22.6c-0.9,1.9,-1.5,3.7,-1.1,5.7c-9,5.4,-19,8.1,-29,10.8C287.6,809.6,273.8,811.9,260,814z" - android:fillColor="#E6A3A3"/> - <path - android:pathData="M339,668c-11.1,13,-25.7,20.8,-41.3,26.9c-18.3,7.1,-37.5,10.4,-57,12.4c-10.1,1,-20.3,1.3,-30.2,1.3 c-16.6,0,-33.4,-0.7,-49.6,-5.3c-0.6,-0.2,-1.3,-0.1,-2,-0.1c-0.6,-0.4,-1.3,-0.7,-1.9,-1.1c-0.4,-3.8,0.3,-5,4.8,-4.2c12.1,2,24.3,2.8,36.5,3.4 c32.4,1.7,64.1,-2.3,95.1,-11.6c14.8,-4.5,29,-10.8,41.5,-20.1C336.3,668.5,337.5,667.9,339,668z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M96,678c1.6,0.2,3.7,-0.7,4,2C98.4,679.8,97,679.3,96,678z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M100,680c1.1,0,2.3,-0.2,3,1C101.9,681,100.7,681.2,100,680z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M91.9,675c0.8,0,1.6,0.2,2.1,1C93.2,676,92.4,675.8,91.9,675z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M94,676c0.3,0.3,0.7,0.7,1,1C94.7,676.7,94.3,676.3,94,676z" - android:fillColor="#FFFFFF"/> - <path - android:pathData="M95,677c0.3,0.3,0.7,0.7,1,1C95.7,677.7,95.3,677.3,95,677z" - android:fillColor="#C5C5C5"/> - <path - android:pathData="M360,771c2.3,-5,4.6,-10,6.9,-15C368.2,760.3,364.7,767.8,360,771z" - android:fillColor="#EDECEC"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_breadcrumb_arrow.xml b/packages/DocumentsUI/res/drawable/ic_breadcrumb_arrow.xml deleted file mode 100644 index 76c0e1fad756..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_breadcrumb_arrow.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_breadcrumb_arrow_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/ic_breadcrumb_arrow_down.xml b/packages/DocumentsUI/res/drawable/ic_breadcrumb_arrow_down.xml deleted file mode 100644 index 199a308f21ce..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_breadcrumb_arrow_down.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<rotate xmlns:android="http://schemas.android.com/apk/res/android" - android:fromDegrees="90" - android:toDegrees="90" - android:pivotX="50%" - android:pivotY="50%" - android:drawable="@drawable/ic_breadcrumb_arrow"> -</rotate>
\ No newline at end of file diff --git a/packages/DocumentsUI/res/drawable/ic_cab_cancel.xml b/packages/DocumentsUI/res/drawable/ic_cab_cancel.xml deleted file mode 100644 index 629100cc22da..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_cab_cancel.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_cab_cancel_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_check_circle.xml b/packages/DocumentsUI/res/drawable/ic_check_circle.xml deleted file mode 100644 index 62a4e34b4969..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_check_circle.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- -Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="?android:attr/colorAccent" - android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10,-4.48 10,-10S17.52 2 12 2zm-2 15l-5,-5 1.41,-1.41L10 14.17l7.59,-7.59L19 8l-9 9z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_dialog_alert.xml b/packages/DocumentsUI/res/drawable/ic_dialog_alert.xml deleted file mode 100644 index 5132df39ed9b..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_dialog_alert.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_dialog_alert_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_dialog_info.xml b/packages/DocumentsUI/res/drawable/ic_dialog_info.xml deleted file mode 100644 index a029cca0c9b4..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_dialog_info.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_dialog_info_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_doc_album.xml b/packages/DocumentsUI/res/drawable/ic_doc_album.xml deleted file mode 100644 index 1ce3f023dfb7..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_doc_album.xml +++ /dev/null @@ -1,24 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FF737373" - android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10,-4.48 10,-10S17.52 2 12 2zm0 14.5c-2.49 0,-4.5,-2.01,-4.5,-4.5S9.51 7.5 12 7.5s4.5 2.01 4.5 4.5,-2.01 4.5,-4.5 4.5zm0,-5.5c-.55 0,-1 .45,-1 1s.45 1 1 1 1,-.45 1,-1,-.45,-1,-1,-1z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_doc_folder.xml b/packages/DocumentsUI/res/drawable/ic_doc_folder.xml deleted file mode 100644 index dcbce010810e..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_doc_folder.xml +++ /dev/null @@ -1,24 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FF737373" - android:pathData="M10 4H4c-1.1 0,-1.99.9,-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2,-.9 2,-2V8c0,-1.1,-.9,-2,-2,-2h-8l-2,-2z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_doc_text.xml b/packages/DocumentsUI/res/drawable/ic_doc_text.xml deleted file mode 100644 index 7fc04e811b1c..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_doc_text.xml +++ /dev/null @@ -1,24 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FF737373" - android:pathData="M14 2H6c-1.1 0,-1.99.9,-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2,-.9 2,-2V8l-6,-6zm2 16H8v-2h8v2zm0,-4H8v-2h8v2zm-3,-5V3.5L18.5 9H13z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_eject.xml b/packages/DocumentsUI/res/drawable/ic_eject.xml deleted file mode 100644 index cbcd755b8106..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_eject.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- -Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FF737373" - android:pathData="M5 17h14v2H5zm7-12L5.33 15h13.34z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_grid_folder.xml b/packages/DocumentsUI/res/drawable/ic_grid_folder.xml deleted file mode 100644 index 0c8786929204..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_grid_folder.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_grid_folder_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_hamburger.xml b/packages/DocumentsUI/res/drawable/ic_hamburger.xml deleted file mode 100644 index 7cda32e469e1..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_hamburger.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_hamburger_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_copy.xml b/packages/DocumentsUI/res/drawable/ic_menu_copy.xml deleted file mode 100644 index e0abe07420a1..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_copy.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_copy_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_delete.xml b/packages/DocumentsUI/res/drawable/ic_menu_delete.xml deleted file mode 100644 index e52ed97a426b..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_delete.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_delete_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_new_folder.xml b/packages/DocumentsUI/res/drawable/ic_menu_new_folder.xml deleted file mode 100644 index b10553572e28..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_new_folder.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_new_folder_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_search.xml b/packages/DocumentsUI/res/drawable/ic_menu_search.xml deleted file mode 100644 index 33f548b8ae0b..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_search.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_search_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_share.xml b/packages/DocumentsUI/res/drawable/ic_menu_share.xml deleted file mode 100644 index 927e7d3a8dd4..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_share.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_share_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_sortby.xml b/packages/DocumentsUI/res/drawable/ic_menu_sortby.xml deleted file mode 100644 index 065ea87f5034..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_sortby.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_sortby_am_alpha" - android:tint="?android:attr/colorControlNormal" - android:autoMirrored="true" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_view_grid.xml b/packages/DocumentsUI/res/drawable/ic_menu_view_grid.xml deleted file mode 100644 index dc09a0c928f4..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_view_grid.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_view_grid_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_menu_view_list.xml b/packages/DocumentsUI/res/drawable/ic_menu_view_list.xml deleted file mode 100644 index 23c57773983a..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_menu_view_list.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_menu_view_list_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_root_documents.xml b/packages/DocumentsUI/res/drawable/ic_root_documents.xml deleted file mode 100644 index afd886d2adc5..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_root_documents.xml +++ /dev/null @@ -1,24 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M10 4H4c-1.1 0,-1.99.9,-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2,-.9 2,-2V8c0,-1.1,-.9,-2,-2,-2h-8l-2,-2z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_root_download.xml b/packages/DocumentsUI/res/drawable/ic_root_download.xml deleted file mode 100644 index f07d8f0e301d..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_root_download.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_root_download_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_root_recent.xml b/packages/DocumentsUI/res/drawable/ic_root_recent.xml deleted file mode 100644 index 41e6a5e4f705..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_root_recent.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/ic_root_recent_alpha" - android:tint="?android:attr/colorControlNormal" /> diff --git a/packages/DocumentsUI/res/drawable/ic_root_smartphone.xml b/packages/DocumentsUI/res/drawable/ic_root_smartphone.xml deleted file mode 100644 index 3021b16371ad..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_root_smartphone.xml +++ /dev/null @@ -1,24 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M17 1.01L7 1c-1.1 0,-2 .9,-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2,-.9 2,-2V3c0,-1.1,-.9,-1.99,-2,-1.99zM17 19H7V5h10v14z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_sd_storage.xml b/packages/DocumentsUI/res/drawable/ic_sd_storage.xml deleted file mode 100644 index 5aeebbb6fc90..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_sd_storage.xml +++ /dev/null @@ -1,24 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M18 2h-8L4.02 8 4 20c0 1.1.9 2 2 2h12c1.1 0 2,-.9 2,-2V4c0,-1.1,-.9,-2,-2,-2zm-6 6h-2V4h2v4zm3 0h-2V4h2v4zm3 0h-2V4h2v4z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_subdirectory_arrow.xml b/packages/DocumentsUI/res/drawable/ic_subdirectory_arrow.xml deleted file mode 100644 index 0f34ba446373..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_subdirectory_arrow.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- -Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="?android:attr/colorControlNormal" - android:pathData="M19 15l-6 6,-1.42,-1.42L15.17 16H4V4h2v10h9.17l-3.59,-3.58L13 9l6 6z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/ic_usb_storage.xml b/packages/DocumentsUI/res/drawable/ic_usb_storage.xml deleted file mode 100644 index 2a8d024f3eec..000000000000 --- a/packages/DocumentsUI/res/drawable/ic_usb_storage.xml +++ /dev/null @@ -1,24 +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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24.0" - android:viewportHeight="24.0"> - <path - android:fillColor="#FF000000" - android:pathData="M15 7v4h1v2h-3V5h2l-3,-4,-3 4h2v8H8v-2.07c.7,-.37 1.2,-1.08 1.2,-1.93 0,-1.21,-.99,-2.2,-2.2,-2.2,-1.21 0,-2.2.99,-2.2 2.2 0 .85.5 1.56 1.2 1.93V13c0 1.11.89 2 2 2h3v3.05c-.71.37,-1.2 1.1,-1.2 1.95 0 1.22.99 2.2 2.2 2.2 1.21 0 2.2,-.98 2.2,-2.2 0,-.85,-.49,-1.58,-1.2,-1.95V15h3c1.11 0 2,-.89 2,-2v-2h1V7h-4z"/> -</vector> diff --git a/packages/DocumentsUI/res/drawable/item_doc_grid_border.xml b/packages/DocumentsUI/res/drawable/item_doc_grid_border.xml deleted file mode 100644 index db66094fc2ec..000000000000 --- a/packages/DocumentsUI/res/drawable/item_doc_grid_border.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- 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. ---> - -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <stroke - android:width="2dp" - android:color="@color/item_doc_grid_border"/> -</shape> diff --git a/packages/DocumentsUI/res/drawable/item_doc_list_background.xml b/packages/DocumentsUI/res/drawable/item_doc_list_background.xml deleted file mode 100644 index 13910bbe3d9d..000000000000 --- a/packages/DocumentsUI/res/drawable/item_doc_list_background.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <solid android:color="@color/item_doc_list_background_activated" /> -</shape> diff --git a/packages/DocumentsUI/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml b/packages/DocumentsUI/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml deleted file mode 100644 index 070b9a10351c..000000000000 --- a/packages/DocumentsUI/res/drawable/progress_indeterminate_horizontal_material_trimmed.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<!-- Variant of progress_indeterminate_horizontal_material in frameworks/base/core/res, which - draws the whole height of the progress bar instead having blank space above and below the - bar. --> -<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - android:drawable="@drawable/vector_drawable_progress_indeterminate_horizontal_trimmed" > - <target - android:name="rect2_grp" - android:animation="@*android:anim/progress_indeterminate_horizontal_rect2" /> - <target - android:name="rect1_grp" - android:animation="@*android:anim/progress_indeterminate_horizontal_rect1" /> -</animated-vector> diff --git a/packages/DocumentsUI/res/drawable/root_item_background.xml b/packages/DocumentsUI/res/drawable/root_item_background.xml deleted file mode 100644 index cc56f1e56e4d..000000000000 --- a/packages/DocumentsUI/res/drawable/root_item_background.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<ripple - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res/com.android.documentsui" - android:color="?attr/colorControlHighlight"> - <item - android:id="@android:id/mask" - android:drawable="@android:color/white"/> - - <item> - <selector> - <item - app:state_highlighted="true" - android:drawable="@color/item_doc_background_selected"/> - <item - app:state_highlighted="false" - android:drawable="@android:color/transparent"/> - </selector> - </item> -</ripple>
\ No newline at end of file diff --git a/packages/DocumentsUI/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml b/packages/DocumentsUI/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml deleted file mode 100644 index 39e3a3738e28..000000000000 --- a/packages/DocumentsUI/res/drawable/vector_drawable_progress_indeterminate_horizontal_trimmed.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<!-- Variant of vector_drawable_progress_indeterminate_horizontal in frameworks/base/core/res, which - draws the whole height of the progress bar instead having blank space above and below the - bar. --> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="10dp" - android:width="360dp" - android:viewportHeight="10" - android:viewportWidth="360" > - <group - android:name="progress_group" - android:translateX="180" - android:translateY="5" > - <path - android:name="background_track" - android:pathData="M -180.0,-5.0 l 360.0,0 l 0,10.0 l -360.0,0 Z" - android:fillColor="?android:attr/colorControlActivated" - android:fillAlpha="?android:attr/disabledAlpha"/> - <group - android:name="rect2_grp" - android:translateX="-197.60001" - android:scaleX="0.1" > - <path - android:name="rect2" - android:pathData="M -144.0,-5.0 l 288.0,0 l 0,10.0 l -288.0,0 Z" - android:fillColor="?android:attr/colorControlActivated" /> - </group> - <group - android:name="rect1_grp" - android:translateX="-522.59998" - android:scaleX="0.1" > - <path - android:name="rect1" - android:pathData="M -144.0,-5.0 l 288.0,0 l 0,10.0 l -288.0,0 Z" - android:fillColor="?android:attr/colorControlActivated" /> - </group> - </group> -</vector> diff --git a/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml b/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml deleted file mode 100644 index ecc26e196e2a..000000000000 --- a/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml +++ /dev/null @@ -1,135 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2013 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. ---> - -<com.android.documentsui.ListItem xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/item_doc_background" - android:focusable="true" - android:orientation="horizontal" > - - <View - android:id="@+id/focus_indicator" - android:layout_width="4dp" - android:layout_height="match_parent" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:baselineAligned="false" - android:gravity="center_vertical" - android:minHeight="@dimen/list_item_height" - android:orientation="horizontal" - android:paddingEnd="@dimen/list_item_padding" - android:paddingStart="@dimen/list_item_padding" > - - <FrameLayout - android:id="@android:id/icon" - android:layout_width="@dimen/list_item_thumbnail_size" - android:layout_height="@dimen/list_item_thumbnail_size" - android:layout_marginEnd="16dp" - android:layout_marginStart="0dp" > - - <ImageView - android:id="@+id/icon_mime" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:contentDescription="@null" - android:scaleType="centerInside" /> - - <ImageView - android:id="@+id/icon_thumb" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="center" - android:contentDescription="@null" - android:scaleType="centerCrop" /> - - <ImageView - android:id="@+id/icon_check" - android:layout_width="@dimen/check_icon_size" - android:layout_height="@dimen/check_icon_size" - android:layout_gravity="center" - android:alpha="0" - android:contentDescription="@null" - android:scaleType="fitCenter" - android:src="@drawable/ic_check_circle" /> - - </FrameLayout> - - <!-- This is the one special case where we want baseline alignment! --> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:orientation="horizontal" > - - <TextView - android:id="@android:id/title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginEnd="12dp" - android:layout_weight="0.5" - android:ellipsize="middle" - android:singleLine="true" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Subhead" - android:textColor="?android:attr/textColorPrimary" /> - - <TextView - android:id="@android:id/summary" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginEnd="12dp" - android:layout_weight="0.25" - android:ellipsize="end" - android:singleLine="true" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Body1" - android:textColor="?android:attr/textColorSecondary" /> - - <TextView - android:id="@+id/size" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginEnd="12dp" - android:layout_weight="0.125" - android:ellipsize="end" - android:minWidth="70dp" - android:singleLine="true" - android:textAlignment="viewEnd" - android:textAppearance="@android:style/TextAppearance.Material.Body1" - android:textColor="?android:attr/textColorSecondary" /> - - <TextView - android:id="@+id/date" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginEnd="12dp" - android:layout_weight="0.125" - android:ellipsize="end" - android:minWidth="70dp" - android:singleLine="true" - android:textAlignment="viewEnd" - android:textAppearance="@android:style/TextAppearance.Material.Body1" - android:textColor="?android:attr/textColorSecondary" /> - </LinearLayout> - </LinearLayout> - -</com.android.documentsui.ListItem> diff --git a/packages/DocumentsUI/res/layout/dialog_delete_confirmation.xml b/packages/DocumentsUI/res/layout/dialog_delete_confirmation.xml deleted file mode 100644 index a1c291093f41..000000000000 --- a/packages/DocumentsUI/res/layout/dialog_delete_confirmation.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingTop="24dp" - android:paddingStart="24dp" - android:paddingEnd="24dp" - android:textAppearance="@android:style/TextAppearance.Material.Subhead" - android:textColor="@*android:color/primary_text_default_material_light"> -</TextView> diff --git a/packages/DocumentsUI/res/layout/dialog_file_name.xml b/packages/DocumentsUI/res/layout/dialog_file_name.xml deleted file mode 100644 index 3a95a136126e..000000000000 --- a/packages/DocumentsUI/res/layout/dialog_file_name.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fitsSystemWindows="true" - android:padding="?android:attr/listPreferredItemPaddingEnd"> - - <EditText - android:id="@android:id/text1" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:inputType="text" /> - -</FrameLayout> diff --git a/packages/DocumentsUI/res/layout/dialog_open_scoped_directory.xml b/packages/DocumentsUI/res/layout/dialog_open_scoped_directory.xml deleted file mode 100644 index bfb027149333..000000000000 --- a/packages/DocumentsUI/res/layout/dialog_open_scoped_directory.xml +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:theme="@style/Theme.AppCompat.Light.Dialog.Alert" - android:orientation="vertical" - android:paddingEnd="24dp" - android:paddingStart="24dp" > - - <TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/message" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingEnd="24dp" - android:paddingStart="32dp" - android:paddingTop="24dp"> - </TextView> - - <CheckBox - android:id="@+id/do_not_ask_checkbox" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:layout_marginTop="16dip" - android:text="@string/never_ask_again" - android:textColor="?android:attr/textColorSecondary" - android:visibility="gone" /> -</LinearLayout>
\ No newline at end of file diff --git a/packages/DocumentsUI/res/layout/directory_cluster.xml b/packages/DocumentsUI/res/layout/directory_cluster.xml deleted file mode 100644 index d84ef0823309..000000000000 --- a/packages/DocumentsUI/res/layout/directory_cluster.xml +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <FrameLayout - android:id="@+id/container_message_bar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:elevation="8dp" - android:background="@color/material_grey_50"/> - - <FrameLayout - android:id="@+id/container_directory" - android:clipToPadding="false" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" /> - - <FrameLayout - android:id="@+id/container_save" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/material_grey_50" - android:elevation="8dp" /> - -</LinearLayout> diff --git a/packages/DocumentsUI/res/layout/drag_shadow_layout.xml b/packages/DocumentsUI/res/layout/drag_shadow_layout.xml deleted file mode 100644 index 26613efddf14..000000000000 --- a/packages/DocumentsUI/res/layout/drag_shadow_layout.xml +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingStart="8dp" - android:paddingEnd="8dp" - android:orientation="horizontal" - android:gravity="center_vertical|left" - android:background="@drawable/drag_shadow_background"> - - <ImageView - android:id="@android:id/icon" - android:layout_width="@dimen/root_icon_size" - android:layout_height="@dimen/root_icon_size" - android:scaleType="centerInside" - android:contentDescription="@null" - android:duplicateParentState="true"/> - - <TextView - android:id="@android:id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:maxLines="1" - android:ellipsize="end" - android:textAlignment="viewStart" - android:textColor="@color/item_title" - android:paddingStart="8dp"/> - -</LinearLayout> diff --git a/packages/DocumentsUI/res/layout/drawer_layout.xml b/packages/DocumentsUI/res/layout/drawer_layout.xml deleted file mode 100644 index 32ba6d03c249..000000000000 --- a/packages/DocumentsUI/res/layout/drawer_layout.xml +++ /dev/null @@ -1,99 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<!-- CoordinatorLayout is necessary for various components (e.g. Snackbars, and - floating action buttons) to operate correctly. --> -<android.support.design.widget.CoordinatorLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:id="@+id/coordinator_layout"> - - <android.support.v4.widget.DrawerLayout - android:id="@+id/drawer_layout" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <com.android.documentsui.DocumentsToolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?android:attr/actionBarSize" - android:background="?android:attr/colorPrimary" - android:elevation="8dp" - android:theme="?actionBarTheme" - android:popupTheme="?actionBarPopupTheme"> - - <com.android.documentsui.DropdownBreadcrumb - android:id="@+id/dropdown_breadcrumb" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="4dp" - android:popupTheme="?actionBarPopupTheme" - android:background="@android:color/transparent" - android:overlapAnchor="true" /> - - </com.android.documentsui.DocumentsToolbar> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <include layout="@layout/directory_cluster"/> - - <!-- Drawer edge is a dummy view used to capture hovering event - on view edge to open the drawer. (b/28345294) --> - <View - android:id="@+id/drawer_edge" - android:background="@android:color/transparent" - android:layout_width="@dimen/drawer_edge_width" - android:layout_height="match_parent"/> - </FrameLayout> - - </LinearLayout> - - <LinearLayout - android:id="@+id/drawer_roots" - android:layout_width="256dp" - android:layout_height="match_parent" - android:layout_gravity="start" - android:orientation="vertical" - android:elevation="16dp" - android:background="@color/drawer_background"> - - <Toolbar - android:id="@+id/roots_toolbar" - android:layout_width="match_parent" - android:layout_height="?android:attr/actionBarSize" - android:background="?android:attr/colorPrimary" - android:elevation="8dp" - android:theme="?actionBarTheme" - android:popupTheme="?actionBarPopupTheme" /> - - <FrameLayout - android:id="@+id/container_roots" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" /> - - </LinearLayout> - - </android.support.v4.widget.DrawerLayout> -</android.support.design.widget.CoordinatorLayout> diff --git a/packages/DocumentsUI/res/layout/fixed_layout.xml b/packages/DocumentsUI/res/layout/fixed_layout.xml deleted file mode 100644 index 9882e94878f7..000000000000 --- a/packages/DocumentsUI/res/layout/fixed_layout.xml +++ /dev/null @@ -1,70 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<!-- CoordinatorLayout is necessary for various components (e.g. Snackbars, and - floating action buttons) to operate correctly. --> -<!-- focusableInTouchMode is set in order to force key events to go to the activity's global key - callback, which is necessary for proper event routing. See BaseActivity.onKeyDown. --> -<android.support.design.widget.CoordinatorLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:id="@+id/coordinator_layout" - android:focusableInTouchMode="true"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <com.android.documentsui.DocumentsToolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?android:attr/actionBarSize" - android:background="?android:attr/colorPrimary" - android:elevation="8dp" - android:theme="?actionBarTheme" - android:popupTheme="?actionBarPopupTheme"> - - <com.android.documentsui.HorizontalBreadcrumb - android:id="@+id/horizontal_breadcrumb" - android:layout_marginRight="20dp" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - </com.android.documentsui.DocumentsToolbar> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" - android:orientation="horizontal" - android:baselineAligned="false"> - - <FrameLayout - android:id="@+id/container_roots" - android:layout_width="256dp" - android:layout_height="match_parent" /> - - <include layout="@layout/directory_cluster" - android:layout_width="0dp" - android:elevation="8dp" /> - - </LinearLayout> - - </LinearLayout> - -</android.support.design.widget.CoordinatorLayout> diff --git a/packages/DocumentsUI/res/layout/fragment_directory.xml b/packages/DocumentsUI/res/layout/fragment_directory.xml deleted file mode 100644 index 1c086a614a5c..000000000000 --- a/packages/DocumentsUI/res/layout/fragment_directory.xml +++ /dev/null @@ -1,108 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<com.android.documentsui.dirlist.AnimationView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/directory_background" - android:outlineProvider="bounds" - android:elevation="4dp" - android:orientation="vertical"> - - <ProgressBar - android:id="@+id/progressbar" - android:layout_width="match_parent" - android:layout_height="@dimen/progress_bar_height" - android:indeterminate="true" - style="@style/TrimmedHorizontalProgressBar" - android:visibility="gone"/> - - <FrameLayout - android:id="@+id/container_message_bar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:elevation="8dp" - android:background="@color/material_grey_50" - android:visibility="gone"/> - - <com.android.documentsui.dirlist.TouchSwipeRefreshLayout - android:id="@+id/refresh_layout" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="match_parent"> - <!-- The empty container view --> - <FrameLayout - android:id="@android:id/empty" - android:gravity="center" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:background="@color/directory_background" - android:focusable="true" - android:focusableInTouchMode="true" - android:visibility="gone" - android:clickable="true"> - - <LinearLayout - android:id="@+id/content" - android:gravity="center" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <ImageView - android:id="@+id/artwork" - android:src="@drawable/cabinet" - android:adjustViewBounds="true" - android:layout_height="250dp" - android:layout_width="fill_parent" - android:alpha="1" - android:layout_centerVertical="true" - android:layout_marginBottom="25dp" - android:scaleType="fitCenter" - android:contentDescription="@null"/> - - <TextView - android:id="@+id/message" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/empty" - style="@android:style/TextAppearance.Material.Subhead"/> - - </LinearLayout> - </FrameLayout> - - <android.support.v7.widget.RecyclerView - android:id="@+id/dir_list" - android:scrollbars="vertical" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingStart="0dp" - android:paddingEnd="0dp" - android:paddingTop="0dp" - android:paddingBottom="0dp" - android:clipToPadding="false" - android:scrollbarStyle="outsideOverlay" - android:drawSelectorOnTop="true"/> - </FrameLayout> - - </com.android.documentsui.dirlist.TouchSwipeRefreshLayout> - -</com.android.documentsui.dirlist.AnimationView> diff --git a/packages/DocumentsUI/res/layout/fragment_message_bar.xml b/packages/DocumentsUI/res/layout/fragment_message_bar.xml deleted file mode 100644 index 47e4e770b15c..000000000000 --- a/packages/DocumentsUI/res/layout/fragment_message_bar.xml +++ /dev/null @@ -1,100 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:animateLayoutChanges="true" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:minHeight="?android:attr/listPreferredItemHeightSmall" - android:orientation="vertical" - android:paddingLeft="@dimen/list_item_padding" - android:paddingRight="@dimen/list_item_padding" - android:paddingTop="@dimen/list_item_padding"> - - <LinearLayout - android:id="@+id/container_info" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:orientation="horizontal" - android:visibility="gone"> - - <FrameLayout - android:layout_height="@dimen/icon_size" - android:layout_width="@dimen/icon_size"> - - <ImageView - android:contentDescription="@null" - android:id="@+id/icon_info" - android:layout_height="match_parent" - android:layout_width="wrap_content" - android:scaleType="centerInside"/> - - </FrameLayout> - - <TextView - android:id="@+id/textview_info" - android:layout_gravity="center_vertical" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:selectAllOnFocus="true"/> - - </LinearLayout> - - <LinearLayout - android:id="@+id/container_error" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:orientation="horizontal" - android:visibility="gone"> - - <FrameLayout - android:layout_height="@dimen/icon_size" - android:layout_width="@dimen/icon_size"> - - <ImageView - android:contentDescription="@null" - android:id="@+id/icon_error" - android:layout_height="match_parent" - android:layout_width="wrap_content" - android:scaleType="centerInside"/> - - </FrameLayout> - - <TextView - android:id="@+id/textview_error" - android:layout_gravity="center_vertical" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:selectAllOnFocus="true"/> - - </LinearLayout> - - <LinearLayout - android:layout_gravity="right" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:orientation="horizontal"> - - <Button - android:id="@+id/button_dismiss" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:text="@string/button_dismiss" - style="?android:attr/buttonBarPositiveButtonStyle"/> - - </LinearLayout> - -</LinearLayout> diff --git a/packages/DocumentsUI/res/layout/fragment_pick.xml b/packages/DocumentsUI/res/layout/fragment_pick.xml deleted file mode 100644 index 40d4eb5bb6f3..000000000000 --- a/packages/DocumentsUI/res/layout/fragment_pick.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2014 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:baselineAligned="false" - android:gravity="end" - android:paddingEnd="8dp" - android:minHeight="?android:attr/listPreferredItemHeightSmall"> - <Button - android:id="@android:id/button2" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:text="@android:string/cancel" - android:visibility="gone" - style="?android:attr/buttonBarNegativeButtonStyle" /> - <Button - android:id="@android:id/button1" - android:layout_width="wrap_content" - android:layout_height="match_parent" - style="?android:attr/buttonBarPositiveButtonStyle" /> -</LinearLayout> diff --git a/packages/DocumentsUI/res/layout/fragment_roots.xml b/packages/DocumentsUI/res/layout/fragment_roots.xml deleted file mode 100644 index ae462072c6b3..000000000000 --- a/packages/DocumentsUI/res/layout/fragment_roots.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<com.android.documentsui.RootsList xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/roots_list" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingTop="8dp" - android:listSelector="@android:color/transparent" - android:drawSelectorOnTop="true" - android:divider="@null" /> diff --git a/packages/DocumentsUI/res/layout/fragment_save.xml b/packages/DocumentsUI/res/layout/fragment_save.xml deleted file mode 100644 index a889b9f9e8c7..000000000000 --- a/packages/DocumentsUI/res/layout/fragment_save.xml +++ /dev/null @@ -1,72 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingStart="@dimen/list_item_padding" - android:orientation="horizontal" - android:baselineAligned="false" - android:gravity="center_vertical" - android:fitsSystemWindows="true" - android:minHeight="?android:attr/listPreferredItemHeightSmall"> - - <FrameLayout - android:layout_width="@dimen/icon_size" - android:layout_height="@dimen/icon_size" - android:layout_marginEnd="16dp"> - - <ImageView - android:id="@android:id/icon" - android:layout_width="@dimen/root_icon_size" - android:layout_height="match_parent" - android:scaleType="centerInside" - android:contentDescription="@null" /> - - </FrameLayout> - - <EditText - android:id="@android:id/title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:singleLine="true" - android:selectAllOnFocus="true" /> - - <FrameLayout - android:layout_width="wrap_content" - android:layout_height="match_parent"> - - <Button - android:id="@android:id/button1" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:text="@string/menu_save" - style="?android:attr/buttonBarPositiveButtonStyle" /> - - <ProgressBar - android:id="@android:id/progress" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:visibility="gone" - android:indeterminate="true" - android:padding="8dp" - style="?android:attr/progressBarStyle" /> - - </FrameLayout> - -</LinearLayout> diff --git a/packages/DocumentsUI/res/layout/item_dir_grid.xml b/packages/DocumentsUI/res/layout/item_dir_grid.xml deleted file mode 100644 index 36af9b952d69..000000000000 --- a/packages/DocumentsUI/res/layout/item_dir_grid.xml +++ /dev/null @@ -1,84 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2013 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. ---> - -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="@dimen/grid_item_margin" - android:background="@color/item_doc_background" - android:elevation="@dimen/grid_item_elevation" - android:focusable="true" > - - <!-- The height is 48px. - paddingTop (9dp) + @dimen/check_icon_size (30dp) + paddingBottom (9dp) --> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="horizontal" - android:paddingBottom="9dp" - android:paddingLeft="9dp" - android:paddingRight="12dp" - android:paddingTop="9dp" - android:gravity="center_vertical"> - - <FrameLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="8dp" > - - <ImageView - android:id="@+id/icon_mime_sm" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:contentDescription="@null" - android:scaleType="centerInside" - android:src="@drawable/ic_doc_folder" /> - - <ImageView - android:id="@+id/icon_check" - android:layout_width="@dimen/check_icon_size" - android:layout_height="@dimen/check_icon_size" - android:alpha="0" - android:contentDescription="@null" - android:scaleType="fitCenter" - android:src="@drawable/ic_check_circle" /> - - </FrameLayout> - - <TextView - android:id="@android:id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:ellipsize="end" - android:singleLine="true" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Subhead" - android:textColor="@color/item_title" /> - - </LinearLayout> - - <!-- An overlay that draws the item border when it is focused. --> - - <View - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@drawable/item_doc_grid_border" - android:contentDescription="@null" - android:duplicateParentState="true" /> - -</FrameLayout> diff --git a/packages/DocumentsUI/res/layout/item_doc_grid.xml b/packages/DocumentsUI/res/layout/item_doc_grid.xml deleted file mode 100644 index 56a061fb1f31..000000000000 --- a/packages/DocumentsUI/res/layout/item_doc_grid.xml +++ /dev/null @@ -1,137 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="@dimen/grid_item_margin" - android:background="@color/item_doc_background" - android:elevation="@dimen/grid_item_elevation" - android:focusable="true"> - - <!-- Main item thumbnail. Comprised of two overlapping images, the - visibility of which is controlled by code in - DirectoryFragment.java. --> - - <FrameLayout - android:id="@+id/thumbnail" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <com.android.documentsui.GridItemThumbnail - android:id="@+id/icon_thumb" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:scaleType="centerCrop" - android:contentDescription="@null" /> - - <com.android.documentsui.GridItemThumbnail - android:id="@+id/icon_mime_lg" - android:layout_width="@dimen/icon_size" - android:layout_height="@dimen/icon_size" - android:layout_gravity="center" - android:scaleType="fitCenter" - android:contentDescription="@null" /> - - </FrameLayout> - - <!-- Item nameplate. Has a mime-type icon and some text fields (title, - size, mod-time, etc). --> - - <RelativeLayout - android:id="@+id/nameplate" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_below="@id/thumbnail" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:paddingLeft="12dp" - android:paddingRight="12dp"> - - <ImageView - android:id="@+id/icon_mime_sm" - android:layout_width="@dimen/grid_item_icon_size" - android:layout_height="@dimen/grid_item_icon_size" - android:layout_marginEnd="8dp" - android:layout_alignParentStart="true" - android:layout_centerVertical="true" - android:scaleType="center" - android:contentDescription="@null"/> - - <ImageView - android:id="@+id/icon_check" - android:src="@drawable/ic_check_circle" - android:alpha="0" - android:layout_width="@dimen/check_icon_size" - android:layout_height="@dimen/check_icon_size" - android:layout_marginEnd="8dp" - android:layout_alignParentStart="true" - android:layout_centerVertical="true" - android:scaleType="fitCenter" - android:contentDescription="@null"/> - - <TextView - android:id="@android:id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentTop="true" - android:layout_toEndOf="@id/icon_mime_sm" - android:singleLine="true" - android:ellipsize="end" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Subhead" - android:textColor="@color/item_title" /> - - <TextView - android:id="@+id/size" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_toEndOf="@id/icon_mime_sm" - android:layout_below="@android:id/title" - android:layout_marginEnd="4dp" - android:singleLine="true" - android:ellipsize="end" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Caption" - android:textColor="@color/item_details" /> - - <TextView - android:id="@+id/date" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_below="@android:id/title" - android:layout_toEndOf="@id/size" - android:singleLine="true" - android:ellipsize="end" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Caption" - android:textColor="@color/item_details" /> - - </RelativeLayout> - - <!-- An overlay that draws the item border when it is focused. --> - <View - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignBottom="@id/nameplate" - android:layout_alignTop="@id/thumbnail" - android:layout_alignLeft="@id/thumbnail" - android:layout_alignRight="@id/thumbnail" - android:contentDescription="@null" - android:background="@drawable/item_doc_grid_border" - android:duplicateParentState="true" /> - -</RelativeLayout> diff --git a/packages/DocumentsUI/res/layout/item_doc_list.xml b/packages/DocumentsUI/res/layout/item_doc_list.xml deleted file mode 100644 index a939fcddccee..000000000000 --- a/packages/DocumentsUI/res/layout/item_doc_list.xml +++ /dev/null @@ -1,134 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2013 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. ---> - -<com.android.documentsui.ListItem xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/item_doc_background" - android:focusable="true" - android:orientation="horizontal" > - - <View - android:id="@+id/focus_indicator" - android:layout_width="4dp" - android:layout_height="match_parent" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:baselineAligned="false" - android:gravity="center_vertical" - android:minHeight="@dimen/list_item_height" - android:orientation="horizontal" - android:paddingEnd="@dimen/list_item_padding" - android:paddingStart="@dimen/list_item_padding" > - - <FrameLayout - android:id="@android:id/icon" - android:layout_width="@dimen/list_item_thumbnail_size" - android:layout_height="@dimen/list_item_thumbnail_size" - android:layout_marginEnd="16dp" > - - <ImageView - android:id="@+id/icon_mime" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:contentDescription="@null" - android:scaleType="centerInside" /> - - <ImageView - android:id="@+id/icon_thumb" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:contentDescription="@null" - android:scaleType="centerCrop" /> - - <ImageView - android:id="@+id/icon_check" - android:layout_width="@dimen/check_icon_size" - android:layout_height="@dimen/check_icon_size" - android:layout_gravity="center" - android:alpha="0" - android:contentDescription="@null" - android:scaleType="fitCenter" - android:src="@drawable/ic_check_circle" /> - </FrameLayout> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:orientation="vertical" - android:layout_gravity="center_vertical" > - - <TextView - android:id="@android:id/title" - android:layout_width="wrap_content" - android:layout_height="0dp" - android:layout_weight="1" - android:ellipsize="end" - android:singleLine="true" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Subhead" - android:textColor="@color/item_title" /> - - <LinearLayout - android:id="@+id/line2" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:baselineAligned="false" - android:gravity="center_vertical" - android:orientation="horizontal" > - - <TextView - android:id="@+id/date" - android:layout_width="90dp" - android:layout_height="wrap_content" - android:ellipsize="end" - android:singleLine="true" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Caption" - android:textColor="@color/item_details" /> - - <TextView - android:id="@+id/size" - android:layout_width="90dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:ellipsize="end" - android:singleLine="true" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Caption" - android:textColor="@color/item_details" /> - - <TextView - android:id="@android:id/summary" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_weight="1" - android:ellipsize="end" - android:singleLine="true" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Caption" - android:textColor="@color/item_details" /> - </LinearLayout> - </LinearLayout> - </LinearLayout> - -</com.android.documentsui.ListItem> diff --git a/packages/DocumentsUI/res/layout/item_root.xml b/packages/DocumentsUI/res/layout/item_root.xml deleted file mode 100644 index 114fd09a86ce..000000000000 --- a/packages/DocumentsUI/res/layout/item_root.xml +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<com.android.documentsui.RootItemView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="48dp" - android:paddingStart="@dimen/list_item_padding" - android:paddingEnd="@dimen/list_item_padding" - android:gravity="center_vertical" - android:orientation="horizontal" - android:baselineAligned="false" - android:background="@drawable/root_item_background"> - - <FrameLayout - android:layout_width="@dimen/icon_size" - android:layout_height="@dimen/icon_size" - android:duplicateParentState="true"> - - <ImageView - android:id="@android:id/icon" - android:layout_width="@dimen/root_icon_size" - android:layout_height="match_parent" - android:scaleType="centerInside" - android:contentDescription="@null" - android:duplicateParentState="true" /> - - </FrameLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:orientation="vertical" - android:layout_weight="1"> - - <TextView - android:id="@android:id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:singleLine="true" - android:ellipsize="end" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Menu" - android:textColor="@color/item_root_primary_text" /> - - <TextView - android:id="@android:id/summary" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:singleLine="true" - android:ellipsize="end" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Caption" - android:textColor="@color/item_root_primary_text" /> - - </LinearLayout> - - <FrameLayout - android:layout_width="@dimen/icon_size" - android:layout_height="@dimen/icon_size" - android:duplicateParentState="true"> - - <ImageView - android:id="@+id/eject_icon" - android:layout_width="@dimen/root_icon_size" - android:layout_height="match_parent" - android:scaleType="centerInside" - android:contentDescription="@string/menu_eject_root" - android:visibility="gone" /> - - </FrameLayout> - -</com.android.documentsui.RootItemView> diff --git a/packages/DocumentsUI/res/layout/item_root_header.xml b/packages/DocumentsUI/res/layout/item_root_header.xml deleted file mode 100644 index 6b9857d77fe0..000000000000 --- a/packages/DocumentsUI/res/layout/item_root_header.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingTop="12dp"> - - <TextView - android:id="@android:id/title" - android:textColor="?android:attr/textColorTertiary" - style="?android:attr/listSeparatorTextViewStyle" /> - -</FrameLayout> diff --git a/packages/DocumentsUI/res/layout/item_root_spacer.xml b/packages/DocumentsUI/res/layout/item_root_spacer.xml deleted file mode 100644 index b3beced9be7b..000000000000 --- a/packages/DocumentsUI/res/layout/item_root_spacer.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp"> - - <View - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?android:attr/listDivider" /> - -</FrameLayout> diff --git a/packages/DocumentsUI/res/layout/item_subdir.xml b/packages/DocumentsUI/res/layout/item_subdir.xml deleted file mode 100644 index ffe4afee7530..000000000000 --- a/packages/DocumentsUI/res/layout/item_subdir.xml +++ /dev/null @@ -1,38 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="?android:attr/listPreferredItemHeightSmall" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" - android:gravity="center_vertical" - android:orientation="horizontal" - android:baselineAligned="false"> - - <TextView - android:id="@android:id/title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:singleLine="true" - android:ellipsize="end" - android:textAlignment="viewStart" - android:textAppearance="@android:style/TextAppearance.Material.Subhead" - android:textColor="?android:attr/textColorPrimary" /> - -</LinearLayout> diff --git a/packages/DocumentsUI/res/layout/item_subdir_title.xml b/packages/DocumentsUI/res/layout/item_subdir_title.xml deleted file mode 100644 index 8d0d80790482..000000000000 --- a/packages/DocumentsUI/res/layout/item_subdir_title.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:paddingEnd="8dp" - android:orientation="horizontal" - android:baselineAligned="false"> - - <TextView - android:id="@android:id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:singleLine="true" - android:ellipsize="end" - android:textAlignment="viewStart" - android:drawablePadding="12dp" - android:drawableRight="@drawable/ic_breadcrumb_arrow_down" - android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title" /> -</LinearLayout> diff --git a/packages/DocumentsUI/res/layout/navigation_breadcrumb_item.xml b/packages/DocumentsUI/res/layout/navigation_breadcrumb_item.xml deleted file mode 100644 index 720f7953c7dd..000000000000 --- a/packages/DocumentsUI/res/layout/navigation_breadcrumb_item.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - - -<!-- - CoordinatorLayout is necessary for various components (e.g. Snackbars, and - floating action buttons) to operate correctly. ---> -<!-- - focusableInTouchMode is set in order to force key events to go to the activity's global key - callback, which is necessary for proper event routing. See BaseActivity.onKeyDown. ---> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="@dimen/breadcrumb_item_height" - android:layout_alignParentTop="true" - android:gravity="center_vertical" - android:orientation="horizontal"> - - <com.android.documentsui.DragOverTextView - android:id="@+id/breadcrumb_text" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:gravity="center_vertical" - android:textAppearance="@android:style/TextAppearance.Material.Widget.ActionBar.Title" - android:background="@drawable/breadcrumb_item_background" /> - - <ImageView - android:id="@+id/breadcrumb_arrow" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@drawable/ic_breadcrumb_arrow" - android:layout_marginTop="2dp" - android:layout_marginRight="3dp" - android:layout_marginLeft="3dp" /> - -</LinearLayout>
\ No newline at end of file diff --git a/packages/DocumentsUI/res/layout/single_pane_layout.xml b/packages/DocumentsUI/res/layout/single_pane_layout.xml deleted file mode 100644 index 7b7e2299b16a..000000000000 --- a/packages/DocumentsUI/res/layout/single_pane_layout.xml +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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. ---> - -<!-- CoordinatorLayout is necessary for various components (e.g. Snackbars, and - floating action buttons) to operate correctly. --> -<!-- focusableInTouchMode is set in order to force key events to go to the activity's global key - callback, which is necessary for proper event routing. See BaseActivity.onKeyDown. --> -<android.support.design.widget.CoordinatorLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:id="@+id/coordinator_layout" - android:focusableInTouchMode="true"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <com.android.documentsui.DocumentsToolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?android:attr/actionBarSize" - android:background="?android:attr/colorPrimary" - android:elevation="8dp" - android:theme="?actionBarTheme" - android:popupTheme="?actionBarPopupTheme"> - - <Spinner - android:id="@+id/stack" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:popupTheme="?actionBarPopupTheme" - android:background="@android:color/transparent" - android:layout_marginStart="4dp" - android:overlapAnchor="true" /> - - </com.android.documentsui.DocumentsToolbar> - - <include layout="@layout/directory_cluster"/> - - </LinearLayout> - -</android.support.design.widget.CoordinatorLayout> diff --git a/packages/DocumentsUI/res/menu/activity.xml b/packages/DocumentsUI/res/menu/activity.xml deleted file mode 100644 index ed47bbcf2e2e..000000000000 --- a/packages/DocumentsUI/res/menu/activity.xml +++ /dev/null @@ -1,91 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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"> -<!-- showAsAction flag impacts the behavior of SearchView. - When set to collapseActionView, collapsing SearchView to icon is the - default behavior. It would fit UX, however after expanding SearchView is - shown on the left site of the toolbar (replacing title). Since no way to - prevent this behavior was found, the flag is set to always. SearchView is - always visible by default and it is being collapse manually by calling - setIconified() method ---> - <item - android:id="@+id/menu_search" - android:title="@string/menu_search" - android:icon="@drawable/ic_menu_search" - android:showAsAction="always" - android:actionViewClass="android.widget.SearchView" - android:imeOptions="actionSearch" - android:visible="false" /> -<!-- This group is being hidden when searching is in full bar mode--> - <group android:id="@+id/group_hide_when_searching"> - <item - android:id="@+id/menu_grid" - android:title="@string/menu_grid" - android:icon="@drawable/ic_menu_view_grid" - android:showAsAction="always" /> - <item - android:id="@+id/menu_list" - android:title="@string/menu_list" - android:icon="@drawable/ic_menu_view_list" - android:showAsAction="always" /> - - <item - android:id="@+id/menu_new_window" - android:title="@string/menu_new_window" - android:alphabeticShortcut="n" - android:showAsAction="never" - android:visible="false" /> - <item - android:id="@+id/menu_create_dir" - android:title="@string/menu_create_dir" - android:icon="@drawable/ic_menu_new_folder" - android:alphabeticShortcut="e" - android:showAsAction="never" - android:visible="false" /> - <item - android:id="@+id/menu_sort" - android:title="@string/menu_sort" - android:icon="@drawable/ic_menu_sortby" - android:showAsAction="ifRoom"> - <menu> - <item - android:id="@+id/menu_sort_name" - android:title="@string/sort_name" /> - <item - android:id="@+id/menu_sort_date" - android:title="@string/sort_date" /> - <item - android:id="@+id/menu_sort_size" - android:title="@string/sort_size" /> - </menu> - </item> - <item - android:id="@+id/menu_file_size" - android:showAsAction="never" - android:visible="false" /> - <item - android:id="@+id/menu_advanced" - android:showAsAction="never" - android:visible="false" /> - <item - android:id="@+id/menu_settings" - android:title="@string/menu_settings" - android:showAsAction="never" - android:visible="false" /> - </group> -</menu> diff --git a/packages/DocumentsUI/res/menu/context_menu.xml b/packages/DocumentsUI/res/menu/context_menu.xml deleted file mode 100644 index 74748590a2b9..000000000000 --- a/packages/DocumentsUI/res/menu/context_menu.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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"> - <item - android:id="@+id/menu_cut_to_clipboard" - android:title="@string/menu_cut_to_clipboard" /> - <item - android:id="@+id/menu_copy_to_clipboard" - android:title="@string/menu_copy_to_clipboard" /> - <item - android:id="@+id/menu_paste_from_clipboard" - android:title="@string/menu_paste_from_clipboard" /> -</menu> diff --git a/packages/DocumentsUI/res/menu/mode_directory.xml b/packages/DocumentsUI/res/menu/mode_directory.xml deleted file mode 100644 index e2125ad215a3..000000000000 --- a/packages/DocumentsUI/res/menu/mode_directory.xml +++ /dev/null @@ -1,51 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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"> - <item - android:id="@+id/menu_open" - android:title="@string/menu_open" - android:showAsAction="always" /> - <item - android:id="@+id/menu_share" - android:icon="@drawable/ic_menu_share" - android:title="@string/menu_share" - android:showAsAction="always" /> - <item - android:id="@+id/menu_delete" - android:icon="@drawable/ic_menu_delete" - android:title="@string/menu_delete" - android:showAsAction="always" /> - <item - android:id="@+id/menu_select_all" - android:title="@string/menu_select_all" - android:showAsAction="never" /> - <item - android:id="@+id/menu_copy_to" - android:title="@string/menu_copy" - android:showAsAction="never" - android:visible="false" /> - <item - android:id="@+id/menu_move_to" - android:title="@string/menu_move" - android:showAsAction="never" - android:visible="false" /> - <item - android:id="@+id/menu_rename" - android:title="@string/menu_rename" - android:showAsAction="never" - android:visible="false" /> -</menu> diff --git a/packages/DocumentsUI/res/menu/root_context_menu.xml b/packages/DocumentsUI/res/menu/root_context_menu.xml deleted file mode 100644 index 0cf00a422515..000000000000 --- a/packages/DocumentsUI/res/menu/root_context_menu.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<menu xmlns:android="http://schemas.android.com/apk/res/android"> - <item - android:id="@+id/menu_eject_root" - android:title="@string/menu_eject_root" /> - <item - android:id="@+id/menu_settings" - android:title="@string/menu_settings" /> -</menu> diff --git a/packages/DocumentsUI/res/mipmap-hdpi/ic_app_icon.png b/packages/DocumentsUI/res/mipmap-hdpi/ic_app_icon.png Binary files differdeleted file mode 100644 index cd3a0370b606..000000000000 --- a/packages/DocumentsUI/res/mipmap-hdpi/ic_app_icon.png +++ /dev/null diff --git a/packages/DocumentsUI/res/mipmap-hdpi/ic_launcher_downloads.png b/packages/DocumentsUI/res/mipmap-hdpi/ic_launcher_downloads.png Binary files differdeleted file mode 100644 index f958bbd3c255..000000000000 --- a/packages/DocumentsUI/res/mipmap-hdpi/ic_launcher_downloads.png +++ /dev/null diff --git a/packages/DocumentsUI/res/mipmap-mdpi/ic_app_icon.png b/packages/DocumentsUI/res/mipmap-mdpi/ic_app_icon.png Binary files differdeleted file mode 100644 index 8d08e9b4d32f..000000000000 --- a/packages/DocumentsUI/res/mipmap-mdpi/ic_app_icon.png +++ /dev/null diff --git a/packages/DocumentsUI/res/mipmap-mdpi/ic_launcher_downloads.png b/packages/DocumentsUI/res/mipmap-mdpi/ic_launcher_downloads.png Binary files differdeleted file mode 100644 index f2e937663c2c..000000000000 --- a/packages/DocumentsUI/res/mipmap-mdpi/ic_launcher_downloads.png +++ /dev/null diff --git a/packages/DocumentsUI/res/mipmap-xhdpi/ic_app_icon.png b/packages/DocumentsUI/res/mipmap-xhdpi/ic_app_icon.png Binary files differdeleted file mode 100644 index f3bacb7f3d05..000000000000 --- a/packages/DocumentsUI/res/mipmap-xhdpi/ic_app_icon.png +++ /dev/null diff --git a/packages/DocumentsUI/res/mipmap-xhdpi/ic_launcher_downloads.png b/packages/DocumentsUI/res/mipmap-xhdpi/ic_launcher_downloads.png Binary files differdeleted file mode 100644 index 4dc533638757..000000000000 --- a/packages/DocumentsUI/res/mipmap-xhdpi/ic_launcher_downloads.png +++ /dev/null diff --git a/packages/DocumentsUI/res/mipmap-xxhdpi/ic_app_icon.png b/packages/DocumentsUI/res/mipmap-xxhdpi/ic_app_icon.png Binary files differdeleted file mode 100644 index 5156171931b5..000000000000 --- a/packages/DocumentsUI/res/mipmap-xxhdpi/ic_app_icon.png +++ /dev/null diff --git a/packages/DocumentsUI/res/mipmap-xxhdpi/ic_launcher_downloads.png b/packages/DocumentsUI/res/mipmap-xxhdpi/ic_launcher_downloads.png Binary files differdeleted file mode 100644 index 8716290969da..000000000000 --- a/packages/DocumentsUI/res/mipmap-xxhdpi/ic_launcher_downloads.png +++ /dev/null diff --git a/packages/DocumentsUI/res/mipmap-xxxhdpi/ic_app_icon.png b/packages/DocumentsUI/res/mipmap-xxxhdpi/ic_app_icon.png Binary files differdeleted file mode 100644 index 6dc2f7682684..000000000000 --- a/packages/DocumentsUI/res/mipmap-xxxhdpi/ic_app_icon.png +++ /dev/null diff --git a/packages/DocumentsUI/res/mipmap-xxxhdpi/ic_launcher_downloads.png b/packages/DocumentsUI/res/mipmap-xxxhdpi/ic_launcher_downloads.png Binary files differdeleted file mode 100644 index f5be21991761..000000000000 --- a/packages/DocumentsUI/res/mipmap-xxxhdpi/ic_launcher_downloads.png +++ /dev/null diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml deleted file mode 100644 index 673c8d4f80dc..000000000000 --- a/packages/DocumentsUI/res/values-af/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Lêers"</string> - <string name="downloads_label" msgid="959113951084633612">"Aflaaie"</string> - <string name="title_open" msgid="4353228937663917801">"Maak oop vanuit"</string> - <string name="title_save" msgid="2433679664882857999">"Stoor na"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nuwe vouer"</string> - <string name="menu_grid" msgid="6878021334497835259">"Roosteraansig"</string> - <string name="menu_list" msgid="7279285939892417279">"Lysaansig"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sorteer volgens"</string> - <string name="menu_search" msgid="3816712084502856974">"Soek"</string> - <string name="menu_settings" msgid="8239065133341597825">"Berginginstellings"</string> - <string name="menu_open" msgid="432922957274920903">"Maak oop"</string> - <string name="menu_save" msgid="2394743337684426338">"Stoor"</string> - <string name="menu_share" msgid="3075149983979628146">"Deel"</string> - <string name="menu_delete" msgid="8138799623850614177">"Vee uit"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Kies alles"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopieer na …"</string> - <string name="menu_move" msgid="1828090633118079817">"Skuif na …"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nuwe venster"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Knip"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopieer"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Plak"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Wys interne berging"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Versteek interne berging"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Wys lêergrootte"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Versteek lêergrootte"</string> - <string name="button_select" msgid="527196987259139214">"Kies"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopieer"</string> - <string name="button_move" msgid="2202666023104202232">"Skuif"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Maak toe"</string> - <string name="button_retry" msgid="4392027584153752797">"Probeer weer"</string> - <string name="sort_name" msgid="9183560467917256779">"Volgens naam"</string> - <string name="sort_date" msgid="586080032956151448">"Volgens datum gewysig"</string> - <string name="sort_size" msgid="3350681319735474741">"Volgens grootte"</string> - <string name="drawer_open" msgid="4545466532430226949">"Wys wortels"</string> - <string name="drawer_close" msgid="7602734368552123318">"Versteek wortels"</string> - <string name="save_error" msgid="6167009778003223664">"Kon nie dokument stoor nie"</string> - <string name="create_error" msgid="3735649141335444215">"Kon nie vouer skep nie"</string> - <string name="query_error" msgid="5999895349602476581">"Kan nie op die oomblik inhoud laai nie"</string> - <string name="root_recent" msgid="4470053704320518133">"Onlangs"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> gratis"</string> - <string name="root_type_service" msgid="2178854894416775409">"Bergingdienste"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Kortpaaie"</string> - <string name="root_type_device" msgid="7121342474653483538">"Toestelle"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Nog programme"</string> - <string name="empty" msgid="7858882803708117596">"Geen items nie"</string> - <string name="no_results" msgid="6622510343880730446">"Geen passings in %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Kan nie lêer oopmaak nie"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Kan sommige dokumente nie uitvee nie"</string> - <string name="share_via" msgid="8966594246261344259">"Deel via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopieer tans lêers"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Skuif tans lêers"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Vee tans lêers uit"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> oor"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Kopieer tans <xliff:g id="COUNT_1">%1$d</xliff:g> lêers.</item> - <item quantity="one">Kopieer tans <xliff:g id="COUNT_0">%1$d</xliff:g> lêer.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Skuif tans <xliff:g id="COUNT_1">%1$d</xliff:g> lêers.</item> - <item quantity="one">Skuif tans <xliff:g id="COUNT_0">%1$d</xliff:g> lêer.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Vee tans <xliff:g id="COUNT_1">%1$d</xliff:g> lêers uit.</item> - <item quantity="one">Vee tans <xliff:g id="COUNT_0">%1$d</xliff:g> lêer uit.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Ontdoen"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Maak tans gereed vir kopieer …"</string> - <string name="move_preparing" msgid="2772219441375531410">"Berei tans voor vir skuif …"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Maak tans gereed om uit te vee …"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Kon <xliff:g id="COUNT_1">%1$d</xliff:g> lêers nie kopieer nie</item> - <item quantity="one">Kon <xliff:g id="COUNT_0">%1$d</xliff:g> lêer nie kopieer nie</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Kon <xliff:g id="COUNT_1">%1$d</xliff:g> lêers nie skuif nie</item> - <item quantity="one">Kon <xliff:g id="COUNT_0">%1$d</xliff:g> lêer nie skuif nie</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Kon <xliff:g id="COUNT_1">%1$d</xliff:g> lêers nie uitvee nie</item> - <item quantity="one">Kon <xliff:g id="COUNT_0">%1$d</xliff:g> lêer nie uitvee nie</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tik om besonderhede te bekyk"</string> - <string name="close" msgid="3043722427445528732">"Maak toe"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Hierdie lêers is nie gekopieer nie: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Hierdie lêers is nie geskuif nie: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Hierdie lêers is nie uitgevee nie: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Hierdie lêers is na \'n ander formaat omgeskakel: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Het <xliff:g id="COUNT_1">%1$d</xliff:g> lêers na die knipbord gekopieer.</item> - <item quantity="one">Het <xliff:g id="COUNT_0">%1$d</xliff:g> lêer na die knipbord gekopieer.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Kan nie die geselekteerde lêers in hierdie ligging plak nie."</string> - <string name="menu_rename" msgid="7678802479104285353">"Hernoem"</string> - <string name="rename_error" msgid="4203041674883412606">"Kon nie dokument hernoem nie"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Maak los"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sommige lêers is omgeskakel"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Gee <xliff:g id="APPNAME"><b>^1</b></xliff:g> toegang tot <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>-gids op <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Gee <xliff:g id="APPNAME"><b>^1</b></xliff:g> toegang tot <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>-gids?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Gee <xliff:g id="APPNAME"><b>^1</b></xliff:g> toegang tot jou data, insluitend foto\'s en video\'s, op <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Moenie weer vra nie"</string> - <string name="allow" msgid="7225948811296386551">"Laat toe"</string> - <string name="deny" msgid="2081879885755434506">"Weier"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> gekies</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> gekies</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> items</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Vee \"<xliff:g id="NAME">%1$s</xliff:g>\" uit?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Vee vouer \"<xliff:g id="NAME">%1$s</xliff:g>\" en sy inhoud uit?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Vee <xliff:g id="COUNT_1">%1$d</xliff:g> lêers uit?</item> - <item quantity="one">Vee <xliff:g id="COUNT_0">%1$d</xliff:g> lêer uit?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Vee <xliff:g id="COUNT_1">%1$d</xliff:g> vouers en hul inhoud uit?</item> - <item quantity="one">Vee <xliff:g id="COUNT_0">%1$d</xliff:g> vouer en sy inhoud uit?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Vee <xliff:g id="COUNT_1">%1$d</xliff:g> items uit?</item> - <item quantity="one">Vee <xliff:g id="COUNT_0">%1$d</xliff:g> item uit?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-am/strings.xml b/packages/DocumentsUI/res/values-am/strings.xml deleted file mode 100644 index cc0016393fc6..000000000000 --- a/packages/DocumentsUI/res/values-am/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ፋይሎች"</string> - <string name="downloads_label" msgid="959113951084633612">"የወረዱ"</string> - <string name="title_open" msgid="4353228937663917801">"ክፈት ከ"</string> - <string name="title_save" msgid="2433679664882857999">"አስቀምጥ ወደ"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"አዲስ አቃፊ"</string> - <string name="menu_grid" msgid="6878021334497835259">"የፍርግርግ እይታ"</string> - <string name="menu_list" msgid="7279285939892417279">"የዝርዝር እይታ"</string> - <string name="menu_sort" msgid="7677740407158414452">"ደርድር በ"</string> - <string name="menu_search" msgid="3816712084502856974">"ፈልግ"</string> - <string name="menu_settings" msgid="8239065133341597825">"የማከማቻ ቅንብሮች"</string> - <string name="menu_open" msgid="432922957274920903">"ክፈት"</string> - <string name="menu_save" msgid="2394743337684426338">"አስቀምጥ"</string> - <string name="menu_share" msgid="3075149983979628146">"አጋራ"</string> - <string name="menu_delete" msgid="8138799623850614177">"ሰርዝ"</string> - <string name="menu_select_all" msgid="8323579667348729928">"ሁሉንም ምረጥ"</string> - <string name="menu_copy" msgid="3612326052677229148">"ቅዳ ወደ…"</string> - <string name="menu_move" msgid="1828090633118079817">"ይውሰዱ ወደ..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"አዲሰ መስኮት"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"ቁረጥ"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"ቅዳ"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"ለጥፍ"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"ውስጣዊ ማከማቻ አሳይ"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"ውስጣዊ ማከማቻ ደብቅ"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"የፋይል መጠን አሳይ"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"የፋይል መጠን ደብቅ"</string> - <string name="button_select" msgid="527196987259139214">"ምረጥ"</string> - <string name="button_copy" msgid="8706475544635021302">"ቅዳ"</string> - <string name="button_move" msgid="2202666023104202232">"አንቀሳቀስ"</string> - <string name="button_dismiss" msgid="3714065566893946085">"አሰናብት"</string> - <string name="button_retry" msgid="4392027584153752797">"እንደገና ይሞክሩ"</string> - <string name="sort_name" msgid="9183560467917256779">"በስም"</string> - <string name="sort_date" msgid="586080032956151448">"በተለወጠበት ቀን"</string> - <string name="sort_size" msgid="3350681319735474741">"በመጠን"</string> - <string name="drawer_open" msgid="4545466532430226949">"ስሮችን አሳይ"</string> - <string name="drawer_close" msgid="7602734368552123318">"ስሮችን ደብቅ"</string> - <string name="save_error" msgid="6167009778003223664">"ሰነድ ማስቀመጥ አልተሳካም"</string> - <string name="create_error" msgid="3735649141335444215">"አቃፊ መፍጠር አልተሳካም"</string> - <string name="query_error" msgid="5999895349602476581">"አሁን ይዘትን መጫን አልተቻለም"</string> - <string name="root_recent" msgid="4470053704320518133">"የቅርብ ጊዜ"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ነፃ"</string> - <string name="root_type_service" msgid="2178854894416775409">"የማከማቻ አገልግሎቶች"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"አቋራጮች"</string> - <string name="root_type_device" msgid="7121342474653483538">"መሣሪያዎች"</string> - <string name="root_type_apps" msgid="8838065367985945189">"ተጨማሪ መተግበሪያዎች"</string> - <string name="empty" msgid="7858882803708117596">"ምንም ንጥሎች የሉም"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s ውስጥ ምንም ተዛማጆች የሉም"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ፋይሉን መክፈት አይቻልም"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"አንዳንድ ሰነዶችን መሰረዝ አልተቻለም"</string> - <string name="share_via" msgid="8966594246261344259">"በሚከተለው በኩል ያጋሩ"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ፋይሎች በመገልበጥ ላይ"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ፋይሎችን በመውሰድ ላይ"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ፋይሎችን በመሰረዝ ላይ"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ቀርቷል"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች በመቅዳት ላይ።</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች በመቅዳት ላይ።</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን በመውሰድ ላይ።</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን በመውሰድ ላይ።</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን በመሰረዝ ላይ።</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን በመሰረዝ ላይ።</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"ቀልብስ"</string> - <string name="copy_preparing" msgid="3896202461003039386">"ቅጂ በማዘጋጀት ላይ…"</string> - <string name="move_preparing" msgid="2772219441375531410">"ለመውሰድ በማዘጋጀት ላይ…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"ለመሰረዝ በመዘጋጀት ላይ…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን መቅዳት አልተቻለም</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን መቅዳት አልተቻለም</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን መውሰድ አልተቻለም</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን መውሰድ አልተቻለም</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን መሰረዝ አልተቻለም</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎችን መሰረዝ አልተቻለም</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"ዝርዝሮችን ለመመልከት መታ ያድርጉ"</string> - <string name="close" msgid="3043722427445528732">"ዝጋ"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"እነዚህ ፋይሎች አልተቀዱም፦ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"እነዚህ ፋይሎች አልተወሰዱም፦ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"እነዚህ ፋይሎች አልተሰረዙም፦ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"እነዚህ ፋይሎች ወደ ሌላ ቅርጸት ተለውጠዋል፦ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች ወደ ቅንጥብ ሰሌዳ ቀድቷል።</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች ወደ ቅንጥብ ሰሌዳ ቀድተዋል።</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"የተመረጡትን ፋይሎች ወደዚህ አካባቢ መለጠፍ አይቻልም።"</string> - <string name="menu_rename" msgid="7678802479104285353">"እንደገና ሰይም"</string> - <string name="rename_error" msgid="4203041674883412606">"ሰነዱን ዳግም መሰየም አልተሳካም"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"አስወጣ"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"አንዳንድ ፋይሎች ተለውጠዋል"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> በ<xliff:g id="STORAGE"><i>^3</i></xliff:g> ላይ የ<xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ማውጫ መደረሻ ይሰጠው?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"የ<xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ማውጫ መዳረሻ ለ<xliff:g id="APPNAME"><b>^1</b></xliff:g> ይሰጠው?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"በ<xliff:g id="STORAGE"><i>^2</i></xliff:g> ላይ ያሉትን ፎቶዎች እና ቪዲዮዎች ጨምሮ የውሂብዎ መዳረሻ ለ<xliff:g id="APPNAME"><b>^1</b></xliff:g> ይሰጥ?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"ዳግም አትጠይቅ"</string> - <string name="allow" msgid="7225948811296386551">"ይፍቀዱ"</string> - <string name="deny" msgid="2081879885755434506">"ያስተባብሉ"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ተመርጠዋል</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ተመርጠዋል</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ንጥሎች</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ንጥሎች</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"«<xliff:g id="NAME">%1$s</xliff:g>» ይሰረዝ?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"አቃፊ «<xliff:g id="NAME">%1$s</xliff:g>» እና ይዘቶቹ ይሰረዙ?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች ይሰረዙ?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ፋይሎች ይሰረዙ?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> አቃፊዎች እና ይዘቶቻቸው ይሰረዙ?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> አቃፊዎች እና ይዘቶቻቸው ይሰረዙ?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ንጥሎች ይሰረዙ?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ንጥሎች ይሰረዙ?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ar/strings.xml b/packages/DocumentsUI/res/values-ar/strings.xml deleted file mode 100644 index ce53e2d591fc..000000000000 --- a/packages/DocumentsUI/res/values-ar/strings.xml +++ /dev/null @@ -1,192 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"الملفات"</string> - <string name="downloads_label" msgid="959113951084633612">"التنزيلات"</string> - <string name="title_open" msgid="4353228937663917801">"فتح من"</string> - <string name="title_save" msgid="2433679664882857999">"حفظ في"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"مجلد جديد"</string> - <string name="menu_grid" msgid="6878021334497835259">"عرض الشبكة"</string> - <string name="menu_list" msgid="7279285939892417279">"عرض القائمة"</string> - <string name="menu_sort" msgid="7677740407158414452">"ترتيب بحسب"</string> - <string name="menu_search" msgid="3816712084502856974">"بحث"</string> - <string name="menu_settings" msgid="8239065133341597825">"إعدادات سعة التخزين"</string> - <string name="menu_open" msgid="432922957274920903">"فتح"</string> - <string name="menu_save" msgid="2394743337684426338">"حفظ"</string> - <string name="menu_share" msgid="3075149983979628146">"مشاركة"</string> - <string name="menu_delete" msgid="8138799623850614177">"حذف"</string> - <string name="menu_select_all" msgid="8323579667348729928">"تحديد الكل"</string> - <string name="menu_copy" msgid="3612326052677229148">"نسخ إلى…"</string> - <string name="menu_move" msgid="1828090633118079817">"نقل إلى..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"نافذة جديدة"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"قص"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"نسخ"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"لصق"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"إظهار وحدة التخزين الداخلية"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"إخفاء وحدة التخزين الداخلية"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"إظهار حجم الملف"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"إخفاء حجم الملف"</string> - <string name="button_select" msgid="527196987259139214">"تحديد"</string> - <string name="button_copy" msgid="8706475544635021302">"نسخ"</string> - <string name="button_move" msgid="2202666023104202232">"نقل"</string> - <string name="button_dismiss" msgid="3714065566893946085">"إزالة"</string> - <string name="button_retry" msgid="4392027584153752797">"إعادة المحاولة"</string> - <string name="sort_name" msgid="9183560467917256779">"بحسب الاسم"</string> - <string name="sort_date" msgid="586080032956151448">"بحسب تاريخ التعديل"</string> - <string name="sort_size" msgid="3350681319735474741">"بحسب الحجم"</string> - <string name="drawer_open" msgid="4545466532430226949">"عرض الجذور"</string> - <string name="drawer_close" msgid="7602734368552123318">"إخفاء الجذور"</string> - <string name="save_error" msgid="6167009778003223664">"أخفق حفظ المستند"</string> - <string name="create_error" msgid="3735649141335444215">"أخفق إنشاء المجلد"</string> - <string name="query_error" msgid="5999895349602476581">"يتعذر تحميل المحتوى في الوقت الحالي"</string> - <string name="root_recent" msgid="4470053704320518133">"الأخيرة"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> خالية"</string> - <string name="root_type_service" msgid="2178854894416775409">"خدمات التخزين"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"اختصارات"</string> - <string name="root_type_device" msgid="7121342474653483538">"أجهزة"</string> - <string name="root_type_apps" msgid="8838065367985945189">"المزيد من التطبيقات"</string> - <string name="empty" msgid="7858882803708117596">"ليس هناك أي عناصر"</string> - <string name="no_results" msgid="6622510343880730446">"لا نتائج مطابقة في %1$s."</string> - <string name="toast_no_application" msgid="4632640357724698144">"يتعذر فتح الملف"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"تعذر حذف بعض المستندات"</string> - <string name="share_via" msgid="8966594246261344259">"مشاركة عبر"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"جارٍ نسخ الملفات"</string> - <string name="move_notification_title" msgid="6193835179777284805">"نقل الملفات"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"جارٍ حذف الملفات"</string> - <string name="copy_remaining" msgid="6283790937387975095">"المدة المتبقية: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="zero">جارٍ نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات.</item> - <item quantity="two">جارٍ نسخ ملفين (<xliff:g id="COUNT_1">%1$d</xliff:g>).</item> - <item quantity="few">جارٍ نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات.</item> - <item quantity="many">جارٍ نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا.</item> - <item quantity="other">جارٍ نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> من الملفات.</item> - <item quantity="one">جارٍ نسخ ملف واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>).</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="zero">لا ملفات <xliff:g id="COUNT_1">%1$d</xliff:g> يجري نقلها.</item> - <item quantity="two">جارٍ نقل ملفين (<xliff:g id="COUNT_1">%1$d</xliff:g>).</item> - <item quantity="few">جارٍ نقل <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات.</item> - <item quantity="many">جارٍ نقل <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا.</item> - <item quantity="other">جارٍ نقل <xliff:g id="COUNT_1">%1$d</xliff:g> من الملفات.</item> - <item quantity="one">جارٍ نقل <xliff:g id="COUNT_0">%1$d</xliff:g> ملف واحد.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="zero">جارٍ حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملف.</item> - <item quantity="two">جارٍ حذف ملفين (<xliff:g id="COUNT_1">%1$d</xliff:g>).</item> - <item quantity="few">جارٍ حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات.</item> - <item quantity="many">جارٍ حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا.</item> - <item quantity="other">جارٍ حذف <xliff:g id="COUNT_1">%1$d</xliff:g> من الملفات.</item> - <item quantity="one">جارٍ حذف <xliff:g id="COUNT_0">%1$d</xliff:g> ملف.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"تراجع"</string> - <string name="copy_preparing" msgid="3896202461003039386">"جارٍ التحضير للنسخ ..."</string> - <string name="move_preparing" msgid="2772219441375531410">"جارٍ التحضير للنقل…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"جارٍ الإعداد للحذف…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="zero">Couldn’t copy <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="two">تعذر نسخ ملفين (<xliff:g id="COUNT_1">%1$d</xliff:g>)</item> - <item quantity="few">تعذر نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات</item> - <item quantity="many">تعذر نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا</item> - <item quantity="other">تعذر نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملف</item> - <item quantity="one">تعذر نسخ ملف (<xliff:g id="COUNT_0">%1$d</xliff:g>)</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="zero">Couldn’t move <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="two">تعذر نقل ملفين (<xliff:g id="COUNT_1">%1$d</xliff:g>)</item> - <item quantity="few">تعذر نقل <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات</item> - <item quantity="many">تعذر نقل <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا</item> - <item quantity="other">تعذر نقل <xliff:g id="COUNT_1">%1$d</xliff:g> ملف</item> - <item quantity="one">تعذر نقل ملف (<xliff:g id="COUNT_0">%1$d</xliff:g>)</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="zero">Couldn’t delete <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="two">تعذر حذف ملفين (<xliff:g id="COUNT_1">%1$d</xliff:g>)</item> - <item quantity="few">تعذر حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات</item> - <item quantity="many">تعذر حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا</item> - <item quantity="other">تعذر حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملف</item> - <item quantity="one">تعذر حذف ملف (<xliff:g id="COUNT_0">%1$d</xliff:g>)</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"انقر لعرض التفاصيل."</string> - <string name="close" msgid="3043722427445528732">"إغلاق"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"لم يتم نسخ هذه الملفات: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"لم يتم نقل هذه الملفات: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"لم يتم حذف هذه الملفات: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"تم تحويل هذه الملفات إلى تنسيق آخر: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="zero">لم يتم نسخ أي ملف (<xliff:g id="COUNT_1">%1$d</xliff:g>) إلى الحافظة.</item> - <item quantity="two">تم نسخ ملفين اثنين (<xliff:g id="COUNT_1">%1$d</xliff:g>) إلى الحافظة.</item> - <item quantity="few">تم نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات إلى الحافظة.</item> - <item quantity="many">تم نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا إلى الحافظة.</item> - <item quantity="other">تم نسخ <xliff:g id="COUNT_1">%1$d</xliff:g> من الملفات إلى الحافظة.</item> - <item quantity="one">تم نسخ ملف واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>) إلى الحافظة.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"يتعذر لصق الملفات المحددة في هذا الموقع."</string> - <string name="menu_rename" msgid="7678802479104285353">"إعادة تسمية"</string> - <string name="rename_error" msgid="4203041674883412606">"أخفقت إعادة تسمية المستند."</string> - <string name="menu_eject_root" msgid="2768224615494227325">"إخراج"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"تم تحويل بعض الملفات"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"هل تريد منح التطبيق <xliff:g id="APPNAME"><b>^1</b></xliff:g> حق الوصول إلى الدليل <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> على <xliff:g id="STORAGE"><i>^3</i></xliff:g>؟"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"هل تريد تمكين <xliff:g id="APPNAME"><b>^1</b></xliff:g> من الدخول إلى دليل <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>؟"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"هل تريد منح <xliff:g id="APPNAME"><b>^1</b></xliff:g> حق الوصول إلى بياناتك، بما في ذلك الصور ومقاطع الفيديو على <xliff:g id="STORAGE"><i>^2</i></xliff:g>؟"</string> - <string name="never_ask_again" msgid="4295278542972859268">"عدم السؤال مرة أخرى"</string> - <string name="allow" msgid="7225948811296386551">"السماح"</string> - <string name="deny" msgid="2081879885755434506">"رفض"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="zero">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="two">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="few">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="many">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">تم تحديد <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">تم تحديد <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> عنصر</item> - <item quantity="two">عنصران (<xliff:g id="COUNT_1">%1$d</xliff:g>)</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> عناصر</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> عنصرًا</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> عنصر</item> - <item quantity="one">عنصر واحد (<xliff:g id="COUNT_0">%1$d</xliff:g>)</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"هل تريد حذف \"<xliff:g id="NAME">%1$s</xliff:g>\"؟"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"هل تريد حذف المجلد \"<xliff:g id="NAME">%1$s</xliff:g>\" ومحتوياته؟"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="zero">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملف؟</item> - <item quantity="two">هل تريد حذف ملفين (<xliff:g id="COUNT_1">%1$d</xliff:g>)؟</item> - <item quantity="few">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملفات؟</item> - <item quantity="many">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملفًا؟</item> - <item quantity="other">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> ملف؟</item> - <item quantity="one">هل تريد حذف <xliff:g id="COUNT_0">%1$d</xliff:g> ملف؟</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="zero">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> مجلد ومحتوياته؟</item> - <item quantity="two">هل تريد حذف مجلدين (<xliff:g id="COUNT_1">%1$d</xliff:g>) ومحتوياتهما؟</item> - <item quantity="few">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> مجلدات ومحتوياتها؟</item> - <item quantity="many">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> مجلدًا ومحتويات هذه المجلدات؟</item> - <item quantity="other">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> مجلد ومحتويات هذه المجلدات؟</item> - <item quantity="one">هل تريد حذف <xliff:g id="COUNT_0">%1$d</xliff:g> مجلد ومحتوياته؟</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="zero">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> عنصر؟</item> - <item quantity="two">هل تريد حذف عنصرين (<xliff:g id="COUNT_1">%1$d</xliff:g>)؟</item> - <item quantity="few">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> عناصر؟</item> - <item quantity="many">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> عنصرًا؟</item> - <item quantity="other">هل تريد حذف <xliff:g id="COUNT_1">%1$d</xliff:g> عنصر؟</item> - <item quantity="one">هل تريد حذف <xliff:g id="COUNT_0">%1$d</xliff:g> عنصر؟</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-az-rAZ/strings.xml b/packages/DocumentsUI/res/values-az-rAZ/strings.xml deleted file mode 100644 index f064feb9042d..000000000000 --- a/packages/DocumentsUI/res/values-az-rAZ/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fayllar"</string> - <string name="downloads_label" msgid="959113951084633612">"Endirmələr"</string> - <string name="title_open" msgid="4353228937663917801">"Vasitəsilə açın"</string> - <string name="title_save" msgid="2433679664882857999">"buraya saxlayın"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Yeni qovluq"</string> - <string name="menu_grid" msgid="6878021334497835259">"Torlu görünüş"</string> - <string name="menu_list" msgid="7279285939892417279">"Siyahı görünüşü"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sıralayın"</string> - <string name="menu_search" msgid="3816712084502856974">"Axtarış"</string> - <string name="menu_settings" msgid="8239065133341597825">"Yaddaş ayarları"</string> - <string name="menu_open" msgid="432922957274920903">"Açın"</string> - <string name="menu_save" msgid="2394743337684426338">"Yadda saxlayın"</string> - <string name="menu_share" msgid="3075149983979628146">"Paylaşın"</string> - <string name="menu_delete" msgid="8138799623850614177">"Sil"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Hamısını seçin"</string> - <string name="menu_copy" msgid="3612326052677229148">"Buraya kopyalayın:"</string> - <string name="menu_move" msgid="1828090633118079817">"Daşıyın..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Yeni pəncərə"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Kəsin"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopyalayın"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Yerləşdirin"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Daxili yaddaşı göstərin"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Daxili yaddaşı gizlədin"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Fayl ölçüsünü göstərin"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Fayl ölçüsünü gizlədin"</string> - <string name="button_select" msgid="527196987259139214">"Seçin"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopyala"</string> - <string name="button_move" msgid="2202666023104202232">"Köçürün"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Rədd edin"</string> - <string name="button_retry" msgid="4392027584153752797">"Yenidən cəhd edin"</string> - <string name="sort_name" msgid="9183560467917256779">"Ad üzrə"</string> - <string name="sort_date" msgid="586080032956151448">"Tarix üzrə dəyişmiş"</string> - <string name="sort_size" msgid="3350681319735474741">"Ölçü üzrə"</string> - <string name="drawer_open" msgid="4545466532430226949">"Kökləri göstərin"</string> - <string name="drawer_close" msgid="7602734368552123318">"Kökləri gizlədin"</string> - <string name="save_error" msgid="6167009778003223664">"Sənədi yadda saxlaya bilmədi"</string> - <string name="create_error" msgid="3735649141335444215">"Qovluq yaradıla bilmədi"</string> - <string name="query_error" msgid="5999895349602476581">"Məzmun hazırda yüklənmir"</string> - <string name="root_recent" msgid="4470053704320518133">"Son"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ödənişsiz"</string> - <string name="root_type_service" msgid="2178854894416775409">"Saxlama xidmətləri"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Qısa yollar"</string> - <string name="root_type_device" msgid="7121342474653483538">"Cihazlar"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Digər tətbiqlər"</string> - <string name="empty" msgid="7858882803708117596">"Heç nə yoxdur"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s ilə heç bir uyğunluq yoxdur"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Fayl açılmır"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Bəzi sənədləri silə bilmir"</string> - <string name="share_via" msgid="8966594246261344259">"Bunun vasitəsilə paylaş:"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Fayllar kopyalanır"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Fayllar köçürülür"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Fayllar silinir"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> qalıb"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fayl kopyalanır.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fayl kopyalanır.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fayl köçürülür.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fayl köçürülür.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fayl silinir.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fayl silinir.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Ləğv edin"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Kopyalanmaq üçün hazırlanır ..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Köçürmə üçün hazırlanır..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Silmək üçün hazırlanır..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> fayl kopyalanmadı</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> fayl kopyalanmadı</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> fayl köçürülmədi</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> fayl köçürülmədi</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> fayl silinmədi</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> fayl silinmədi</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Detallara baxmaq üçün basın"</string> - <string name="close" msgid="3043722427445528732">"Bağla"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Bu fayllar kopyalanmadı: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Bu fayllar köçürülmədi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Bu fayllar silinmədi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Bu fayllar başqa formata konvertasiya edilib: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fayl buferə kopyalandı.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fayl buferə kopyalandı.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Seçilmiş faylları bu məkana yerləşdirmək olmaz."</string> - <string name="menu_rename" msgid="7678802479104285353">"Adını dəyişdirin"</string> - <string name="rename_error" msgid="4203041674883412606">"Sənəd adını dəyişmək uğursuz oldu"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Çıxarın"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Bəzi fayllar konvertasiya edilib"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="STORAGE"><i>^3</i></xliff:g> yaddaşında <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> kataloquna <xliff:g id="APPNAME"><b>^1</b></xliff:g> girişi təqdim edilsin?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g> kataloquna <xliff:g id="APPNAME"><b>^1</b></xliff:g> girişi təqdim edilsin?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g> yaddaşında foto və videolar daxil olmaqla datanıza <xliff:g id="APPNAME"><b>^1</b></xliff:g> girişi təmin edilsin?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Bir daha soruşmayın"</string> - <string name="allow" msgid="7225948811296386551">"İcazə verin"</string> - <string name="deny" msgid="2081879885755434506">"Rədd et"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> seçilib</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> seçilib</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> element</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> element</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" silinsin?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" qovluğu və onun məzmunu silinsin?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> fayl silinsin?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fayl silinsin?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> qovluq və onun məzmunu silinsin?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> qovluq və onun məzmunu silinsin?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> element silinsin?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> element silinsin?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml b/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml deleted file mode 100644 index 14884669374c..000000000000 --- a/packages/DocumentsUI/res/values-b+sr+Latn/strings.xml +++ /dev/null @@ -1,156 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Datoteke"</string> - <string name="downloads_label" msgid="959113951084633612">"Preuzimanja"</string> - <string name="title_open" msgid="4353228937663917801">"Otvori sa"</string> - <string name="title_save" msgid="2433679664882857999">"Sačuvaj u"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Novi direktorijum"</string> - <string name="menu_grid" msgid="6878021334497835259">"Prikaz mreže"</string> - <string name="menu_list" msgid="7279285939892417279">"Prikaz liste"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortiraj prema"</string> - <string name="menu_search" msgid="3816712084502856974">"Pretraži"</string> - <string name="menu_settings" msgid="8239065133341597825">"Podešavanja memorije"</string> - <string name="menu_open" msgid="432922957274920903">"Otvori"</string> - <string name="menu_save" msgid="2394743337684426338">"Sačuvaj"</string> - <string name="menu_share" msgid="3075149983979628146">"Deli"</string> - <string name="menu_delete" msgid="8138799623850614177">"Izbriši"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Izaberi sve"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiraj na..."</string> - <string name="menu_move" msgid="1828090633118079817">"Premesti u..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Novi prozor"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Iseci"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiraj"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Nalepi"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Prikaži internu memoriju"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Sakrij internu memoriju"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Prikaži veličinu datoteke"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Sakrij veličinu datoteke"</string> - <string name="button_select" msgid="527196987259139214">"Izaberi"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiraj"</string> - <string name="button_move" msgid="2202666023104202232">"Premesti"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Odbaci"</string> - <string name="button_retry" msgid="4392027584153752797">"Pokušaj ponovo"</string> - <string name="sort_name" msgid="9183560467917256779">"Prema imenu"</string> - <string name="sort_date" msgid="586080032956151448">"Prema datumu izmene"</string> - <string name="sort_size" msgid="3350681319735474741">"Prema veličini"</string> - <string name="drawer_open" msgid="4545466532430226949">"Prikaži osnovne elemente"</string> - <string name="drawer_close" msgid="7602734368552123318">"Sakrij osnovne elemente"</string> - <string name="save_error" msgid="6167009778003223664">"Čuvanje dokumenta nije uspelo"</string> - <string name="create_error" msgid="3735649141335444215">"Direktorijum nije napravljen"</string> - <string name="query_error" msgid="5999895349602476581">"Učitavanje sadržaja trenutno nije moguće"</string> - <string name="root_recent" msgid="4470053704320518133">"Nedavno"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Slobodno je <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Usluge skladištenja"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Prečice"</string> - <string name="root_type_device" msgid="7121342474653483538">"Uređaji"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Još aplikacija"</string> - <string name="empty" msgid="7858882803708117596">"Nema stavki"</string> - <string name="no_results" msgid="6622510343880730446">"Nema podudaranja u %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Otvaranje datoteke nije uspelo"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Nije moguće izbrisati neke dokumente"</string> - <string name="share_via" msgid="8966594246261344259">"Delite preko"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopiranje datoteka"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Datoteke se premeštaju"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Datoteke se brišu"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Još <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="few">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="other">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Premešta se <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> - <item quantity="few">Premeštaju se <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="other">Premešta se <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Briše se <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> - <item quantity="few">Brišu se <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="other">Briše se <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Opozovi"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Priprema se kopiranje…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Priprema se premeštanje..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Priprema se brisanje…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Nismo uspeli da kopiramo <xliff:g id="COUNT_1">%1$d</xliff:g> datoteku</item> - <item quantity="few">Nismo uspeli da kopiramo <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke</item> - <item quantity="other">Nismo uspeli da kopiramo <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Premeštanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nije uspelo</item> - <item quantity="few">Premeštanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nije uspelo</item> - <item quantity="other">Premeštanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije uspelo</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Brisanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nije uspelo</item> - <item quantity="few">Brisanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nije uspelo</item> - <item quantity="other">Brisanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije uspelo</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Dodirnite da biste prikazali detalje"</string> - <string name="close" msgid="3043722427445528732">"Zatvori"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Sledeće datoteke nisu kopirane: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Sledeće datoteke nisu premeštene: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Sledeće datoteke nisu izbrisane: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ove datoteke su konvertovane u drugi format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">Kopirali ste <xliff:g id="COUNT_1">%1$d</xliff:g> datoteku u privremenu memoriju.</item> - <item quantity="few">Kopirali ste <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke u privremenu memoriju.</item> - <item quantity="other">Kopirali ste <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka u privremenu memoriju.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Izabrane datoteke ne mogu da se nalepe na ovoj lokaciji."</string> - <string name="menu_rename" msgid="7678802479104285353">"Preimenuj"</string> - <string name="rename_error" msgid="4203041674883412606">"Preimenovanje dokumenta nije uspelo"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Izbaci"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Neke datoteke su konvertovane"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Želite li da aplikaciji <xliff:g id="APPNAME"><b>^1</b></xliff:g> odobrite pristup direktorijumu <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> na memorijskom prostoru <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Želite da dozvolite da <xliff:g id="APPNAME"><b>^1</b></xliff:g> pristupa direktorijumu <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Želite da li da dozvolite da aplikacija <xliff:g id="APPNAME"><b>^1</b></xliff:g> pristupa podacima, uključujući slike i video snimke, na lokaciji <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ne pitaj ponovo"</string> - <string name="allow" msgid="7225948811296386551">"Dozvoli"</string> - <string name="deny" msgid="2081879885755434506">"Odbij"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one">Izabrana je <xliff:g id="COUNT_1">%1$d</xliff:g> stavka</item> - <item quantity="few">Izabrane su <xliff:g id="COUNT_1">%1$d</xliff:g> stavke</item> - <item quantity="other">Izabrano je <xliff:g id="COUNT_1">%1$d</xliff:g> stavki</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> stavka</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> stavke</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> stavki</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Želite li da izbrišete „<xliff:g id="NAME">%1$s</xliff:g>“?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Želite li da izbrišete direktorijum „<xliff:g id="NAME">%1$s</xliff:g>“ i njegov sadržaj?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Želite li da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> datoteku?</item> - <item quantity="few">Želite li da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke?</item> - <item quantity="other">Želite li da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Želite li da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> direktorijum i njihov sadržaj?</item> - <item quantity="few">Želite li da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> direktorijuma i njihov sadržaj?</item> - <item quantity="other">Želite li da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> direktorijuma i njihov sadržaj?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Želite li da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> stavku?</item> - <item quantity="few">Želite li da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> stavke?</item> - <item quantity="other">Želite li da izbrišete <xliff:g id="COUNT_1">%1$d</xliff:g> stavki?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-be-rBY/strings.xml b/packages/DocumentsUI/res/values-be-rBY/strings.xml deleted file mode 100644 index 2fb069e6e9b0..000000000000 --- a/packages/DocumentsUI/res/values-be-rBY/strings.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Файлы"</string> - <string name="downloads_label" msgid="959113951084633612">"Спампоўкі"</string> - <string name="title_open" msgid="4353228937663917801">"Адкрыць з"</string> - <string name="title_save" msgid="2433679664882857999">"Захаваць у"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Новая папка"</string> - <string name="menu_grid" msgid="6878021334497835259">"У выглядзе табліцы"</string> - <string name="menu_list" msgid="7279285939892417279">"У выглядзе спіса"</string> - <string name="menu_sort" msgid="7677740407158414452">"Сартаваць па:"</string> - <string name="menu_search" msgid="3816712084502856974">"Шукаць"</string> - <string name="menu_settings" msgid="8239065133341597825">"Налады сховішча"</string> - <string name="menu_open" msgid="432922957274920903">"Адкрыць"</string> - <string name="menu_save" msgid="2394743337684426338">"Захаваць"</string> - <string name="menu_share" msgid="3075149983979628146">"Абагуліць"</string> - <string name="menu_delete" msgid="8138799623850614177">"Выдаліць"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Выбраць усё"</string> - <string name="menu_copy" msgid="3612326052677229148">"Капіраваць у..."</string> - <string name="menu_move" msgid="1828090633118079817">"Перамясціць у..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Новае акно"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Выразаць"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Капіраваць"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Уставіць"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Паказаць унутр. сховішча"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Схаваць унутр. сховішча"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Паказаць памеры файлаў"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Схаваць памеры файлаў"</string> - <string name="button_select" msgid="527196987259139214">"Выбраць"</string> - <string name="button_copy" msgid="8706475544635021302">"Капіраваць"</string> - <string name="button_move" msgid="2202666023104202232">"Перамясціць"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Адхіліць"</string> - <string name="button_retry" msgid="4392027584153752797">"Паўтарыце спробу"</string> - <string name="sort_name" msgid="9183560467917256779">"Па назве"</string> - <string name="sort_date" msgid="586080032956151448">"Па даце змянення"</string> - <string name="sort_size" msgid="3350681319735474741">"Па памеры"</string> - <string name="drawer_open" msgid="4545466532430226949">"Паказаць каранёвыя папкі"</string> - <string name="drawer_close" msgid="7602734368552123318">"Схаваць каранёвыя папкі"</string> - <string name="save_error" msgid="6167009778003223664">"Не атрымалася захаваць дакумент"</string> - <string name="create_error" msgid="3735649141335444215">"Не атрымалася стварыць папку"</string> - <string name="query_error" msgid="5999895349602476581">"Зараз немагчыма загрузіць змесціва"</string> - <string name="root_recent" msgid="4470053704320518133">"Нядаўнія"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> свабодна"</string> - <string name="root_type_service" msgid="2178854894416775409">"Службы захоўвання"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Ярлыкі"</string> - <string name="root_type_device" msgid="7121342474653483538">"Прылады"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Іншыя праграмы"</string> - <string name="empty" msgid="7858882803708117596">"Няма элементаў"</string> - <string name="no_results" msgid="6622510343880730446">"Няма супадзенняў у %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Немагчыма адкрыць файл"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Немагчыма выдаліць некаторыя дакументы"</string> - <string name="share_via" msgid="8966594246261344259">"Абагуліць праз"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Капіраванне файлаў"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Перамяшчэнне файлаў"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Выдаленне файлаў"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Засталося <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Капіраванне <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - <item quantity="few">Капіраванне <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў.</item> - <item quantity="many">Капіраванне <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў.</item> - <item quantity="other">Капіраванне <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Перамяшчэнне <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - <item quantity="few">Перамяшчэнне <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў.</item> - <item quantity="many">Перамяшчэнне <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў.</item> - <item quantity="other">Перамяшчэнне <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Выдаленне <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - <item quantity="few">Выдаленне <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў.</item> - <item quantity="many">Выдаленне <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў.</item> - <item quantity="other">Выдаленне <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Адрабіць"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Падрыхтоўка да капіравання..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Падрыхтоўка да перамяшчэння..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Падрыхтоўка да выдалення..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Не атрымалася скапіраваць <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Не атрымалася скапіраваць <xliff:g id="COUNT_1">%1$d</xliff:g> файлы</item> - <item quantity="many">Не атрымалася скапіраваць <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў</item> - <item quantity="other">Не атрымалася скапіраваць <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Не атрымалася перамясціць <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Не атрымалася перамясціць <xliff:g id="COUNT_1">%1$d</xliff:g> файлы</item> - <item quantity="many">Не атрымалася перамясціць <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў</item> - <item quantity="other">Не атрымалася перамясціць <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Не атрымалася выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Не атрымалася выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> файлы</item> - <item quantity="many">Не атрымалася выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў</item> - <item quantity="other">Не атрымалася выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Дакраніцеся, каб прагледзець больш падрабязна"</string> - <string name="close" msgid="3043722427445528732">"Закрыць"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Не былі скапіраваны наступныя файлы: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Не былі перамешчаны наступныя файлы: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Не былі выдалены наступныя файлы: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Гэтыя файлы былі сканвертаваныя ў іншы фармат: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">У буфер абмену скапіраваны <xliff:g id="COUNT_1">%1$d</xliff:g> файл.</item> - <item quantity="few">У буфер абмену скапіраваны <xliff:g id="COUNT_1">%1$d</xliff:g> файлы.</item> - <item quantity="many">У буфер абмену скапіравана <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў.</item> - <item quantity="other">У буфер абмену скапіравана <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Немагчыма ўставіць выбраныя файлы ў гэта месца."</string> - <string name="menu_rename" msgid="7678802479104285353">"Перайменаваць"</string> - <string name="rename_error" msgid="4203041674883412606">"Не атрымалася перайменаваць дакумент"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Выняць"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Некаторыя файлы былі сканвертаваныя"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Даць праграме <xliff:g id="APPNAME"><b>^1</b></xliff:g> доступ да дырэкторыі <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> у <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Даць праграме <xliff:g id="APPNAME"><b>^1</b></xliff:g> доступ да каталога <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Даць <xliff:g id="APPNAME"><b>^1</b></xliff:g> доступ да вашых даных, у тым ліку фатаграфій і відэа, на <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Больш не пытацца"</string> - <string name="allow" msgid="7225948811296386551">"Дазволіць"</string> - <string name="deny" msgid="2081879885755434506">"Адмовіць"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one">Выбраны <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="few">Выбраны <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="many">Выбрана <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Выбрана <xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> элемент</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> элементы</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> элементаў</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> элемента</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Выдаліць \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Выдаліць папку \"<xliff:g id="NAME">%1$s</xliff:g>\" і яе змесціва?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> файл?</item> - <item quantity="few">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> файлы?</item> - <item quantity="many">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> файлаў?</item> - <item quantity="other">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> файла?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> папку і іх змесціва?</item> - <item quantity="few">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> папкі і іх змесціва?</item> - <item quantity="many">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> папак і іх змесціва?</item> - <item quantity="other">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> папкі і іх змесціва?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> элемент?</item> - <item quantity="few">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> элементы?</item> - <item quantity="many">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> элементаў?</item> - <item quantity="other">Выдаліць <xliff:g id="COUNT_1">%1$d</xliff:g> элемента?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml deleted file mode 100644 index ab9d228e1a5e..000000000000 --- a/packages/DocumentsUI/res/values-bg/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Файлове"</string> - <string name="downloads_label" msgid="959113951084633612">"Изтегляния"</string> - <string name="title_open" msgid="4353228937663917801">"Отваряне от"</string> - <string name="title_save" msgid="2433679664882857999">"Запазване във:"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Нова папка"</string> - <string name="menu_grid" msgid="6878021334497835259">"Изглед в мрежа"</string> - <string name="menu_list" msgid="7279285939892417279">"Списъчен изглед"</string> - <string name="menu_sort" msgid="7677740407158414452">"Сортиране по"</string> - <string name="menu_search" msgid="3816712084502856974">"Търсене"</string> - <string name="menu_settings" msgid="8239065133341597825">"Настройки на хранилището"</string> - <string name="menu_open" msgid="432922957274920903">"Отваряне"</string> - <string name="menu_save" msgid="2394743337684426338">"Запазване"</string> - <string name="menu_share" msgid="3075149983979628146">"Споделяне"</string> - <string name="menu_delete" msgid="8138799623850614177">"Изтриване"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Избиране на всичко"</string> - <string name="menu_copy" msgid="3612326052677229148">"Копиране във…"</string> - <string name="menu_move" msgid="1828090633118079817">"Преместване във…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Нов прозорец"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Изрязване"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Копиране"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Поставяне"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Вътр. хранилище: Показв."</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Вътр. хранилище: Скрив."</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Размер на файла: Показв."</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Размер на файла: Скрив."</string> - <string name="button_select" msgid="527196987259139214">"Избиране"</string> - <string name="button_copy" msgid="8706475544635021302">"Копиране"</string> - <string name="button_move" msgid="2202666023104202232">"Преместване"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Отхвърляне"</string> - <string name="button_retry" msgid="4392027584153752797">"Нов опит"</string> - <string name="sort_name" msgid="9183560467917256779">"По име"</string> - <string name="sort_date" msgid="586080032956151448">"По дата на промяната"</string> - <string name="sort_size" msgid="3350681319735474741">"По размер"</string> - <string name="drawer_open" msgid="4545466532430226949">"Показване на основните елементи"</string> - <string name="drawer_close" msgid="7602734368552123318">"Скриване на основните елементи"</string> - <string name="save_error" msgid="6167009778003223664">"Запазването на документа не бе успешно"</string> - <string name="create_error" msgid="3735649141335444215">"Създаването на папката не бе успешно"</string> - <string name="query_error" msgid="5999895349602476581">"Понастоящем съдържанието не може да се зареди"</string> - <string name="root_recent" msgid="4470053704320518133">"Скорошни"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Свободно: <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Услуги за съхранение"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Преки пътища"</string> - <string name="root_type_device" msgid="7121342474653483538">"Устройства"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Още приложения"</string> - <string name="empty" msgid="7858882803708117596">"Няма елементи"</string> - <string name="no_results" msgid="6622510343880730446">"В/ъв „%1$s“ няма съответствия"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Файлът не може да се отвори"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Някои документи не могат да бъдат изтрити"</string> - <string name="share_via" msgid="8966594246261344259">"Споделяне чрез"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Файловете се копират"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Файловете се преместват"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Изтриване на файлове"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Оставащо време: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Копират се <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - <item quantity="one">Копира се <xliff:g id="COUNT_0">%1$d</xliff:g> файл.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файла се преместват.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл се премества.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Изтриват се <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - <item quantity="one">Изтрива се <xliff:g id="COUNT_0">%1$d</xliff:g> файл.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Отмяна"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Подготвя се за копиране…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Преместването се подготвя…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Подготвя се за изтриване..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файла не можаха да се копират</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл не можа да се копира</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файла не можаха да бъдат преместени</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл не можа да бъде преместен</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файла не можаха да бъдат изтрити</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл не можа да бъде изтрит</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Докоснете, за да видите подробности"</string> - <string name="close" msgid="3043722427445528732">"Затваряне"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Следните файлове не бяха копирани: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Следните файлове не бяха преместени: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Следните файлове не бяха изтрити: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Следните файлове бяха преобразувани в друг формат: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Копирахте <xliff:g id="COUNT_1">%1$d</xliff:g> файла в буферната памет.</item> - <item quantity="one">Копирахте <xliff:g id="COUNT_0">%1$d</xliff:g> файл в буферната памет.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Избраните файлове не могат да се поставят на това място."</string> - <string name="menu_rename" msgid="7678802479104285353">"Преименуване"</string> - <string name="rename_error" msgid="4203041674883412606">"Преименуването на документа не бе успешно"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Изваждане"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Някои файлове бяха преобразувани"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Да се предостави ли на <xliff:g id="APPNAME"><b>^1</b></xliff:g> достъп до директорията „<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>“ в/ъв <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Да се предостави ли на <xliff:g id="APPNAME"><b>^1</b></xliff:g> достъп до директорията „<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>“?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Да се предостави ли на <xliff:g id="APPNAME"><b>^1</b></xliff:g> достъп до данните ви в хранилището (<xliff:g id="STORAGE"><i>^2</i></xliff:g>), включително снимки и видеоклипове?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Без повторно питане"</string> - <string name="allow" msgid="7225948811296386551">"Разрешаване"</string> - <string name="deny" msgid="2081879885755434506">"Отказване"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">Избрахте <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">Избрахте <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> елемента</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> елемент</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Искате ли да изтриете „<xliff:g id="NAME">%1$s</xliff:g>“?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Искате ли да изтриете папката „<xliff:g id="NAME">%1$s</xliff:g>“ и съдържанието в нея?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Искате ли да изтриете <xliff:g id="COUNT_1">%1$d</xliff:g> файла?</item> - <item quantity="one">Искате ли да изтриете <xliff:g id="COUNT_0">%1$d</xliff:g> файл?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Искате ли да изтриете <xliff:g id="COUNT_1">%1$d</xliff:g> папки и съдържанието в тях?</item> - <item quantity="one">Искате ли да изтриете <xliff:g id="COUNT_0">%1$d</xliff:g> папка и съдържанието в нея?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Искате ли да изтриете <xliff:g id="COUNT_1">%1$d</xliff:g> елемента?</item> - <item quantity="one">Искате ли да изтриете <xliff:g id="COUNT_0">%1$d</xliff:g> елемент?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-bn-rBD/strings.xml b/packages/DocumentsUI/res/values-bn-rBD/strings.xml deleted file mode 100644 index 3b2171d5c6e6..000000000000 --- a/packages/DocumentsUI/res/values-bn-rBD/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ফাইল"</string> - <string name="downloads_label" msgid="959113951084633612">"ডাউনলোডগুলি"</string> - <string name="title_open" msgid="4353228937663917801">"এখান থেকে খুলুন"</string> - <string name="title_save" msgid="2433679664882857999">"এতে সংরক্ষণ করুন"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"নতুন ফোল্ডার"</string> - <string name="menu_grid" msgid="6878021334497835259">"গ্রিড দৃশ্য"</string> - <string name="menu_list" msgid="7279285939892417279">"তালিকা দৃশ্য"</string> - <string name="menu_sort" msgid="7677740407158414452">"এই অনুসারে বাছুন"</string> - <string name="menu_search" msgid="3816712084502856974">"অনুসন্ধান করুন"</string> - <string name="menu_settings" msgid="8239065133341597825">"সঞ্চয়স্থান সেটিংস"</string> - <string name="menu_open" msgid="432922957274920903">"খুলুন"</string> - <string name="menu_save" msgid="2394743337684426338">"সংরক্ষণ করুন"</string> - <string name="menu_share" msgid="3075149983979628146">"শেয়ার করুন"</string> - <string name="menu_delete" msgid="8138799623850614177">"মুছুন"</string> - <string name="menu_select_all" msgid="8323579667348729928">"সবগুলি নির্বাচন করুন"</string> - <string name="menu_copy" msgid="3612326052677229148">"এতে কপি করুন…"</string> - <string name="menu_move" msgid="1828090633118079817">"এতে সরান..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"নতুন উইন্ডো"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"কাট করুন"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"প্রতিলিপি করুন"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"আটকান"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"অভ্যন্তরীণ সঞ্চয়স্থান দেখান"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"অভ্যন্তরীণ সঞ্চয়স্থান লুকান"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ফাইলের আকার দেখান"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ফাইলের আকার লুকান"</string> - <string name="button_select" msgid="527196987259139214">"নির্বাচন করুন"</string> - <string name="button_copy" msgid="8706475544635021302">"কপি করুন"</string> - <string name="button_move" msgid="2202666023104202232">"সরান"</string> - <string name="button_dismiss" msgid="3714065566893946085">"খারিজ করুন"</string> - <string name="button_retry" msgid="4392027584153752797">"আবার চেষ্টা করুন"</string> - <string name="sort_name" msgid="9183560467917256779">"নামের দ্বারা"</string> - <string name="sort_date" msgid="586080032956151448">"পরিবর্তনের তারিখ দ্বারা"</string> - <string name="sort_size" msgid="3350681319735474741">"আকার অনুযায়ী"</string> - <string name="drawer_open" msgid="4545466532430226949">"রুটগুলি দেখান"</string> - <string name="drawer_close" msgid="7602734368552123318">"রুটগুলি লুকান"</string> - <string name="save_error" msgid="6167009778003223664">"দস্তাবেজ সংরক্ষণ করতে ব্যর্থ হয়েছে"</string> - <string name="create_error" msgid="3735649141335444215">"ফোল্ডার তৈরি করতে ব্যর্থ হয়েছে"</string> - <string name="query_error" msgid="5999895349602476581">"এই মুহূর্তে সামগ্রী লোড করা যাবে না"</string> - <string name="root_recent" msgid="4470053704320518133">"সাম্প্রতিক"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> খালি আছে"</string> - <string name="root_type_service" msgid="2178854894416775409">"সঞ্চয়স্থান পরিষেবাগুলি"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"শর্টকাটগুলি"</string> - <string name="root_type_device" msgid="7121342474653483538">"ডিভাইসগুলি"</string> - <string name="root_type_apps" msgid="8838065367985945189">"আরো অ্যাপ্লিকেশান"</string> - <string name="empty" msgid="7858882803708117596">"কোনো আইটেম নেই"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s এ কোনো মিল নেই"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ফাইল খোলা যাবে না"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"কিছু দস্তাবেজ মুছতে অসমর্থ"</string> - <string name="share_via" msgid="8966594246261344259">"এর মাধ্যমে শেয়ার করুন"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ফাইলগুলি অনুলিপি করা হচ্ছে"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ফাইলগুলি সরানো হচ্ছে"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ফাইলগুলি মোছা হচ্ছে"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> বাকি"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল অনুলিপি করা হচ্ছে৷</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল অনুলিপি করা হচ্ছে৷</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল সরানো হচ্ছে৷</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল সরানো হচ্ছে৷</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল মোছা হচ্ছে।</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল মোছা হচ্ছে।</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"পূর্বাবস্থায় ফিরুন"</string> - <string name="copy_preparing" msgid="3896202461003039386">"অনুলিপি করার জন্য প্রস্তুত করা হচ্ছে..."</string> - <string name="move_preparing" msgid="2772219441375531410">"সরানোর জন্য প্রস্তুত হচ্ছে..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"মোছার জন্য প্রস্তুত করা হচ্ছে..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল প্রতিলিপি করা গেল না</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল প্রতিলিপি করা গেল না</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল সরানো গেল না</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল সরানো গেল না</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল মোছা গেল না</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল মোছা গেল না</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"বিশদ বিবরণ দেখতে আলতো চাপুন"</string> - <string name="close" msgid="3043722427445528732">"বন্ধ করুন"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"এই ফাইলগুলির প্রতিলিপি করা হয়নি: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"এই ফাইলগুলি সরানো হয়নি: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"এই ফাইলগুলি মোছা হয়নি: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"এই ফাইলগুলি অন্য ফরম্যাটে রূপান্তর করা হয়েছে: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল ক্লিপবোর্ডে প্রতিলিপি করা হয়েছে।</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল ক্লিপবোর্ডে প্রতিলিপি করা হয়েছে।</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"এই স্থানে নির্বাচিত ফাইলগুলি আটকানো যাবে না।"</string> - <string name="menu_rename" msgid="7678802479104285353">"পুনঃনামকরণ"</string> - <string name="rename_error" msgid="4203041674883412606">"দস্তাবেজের পুনঃনামকরণ ব্যর্থ হয়েছে৷"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"সরিয়ে দিন"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"কিছু ফাইল রূপান্তরিত হয়েছে"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> কে <xliff:g id="STORAGE"><i>^3</i></xliff:g> এ <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> সংগ্রহ অ্যাক্সেস করার মঞ্জুরি দিতে চান?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> কে <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> সংগ্রহ অ্যাক্সেস করার অনুমতি দেবেন?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g> এ থাকা ফটো ও ভিডিওগুলি সমেত <xliff:g id="APPNAME"><b>^1</b></xliff:g> কে আপনার ডেটা অ্যাক্সেস করার অনুমতি দেবেন?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"আর জিজ্ঞাসা করবেন না"</string> - <string name="allow" msgid="7225948811296386551">"অনুমতি দিন"</string> - <string name="deny" msgid="2081879885755434506">"আস্বীকার করুন"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি নির্বাচন করা হয়েছে</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি নির্বাচন করা হয়েছে</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি আইটেম</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি আইটেম</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" মুছবেন?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ফোল্ডার এবং এটির সামগ্রীগুলিকে মুছবেন?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল মুছবেন?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফাইল মুছবেন?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফোল্ডার এবং সেগুলির সামগ্রী মুছবেন?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি ফোল্ডার এবং সেগুলির সামগ্রী মুছবেন?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>টি আইটেম মুছবেন?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>টি আইটেম মুছবেন?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-bs-rBA/strings.xml b/packages/DocumentsUI/res/values-bs-rBA/strings.xml deleted file mode 100644 index 5df3e53441c6..000000000000 --- a/packages/DocumentsUI/res/values-bs-rBA/strings.xml +++ /dev/null @@ -1,156 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fajlovi"</string> - <string name="downloads_label" msgid="959113951084633612">"Preuzimanja"</string> - <string name="title_open" msgid="4353228937663917801">"Otvori iz"</string> - <string name="title_save" msgid="2433679664882857999">"Sačuvaj u"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nova fascikla"</string> - <string name="menu_grid" msgid="6878021334497835259">"Prikaz u vidu mreže"</string> - <string name="menu_list" msgid="7279285939892417279">"Prikaz u vidu liste"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortiraj po"</string> - <string name="menu_search" msgid="3816712084502856974">"Traži"</string> - <string name="menu_settings" msgid="8239065133341597825">"Postavke pohrane"</string> - <string name="menu_open" msgid="432922957274920903">"Otvori"</string> - <string name="menu_save" msgid="2394743337684426338">"Sačuvaj"</string> - <string name="menu_share" msgid="3075149983979628146">"Podijeli"</string> - <string name="menu_delete" msgid="8138799623850614177">"Izbriši"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Odaberi sve"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiraj na..."</string> - <string name="menu_move" msgid="1828090633118079817">"Premjesti u..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Novi prozor"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Izreži"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiraj"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Zalijepi"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Pokaži internu pohranu"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Sakrij internu pohranu"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Pokaži veličinu fajla"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Sakrij veličinu fajla"</string> - <string name="button_select" msgid="527196987259139214">"Odaberi"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiraj"</string> - <string name="button_move" msgid="2202666023104202232">"Premjesti"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Odbaci"</string> - <string name="button_retry" msgid="4392027584153752797">"Pokušajte ponovo"</string> - <string name="sort_name" msgid="9183560467917256779">"Po nazivu"</string> - <string name="sort_date" msgid="586080032956151448">"Po datumu izmjene"</string> - <string name="sort_size" msgid="3350681319735474741">"Po veličini"</string> - <string name="drawer_open" msgid="4545466532430226949">"Pokaži korijeni"</string> - <string name="drawer_close" msgid="7602734368552123318">"Sakrij korijenske foldere"</string> - <string name="save_error" msgid="6167009778003223664">"Pohranjivanje dokumenta nije uspjelo"</string> - <string name="create_error" msgid="3735649141335444215">"Kreiranje mape nije uspjelo"</string> - <string name="query_error" msgid="5999895349602476581">"Trenutno nije moguće učitati sadržaj"</string> - <string name="root_recent" msgid="4470053704320518133">"Nedavni"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> slobodno"</string> - <string name="root_type_service" msgid="2178854894416775409">"Usluge pohranjivanja"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Prečice"</string> - <string name="root_type_device" msgid="7121342474653483538">"Uređaji"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Više aplikacija"</string> - <string name="empty" msgid="7858882803708117596">"Nema stavki"</string> - <string name="no_results" msgid="6622510343880730446">"Nema rezultata u %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Nije moguće otvoriti fajl"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Nije moguće obrisati neke dokumente"</string> - <string name="share_via" msgid="8966594246261344259">"Podijeli preko"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopiraju se fajlovi"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Premještanje fajlova"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Brisanje fajlova"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Još <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Kopira se <xliff:g id="COUNT_1">%1$d</xliff:g> fajl.</item> - <item quantity="few">Kopiraju se <xliff:g id="COUNT_1">%1$d</xliff:g> fajla.</item> - <item quantity="other">Kopira se <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Premješta se <xliff:g id="COUNT_1">%1$d</xliff:g> fajl.</item> - <item quantity="few">Premještaju se <xliff:g id="COUNT_1">%1$d</xliff:g> fajla.</item> - <item quantity="other">Premješta se <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Briše se <xliff:g id="COUNT_1">%1$d</xliff:g> fajl.</item> - <item quantity="few">Brišu se <xliff:g id="COUNT_1">%1$d</xliff:g> fajla.</item> - <item quantity="other">Briše se <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Vrati"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Priprema se kopiranje..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Priprema za premještanje..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Pripremanje za brisanje…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Nije moguće kopirati <xliff:g id="COUNT_1">%1$d</xliff:g> fajl</item> - <item quantity="few">Nije moguće kopirati <xliff:g id="COUNT_1">%1$d</xliff:g> fajla</item> - <item quantity="other">Nije moguće kopirati <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Nije moguće premjestiti <xliff:g id="COUNT_1">%1$d</xliff:g> fajl</item> - <item quantity="few">Nije moguće premjestiti <xliff:g id="COUNT_1">%1$d</xliff:g> fajla</item> - <item quantity="other">Nije moguće premjestiti <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Nije moguće izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajl</item> - <item quantity="few">Nije moguće izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajla</item> - <item quantity="other">Nije moguće izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Dodirnite za prikaz detalja"</string> - <string name="close" msgid="3043722427445528732">"Zatvori"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Nisu kopirani sljedeći fajlovi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Nisu premješteni sljedeći fajlovi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Nisu izbrisani sljedeći fajlovi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ove datoteke su pretvorene u drugi format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fajl je kopiran u međuspremnik.</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> fajla su kopirana u međuspremnik.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fajlova je kopirano u međuspremnik.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Odabrani fajlovi se ne mogu zalijepiti na ovu lokaciju."</string> - <string name="menu_rename" msgid="7678802479104285353">"Preimenuj"</string> - <string name="rename_error" msgid="4203041674883412606">"Nije uspjelo preimenovanje dokumenta"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Izbaci"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Neke od datoteka su pretvorene"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Omogućiti <xliff:g id="APPNAME"><b>^1</b></xliff:g> pristup direktoriju <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> sa <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Odobriti aplikaciji <xliff:g id="APPNAME"><b>^1</b></xliff:g> pristup direktoriju <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Želite li odobriti aplikaciji <xliff:g id="APPNAME"><b>^1</b></xliff:g> pristup svojim podacima, uključujući fotografije i video zapise, na <xliff:g id="STORAGE"><i>^2</i></xliff:g> ?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ne pitaj ponovo"</string> - <string name="allow" msgid="7225948811296386551">"Dozvoli"</string> - <string name="deny" msgid="2081879885755434506">"Odbijte"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> stavka je odabrana</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> stavke su odabrane</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> stavki je odabrano</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> stavka</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> stavke</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> stavki</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Želite li izbrisati \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Želite li izbrisati folder \"<xliff:g id="NAME">%1$s</xliff:g>\" i njegov sadržaj?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajl?</item> - <item quantity="few">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajla?</item> - <item quantity="other">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> fajlova?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> folder i njihov sadržaj?</item> - <item quantity="few">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> foldera i njihov sadržaj?</item> - <item quantity="other">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> foldera i njihov sadržaj?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> stavku?</item> - <item quantity="few">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> stavke?</item> - <item quantity="other">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> stavki?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml deleted file mode 100644 index 40e67cff6d3d..000000000000 --- a/packages/DocumentsUI/res/values-ca/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fitxers"</string> - <string name="downloads_label" msgid="959113951084633612">"Baixades"</string> - <string name="title_open" msgid="4353228937663917801">"Obre des de"</string> - <string name="title_save" msgid="2433679664882857999">"Desa a"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Carpeta nova"</string> - <string name="menu_grid" msgid="6878021334497835259">"Visualització de quadrícula"</string> - <string name="menu_list" msgid="7279285939892417279">"Visualització de llista"</string> - <string name="menu_sort" msgid="7677740407158414452">"Ordena per"</string> - <string name="menu_search" msgid="3816712084502856974">"Cerca"</string> - <string name="menu_settings" msgid="8239065133341597825">"Config. d\'emmagatzematge"</string> - <string name="menu_open" msgid="432922957274920903">"Obre"</string> - <string name="menu_save" msgid="2394743337684426338">"Desa"</string> - <string name="menu_share" msgid="3075149983979628146">"Comparteix"</string> - <string name="menu_delete" msgid="8138799623850614177">"Suprimeix"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Selecciona-ho tot"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copia a…"</string> - <string name="menu_move" msgid="1828090633118079817">"Mou a..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Finestra nova"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Retalla"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copia"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Enganxa"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Mostra emmagatz. intern"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Amaga emmagatz. intern"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Mostra la mida del fitxer"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Amaga la mida del fitxer"</string> - <string name="button_select" msgid="527196987259139214">"Selecciona"</string> - <string name="button_copy" msgid="8706475544635021302">"Copia"</string> - <string name="button_move" msgid="2202666023104202232">"Desplaça"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Ignora"</string> - <string name="button_retry" msgid="4392027584153752797">"Torna-ho a provar"</string> - <string name="sort_name" msgid="9183560467917256779">"Per nom"</string> - <string name="sort_date" msgid="586080032956151448">"Per data de modificació"</string> - <string name="sort_size" msgid="3350681319735474741">"Per mida"</string> - <string name="drawer_open" msgid="4545466532430226949">"Mostra les arrels"</string> - <string name="drawer_close" msgid="7602734368552123318">"Amaga les arrels"</string> - <string name="save_error" msgid="6167009778003223664">"No s\'ha pogut desar el document."</string> - <string name="create_error" msgid="3735649141335444215">"No s\'ha pogut crear la carpeta"</string> - <string name="query_error" msgid="5999895349602476581">"En aquest moment no es pot carregar el contingut"</string> - <string name="root_recent" msgid="4470053704320518133">"Recent"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> lliures"</string> - <string name="root_type_service" msgid="2178854894416775409">"Serveis d\'emmagatzematge"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Dreceres"</string> - <string name="root_type_device" msgid="7121342474653483538">"Dispositius"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Més aplicacions"</string> - <string name="empty" msgid="7858882803708117596">"Sense elements"</string> - <string name="no_results" msgid="6622510343880730446">"No hi ha cap coincidència a %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"No es pot obrir el fitxer"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"No es poden suprimir alguns documents."</string> - <string name="share_via" msgid="8966594246261344259">"Comparteix mitjançant"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"S\'estan copiant fitxers"</string> - <string name="move_notification_title" msgid="6193835179777284805">"S\'estan movent fitxers"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Suprimint els fitxers"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Temps restant: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">S\'estan copiant <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers.</item> - <item quantity="one">S\'està copiant <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">S\'estan movent <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers.</item> - <item quantity="one">S\'està movent <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">S\'estan suprimint <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers.</item> - <item quantity="one">S\'està suprimint <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Desfés"</string> - <string name="copy_preparing" msgid="3896202461003039386">"S\'està preparant una còpia…"</string> - <string name="move_preparing" msgid="2772219441375531410">"S\'està preparant per moure\'ls..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"S\'està preparant per suprimir…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">No s\'han pogut copiar <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers</item> - <item quantity="one">No s\'ha pogut copiar <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">No s\'han pogut moure <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers</item> - <item quantity="one">No s\'ha pogut moure <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">No s\'han pogut suprimir <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers</item> - <item quantity="one">No s\'ha pogut suprimir <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Toca per veure\'n els detalls"</string> - <string name="close" msgid="3043722427445528732">"Tanca"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Aquests fitxers no s\'han copiat: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Aquests fitxers no s\'han mogut: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Aquests fitxers no s\'han suprimit: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Aquests fitxers s\'han convertit a un altre format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">S\'han copiat <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers al porta-retalls.</item> - <item quantity="one">S\'ha copiat <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer al porta-retalls.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"No s\'han pogut enganxar els fitxers seleccionats en aquesta ubicació."</string> - <string name="menu_rename" msgid="7678802479104285353">"Canvia el nom"</string> - <string name="rename_error" msgid="4203041674883412606">"No s\'ha pogut canviar el nom del document"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Expulsa"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"S\'han convertit alguns fitxers"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Vols que l\'aplicació <xliff:g id="APPNAME"><b>^1</b></xliff:g> tingui accés al directori <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> de l\'emmagatzematge <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Vols que l\'aplicació <xliff:g id="APPNAME"><b>^1</b></xliff:g> tingui accés al directori <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Vols que l\'aplicació <xliff:g id="APPNAME"><b>^1</b></xliff:g> tingui accés a les dades de <xliff:g id="STORAGE"><i>^2</i></xliff:g>, incloses les fotos i els vídeos?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"No m\'ho demanis més"</string> - <string name="allow" msgid="7225948811296386551">"Permet"</string> - <string name="deny" msgid="2081879885755434506">"Denega"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elements seleccionats</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> element seleccionat</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elements</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> element</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Vols suprimir el fitxer <xliff:g id="NAME">%1$s</xliff:g>?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Vols suprimir la carpeta <xliff:g id="NAME">%1$s</xliff:g> i el seu contingut?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Vols suprimir <xliff:g id="COUNT_1">%1$d</xliff:g> fitxers?</item> - <item quantity="one">Vols suprimir <xliff:g id="COUNT_0">%1$d</xliff:g> fitxer?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Vols suprimir <xliff:g id="COUNT_1">%1$d</xliff:g> carpetes i el seu contingut?</item> - <item quantity="one">Vols suprimir <xliff:g id="COUNT_0">%1$d</xliff:g> carpeta i el seu contingut?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Vols suprimir <xliff:g id="COUNT_1">%1$d</xliff:g> elements?</item> - <item quantity="one">Vols suprimir <xliff:g id="COUNT_0">%1$d</xliff:g> element?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml deleted file mode 100644 index 0132bda42e4c..000000000000 --- a/packages/DocumentsUI/res/values-cs/strings.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Soubory"</string> - <string name="downloads_label" msgid="959113951084633612">"Stahování"</string> - <string name="title_open" msgid="4353228937663917801">"Otevřít"</string> - <string name="title_save" msgid="2433679664882857999">"Uložit do"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nová složka"</string> - <string name="menu_grid" msgid="6878021334497835259">"Mřížkové zobrazení"</string> - <string name="menu_list" msgid="7279285939892417279">"Zobrazení seznamu"</string> - <string name="menu_sort" msgid="7677740407158414452">"Řadit podle"</string> - <string name="menu_search" msgid="3816712084502856974">"Hledat"</string> - <string name="menu_settings" msgid="8239065133341597825">"Nastavení úložiště"</string> - <string name="menu_open" msgid="432922957274920903">"Otevřít"</string> - <string name="menu_save" msgid="2394743337684426338">"Uložit"</string> - <string name="menu_share" msgid="3075149983979628146">"Sdílet"</string> - <string name="menu_delete" msgid="8138799623850614177">"Smazat"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Vybrat vše"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopírovat do…"</string> - <string name="menu_move" msgid="1828090633118079817">"Přesunout do…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nové okno"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Vyjmout"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopírovat"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Vložit"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Zobrazit inter. úložiště"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Skrýt interní úložiště"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Zobrazit velikost souboru"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Skrýt velikost souboru"</string> - <string name="button_select" msgid="527196987259139214">"Vybrat"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopírovat"</string> - <string name="button_move" msgid="2202666023104202232">"Přesunout"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Zavřít"</string> - <string name="button_retry" msgid="4392027584153752797">"Zkusit znovu"</string> - <string name="sort_name" msgid="9183560467917256779">"Podle názvu"</string> - <string name="sort_date" msgid="586080032956151448">"Podle data úpravy"</string> - <string name="sort_size" msgid="3350681319735474741">"Podle velikosti"</string> - <string name="drawer_open" msgid="4545466532430226949">"Zobrazit kořeny"</string> - <string name="drawer_close" msgid="7602734368552123318">"Skrýt kořeny"</string> - <string name="save_error" msgid="6167009778003223664">"Uložení dokumentu se nezdařilo"</string> - <string name="create_error" msgid="3735649141335444215">"Složku se nepodařilo vytvořit"</string> - <string name="query_error" msgid="5999895349602476581">"Obsah nyní nelze načíst"</string> - <string name="root_recent" msgid="4470053704320518133">"Nedávné"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Volné místo: <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Služby úložiště"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Klávesové zkratky"</string> - <string name="root_type_device" msgid="7121342474653483538">"Zařízení"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Další aplikace"</string> - <string name="empty" msgid="7858882803708117596">"Žádné položky"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s – žádné shody"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Soubor nelze otevřít"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Některé dokumenty nelze smazat"</string> - <string name="share_via" msgid="8966594246261344259">"Sdílet pomocí"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopírování souborů"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Přesouvání souborů"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Mazání souborů"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Zbývající čas: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="few">Kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souborů</item> - <item quantity="many">Kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souboru</item> - <item quantity="other">Kopírování <xliff:g id="COUNT_1">%1$d</xliff:g> souborů</item> - <item quantity="one">Kopírování <xliff:g id="COUNT_0">%1$d</xliff:g> souboru</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="few">Přesouvají se <xliff:g id="COUNT_1">%1$d</xliff:g> soubory.</item> - <item quantity="many">Přesouvá se <xliff:g id="COUNT_1">%1$d</xliff:g> souboru.</item> - <item quantity="other">Přesouvá se <xliff:g id="COUNT_1">%1$d</xliff:g> souborů.</item> - <item quantity="one">Přesouvá se <xliff:g id="COUNT_0">%1$d</xliff:g> soubor.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="few">Mazání <xliff:g id="COUNT_1">%1$d</xliff:g> souborů.</item> - <item quantity="many">Mazání <xliff:g id="COUNT_1">%1$d</xliff:g> souboru.</item> - <item quantity="other">Mazání <xliff:g id="COUNT_1">%1$d</xliff:g> souborů.</item> - <item quantity="one">Mazání <xliff:g id="COUNT_0">%1$d</xliff:g> souboru.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Vrátit zpět"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Příprava na kopírování…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Příprava na přesunutí…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Příprava na mazání…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> soubory se zkopírovat nepodařilo</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> souboru se zkopírovat nepodařilo</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> souborů se zkopírovat nepodařilo</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> soubor se zkopírovat nepodařilo</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> soubory nelze přesunout</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> souboru nelze přesunout</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> souborů nelze přesunout</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> soubor nelze přesunout</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> soubory se smazat nepodařilo</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> souboru se smazat nepodařilo</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> souborů se smazat nepodařilo</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> soubor se smazat nepodařilo</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Klepnutím zobrazíte podrobnosti"</string> - <string name="close" msgid="3043722427445528732">"Zavřít"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Následující soubory nebyly zkopírovány: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Následující soubory nebyly přesunuty: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Následující soubory nebyly smazány: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Soubory byly převedeny do jiného formátu: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> soubory byly zkopírovány do schránky.</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> souboru bylo zkopírováno do schránky.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> souborů bylo zkopírováno do schránky.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> soubor byl zkopírován do schránky.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Vybrané soubory nelze vložit do tohoto umístění."</string> - <string name="menu_rename" msgid="7678802479104285353">"Přejmenovat"</string> - <string name="rename_error" msgid="4203041674883412606">"Dokument se nepodařilo přejmenovat."</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Odpojit"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Některé soubory byly převedeny"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Chcete aplikaci <xliff:g id="APPNAME"><b>^1</b></xliff:g> udělit přístup k adresáři <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> v úložišti <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Chcete aplikaci <xliff:g id="APPNAME"><b>^1</b></xliff:g> udělit přístup k adresáři <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Chcete aplikaci <xliff:g id="APPNAME"><b>^1</b></xliff:g> udělit přístup ke svým datům v úložišti <xliff:g id="STORAGE"><i>^2</i></xliff:g>, včetně fotek a videí?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Příště se neptat"</string> - <string name="allow" msgid="7225948811296386551">"Povolit"</string> - <string name="deny" msgid="2081879885755434506">"Odepřít"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="few">Vybrány <xliff:g id="COUNT_1">%1$d</xliff:g> položky</item> - <item quantity="many">Vybráno <xliff:g id="COUNT_1">%1$d</xliff:g> položky</item> - <item quantity="other">Vybráno <xliff:g id="COUNT_1">%1$d</xliff:g> položek</item> - <item quantity="one">Vybrána <xliff:g id="COUNT_0">%1$d</xliff:g> položka</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> položky</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> položky</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> položek</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> položka</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Smazat soubor <xliff:g id="NAME">%1$s</xliff:g>?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Smazat složku <xliff:g id="NAME">%1$s</xliff:g> a její obsah?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="few">Smazat <xliff:g id="COUNT_1">%1$d</xliff:g> soubory?</item> - <item quantity="many">Smazat <xliff:g id="COUNT_1">%1$d</xliff:g> souboru?</item> - <item quantity="other">Smazat <xliff:g id="COUNT_1">%1$d</xliff:g> souborů?</item> - <item quantity="one">Smazat <xliff:g id="COUNT_0">%1$d</xliff:g> soubor?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="few">Smazat <xliff:g id="COUNT_1">%1$d</xliff:g> složky a jejich obsah?</item> - <item quantity="many">Smazat <xliff:g id="COUNT_1">%1$d</xliff:g> složky a jejich obsah?</item> - <item quantity="other">Smazat <xliff:g id="COUNT_1">%1$d</xliff:g> složek a jejich obsah?</item> - <item quantity="one">Smazat <xliff:g id="COUNT_0">%1$d</xliff:g> složku a její obsah?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="few">Smazat <xliff:g id="COUNT_1">%1$d</xliff:g> položky?</item> - <item quantity="many">Smazat <xliff:g id="COUNT_1">%1$d</xliff:g> položky?</item> - <item quantity="other">Smazat <xliff:g id="COUNT_1">%1$d</xliff:g> položek?</item> - <item quantity="one">Smazat <xliff:g id="COUNT_0">%1$d</xliff:g> položku?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml deleted file mode 100644 index b47326e589cf..000000000000 --- a/packages/DocumentsUI/res/values-da/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Filer"</string> - <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> - <string name="title_open" msgid="4353228937663917801">"Åbn fra"</string> - <string name="title_save" msgid="2433679664882857999">"Gem i"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Ny mappe"</string> - <string name="menu_grid" msgid="6878021334497835259">"Gittervisning"</string> - <string name="menu_list" msgid="7279285939892417279">"Listevisning"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortér efter"</string> - <string name="menu_search" msgid="3816712084502856974">"Søg"</string> - <string name="menu_settings" msgid="8239065133341597825">"Indstillinger for lager"</string> - <string name="menu_open" msgid="432922957274920903">"Åbn"</string> - <string name="menu_save" msgid="2394743337684426338">"Gem"</string> - <string name="menu_share" msgid="3075149983979628146">"Del"</string> - <string name="menu_delete" msgid="8138799623850614177">"Slet"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Markér alle"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiér til…"</string> - <string name="menu_move" msgid="1828090633118079817">"Flyt til…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nyt vindue"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Klip"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiér"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Indsæt"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Vis intern lagerplads"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Skjul intern lagerplads"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Vis filstørrelse"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Skjul filstørrelse"</string> - <string name="button_select" msgid="527196987259139214">"Vælg"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiér"</string> - <string name="button_move" msgid="2202666023104202232">"Flyt"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Luk"</string> - <string name="button_retry" msgid="4392027584153752797">"Prøv igen"</string> - <string name="sort_name" msgid="9183560467917256779">"Efter navn"</string> - <string name="sort_date" msgid="586080032956151448">"Efter ændringsdato"</string> - <string name="sort_size" msgid="3350681319735474741">"Efter størrelse"</string> - <string name="drawer_open" msgid="4545466532430226949">"Vis rødder"</string> - <string name="drawer_close" msgid="7602734368552123318">"Skjul rødder"</string> - <string name="save_error" msgid="6167009778003223664">"Dokumentet kunne ikke gemmes"</string> - <string name="create_error" msgid="3735649141335444215">"Mappen kunne ikke oprettes"</string> - <string name="query_error" msgid="5999895349602476581">"Der kan ikke indlæses indhold i øjeblikket"</string> - <string name="root_recent" msgid="4470053704320518133">"Seneste"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ledig plads"</string> - <string name="root_type_service" msgid="2178854894416775409">"Lagringstjenester"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Genveje"</string> - <string name="root_type_device" msgid="7121342474653483538">"Enheder"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Flere apps"</string> - <string name="empty" msgid="7858882803708117596">"Ingen elementer"</string> - <string name="no_results" msgid="6622510343880730446">"Ingen kampe i %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Filen kan ikke åbnes"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Nogle dokumenter kan ikke slettes"</string> - <string name="share_via" msgid="8966594246261344259">"Del via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopierer filer"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Flytter filer"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Filerne slettes"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> tilbage"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Kopierer <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - <item quantity="other">Kopierer <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Flytter <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - <item quantity="other">Flytter <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> filer slettes.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> filer slettes.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Fortryd"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Forbereder kopiering…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Forbereder flytning…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Forbereder til sletning…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> af <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fil kunne ikke kopieres</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> filer kunne ikke kopieres</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fil kunne ikke flyttes</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> filer kunne ikke flyttes</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fil kunne ikke slettes</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> filer kunne ikke slettes</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tryk for at se oplysninger"</string> - <string name="close" msgid="3043722427445528732">"Luk"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Disse filer blev ikke kopieret: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Disse filer blev ikke flyttet: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Disse filer blev ikke slettet: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Disse filer er konverteret til et andet format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> filer blev kopieret til udklipsholder.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> filer blev kopieret til udklipsholder.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"De valgte filer kan ikke indsættes på denne placering."</string> - <string name="menu_rename" msgid="7678802479104285353">"Omdøb"</string> - <string name="rename_error" msgid="4203041674883412606">"Dokumentet kunne ikke omdøbes"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Skub ud"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Nogle filer er konverteret"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Vil du give <xliff:g id="APPNAME"><b>^1</b></xliff:g> adgang til mappen <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> på <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Vil du give <xliff:g id="APPNAME"><b>^1</b></xliff:g> adgang til indekset <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Vil du give <xliff:g id="APPNAME"><b>^1</b></xliff:g> adgang til dine data, herunder billeder og videoer på <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Spørg ikke igen"</string> - <string name="allow" msgid="7225948811296386551">"Tillad"</string> - <string name="deny" msgid="2081879885755434506">"Afvis"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one">Der er valgt <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Der er valgt <xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> element</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementer</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Vil du slette \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Vil du slette mappen \"<xliff:g id="NAME">%1$s</xliff:g>\" og dens indhold?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Vil du slette <xliff:g id="COUNT_1">%1$d</xliff:g> fil?</item> - <item quantity="other">Vil du slette <xliff:g id="COUNT_1">%1$d</xliff:g> filer?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Vil du slette <xliff:g id="COUNT_1">%1$d</xliff:g> mappe og dens indhold?</item> - <item quantity="other">Vil du slette <xliff:g id="COUNT_1">%1$d</xliff:g> mapper og deres indhold?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Vil du slette <xliff:g id="COUNT_1">%1$d</xliff:g> element?</item> - <item quantity="other">Vil du slette <xliff:g id="COUNT_1">%1$d</xliff:g> elementer?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml deleted file mode 100644 index 123bf19beb8a..000000000000 --- a/packages/DocumentsUI/res/values-de/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Dateien"</string> - <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> - <string name="title_open" msgid="4353228937663917801">"Öffnen von"</string> - <string name="title_save" msgid="2433679664882857999">"Speichern unter"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Neuer Ordner"</string> - <string name="menu_grid" msgid="6878021334497835259">"Rasteransicht"</string> - <string name="menu_list" msgid="7279285939892417279">"Listenansicht"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortieren nach"</string> - <string name="menu_search" msgid="3816712084502856974">"Suchen"</string> - <string name="menu_settings" msgid="8239065133341597825">"Speichereinstellungen"</string> - <string name="menu_open" msgid="432922957274920903">"Öffnen"</string> - <string name="menu_save" msgid="2394743337684426338">"Speichern"</string> - <string name="menu_share" msgid="3075149983979628146">"Teilen"</string> - <string name="menu_delete" msgid="8138799623850614177">"Löschen"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Alle auswählen"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopieren nach..."</string> - <string name="menu_move" msgid="1828090633118079817">"Verschieben nach…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Neues Fenster"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Ausschneiden"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopieren"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Einfügen"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Int. Speicher anzeigen"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Int. Speicher ausblenden"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Dateigröße anzeigen"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Dateigröße ausblenden"</string> - <string name="button_select" msgid="527196987259139214">"Auswählen"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopieren"</string> - <string name="button_move" msgid="2202666023104202232">"Verschieben"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Schließen"</string> - <string name="button_retry" msgid="4392027584153752797">"Erneut versuchen"</string> - <string name="sort_name" msgid="9183560467917256779">"Nach Name"</string> - <string name="sort_date" msgid="586080032956151448">"Nach Änderungsdatum"</string> - <string name="sort_size" msgid="3350681319735474741">"Nach Größe"</string> - <string name="drawer_open" msgid="4545466532430226949">"Root-Verzeichnis anzeigen"</string> - <string name="drawer_close" msgid="7602734368552123318">"Root-Verzeichnis ausblenden"</string> - <string name="save_error" msgid="6167009778003223664">"Dokument konnte nicht gespeichert werden."</string> - <string name="create_error" msgid="3735649141335444215">"Ordner konnte nicht erstellt werden."</string> - <string name="query_error" msgid="5999895349602476581">"Inhalte können momentan nicht geladen werden"</string> - <string name="root_recent" msgid="4470053704320518133">"Letzte"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> verfügbar"</string> - <string name="root_type_service" msgid="2178854894416775409">"Speicherdienste"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Verknüpfungen"</string> - <string name="root_type_device" msgid="7121342474653483538">"Geräte"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Weitere Apps"</string> - <string name="empty" msgid="7858882803708117596">"Keine Dokumente"</string> - <string name="no_results" msgid="6622510343880730446">"Keine Übereinstimmungen in %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Datei kann nicht geöffnet werden"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Einige Dokumente konnten nicht gelöscht werden."</string> - <string name="share_via" msgid="8966594246261344259">"Teilen über"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Dateien werden kopiert"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Dateien werden verschoben"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Dateien werden gelöscht"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Noch <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien werden kopiert.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei wird kopiert.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien werden verschoben.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei wird verschoben.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien werden gelöscht.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei wird gelöscht.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Rückgängig machen"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Kopieren wird vorbereitet…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Verschieben wird vorbereitet…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Löschvorgang wird vorbereitet…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien konnten nicht kopiert werden</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei konnte nicht kopiert werden</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien konnten nicht verschoben werden</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei konnte nicht verschoben werden</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien konnten nicht gelöscht werden</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei konnte nicht gelöscht werden</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Zum Ansehen der Details tippen"</string> - <string name="close" msgid="3043722427445528732">"Schließen"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Diese Dateien wurden nicht kopiert: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Diese Dateien wurden nicht verschoben: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Diese Dateien wurden nicht gelöscht: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Folgende Dateien wurden in ein anderes Format konvertiert: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Dateien wurden in die Zwischenablage kopiert.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Datei wurde in die Zwischenablage kopiert.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Die ausgewählten Dateien können an diesem Ort nicht eingefügt werden."</string> - <string name="menu_rename" msgid="7678802479104285353">"Umbenennen"</string> - <string name="rename_error" msgid="4203041674883412606">"Dokument konnte nicht umbenannt werden"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Auswerfen"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Einige Dateien wurden konvertiert"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> Zugriff auf das Verzeichnis <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> auf <xliff:g id="STORAGE"><i>^3</i></xliff:g> geben?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Möchtest du <xliff:g id="APPNAME"><b>^1</b></xliff:g> Zugriff auf das Verzeichnis <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> geben?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Möchtest du <xliff:g id="APPNAME"><b>^1</b></xliff:g> Zugriff auf deine Daten auf <xliff:g id="STORAGE"><i>^2</i></xliff:g> geben, einschließlich Fotos und Videos?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Nicht mehr fragen"</string> - <string name="allow" msgid="7225948811296386551">"Zulassen"</string> - <string name="deny" msgid="2081879885755434506">"Ablehnen"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ausgewählt</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ausgewählt</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> Einträge</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> Eintrag</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" löschen?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Ordner \"<xliff:g id="NAME">%1$s</xliff:g>\" und dessen Inhalte löschen?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Möchtest du <xliff:g id="COUNT_1">%1$d</xliff:g> Dateien löschen?</item> - <item quantity="one">Möchtest du <xliff:g id="COUNT_0">%1$d</xliff:g> Datei löschen?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Möchtest du <xliff:g id="COUNT_1">%1$d</xliff:g> Ordner und deren Inhalte löschen?</item> - <item quantity="one">Möchtest du <xliff:g id="COUNT_0">%1$d</xliff:g> Ordner und dessen Inhalte löschen?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Möchtest du <xliff:g id="COUNT_1">%1$d</xliff:g> Elemente löschen?</item> - <item quantity="one">Möchtest du <xliff:g id="COUNT_0">%1$d</xliff:g> Element löschen?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml deleted file mode 100644 index 5a199d7f4b04..000000000000 --- a/packages/DocumentsUI/res/values-el/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Αρχεία"</string> - <string name="downloads_label" msgid="959113951084633612">"Λήψεις"</string> - <string name="title_open" msgid="4353228937663917801">"Άνοιγμα από"</string> - <string name="title_save" msgid="2433679664882857999">"Αποθήκευση σε"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Νέος φάκελος"</string> - <string name="menu_grid" msgid="6878021334497835259">"Προβολή πλέγματος"</string> - <string name="menu_list" msgid="7279285939892417279">"Προβολή λίστας"</string> - <string name="menu_sort" msgid="7677740407158414452">"Ταξινόμηση κατά"</string> - <string name="menu_search" msgid="3816712084502856974">"Αναζήτηση"</string> - <string name="menu_settings" msgid="8239065133341597825">"Ρυθμίσεις αποθ/κού χώρου"</string> - <string name="menu_open" msgid="432922957274920903">"Άνοιγμα"</string> - <string name="menu_save" msgid="2394743337684426338">"Αποθήκευση"</string> - <string name="menu_share" msgid="3075149983979628146">"Κοινή χρήση"</string> - <string name="menu_delete" msgid="8138799623850614177">"Διαγραφή"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Επιλογή όλων"</string> - <string name="menu_copy" msgid="3612326052677229148">"Αντιγραφή σε…"</string> - <string name="menu_move" msgid="1828090633118079817">"Μετακίνηση σε..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Νέο παράθυρο"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Αποκοπή"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Αντιγραφή"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Επικόλληση"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Εμφ.εσωτ.χώρου αποθήκ."</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Απόκρ.εσωτ.χώρου αποθήκ."</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Εμφ. μεγέθους αρχείου"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Απόκρ. μεγέθους αρχείου"</string> - <string name="button_select" msgid="527196987259139214">"Επιλογή"</string> - <string name="button_copy" msgid="8706475544635021302">"Αντιγραφή"</string> - <string name="button_move" msgid="2202666023104202232">"Μετακίνηση"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Παράβλεψη"</string> - <string name="button_retry" msgid="4392027584153752797">"Δοκιμάστε ξανά"</string> - <string name="sort_name" msgid="9183560467917256779">"Κατά όνομα"</string> - <string name="sort_date" msgid="586080032956151448">"Κατά ημερομηνία τροποποίησης"</string> - <string name="sort_size" msgid="3350681319735474741">"Κατά μέγεθος"</string> - <string name="drawer_open" msgid="4545466532430226949">"Εμφάνιση ρίζας"</string> - <string name="drawer_close" msgid="7602734368552123318">"Απόκρυψη ρίζας"</string> - <string name="save_error" msgid="6167009778003223664">"Αποτυχία αποθήκευσης του εγγράφου"</string> - <string name="create_error" msgid="3735649141335444215">"Αποτυχία δημιουργίας φακέλου"</string> - <string name="query_error" msgid="5999895349602476581">"Δεν είναι δυνατή η φόρτωση περιεχομένου τώρα"</string> - <string name="root_recent" msgid="4470053704320518133">"Πρόσφατα"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ελεύθερα"</string> - <string name="root_type_service" msgid="2178854894416775409">"Υπηρεσίες αποθήκευσης"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Συντομεύσεις"</string> - <string name="root_type_device" msgid="7121342474653483538">"Συσκευές"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Περισσότερες εφαρμογές"</string> - <string name="empty" msgid="7858882803708117596">"Δεν υπάρχουν στοιχεία"</string> - <string name="no_results" msgid="6622510343880730446">"Χωρίς αντιστοιχίσεις στο %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Δεν είναι δυνατό το άνοιγμα του αρχείου"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Δεν είναι δυνατή η διαγραφή ορισμένων εγγράφων"</string> - <string name="share_via" msgid="8966594246261344259">"Κοινοποίηση μέσω"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Αντιγραφή αρχείων"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Μετακίνηση αρχείων"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Διαγραφή αρχείων"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Απομένουν <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Αντιγραφή <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων.</item> - <item quantity="one">Αντιγραφή <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Μετακίνηση <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων.</item> - <item quantity="one">Μετακίνηση <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Διαγραφή <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων.</item> - <item quantity="one">Διαγραφή <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Αναίρεση"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Προετοιμασία για αντιγραφή…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Προετοιμασία για μετακίνηση…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Προετοιμασία για διαγραφή…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Δεν ήταν δυνατή η αντιγραφή <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων</item> - <item quantity="one">Δεν ήταν δυνατή η αντιγραφή <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Δεν ήταν δυνατή η μετακίνηση <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων</item> - <item quantity="one">Δεν ήταν δυνατή η μετακίνηση <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Δεν ήταν δυνατή η διαγραφή <xliff:g id="COUNT_1">%1$d</xliff:g> αρχείων</item> - <item quantity="one">Δεν ήταν δυνατή η διαγραφή <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείου</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Πατήστε για προβολή λεπτομερειών"</string> - <string name="close" msgid="3043722427445528732">"Κλείσιμο"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Αυτά τα αρχεία δεν αντιγράφηκαν: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Αυτά τα αρχεία δεν μετακινήθηκαν: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Αυτά τα αρχεία δεν διαγράφηκαν: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Αυτά τα αρχεία μετατράπηκαν σε άλλη μορφή: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> αρχεία αντιγράφηκαν στο πρόχειρο.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> αρχείο αντιγράφηκε στο πρόχειρο.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Δεν είναι δυνατή η επικόλληση των επιλεγμένων αρχείων σε αυτήν την τοποθεσία."</string> - <string name="menu_rename" msgid="7678802479104285353">"Μετονομασία"</string> - <string name="rename_error" msgid="4203041674883412606">"Αποτυχία μετονομασίας εγγράφου"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Εξαγωγή"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Ορισμένα αρχεία μετατράπηκαν"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Να εκχωρηθεί στην εφαρμογή <xliff:g id="APPNAME"><b>^1</b></xliff:g> πρόσβαση στον κατάλογο <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> στον αποθηκευτικό χώρο <xliff:g id="STORAGE"><i>^3</i></xliff:g>;"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Εκχώρηση πρόσβασης στην εφαρμογή <xliff:g id="APPNAME"><b>^1</b></xliff:g> στον κατάλογο <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>;"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Θέλετε να εκχωρήσετε πρόσβαση στα δεδομένα σας στην εφαρμογή <xliff:g id="APPNAME"><b>^1</b></xliff:g>, συμπεριλαμβανομένων των φωτογραφιών και των βίντεό σας, στον αποθηκευτικό χώρο <xliff:g id="STORAGE"><i>^2</i></xliff:g>;"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Να μην ερωτηθώ ξανά"</string> - <string name="allow" msgid="7225948811296386551">"Να επιτρέπεται"</string> - <string name="deny" msgid="2081879885755434506">"Άρνηση"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> επιλεγμένα</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> επιλεγμένο</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> στοιχεία</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> στοιχείο</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Να διαγραφεί το αρχείο \"<xliff:g id="NAME">%1$s</xliff:g>\";"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Να διαγραφεί ο φάκελος \"<xliff:g id="NAME">%1$s</xliff:g>\" και τα περιεχόμενά του;"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Να διαγραφούν <xliff:g id="COUNT_1">%1$d</xliff:g> αρχεία;</item> - <item quantity="one">Να διαγραφεί <xliff:g id="COUNT_0">%1$d</xliff:g> αρχείο;</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Να διαγραφούν <xliff:g id="COUNT_1">%1$d</xliff:g> φάκελοι και τα περιεχόμενά τους;</item> - <item quantity="one">Να διαγραφεί <xliff:g id="COUNT_0">%1$d</xliff:g> φάκελος και τα περιεχόμενά του;</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Να διαγραφούν <xliff:g id="COUNT_1">%1$d</xliff:g> στοιχεία;</item> - <item quantity="one">Να διαγραφεί <xliff:g id="COUNT_0">%1$d</xliff:g> στοιχείο;</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-en-rAU/strings.xml b/packages/DocumentsUI/res/values-en-rAU/strings.xml deleted file mode 100644 index f2b25b87bae0..000000000000 --- a/packages/DocumentsUI/res/values-en-rAU/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Files"</string> - <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> - <string name="title_open" msgid="4353228937663917801">"Open from"</string> - <string name="title_save" msgid="2433679664882857999">"Save to"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"New folder"</string> - <string name="menu_grid" msgid="6878021334497835259">"Grid view"</string> - <string name="menu_list" msgid="7279285939892417279">"List view"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sort by"</string> - <string name="menu_search" msgid="3816712084502856974">"Search"</string> - <string name="menu_settings" msgid="8239065133341597825">"Storage settings"</string> - <string name="menu_open" msgid="432922957274920903">"Open"</string> - <string name="menu_save" msgid="2394743337684426338">"Save"</string> - <string name="menu_share" msgid="3075149983979628146">"Share"</string> - <string name="menu_delete" msgid="8138799623850614177">"Delete"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Select all"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copy to…"</string> - <string name="menu_move" msgid="1828090633118079817">"Move to…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"New window"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cut"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copy"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Paste"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Show internal storage"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Hide internal storage"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Show file size"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Hide file size"</string> - <string name="button_select" msgid="527196987259139214">"select"</string> - <string name="button_copy" msgid="8706475544635021302">"Copy"</string> - <string name="button_move" msgid="2202666023104202232">"Move"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Dismiss"</string> - <string name="button_retry" msgid="4392027584153752797">"Try again"</string> - <string name="sort_name" msgid="9183560467917256779">"By name"</string> - <string name="sort_date" msgid="586080032956151448">"By date modified"</string> - <string name="sort_size" msgid="3350681319735474741">"By size"</string> - <string name="drawer_open" msgid="4545466532430226949">"Show roots"</string> - <string name="drawer_close" msgid="7602734368552123318">"Hide roots"</string> - <string name="save_error" msgid="6167009778003223664">"Failed to save document"</string> - <string name="create_error" msgid="3735649141335444215">"Failed to create folder"</string> - <string name="query_error" msgid="5999895349602476581">"Can’t load content at the moment"</string> - <string name="root_recent" msgid="4470053704320518133">"Recent"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> free"</string> - <string name="root_type_service" msgid="2178854894416775409">"Storage services"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Shortcuts"</string> - <string name="root_type_device" msgid="7121342474653483538">"Devices"</string> - <string name="root_type_apps" msgid="8838065367985945189">"More apps"</string> - <string name="empty" msgid="7858882803708117596">"No items"</string> - <string name="no_results" msgid="6622510343880730446">"No matches in %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Can’t open file"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string> - <string name="share_via" msgid="8966594246261344259">"Share via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copying files"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Moving files"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Deleting files"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> left"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Copying <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> - <item quantity="one">Copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Moving <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> - <item quantity="one">Moving <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Deleting <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> - <item quantity="one">Deleting <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Undo"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Preparing for copy…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Preparing for move…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Preparing to delete…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Couldn’t copy <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="one">Couldn’t copy <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Couldn’t move <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="one">Couldn’t move <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Couldn’t delete <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="one">Couldn’t delete <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tap to view details"</string> - <string name="close" msgid="3043722427445528732">"Close"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"These files weren’t copied: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"These files weren’t moved: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"These files weren’t deleted: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"These files were converted to another format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Copied <xliff:g id="COUNT_1">%1$d</xliff:g> files to clipboard.</item> - <item quantity="one">Copied <xliff:g id="COUNT_0">%1$d</xliff:g> file to clipboard.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Cannot paste the selected files in this location."</string> - <string name="menu_rename" msgid="7678802479104285353">"Rename"</string> - <string name="rename_error" msgid="4203041674883412606">"Failed to rename document"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Eject"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Some files were converted"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Grant <xliff:g id="APPNAME"><b>^1</b></xliff:g> access to <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> directory on <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Grant <xliff:g id="APPNAME"><b>^1</b></xliff:g> access to <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> directory?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Grant <xliff:g id="APPNAME"><b>^1</b></xliff:g> access to your data, including photos and videos, on <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Don\'t ask again"</string> - <string name="allow" msgid="7225948811296386551">"Allow"</string> - <string name="deny" msgid="2081879885755434506">"Deny"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> items</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Delete \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Delete folder \"<xliff:g id="NAME">%1$s</xliff:g>\" and its contents?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Delete <xliff:g id="COUNT_1">%1$d</xliff:g> files?</item> - <item quantity="one">Delete <xliff:g id="COUNT_0">%1$d</xliff:g> file?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Delete <xliff:g id="COUNT_1">%1$d</xliff:g> folders and their contents?</item> - <item quantity="one">Delete <xliff:g id="COUNT_0">%1$d</xliff:g> folder and its contents?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Delete <xliff:g id="COUNT_1">%1$d</xliff:g> items?</item> - <item quantity="one">Delete <xliff:g id="COUNT_0">%1$d</xliff:g> item?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-en-rGB/strings.xml b/packages/DocumentsUI/res/values-en-rGB/strings.xml deleted file mode 100644 index f2b25b87bae0..000000000000 --- a/packages/DocumentsUI/res/values-en-rGB/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Files"</string> - <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> - <string name="title_open" msgid="4353228937663917801">"Open from"</string> - <string name="title_save" msgid="2433679664882857999">"Save to"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"New folder"</string> - <string name="menu_grid" msgid="6878021334497835259">"Grid view"</string> - <string name="menu_list" msgid="7279285939892417279">"List view"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sort by"</string> - <string name="menu_search" msgid="3816712084502856974">"Search"</string> - <string name="menu_settings" msgid="8239065133341597825">"Storage settings"</string> - <string name="menu_open" msgid="432922957274920903">"Open"</string> - <string name="menu_save" msgid="2394743337684426338">"Save"</string> - <string name="menu_share" msgid="3075149983979628146">"Share"</string> - <string name="menu_delete" msgid="8138799623850614177">"Delete"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Select all"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copy to…"</string> - <string name="menu_move" msgid="1828090633118079817">"Move to…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"New window"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cut"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copy"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Paste"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Show internal storage"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Hide internal storage"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Show file size"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Hide file size"</string> - <string name="button_select" msgid="527196987259139214">"select"</string> - <string name="button_copy" msgid="8706475544635021302">"Copy"</string> - <string name="button_move" msgid="2202666023104202232">"Move"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Dismiss"</string> - <string name="button_retry" msgid="4392027584153752797">"Try again"</string> - <string name="sort_name" msgid="9183560467917256779">"By name"</string> - <string name="sort_date" msgid="586080032956151448">"By date modified"</string> - <string name="sort_size" msgid="3350681319735474741">"By size"</string> - <string name="drawer_open" msgid="4545466532430226949">"Show roots"</string> - <string name="drawer_close" msgid="7602734368552123318">"Hide roots"</string> - <string name="save_error" msgid="6167009778003223664">"Failed to save document"</string> - <string name="create_error" msgid="3735649141335444215">"Failed to create folder"</string> - <string name="query_error" msgid="5999895349602476581">"Can’t load content at the moment"</string> - <string name="root_recent" msgid="4470053704320518133">"Recent"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> free"</string> - <string name="root_type_service" msgid="2178854894416775409">"Storage services"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Shortcuts"</string> - <string name="root_type_device" msgid="7121342474653483538">"Devices"</string> - <string name="root_type_apps" msgid="8838065367985945189">"More apps"</string> - <string name="empty" msgid="7858882803708117596">"No items"</string> - <string name="no_results" msgid="6622510343880730446">"No matches in %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Can’t open file"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string> - <string name="share_via" msgid="8966594246261344259">"Share via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copying files"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Moving files"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Deleting files"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> left"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Copying <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> - <item quantity="one">Copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Moving <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> - <item quantity="one">Moving <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Deleting <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> - <item quantity="one">Deleting <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Undo"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Preparing for copy…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Preparing for move…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Preparing to delete…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Couldn’t copy <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="one">Couldn’t copy <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Couldn’t move <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="one">Couldn’t move <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Couldn’t delete <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="one">Couldn’t delete <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tap to view details"</string> - <string name="close" msgid="3043722427445528732">"Close"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"These files weren’t copied: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"These files weren’t moved: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"These files weren’t deleted: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"These files were converted to another format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Copied <xliff:g id="COUNT_1">%1$d</xliff:g> files to clipboard.</item> - <item quantity="one">Copied <xliff:g id="COUNT_0">%1$d</xliff:g> file to clipboard.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Cannot paste the selected files in this location."</string> - <string name="menu_rename" msgid="7678802479104285353">"Rename"</string> - <string name="rename_error" msgid="4203041674883412606">"Failed to rename document"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Eject"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Some files were converted"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Grant <xliff:g id="APPNAME"><b>^1</b></xliff:g> access to <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> directory on <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Grant <xliff:g id="APPNAME"><b>^1</b></xliff:g> access to <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> directory?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Grant <xliff:g id="APPNAME"><b>^1</b></xliff:g> access to your data, including photos and videos, on <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Don\'t ask again"</string> - <string name="allow" msgid="7225948811296386551">"Allow"</string> - <string name="deny" msgid="2081879885755434506">"Deny"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> items</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Delete \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Delete folder \"<xliff:g id="NAME">%1$s</xliff:g>\" and its contents?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Delete <xliff:g id="COUNT_1">%1$d</xliff:g> files?</item> - <item quantity="one">Delete <xliff:g id="COUNT_0">%1$d</xliff:g> file?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Delete <xliff:g id="COUNT_1">%1$d</xliff:g> folders and their contents?</item> - <item quantity="one">Delete <xliff:g id="COUNT_0">%1$d</xliff:g> folder and its contents?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Delete <xliff:g id="COUNT_1">%1$d</xliff:g> items?</item> - <item quantity="one">Delete <xliff:g id="COUNT_0">%1$d</xliff:g> item?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-en-rIN/strings.xml b/packages/DocumentsUI/res/values-en-rIN/strings.xml deleted file mode 100644 index f2b25b87bae0..000000000000 --- a/packages/DocumentsUI/res/values-en-rIN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Files"</string> - <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> - <string name="title_open" msgid="4353228937663917801">"Open from"</string> - <string name="title_save" msgid="2433679664882857999">"Save to"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"New folder"</string> - <string name="menu_grid" msgid="6878021334497835259">"Grid view"</string> - <string name="menu_list" msgid="7279285939892417279">"List view"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sort by"</string> - <string name="menu_search" msgid="3816712084502856974">"Search"</string> - <string name="menu_settings" msgid="8239065133341597825">"Storage settings"</string> - <string name="menu_open" msgid="432922957274920903">"Open"</string> - <string name="menu_save" msgid="2394743337684426338">"Save"</string> - <string name="menu_share" msgid="3075149983979628146">"Share"</string> - <string name="menu_delete" msgid="8138799623850614177">"Delete"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Select all"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copy to…"</string> - <string name="menu_move" msgid="1828090633118079817">"Move to…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"New window"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cut"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copy"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Paste"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Show internal storage"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Hide internal storage"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Show file size"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Hide file size"</string> - <string name="button_select" msgid="527196987259139214">"select"</string> - <string name="button_copy" msgid="8706475544635021302">"Copy"</string> - <string name="button_move" msgid="2202666023104202232">"Move"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Dismiss"</string> - <string name="button_retry" msgid="4392027584153752797">"Try again"</string> - <string name="sort_name" msgid="9183560467917256779">"By name"</string> - <string name="sort_date" msgid="586080032956151448">"By date modified"</string> - <string name="sort_size" msgid="3350681319735474741">"By size"</string> - <string name="drawer_open" msgid="4545466532430226949">"Show roots"</string> - <string name="drawer_close" msgid="7602734368552123318">"Hide roots"</string> - <string name="save_error" msgid="6167009778003223664">"Failed to save document"</string> - <string name="create_error" msgid="3735649141335444215">"Failed to create folder"</string> - <string name="query_error" msgid="5999895349602476581">"Can’t load content at the moment"</string> - <string name="root_recent" msgid="4470053704320518133">"Recent"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> free"</string> - <string name="root_type_service" msgid="2178854894416775409">"Storage services"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Shortcuts"</string> - <string name="root_type_device" msgid="7121342474653483538">"Devices"</string> - <string name="root_type_apps" msgid="8838065367985945189">"More apps"</string> - <string name="empty" msgid="7858882803708117596">"No items"</string> - <string name="no_results" msgid="6622510343880730446">"No matches in %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Can’t open file"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string> - <string name="share_via" msgid="8966594246261344259">"Share via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copying files"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Moving files"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Deleting files"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> left"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Copying <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> - <item quantity="one">Copying <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Moving <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> - <item quantity="one">Moving <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Deleting <xliff:g id="COUNT_1">%1$d</xliff:g> files.</item> - <item quantity="one">Deleting <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Undo"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Preparing for copy…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Preparing for move…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Preparing to delete…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Couldn’t copy <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="one">Couldn’t copy <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Couldn’t move <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="one">Couldn’t move <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Couldn’t delete <xliff:g id="COUNT_1">%1$d</xliff:g> files</item> - <item quantity="one">Couldn’t delete <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tap to view details"</string> - <string name="close" msgid="3043722427445528732">"Close"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"These files weren’t copied: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"These files weren’t moved: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"These files weren’t deleted: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"These files were converted to another format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Copied <xliff:g id="COUNT_1">%1$d</xliff:g> files to clipboard.</item> - <item quantity="one">Copied <xliff:g id="COUNT_0">%1$d</xliff:g> file to clipboard.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Cannot paste the selected files in this location."</string> - <string name="menu_rename" msgid="7678802479104285353">"Rename"</string> - <string name="rename_error" msgid="4203041674883412606">"Failed to rename document"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Eject"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Some files were converted"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Grant <xliff:g id="APPNAME"><b>^1</b></xliff:g> access to <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> directory on <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Grant <xliff:g id="APPNAME"><b>^1</b></xliff:g> access to <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> directory?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Grant <xliff:g id="APPNAME"><b>^1</b></xliff:g> access to your data, including photos and videos, on <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Don\'t ask again"</string> - <string name="allow" msgid="7225948811296386551">"Allow"</string> - <string name="deny" msgid="2081879885755434506">"Deny"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selected</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> items</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Delete \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Delete folder \"<xliff:g id="NAME">%1$s</xliff:g>\" and its contents?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Delete <xliff:g id="COUNT_1">%1$d</xliff:g> files?</item> - <item quantity="one">Delete <xliff:g id="COUNT_0">%1$d</xliff:g> file?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Delete <xliff:g id="COUNT_1">%1$d</xliff:g> folders and their contents?</item> - <item quantity="one">Delete <xliff:g id="COUNT_0">%1$d</xliff:g> folder and its contents?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Delete <xliff:g id="COUNT_1">%1$d</xliff:g> items?</item> - <item quantity="one">Delete <xliff:g id="COUNT_0">%1$d</xliff:g> item?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml deleted file mode 100644 index 1cd7428d6768..000000000000 --- a/packages/DocumentsUI/res/values-es-rUS/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Archivos"</string> - <string name="downloads_label" msgid="959113951084633612">"Descargas"</string> - <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string> - <string name="title_save" msgid="2433679664882857999">"Guardar en"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Carpeta nueva"</string> - <string name="menu_grid" msgid="6878021334497835259">"Vista de cuadrícula"</string> - <string name="menu_list" msgid="7279285939892417279">"Vista de lista"</string> - <string name="menu_sort" msgid="7677740407158414452">"Ordenar por"</string> - <string name="menu_search" msgid="3816712084502856974">"Buscar"</string> - <string name="menu_settings" msgid="8239065133341597825">"Configuración"</string> - <string name="menu_open" msgid="432922957274920903">"Abrir"</string> - <string name="menu_save" msgid="2394743337684426338">"Guardar"</string> - <string name="menu_share" msgid="3075149983979628146">"Compartir"</string> - <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Seleccionar todo"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copiar a…"</string> - <string name="menu_move" msgid="1828090633118079817">"Mover a…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Ventana nueva"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cortar"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copiar"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Pegar"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Mostrar almacen. interno"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ocultar almacen. interno"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tamaño archivos"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tamaño archivos"</string> - <string name="button_select" msgid="527196987259139214">"Seleccionar"</string> - <string name="button_copy" msgid="8706475544635021302">"Copiar"</string> - <string name="button_move" msgid="2202666023104202232">"Mover"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Descartar"</string> - <string name="button_retry" msgid="4392027584153752797">"Reintentar"</string> - <string name="sort_name" msgid="9183560467917256779">"Por nombre"</string> - <string name="sort_date" msgid="586080032956151448">"Por fecha de modificación"</string> - <string name="sort_size" msgid="3350681319735474741">"Por tamaño"</string> - <string name="drawer_open" msgid="4545466532430226949">"Mostrar raíces"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ocultar raíces"</string> - <string name="save_error" msgid="6167009778003223664">"Error al guardar el documento"</string> - <string name="create_error" msgid="3735649141335444215">"Error al crear la carpeta"</string> - <string name="query_error" msgid="5999895349602476581">"No se puede cargar el contenido en este momento"</string> - <string name="root_recent" msgid="4470053704320518133">"Recientes"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> de espacio libre"</string> - <string name="root_type_service" msgid="2178854894416775409">"Almacenamiento"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Accesos directos"</string> - <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Más aplicaciones"</string> - <string name="empty" msgid="7858882803708117596">"Sin elementos"</string> - <string name="no_results" msgid="6622510343880730446">"No hay coincidencias en %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"No se puede abrir el archivo"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos."</string> - <string name="share_via" msgid="8966594246261344259">"Compartir mediante"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copiando archivos"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Moviendo archivos"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Borrando los archivos"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Faltan <xliff:g id="DURATION">%s</xliff:g>."</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> - <item quantity="one">Copiando <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Moviendo <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> - <item quantity="one">Moviendo <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Se están borrando <xliff:g id="COUNT_1">%1$d</xliff:g> archivos.</item> - <item quantity="one">Se está borrando <xliff:g id="COUNT_0">%1$d</xliff:g> archivo.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Deshacer"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Preparación para mover archivos…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Preparando para borrar…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">No se pudieron copiar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> - <item quantity="one">No se pudo copiar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">No se pudieron trasladar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> - <item quantity="one">No se pudo trasladar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">No se pudieron borrar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> - <item quantity="one">No se pudo borrar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Presiona para ver los detalles"</string> - <string name="close" msgid="3043722427445528732">"Cerrar"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Los siguientes archivos no se pudieron copiar: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Los siguientes archivos no se trasladaron: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Los siguientes archivos no se pudieron borrar: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Estos archivos se convirtieron a otro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Se copiaron <xliff:g id="COUNT_1">%1$d</xliff:g> archivos al portapapeles.</item> - <item quantity="one">Se copió <xliff:g id="COUNT_0">%1$d</xliff:g> archivo al portapapeles.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"No se pueden pegar los archivos seleccionados en esta ubicación."</string> - <string name="menu_rename" msgid="7678802479104285353">"Cambiar nombre"</string> - <string name="rename_error" msgid="4203041674883412606">"No se pudo cambiar el nombre del documento"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Expulsar"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Se convirtieron algunos archivos"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"¿Otorgar acceso a <xliff:g id="APPNAME"><b>^1</b></xliff:g> al directorio <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> en <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"¿Quieres otorgar acceso a <xliff:g id="APPNAME"><b>^1</b></xliff:g> al directorio <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"¿Quieres otorgar acceso a la app de <xliff:g id="APPNAME"><b>^1</b></xliff:g> a tus datos, incluidas tus fotos y videos en <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"No volver a preguntar"</string> - <string name="allow" msgid="7225948811296386551">"Permitir"</string> - <string name="deny" msgid="2081879885755434506">"Denegar"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementos seleccionados</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elemento seleccionado</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementos</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elemento</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"¿Deseas borrar \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"¿Deseas borrar la carpeta \"<xliff:g id="NAME">%1$s</xliff:g>\" y su contenido?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">¿Deseas borrar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos?</item> - <item quantity="one">¿Deseas borrar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">¿Deseas borrar <xliff:g id="COUNT_1">%1$d</xliff:g> carpetas y su contenido?</item> - <item quantity="one">¿Deseas borrar <xliff:g id="COUNT_0">%1$d</xliff:g> carpeta y su contenido?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">¿Deseas borrar <xliff:g id="COUNT_1">%1$d</xliff:g> elementos?</item> - <item quantity="one">¿Deseas borrar <xliff:g id="COUNT_0">%1$d</xliff:g> elemento?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml deleted file mode 100644 index e3de7165221b..000000000000 --- a/packages/DocumentsUI/res/values-es/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Archivos"</string> - <string name="downloads_label" msgid="959113951084633612">"Descargas"</string> - <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string> - <string name="title_save" msgid="2433679664882857999">"Guardar en"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nueva carpeta"</string> - <string name="menu_grid" msgid="6878021334497835259">"Vista de cuadrícula"</string> - <string name="menu_list" msgid="7279285939892417279">"Vista de lista"</string> - <string name="menu_sort" msgid="7677740407158414452">"Ordenar por"</string> - <string name="menu_search" msgid="3816712084502856974">"Buscar"</string> - <string name="menu_settings" msgid="8239065133341597825">"Ajustes de almacenamiento"</string> - <string name="menu_open" msgid="432922957274920903">"Abrir"</string> - <string name="menu_save" msgid="2394743337684426338">"Guardar"</string> - <string name="menu_share" msgid="3075149983979628146">"Compartir"</string> - <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Seleccionar todo"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copiar en…"</string> - <string name="menu_move" msgid="1828090633118079817">"Mover a…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nueva ventana"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cortar"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copiar"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Pegar"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Mostrar almac. interno"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ocultar almac. interno"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tamaño del archivo"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tamaño del archivo"</string> - <string name="button_select" msgid="527196987259139214">"Seleccionar"</string> - <string name="button_copy" msgid="8706475544635021302">"Copiar"</string> - <string name="button_move" msgid="2202666023104202232">"Mover"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Descartar"</string> - <string name="button_retry" msgid="4392027584153752797">"Reintentar"</string> - <string name="sort_name" msgid="9183560467917256779">"Por nombre"</string> - <string name="sort_date" msgid="586080032956151448">"Por fecha de modificación"</string> - <string name="sort_size" msgid="3350681319735474741">"Por tamaño"</string> - <string name="drawer_open" msgid="4545466532430226949">"Mostrar raíces"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ocultar raíces"</string> - <string name="save_error" msgid="6167009778003223664">"Error al guardar documento"</string> - <string name="create_error" msgid="3735649141335444215">"Error al crear la carpeta"</string> - <string name="query_error" msgid="5999895349602476581">"No se puede cargar contenido en este momento"</string> - <string name="root_recent" msgid="4470053704320518133">"Reciente"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> de espacio libre"</string> - <string name="root_type_service" msgid="2178854894416775409">"Servicios almacenamiento"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Accesos directos"</string> - <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Más aplicaciones"</string> - <string name="empty" msgid="7858882803708117596">"No hay elementos"</string> - <string name="no_results" msgid="6622510343880730446">"Sin coincidencias en %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"No se puede abrir el archivo"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos"</string> - <string name="share_via" msgid="8966594246261344259">"Compartir a través de"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copiando archivos"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Moviendo archivos"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Eliminando archivos"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Tiempo restante: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> archivos.</item> - <item quantity="one">Copiando <xliff:g id="COUNT_0">%1$d</xliff:g> archivo.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Moviendo <xliff:g id="COUNT_1">%1$d</xliff:g> archivos.</item> - <item quantity="one">Moviendo <xliff:g id="COUNT_0">%1$d</xliff:g> archivo.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Eliminando <xliff:g id="COUNT_1">%1$d</xliff:g> archivos.</item> - <item quantity="one">Eliminando <xliff:g id="COUNT_0">%1$d</xliff:g> archivo.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Deshacer"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Preparando para mover…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Preparando para eliminar…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> de <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">No se han podido copiar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> - <item quantity="one">No se ha podido copiar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">No se han podido mover <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> - <item quantity="one">No se ha podido mover <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">No se han podido eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos</item> - <item quantity="one">No se ha podido eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Toca para ver detalles"</string> - <string name="close" msgid="3043722427445528732">"Cerrar"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Archivos que no se han copiado: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Archivos que no se han movido: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Archivos que no se han eliminado: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Estos archivos se han convertido a otro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Se han copiado <xliff:g id="COUNT_1">%1$d</xliff:g> archivos al portapapeles.</item> - <item quantity="one">Se ha copiado <xliff:g id="COUNT_0">%1$d</xliff:g> archivo al portapapeles.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Los archivos seleccionados no se pueden pegar en esta ubicación."</string> - <string name="menu_rename" msgid="7678802479104285353">"Cambiar nombre"</string> - <string name="rename_error" msgid="4203041674883412606">"Error al cambiar el nombre del documento"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Expulsar"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Se han convertido algunos archivos"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"¿Permitir que <xliff:g id="APPNAME"><b>^1</b></xliff:g> acceda al directorio <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> (<xliff:g id="STORAGE"><i>^3</i></xliff:g>)?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"¿Permitir que <xliff:g id="APPNAME"><b>^1</b></xliff:g> acceda al directorio <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"¿Permitir que <xliff:g id="APPNAME"><b>^1</b></xliff:g> acceda a tus datos, incluidos los vídeos y las fotos, de <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"No volver a preguntar"</string> - <string name="allow" msgid="7225948811296386551">"Permitir"</string> - <string name="deny" msgid="2081879885755434506">"Denegar"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> seleccionados</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> seleccionado</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementos</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elemento</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"¿Eliminar <xliff:g id="NAME">%1$s</xliff:g>?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"¿Eliminar la carpeta <xliff:g id="NAME">%1$s</xliff:g> y su contenido?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">¿Eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> archivos?</item> - <item quantity="one">¿Eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> archivo?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">¿Eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> carpetas y su contenido?</item> - <item quantity="one">¿Eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> carpeta y su contenido?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">¿Eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> elementos?</item> - <item quantity="one">¿Eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> elemento?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml deleted file mode 100644 index 91f9204c1d7e..000000000000 --- a/packages/DocumentsUI/res/values-et-rEE/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Failid"</string> - <string name="downloads_label" msgid="959113951084633612">"Allalaadimised"</string> - <string name="title_open" msgid="4353228937663917801">"Ava asukohast:"</string> - <string name="title_save" msgid="2433679664882857999">"Salvesta:"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Uus kaust"</string> - <string name="menu_grid" msgid="6878021334497835259">"Ruudustikkuva"</string> - <string name="menu_list" msgid="7279285939892417279">"Loendikuva"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortimisalus"</string> - <string name="menu_search" msgid="3816712084502856974">"Otsing"</string> - <string name="menu_settings" msgid="8239065133341597825">"Salvestusruumi seaded"</string> - <string name="menu_open" msgid="432922957274920903">"Ava"</string> - <string name="menu_save" msgid="2394743337684426338">"Salvesta"</string> - <string name="menu_share" msgid="3075149983979628146">"Jaga"</string> - <string name="menu_delete" msgid="8138799623850614177">"Kustuta"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Vali kõik"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopeeri asukohta..."</string> - <string name="menu_move" msgid="1828090633118079817">"Teisalda asukohta..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Uus aken"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Lõika"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopeeri"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Kleebi"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Kuva sis. salvestusruum"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Peida sis. salvestusruum"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Kuva faili suurus"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Peida faili suurus"</string> - <string name="button_select" msgid="527196987259139214">"Vali"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopeeri"</string> - <string name="button_move" msgid="2202666023104202232">"Teisalda"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Loobu"</string> - <string name="button_retry" msgid="4392027584153752797">"Proovi uuesti"</string> - <string name="sort_name" msgid="9183560467917256779">"Nime järgi"</string> - <string name="sort_date" msgid="586080032956151448">"Muutmiskuupäeva järgi"</string> - <string name="sort_size" msgid="3350681319735474741">"Suuruse järgi"</string> - <string name="drawer_open" msgid="4545466532430226949">"Kuva juured"</string> - <string name="drawer_close" msgid="7602734368552123318">"Peida juured"</string> - <string name="save_error" msgid="6167009778003223664">"Dokumendi salvestamine ebaõnnestus"</string> - <string name="create_error" msgid="3735649141335444215">"Kausta loomine ebaõnnestus"</string> - <string name="query_error" msgid="5999895349602476581">"Sisu ei saa praegu laadida"</string> - <string name="root_recent" msgid="4470053704320518133">"Hiljutised"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> on vaba"</string> - <string name="root_type_service" msgid="2178854894416775409">"Mäluruumi teenused"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Otseteed"</string> - <string name="root_type_device" msgid="7121342474653483538">"Seadmed"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Rohkem rakendusi"</string> - <string name="empty" msgid="7858882803708117596">"Üksusi ei ole"</string> - <string name="no_results" msgid="6622510343880730446">"Otsing %1$s ei andnud vasteid"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Faili ei saa avada"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Mõnda dokumenti ei õnnestu kustutada"</string> - <string name="share_via" msgid="8966594246261344259">"Jagage teenusega"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Failide kopeerimine"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Failide teisaldamine"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Failide kustutamine"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Jäänud on <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> faili kopeerimine.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> faili kopeerimine.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Teisaldatakse <xliff:g id="COUNT_1">%1$d</xliff:g> faili.</item> - <item quantity="one">Teisaldatakse <xliff:g id="COUNT_0">%1$d</xliff:g> fail.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Kustutatakse <xliff:g id="COUNT_1">%1$d</xliff:g> faili.</item> - <item quantity="one">Kustutatakse <xliff:g id="COUNT_0">%1$d</xliff:g> fail.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Võta tagasi"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Kopeerimise ettevalmistamine …"</string> - <string name="move_preparing" msgid="2772219441375531410">"Teisaldamise ettevalmistamine …"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Kustutamise ettevalmistamine …"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> faili ei saanud kopeerida</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> faili ei saanud kopeerida</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> faili ei saanud teisaldada</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> faili ei saanud teisaldada</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> faili ei saanud kustutada</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> faili ei saanud kustutada</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Puudutage üksikasjade vaatamiseks"</string> - <string name="close" msgid="3043722427445528732">"Sule"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Neid faile ei kopeeritud: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Neid faile ei teisaldatud: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Neid faile ei kustutatud: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Need failid teisendati teise vormingusse: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> faili kopeeriti lõikelauale.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fail kopeeriti lõikelauale.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Valitud faile ei saa sellesse asukohta kleepida."</string> - <string name="menu_rename" msgid="7678802479104285353">"Nimeta ümber"</string> - <string name="rename_error" msgid="4203041674883412606">"Dokumendi ümbernimetamine ebaõnnestus"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Eemalda"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Mõned failid teisendati"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Kas anda rakendusele <xliff:g id="APPNAME"><b>^1</b></xliff:g> juurdepääs kataloogile <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> salvestusruumis <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Kas anda rakendusele <xliff:g id="APPNAME"><b>^1</b></xliff:g> juurdepääs kataloogile <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Kas anda rakendusele <xliff:g id="APPNAME"><b>^1</b></xliff:g> juurdepääs teie andmetele (sh fotod ja videod) salvestusruumis <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ära enam küsi"</string> - <string name="allow" msgid="7225948811296386551">"Luba"</string> - <string name="deny" msgid="2081879885755434506">"Keela"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> on valitud</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> on valitud</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> üksust</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> üksus</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Kas kustutada fail „<xliff:g id="NAME">%1$s</xliff:g>”?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Kas kustutada kaust „<xliff:g id="NAME">%1$s</xliff:g>” ja selle sisu?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Kas kustutada <xliff:g id="COUNT_1">%1$d</xliff:g> faili?</item> - <item quantity="one">Kas kustutada <xliff:g id="COUNT_0">%1$d</xliff:g> fail?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Kas kustutada <xliff:g id="COUNT_1">%1$d</xliff:g> kausta ja nende sisu?</item> - <item quantity="one">Kas kustutada <xliff:g id="COUNT_0">%1$d</xliff:g> kaust ja selle sisu?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Kas kustutada <xliff:g id="COUNT_1">%1$d</xliff:g> üksust?</item> - <item quantity="one">Kas kustutada <xliff:g id="COUNT_0">%1$d</xliff:g> üksus?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-eu-rES/strings.xml b/packages/DocumentsUI/res/values-eu-rES/strings.xml deleted file mode 100644 index 34db9652b1c7..000000000000 --- a/packages/DocumentsUI/res/values-eu-rES/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fitxategiak"</string> - <string name="downloads_label" msgid="959113951084633612">"Deskargak"</string> - <string name="title_open" msgid="4353228937663917801">"Ireki hemendik"</string> - <string name="title_save" msgid="2433679664882857999">"Gorde hemen"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Karpeta berria"</string> - <string name="menu_grid" msgid="6878021334497835259">"Sareta-ikuspegia"</string> - <string name="menu_list" msgid="7279285939892417279">"Zerrenda-ikuspegia"</string> - <string name="menu_sort" msgid="7677740407158414452">"Ordenatzeko irizpidea"</string> - <string name="menu_search" msgid="3816712084502856974">"Bilatu"</string> - <string name="menu_settings" msgid="8239065133341597825">"Memoriaren ezarpenak"</string> - <string name="menu_open" msgid="432922957274920903">"Ireki"</string> - <string name="menu_save" msgid="2394743337684426338">"Gorde"</string> - <string name="menu_share" msgid="3075149983979628146">"Partekatu"</string> - <string name="menu_delete" msgid="8138799623850614177">"Ezabatu"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Hautatu guztiak"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiatu hemen…"</string> - <string name="menu_move" msgid="1828090633118079817">"Eraman hona…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Leiho berria"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Ebaki"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiatu"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Itsatsi"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Erakutsi barneko memoria"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ezkutatu barneko memoria"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Erakutsi fitxategi-tamaina"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ezkutatu fitxategi-tamaina"</string> - <string name="button_select" msgid="527196987259139214">"Hautatu"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiatu"</string> - <string name="button_move" msgid="2202666023104202232">"Mugitu"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Baztertu"</string> - <string name="button_retry" msgid="4392027584153752797">"Saiatu berriro"</string> - <string name="sort_name" msgid="9183560467917256779">"Izenaren arabera"</string> - <string name="sort_date" msgid="586080032956151448">"Aldatze-dataren arabera"</string> - <string name="sort_size" msgid="3350681319735474741">"Tamainaren arabera"</string> - <string name="drawer_open" msgid="4545466532430226949">"Erakutsi erroko karpetak"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ezkutatu erroko karpetak"</string> - <string name="save_error" msgid="6167009778003223664">"Ezin izan da dokumentua gorde"</string> - <string name="create_error" msgid="3735649141335444215">"Ezin izan da karpeta sortu"</string> - <string name="query_error" msgid="5999895349602476581">"Une honetan ezin da kargatu edukia"</string> - <string name="root_recent" msgid="4470053704320518133">"Azkenak"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> doan"</string> - <string name="root_type_service" msgid="2178854894416775409">"Biltegiratze-zerbitzuak"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Lasterbideak"</string> - <string name="root_type_device" msgid="7121342474653483538">"Gailuak"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Aplikazio gehiago"</string> - <string name="empty" msgid="7858882803708117596">"Ez dago elementurik"</string> - <string name="no_results" msgid="6622510343880730446">"Ez da aurkitu ezer %1$s atalean"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Ezin da ireki fitxategia"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Ezin izan dira dokumentu batzuk ezabatu"</string> - <string name="share_via" msgid="8966594246261344259">"Partekatu honen bidez:"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Fitxategiak kopiatzen"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Fitxategiak mugitzea"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Fitxategiak ezabatzea"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Falta den denbora: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi kopiatzen.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi kopiatzen.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi mugitzen.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi mugitzen.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi ezabatzen ari dira.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi ezabatzen ari da.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Desegin"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Kopiatzeko prestatzen…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Mugitzeko prestatzen…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Ezabatzeko prestatzen…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Ezin izan dira kopiatu <xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi</item> - <item quantity="one">Ezin izan da kopiatu <xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Ezin izan dira mugitu <xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi</item> - <item quantity="one">Ezin izan da mugitu <xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Ezin izan dira ezabatu <xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi</item> - <item quantity="one">Ezin izan da ezabatu <xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Sakatu xehetasunak ikusteko"</string> - <string name="close" msgid="3043722427445528732">"Itxi"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Ez dira kopiatu fitxategi hauek: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Ez dira mugitu fitxategi hauek: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Ez dira ezabatu fitxategi hauek: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Fitxategi hauek beste formatu bateko fitxategi bihurtu dira: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi kopiatu dira arbelean.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi kopiatu da arbelean.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Ezin dira itsatsi hautatutako fitxategiak kokapen honetan."</string> - <string name="menu_rename" msgid="7678802479104285353">"Aldatu izena"</string> - <string name="rename_error" msgid="4203041674883412606">"Ezin izan zaio aldatu izena dokumentuari"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Atera"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Artxibo batzuk bihurtu dira"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> aplikazioari <xliff:g id="STORAGE"><i>^3</i></xliff:g> unitateko <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> direktorioa atzitzeko baimena eman nahi diozu?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> aplikazioari <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> direktoriorako sarbidea eman nahi diozu?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> aplikazioari zure datuak atzitzea baimendu nahi diozu, besteak beste, <xliff:g id="STORAGE"><i>^2</i></xliff:g> biltegian dituzun argazkiak eta bideoak?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ez galdetu berriro"</string> - <string name="allow" msgid="7225948811296386551">"Onartu"</string> - <string name="deny" msgid="2081879885755434506">"Ukatu"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> hautatuta</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> hautatuta</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementu</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elementu</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ezabatu nahi duzu?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" karpeta eta bertako edukia ezabatu nahi duzu?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fitxategi ezabatu nahi dituzu?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fitxategi ezabatu nahi duzu?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> karpeta eta beren eduki guztia ezabatu nahi duzu?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> karpeta eta bere eduki guztia ezabatu nahi duzu?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementu ezabatu nahi dituzu?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elementu ezabatu nahi duzu?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml deleted file mode 100644 index 4db84b96a849..000000000000 --- a/packages/DocumentsUI/res/values-fa/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Files"</string> - <string name="downloads_label" msgid="959113951084633612">"بارگیریها"</string> - <string name="title_open" msgid="4353228937663917801">"باز کردن از"</string> - <string name="title_save" msgid="2433679664882857999">"ذخیره در"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"پوشه جدید"</string> - <string name="menu_grid" msgid="6878021334497835259">"نمای جدولی"</string> - <string name="menu_list" msgid="7279285939892417279">"نمای فهرستی"</string> - <string name="menu_sort" msgid="7677740407158414452">"مرتبسازی براساس"</string> - <string name="menu_search" msgid="3816712084502856974">"جستجو"</string> - <string name="menu_settings" msgid="8239065133341597825">"تنظیمات ذخیرهسازی"</string> - <string name="menu_open" msgid="432922957274920903">"باز کردن"</string> - <string name="menu_save" msgid="2394743337684426338">"ذخیره"</string> - <string name="menu_share" msgid="3075149983979628146">"اشتراکگذاری"</string> - <string name="menu_delete" msgid="8138799623850614177">"حذف"</string> - <string name="menu_select_all" msgid="8323579667348729928">"انتخاب همه"</string> - <string name="menu_copy" msgid="3612326052677229148">"کپی در..."</string> - <string name="menu_move" msgid="1828090633118079817">"انتقال به…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"پنجره جدید"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"برش"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"کپی"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"جایگذاری"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"نمایش فضای ذخیرهسازی داخلی"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"پنهان کردن فضای ذخیرهسازی داخلی"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"نمایش اندازه فایل"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"پنهان کردن اندازه فایل"</string> - <string name="button_select" msgid="527196987259139214">"انتخاب"</string> - <string name="button_copy" msgid="8706475544635021302">"کپی"</string> - <string name="button_move" msgid="2202666023104202232">"انتقال"</string> - <string name="button_dismiss" msgid="3714065566893946085">"نپذیرفتن"</string> - <string name="button_retry" msgid="4392027584153752797">"دوباره امتحان کنید"</string> - <string name="sort_name" msgid="9183560467917256779">"براساس نام"</string> - <string name="sort_date" msgid="586080032956151448">"براساس تاریخ اصلاح"</string> - <string name="sort_size" msgid="3350681319735474741">"براساس اندازه"</string> - <string name="drawer_open" msgid="4545466532430226949">"نمایش ریشهها"</string> - <string name="drawer_close" msgid="7602734368552123318">"پنهان کردن ریشهها"</string> - <string name="save_error" msgid="6167009778003223664">"ذخیره سند انجام نشد"</string> - <string name="create_error" msgid="3735649141335444215">"ایجاد پوشه انجام نشد"</string> - <string name="query_error" msgid="5999895349602476581">"محتوا درحال حاضر بارگیری نمیشود"</string> - <string name="root_recent" msgid="4470053704320518133">"اخیر"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> آزاد"</string> - <string name="root_type_service" msgid="2178854894416775409">"خدمات ذخیرهسازی"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"میانبرها"</string> - <string name="root_type_device" msgid="7121342474653483538">"دستگاهها"</string> - <string name="root_type_apps" msgid="8838065367985945189">"برنامههای بیشتر"</string> - <string name="empty" msgid="7858882803708117596">"موردی موجود نیست"</string> - <string name="no_results" msgid="6622510343880730446">"مورد منطبقی در %1$s وجود ندارد"</string> - <string name="toast_no_application" msgid="4632640357724698144">"فایل باز نمیشود"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"برخی از اسناد حذف نمیشوند"</string> - <string name="share_via" msgid="8966594246261344259">"اشتراکگذاری از طریق"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"در حال کپی کردن فایلها"</string> - <string name="move_notification_title" msgid="6193835179777284805">"درحال انتقال فایلها"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"در حال حذف فایلها"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> باقیمانده"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">در حال کپی کردن <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item> - <item quantity="other">در حال کپی کردن <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">در حال انتقال <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item> - <item quantity="other">در حال انتقال <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">در حال حذف <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item> - <item quantity="other">در حال حذف <xliff:g id="COUNT_1">%1$d</xliff:g> فایل.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"لغو"</string> - <string name="copy_preparing" msgid="3896202461003039386">"در حال آمادهسازی برای کپی..."</string> - <string name="move_preparing" msgid="2772219441375531410">"درحال آمادهسازی برای انتقال…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"درحال آمادهسازی برای حذف…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> فایل کپی نشد</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> فایل کپی نشد</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> فایل منتقل نشد</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> فایل منتقل نشد</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> فایل حذف نشد</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> فایل حذف نشد</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"برای مشاهده جزئیات ضربه بزنید"</string> - <string name="close" msgid="3043722427445528732">"بستن"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"این فایلها کپی نشدند: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"این فایلها منتقل نشدند: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"این فایلها حذف نشدند: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"این فایلها به قالب دیگری تبدیل شدند: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> فایل در بریدهدان کپی شد.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فایل در بریدهدان کپی شد.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"نمیتوان فایلهای انتخابی را در این مکان جایگذاری کرد."</string> - <string name="menu_rename" msgid="7678802479104285353">"تغییر نام"</string> - <string name="rename_error" msgid="4203041674883412606">"نام سند تغییر نکرد"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"بیرون راندن"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"بعضی از فایلها تبدیل شدند"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"به <xliff:g id="APPNAME"><b>^1</b></xliff:g> اجازه داده شود به فهرست راهنمای <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> در <xliff:g id="STORAGE"><i>^3</i></xliff:g> دسترسی داشته باشد؟"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"به <xliff:g id="APPNAME"><b>^1</b></xliff:g> اجازه دسترسی به دایرکتوری <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> داده شود؟"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"به <xliff:g id="APPNAME"><b>^1</b></xliff:g> اجازه میدهید به دادههایتان دسترسی پیدا کند، از جمله عکسها و ویدیوهایتان در <xliff:g id="STORAGE"><i>^2</i></xliff:g>؟"</string> - <string name="never_ask_again" msgid="4295278542972859268">"دوباره سؤال نشود"</string> - <string name="allow" msgid="7225948811296386551">"ارزیابیشده"</string> - <string name="deny" msgid="2081879885755434506">"اجازه ندارد"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> مورد انتخاب شد</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> مورد انتخاب شد</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> مورد</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> مورد</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"«<xliff:g id="NAME">%1$s</xliff:g>» حذف شود؟"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"پوشه «<xliff:g id="NAME">%1$s</xliff:g>» و محتوای آن حذف شود؟"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> فایل حذف شود؟</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فایل حذف شود؟</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> پوشه و محتوای آنها حذف شود؟</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> پوشه و محتوای آنها حذف شود؟</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> مورد حذف شود؟</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> مورد حذف شود؟</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml deleted file mode 100644 index d1d00326c565..000000000000 --- a/packages/DocumentsUI/res/values-fi/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Tiedostot"</string> - <string name="downloads_label" msgid="959113951084633612">"Lataukset"</string> - <string name="title_open" msgid="4353228937663917801">"Avaa sijainnista"</string> - <string name="title_save" msgid="2433679664882857999">"Tallenna kohteeseen"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Uusi kansio"</string> - <string name="menu_grid" msgid="6878021334497835259">"Ruudukkonäkymä"</string> - <string name="menu_list" msgid="7279285939892417279">"Luettelonäkymä"</string> - <string name="menu_sort" msgid="7677740407158414452">"Lajitteluperuste"</string> - <string name="menu_search" msgid="3816712084502856974">"Haku"</string> - <string name="menu_settings" msgid="8239065133341597825">"Tallennusasetukset"</string> - <string name="menu_open" msgid="432922957274920903">"Avaa"</string> - <string name="menu_save" msgid="2394743337684426338">"Tallenna"</string> - <string name="menu_share" msgid="3075149983979628146">"Jaa"</string> - <string name="menu_delete" msgid="8138799623850614177">"Poista"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Valitse kaikki"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopioi kohteeseen…"</string> - <string name="menu_move" msgid="1828090633118079817">"Siirrä kohteeseen…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Uusi ikkuna"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Leikkaa"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopioi"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Liitä"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Näytä sis. tallennustila"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Piilota sis. tallennust."</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Näytä tiedostokoko"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Piilota tiedostokoko"</string> - <string name="button_select" msgid="527196987259139214">"Valitse"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopioi"</string> - <string name="button_move" msgid="2202666023104202232">"Siirrä"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Hylkää"</string> - <string name="button_retry" msgid="4392027584153752797">"Yritä uudelleen"</string> - <string name="sort_name" msgid="9183560467917256779">"Nimen mukaan"</string> - <string name="sort_date" msgid="586080032956151448">"Muokkauspäivän mukaan"</string> - <string name="sort_size" msgid="3350681319735474741">"Koon mukaan"</string> - <string name="drawer_open" msgid="4545466532430226949">"Näytä juuret"</string> - <string name="drawer_close" msgid="7602734368552123318">"Piilota juuret"</string> - <string name="save_error" msgid="6167009778003223664">"Asiakirjan tallennus epäonnistui"</string> - <string name="create_error" msgid="3735649141335444215">"Kansion luominen epäonnistui"</string> - <string name="query_error" msgid="5999895349602476581">"Sisältöä ei juuri nyt voi ladata."</string> - <string name="root_recent" msgid="4470053704320518133">"Viimeisimmät"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> vapaana"</string> - <string name="root_type_service" msgid="2178854894416775409">"Tallennuspalvelut"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Pikakuvakkeet"</string> - <string name="root_type_device" msgid="7121342474653483538">"Laitteet"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Lisää sovelluksia"</string> - <string name="empty" msgid="7858882803708117596">"Ei kohteita"</string> - <string name="no_results" msgid="6622510343880730446">"Ei osumia kohteessa %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Tiedoston avaaminen epäonnistui."</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Joitakin asiakirjoja ei voi poistaa"</string> - <string name="share_via" msgid="8966594246261344259">"Jaa sovelluksessa"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopioidaan tiedostoja"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Siirretään tiedostoja"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Poistetaan tiedostoja"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> jäljellä"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Kopioidaan <xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa.</item> - <item quantity="one">Kopioidaan <xliff:g id="COUNT_0">%1$d</xliff:g> tiedosto.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Siirretään <xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa.</item> - <item quantity="one">Siirretään <xliff:g id="COUNT_0">%1$d</xliff:g> tiedosto.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Poistetaan <xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa.</item> - <item quantity="one">Poistetaan <xliff:g id="COUNT_0">%1$d</xliff:g> tiedosto.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Kumoa"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Valmistellaan kopiointia…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Valmistellaan siirtämistä…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Valmistellaan poistamista…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> tiedoston kopioiminen epäonnistui.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> tiedoston kopioiminen epäonnistui.</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> tiedoston siirtäminen epäonnistui.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> tiedoston siirtäminen epäonnistui.</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> tiedoston poistaminen epäonnistui.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> tiedoston poistaminen epäonnistui.</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tarkastele tietoja napauttamalla"</string> - <string name="close" msgid="3043722427445528732">"Sulje"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Näitä tiedostoja ei kopioitu: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Näitä tiedostoja ei siirretty: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Näitä tiedostoja ei poistettu: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Seuraavat tiedostot muunnettiin toiseen muotoon: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa kopioitiin leikepöydälle.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> tiedosto kopioitiin leikepöydälle.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Valittuja tiedostoja ei voi liittää tähän sijaintiin."</string> - <string name="menu_rename" msgid="7678802479104285353">"Nimeä uudelleen"</string> - <string name="rename_error" msgid="4203041674883412606">"Dokumentin nimen muuttaminen epäonnistui."</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Poista"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Joitakin tiedostoja muunnettiin."</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Myönnetäänkö sovellukselle <xliff:g id="APPNAME"><b>^1</b></xliff:g> sijainnissa <xliff:g id="STORAGE"><i>^3</i></xliff:g> olevan hakemiston <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> käyttöoikeus?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Saako <xliff:g id="APPNAME"><b>^1</b></xliff:g> käyttää hakemistoa <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Myönnetäänkö sovellukselle <xliff:g id="APPNAME"><b>^1</b></xliff:g> sijainnissa <xliff:g id="STORAGE"><i>^2</i></xliff:g> olevien tietojesi, mukaan lukien valokuviesi ja videoidesi, käyttöoikeus?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Älä kysy uudestaan"</string> - <string name="allow" msgid="7225948811296386551">"Salli"</string> - <string name="deny" msgid="2081879885755434506">"Kiellä"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valittu</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> valittu</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> kohdetta</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> kohde</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Poistetaanko <xliff:g id="NAME">%1$s</xliff:g>?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Poistetaanko kansio <xliff:g id="NAME">%1$s</xliff:g> ja sen sisältö?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Poistetaanko <xliff:g id="COUNT_1">%1$d</xliff:g> tiedostoa?</item> - <item quantity="one">Poistetaanko <xliff:g id="COUNT_0">%1$d</xliff:g> tiedosto?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Poistetaanko <xliff:g id="COUNT_1">%1$d</xliff:g> kansiota ja niiden sisältö?</item> - <item quantity="one">Poistetaanko <xliff:g id="COUNT_0">%1$d</xliff:g> kansio ja sen sisältö?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Poistetaanko <xliff:g id="COUNT_1">%1$d</xliff:g> kohdetta?</item> - <item quantity="one">Poistetaanko <xliff:g id="COUNT_0">%1$d</xliff:g> kohde?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml deleted file mode 100644 index ae76565e3c57..000000000000 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fichiers"</string> - <string name="downloads_label" msgid="959113951084633612">"Téléchargements"</string> - <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string> - <string name="title_save" msgid="2433679664882857999">"Enregistrer dans"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nouveau dossier"</string> - <string name="menu_grid" msgid="6878021334497835259">"Grille"</string> - <string name="menu_list" msgid="7279285939892417279">"Liste"</string> - <string name="menu_sort" msgid="7677740407158414452">"Trier par"</string> - <string name="menu_search" msgid="3816712084502856974">"Rechercher"</string> - <string name="menu_settings" msgid="8239065133341597825">"Paramètres de stockage"</string> - <string name="menu_open" msgid="432922957274920903">"Ouvrir"</string> - <string name="menu_save" msgid="2394743337684426338">"Enregistrer"</string> - <string name="menu_share" msgid="3075149983979628146">"Partager"</string> - <string name="menu_delete" msgid="8138799623850614177">"Supprimer"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Tout sélectionner"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copier dans..."</string> - <string name="menu_move" msgid="1828090633118079817">"Déplacer dans…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nouvelle fenêtre"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Couper"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copier"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Coller"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Aff. mém. stock. interne"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Masquer mém. stock. int."</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Afficher taille fichier"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Masquer taille fichier"</string> - <string name="button_select" msgid="527196987259139214">"Sélectionner"</string> - <string name="button_copy" msgid="8706475544635021302">"Copier"</string> - <string name="button_move" msgid="2202666023104202232">"Déplacer"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Faire disparaître"</string> - <string name="button_retry" msgid="4392027584153752797">"Réessayer"</string> - <string name="sort_name" msgid="9183560467917256779">"Par nom"</string> - <string name="sort_date" msgid="586080032956151448">"Par date de modification"</string> - <string name="sort_size" msgid="3350681319735474741">"Par taille"</string> - <string name="drawer_open" msgid="4545466532430226949">"Afficher les racines"</string> - <string name="drawer_close" msgid="7602734368552123318">"Masquer les racines"</string> - <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document"</string> - <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier"</string> - <string name="query_error" msgid="5999895349602476581">"Impossible de charger le contenu pour le moment"</string> - <string name="root_recent" msgid="4470053704320518133">"Récents"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> disponible"</string> - <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Raccourcis"</string> - <string name="root_type_device" msgid="7121342474653483538">"Appareils"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Plus d\'applications"</string> - <string name="empty" msgid="7858882803708117596">"Aucun élément"</string> - <string name="no_results" msgid="6622510343880730446">"Aucune correspondance dans %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Impossible d\'ouvrir le fichier"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents"</string> - <string name="share_via" msgid="8966594246261344259">"Partager par"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copie de fichiers..."</string> - <string name="move_notification_title" msgid="6193835179777284805">"Déplacement des fichiers"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Suppression des fichiers"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Durée restante : <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Copier de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier en cours.</item> - <item quantity="other">Copier de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers en cours.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Déplacement de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier en cours.</item> - <item quantity="other">Déplacement de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers en cours.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Suppression de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier.</item> - <item quantity="other">Suppression de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Annuler"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Préparation de la copie en cours"</string> - <string name="move_preparing" msgid="2772219441375531410">"Préparation du déplacement..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Préparation de la suppression..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> sur <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Impossible de copier <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> - <item quantity="other">Impossible de copier <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Impossible de déplacer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> - <item quantity="other">Impossible de déplacer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Impossible de supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> dossier</item> - <item quantity="other">Impossible de supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> dossiers</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Touchez pour afficher les détails"</string> - <string name="close" msgid="3043722427445528732">"Fermer"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Ces fichiers ne ont pas été copiés : <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Ces fichiers n\'ont pas été déplacés : <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Ces fichiers n\'ont pas été supprimés : <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ces fichiers ont été convertis dans un autre format : <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fichier a été copié dans le presse-papiers.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fichiers ont été copiés dans le presse-papiers.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Impossible de coller les fichiers sélectionnés à cet endroit."</string> - <string name="menu_rename" msgid="7678802479104285353">"Renommer"</string> - <string name="rename_error" msgid="4203041674883412606">"Impossible de renommer le document"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Éjecter"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Certains fichiers ont été convertis"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Accorder à <xliff:g id="APPNAME"><b>^1</b></xliff:g> l\'accès au répertoire <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> sur <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Accorder à <xliff:g id="APPNAME"><b>^1</b></xliff:g> l\'accès au répertoire <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Voulez-vous accorder l\'accès à vos données à <xliff:g id="APPNAME"><b>^1</b></xliff:g>, y compris vos photos et vos vidéos, sur <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ne plus me demander"</string> - <string name="allow" msgid="7225948811296386551">"Autoriser"</string> - <string name="deny" msgid="2081879885755434506">"Refuser"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> sélectionné</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> sélectionnés</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> article</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> articles</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Supprimer « <xliff:g id="NAME">%1$s</xliff:g> »?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Supprimer le dossier « <xliff:g id="NAME">%1$s</xliff:g> » et son contenu?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier?</item> - <item quantity="other">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> dossier et son contenu?</item> - <item quantity="other">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> dossiers et leur contenu?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> élément?</item> - <item quantity="other">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> éléments?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml deleted file mode 100644 index 5f45aae2c8b6..000000000000 --- a/packages/DocumentsUI/res/values-fr/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fichiers"</string> - <string name="downloads_label" msgid="959113951084633612">"Téléchargements"</string> - <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string> - <string name="title_save" msgid="2433679664882857999">"Enregistrer sous"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nouveau dossier"</string> - <string name="menu_grid" msgid="6878021334497835259">"Grille"</string> - <string name="menu_list" msgid="7279285939892417279">"Liste"</string> - <string name="menu_sort" msgid="7677740407158414452">"Trier par"</string> - <string name="menu_search" msgid="3816712084502856974">"Rechercher"</string> - <string name="menu_settings" msgid="8239065133341597825">"Paramètres de stockage"</string> - <string name="menu_open" msgid="432922957274920903">"Ouvrir"</string> - <string name="menu_save" msgid="2394743337684426338">"Enregistrer"</string> - <string name="menu_share" msgid="3075149983979628146">"Partager"</string> - <string name="menu_delete" msgid="8138799623850614177">"Supprimer"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Tout sélectionner"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copier vers…"</string> - <string name="menu_move" msgid="1828090633118079817">"Placer dans…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nouvelle fenêtre"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Couper"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copier"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Coller"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Aff. mém. stock. interne"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Masquer mém. stock. int."</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Afficher taille fichier"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Masquer taille fichier"</string> - <string name="button_select" msgid="527196987259139214">"Sélectionner"</string> - <string name="button_copy" msgid="8706475544635021302">"Copier"</string> - <string name="button_move" msgid="2202666023104202232">"Déplacer"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Fermer"</string> - <string name="button_retry" msgid="4392027584153752797">"Réessayer"</string> - <string name="sort_name" msgid="9183560467917256779">"Par nom"</string> - <string name="sort_date" msgid="586080032956151448">"Par date de modification"</string> - <string name="sort_size" msgid="3350681319735474741">"Par taille"</string> - <string name="drawer_open" msgid="4545466532430226949">"Afficher les répertoires racines"</string> - <string name="drawer_close" msgid="7602734368552123318">"Masquer les répertoires racines"</string> - <string name="save_error" msgid="6167009778003223664">"Échec de l\'enregistrement du document."</string> - <string name="create_error" msgid="3735649141335444215">"Échec de la création du dossier."</string> - <string name="query_error" msgid="5999895349602476581">"Impossible de charger le contenu pour le moment"</string> - <string name="root_recent" msgid="4470053704320518133">"Récents"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Espace disponible : <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Services de stockage"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Raccourcis"</string> - <string name="root_type_device" msgid="7121342474653483538">"Appareils"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Autres applications"</string> - <string name="empty" msgid="7858882803708117596">"Aucun élément"</string> - <string name="no_results" msgid="6622510343880730446">"Aucune correspondance dans %1$s."</string> - <string name="toast_no_application" msgid="4632640357724698144">"Impossible d\'ouvrir le fichier"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents."</string> - <string name="share_via" msgid="8966594246261344259">"Partager via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copie de fichiers en cours"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Déplacement de fichiers"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Suppression des fichiers…"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Temps restant : <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier en cours…</item> - <item quantity="other">Copie de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers en cours…</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Déplacement de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier en cours…</item> - <item quantity="other">Déplacement de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers en cours…</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Suppression de <xliff:g id="COUNT_1">%1$d</xliff:g> fichier en cours…</item> - <item quantity="other">Suppression de <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers en cours…</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Annuler"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Préparation de la copie en cours…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Préparation au déplacement…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Préparation à la suppression…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Impossible de copier <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> - <item quantity="other">Impossible de copier <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Impossible de déplacer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> - <item quantity="other">Impossible de déplacer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Impossible de supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier</item> - <item quantity="other">Impossible de supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Appuyez pour afficher plus d\'informations."</string> - <string name="close" msgid="3043722427445528732">"Fermer"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Les fichiers suivants n\'ont pas été copiés : <xliff:g id="LIST">%1$s</xliff:g>."</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Les fichiers suivants n\'ont pas été déplacés : <xliff:g id="LIST">%1$s</xliff:g>."</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Les fichiers suivants n\'ont pas été supprimés : <xliff:g id="LIST">%1$s</xliff:g>."</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ces fichiers ont été convertis dans un autre format : <xliff:g id="LIST">%1$s</xliff:g>."</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fichier a bien été copié dans le Presse-papiers.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fichiers ont bien été copiés dans le Presse-papiers.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Impossible de coller les fichiers sélectionnés à cet endroit."</string> - <string name="menu_rename" msgid="7678802479104285353">"Renommer"</string> - <string name="rename_error" msgid="4203041674883412606">"Échec du changement de nom du document."</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Éjecter"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Certains fichiers ont été convertis"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Autoriser <xliff:g id="APPNAME"><b>^1</b></xliff:g> à accéder à l\'annuaire \"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>\" sur <xliff:g id="STORAGE"><i>^3</i></xliff:g> ?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Autoriser <xliff:g id="APPNAME"><b>^1</b></xliff:g> à accéder à l\'annuaire \"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>\" ?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Autoriser <xliff:g id="APPNAME"><b>^1</b></xliff:g> à accéder à vos données, y compris les photos et les vidéos, sur <xliff:g id="STORAGE"><i>^2</i></xliff:g> ?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ne plus demander"</string> - <string name="allow" msgid="7225948811296386551">"Autoriser"</string> - <string name="deny" msgid="2081879885755434506">"Refuser"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Supprimer \"<xliff:g id="NAME">%1$s</xliff:g>\" ?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Supprimer le dossier \"<xliff:g id="NAME">%1$s</xliff:g>\" et son contenu ?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichier ?</item> - <item quantity="other">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> fichiers ?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> dossier et son contenu ?</item> - <item quantity="other">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> dossiers et leur contenu ?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> élément ?</item> - <item quantity="other">Supprimer <xliff:g id="COUNT_1">%1$d</xliff:g> éléments ?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-gl-rES/strings.xml b/packages/DocumentsUI/res/values-gl-rES/strings.xml deleted file mode 100644 index 46a5fb0dbb7c..000000000000 --- a/packages/DocumentsUI/res/values-gl-rES/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Ficheiros"</string> - <string name="downloads_label" msgid="959113951084633612">"Descargas"</string> - <string name="title_open" msgid="4353228937663917801">"Abrir desde"</string> - <string name="title_save" msgid="2433679664882857999">"Gardar en"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Novo cartafol"</string> - <string name="menu_grid" msgid="6878021334497835259">"Vista de grade"</string> - <string name="menu_list" msgid="7279285939892417279">"Vista de lista"</string> - <string name="menu_sort" msgid="7677740407158414452">"Ordenar por"</string> - <string name="menu_search" msgid="3816712084502856974">"Buscar"</string> - <string name="menu_settings" msgid="8239065133341597825">"Configur. almacenamento"</string> - <string name="menu_open" msgid="432922957274920903">"Abrir"</string> - <string name="menu_save" msgid="2394743337684426338">"Gardar"</string> - <string name="menu_share" msgid="3075149983979628146">"Compartir"</string> - <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Seleccionar todo"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copiar en…"</string> - <string name="menu_move" msgid="1828090633118079817">"Mover a…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nova ventá"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cortar"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copiar"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Pegar"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Mostrar almacen. interno"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ocultar almacen. interno"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tamaño ficheiro"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tamaño ficheiro"</string> - <string name="button_select" msgid="527196987259139214">"Seleccionar"</string> - <string name="button_copy" msgid="8706475544635021302">"Copiar"</string> - <string name="button_move" msgid="2202666023104202232">"Mover"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Ignorar"</string> - <string name="button_retry" msgid="4392027584153752797">"Tentar de novo"</string> - <string name="sort_name" msgid="9183560467917256779">"Por nome"</string> - <string name="sort_date" msgid="586080032956151448">"Por data de modificación"</string> - <string name="sort_size" msgid="3350681319735474741">"Por tamaño"</string> - <string name="drawer_open" msgid="4545466532430226949">"Mostrar raíces"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ocultar raíces"</string> - <string name="save_error" msgid="6167009778003223664">"Non se puido gardar o documento"</string> - <string name="create_error" msgid="3735649141335444215">"Non se puido crear o cartafol"</string> - <string name="query_error" msgid="5999895349602476581">"Non se pode cargar o contido neste momento"</string> - <string name="root_recent" msgid="4470053704320518133">"Recentes"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> libres"</string> - <string name="root_type_service" msgid="2178854894416775409">"Servizos de almacenamento"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Atallos"</string> - <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Máis aplicacións"</string> - <string name="empty" msgid="7858882803708117596">"Ningún elemento"</string> - <string name="no_results" msgid="6622510343880730446">"Non hai coincidencias en %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Non se pode abrir o ficheiro"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Non se poden eliminar algúns documentos"</string> - <string name="share_via" msgid="8966594246261344259">"Compartir a través de"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copiando ficheiros"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Mover ficheiros"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Eliminando ficheiros"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Tempo restante: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> - <item quantity="one">Copianto <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Movendo <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> - <item quantity="one">Movendo <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Eliminando <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> - <item quantity="one">Eliminando <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Desfacer"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Preparándose para mover..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Preparando para eliminar…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Non se puideron copiar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> - <item quantity="one">Non se puido copiar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Non se puideron mover <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> - <item quantity="one">Non se puido mover <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Non se puideron eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> - <item quantity="one">Non se puido eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Toca para ver detalles"</string> - <string name="close" msgid="3043722427445528732">"Pechar"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Non se copiaron estes ficheiros: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Non se moveron estes ficheiros: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Non se eliminaron estes ficheiros: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Estes ficheiros convertéronse a outro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Copiáronse <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros no portapapeis.</item> - <item quantity="one">Copiouse <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro no portapapeis.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Non se poden pegar os ficheiros seleccionados nesta localización."</string> - <string name="menu_rename" msgid="7678802479104285353">"Cambiar nome"</string> - <string name="rename_error" msgid="4203041674883412606">"Non se puido cambiar o nome do documento"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Expulsar"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Convertéronse algúns ficheiros"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Queres outorgar acceso a <xliff:g id="APPNAME"><b>^1</b></xliff:g> ao directorio <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> no almacenamento de <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Queres darlle acceso a <xliff:g id="APPNAME"><b>^1</b></xliff:g> ao directorio <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Queres darlle acceso a <xliff:g id="APPNAME"><b>^1</b></xliff:g> aos teus datos almacenados en <xliff:g id="STORAGE"><i>^2</i></xliff:g>, incluídos vídeos e fotos?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Non preguntar de novo"</string> - <string name="allow" msgid="7225948811296386551">"Permitir"</string> - <string name="deny" msgid="2081879885755434506">"Rexeitar"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">Seleccionáronse <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">Seleccionouse <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementos</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elemento</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Queres eliminar \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Queres eliminar o cartafol \"<xliff:g id="NAME">%1$s</xliff:g>\" e o seu contido?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Queres eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros?</item> - <item quantity="one">Queres eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Queres eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> cartafoles e os seus contidos?</item> - <item quantity="one">Queres eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> cartafol e os seus contidos?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Queres eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> elementos?</item> - <item quantity="one">Queres eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> elemento?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-gu-rIN/strings.xml b/packages/DocumentsUI/res/values-gu-rIN/strings.xml deleted file mode 100644 index 974d1f2d13cf..000000000000 --- a/packages/DocumentsUI/res/values-gu-rIN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ફાઇલો"</string> - <string name="downloads_label" msgid="959113951084633612">"ડાઉનલોડ્સ"</string> - <string name="title_open" msgid="4353228937663917801">"અહીંથી ખોલો"</string> - <string name="title_save" msgid="2433679664882857999">"આમાં સાચવો"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"નવું ફોલ્ડર"</string> - <string name="menu_grid" msgid="6878021334497835259">"ગ્રિડ દૃશ્ય"</string> - <string name="menu_list" msgid="7279285939892417279">"સૂચિ દૃશ્ય"</string> - <string name="menu_sort" msgid="7677740407158414452">"આ પ્રમાણે સૉર્ટ કરો"</string> - <string name="menu_search" msgid="3816712084502856974">"શોધો"</string> - <string name="menu_settings" msgid="8239065133341597825">"સ્ટોરેજ સેટિંગ્સ"</string> - <string name="menu_open" msgid="432922957274920903">"ખોલો"</string> - <string name="menu_save" msgid="2394743337684426338">"સાચવો"</string> - <string name="menu_share" msgid="3075149983979628146">"શેર કરો"</string> - <string name="menu_delete" msgid="8138799623850614177">"કાઢી નાખો"</string> - <string name="menu_select_all" msgid="8323579667348729928">"બધા પસંદ કરો"</string> - <string name="menu_copy" msgid="3612326052677229148">"આના પર કૉપિ કરો…"</string> - <string name="menu_move" msgid="1828090633118079817">"આમાં ખસેડો…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"નવી વિંડો"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"કાપો"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"કૉપિ કરો"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"પેસ્ટ કરો"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"આંતરિક સ્ટોરેજ બતાવો"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"આંતરિક સંગ્રહ છુપાવો"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ફાઇલ કદ બતાવો"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ફાઇલ કદ છુપાવો"</string> - <string name="button_select" msgid="527196987259139214">"પસંદ કરો"</string> - <string name="button_copy" msgid="8706475544635021302">"કૉપિ કરો"</string> - <string name="button_move" msgid="2202666023104202232">"ખસેડો"</string> - <string name="button_dismiss" msgid="3714065566893946085">"છોડી દો"</string> - <string name="button_retry" msgid="4392027584153752797">"ફરીથી પ્રયત્ન કરો"</string> - <string name="sort_name" msgid="9183560467917256779">"નામ દ્વારા"</string> - <string name="sort_date" msgid="586080032956151448">"સંશોધન તારીખ દ્વારા"</string> - <string name="sort_size" msgid="3350681319735474741">"કદ દ્વારા"</string> - <string name="drawer_open" msgid="4545466532430226949">"રૂટ્સ બતાવો"</string> - <string name="drawer_close" msgid="7602734368552123318">"રૂટ્સ છુપાવો"</string> - <string name="save_error" msgid="6167009778003223664">"દસ્તાવેજ સાચવવામાં નિષ્ફળ થયાં."</string> - <string name="create_error" msgid="3735649141335444215">"ફોલ્ડર બનાવવામાં નિષ્ફળ થયા"</string> - <string name="query_error" msgid="5999895349602476581">"આ પળે સામગ્રી લોડ કરી શકતાં નથી"</string> - <string name="root_recent" msgid="4470053704320518133">"તાજેતરના"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ખાલી"</string> - <string name="root_type_service" msgid="2178854894416775409">"સંગ્રહ સેવાઓ"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"શોર્ટકટ્સ"</string> - <string name="root_type_device" msgid="7121342474653483538">"ઉપકરણો"</string> - <string name="root_type_apps" msgid="8838065367985945189">"વધુ ઍપ્લિકેશનો"</string> - <string name="empty" msgid="7858882803708117596">"કોઈ આઇટમ્સ નથી"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s માં કોઇ મેળ નથી"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ફાઇલ ખોલી શકતાં નથી"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"કેટલાક દસ્તાવેજો કાઢી નાખવામાં અસમર્થ"</string> - <string name="share_via" msgid="8966594246261344259">"આના દ્વારા શેર કરો"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ફાઇલો કૉપિ કરી રહ્યાં છે"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ફાઇલો ખસેડી રહ્યાં છે"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ફાઇલને નીકાળી રહ્યાં છે"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> બાકી"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલો કૉપિ કરી રહ્યાં છે.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલો કૉપિ કરી રહ્યાં છે.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલો ખસેડી રહ્યાં છે.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલો ખસેડી રહ્યાં છે.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ કાઢી નાખી રહ્યાં છે.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ કાઢી નાખી રહ્યાં છે.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"પૂર્વવત્ કરો"</string> - <string name="copy_preparing" msgid="3896202461003039386">"કૉપિ માટે તૈયારી કરી રહ્યું છે…"</string> - <string name="move_preparing" msgid="2772219441375531410">"ખસેડવા માટે તૈયાર કરી રહ્યું છે…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"કાઢી નાખવાની તૈયારી કરી રહ્યાં છે…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ કૉપિ કરી શક્યાં નથી</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ કૉપિ કરી શક્યાં નથી</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ ખસેડી શક્યાં નથી</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ ખસેડી શક્યાં નથી</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ કાઢી નાખી શક્યાં નથી</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ કાઢી નાખી શક્યાં નથી</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"વિગતો જોવા માટે ટૅપ કરો"</string> - <string name="close" msgid="3043722427445528732">"બંધ કરો"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"આ ફાઇલો કૉપિ કરી નહોતી: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"આ ફાઇલો ખસેડી નહોતી: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"આ ફાઇલો કાઢી નાખી નહોતી: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"આ ફાઇલો બીજા ફોર્મેટમાં રૂપાંતરિત કરી હતી: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">ક્લિપબોર્ડ પર <xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલો કૉપિ કરી.</item> - <item quantity="other">ક્લિપબોર્ડ પર <xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલો કૉપિ કરી.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"આ સ્થાનમાં પસંદ કરેલ ફાઇલો પેસ્ટ કરી શકાતી નથી."</string> - <string name="menu_rename" msgid="7678802479104285353">"નામ બદલો"</string> - <string name="rename_error" msgid="4203041674883412606">"દસ્તાવેજનું નામ બદલવામાં નિષ્ફળ થયાં"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"બહાર કાઢો"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"કેટલીક ફાઇલો રૂપાંતરિત કરી હતી"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ને <xliff:g id="STORAGE"><i>^3</i></xliff:g> પર <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> નિર્દેશિકાની ઍક્સેસ આપીએ?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ને <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> નિર્દેશિકાની ઍક્સેસ આપીએ?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ને <xliff:g id="STORAGE"><i>^2</i></xliff:g> પર ફોટા અને વિડિઓઝ સહિત તમારા ડેટાની અૅક્સેસ આપીએ?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"ફરીથી પૂછશો નહીં"</string> - <string name="allow" msgid="7225948811296386551">"મંજૂરી આપો"</string> - <string name="deny" msgid="2081879885755434506">"નકારો"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> પસંદ કરી</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> પસંદ કરી</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> આઇટમ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> આઇટમ</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ને કાઢી નાખીએ?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ફોલ્ડર અને તેની સામગ્રીઓને કાઢી નાખીએ?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ કાઢી નાખીએ?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ફાઇલ કાઢી નાખીએ?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ફોલ્ડર અને તેમની સામગ્રીઓ કાઢી નાખીએ?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ફોલ્ડર અને તેમની સામગ્રીઓ કાઢી નાખીએ?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> આઇટમ કાઢી નાખીએ?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> આઇટમ કાઢી નાખીએ?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-hi/strings.xml b/packages/DocumentsUI/res/values-hi/strings.xml deleted file mode 100644 index ff0faedd7e13..000000000000 --- a/packages/DocumentsUI/res/values-hi/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"फ़ाइल"</string> - <string name="downloads_label" msgid="959113951084633612">"डाउनलोड"</string> - <string name="title_open" msgid="4353228937663917801">"यहां से खोलें"</string> - <string name="title_save" msgid="2433679664882857999">"यहां सहेजें"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"नया फ़ोल्डर"</string> - <string name="menu_grid" msgid="6878021334497835259">"ग्रिड दृश्य"</string> - <string name="menu_list" msgid="7279285939892417279">"सूची दृश्य"</string> - <string name="menu_sort" msgid="7677740407158414452">"इससे क्रमित करें"</string> - <string name="menu_search" msgid="3816712084502856974">"खोजें"</string> - <string name="menu_settings" msgid="8239065133341597825">"मेमोरी सेटिंग"</string> - <string name="menu_open" msgid="432922957274920903">"खोलें"</string> - <string name="menu_save" msgid="2394743337684426338">"जोड़ें"</string> - <string name="menu_share" msgid="3075149983979628146">"साझा करें"</string> - <string name="menu_delete" msgid="8138799623850614177">"हटाएं"</string> - <string name="menu_select_all" msgid="8323579667348729928">"सभी चुनें"</string> - <string name="menu_copy" msgid="3612326052677229148">"इनकी कॉपी बनाएं..."</string> - <string name="menu_move" msgid="1828090633118079817">"इसमें ले जाएं…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"नई विंडो"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"काटें"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"कॉपी करें"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"चिपकाएं"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"आंतरिक मेमोरी दिखाएं"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"आंतरिक मेमोरी छिपाएं"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"फ़ाइल आकार दिखाएं"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"फ़ाइल आकार छिपाएं"</string> - <string name="button_select" msgid="527196987259139214">"चुनें"</string> - <string name="button_copy" msgid="8706475544635021302">"कॉपी करें"</string> - <string name="button_move" msgid="2202666023104202232">"ले जाएं"</string> - <string name="button_dismiss" msgid="3714065566893946085">"ख़ारिज करें"</string> - <string name="button_retry" msgid="4392027584153752797">"पुनः प्रयास करें"</string> - <string name="sort_name" msgid="9183560467917256779">"नाम के अनुसार"</string> - <string name="sort_date" msgid="586080032956151448">"बदलाव के दिनांक के अनुसार"</string> - <string name="sort_size" msgid="3350681319735474741">"आकार के अनुसार"</string> - <string name="drawer_open" msgid="4545466532430226949">"रूट दिखाएं"</string> - <string name="drawer_close" msgid="7602734368552123318">"रूट छिपाएं"</string> - <string name="save_error" msgid="6167009778003223664">"दस्तावेज़ सहेजने में विफल रहा"</string> - <string name="create_error" msgid="3735649141335444215">"फ़ोल्डर बनाने में विफल"</string> - <string name="query_error" msgid="5999895349602476581">"इस समय सामग्री लोड नहीं की जा सकती"</string> - <string name="root_recent" msgid="4470053704320518133">"हाल ही के"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> खाली"</string> - <string name="root_type_service" msgid="2178854894416775409">"मेमोरी सेवाएं"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"शॉर्टकट"</string> - <string name="root_type_device" msgid="7121342474653483538">"डिवाइस"</string> - <string name="root_type_apps" msgid="8838065367985945189">"अधिक ऐप्स"</string> - <string name="empty" msgid="7858882803708117596">"कोई आइटम नहीं"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s में कोई मिलान नहीं मिला"</string> - <string name="toast_no_application" msgid="4632640357724698144">"फ़ाइल नहीं खोली जा सकती"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"कुछ दस्तावेज़ों को हटाने में अक्षम"</string> - <string name="share_via" msgid="8966594246261344259">"इसके द्वारा साझा करें"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"फ़ाइलें कॉपी हो रही हैं"</string> - <string name="move_notification_title" msgid="6193835179777284805">"फाइलें ले जाई जा रही हैं"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"फ़ाइलें हटाई जा रही हैं"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> शेष"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें कॉपी की जा रही हैं.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें कॉपी की जा रही हैं.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें ले जाई जा रही हैं.</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें ले जाई जा रही हैं.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें हटाई जा रही हैं.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें हटाई जा रही हैं.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"वापस लाएं"</string> - <string name="copy_preparing" msgid="3896202461003039386">"कॉपी करने की तैयारी हो रही है…"</string> - <string name="move_preparing" msgid="2772219441375531410">"ले जाने की तैयारी हो रही है…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"हटाने के लिए तैयार हो रहा है…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलों को कॉपी नहीं किया जा सका</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलों को कॉपी नहीं किया जा सका</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें नहीं ले जाई जा सकीं</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें नहीं ले जाई जा सकीं</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें हटाई नहीं जा सकीं</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें हटाई नहीं जा सकीं</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"विवरणों को देखने के लिए टैप करें"</string> - <string name="close" msgid="3043722427445528732">"बंद करें"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"इन फ़ाइलों की कॉपी नहीं बनाई गई: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"ये फ़ाइलें नहीं ले जाई गईं: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"इन फ़ाइलों को हटाया नहीं गया: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ये फ़ाइलें किसी अन्य प्रारूप में रूपांतरित हो गई थीं: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">क्लिपबोर्ड पर <xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलों की कॉपी बनाई गई.</item> - <item quantity="other">क्लिपबोर्ड पर <xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलों की कॉपी बनाई गई.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"चयनित फ़ाइलों को इस स्थान में नहीं चिपकाया जा सकता."</string> - <string name="menu_rename" msgid="7678802479104285353">"नाम बदलें"</string> - <string name="rename_error" msgid="4203041674883412606">"दस्तावेज़ का नाम बदलना विफल रहा"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"निकालें"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"कुछ फ़ाइलें रूपांतरित हो गई थीं"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> को <xliff:g id="STORAGE"><i>^3</i></xliff:g> पर <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> निर्देशिका का एक्सेस दें?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> को <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> निर्देशिका का एक्सेस प्रदान करें?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> को <xliff:g id="STORAGE"><i>^2</i></xliff:g> पर मौजूद फ़ोटो और वीडियो सहित, अपने डेटा का एक्सेस प्रदान करें?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"फिर से ना पूछें"</string> - <string name="allow" msgid="7225948811296386551">"अनुमति दें"</string> - <string name="deny" msgid="2081879885755434506">"अस्वीकारें"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> चयनित</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> चयनित</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> आइटम</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> आइटम</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" को हटाएं?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" फ़ोल्डर और उसकी सामग्रियां हटाएं?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें हटाएं?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ाइलें हटाएं?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ोल्डर और उनकी सामग्री हटाएं?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फ़ोल्डर और उनकी सामग्री हटाएं?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> आइटम हटाएं?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> आइटम हटाएं?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-hr/strings.xml b/packages/DocumentsUI/res/values-hr/strings.xml deleted file mode 100644 index dfaebd34ccf5..000000000000 --- a/packages/DocumentsUI/res/values-hr/strings.xml +++ /dev/null @@ -1,156 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Datoteke"</string> - <string name="downloads_label" msgid="959113951084633612">"Preuzimanja"</string> - <string name="title_open" msgid="4353228937663917801">"Otvori iz"</string> - <string name="title_save" msgid="2433679664882857999">"Spremi u"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nova mapa"</string> - <string name="menu_grid" msgid="6878021334497835259">"Prikaz rešetke"</string> - <string name="menu_list" msgid="7279285939892417279">"Prikaz popisa"</string> - <string name="menu_sort" msgid="7677740407158414452">"Poredano po"</string> - <string name="menu_search" msgid="3816712084502856974">"Pretraživanje"</string> - <string name="menu_settings" msgid="8239065133341597825">"Postavke pohrane"</string> - <string name="menu_open" msgid="432922957274920903">"Otvaranje"</string> - <string name="menu_save" msgid="2394743337684426338">"Spremi"</string> - <string name="menu_share" msgid="3075149983979628146">"Dijeli"</string> - <string name="menu_delete" msgid="8138799623850614177">"Izbriši"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Odaberi sve"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiraj u…"</string> - <string name="menu_move" msgid="1828090633118079817">"Premjesti u…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Novi prozor"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Izreži"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiraj"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Zalijepi"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Pokaži internu pohranu"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Sakrij internu pohranu"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Pokaži veličinu datoteke"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Sakrij veličinu datoteke"</string> - <string name="button_select" msgid="527196987259139214">"Odaberi"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiraj"</string> - <string name="button_move" msgid="2202666023104202232">"Premjesti"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Odbaci"</string> - <string name="button_retry" msgid="4392027584153752797">"Pokušaj ponovo"</string> - <string name="sort_name" msgid="9183560467917256779">"Po nazivu"</string> - <string name="sort_date" msgid="586080032956151448">"Po datumu izmjene"</string> - <string name="sort_size" msgid="3350681319735474741">"Po veličini"</string> - <string name="drawer_open" msgid="4545466532430226949">"Prikaži korijene"</string> - <string name="drawer_close" msgid="7602734368552123318">"Sakrij korijene"</string> - <string name="save_error" msgid="6167009778003223664">"Nije uspjelo spremanje dokumenta"</string> - <string name="create_error" msgid="3735649141335444215">"Izrada mape nije uspjela"</string> - <string name="query_error" msgid="5999895349602476581">"Sadržaj se trenutačno ne može učitati"</string> - <string name="root_recent" msgid="4470053704320518133">"Nedavno"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> besplatno"</string> - <string name="root_type_service" msgid="2178854894416775409">"Usluge pohrane"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Prečaci"</string> - <string name="root_type_device" msgid="7121342474653483538">"Uređaji"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Više aplikacija"</string> - <string name="empty" msgid="7858882803708117596">"Nema stavki"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s ne sadrži podudaranja"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Datoteka se ne može otvoriti"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Nije moguće izbrisati neke dokumente"</string> - <string name="share_via" msgid="8966594246261344259">"Dijeli putem"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopiranje datoteka"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Premještanje datoteka"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Brisanje datoteka"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Još <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="few">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="other">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Premještanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="few">Premještanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="other">Premještanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Brisanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="few">Brisanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="other">Brisanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Poništi"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Priprema za kopiranje…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Priprema za premještanje…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Priprema za brisanje…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije kopirana</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nisu kopirane</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije kopirano</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije premještena</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nisu premještene</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije premješteno</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije izbrisana</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteke nisu izbrisane</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteka nije izbrisano</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Dodirnite da biste vidjeli pojedinosti"</string> - <string name="close" msgid="3043722427445528732">"Zatvori"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Ove datoteke nisu kopirane: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Ove datoteke nisu premještene: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Ove datoteke nisu izbrisane: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ove su datoteke konvertirane u neki drugi format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteka kopirana je u međuspremnik.</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteke kopirane su u međuspremnik.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteka kopirano je u međuspremnik.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Nije moguće zalijepiti odabrane datoteke na ovu lokaciju."</string> - <string name="menu_rename" msgid="7678802479104285353">"Promijeni naziv"</string> - <string name="rename_error" msgid="4203041674883412606">"Naziv dokumenta nije promijenjen"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Izbaci"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Neke su datoteke konvertirane"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Želite li aplikaciji <xliff:g id="APPNAME"><b>^1</b></xliff:g> odobriti pristup direktoriju <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> na pohrani <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Želite li aplikaciji <xliff:g id="APPNAME"><b>^1</b></xliff:g> odobriti da pristupa direktoriju <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Želite li aplikaciji <xliff:g id="APPNAME"><b>^1</b></xliff:g> dopustiti pristup podacima, uključujući fotografije i videozapise na vanjskoj pohrani (<xliff:g id="STORAGE"><i>^2</i></xliff:g>)?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Više me ne pitaj"</string> - <string name="allow" msgid="7225948811296386551">"Dopusti"</string> - <string name="deny" msgid="2081879885755434506">"Odbij"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one">Odabrano: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="few">Odabrano: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Odabrano: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> stavka</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> stavke</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> stavki</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Želite li izbrisati datoteku \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Želite li izbrisati mapu \"<xliff:g id="NAME">%1$s</xliff:g>\" i njezin sadržaj?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> datoteku?</item> - <item quantity="few">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke?</item> - <item quantity="other">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> mapu i njihov sadržaj?</item> - <item quantity="few">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> mape i njihov sadržaj?</item> - <item quantity="other">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> mapa i njihov sadržaj?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> stavku?</item> - <item quantity="few">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> stavke?</item> - <item quantity="other">Želite li izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> stavki?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-hu/strings.xml b/packages/DocumentsUI/res/values-hu/strings.xml deleted file mode 100644 index 0044081dfb3a..000000000000 --- a/packages/DocumentsUI/res/values-hu/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fájlok"</string> - <string name="downloads_label" msgid="959113951084633612">"Letöltések"</string> - <string name="title_open" msgid="4353228937663917801">"Megnyitás innen"</string> - <string name="title_save" msgid="2433679664882857999">"Mentés ide"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Új mappa"</string> - <string name="menu_grid" msgid="6878021334497835259">"Rács"</string> - <string name="menu_list" msgid="7279285939892417279">"Lista"</string> - <string name="menu_sort" msgid="7677740407158414452">"Rendezés alapja"</string> - <string name="menu_search" msgid="3816712084502856974">"Keresés"</string> - <string name="menu_settings" msgid="8239065133341597825">"Tárolóhely beállításai"</string> - <string name="menu_open" msgid="432922957274920903">"Megnyitás"</string> - <string name="menu_save" msgid="2394743337684426338">"Mentés"</string> - <string name="menu_share" msgid="3075149983979628146">"Megosztás"</string> - <string name="menu_delete" msgid="8138799623850614177">"Törlés"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Összes kijelölése"</string> - <string name="menu_copy" msgid="3612326052677229148">"Másolás ide…"</string> - <string name="menu_move" msgid="1828090633118079817">"Áthelyezés…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Új ablak"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Kivágás"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Másolás"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Beillesztés"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Belső tárhely"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Belső tárhely elrejtése"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Fájlméret megjelenítése"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Fájlméret elrejtése"</string> - <string name="button_select" msgid="527196987259139214">"Kiválasztás"</string> - <string name="button_copy" msgid="8706475544635021302">"Másolás"</string> - <string name="button_move" msgid="2202666023104202232">"Áthelyezés"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Elvetés"</string> - <string name="button_retry" msgid="4392027584153752797">"Újrapróbálkozás"</string> - <string name="sort_name" msgid="9183560467917256779">"Név szerint"</string> - <string name="sort_date" msgid="586080032956151448">"Módosítás dátuma szerint"</string> - <string name="sort_size" msgid="3350681319735474741">"Méret szerint"</string> - <string name="drawer_open" msgid="4545466532430226949">"Gyökérszint megjelenítése"</string> - <string name="drawer_close" msgid="7602734368552123318">"Gyökérszint elrejtése"</string> - <string name="save_error" msgid="6167009778003223664">"Nem sikerült menteni a dokumentumot"</string> - <string name="create_error" msgid="3735649141335444215">"Nem sikerült létrehozni a mappát"</string> - <string name="query_error" msgid="5999895349602476581">"Jelenleg nem lehet tartalmat betölteni"</string> - <string name="root_recent" msgid="4470053704320518133">"Legutóbbiak"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> szabad"</string> - <string name="root_type_service" msgid="2178854894416775409">"Tárhelyszolgáltatások"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Parancsikonok"</string> - <string name="root_type_device" msgid="7121342474653483538">"Eszközök"</string> - <string name="root_type_apps" msgid="8838065367985945189">"További alkalmazások"</string> - <string name="empty" msgid="7858882803708117596">"Nincsenek elemek"</string> - <string name="no_results" msgid="6622510343880730446">"Nincs találat itt: %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"A fájlt nem lehet megnyitni"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Néhány dokumentumot nem lehet törölni"</string> - <string name="share_via" msgid="8966594246261344259">"Megosztás itt:"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Fájlok másolása"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Fájlok áthelyezése"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Fájlok törlése"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> van hátra"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fájl másolása.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fájl másolása.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fájl áthelyezése.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fájl áthelyezése.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fájl törlése.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fájl törlése.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Visszavonás"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Felkészülés a másolásra…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Áthelyezés előkészítése…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Törlés előkészítése…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fájlt nem sikerült átmásolni</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fájlt nem sikerült átmásolni</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fájlt nem sikerült áthelyezni</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fájlt nem sikerült áthelyezni</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fájlt nem sikerült törölni</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fájlt nem sikerült törölni</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Koppintson rá a részletek megtekintéséhez"</string> - <string name="close" msgid="3043722427445528732">"Bezárás"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"A következő fájlokat nem sikerült átmásolni: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"A következő fájlokat nem sikerült áthelyezni: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"A következő fájlokat nem sikerült törölni: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"A következő fájlokat a rendszer más formátumba konvertálta: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> fájl vágólapra másolva.</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> fájl vágólapra másolva.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"A kijelölt fájlokat nem lehet beilleszteni erre a helyre."</string> - <string name="menu_rename" msgid="7678802479104285353">"Átnevezés"</string> - <string name="rename_error" msgid="4203041674883412606">"Nem sikerült átnevezni a dokumentumot"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Kiadás"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Egyes fájlokat konvertált a rendszer"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Hozzáférést biztosít a(z) <xliff:g id="APPNAME"><b>^1</b></xliff:g> számára a(z) <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> könyvtárhoz itt: <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Hozzáférést biztosít a(z) <xliff:g id="APPNAME"><b>^1</b></xliff:g> alkalmazásnak a(z) <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> könyvtárhoz?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Hozzáférést biztosít a(z) <xliff:g id="APPNAME"><b>^1</b></xliff:g> számára az Ön adataihoz, beleértve a következő tárhelyen található képekhez és videókhoz: <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ne jelenjen meg többé"</string> - <string name="allow" msgid="7225948811296386551">"Engedélyezés"</string> - <string name="deny" msgid="2081879885755434506">"Elutasítás"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> kiválasztva</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> kiválasztva</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elem</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elem</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Törli a következőt: „<xliff:g id="NAME">%1$s</xliff:g>”?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Törli „<xliff:g id="NAME">%1$s</xliff:g>” mappát a tartalmával együtt?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Töröl <xliff:g id="COUNT_1">%1$d</xliff:g> fájlt?</item> - <item quantity="one">Töröl <xliff:g id="COUNT_0">%1$d</xliff:g> fájlt?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Töröl <xliff:g id="COUNT_1">%1$d</xliff:g> mappát a tartalmukkal együtt?</item> - <item quantity="one">Töröl <xliff:g id="COUNT_0">%1$d</xliff:g> mappát a tartalmával együtt?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Töröl <xliff:g id="COUNT_1">%1$d</xliff:g> elemet?</item> - <item quantity="one">Töröl <xliff:g id="COUNT_0">%1$d</xliff:g> elemet?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml deleted file mode 100644 index f4c85c3f7d2b..000000000000 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Ֆայլեր"</string> - <string name="downloads_label" msgid="959113951084633612">"Ներբեռնումներ"</string> - <string name="title_open" msgid="4353228937663917801">"Բացել այստեղից"</string> - <string name="title_save" msgid="2433679664882857999">"Պահել այստեղ"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Նոր պանակ"</string> - <string name="menu_grid" msgid="6878021334497835259">"Ցանցի տեսքով"</string> - <string name="menu_list" msgid="7279285939892417279">"Ցուցակի տեսք"</string> - <string name="menu_sort" msgid="7677740407158414452">"Դասավորել ըստ"</string> - <string name="menu_search" msgid="3816712084502856974">"Որոնել"</string> - <string name="menu_settings" msgid="8239065133341597825">"Հիշասարքի կարգավորումներ"</string> - <string name="menu_open" msgid="432922957274920903">"Բացել"</string> - <string name="menu_save" msgid="2394743337684426338">"Պահել"</string> - <string name="menu_share" msgid="3075149983979628146">"Կիսվել"</string> - <string name="menu_delete" msgid="8138799623850614177">"Ջնջել"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Ընտրել բոլորը"</string> - <string name="menu_copy" msgid="3612326052677229148">"Պատճենել…"</string> - <string name="menu_move" msgid="1828090633118079817">"Տեղափոխել…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Նոր պատուհան"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Կտրել"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Պատճենել"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Տեղադրել"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Ցույց տալ ներքին պահոցը"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Թաքցնել ներքին պահոցը"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Ցույց տալ ֆայլի չափը"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Թաքցնել ֆայլի չափը"</string> - <string name="button_select" msgid="527196987259139214">"Ընտրել"</string> - <string name="button_copy" msgid="8706475544635021302">"Պատճենել"</string> - <string name="button_move" msgid="2202666023104202232">"Տեղափոխել"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Փակել"</string> - <string name="button_retry" msgid="4392027584153752797">"Փորձել նորից"</string> - <string name="sort_name" msgid="9183560467917256779">"Ըստ անվան"</string> - <string name="sort_date" msgid="586080032956151448">"Ըստ փոփոխման ամսաթվի"</string> - <string name="sort_size" msgid="3350681319735474741">"Ըստ չափի"</string> - <string name="drawer_open" msgid="4545466532430226949">"Ցույց տալ արմատները"</string> - <string name="drawer_close" msgid="7602734368552123318">"Թաքցնել արմատները"</string> - <string name="save_error" msgid="6167009778003223664">"Չհաջողվեց պահել փաստաթուղթը"</string> - <string name="create_error" msgid="3735649141335444215">"Չհաջողվեց ստեղծել պանակը"</string> - <string name="query_error" msgid="5999895349602476581">"Այս պահին հնարավոր չէ բեռնել բովանդակությունը"</string> - <string name="root_recent" msgid="4470053704320518133">"Վերջին"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ազատ է"</string> - <string name="root_type_service" msgid="2178854894416775409">"Պահուստի ծառայություններ"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Դյուրանցումներ"</string> - <string name="root_type_device" msgid="7121342474653483538">"Սարքեր"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Հավելյալ ծրագրեր"</string> - <string name="empty" msgid="7858882803708117596">"Ոչինչ չկա"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s-ում համընկնումներ չկան"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Հնարավոր չէ բացել ֆայլը"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Անհնար է ջնջել որոշ փաստաթղթեր"</string> - <string name="share_via" msgid="8966594246261344259">"Կիսվել"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Ֆայլերի պատճենում"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Ֆայլերի տեղափոխում"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Ֆայլերը ջնջվում են"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Մնացել է <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի պատճենում:</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի պատճենում:</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի տեղափոխում:</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի տեղափոխում:</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի ջնջում:</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլի ջնջում:</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Հետարկել"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Պատճենման նախապատրաստում…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Տեղափոխման նախապատրաստում…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Պատրաստվում է ջնջել…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Չհաջողվեց պատճենել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> - <item quantity="other">Չհաջողվեց պատճենել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Չհաջողվեց տեղափոխել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> - <item quantity="other">Չհաջողվեց տեղափոխել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Չհաջողվեց ջնջել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> - <item quantity="other">Չհաջողվեց ջնջել <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Հպեք՝ մանրամասները դիտելու համար"</string> - <string name="close" msgid="3043722427445528732">"Փակել"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Հետևյալ ֆայլերը չեն պատճենվել՝ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Հետևյալ ֆայլերը չեն տեղափոխվել՝ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Հետևյալ ֆայլերը չեն ջնջվել՝ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Այս ֆայլերը փոխարկվել են մեկ այլ ձևաչափի՝ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ պատճենվեց սեղմատախտակին:</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ պատճենվեց սեղմատախտակին:</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Հնարավոր չէ տեղադրել ընտրված ֆայլերը այս տեղադրությունում:"</string> - <string name="menu_rename" msgid="7678802479104285353">"Վերանվանել"</string> - <string name="rename_error" msgid="4203041674883412606">"Չհաջողվեց վերանվանել փաստաթուղթը"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Անջատել"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Որոշ ֆայլեր փոխարկվել են"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> հավելվածին տրամադրե՞լ <xliff:g id="STORAGE"><i>^3</i></xliff:g>-ի <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> գրացուցակն օգտագործելու թույլտվություն:"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> հավելվածին տրամադրե՞լ <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> գրացուցակն օգտագործելու թույլտվություն:"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> հավելվածին տրամադրե՞լ <xliff:g id="STORAGE"><i>^2</i></xliff:g>-ում պահվող ձեր տվյալները, այդ թվում նաև լուսանկարները և տեսանյութերը, օգտագործելու թույլտվություն:"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Այլևս չհարցնել"</string> - <string name="allow" msgid="7225948811296386551">"Թույլատրել"</string> - <string name="deny" msgid="2081879885755434506">"Մերժել"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one">Ընտրված է՝ <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Ընտրված է՝ <xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> տարր</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> տարր</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Ջնջե՞լ «<xliff:g id="NAME">%1$s</xliff:g>» ֆայլը:"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Ջնջե՞լ «<xliff:g id="NAME">%1$s</xliff:g>» պանակը՝ բովանդակության հետ մեկտեղ:"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Ջնջե՞լ <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ:</item> - <item quantity="other">Ջնջե՞լ <xliff:g id="COUNT_1">%1$d</xliff:g> ֆայլ:</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Ջնջե՞լ <xliff:g id="COUNT_1">%1$d</xliff:g> պանակ՝ բովանդակության հետ մեկտեղ:</item> - <item quantity="other">Ջնջե՞լ <xliff:g id="COUNT_1">%1$d</xliff:g> պանակ՝ բովանդակության հետ մեկտեղ:</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Ջնջե՞լ <xliff:g id="COUNT_1">%1$d</xliff:g> տարր:</item> - <item quantity="other">Ջնջե՞լ <xliff:g id="COUNT_1">%1$d</xliff:g> տարր:</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml deleted file mode 100644 index 964c69a55316..000000000000 --- a/packages/DocumentsUI/res/values-in/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"File"</string> - <string name="downloads_label" msgid="959113951084633612">"Unduhan"</string> - <string name="title_open" msgid="4353228937663917801">"Buka dari"</string> - <string name="title_save" msgid="2433679664882857999">"Simpan ke"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Folder baru"</string> - <string name="menu_grid" msgid="6878021334497835259">"Tampilan kisi"</string> - <string name="menu_list" msgid="7279285939892417279">"Tampilan daftar"</string> - <string name="menu_sort" msgid="7677740407158414452">"Urutkan menurut"</string> - <string name="menu_search" msgid="3816712084502856974">"Telusuri"</string> - <string name="menu_settings" msgid="8239065133341597825">"Setelan penyimpanan"</string> - <string name="menu_open" msgid="432922957274920903">"Buka"</string> - <string name="menu_save" msgid="2394743337684426338">"Simpan"</string> - <string name="menu_share" msgid="3075149983979628146">"Bagikan"</string> - <string name="menu_delete" msgid="8138799623850614177">"Hapus"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Pilih semua"</string> - <string name="menu_copy" msgid="3612326052677229148">"Salin ke…"</string> - <string name="menu_move" msgid="1828090633118079817">"Pindahkan ke..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Jendela baru"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Potong"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Salin"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Tempel"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Tampilkan simpanan internal"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Sembunyikan simpanan internal"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Tampilkan ukuran file"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Sembunyikan ukuran file"</string> - <string name="button_select" msgid="527196987259139214">"Pilih"</string> - <string name="button_copy" msgid="8706475544635021302">"Salin"</string> - <string name="button_move" msgid="2202666023104202232">"Pindahkan"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Tutup"</string> - <string name="button_retry" msgid="4392027584153752797">"Coba Lagi"</string> - <string name="sort_name" msgid="9183560467917256779">"Menurut nama"</string> - <string name="sort_date" msgid="586080032956151448">"Menurut tanggal diubah"</string> - <string name="sort_size" msgid="3350681319735474741">"Menurut ukuran"</string> - <string name="drawer_open" msgid="4545466532430226949">"Tampilkan akar"</string> - <string name="drawer_close" msgid="7602734368552123318">"Sembunyikan akar"</string> - <string name="save_error" msgid="6167009778003223664">"Gagal menyimpan dokumen"</string> - <string name="create_error" msgid="3735649141335444215">"Gagal membuat folder"</string> - <string name="query_error" msgid="5999895349602476581">"Saat ini tidak dapat memuat konten"</string> - <string name="root_recent" msgid="4470053704320518133">"Terkini"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> kosong"</string> - <string name="root_type_service" msgid="2178854894416775409">"Layanan penyimpanan"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Pintasan"</string> - <string name="root_type_device" msgid="7121342474653483538">"Perangkat"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Aplikasi lain"</string> - <string name="empty" msgid="7858882803708117596">"Tidak ada item"</string> - <string name="no_results" msgid="6622510343880730446">"Tidak ada kecocokan dalam %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Tidak dapat membuka file"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat menghapus beberapa dokumen"</string> - <string name="share_via" msgid="8966594246261344259">"Bagikan melalui"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Menyalin file"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Memindahkan file"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Menghapus file"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> lagi"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> - <item quantity="one">Menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Memindahkan <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> - <item quantity="one">Memindahkan <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Menghapus <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> - <item quantity="one">Menghapus <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Urungkan"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Menyiapkan salinan..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Menyiapkan pemindahan…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Bersiap menghapus…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Tidak dapat menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> - <item quantity="one">Tidak dapat menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Tidak dapat memindahkan <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> - <item quantity="one">Tidak dapat memindahkan <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Tidak dapat menghapus <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> - <item quantity="one">Tidak dapat menghapus <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Ketuk untuk melihat detail"</string> - <string name="close" msgid="3043722427445528732">"Tutup"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Semua file ini tidak disalin: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Semua file ini tidak dipindahkan: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Semua file ini tidak dihapus: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"File ini dikonversi ke format lain: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> file disalin ke papan klip.</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> file disalin ke papan klip.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Tidak dapat menempel file yang dipilih di lokasi ini."</string> - <string name="menu_rename" msgid="7678802479104285353">"Ganti nama"</string> - <string name="rename_error" msgid="4203041674883412606">"Gagal mengganti nama dokumen"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Keluarkan"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Beberapa file dikonversi"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Beri <xliff:g id="APPNAME"><b>^1</b></xliff:g> akses ke direktori <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> di <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Beri <xliff:g id="APPNAME"><b>^1</b></xliff:g> akses ke direktori <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Beri <xliff:g id="APPNAME"><b>^1</b></xliff:g> akses ke data Anda, termasuk foto dan video, di <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Jangan tanya lagi"</string> - <string name="allow" msgid="7225948811296386551">"Izinkan"</string> - <string name="deny" msgid="2081879885755434506">"Tolak"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dipilih</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dipilih</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> item</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Hapus \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Hapus folder \"<xliff:g id="NAME">%1$s</xliff:g>\" dan kontennya?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Hapus <xliff:g id="COUNT_1">%1$d</xliff:g> file?</item> - <item quantity="one">Hapus <xliff:g id="COUNT_0">%1$d</xliff:g> file?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Hapus <xliff:g id="COUNT_1">%1$d</xliff:g> folder dan kontennya?</item> - <item quantity="one">Hapus <xliff:g id="COUNT_0">%1$d</xliff:g> folder dan kontennya?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Hapus <xliff:g id="COUNT_1">%1$d</xliff:g> item?</item> - <item quantity="one">Hapus <xliff:g id="COUNT_0">%1$d</xliff:g> item?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-is-rIS/strings.xml b/packages/DocumentsUI/res/values-is-rIS/strings.xml deleted file mode 100644 index 983090c2ea0d..000000000000 --- a/packages/DocumentsUI/res/values-is-rIS/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Skrár"</string> - <string name="downloads_label" msgid="959113951084633612">"Niðurhal"</string> - <string name="title_open" msgid="4353228937663917801">"Opna frá"</string> - <string name="title_save" msgid="2433679664882857999">"Vista í"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Ný mappa"</string> - <string name="menu_grid" msgid="6878021334497835259">"Töfluyfirlit"</string> - <string name="menu_list" msgid="7279285939892417279">"Listayfirlit"</string> - <string name="menu_sort" msgid="7677740407158414452">"Raða eftir"</string> - <string name="menu_search" msgid="3816712084502856974">"Leita"</string> - <string name="menu_settings" msgid="8239065133341597825">"Geymslustillingar"</string> - <string name="menu_open" msgid="432922957274920903">"Opna"</string> - <string name="menu_save" msgid="2394743337684426338">"Vista"</string> - <string name="menu_share" msgid="3075149983979628146">"Deila"</string> - <string name="menu_delete" msgid="8138799623850614177">"Eyða"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Velja allt"</string> - <string name="menu_copy" msgid="3612326052677229148">"Afrita í ..."</string> - <string name="menu_move" msgid="1828090633118079817">"Færa í…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nýr gluggi"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Klippa"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Afrita"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Líma"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Sýna innbyggða geymslu"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Fela innbyggða geymslu"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Sýna skráarstærð"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Fela skráarstærð"</string> - <string name="button_select" msgid="527196987259139214">"Velja"</string> - <string name="button_copy" msgid="8706475544635021302">"Afrita"</string> - <string name="button_move" msgid="2202666023104202232">"Færa"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Hunsa"</string> - <string name="button_retry" msgid="4392027584153752797">"Reyna aftur"</string> - <string name="sort_name" msgid="9183560467917256779">"Eftir heiti"</string> - <string name="sort_date" msgid="586080032956151448">"Eftir breytingadags."</string> - <string name="sort_size" msgid="3350681319735474741">"Eftir stærð"</string> - <string name="drawer_open" msgid="4545466532430226949">"Sýna rótarsöfn"</string> - <string name="drawer_close" msgid="7602734368552123318">"Fela rótarsöfn"</string> - <string name="save_error" msgid="6167009778003223664">"Mistókst að vista skjalið"</string> - <string name="create_error" msgid="3735649141335444215">"Mistókst að búa til möppu"</string> - <string name="query_error" msgid="5999895349602476581">"Ekki hægt að hlaða efni í augnablikinu"</string> - <string name="root_recent" msgid="4470053704320518133">"Nýlegt"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> laus"</string> - <string name="root_type_service" msgid="2178854894416775409">"Geymsluþjónusta"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Flýtileiðir"</string> - <string name="root_type_device" msgid="7121342474653483538">"Tæki"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Fleiri forrit"</string> - <string name="empty" msgid="7858882803708117596">"Engin atriði"</string> - <string name="no_results" msgid="6622510343880730446">"Engar samsvarandi niðurstöður í %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Ekki hægt að opna skrá"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Ekki er hægt að eyða einhverjum skjölum"</string> - <string name="share_via" msgid="8966594246261344259">"Deila í gegnum"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Afritar skrár"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Skrár færðar"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Eyðir skrám"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> eftir"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Afritar <xliff:g id="COUNT_1">%1$d</xliff:g> skrá.</item> - <item quantity="other">Afritar <xliff:g id="COUNT_1">%1$d</xliff:g> skrár.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Færir <xliff:g id="COUNT_1">%1$d</xliff:g> skrá.</item> - <item quantity="other">Færir <xliff:g id="COUNT_1">%1$d</xliff:g> skrár.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Eyðir <xliff:g id="COUNT_1">%1$d</xliff:g> skrá.</item> - <item quantity="other">Eyðir <xliff:g id="COUNT_1">%1$d</xliff:g> skrám.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Afturkalla"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Undirbúningur fyrir afritun…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Flutningur undirbúinn…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Býr sig undir að eyða…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Ekki tókst að afrita <xliff:g id="COUNT_1">%1$d</xliff:g> skrá</item> - <item quantity="other">Ekki tókst að afrita <xliff:g id="COUNT_1">%1$d</xliff:g> skrár</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Ekki tókst að færa <xliff:g id="COUNT_1">%1$d</xliff:g> skrá</item> - <item quantity="other">Ekki tókst að færa <xliff:g id="COUNT_1">%1$d</xliff:g> skrár</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Ekki tókst að eyða <xliff:g id="COUNT_1">%1$d</xliff:g> skrá</item> - <item quantity="other">Ekki tókst að eyða <xliff:g id="COUNT_1">%1$d</xliff:g> skrám</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Ýttu til að skoða frekari upplýsingar"</string> - <string name="close" msgid="3043722427445528732">"Loka"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Þessar skrár voru ekki afritaðar: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Þessar skrár voru ekki færðar: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Þessum skrám var ekki eytt: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Þessum skrám var umbreytt yfir á annað snið: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> skrá afrituð á klippiborð.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> skrár afritaðar á klippiborð.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Ekki er hægt að vista valdar skrár á þessum stað."</string> - <string name="menu_rename" msgid="7678802479104285353">"Endurnefna"</string> - <string name="rename_error" msgid="4203041674883412606">"Ekki tókst að endurnefna skjalið"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Fjarlægja"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sumum skrám var umbreytt"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Veita <xliff:g id="APPNAME"><b>^1</b></xliff:g> aðgang að skráasafninu <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> á <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Viltu veita <xliff:g id="APPNAME"><b>^1</b></xliff:g> aðgang að skráasafninu <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Veita <xliff:g id="APPNAME"><b>^1</b></xliff:g> aðgang að gögnunum þínum, þar á meðal myndum og myndskeiðum, á <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ekki spyrja aftur"</string> - <string name="allow" msgid="7225948811296386551">"Leyfa"</string> - <string name="deny" msgid="2081879885755434506">"Hafna"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> valið</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> valin</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> atriði</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> atriði</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Eyða „<xliff:g id="NAME">%1$s</xliff:g>“?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Eyða möppunni „<xliff:g id="NAME">%1$s</xliff:g>“ og öllu innihaldi hennar?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Eyða <xliff:g id="COUNT_1">%1$d</xliff:g> skrá?</item> - <item quantity="other">Eyða <xliff:g id="COUNT_1">%1$d</xliff:g> skrám?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Eyða <xliff:g id="COUNT_1">%1$d</xliff:g> möppu og innihaldi þeirra?</item> - <item quantity="other">Eyða <xliff:g id="COUNT_1">%1$d</xliff:g> möppum og innihaldi þeirra?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Eyða <xliff:g id="COUNT_1">%1$d</xliff:g> atriði?</item> - <item quantity="other">Eyða <xliff:g id="COUNT_1">%1$d</xliff:g> atriðum?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-it/strings.xml b/packages/DocumentsUI/res/values-it/strings.xml deleted file mode 100644 index df287fe14d38..000000000000 --- a/packages/DocumentsUI/res/values-it/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"File"</string> - <string name="downloads_label" msgid="959113951084633612">"Download"</string> - <string name="title_open" msgid="4353228937663917801">"Apri da"</string> - <string name="title_save" msgid="2433679664882857999">"Salva in"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nuova cartella"</string> - <string name="menu_grid" msgid="6878021334497835259">"Visualizzazione griglia"</string> - <string name="menu_list" msgid="7279285939892417279">"Visualizzazione elenco"</string> - <string name="menu_sort" msgid="7677740407158414452">"Ordina per"</string> - <string name="menu_search" msgid="3816712084502856974">"Cerca"</string> - <string name="menu_settings" msgid="8239065133341597825">"Impostazioni memoria"</string> - <string name="menu_open" msgid="432922957274920903">"Apri"</string> - <string name="menu_save" msgid="2394743337684426338">"Salva"</string> - <string name="menu_share" msgid="3075149983979628146">"Condividi"</string> - <string name="menu_delete" msgid="8138799623850614177">"Elimina"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Seleziona tutto"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copia in…"</string> - <string name="menu_move" msgid="1828090633118079817">"Sposta in..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nuova finestra"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Taglia"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copia"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Incolla"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Mostra memoria interna"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Nascondi memoria interna"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Mostra dimensioni file"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Nascondi dimensioni file"</string> - <string name="button_select" msgid="527196987259139214">"Seleziona"</string> - <string name="button_copy" msgid="8706475544635021302">"Copia"</string> - <string name="button_move" msgid="2202666023104202232">"Sposta"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Ignora"</string> - <string name="button_retry" msgid="4392027584153752797">"Riprova"</string> - <string name="sort_name" msgid="9183560467917256779">"Per nome"</string> - <string name="sort_date" msgid="586080032956151448">"Per data di modifica"</string> - <string name="sort_size" msgid="3350681319735474741">"Per dimensioni"</string> - <string name="drawer_open" msgid="4545466532430226949">"Mostra nodi principali"</string> - <string name="drawer_close" msgid="7602734368552123318">"Nascondi nodi principali"</string> - <string name="save_error" msgid="6167009778003223664">"Impossibile salvare il documento"</string> - <string name="create_error" msgid="3735649141335444215">"Impossibile creare la cartella"</string> - <string name="query_error" msgid="5999895349602476581">"Impossibile caricare i contenuti al momento"</string> - <string name="root_recent" msgid="4470053704320518133">"Recenti"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> liberi"</string> - <string name="root_type_service" msgid="2178854894416775409">"Servizi di archiviazione"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Scorciatoie"</string> - <string name="root_type_device" msgid="7121342474653483538">"Dispositivi"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Altre app"</string> - <string name="empty" msgid="7858882803708117596">"Nessun elemento"</string> - <string name="no_results" msgid="6622510343880730446">"Nessuna corrispondenza in %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Impossibile aprire il file"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Impossibile eliminare alcuni documenti"</string> - <string name="share_via" msgid="8966594246261344259">"Condividi via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copia di file in corso"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Spostamento di file"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Eliminazione dei file"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> rimanenti"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Copia di <xliff:g id="COUNT_1">%1$d</xliff:g> file in corso.</item> - <item quantity="one">Copia di <xliff:g id="COUNT_0">%1$d</xliff:g> file in corso.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Spostamento di <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> - <item quantity="one">Spostamento di <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Eliminazione di <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> - <item quantity="one">Eliminazione di <xliff:g id="COUNT_0">%1$d</xliff:g> file.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Annulla"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Preparazione alla copia…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Preparazione dello spostamento…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Preparazione eliminazione…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Impossibile copiare <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> - <item quantity="one">Impossibile copiare <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Impossibile spostare <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> - <item quantity="one">Impossibile spostare <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Impossibile eliminare <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> - <item quantity="one">Impossibile eliminare <xliff:g id="COUNT_0">%1$d</xliff:g> file</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tocca per vedere i dettagli"</string> - <string name="close" msgid="3043722427445528732">"Chiudi"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"I seguenti file non sono stati copiati: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"I seguenti file non sono stati spostati: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"I seguenti file non sono stati eliminati: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"I file sono stati convertiti in un altro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> file copiati negli appunti.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> file copiato negli appunti.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Impossibile incollare i file selezionati in questa posizione."</string> - <string name="menu_rename" msgid="7678802479104285353">"Rinomina"</string> - <string name="rename_error" msgid="4203041674883412606">"Ridenominazione documento non riuscita"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Espelli"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alcuni file sono stati convertiti"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Concedere all\'app <xliff:g id="APPNAME"><b>^1</b></xliff:g> l\'accesso alla directory <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> su <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Concedere all\'app <xliff:g id="APPNAME"><b>^1</b></xliff:g> l\'accesso alla directory <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Concedere all\'app <xliff:g id="APPNAME"><b>^1</b></xliff:g> l\'accesso ai tuoi dati, inclusi video e foto, sull\'unità <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Non chiedermelo più"</string> - <string name="allow" msgid="7225948811296386551">"Consenti"</string> - <string name="deny" msgid="2081879885755434506">"Nega"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> file selezionati</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> file selezionato</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementi</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> elemento</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Eliminare \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Eliminare la cartella \"<xliff:g id="NAME">%1$s</xliff:g>\" e i relativi contenuti?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Eliminare <xliff:g id="COUNT_1">%1$d</xliff:g> file?</item> - <item quantity="one">Eliminare <xliff:g id="COUNT_0">%1$d</xliff:g> file?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Eliminare <xliff:g id="COUNT_1">%1$d</xliff:g> cartelle e i relativi contenuti?</item> - <item quantity="one">Eliminare <xliff:g id="COUNT_0">%1$d</xliff:g> cartella e i relativi contenuti?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Eliminare <xliff:g id="COUNT_1">%1$d</xliff:g> elementi?</item> - <item quantity="one">Eliminare <xliff:g id="COUNT_0">%1$d</xliff:g> elemento?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml deleted file mode 100644 index 19e3790068fb..000000000000 --- a/packages/DocumentsUI/res/values-iw/strings.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"קבצים"</string> - <string name="downloads_label" msgid="959113951084633612">"הורדות"</string> - <string name="title_open" msgid="4353228937663917801">"פתח מ-"</string> - <string name="title_save" msgid="2433679664882857999">"שמור ב-"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"תיקייה חדשה"</string> - <string name="menu_grid" msgid="6878021334497835259">"תצוגת רשת"</string> - <string name="menu_list" msgid="7279285939892417279">"תצוגת רשימה"</string> - <string name="menu_sort" msgid="7677740407158414452">"מיין לפי"</string> - <string name="menu_search" msgid="3816712084502856974">"חפש"</string> - <string name="menu_settings" msgid="8239065133341597825">"הגדרות אחסון"</string> - <string name="menu_open" msgid="432922957274920903">"פתח"</string> - <string name="menu_save" msgid="2394743337684426338">"שמור"</string> - <string name="menu_share" msgid="3075149983979628146">"שתף"</string> - <string name="menu_delete" msgid="8138799623850614177">"מחק"</string> - <string name="menu_select_all" msgid="8323579667348729928">"בחר הכל"</string> - <string name="menu_copy" msgid="3612326052677229148">"העתק אל…"</string> - <string name="menu_move" msgid="1828090633118079817">"העבר אל…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"חלון חדש"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"גזור"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"העתק"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"הדבק"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"הצג אחסון פנימי"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"הסתר אחסון פנימי"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"הצג גודל קובץ"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"הסתר גודל קובץ"</string> - <string name="button_select" msgid="527196987259139214">"בחר"</string> - <string name="button_copy" msgid="8706475544635021302">"העתק"</string> - <string name="button_move" msgid="2202666023104202232">"העבר"</string> - <string name="button_dismiss" msgid="3714065566893946085">"הסר"</string> - <string name="button_retry" msgid="4392027584153752797">"נסה שוב"</string> - <string name="sort_name" msgid="9183560467917256779">"לפי שם"</string> - <string name="sort_date" msgid="586080032956151448">"לפי תאריך שינוי"</string> - <string name="sort_size" msgid="3350681319735474741">"לפי גודל"</string> - <string name="drawer_open" msgid="4545466532430226949">"הצג שורשים"</string> - <string name="drawer_close" msgid="7602734368552123318">"הסתר שורשים"</string> - <string name="save_error" msgid="6167009778003223664">"שמירת המסמך נכשלה"</string> - <string name="create_error" msgid="3735649141335444215">"יצירת התיקיה נכשלה"</string> - <string name="query_error" msgid="5999895349602476581">"לא ניתן כרגע לטעון תוכן"</string> - <string name="root_recent" msgid="4470053704320518133">"מהזמן האחרון"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> של שטח פנוי"</string> - <string name="root_type_service" msgid="2178854894416775409">"שירותי אחסון"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"קיצורי דרך"</string> - <string name="root_type_device" msgid="7121342474653483538">"מכשירים"</string> - <string name="root_type_apps" msgid="8838065367985945189">"עוד אפליקציות"</string> - <string name="empty" msgid="7858882803708117596">"אין פריטים"</string> - <string name="no_results" msgid="6622510343880730446">"אין התאמות ב-%1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"לא ניתן לפתוח את הקובץ"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"לא ניתן למחוק חלק מהמסמכים"</string> - <string name="share_via" msgid="8966594246261344259">"שתף באמצעות"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"מעתיק קבצים"</string> - <string name="move_notification_title" msgid="6193835179777284805">"מעביר קבצים"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"מחיקת קבצים מתבצעת"</string> - <string name="copy_remaining" msgid="6283790937387975095">"זמן נותר: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="two">מעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> - <item quantity="many">מעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> - <item quantity="other">מעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> - <item quantity="one">מעתיק קובץ <xliff:g id="COUNT_0">%1$d</xliff:g>.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="two">מעביר <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> - <item quantity="many">מעביר <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> - <item quantity="other">מעביר <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> - <item quantity="one">מעביר קובץ <xliff:g id="COUNT_0">%1$d</xliff:g>.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="two">מוחק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> - <item quantity="many">מוחק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> - <item quantity="other">מוחק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים.</item> - <item quantity="one"> מוחק קובץ <xliff:g id="COUNT_0">%1$d</xliff:g>.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"בטל"</string> - <string name="copy_preparing" msgid="3896202461003039386">"מתכונן להעתקה..."</string> - <string name="move_preparing" msgid="2772219441375531410">"מתכונן להעברה…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"מתכונן למחיקה…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="two">לא ניתן היה להעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> - <item quantity="many">לא ניתן היה להעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> - <item quantity="other">לא ניתן היה להעתיק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> - <item quantity="one">לא ניתן היה להעתיק <xliff:g id="COUNT_0">%1$d</xliff:g> קובץ</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="two">לא ניתן היה להעביר <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> - <item quantity="many">לא ניתן היה להעביר <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> - <item quantity="other">לא ניתן היה להעביר <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> - <item quantity="one">לא ניתן היה להעביר <xliff:g id="COUNT_0">%1$d</xliff:g> קובץ</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="two">לא ניתן היה למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> - <item quantity="many">לא ניתן היה למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> - <item quantity="other">לא ניתן היה למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים</item> - <item quantity="one">לא ניתן היה למחוק <xliff:g id="COUNT_0">%1$d</xliff:g> קובץ</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"הקש כדי להציג פרטים"</string> - <string name="close" msgid="3043722427445528732">"סגור"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"הקבצים הבאים לא הועתקו: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"הקבצים הבאים לא הועברו: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"הקבצים הבאים לא נמחקו: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"הקבצים האלה הומרו לפורמט אחר: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> קבצים הועתקו אל הלוח.</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> קבצים הועתקו אל הלוח.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> קבצים הועתקו אל הלוח.</item> - <item quantity="one">קובץ <xliff:g id="COUNT_0">%1$d</xliff:g> הועתק אל הלוח.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"לא ניתן להדביק את הקבצים הנבחרים במיקום הזה."</string> - <string name="menu_rename" msgid="7678802479104285353">"שנה שם"</string> - <string name="rename_error" msgid="4203041674883412606">"ניסיון שינוי שם המסמך נכשל"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"הוצא"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"קבצים מסוימים הומרו"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"האם להעניק לאפליקציה <xliff:g id="APPNAME"><b>^1</b></xliff:g> גישה לספריה <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> באחסון <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"האם להעניק לאפליקציה <xliff:g id="APPNAME"><b>^1</b></xliff:g> גישה אל ספריית <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"האם להעניק לאפליקציה <xliff:g id="APPNAME"><b>^1</b></xliff:g> גישה לנתונים שלך, כולל תמונות וסרטונים, השמורים ב<xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"אל תשאל שוב"</string> - <string name="allow" msgid="7225948811296386551">"אפשר"</string> - <string name="deny" msgid="2081879885755434506">"דחה"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> נבחרו</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> נבחרו</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> נבחרו</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> נבחר</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> פריטים</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> פריטים</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> פריטים</item> - <item quantity="one">פריט <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"האם למחוק את \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"האם למחוק את התיקייה \"<xliff:g id="NAME">%1$s</xliff:g>\" ואת התוכן שלה?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="two">האם למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים?</item> - <item quantity="many">האם למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים?</item> - <item quantity="other">האם למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> קבצים?</item> - <item quantity="one">האם למחוק <xliff:g id="COUNT_0">%1$d</xliff:g> קובץ?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="two">האם למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> תיקיות ואת התוכן שלהן?</item> - <item quantity="many">האם למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> תיקיות ואת התוכן שלהן?</item> - <item quantity="other">האם למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> תיקיות ואת התוכן שלהן?</item> - <item quantity="one">האם למחוק <xliff:g id="COUNT_0">%1$d</xliff:g> תיקייה ואת התוכן שלה?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="two">האם למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> פריטים?</item> - <item quantity="many">האם למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> פריטים?</item> - <item quantity="other">האם למחוק <xliff:g id="COUNT_1">%1$d</xliff:g> פריטים?</item> - <item quantity="one">האם למחוק <xliff:g id="COUNT_0">%1$d</xliff:g> פריט?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml deleted file mode 100644 index 3cee741b37d0..000000000000 --- a/packages/DocumentsUI/res/values-ja/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ファイル"</string> - <string name="downloads_label" msgid="959113951084633612">"ダウンロード"</string> - <string name="title_open" msgid="4353228937663917801">"次から開く:"</string> - <string name="title_save" msgid="2433679664882857999">"次に保存:"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"新しいフォルダ"</string> - <string name="menu_grid" msgid="6878021334497835259">"グリッド表示"</string> - <string name="menu_list" msgid="7279285939892417279">"リスト表示"</string> - <string name="menu_sort" msgid="7677740407158414452">"並べ替え"</string> - <string name="menu_search" msgid="3816712084502856974">"検索"</string> - <string name="menu_settings" msgid="8239065133341597825">"ストレージの設定"</string> - <string name="menu_open" msgid="432922957274920903">"開く"</string> - <string name="menu_save" msgid="2394743337684426338">"保存"</string> - <string name="menu_share" msgid="3075149983979628146">"共有"</string> - <string name="menu_delete" msgid="8138799623850614177">"削除"</string> - <string name="menu_select_all" msgid="8323579667348729928">"すべて選択"</string> - <string name="menu_copy" msgid="3612326052677229148">"コピー…"</string> - <string name="menu_move" msgid="1828090633118079817">"移動..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"新しいウィンドウ"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"切り取り"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"コピー"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"貼り付け"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"内部ストレージを表示"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"内部ストレージを非表示"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ファイルサイズを表示"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ファイルサイズを非表示"</string> - <string name="button_select" msgid="527196987259139214">"選択"</string> - <string name="button_copy" msgid="8706475544635021302">"コピー"</string> - <string name="button_move" msgid="2202666023104202232">"移動"</string> - <string name="button_dismiss" msgid="3714065566893946085">"表示しない"</string> - <string name="button_retry" msgid="4392027584153752797">"再試行"</string> - <string name="sort_name" msgid="9183560467917256779">"名前順"</string> - <string name="sort_date" msgid="586080032956151448">"更新日順"</string> - <string name="sort_size" msgid="3350681319735474741">"サイズ順"</string> - <string name="drawer_open" msgid="4545466532430226949">"ルートを表示する"</string> - <string name="drawer_close" msgid="7602734368552123318">"ルートを非表示にする"</string> - <string name="save_error" msgid="6167009778003223664">"ドキュメントを保存できませんでした"</string> - <string name="create_error" msgid="3735649141335444215">"フォルダを作成できませんでした"</string> - <string name="query_error" msgid="5999895349602476581">"現在、コンテンツを読み込むことができません"</string> - <string name="root_recent" msgid="4470053704320518133">"最近"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"空き容量: <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"ストレージサービス"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"ショートカット"</string> - <string name="root_type_device" msgid="7121342474653483538">"端末"</string> - <string name="root_type_apps" msgid="8838065367985945189">"その他のアプリ"</string> - <string name="empty" msgid="7858882803708117596">"アイテムがありません"</string> - <string name="no_results" msgid="6622510343880730446">"該当するものは %1$s にありません"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ファイルを開けません"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"一部のドキュメントを削除できません"</string> - <string name="share_via" msgid="8966594246261344259">"共有ツール"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ファイルのコピー中"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ファイルを移動中"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ファイルを削除しています"</string> - <string name="copy_remaining" msgid="6283790937387975095">"残り<xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>個のファイルをコピーしています。</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>個のファイルをコピーしています。</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>個のファイルを移動しています。</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>個のファイルを移動しています。</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>件のファイルを削除しています。</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>件のファイルを削除しています。</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"元に戻す"</string> - <string name="copy_preparing" msgid="3896202461003039386">"コピーの準備をしています…"</string> - <string name="move_preparing" msgid="2772219441375531410">"移動の準備をしています…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"削除の準備をしています…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個のファイルをコピーできませんでした</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個のファイルをコピーできませんでした</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個のファイルを移動できませんでした</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個のファイルを移動できませんでした</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個のファイルを削除できませんでした</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個のファイルを削除できませんでした</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"タップすると詳細が表示されます"</string> - <string name="close" msgid="3043722427445528732">"閉じる"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"次のファイルをコピーできませんでした: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"次のファイルを移動できませんでした: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"次のファイルを削除できませんでした: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"次のファイルが別の形式に変換されました: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>件のファイルをクリップボードにコピーしました。</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>件のファイルをクリップボードにコピーしました。</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"選択したファイルをこの場所に貼り付けることはできません。"</string> - <string name="menu_rename" msgid="7678802479104285353">"名前を変更"</string> - <string name="rename_error" msgid="4203041674883412606">"ドキュメントの名前を変更できませんでした"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"取り外し"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"一部のファイルが変換されました"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"「<xliff:g id="STORAGE"><i>^3</i></xliff:g>」の「<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>」ディレクトリに「<xliff:g id="APPNAME"><b>^1</b></xliff:g>」へのアクセスを許可しますか?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"「<xliff:g id="APPNAME"><b>^1</b></xliff:g>」アプリに「<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>」ディレクトリへのアクセスを許可しますか?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g>の写真や動画などのデータへのアクセスを「<xliff:g id="APPNAME"><b>^1</b></xliff:g>」に許可しますか?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"今後表示しない"</string> - <string name="allow" msgid="7225948811296386551">"許可"</string> - <string name="deny" msgid="2081879885755434506">"拒否"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個を選択中</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個を選択中</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個のアイテム</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個のアイテム</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"「<xliff:g id="NAME">%1$s</xliff:g>」を削除しますか?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"フォルダ「<xliff:g id="NAME">%1$s</xliff:g>」とそのコンテンツを削除しますか?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個のファイルを削除しますか?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個のファイルを削除しますか?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個のフォルダとそのコンテンツを削除しますか?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個のフォルダとそのコンテンツを削除しますか?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個の項目を削除しますか?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個の項目を削除しますか?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml deleted file mode 100644 index ccb96a7e329b..000000000000 --- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ფაილები"</string> - <string name="downloads_label" msgid="959113951084633612">"ჩამოტვირთვები"</string> - <string name="title_open" msgid="4353228937663917801">"გახსნა აქედან:"</string> - <string name="title_save" msgid="2433679664882857999">"შენახვა აქ:"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"ახალი საქაღალდე"</string> - <string name="menu_grid" msgid="6878021334497835259">"ბადის ხედი"</string> - <string name="menu_list" msgid="7279285939892417279">"სიის ხედი"</string> - <string name="menu_sort" msgid="7677740407158414452">"სორტირება:"</string> - <string name="menu_search" msgid="3816712084502856974">"ძიება"</string> - <string name="menu_settings" msgid="8239065133341597825">"საცავის პარამეტრები"</string> - <string name="menu_open" msgid="432922957274920903">"გახსნა"</string> - <string name="menu_save" msgid="2394743337684426338">"შენახვა"</string> - <string name="menu_share" msgid="3075149983979628146">"გაზიარება"</string> - <string name="menu_delete" msgid="8138799623850614177">"წაშლა"</string> - <string name="menu_select_all" msgid="8323579667348729928">"ყველას არჩევა"</string> - <string name="menu_copy" msgid="3612326052677229148">"კოპირება…"</string> - <string name="menu_move" msgid="1828090633118079817">"გადაადგილება..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"ახალი ფანჯარა"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"ამოჭრა"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"კოპირება"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"ჩასმა"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"შიდა საცავის ჩვენება"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"შიდა მეხსიერების დამალვა"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ფაილის ზომის ჩვენება"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ფაილის ზომის დამალვა"</string> - <string name="button_select" msgid="527196987259139214">"არჩევა"</string> - <string name="button_copy" msgid="8706475544635021302">"კოპირება"</string> - <string name="button_move" msgid="2202666023104202232">"გადაადგილება"</string> - <string name="button_dismiss" msgid="3714065566893946085">"დახურვა"</string> - <string name="button_retry" msgid="4392027584153752797">"ისევ ცდა"</string> - <string name="sort_name" msgid="9183560467917256779">"სახელით"</string> - <string name="sort_date" msgid="586080032956151448">"ცვლილების თარიღით"</string> - <string name="sort_size" msgid="3350681319735474741">"ზომით"</string> - <string name="drawer_open" msgid="4545466532430226949">"ფესვების ჩვენება"</string> - <string name="drawer_close" msgid="7602734368552123318">"ფესვების დამალვა"</string> - <string name="save_error" msgid="6167009778003223664">"დოკუმენტის შენახვა ვერ მოხერხდა"</string> - <string name="create_error" msgid="3735649141335444215">"საქაღალდის შექმნა ვერ მოხერხდა"</string> - <string name="query_error" msgid="5999895349602476581">"კონტენტის ჩატვირთვა ამჟამად ვერ ხერხდება"</string> - <string name="root_recent" msgid="4470053704320518133">"ბოლო"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> თავისუფალია"</string> - <string name="root_type_service" msgid="2178854894416775409">"მეხსიერების სერვისები"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"მალსახმობები"</string> - <string name="root_type_device" msgid="7121342474653483538">"მოწყობილობები"</string> - <string name="root_type_apps" msgid="8838065367985945189">"მეტი აპები"</string> - <string name="empty" msgid="7858882803708117596">"ერთეულები არ არის"</string> - <string name="no_results" msgid="6622510343880730446">"„%1$s“-ში დამთხვევა ვერ მოიძებნა"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ფაილის გახსნა ვერ ხერხდება"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"ზოგიერთი დოკუმენტის წაშლა ვერ ხერხდება"</string> - <string name="share_via" msgid="8966594246261344259">"გაზიარება:"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"მიმდ. ფაილების კოპირება"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ფაილების გადაადგილება"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ფაილების წაშლა…"</string> - <string name="copy_remaining" msgid="6283790937387975095">"დარჩა <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">მიმდინარეობს <xliff:g id="COUNT_1">%1$d</xliff:g> ფაილის კოპირება.</item> - <item quantity="one">მიმდინარეობს <xliff:g id="COUNT_0">%1$d</xliff:g> ფაილის კოპირება.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">გადაადგილდება <xliff:g id="COUNT_1">%1$d</xliff:g> ფაილი.</item> - <item quantity="one">გადაადგილდება <xliff:g id="COUNT_0">%1$d</xliff:g> ფაილი.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">მიმდინარეობს <xliff:g id="COUNT_1">%1$d</xliff:g> ფაილის წაშლა.</item> - <item quantity="one">მიმდინარეობს <xliff:g id="COUNT_0">%1$d</xliff:g> ფაილის წაშლა.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"დაბრუნება"</string> - <string name="copy_preparing" msgid="3896202461003039386">"მომზადება კოპირებისთვის…"</string> - <string name="move_preparing" msgid="2772219441375531410">"გადაადგილება მზადდება..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"მზადდება წასაშლელად…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>-დან"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ფაილი ვერ დაკოპირდა</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ფაილი ვერ დაკოპირდა</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ფაილი ვერ გადაადგილდა</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ფაილი ვერ გადაადგილდა</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ფაილი ვერ წაიშალა</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ფაილი ვერ წაიშალა</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"შეეხეთ დეტალების სანახავად"</string> - <string name="close" msgid="3043722427445528732">"დახურვა"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"შემდეგი ფაილები არ დაკოპირდა: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"შემდეგი ფაილები არ გადაადგილდა: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"შემდეგი ფაილები არ წაიშალა: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"შემდეგი ფაილები გარდაქმნილია სხვა ფორმატში: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">მოხდა <xliff:g id="COUNT_1">%1$d</xliff:g> ფაილის გაცვლის ბუფერში კოპირება.</item> - <item quantity="one">მოხდა <xliff:g id="COUNT_0">%1$d</xliff:g> ფაილის გაცვლის ბუფერში კოპირება.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"ამ მდებარეობაში შერჩეული ფაილების ჩასმა შეუძლებელია."</string> - <string name="menu_rename" msgid="7678802479104285353">"გადარქმევა"</string> - <string name="rename_error" msgid="4203041674883412606">"დოკუმენტის გადარქმევა ვერ მოხერხდა"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"ამოღება"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ზოგიერთი ფაილი გარდაქმნილია"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"გსურთ, <xliff:g id="APPNAME"><b>^1</b></xliff:g> სარგებლობდეს <xliff:g id="STORAGE"><i>^3</i></xliff:g>-ის დირექტორიაზე „<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>“ წვდომის უფლებით?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"გსურთ, <xliff:g id="APPNAME"><b>^1</b></xliff:g> სარგებლობდეს დირექტორიაზე „<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>“ წვდომის უფლებით?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"გსურთ, <xliff:g id="APPNAME"><b>^1</b></xliff:g> სარგებლობდეს <xliff:g id="STORAGE"><i>^2</i></xliff:g>-ზე არსებულ მონაცემებზე, მათ შორის, ფოტოებსა და ვიდეოებზე, წვდომის უფლებით?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"აღარ მკითხოთ"</string> - <string name="allow" msgid="7225948811296386551">"უფლების მიცემა"</string> - <string name="deny" msgid="2081879885755434506">"აკრძალვა"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">არჩეულია <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">არჩეულია <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ერთეული</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ერთეული</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"გსურთ, წაშალოთ „<xliff:g id="NAME">%1$s</xliff:g>“?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"გსურთ, წაშალოთ საქაღალდე „<xliff:g id="NAME">%1$s</xliff:g>“ და მისი შიგთავსი?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">გსურთ <xliff:g id="COUNT_1">%1$d</xliff:g> ფაილის წაშლა?</item> - <item quantity="one">გსურთ <xliff:g id="COUNT_0">%1$d</xliff:g> ფაილის წაშლა?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">გსურთ <xliff:g id="COUNT_1">%1$d</xliff:g> საქაღალდისა და მათი შიგთავსის წაშლა?</item> - <item quantity="one">გსურთ <xliff:g id="COUNT_0">%1$d</xliff:g> საქაღალდისა და მისი შიგთავსის წაშლა?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">გსურთ <xliff:g id="COUNT_1">%1$d</xliff:g> ერთეულის წაშლა?</item> - <item quantity="one">გსურთ <xliff:g id="COUNT_0">%1$d</xliff:g> ერთეულის წაშლა?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml b/packages/DocumentsUI/res/values-kk-rKZ/strings.xml deleted file mode 100644 index 2925361202f8..000000000000 --- a/packages/DocumentsUI/res/values-kk-rKZ/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Файлдар"</string> - <string name="downloads_label" msgid="959113951084633612">"Жүктеулер"</string> - <string name="title_open" msgid="4353228937663917801">"Мынадан ашу:"</string> - <string name="title_save" msgid="2433679664882857999">"Сақталатын орны"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Жаңа қалта"</string> - <string name="menu_grid" msgid="6878021334497835259">"Торлы көрініс"</string> - <string name="menu_list" msgid="7279285939892417279">"Тізім көрінісі"</string> - <string name="menu_sort" msgid="7677740407158414452">"Белгіге қарай сұрыптау"</string> - <string name="menu_search" msgid="3816712084502856974">"Іздеу"</string> - <string name="menu_settings" msgid="8239065133341597825">"Жад параметрлері"</string> - <string name="menu_open" msgid="432922957274920903">"Ашу"</string> - <string name="menu_save" msgid="2394743337684426338">"Сақтау"</string> - <string name="menu_share" msgid="3075149983979628146">"Бөлісу"</string> - <string name="menu_delete" msgid="8138799623850614177">"Жою"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Барлығын таңдау"</string> - <string name="menu_copy" msgid="3612326052677229148">"Көшіру орны…"</string> - <string name="menu_move" msgid="1828090633118079817">"Орнын ауыстыру…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Жаңа терезе"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Қиып алу"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Көшіру"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Қою"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Ішкі жадты көрсету"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ішкі жадты жасыру"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Файл өлшемін көрсету"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Файл өлшемін жасыру"</string> - <string name="button_select" msgid="527196987259139214">"Таңдау"</string> - <string name="button_copy" msgid="8706475544635021302">"Көшіру"</string> - <string name="button_move" msgid="2202666023104202232">"Жылжыту"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Өшіру"</string> - <string name="button_retry" msgid="4392027584153752797">"Әрекетті қайталау"</string> - <string name="sort_name" msgid="9183560467917256779">"Атауы бойынша"</string> - <string name="sort_date" msgid="586080032956151448">"Өзгертілген мерзімі бойынша"</string> - <string name="sort_size" msgid="3350681319735474741">"Өлшемі бойынша"</string> - <string name="drawer_open" msgid="4545466532430226949">"Тамырын көрсету"</string> - <string name="drawer_close" msgid="7602734368552123318">"Тамырын жасыру"</string> - <string name="save_error" msgid="6167009778003223664">"Құжатты сақтау орындалмады"</string> - <string name="create_error" msgid="3735649141335444215">"Қалта жасақтау іске аспады"</string> - <string name="query_error" msgid="5999895349602476581">"Қазір мазмұнды жүктеу мүмкін емес"</string> - <string name="root_recent" msgid="4470053704320518133">"Жуықта қолданылған"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> бос"</string> - <string name="root_type_service" msgid="2178854894416775409">"Жад қызметтері"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Төте пернелер"</string> - <string name="root_type_device" msgid="7121342474653483538">"Құрылғылар"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Басқа қолданбалар"</string> - <string name="empty" msgid="7858882803708117596">"Бос"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s ішінде сәйкестіктер жоқ"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Файлды ашу мүмкін емес"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Кейбір құжаттарды жою мүмкін болмады"</string> - <string name="share_via" msgid="8966594246261344259">"Бөлісу"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Файлдарды көшіру"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Файлдар тасымалдануда"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Файлдар жойылуда"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> қалды"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлды көшіру.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлды көшіру.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл орын ауыстыруда.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл орын ауыстыруда.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл жойылуда.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл жойылуда.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Кері қайтару"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Көшіруге дайындау…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Тасымалдауға дайындалуда..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Жоюға дайындалуда…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлды көшіру мүмкін болмады</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлды көшіру мүмкін болмады</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлды жылжыту мүмкін болмады</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлды жылжыту мүмкін болмады</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлды жою мүмкін болмады</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлды жою мүмкін болмады</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Мәліметтерді көру үшін түртіңіз"</string> - <string name="close" msgid="3043722427445528732">"Жабу"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Мына файлдар көшірілген жоқ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Мына файлдар жылжытылған жоқ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Келесі файлдар жойылмады: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Мына файлдар басқа пішімге түрлендірілді: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Аралық сақтағышқа <xliff:g id="COUNT_1">%1$d</xliff:g> файл көшірілді.</item> - <item quantity="one">Аралық сақтағышқа <xliff:g id="COUNT_0">%1$d</xliff:g> файл көшірілді.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Таңдалған файлдарды бұл орынға қою мүмкін емес."</string> - <string name="menu_rename" msgid="7678802479104285353">"Атын өзгерту"</string> - <string name="rename_error" msgid="4203041674883412606">"Құжат қайта аталмады"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Шығару"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Кейбір файлдар түрлендірілді"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> қолданбасына <xliff:g id="STORAGE"><i>^3</i></xliff:g> қоймасындағы <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> каталогына өтуге рұқсат беру керек пе?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> қолданбасына <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> каталогына кіруге рұқсат беру керек пе?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> <xliff:g id="STORAGE"><i>^2</i></xliff:g> қоймасындағы деректерге, соның ішінде фотосуреттерге және бейнелерге кіру мүмкіндігін беру керек пе?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Қайта сұралмасын"</string> - <string name="allow" msgid="7225948811296386551">"Рұқсат беру"</string> - <string name="deny" msgid="2081879885755434506">"Бас тарту"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> таңдалды</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> таңдалды</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> элемент</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> элемент</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" жою керек пе?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" қалтасын және оның мазмұнын жою керек пе?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлды жою керек пе?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлды жою керек пе?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> қалтаны ішіндегісімен бірге жою керек пе?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> қалтаны ішіндегісімен бірге жою керек пе?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> элементті жою керек пе?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> элементті жою керек пе?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-km-rKH/strings.xml b/packages/DocumentsUI/res/values-km-rKH/strings.xml deleted file mode 100644 index 808a63eef4cf..000000000000 --- a/packages/DocumentsUI/res/values-km-rKH/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ឯកសារ"</string> - <string name="downloads_label" msgid="959113951084633612">"ទាញយក"</string> - <string name="title_open" msgid="4353228937663917801">"បើកពី"</string> - <string name="title_save" msgid="2433679664882857999">"រក្សាទុកទៅ"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"ថតថ្មី"</string> - <string name="menu_grid" msgid="6878021334497835259">"ទិដ្ឋភាពក្រឡា"</string> - <string name="menu_list" msgid="7279285939892417279">"ទិដ្ឋភាពបញ្ជី"</string> - <string name="menu_sort" msgid="7677740407158414452">"តម្រៀបតាម"</string> - <string name="menu_search" msgid="3816712084502856974">"ស្វែងរក"</string> - <string name="menu_settings" msgid="8239065133341597825">"កំណត់ការផ្ទុក"</string> - <string name="menu_open" msgid="432922957274920903">"បើក"</string> - <string name="menu_save" msgid="2394743337684426338">"រក្សាទុក"</string> - <string name="menu_share" msgid="3075149983979628146">"ចែករំលែក"</string> - <string name="menu_delete" msgid="8138799623850614177">"លុប"</string> - <string name="menu_select_all" msgid="8323579667348729928">"ជ្រើសរើសទាំងអស់"</string> - <string name="menu_copy" msgid="3612326052677229148">"ថតចម្លងទៅ…"</string> - <string name="menu_move" msgid="1828090633118079817">"ផ្លាស់ទីទៅ៖"</string> - <string name="menu_new_window" msgid="1226032889278727538">"បង្អួចថ្មី"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"កាត់"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"ចម្លង"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"បិទភ្ជាប់"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"បង្ហាញឧបករណ៍ផ្ទុកខាងក្នុង"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"លាក់ឧបករណ៍ផ្ទុកខាងក្នុង"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"បង្ហាញទំហំឯកសារ"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"លាក់ទំហំឯកសារ"</string> - <string name="button_select" msgid="527196987259139214">"ជ្រើស"</string> - <string name="button_copy" msgid="8706475544635021302">"ចម្លង"</string> - <string name="button_move" msgid="2202666023104202232">"ផ្លាស់ទី"</string> - <string name="button_dismiss" msgid="3714065566893946085">"បដិសេធ"</string> - <string name="button_retry" msgid="4392027584153752797">"ព្យាយាមម្ដងទៀត"</string> - <string name="sort_name" msgid="9183560467917256779">"តាមឈ្មោះ"</string> - <string name="sort_date" msgid="586080032956151448">"តាមកាលបរិច្ឆេទបានកែប្រែ"</string> - <string name="sort_size" msgid="3350681319735474741">"តាមទំហំ"</string> - <string name="drawer_open" msgid="4545466532430226949">"បង្ហាញ roots"</string> - <string name="drawer_close" msgid="7602734368552123318">"លាក់ roots"</string> - <string name="save_error" msgid="6167009778003223664">"បានបរាជ័យក្នុងការរក្សាទុកឯកសារ"</string> - <string name="create_error" msgid="3735649141335444215">"បានបរាជ័យក្នុងការបង្កើតថត"</string> - <string name="query_error" msgid="5999895349602476581">"មិនអាចដំណើរការមាតិកាបានទេនៅពេលនេះ"</string> - <string name="root_recent" msgid="4470053704320518133">"ថ្មីៗ"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"ទំនេរ <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"សេវាកម្មផ្ដល់ឧបករណ៍ផ្ទុក"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"ផ្លូវកាត់"</string> - <string name="root_type_device" msgid="7121342474653483538">"ឧបករណ៍"</string> - <string name="root_type_apps" msgid="8838065367985945189">"កម្មវិធីច្រើនទៀត"</string> - <string name="empty" msgid="7858882803708117596">"គ្មានធាតុ"</string> - <string name="no_results" msgid="6622510343880730446">"មិនមានការប្រកួតនៅក្នុង %1$s ទេ"</string> - <string name="toast_no_application" msgid="4632640357724698144">"មិនអាចបើកឯកសារបានទេ"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"មិនអាចលុបឯកសារមួយចំនួន"</string> - <string name="share_via" msgid="8966594246261344259">"ចែករំលែកតាម"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"កំពុងថតចម្លងឯកសារ"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ផ្លាស់ទីឯកសារ"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"កំពុងលុបឯកសារ"</string> - <string name="copy_remaining" msgid="6283790937387975095">"នៅសល់ <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">កំពុងថតចម្លងឯកសារចំនួន <xliff:g id="COUNT_1">%1$d</xliff:g> ។</item> - <item quantity="one">កំពុងថតចម្លងឯកសារចំនួន <xliff:g id="COUNT_0">%1$d</xliff:g> ។</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">កំពុងផ្លាស់ទីឯកសារ <xliff:g id="COUNT_1">%1$d</xliff:g>។</item> - <item quantity="one">កំពុងផ្លាស់ទីឯកសារ <xliff:g id="COUNT_0">%1$d</xliff:g>។</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">កំពុងលុបឯកសារ <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">កំពុងលុបឯកសារ <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <string name="undo" msgid="7905788502491742328">"មិនធ្វើវិញ"</string> - <string name="copy_preparing" msgid="3896202461003039386">"កំពុងរៀបចំចម្លង…"</string> - <string name="move_preparing" msgid="2772219441375531410">"កំពុងរៀបចំផ្លាស់ទី…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"កំពុងរៀបចំលុប…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">មិនអាចថតចម្លងឯកសារ <xliff:g id="COUNT_1">%1$d</xliff:g> ច្បាប់</item> - <item quantity="one">មិនអាចថតចម្លងឯកសារ <xliff:g id="COUNT_0">%1$d</xliff:g> ច្បាប់</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">មិនអាចផ្លាស់ទីឯកសារ <xliff:g id="COUNT_1">%1$d</xliff:g> ច្បាប់</item> - <item quantity="one">មិនអាចផ្លាស់ទីឯកសារ <xliff:g id="COUNT_0">%1$d</xliff:g> ច្បាប់</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">មិនអាចលុបឯកសារ <xliff:g id="COUNT_1">%1$d</xliff:g> ច្បាប់</item> - <item quantity="one">មិនអាចលុបឯកសារ <xliff:g id="COUNT_0">%1$d</xliff:g> ច្បាប់</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"ប៉ះដើម្បីមើលព័ត៌មានលម្អិត"</string> - <string name="close" msgid="3043722427445528732">"បិទ"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"ឯកសារទាំងនេះមិនត្រូវបានថតចម្លងទេ៖ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"ឯកសារទាំងនេះមិនត្រូវបានផ្លាស់ទីទេ៖ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"ឯកសារទាំងនេះមិនត្រូវបានលុបទេ៖ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ឯកសារទាំងនេះត្រូវបានបម្លែងទៅជាទម្រង់ផ្សេង៖ <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">បានចម្លងឯកសារ <xliff:g id="COUNT_1">%1$d</xliff:g> ទៅតម្បៀតខ្ទាស់។</item> - <item quantity="one">បានចម្លងឯកសារ <xliff:g id="COUNT_0">%1$d</xliff:g> ទៅតម្បៀតខ្ទាស់។</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"មិនអាចបិទភ្ជាប់ឯកសារដែលបានជ្រើសនៅក្នុងទីតាំងនេះបានទេ។"</string> - <string name="menu_rename" msgid="7678802479104285353">"ប្ដូរឈ្មោះ"</string> - <string name="rename_error" msgid="4203041674883412606">"បានបរាជ័យក្នុងការប្តូរឈ្មោះឯកសារ"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"ដកចេញ"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ឯកសារមួយចំនួនត្រូវបានបម្លែង"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"ផ្តល់សិទ្ធិឲ្យ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ចូលដំណើរការថត <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> នៅលើ <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"ផ្តល់សិទ្ធិឲ្យ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ចូលដំណើរការថត <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ឬ?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"ផ្តល់សិទ្ធិអនុញ្ញាតដល់ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ដើម្បីចូលដំណើរការទិន្នន័យរបស់អ្នក រាប់បញ្ចូលទាំងរូបថត និងវីដេអូ នៅលើ <xliff:g id="STORAGE"><i>^2</i></xliff:g> ឬទេ?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"កុំសួរទៀត"</string> - <string name="allow" msgid="7225948811296386551">"អនុញ្ញាត"</string> - <string name="deny" msgid="2081879885755434506">"បដិសេធ"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">បានជ្រើស <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">បានជ្រើស <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ធាតុ</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ធាតុ</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"លុប \"<xliff:g id="NAME">%1$s</xliff:g>\" ឬ?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"លុបថតឯកសារ \"<xliff:g id="NAME">%1$s</xliff:g>\" និងមាតិការបស់វាឬ?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">លុបឯកសារ <xliff:g id="COUNT_1">%1$d</xliff:g> ច្បាប់ឬ?</item> - <item quantity="one">លុបឯកសារ <xliff:g id="COUNT_0">%1$d</xliff:g> ច្បាប់ឬ?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">លុបថតឯកសារ <xliff:g id="COUNT_1">%1$d</xliff:g> និងមាតិការបស់វាឬ?</item> - <item quantity="one">លុបថតឯកសារ <xliff:g id="COUNT_0">%1$d</xliff:g> និងមាតិការបស់វាឬ?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">លុបធាតុ <xliff:g id="COUNT_1">%1$d</xliff:g> ឬ?</item> - <item quantity="one">លុបធាតុ <xliff:g id="COUNT_0">%1$d</xliff:g> ឬ?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-kn-rIN/strings.xml b/packages/DocumentsUI/res/values-kn-rIN/strings.xml deleted file mode 100644 index 9e83f2acdfde..000000000000 --- a/packages/DocumentsUI/res/values-kn-rIN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ಫೈಲ್ಗಳು"</string> - <string name="downloads_label" msgid="959113951084633612">"ಡೌನ್ಲೋಡ್ಗಳು"</string> - <string name="title_open" msgid="4353228937663917801">"ಇದರ ಮೂಲಕ ತೆರೆಯಿರಿ"</string> - <string name="title_save" msgid="2433679664882857999">"ಇವುಗಳಲ್ಲಿ ಉಳಿಸಿ"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"ಹೊಸ ಫೋಲ್ಡರ್"</string> - <string name="menu_grid" msgid="6878021334497835259">"ಗ್ರಿಡ್ ವೀಕ್ಷಣೆ"</string> - <string name="menu_list" msgid="7279285939892417279">"ಪಟ್ಟಿ ವೀಕ್ಷಣೆ"</string> - <string name="menu_sort" msgid="7677740407158414452">"ಈ ಪ್ರಕಾರ ವಿಂಗಡಿಸು"</string> - <string name="menu_search" msgid="3816712084502856974">"ಹುಡುಕು"</string> - <string name="menu_settings" msgid="8239065133341597825">"ಸಂಗ್ರಹಣೆ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> - <string name="menu_open" msgid="432922957274920903">"ತೆರೆ"</string> - <string name="menu_save" msgid="2394743337684426338">"ಉಳಿಸು"</string> - <string name="menu_share" msgid="3075149983979628146">"ಹಂಚು"</string> - <string name="menu_delete" msgid="8138799623850614177">"ಅಳಿಸು"</string> - <string name="menu_select_all" msgid="8323579667348729928">"ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆಮಾಡಿ"</string> - <string name="menu_copy" msgid="3612326052677229148">"ಇದಕ್ಕೆ ನಕಲಿಸಿ…"</string> - <string name="menu_move" msgid="1828090633118079817">"ಇದಕ್ಕೆ ಸರಿಸು…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"ಹೊಸ ವಿಂಡೋ"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"ಕತ್ತರಿಸು"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"ನಕಲಿಸು"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"ಅಂಟಿಸು"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"ಆಂತರಿಕ ಸಂಗ್ರಹಣೆಯನ್ನು ತೋರಿಸು"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"ಆಂತರಿಕ ಸಂಗ್ರಹಣೆಯನ್ನು ಮರೆಮಾಡಿ"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ಫೈಲ್ ಗಾತ್ರವನ್ನು ತೋರಿಸು"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ಫೈಲ್ ಗಾತ್ರವನ್ನು ಮರೆಮಾಡಿ"</string> - <string name="button_select" msgid="527196987259139214">"ಆಯ್ಕೆಮಾಡು"</string> - <string name="button_copy" msgid="8706475544635021302">"ನಕಲಿಸು"</string> - <string name="button_move" msgid="2202666023104202232">"ಸರಿಸು"</string> - <string name="button_dismiss" msgid="3714065566893946085">"ವಜಾಗೊಳಿಸಿ"</string> - <string name="button_retry" msgid="4392027584153752797">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string> - <string name="sort_name" msgid="9183560467917256779">"ಹೆಸರಿನ ಪ್ರಕಾರ"</string> - <string name="sort_date" msgid="586080032956151448">"ಮಾರ್ಪಡಿಸಿರುವ ದಿನಾಂಕದ ಪ್ರಕಾರ"</string> - <string name="sort_size" msgid="3350681319735474741">"ಗಾತ್ರದ ಪ್ರಕಾರ"</string> - <string name="drawer_open" msgid="4545466532430226949">"ರೂಟ್ಗಳನ್ನು ತೋರಿಸು"</string> - <string name="drawer_close" msgid="7602734368552123318">"ರೂಟ್ಗಳನ್ನು ಮರೆಮಾಡು"</string> - <string name="save_error" msgid="6167009778003223664">"ಡಾಕ್ಯುಮೆಂಟ್ ಉಳಿಸಲು ವಿಫಲವಾಗಿದೆ"</string> - <string name="create_error" msgid="3735649141335444215">"ಫೋಲ್ಡರ್ ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ"</string> - <string name="query_error" msgid="5999895349602476581">"ಈ ಕ್ಷಣದಲ್ಲಿ ವಿಷಯವನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> - <string name="root_recent" msgid="4470053704320518133">"ಇತ್ತೀಚಿನದು"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ಮುಕ್ತವಾಗಿದೆ"</string> - <string name="root_type_service" msgid="2178854894416775409">"ಸಂಗ್ರಹಣೆ ಸೇವೆಗಳು"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"ಶಾರ್ಟ್ಕಟ್ಗಳು"</string> - <string name="root_type_device" msgid="7121342474653483538">"ಸಾಧನಗಳು"</string> - <string name="root_type_apps" msgid="8838065367985945189">"ಇನ್ನಷ್ಟು ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string> - <string name="empty" msgid="7858882803708117596">"ಯಾವುದೇ ಐಟಂಗಳಿಲ್ಲ"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s ರಲ್ಲಿ ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಗಳಿಲ್ಲ"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ಫೈಲ್ ತೆರೆಯಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"ಕೆಲವು ಡಾಕ್ಯುಮೆಂಟ್ಗಳನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> - <string name="share_via" msgid="8966594246261344259">"ಈ ಮೂಲಕ ಹಂಚಿಕೊಳ್ಳಿ"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗುತ್ತಿದೆ"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ಫೈಲ್ಗಳನ್ನು ಸರಿಸಲಾಗುತ್ತಿದೆ"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ಫೈಲ್ ಅಳಿಸಲಾಗುತ್ತಿದೆ"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ಉಳಿದಿದೆ"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗುತ್ತಿದೆ.</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗುತ್ತಿದೆ.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಸರಿಸಲಾಗುತ್ತಿದೆ.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಸರಿಸಲಾಗುತ್ತಿದೆ.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"ರದ್ದುಗೊಳಿಸಿ"</string> - <string name="copy_preparing" msgid="3896202461003039386">"ನಕಲಿಸಲು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ..."</string> - <string name="move_preparing" msgid="2772219441375531410">"ಸರಿಸಲು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"ಅಳಿಸಲು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಸರಿಸಲಾಗಲಿಲ್ಲ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಸರಿಸಲಾಗಲಿಲ್ಲ</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"ವಿವರಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> - <string name="close" msgid="3043722427445528732">"ಮುಚ್ಚು"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"ಈ ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗಿಲ್ಲ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"ಈ ಫೈಲ್ಗಳನ್ನು ಸರಿಸಲಾಗಿಲ್ಲ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"ಈ ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಲಾಗಿಲ್ಲ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ಈ ಫೈಲ್ಗಳನ್ನು ಮತ್ತೊಂದು ಫಾರ್ಮೆಟ್ಗೆ ಪರಿವರ್ತಿಸಲಾಗಿತ್ತು: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗಿದೆ.</item> - <item quantity="other">ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ನಕಲಿಸಲಾಗಿದೆ.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"ಈ ಸ್ಥಳದಲ್ಲಿ ಆಯ್ಕೆಮಾಡಿದ ಫೈಲ್ಗಳನ್ನು ಅಂಟಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> - <string name="menu_rename" msgid="7678802479104285353">"ಮರುಹೆಸರಿಸು"</string> - <string name="rename_error" msgid="4203041674883412606">"ಡಾಕ್ಯುಮೆಂಟ್ ಮರುಹೆಸರಿಸಲು ವಿಫಲವಾಗಿದೆ"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"ಎಜೆಕ್ಟ್"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ಕೆಲವು ಫೈಲ್ಗಳನ್ನು ಪರಿವರ್ತಿಸಲಾಗಿದೆ"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="STORAGE"><i>^3</i></xliff:g> ರಲ್ಲಿ <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ಡೈರೆಕ್ಟರಿಗೆ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ಪ್ರವೇಶ ನೀಡುವುದೇ?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g><xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ಡೈರೆಕ್ಟರಿ ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಸುವುದೇ?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g> ಸಂಗ್ರಹಣೆಯಲ್ಲಿನ ಪೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಲು <xliff:g id="APPNAME"><b>^1</b></xliff:g> ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುವುದೇ?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"ಮತ್ತೆ ಕೇಳಬೇಡಿ"</string> - <string name="allow" msgid="7225948811296386551">"ಅನುಮತಿಸು"</string> - <string name="deny" msgid="2081879885755434506">"ನಿರಾಕರಿಸು"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ಐಟಂಗಳು</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ಐಟಂಗಳು</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ಅಳಿಸುವುದೇ?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ಫೋಲ್ಡರ್ ಮತ್ತು ಅದರ ವಿಷಯಗಳನ್ನು ಅಳಿಸುವುದೇ?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಅಳಿಸುವುದೇ?</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೈಲ್ಗಳನ್ನು ಅಳಿಸುವುದೇ?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೋಲ್ಡರ್ಗಳು ಮತ್ತು ಅವುಗಳ ವಿಷಯಗಳನ್ನು ಅಳಿಸುವುದೇ?</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಫೋಲ್ಡರ್ಗಳು ಮತ್ತು ಅವುಗಳ ವಿಷಯಗಳನ್ನು ಅಳಿಸುವುದೇ?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಐಟಂಗಳನ್ನು ಅಳಿಸುವುದೇ?</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ಐಟಂಗಳನ್ನು ಅಳಿಸುವುದೇ?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml deleted file mode 100644 index c990d9ffaa2b..000000000000 --- a/packages/DocumentsUI/res/values-ko/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"파일"</string> - <string name="downloads_label" msgid="959113951084633612">"다운로드"</string> - <string name="title_open" msgid="4353228937663917801">"열기:"</string> - <string name="title_save" msgid="2433679664882857999">"저장 위치:"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"새 폴더"</string> - <string name="menu_grid" msgid="6878021334497835259">"바둑판식 보기"</string> - <string name="menu_list" msgid="7279285939892417279">"목록 보기"</string> - <string name="menu_sort" msgid="7677740407158414452">"정렬 기준"</string> - <string name="menu_search" msgid="3816712084502856974">"검색"</string> - <string name="menu_settings" msgid="8239065133341597825">"저장소 설정"</string> - <string name="menu_open" msgid="432922957274920903">"열기"</string> - <string name="menu_save" msgid="2394743337684426338">"저장"</string> - <string name="menu_share" msgid="3075149983979628146">"공유"</string> - <string name="menu_delete" msgid="8138799623850614177">"삭제"</string> - <string name="menu_select_all" msgid="8323579667348729928">"모두 선택"</string> - <string name="menu_copy" msgid="3612326052677229148">"복사…"</string> - <string name="menu_move" msgid="1828090633118079817">"이동…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"새 창"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"잘라내기"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"복사"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"붙여넣기"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"내부 저장소 표시"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"내부 저장소 숨기기"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"파일 크기 표시"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"파일 크기 숨기기"</string> - <string name="button_select" msgid="527196987259139214">"선택"</string> - <string name="button_copy" msgid="8706475544635021302">"복사"</string> - <string name="button_move" msgid="2202666023104202232">"이동"</string> - <string name="button_dismiss" msgid="3714065566893946085">"닫기"</string> - <string name="button_retry" msgid="4392027584153752797">"다시 시도"</string> - <string name="sort_name" msgid="9183560467917256779">"이름순"</string> - <string name="sort_date" msgid="586080032956151448">"수정된 날짜순"</string> - <string name="sort_size" msgid="3350681319735474741">"크기순"</string> - <string name="drawer_open" msgid="4545466532430226949">"루트 표시"</string> - <string name="drawer_close" msgid="7602734368552123318">"루트 숨기기"</string> - <string name="save_error" msgid="6167009778003223664">"문서 저장 실패"</string> - <string name="create_error" msgid="3735649141335444215">"폴더를 만들지 못함"</string> - <string name="query_error" msgid="5999895349602476581">"현재 콘텐츠를 로드할 수 없습니다."</string> - <string name="root_recent" msgid="4470053704320518133">"최근"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> 남음"</string> - <string name="root_type_service" msgid="2178854894416775409">"저장용량 서비스"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"바로가기"</string> - <string name="root_type_device" msgid="7121342474653483538">"기기"</string> - <string name="root_type_apps" msgid="8838065367985945189">"앱 더보기"</string> - <string name="empty" msgid="7858882803708117596">"항목 없음"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s에 일치하는 항목이 없습니다."</string> - <string name="toast_no_application" msgid="4632640357724698144">"파일을 열 수 없습니다."</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"일부 문서를 삭제할 수 없음"</string> - <string name="share_via" msgid="8966594246261344259">"공유 방법"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"파일 복사 중"</string> - <string name="move_notification_title" msgid="6193835179777284805">"파일 이동"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"파일 삭제"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> 남음"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개를 복사합니다.</item> - <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개를 복사합니다.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개 이동</item> - <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개 이동</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개 삭제</item> - <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개 삭제</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"실행취소"</string> - <string name="copy_preparing" msgid="3896202461003039386">"사본 준비 중…"</string> - <string name="move_preparing" msgid="2772219441375531410">"이동 준비 중…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"삭제 준비 중..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개를 복사할 수 없습니다.</item> - <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개를 복사할 수 없습니다.</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개를 이동할 수 없습니다.</item> - <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개를 이동할 수 없습니다.</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개를 삭제할 수 없습니다.</item> - <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개를 삭제할 수 없습니다.</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"세부정보를 보려면 탭하세요."</string> - <string name="close" msgid="3043722427445528732">"닫기"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"다음 파일이 복사되지 않았습니다. <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"다음 파일이 이동되지 않았습니다. <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"다음 파일이 삭제되지 않았습니다. <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"파일이 다음과 같이 다른 형식으로 변환되었습니다. <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개를 클립보드에 복사함</item> - <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개를 클립보드에 복사함</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"선택한 파일을 이 위치에 붙여넣을 수 없습니다."</string> - <string name="menu_rename" msgid="7678802479104285353">"이름 바꾸기"</string> - <string name="rename_error" msgid="4203041674883412606">"문서 이름을 변경하지 못했습니다."</string> - <string name="menu_eject_root" msgid="2768224615494227325">"꺼내기"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"일부 파일이 변환되었습니다."</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g>이(가) <xliff:g id="STORAGE"><i>^3</i></xliff:g>에서 <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> 디렉토리에 액세스하도록 허용하시겠습니까?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g>이(가) <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> 디렉토리에 액세스하도록 허용하시겠습니까?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g>에서 사진, 동영상 등 <xliff:g id="STORAGE"><i>^2</i></xliff:g>의 내 데이터에 액세스하도록 허용하시겠습니까?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"다시 묻지 않음"</string> - <string name="allow" msgid="7225948811296386551">"허용"</string> - <string name="deny" msgid="2081879885755434506">"거부"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>개 선택됨</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g>개 선택됨</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other">항목 <xliff:g id="COUNT_1">%1$d</xliff:g>개</item> - <item quantity="one">항목 <xliff:g id="COUNT_0">%1$d</xliff:g>개</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"<xliff:g id="NAME">%1$s</xliff:g>을(를) 삭제하시겠습니까?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\'<xliff:g id="NAME">%1$s</xliff:g>\' 폴더와 폴더에 포함된 콘텐츠를 삭제하시겠습니까?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">파일 <xliff:g id="COUNT_1">%1$d</xliff:g>개를 삭제하시겠습니까?</item> - <item quantity="one">파일 <xliff:g id="COUNT_0">%1$d</xliff:g>개를 삭제하시겠습니까?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">폴더 <xliff:g id="COUNT_1">%1$d</xliff:g>개와 폴더에 포함된 콘텐츠를 삭제하시겠습니까?</item> - <item quantity="one">폴더 <xliff:g id="COUNT_0">%1$d</xliff:g>개와 폴더에 포함된 콘텐츠를 삭제하시겠습니까?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">항목 <xliff:g id="COUNT_1">%1$d</xliff:g>개를 삭제하시겠습니까?</item> - <item quantity="one">항목 <xliff:g id="COUNT_0">%1$d</xliff:g>개를 삭제하시겠습니까?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ky-rKG/strings.xml b/packages/DocumentsUI/res/values-ky-rKG/strings.xml deleted file mode 100644 index 5c1d71a30412..000000000000 --- a/packages/DocumentsUI/res/values-ky-rKG/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Файлдар"</string> - <string name="downloads_label" msgid="959113951084633612">"Жүктөлүп алынгандар"</string> - <string name="title_open" msgid="4353228937663917801">"Кийинкиден ачуу:"</string> - <string name="title_save" msgid="2433679664882857999">"Кийинкиге сактоо:"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Жаңы куржун"</string> - <string name="menu_grid" msgid="6878021334497835259">"Тор көрүнүшү"</string> - <string name="menu_list" msgid="7279285939892417279">"Тизмек көрүнүшү"</string> - <string name="menu_sort" msgid="7677740407158414452">"Ылгоо"</string> - <string name="menu_search" msgid="3816712084502856974">"Издөө"</string> - <string name="menu_settings" msgid="8239065133341597825">"Сактагычтын жөндөөлөрү"</string> - <string name="menu_open" msgid="432922957274920903">"Ачуу"</string> - <string name="menu_save" msgid="2394743337684426338">"Сактоо"</string> - <string name="menu_share" msgid="3075149983979628146">"Бөлүшүү"</string> - <string name="menu_delete" msgid="8138799623850614177">"Жок кылуу"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Бардыгын тандоо"</string> - <string name="menu_copy" msgid="3612326052677229148">"Төмөнкүгө көчүрүү…"</string> - <string name="menu_move" msgid="1828090633118079817">"Төмөнкүгө жылдыруу..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Жаңы терезе"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Кесүү"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Көчүрүү"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Чаптоо"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Ички сактагычты көрсөтүү"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ички эстутумду жашыруу"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Файл өлчөмүн көрсөтүү"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Файл өлчөмүн жашыруу"</string> - <string name="button_select" msgid="527196987259139214">"Тандоо"</string> - <string name="button_copy" msgid="8706475544635021302">"Көчүрүү"</string> - <string name="button_move" msgid="2202666023104202232">"Жылдыруу"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Этибарга албоо"</string> - <string name="button_retry" msgid="4392027584153752797">"Дагы аракет кылыңыз"</string> - <string name="sort_name" msgid="9183560467917256779">"Аты боюнча"</string> - <string name="sort_date" msgid="586080032956151448">"Өзгөртүлгөн күнү боюнча"</string> - <string name="sort_size" msgid="3350681319735474741">"Өлчөмү боюнча"</string> - <string name="drawer_open" msgid="4545466532430226949">"Папкаларды көрсөтүү"</string> - <string name="drawer_close" msgid="7602734368552123318">"Папкаларды жашыруу"</string> - <string name="save_error" msgid="6167009778003223664">"Документтерди сактоо кыйрады"</string> - <string name="create_error" msgid="3735649141335444215">"Папка түзүү кыйрады"</string> - <string name="query_error" msgid="5999895349602476581">"Учурда мазмун жүктөлбөй жатат"</string> - <string name="root_recent" msgid="4470053704320518133">"Акыркы"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> бош"</string> - <string name="root_type_service" msgid="2178854894416775409">"Сактагыч кызматтар"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Тез чакырмалар"</string> - <string name="root_type_device" msgid="7121342474653483538">"Түзмөктөр"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Көбүрөөк колдонмолор"</string> - <string name="empty" msgid="7858882803708117596">"Эч нерсе жок"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s ичинде дал келүүлөр жок"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Файл ачылбай жатат"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Кээ бир документтерди өчүрүү кыйрады"</string> - <string name="share_via" msgid="8966594246261344259">"Кийинки аркылуу бөлүшүү:"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Файлдар көчүрүлүүдө"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Файлдар жылдырылууда…"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Файлдар жок кылынууда"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> калды"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл көчүрүлүүдө.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл көчүрүлүүдө.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файл жылдырылууда.</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файл жылдырылууда.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл жок кылынууда.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл жок кылынууда.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Артка кайтаруу"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Көчүрүүгө даярдалууда…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Жылдырууга даярдалууда…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Жок кылууга даярдалууда…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл көчүрүлбөй койду</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл көчүрүлбөй койду</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл жылдырылбай койду</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл жылдырылбай койду</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл жок кылынбай койду</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл жок кылынбай койду</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Чоо-жайын көрүү үчүн таптаңыз"</string> - <string name="close" msgid="3043722427445528732">"Жабуу"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Төмөнкү файлдар көчүрүлгөн жок: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Төмөнкү файлдар жылдырылган жок: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Төмөнкү файлдар өчүрүлгөн жок: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Бул файлдар башка форматка айландырылды: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл буферге көчүрүлдү.</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файл буферге көчүрүлдү.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Тандалган файлдарды бул жерге чаптоого мүмкүн эмес."</string> - <string name="menu_rename" msgid="7678802479104285353">"Аталышын өзгөртүү"</string> - <string name="rename_error" msgid="4203041674883412606">"Документтин аталышы өзгөртүлбөй калды"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Чыгаруу"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Айрым файлдардын форматы өзгөртүлдү"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> колдонмосуна <xliff:g id="STORAGE"><i>^3</i></xliff:g> түзмөгүндөгү <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> папканы пайдалануу мүмкүнчүлүгү берилсинби?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> колдонмосуна <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> каталогун пайдалануу мүмкүнчүлүгү берилсинби?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> колдонмосуна <xliff:g id="STORAGE"><i>^2</i></xliff:g> түзмөгүндөгү дайындарыңыз, сүрөттөрүңүз жана видеолоруңузду пайдалануу мүмкүнчүлүгү берилсинби?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Экинчи суралбасын"</string> - <string name="allow" msgid="7225948811296386551">"Уруксат берүү"</string> - <string name="deny" msgid="2081879885755434506">"Жок"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> тандалды</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> тандалды</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> нерсе</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> нерсе</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" жок кылынсынбы?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" куржуну мазмуну менен жок кылынсынбы?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файл жок кылынсынбы?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файл жок кылынсынбы?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> куржун мазмуну менен жок кылынсынбы?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> куржун мазмуну менен жок кылынсынбы?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> нерсе жок кылынсынбы?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> нерсе жок кылынсынбы?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml deleted file mode 100644 index cb1bad34f89b..000000000000 --- a/packages/DocumentsUI/res/values-lo-rLA/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ໄຟລ໌"</string> - <string name="downloads_label" msgid="959113951084633612">"ການດາວໂຫລດ"</string> - <string name="title_open" msgid="4353228937663917801">"ເປີດຈາກ"</string> - <string name="title_save" msgid="2433679664882857999">"ບັນທຶກໄປທີ່"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"ໂຟລເດີໃໝ່"</string> - <string name="menu_grid" msgid="6878021334497835259">"ມຸມມອງແບບຊ່ອງ"</string> - <string name="menu_list" msgid="7279285939892417279">"ມຸມມອງແບບລາຍຊື່"</string> - <string name="menu_sort" msgid="7677740407158414452">"ຮຽງລຳດັບຕາມ"</string> - <string name="menu_search" msgid="3816712084502856974">"ຊອກຫາ"</string> - <string name="menu_settings" msgid="8239065133341597825">"ການຕັ້ງຄ່າບ່ອນເກັບຂໍ້ມູນ"</string> - <string name="menu_open" msgid="432922957274920903">"ເປີດ"</string> - <string name="menu_save" msgid="2394743337684426338">"ບັນທຶກ"</string> - <string name="menu_share" msgid="3075149983979628146">"ແບ່ງປັນ"</string> - <string name="menu_delete" msgid="8138799623850614177">"ລຶບ"</string> - <string name="menu_select_all" msgid="8323579667348729928">"ເລືອກທັງຫມົດ"</string> - <string name="menu_copy" msgid="3612326052677229148">"ສຳເນົາໄປໃສ່..."</string> - <string name="menu_move" msgid="1828090633118079817">"ຍ້າຍໄປໃສ່..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"ໜ້າຈໍໃໝ່"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"ຕັດ"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"ສຳເນົາ"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"ວາງໃສ່"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"ສະແດງໂຕເກັບຂໍ້ມູນພາຍໃນ"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"ເຊື່ອງໂຕເກັບຂໍ້ມູນພາຍໃນ"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ສະແດງຂະໜາດໄຟລ໌"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ເຊື່ອງຂະຫນາດໄຟລ໌"</string> - <string name="button_select" msgid="527196987259139214">"ເລືອກ"</string> - <string name="button_copy" msgid="8706475544635021302">"ສຳເນົາ"</string> - <string name="button_move" msgid="2202666023104202232">"ຍ້າຍ"</string> - <string name="button_dismiss" msgid="3714065566893946085">"ປິດໄວ້"</string> - <string name="button_retry" msgid="4392027584153752797">"ລອງໃໝ່ອີກ"</string> - <string name="sort_name" msgid="9183560467917256779">"ຕາມຊື່"</string> - <string name="sort_date" msgid="586080032956151448">"ຕາມວັນທີທີ່ແກ້ໄຂ"</string> - <string name="sort_size" msgid="3350681319735474741">"ຕາມຂະໜາດ"</string> - <string name="drawer_open" msgid="4545466532430226949">"ສະແດງ roots"</string> - <string name="drawer_close" msgid="7602734368552123318">"ເຊື່ອງ roots"</string> - <string name="save_error" msgid="6167009778003223664">"ການບັນທຶກເອກະສານລົ້ມເຫລວ"</string> - <string name="create_error" msgid="3735649141335444215">"ການສ້າງໂຟນເດີລົ້ມເຫຼວ"</string> - <string name="query_error" msgid="5999895349602476581">"ບໍ່ສາມາດໂຫຼດເນື້ອຫາໄດ້ໃນຂະນະນີ້"</string> - <string name="root_recent" msgid="4470053704320518133">"ຫຼ້າສຸດ"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"ຟຣີ <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"ບໍລິການບ່ອນຈັດເກັບຂໍ້ມູນ"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"ທາງລັດ"</string> - <string name="root_type_device" msgid="7121342474653483538">"ອຸປະກອນ"</string> - <string name="root_type_apps" msgid="8838065367985945189">"ແອັບຯອື່ນໆ"</string> - <string name="empty" msgid="7858882803708117596">"ບໍ່ມີລາຍການ"</string> - <string name="no_results" msgid="6622510343880730446">"ບໍ່ພົບສິ່ງກົງກັນໃນ %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ບໍ່ສາມາດເປີດໄຟລ໌ໄດ້"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"ບໍ່ສາມາດລຶບບາງເອກະສານໄດ້"</string> - <string name="share_via" msgid="8966594246261344259">"ແບ່ງປັນຜ່ານ"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ກຳລັງອັດສຳເນົາໄຟລ໌"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ກຳລັງຍ້າຍໄຟລ໌"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ກຳລັງລຶບໄຟລ໌"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ຍັງເຫຼືອຢູ່"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">ກຳລັງອັດສຳເນົາ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌.</item> - <item quantity="one">ກຳລັງອັດສຳເນົາ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">ກຳລັງຍ້າຍ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌.</item> - <item quantity="one">ກຳລັງຍ້າຍ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">ກຳລັງລຶບ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌.</item> - <item quantity="one">ກຳລັງລຶບ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"ບໍ່ເຮັດ"</string> - <string name="copy_preparing" msgid="3896202461003039386">"ກຳລັງກຽມອັດສຳເນົາ…"</string> - <string name="move_preparing" msgid="2772219441375531410">"ກຳລັງກະກຽມຍ້າຍ…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"ກຳລັງກະກຽມລຶບ…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">ບໍ່ສາມາດສຳເນົາ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> - <item quantity="one">ບໍ່ສາມາດສຳເນົາ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">ບໍ່ສາມາດຍ້າຍ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> - <item quantity="one">ບໍ່ສາມາດຍ້າຍ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">ບໍ່ສາມາດລຶບ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> - <item quantity="one">ບໍ່ສາມາດລຶບ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌ໄດ້</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"ແຕະເພື່ອເບິ່ງລາຍລະອຽດ"</string> - <string name="close" msgid="3043722427445528732">"ປິດ"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"ໄຟລ໌ເຫຼົ່ານີ້ບໍ່ໄດ້ຖືກສຳເນົາ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"ໄຟລ໌ເຫຼົ່ານີ້ບໍ່ໄດ້ຖືກຍ້າຍ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"ໄຟລ໌ເຫຼົ່ານີ້ບໍ່ໄດ້ຖືກລຶບເທື່ອ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ໄຟລ໌ເຫຼົ່ານີ້ໄດ້ຖືກປ່ຽນເປັນຮູບແບບອື່ນແລ້ວ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">ອັດສຳເນົາ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌ໃສ່ຄລິບບອດແລ້ວ.</item> - <item quantity="one">ອັດສຳເນົາ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌ໃສ່ຄລິບບອດແລ້ວ.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"ບໍ່ສາມາດແປະໄຟລ໌ເລືອກໄວ້ຢູ່ໃນທີ່ຕັ້ງນີ້ໄດ້."</string> - <string name="menu_rename" msgid="7678802479104285353">"ປ່ຽນຊື່"</string> - <string name="rename_error" msgid="4203041674883412606">"ປ່ຽນຊື່ເອກະສານບໍ່ສຳເລັດ"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"ຖອດອອກ"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ປ່ຽນແປງບາງໄຟລ໌ແລ້ວ"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"ອະນຸຍາດສິດເຂົ້າເຖິງໃຫ້ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ເພື່ອເຂົ້າໄດເຣກທໍຣີ <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ຢູ່ <xliff:g id="STORAGE"><i>^3</i></xliff:g> ບໍ?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"ອະນຸມັດ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ໃຫ້ເຂົ້າຫາໄດເຣັກທໍຣີ <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ບໍ?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"ອະນຸມັດໃຫ້ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ເຂົ້າເຖິງຂໍ້ມູນຂອງທ່ານ ເຊິ່ງຮວມເຖິງຮູບພາບ ແລະ ວິດີໂອໃນ <xliff:g id="STORAGE"><i>^2</i></xliff:g> ໄດ້ບໍ?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"ບໍ່ຕ້ອງຖາມຄືນ"</string> - <string name="allow" msgid="7225948811296386551">"ອະນຸຍາດ"</string> - <string name="deny" msgid="2081879885755434506">"ປະຕິເສດ"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">ເລືອກ <xliff:g id="COUNT_1">%1$d</xliff:g> ແລ້ວ</item> - <item quantity="one">ເລືອກ <xliff:g id="COUNT_0">%1$d</xliff:g> ແລ້ວ</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ລາຍການ</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ລາຍການ</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"ລຶບ \"<xliff:g id="NAME">%1$s</xliff:g>\" ອອກບໍ?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"ລຶບໂຟນເດີ \"<xliff:g id="NAME">%1$s</xliff:g>\" ແລະ ເນື້ອຫາທັງໝົດຂອງມັນອອກບໍ?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">ລຶບ <xliff:g id="COUNT_1">%1$d</xliff:g> ໄຟລ໌ອອກບໍ?</item> - <item quantity="one">ລຶບ <xliff:g id="COUNT_0">%1$d</xliff:g> ໄຟລ໌ອອກບໍ?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">ລຶບ <xliff:g id="COUNT_1">%1$d</xliff:g> ໂຟນເດີ ແລະ ເນື້ອຫາຂອງມັນອອກບໍ?</item> - <item quantity="one">ລຶບ <xliff:g id="COUNT_0">%1$d</xliff:g> ໂຟນເດີ ແລະ ເນື້ອຫາຂອງມັນອອກບໍ?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">ລຶບ <xliff:g id="COUNT_1">%1$d</xliff:g> ລາຍການອອກບໍ?</item> - <item quantity="one">ລຶບ <xliff:g id="COUNT_0">%1$d</xliff:g> ລາຍການອອກບໍ?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml deleted file mode 100644 index 5e5dbfa48e95..000000000000 --- a/packages/DocumentsUI/res/values-lt/strings.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Failai"</string> - <string name="downloads_label" msgid="959113951084633612">"Atsisiuntimai"</string> - <string name="title_open" msgid="4353228937663917801">"Atidaryti iš"</string> - <string name="title_save" msgid="2433679664882857999">"Išsaugoti į"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Naujas aplankas"</string> - <string name="menu_grid" msgid="6878021334497835259">"Tinklelio rodinys"</string> - <string name="menu_list" msgid="7279285939892417279">"Sąrašo rodinys"</string> - <string name="menu_sort" msgid="7677740407158414452">"Rūšiuoti pagal"</string> - <string name="menu_search" msgid="3816712084502856974">"Ieškoti"</string> - <string name="menu_settings" msgid="8239065133341597825">"Saugyklos nustatymai"</string> - <string name="menu_open" msgid="432922957274920903">"Atidaryti"</string> - <string name="menu_save" msgid="2394743337684426338">"Išsaugoti"</string> - <string name="menu_share" msgid="3075149983979628146">"Bendrinti"</string> - <string name="menu_delete" msgid="8138799623850614177">"Ištrinti"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Pasirinkti viską"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopijuoti į..."</string> - <string name="menu_move" msgid="1828090633118079817">"Perkelti į…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Naujas langas"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Iškirpti"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopijuoti"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Įklijuoti"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Rodyti vidinę atmintį"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Slėpti vidinę atmintį"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Rodyti failo dydį"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Slėpti failo dydį"</string> - <string name="button_select" msgid="527196987259139214">"Pasirinkti"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopijuoti"</string> - <string name="button_move" msgid="2202666023104202232">"Perkelti"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Atsisakyti"</string> - <string name="button_retry" msgid="4392027584153752797">"Bandyti dar kartą"</string> - <string name="sort_name" msgid="9183560467917256779">"Pagal pavadinimą"</string> - <string name="sort_date" msgid="586080032956151448">"Pagal keitimo datą"</string> - <string name="sort_size" msgid="3350681319735474741">"Pagal dydį"</string> - <string name="drawer_open" msgid="4545466532430226949">"Rodyti šaknis"</string> - <string name="drawer_close" msgid="7602734368552123318">"Slėpti šaknis"</string> - <string name="save_error" msgid="6167009778003223664">"Nepavyko išsaugoti dokumento"</string> - <string name="create_error" msgid="3735649141335444215">"Nepavyko sukurti aplanko"</string> - <string name="query_error" msgid="5999895349602476581">"Šiuo metu nepavyksta įkelti turinio"</string> - <string name="root_recent" msgid="4470053704320518133">"Naujausi"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Laisvos vietos: <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Saugyklos paslaugos"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Spartieji klavišai"</string> - <string name="root_type_device" msgid="7121342474653483538">"Įrenginiai"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Daugiau programų"</string> - <string name="empty" msgid="7858882803708117596">"Nėra elementų"</string> - <string name="no_results" msgid="6622510343880730446">"Nėra jokių atitikčių pagal %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Nepavyksta atidaryti failo"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Nepavyko ištrinti kai kurių dokumentų"</string> - <string name="share_via" msgid="8966594246261344259">"Bendrinti naudojant"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopijuojami failai"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Perkeliami failai"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Failų ištrynimas"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Liko: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Kopijuojamas <xliff:g id="COUNT_1">%1$d</xliff:g> failas.</item> - <item quantity="few">Kopijuojami <xliff:g id="COUNT_1">%1$d</xliff:g> failai.</item> - <item quantity="many">Kopijuojama <xliff:g id="COUNT_1">%1$d</xliff:g> failo.</item> - <item quantity="other">Kopijuojama <xliff:g id="COUNT_1">%1$d</xliff:g> failų.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Perkeliamas <xliff:g id="COUNT_1">%1$d</xliff:g> failas.</item> - <item quantity="few">Perkeliami <xliff:g id="COUNT_1">%1$d</xliff:g> failai.</item> - <item quantity="many">Perkeliama <xliff:g id="COUNT_1">%1$d</xliff:g> failo.</item> - <item quantity="other">Perkeliama <xliff:g id="COUNT_1">%1$d</xliff:g> failų.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Trinamas <xliff:g id="COUNT_1">%1$d</xliff:g> failas.</item> - <item quantity="few">Trinami <xliff:g id="COUNT_1">%1$d</xliff:g> failai.</item> - <item quantity="many">Trinama <xliff:g id="COUNT_1">%1$d</xliff:g> failo.</item> - <item quantity="other">Trinama <xliff:g id="COUNT_1">%1$d</xliff:g> failų.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Anuliuoti"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Ruošiamasi kopijuoti…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Ruošiamasi perkelti…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Ruošiama ištrinti…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Nepavyko nukopijuoti <xliff:g id="COUNT_1">%1$d</xliff:g> failo</item> - <item quantity="few">Nepavyko nukopijuoti <xliff:g id="COUNT_1">%1$d</xliff:g> failų</item> - <item quantity="many">Nepavyko nukopijuoti <xliff:g id="COUNT_1">%1$d</xliff:g> failo</item> - <item quantity="other">Nepavyko nukopijuoti <xliff:g id="COUNT_1">%1$d</xliff:g> failų</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Nepavyko perkelti <xliff:g id="COUNT_1">%1$d</xliff:g> failo</item> - <item quantity="few">Nepavyko perkelti <xliff:g id="COUNT_1">%1$d</xliff:g> failų</item> - <item quantity="many">Nepavyko perkelti <xliff:g id="COUNT_1">%1$d</xliff:g> failo</item> - <item quantity="other">Nepavyko perkelti <xliff:g id="COUNT_1">%1$d</xliff:g> failų</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Nepavyko ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failo</item> - <item quantity="few">Nepavyko ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failų</item> - <item quantity="many">Nepavyko ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failo</item> - <item quantity="other">Nepavyko ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failų</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Palieskite, kad peržiūrėtumėte informaciją"</string> - <string name="close" msgid="3043722427445528732">"Uždaryti"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Šie failai nebuvo nukopijuoti: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Šie failai nebuvo perkelti: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Šie failai nebuvo ištrinti: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Šie failai konvertuoti į kitą formatą: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">Nukopijuotas <xliff:g id="COUNT_1">%1$d</xliff:g> failas į iškarpinę.</item> - <item quantity="few">Nukopijuoti <xliff:g id="COUNT_1">%1$d</xliff:g> failai į iškarpinę.</item> - <item quantity="many">Nukopijuota <xliff:g id="COUNT_1">%1$d</xliff:g> failo į iškarpinę.</item> - <item quantity="other">Nukopijuota <xliff:g id="COUNT_1">%1$d</xliff:g> failų į iškarpinę.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Nepavyko įklijuoti pasirinktų failų šioje vietoje."</string> - <string name="menu_rename" msgid="7678802479104285353">"Pervardyti"</string> - <string name="rename_error" msgid="4203041674883412606">"Nepavyko pervardyti dokumento"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Pašalinti"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Kai kurie failai buvo konvertuoti"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Suteikti „<xliff:g id="APPNAME"><b>^1</b></xliff:g>“ prieigą prie katalogo „<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>“ <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Suteikti „<xliff:g id="APPNAME"><b>^1</b></xliff:g>“ prieigą prie katalogo „<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>“?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Suteikti programai „<xliff:g id="APPNAME"><b>^1</b></xliff:g>“ prieigą prie duomenų, įskaitant nuotraukas ir vaizdo įrašus, <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Daugiau neklausti"</string> - <string name="allow" msgid="7225948811296386551">"Leisti"</string> - <string name="deny" msgid="2081879885755434506">"Atmesti"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one">Pasirinktas <xliff:g id="COUNT_1">%1$d</xliff:g> elementas</item> - <item quantity="few">Pasirinkti <xliff:g id="COUNT_1">%1$d</xliff:g> elementai</item> - <item quantity="many">Pasirinkta <xliff:g id="COUNT_1">%1$d</xliff:g> elemento</item> - <item quantity="other">Pasirinkta <xliff:g id="COUNT_1">%1$d</xliff:g> elementų</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> elementas</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> elementai</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> elemento</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementų</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Ištrinti „<xliff:g id="NAME">%1$s</xliff:g>“?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Ištrinti aplanką „<xliff:g id="NAME">%1$s</xliff:g>“ ir jo turinį?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failą?</item> - <item quantity="few">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failus?</item> - <item quantity="many">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failo?</item> - <item quantity="other">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> failų?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> aplanką ir jų turinį?</item> - <item quantity="few">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> aplankus ir jų turinį?</item> - <item quantity="many">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> aplanko ir jų turinį?</item> - <item quantity="other">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> aplankų ir jų turinį?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> elementą?</item> - <item quantity="few">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> elementus?</item> - <item quantity="many">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> elemento?</item> - <item quantity="other">Ištrinti <xliff:g id="COUNT_1">%1$d</xliff:g> elementų?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml deleted file mode 100644 index 56a9debb7d0f..000000000000 --- a/packages/DocumentsUI/res/values-lv/strings.xml +++ /dev/null @@ -1,156 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Faili"</string> - <string name="downloads_label" msgid="959113951084633612">"Lejupielādes"</string> - <string name="title_open" msgid="4353228937663917801">"Atvēršana no:"</string> - <string name="title_save" msgid="2433679664882857999">"Saglabāšana:"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Jauna mape"</string> - <string name="menu_grid" msgid="6878021334497835259">"Režģis"</string> - <string name="menu_list" msgid="7279285939892417279">"Saraksts"</string> - <string name="menu_sort" msgid="7677740407158414452">"Kārtot pēc"</string> - <string name="menu_search" msgid="3816712084502856974">"Meklēt"</string> - <string name="menu_settings" msgid="8239065133341597825">"Atmiņas iestatījumi"</string> - <string name="menu_open" msgid="432922957274920903">"Atvērt"</string> - <string name="menu_save" msgid="2394743337684426338">"Saglabāt"</string> - <string name="menu_share" msgid="3075149983979628146">"Kopīgot"</string> - <string name="menu_delete" msgid="8138799623850614177">"Dzēst"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Atlasīt visus"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopēt…"</string> - <string name="menu_move" msgid="1828090633118079817">"Pārvietot uz…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Jauns logs"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Izgriezt"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopēt"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Ielīmēt"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Rādīt iekšējo atmiņu"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Paslēpt iekšējo atmiņu"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Rādīt failu lielumu"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Paslēpt failu lielumu"</string> - <string name="button_select" msgid="527196987259139214">"Atlasīt"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopēt"</string> - <string name="button_move" msgid="2202666023104202232">"Pārvietot"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Noraidīt"</string> - <string name="button_retry" msgid="4392027584153752797">"Mēģināt vēlreiz"</string> - <string name="sort_name" msgid="9183560467917256779">"Pēc nosaukuma"</string> - <string name="sort_date" msgid="586080032956151448">"Pēc pārveidošanas datuma"</string> - <string name="sort_size" msgid="3350681319735474741">"Pēc lieluma"</string> - <string name="drawer_open" msgid="4545466532430226949">"Rādīt saknes"</string> - <string name="drawer_close" msgid="7602734368552123318">"Slēpt saknes"</string> - <string name="save_error" msgid="6167009778003223664">"Neizdevās saglabāt dokumentu."</string> - <string name="create_error" msgid="3735649141335444215">"Neizdevās izveidot mapi."</string> - <string name="query_error" msgid="5999895349602476581">"Pašlaik nevar ielādēt saturu."</string> - <string name="root_recent" msgid="4470053704320518133">"Pēdējie"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Brīva vieta: <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Glabāšanas pakalpojumi"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Saīsnes"</string> - <string name="root_type_device" msgid="7121342474653483538">"Ierīces"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Vairāk lietotņu"</string> - <string name="empty" msgid="7858882803708117596">"Nav vienumu"</string> - <string name="no_results" msgid="6622510343880730446">"Failā %1$s nav atbilstību"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Nevar atvērt failu."</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Nevar dzēst dažus dokumentus."</string> - <string name="share_via" msgid="8966594246261344259">"Kopīgot, izmantojot"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Notiek failu kopēšana"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Failu pārvietošana"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Notiek failu dzēšana"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Atlikušais laiks: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="zero">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu kopēšana.</item> - <item quantity="one">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> faila kopēšana.</item> - <item quantity="other">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu kopēšana.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="zero">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu pārvietošana.</item> - <item quantity="one">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> faila pārvietošana.</item> - <item quantity="other">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu pārvietošana.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="zero">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu dzēšana.</item> - <item quantity="one">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> faila dzēšana.</item> - <item quantity="other">Notiek <xliff:g id="COUNT_1">%1$d</xliff:g> failu dzēšana.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Atsaukt"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Gatavošanās kopēšanai…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Sagatavošana pārvietošanai…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Notiek gatavošanās dzēšanai…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> no <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="zero">Nevarēja nokopēt <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> - <item quantity="one">Nevarēja nokopēt <xliff:g id="COUNT_1">%1$d</xliff:g> failu</item> - <item quantity="other">Nevarēja nokopēt <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="zero">Nevarēja pārvietot <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> - <item quantity="one">Nevarēja pārvietot <xliff:g id="COUNT_1">%1$d</xliff:g> failu</item> - <item quantity="other">Nevarēja pārvietot <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="zero">Nevarēja izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> - <item quantity="one">Nevarēja izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failu</item> - <item quantity="other">Nevarēja izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failus</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Pieskarieties, lai skatītu informāciju"</string> - <string name="close" msgid="3043722427445528732">"Aizvērt"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Netika nokopēti šādi faili: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Netika pārvietoti šādi faili: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Netika izdzēsti šādi faili: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Šie faili tika pārveidoti citā formātā: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> faili tika kopēti starpliktuvē.</item> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> fails tika kopēts starpliktuvē.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> faili tika kopēti starpliktuvē.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Atlasītos failus šeit nevar ielīmēt."</string> - <string name="menu_rename" msgid="7678802479104285353">"Pārdēvēt"</string> - <string name="rename_error" msgid="4203041674883412606">"Neizdevās pārdēvēt dokumentu"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Noņemt"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Daži faili tika pārveidoti."</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Vai atļaut lietotnei <xliff:g id="APPNAME"><b>^1</b></xliff:g> piekļūt direktorijam <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> šajā krātuvē: <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Vai piešķirt lietotnei <xliff:g id="APPNAME"><b>^1</b></xliff:g> piekļuvi direktorijam <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Vai atļaut lietotnei <xliff:g id="APPNAME"><b>^1</b></xliff:g> piekļūt jūsu datiem, tostarp fotoattēliem un videoklipiem, šajā krātuvē: <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Turpmāk vairs nejautāt"</string> - <string name="allow" msgid="7225948811296386551">"Atļaut"</string> - <string name="deny" msgid="2081879885755434506">"Noraidīt"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīti</item> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīts</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> atlasīti</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="zero"><xliff:g id="COUNT_1">%1$d</xliff:g> vienumu</item> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> vienums</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> vienumi</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Vai izdzēst failu “<xliff:g id="NAME">%1$s</xliff:g>”?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Vai izdzēst mapi “<xliff:g id="NAME">%1$s</xliff:g>” un tās saturu?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="zero">Vai izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failus?</item> - <item quantity="one">Vai izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failu?</item> - <item quantity="other">Vai izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> failus?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="zero">Vai izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> mapes un to saturu?</item> - <item quantity="one">Vai izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> mapi un to saturu?</item> - <item quantity="other">Vai izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> mapes un to saturu?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="zero">Vai izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> vienumus?</item> - <item quantity="one">Vai izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> vienumu?</item> - <item quantity="other">Vai izdzēst <xliff:g id="COUNT_1">%1$d</xliff:g> vienumus?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-mk-rMK/strings.xml b/packages/DocumentsUI/res/values-mk-rMK/strings.xml deleted file mode 100644 index 58bfc995f03a..000000000000 --- a/packages/DocumentsUI/res/values-mk-rMK/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Датотеки"</string> - <string name="downloads_label" msgid="959113951084633612">"Преземања"</string> - <string name="title_open" msgid="4353228937663917801">"Отвори од"</string> - <string name="title_save" msgid="2433679664882857999">"Зачувај во"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Нова папка"</string> - <string name="menu_grid" msgid="6878021334497835259">"Приказ на мрежа"</string> - <string name="menu_list" msgid="7279285939892417279">"Приказ на список"</string> - <string name="menu_sort" msgid="7677740407158414452">"Подреди по"</string> - <string name="menu_search" msgid="3816712084502856974">"Пребарај"</string> - <string name="menu_settings" msgid="8239065133341597825">"Поставки на меморија"</string> - <string name="menu_open" msgid="432922957274920903">"Отвори"</string> - <string name="menu_save" msgid="2394743337684426338">"Зачувај"</string> - <string name="menu_share" msgid="3075149983979628146">"Сподели"</string> - <string name="menu_delete" msgid="8138799623850614177">"Избриши"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Избери ги сите"</string> - <string name="menu_copy" msgid="3612326052677229148">"Копирај во…"</string> - <string name="menu_move" msgid="1828090633118079817">"Премести во..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Нов прозорец"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Исечи"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Копирај"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Залепи"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Прикажи внатрешна мемор."</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Скриј внатрешна меморија"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Прикажи ја големината"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Сокриј ја големината"</string> - <string name="button_select" msgid="527196987259139214">"Избери"</string> - <string name="button_copy" msgid="8706475544635021302">"Копирај"</string> - <string name="button_move" msgid="2202666023104202232">"Премести"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Отфрли"</string> - <string name="button_retry" msgid="4392027584153752797">"Обиди се пак"</string> - <string name="sort_name" msgid="9183560467917256779">"По име"</string> - <string name="sort_date" msgid="586080032956151448">"Изменети по датум"</string> - <string name="sort_size" msgid="3350681319735474741">"По големина"</string> - <string name="drawer_open" msgid="4545466532430226949">"Прикажи корени"</string> - <string name="drawer_close" msgid="7602734368552123318">"Сокриј корени"</string> - <string name="save_error" msgid="6167009778003223664">"Документот не успеа да се зачува"</string> - <string name="create_error" msgid="3735649141335444215">"Не успеа да се создаде папка"</string> - <string name="query_error" msgid="5999895349602476581">"Во моментов не може да се вчита содржина."</string> - <string name="root_recent" msgid="4470053704320518133">"Последни"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> слободен простор"</string> - <string name="root_type_service" msgid="2178854894416775409">"Услуги на складирање"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Кратенки"</string> - <string name="root_type_device" msgid="7121342474653483538">"Уреди"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Повеќе апликации"</string> - <string name="empty" msgid="7858882803708117596">"Нема ставки"</string> - <string name="no_results" msgid="6622510343880730446">"Нема совпаѓања во %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Датотеката не може да се отвори"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Некои документи не може да се избришат"</string> - <string name="share_via" msgid="8966594246261344259">"Сподели преку"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Се копираат датотеки"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Датотеките се преместуваат"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Се бришат датотеките"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Уште <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Се копира <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> - <item quantity="other">Се копираат <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Се преместува <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> - <item quantity="other">Се преместуваат <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Се брише <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> - <item quantity="other">Се бришат <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Врати"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Се подготвува за копирање…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Се подготвува за преместување…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Се подготвува за бришење…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Не може да копира <xliff:g id="COUNT_1">%1$d</xliff:g> датотека</item> - <item quantity="other">Не може да копира <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Не може да премести <xliff:g id="COUNT_1">%1$d</xliff:g> датотека</item> - <item quantity="other">Не може да премести <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Не може да избрише <xliff:g id="COUNT_1">%1$d</xliff:g> датотека</item> - <item quantity="other">Не може да избрише <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Допрете за да ги погледнете деталите"</string> - <string name="close" msgid="3043722427445528732">"Затвори"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Датотекиве не се ископирани: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Датотекиве не се преместени: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Датотекиве не се избришани: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Овие датотеки беа конвертирани во друг формат: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">Копирана е <xliff:g id="COUNT_1">%1$d</xliff:g> датотека на таблата со исечоци.</item> - <item quantity="other">Копирани се <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки на таблата со исечоци.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Не може да ги залепи избраните датотеки на локацијава."</string> - <string name="menu_rename" msgid="7678802479104285353">"Преименувај"</string> - <string name="rename_error" msgid="4203041674883412606">"Не успеа да се преименува документот"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Извади"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Некои датотеки беа конвертирани"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Овозможете пристап на <xliff:g id="APPNAME"><b>^1</b></xliff:g> до директориумот <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> на <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Овозможете пристап на <xliff:g id="APPNAME"><b>^1</b></xliff:g> до директориумот <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Да се овозможи пристап на <xliff:g id="APPNAME"><b>^1</b></xliff:g> до вашите податоци, вклучувајќи фотографии и видеа, на <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Не прашувај повторно"</string> - <string name="allow" msgid="7225948811296386551">"Дозволи"</string> - <string name="deny" msgid="2081879885755434506">"Одбиј"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> е избрана</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> се избрани</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ставка</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ставки</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Да се избрише „<xliff:g id="NAME">%1$s</xliff:g>“?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Да се избрише папката „<xliff:g id="NAME">%1$s</xliff:g>“ и нејзините содржини?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Да се избрише <xliff:g id="COUNT_1">%1$d</xliff:g> датотека?</item> - <item quantity="other">Да се избришат <xliff:g id="COUNT_1">%1$d</xliff:g> датотеки?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Да се избрише <xliff:g id="COUNT_1">%1$d</xliff:g> папка и нивните содржини?</item> - <item quantity="other">Да се избришат <xliff:g id="COUNT_1">%1$d</xliff:g> папки и нивните содржини?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Да се избрише <xliff:g id="COUNT_1">%1$d</xliff:g> ставка?</item> - <item quantity="other">Да се избришат <xliff:g id="COUNT_1">%1$d</xliff:g> ставки?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ml-rIN/strings.xml b/packages/DocumentsUI/res/values-ml-rIN/strings.xml deleted file mode 100644 index 54d32a50ae41..000000000000 --- a/packages/DocumentsUI/res/values-ml-rIN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ഫയലുകൾ"</string> - <string name="downloads_label" msgid="959113951084633612">"ഡൗണ്ലോഡുകൾ"</string> - <string name="title_open" msgid="4353228937663917801">"ഇതിൽ നിന്നും തുറക്കുക"</string> - <string name="title_save" msgid="2433679664882857999">"ഇതില് സംരക്ഷിക്കുക"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"പുതിയ ഫോൾഡർ"</string> - <string name="menu_grid" msgid="6878021334497835259">"ഗ്രിഡ് കാഴ്ച"</string> - <string name="menu_list" msgid="7279285939892417279">"ലിസ്റ്റ് കാഴ്ച"</string> - <string name="menu_sort" msgid="7677740407158414452">"ഇപ്രകാരം അടുക്കുക"</string> - <string name="menu_search" msgid="3816712084502856974">"തിരയൽ"</string> - <string name="menu_settings" msgid="8239065133341597825">"സ്റ്റോറേജ് ക്രമീകരണം"</string> - <string name="menu_open" msgid="432922957274920903">"തുറക്കുക"</string> - <string name="menu_save" msgid="2394743337684426338">"സംരക്ഷിക്കുക"</string> - <string name="menu_share" msgid="3075149983979628146">"പങ്കിടുക"</string> - <string name="menu_delete" msgid="8138799623850614177">"ഇല്ലാതാക്കുക"</string> - <string name="menu_select_all" msgid="8323579667348729928">"എല്ലാം തിരഞ്ഞെടുക്കുക"</string> - <string name="menu_copy" msgid="3612326052677229148">"ഇതിൽ പകർത്തുക…"</string> - <string name="menu_move" msgid="1828090633118079817">"ഇതിലേക്ക് നീക്കുക..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"പുതിയ വിന്ഡോ"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"മുറിക്കുക"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"പകര്ത്തുക"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"ഒട്ടിക്കുക"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"ആന്തരിക സ്റ്റോറേജ് കാണിക്കുക"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"ആന്തരിക സ്റ്റോറേജ് മറയ്ക്കുക"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ഫയൽ വലുപ്പം കാണിക്കുക"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ഫയൽ വലുപ്പം മറയ്ക്കുക"</string> - <string name="button_select" msgid="527196987259139214">"തിരഞ്ഞെടുക്കുക"</string> - <string name="button_copy" msgid="8706475544635021302">"പകര്ത്തുക"</string> - <string name="button_move" msgid="2202666023104202232">"നീക്കുക"</string> - <string name="button_dismiss" msgid="3714065566893946085">"ഡിസ്മിസ് ചെയ്യുക"</string> - <string name="button_retry" msgid="4392027584153752797">"വീണ്ടും ശ്രമിക്കുക"</string> - <string name="sort_name" msgid="9183560467917256779">"പേര് പ്രകാരം"</string> - <string name="sort_date" msgid="586080032956151448">"പരിഷ്ക്കരിച്ച തീയതി പ്രകാരം"</string> - <string name="sort_size" msgid="3350681319735474741">"വലുപ്പം പ്രകാരം"</string> - <string name="drawer_open" msgid="4545466532430226949">"റൂട്ടുകൾ ദൃശ്യമാക്കുക"</string> - <string name="drawer_close" msgid="7602734368552123318">"റൂട്ടുകൾ മറയ്ക്കുക"</string> - <string name="save_error" msgid="6167009778003223664">"പ്രമാണം സംരക്ഷിക്കുന്നതിൽ പരാജയപ്പെട്ടു"</string> - <string name="create_error" msgid="3735649141335444215">"ഫോൾഡർ സൃഷ്ടിക്കുന്നതിൽ പരാജയപ്പെട്ടു"</string> - <string name="query_error" msgid="5999895349602476581">"ഇപ്പോൾ ഉള്ളടക്കം ലോഡുചെയ്യാൻ കഴിയില്ല"</string> - <string name="root_recent" msgid="4470053704320518133">"അടുത്തിടെയുള്ളവ"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ലഭ്യമാണ്"</string> - <string name="root_type_service" msgid="2178854894416775409">"സംഭരണ സേവനങ്ങൾ"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"കുറുക്കുവഴികൾ"</string> - <string name="root_type_device" msgid="7121342474653483538">"ഉപകരണങ്ങൾ"</string> - <string name="root_type_apps" msgid="8838065367985945189">"കൂടുതൽ അപ്ലിക്കേഷനുകൾ"</string> - <string name="empty" msgid="7858882803708117596">"ഇനങ്ങളൊന്നുമില്ല"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s എന്നതിൽ പൊരുത്തങ്ങളില്ല"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ഫയൽ തുറക്കാൻ കഴിയില്ല"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"ചില പ്രമാണങ്ങൾ ഇല്ലാതാക്കാനായില്ല"</string> - <string name="share_via" msgid="8966594246261344259">"ഇതുവഴി പങ്കിടുക"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ഫയലുകൾ പകർത്തുന്നു"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ഫയലുകൾ നീക്കുന്നു"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ഫയലുകൾ ഇല്ലാതാക്കുന്നു"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ശേഷിക്കുന്നു"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ പകർത്തുന്നു.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ പകർത്തുന്നു.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ നീക്കുന്നു.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ നീക്കുന്നു.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ ഇല്ലാതാക്കുന്നു.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ ഇല്ലാതാക്കുന്നു.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"പഴയപടിയാക്കുക"</string> - <string name="copy_preparing" msgid="3896202461003039386">"പകർപ്പിനായി തയ്യാറെടുക്കുന്നു…"</string> - <string name="move_preparing" msgid="2772219441375531410">"നീക്കാനൊരുങ്ങുന്നു…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"ഇല്ലാതാക്കാൻ തയ്യാറെടുക്കുന്നു..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ പകർത്താനായില്ല</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ പകർത്താനായില്ല</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ നീക്കാനായില്ല</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ നീക്കാനായില്ല</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ ഇല്ലാതാക്കാനായില്ല</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ ഇല്ലാതാക്കാനായില്ല</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"വിശദാംശങ്ങൾ കാണുന്നതിന് ടാപ്പുചെയ്യുക"</string> - <string name="close" msgid="3043722427445528732">"അടയ്ക്കുക"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"ഈ ഫയലുകൾ പകർത്തിയില്ല: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"ഈ ഫയലുകൾ നീക്കിയില്ല: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"ഈ ഫയലുകൾ ഇല്ലാതാക്കിയില്ല: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ഈ ഫയലുകൾ മറ്റൊരു ഫോർമാറ്റിലേക്ക് പരിവർത്തനം ചെയ്യപ്പെട്ടു: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തി.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"തിരഞ്ഞെടുത്ത ഫയലുകൾ ഈ ലൊക്കേഷനിൽ ഒട്ടിക്കാനാകുന്നില്ല."</string> - <string name="menu_rename" msgid="7678802479104285353">"പേരുമാറ്റുക"</string> - <string name="rename_error" msgid="4203041674883412606">"ഡോക്യുമെന്റിന്റെ പേരുമാറ്റുന്നത് പരാജയപ്പെട്ടു"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"ഒഴിവാക്കുക"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ചില ഫയലുകൾ പരിവർത്തനം ചെയ്യപ്പെട്ടു"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="STORAGE"><i>^3</i></xliff:g> സ്റ്റോറേജിലെ <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> എന്ന ഡയറക്റ്ററിയിലേക്ക് <xliff:g id="APPNAME"><b>^1</b></xliff:g> ആപ്പിന് ആക്സസ് അനുവദിക്കണോ?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g> എന്ന ഡയറക്ടറിയിലേക്ക് <xliff:g id="APPNAME"><b>^1</b></xliff:g> ആപ്പിന് ആക്സസ് അനുവദിക്കണോ?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g> സ്റ്റോറേജിലെ ഫോട്ടോകളും വീഡിയോകളും ഉൾപ്പെടെ, നിങ്ങളുടെ ഡാറ്റയിലേക്ക് <xliff:g id="APPNAME"><b>^1</b></xliff:g> ആപ്പിന് ആക്സസ്സ് അനുവദിക്കണോ?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"വീണ്ടും ആവശ്യപ്പെടരുത്"</string> - <string name="allow" msgid="7225948811296386551">"അനുവദിക്കുക"</string> - <string name="deny" msgid="2081879885755434506">"നിരസിക്കുക"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> തിരഞ്ഞെടുത്തു</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> തിരഞ്ഞെടുത്തു</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഇനങ്ങൾ</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഇനം</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ഇല്ലാതാക്കണോ?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" എന്ന ഫോൾഡറും അതിലെ ഉള്ളടങ്ങളും ഇല്ലാതാക്കണോ?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫയലുകൾ ഇല്ലാതാക്കണോ?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫയൽ ഇല്ലാതാക്കണോ?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഫോൾഡറുകളും അവയിലെ ഉള്ളടക്കങ്ങളും ഇല്ലാതാക്കണോ?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഫോൾഡറും അതിലെ ഉള്ളടക്കങ്ങളും ഇല്ലാതാക്കണോ?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ഇനങ്ങൾ ഇല്ലാതാക്കണോ?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ഇനം ഇല്ലാതാക്കണോ?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml deleted file mode 100644 index 7b7f6c9f10f3..000000000000 --- a/packages/DocumentsUI/res/values-mn-rMN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Файл"</string> - <string name="downloads_label" msgid="959113951084633612">"Таталт"</string> - <string name="title_open" msgid="4353228937663917801">"Нээх"</string> - <string name="title_save" msgid="2433679664882857999">"Хадгалах"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Шинэ фолдер"</string> - <string name="menu_grid" msgid="6878021334497835259">"Эгнүүлж харах"</string> - <string name="menu_list" msgid="7279285939892417279">"Жагсааж харах"</string> - <string name="menu_sort" msgid="7677740407158414452">"Эрэмбэлэх"</string> - <string name="menu_search" msgid="3816712084502856974">"Хайх"</string> - <string name="menu_settings" msgid="8239065133341597825">"Хадгалах сангийн тохиргоо"</string> - <string name="menu_open" msgid="432922957274920903">"Нээх"</string> - <string name="menu_save" msgid="2394743337684426338">"Хадгалах"</string> - <string name="menu_share" msgid="3075149983979628146">"Хуваалцах"</string> - <string name="menu_delete" msgid="8138799623850614177">"Устгах"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Бүгдийг сонгох"</string> - <string name="menu_copy" msgid="3612326052677229148">"...руу хуулах"</string> - <string name="menu_move" msgid="1828090633118079817">"Байршуулах газар"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Шинэ цонх"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Таслах"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Хуулах"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Буулгах"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Дотоод санг харуулах"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Дотоод санг нуух"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Файлын хэмжээг харуулах"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Файлын хэмжээг нуух"</string> - <string name="button_select" msgid="527196987259139214">"Сонгох"</string> - <string name="button_copy" msgid="8706475544635021302">"Хуулах"</string> - <string name="button_move" msgid="2202666023104202232">"Зөөх"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Алгасах"</string> - <string name="button_retry" msgid="4392027584153752797">"Дахин оролдоно уу"</string> - <string name="sort_name" msgid="9183560467917256779">"Нэрээр"</string> - <string name="sort_date" msgid="586080032956151448">"Өөрчлөгдсөн огноогоор"</string> - <string name="sort_size" msgid="3350681319735474741">"Хэмжээгээр"</string> - <string name="drawer_open" msgid="4545466532430226949">"Язгуурыг харуулах"</string> - <string name="drawer_close" msgid="7602734368552123318">"Язгуурыг нууцлах"</string> - <string name="save_error" msgid="6167009778003223664">"Документыг хадгалж чадсангүй"</string> - <string name="create_error" msgid="3735649141335444215">"Фолдер үүсгэж чадсангүй"</string> - <string name="query_error" msgid="5999895349602476581">"Одоогоор агуулгыг ачааллах боломжгүй байна"</string> - <string name="root_recent" msgid="4470053704320518133">"Саяхны"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> чөлөөтэй"</string> - <string name="root_type_service" msgid="2178854894416775409">"Сангийн үйлчилгээ"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Товчлол"</string> - <string name="root_type_device" msgid="7121342474653483538">"Төхөөрөмжүүд"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Өөр апп-ууд"</string> - <string name="empty" msgid="7858882803708117596">"Хоосон"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s-д тохирох зүйл байхгүй байна"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Файлыг нээх боломжгүй байна"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Зарим документуудыг устгах боломжгүй"</string> - <string name="share_via" msgid="8966594246261344259">"Дараахаар дамжуулан хуваалцах"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Файлуудыг хуулж байна"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Файлыг зөөвөрлөж байна"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Эдгээр файлыг устгаж байна"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> үлдсэн"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файлуудыг хуулж байна.</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файл хуулж байна.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файл зөөж байна.</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файл зөөж байна.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> файлыг устгаж байна.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> файлыг устгаж байна.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Буцаах"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Хуулбарлахад бэлтгэж байна..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Зөөвөрлөхөд бэлтгэж байна..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Устгах гэж байна..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файлыг хуулж чадсангүй</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файлыг хуулж чадахгүй байна</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файлыг зөөх боломжгүй байна</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файлыг зөөх боломжгүй байна</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файлыг устгаж чадсангүй</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файлыг устгаж чадсангүй</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Дэлгэрэнгүй мэдээллийг үзэхийн тулд дарна уу"</string> - <string name="close" msgid="3043722427445528732">"Хаах"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Эдгээр файлыг хуулж чадсангүй: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Эдгээр файлыг зөөж чадсангүй: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Эдгээр файл устсангүй: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Эдгээр файлыг өөр хэлбэршилтэд хөрвүүлсэн байна: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> материалыг түр санах ой руу хуулсан.</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> материалыг түр санах ой руу хуулсан.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Энэ байршилд сонгосон файлыг байршуулах боломжгүй байна."</string> - <string name="menu_rename" msgid="7678802479104285353">"Нэр өөрчлөх"</string> - <string name="rename_error" msgid="4203041674883412606">"Баримт бичгийн нэрийн өөрчилж чадсангүй"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Салгах"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Зарим файлыг хөрвүүлсэн"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="STORAGE"><i>^3</i></xliff:g>-д байгаа <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> лавлагаанд хандахыг <xliff:g id="APPNAME"><b>^1</b></xliff:g>-д зөвшөөрөх үү?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g> лавлагаанд хандах эрхийг <xliff:g id="APPNAME"><b>^1</b></xliff:g>-д олгох уу?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g>-д байгаа зураг, видео гэх мэт таны өгөгдөлд <xliff:g id="APPNAME"><b>^1</b></xliff:g> хандахыг зөвшөөрөх үү?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Дахин бүү асуу"</string> - <string name="allow" msgid="7225948811296386551">"Зөвшөөрөх"</string> - <string name="deny" msgid="2081879885755434506">"Татгалзах"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> сонгосон</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> сонгосон</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> зүйл</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> зүйл</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\"-г устгах уу?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" фолдер болон үүний агуулгыг устгах уу?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> файлыг устгах уу?</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> файлыг устгах уу?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> фолдер болон агуулгуудыг нь устгах уу?</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> фолдер болон агуулгыг нь устгах уу?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> зүйлийг устгах уу?</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> зүйлийг устгах уу?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-mr-rIN/strings.xml b/packages/DocumentsUI/res/values-mr-rIN/strings.xml deleted file mode 100644 index a501a724f205..000000000000 --- a/packages/DocumentsUI/res/values-mr-rIN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"फायली"</string> - <string name="downloads_label" msgid="959113951084633612">"डाउनलोड"</string> - <string name="title_open" msgid="4353228937663917801">"वरून उघडा"</string> - <string name="title_save" msgid="2433679664882857999">"येथे जतन करा"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"नवीन फोल्डर"</string> - <string name="menu_grid" msgid="6878021334497835259">"ग्रिड दृश्य"</string> - <string name="menu_list" msgid="7279285939892417279">"सूची"</string> - <string name="menu_sort" msgid="7677740407158414452">"नुसार क्रमवारी लावा"</string> - <string name="menu_search" msgid="3816712084502856974">"शोध"</string> - <string name="menu_settings" msgid="8239065133341597825">"संचयन सेटिंग्ज"</string> - <string name="menu_open" msgid="432922957274920903">"उघडा"</string> - <string name="menu_save" msgid="2394743337684426338">"जतन करा"</string> - <string name="menu_share" msgid="3075149983979628146">"सामायिक करा"</string> - <string name="menu_delete" msgid="8138799623850614177">"हटवा"</string> - <string name="menu_select_all" msgid="8323579667348729928">"सर्व निवडा"</string> - <string name="menu_copy" msgid="3612326052677229148">"यावर कॉपी करा…"</string> - <string name="menu_move" msgid="1828090633118079817">"यावर हलवा…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"नवीन विंडो"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"कट करा"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"कॉपी करा"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"पेस्ट करा"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"अंतर्गत संचयन दर्शवा"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"अंतर्गत संचयन लपवा"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"फाईल आकार दर्शवा"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"फाईल आकार लपवा"</string> - <string name="button_select" msgid="527196987259139214">"निवडा"</string> - <string name="button_copy" msgid="8706475544635021302">"कॉपी करा"</string> - <string name="button_move" msgid="2202666023104202232">"हलवा"</string> - <string name="button_dismiss" msgid="3714065566893946085">"डिसमिस करा"</string> - <string name="button_retry" msgid="4392027584153752797">"पुन्हा प्रयत्न करा"</string> - <string name="sort_name" msgid="9183560467917256779">"नावानुसार"</string> - <string name="sort_date" msgid="586080032956151448">"सुधारित केलेल्या तारखेनुसार"</string> - <string name="sort_size" msgid="3350681319735474741">"आकारानुसार"</string> - <string name="drawer_open" msgid="4545466532430226949">"रूट दर्शवा"</string> - <string name="drawer_close" msgid="7602734368552123318">"रूट लपवा"</string> - <string name="save_error" msgid="6167009778003223664">"दस्तऐवज जतन करणे अयशस्वी झाले"</string> - <string name="create_error" msgid="3735649141335444215">"फोल्डर तयार करण्यात अयशस्वी"</string> - <string name="query_error" msgid="5999895349602476581">"याक्षणी सामग्री लोड करू शकत नाही"</string> - <string name="root_recent" msgid="4470053704320518133">"अलीकडील"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> विनामूल्य"</string> - <string name="root_type_service" msgid="2178854894416775409">"संचयन सेवा"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"शॉर्टकट"</string> - <string name="root_type_device" msgid="7121342474653483538">"डिव्हाइसेस"</string> - <string name="root_type_apps" msgid="8838065367985945189">"अधिक अॅप्स"</string> - <string name="empty" msgid="7858882803708117596">"कोणतेही आयटम नाहीत"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s मध्ये कोणत्याही जुळण्या नाहीत"</string> - <string name="toast_no_application" msgid="4632640357724698144">"फाईल उघडू शकत नाही"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"काही दस्तऐवज हटविण्यात अक्षम"</string> - <string name="share_via" msgid="8966594246261344259">"द्वारे सामायिक करा"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"फायली कॉपी करीत आहे"</string> - <string name="move_notification_title" msgid="6193835179777284805">"फायली हलविणे"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"फायली हटवित आहे"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> शिल्लक"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फाईल कॉपी करीत आहे.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फायली कॉपी करीत आहे.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फाईल हलवित आहे.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फायली हलवित आहे.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फाईल हटवित आहे.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फायली हटवित आहे.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"पूर्ववत करा"</string> - <string name="copy_preparing" msgid="3896202461003039386">"कॉपी करण्यासाठी तयार करीत आहे…"</string> - <string name="move_preparing" msgid="2772219441375531410">"हलविण्यास तयार होत आहे…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"हटविण्यासाठी तयार करीत आहे..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> फाईल कॉपी करणे शक्य झाले नाही</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> फायली कॉपी करणे शक्य झाले नाही</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> फाईल हलविणे शक्य झाले नाही</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> फायली हलविणे शक्य झाले नाही</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> फाईल हटविणे शक्य झाले नाही</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> फायली हटविणे शक्य झाले नाही</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"तपशील पाहण्यासाठी टॅप करा"</string> - <string name="close" msgid="3043722427445528732">"बंद करा"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"या फायलींची कॉपी झाली नाही: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"या फायली हलविल्या नाहीत: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"या फायली हटविल्या नाहीत: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"या फायली दुसऱ्या स्वरूपनात रूपांतरित केल्या होत्या: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">क्लिपबोर्डवर <xliff:g id="COUNT_1">%1$d</xliff:g> फाईल कॉपी केली.</item> - <item quantity="other">क्लिपबोर्डवर <xliff:g id="COUNT_1">%1$d</xliff:g> फायली कॉपी केल्या.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"या स्थानामध्ये निवडलेल्या फायली पेस्ट करू शकत नाही."</string> - <string name="menu_rename" msgid="7678802479104285353">"पुनर्नामित करा"</string> - <string name="rename_error" msgid="4203041674883412606">"दस्तऐवज पुनर्नामित करण्यात अयशस्वी झाले"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"बाहेर काढा"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"काही फायली रूपांतरित केल्या होत्या"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="STORAGE"><i>^3</i></xliff:g> वर <xliff:g id="APPNAME"><b>^1</b></xliff:g> ला <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> निर्देशिकेवर प्रवेशाची मंजूरी द्यायची?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ला <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> निर्देशिकमध्ये प्रवेश मंजूर करायचा?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ला <xliff:g id="STORAGE"><i>^2</i></xliff:g> वर फोटो आणि व्हिडिओंसह, आपल्या डेटामध्ये प्रवेश करण्याची मंजूरी द्यायची?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"पुन्हा विचारू नका"</string> - <string name="allow" msgid="7225948811296386551">"अनुमती द्या"</string> - <string name="deny" msgid="2081879885755434506">"नकार द्या"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> निवडला</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> निवडले</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> आयटम</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> आयटम</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" हटवायची?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" फोल्डर आणि त्यामधील सामग्री हटवायची?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फाईल हटवायची?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फायली हटवायच्या?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> फोल्डर आणि त्यामधील सामग्री हटवायची?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फोल्डर आणि त्यामधील सामग्री हटवायची?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> आयटम हटवायचा?</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> आयटम हटवायचे?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml deleted file mode 100644 index 139d021d4d54..000000000000 --- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fail"</string> - <string name="downloads_label" msgid="959113951084633612">"Muat turun"</string> - <string name="title_open" msgid="4353228937663917801">"Buka dari"</string> - <string name="title_save" msgid="2433679664882857999">"Simpan ke"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Folder baharu"</string> - <string name="menu_grid" msgid="6878021334497835259">"Paparan grid"</string> - <string name="menu_list" msgid="7279285939892417279">"Paparan senarai"</string> - <string name="menu_sort" msgid="7677740407158414452">"Isih mengikut"</string> - <string name="menu_search" msgid="3816712084502856974">"Cari"</string> - <string name="menu_settings" msgid="8239065133341597825">"Tetapan storan"</string> - <string name="menu_open" msgid="432922957274920903">"Buka"</string> - <string name="menu_save" msgid="2394743337684426338">"Simpan"</string> - <string name="menu_share" msgid="3075149983979628146">"Kongsi"</string> - <string name="menu_delete" msgid="8138799623850614177">"Padam"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Pilih semua"</string> - <string name="menu_copy" msgid="3612326052677229148">"Salin ke..."</string> - <string name="menu_move" msgid="1828090633118079817">"Alihkan ke…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Tetingkap baharu"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Potong"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Salin"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Tampal"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Papar storan dalaman"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Sembunyikan storan dlmn"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Papar saiz fail"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Sembunyikan saiz fail"</string> - <string name="button_select" msgid="527196987259139214">"Pilih"</string> - <string name="button_copy" msgid="8706475544635021302">"Salin"</string> - <string name="button_move" msgid="2202666023104202232">"Alihkan"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Tolak"</string> - <string name="button_retry" msgid="4392027584153752797">"Cuba Lagi"</string> - <string name="sort_name" msgid="9183560467917256779">"Mengikut nama"</string> - <string name="sort_date" msgid="586080032956151448">"Mengikut tarikh diubah"</string> - <string name="sort_size" msgid="3350681319735474741">"Mengikut saiz"</string> - <string name="drawer_open" msgid="4545466532430226949">"Tunjukkan akar"</string> - <string name="drawer_close" msgid="7602734368552123318">"Sembunyikan akar"</string> - <string name="save_error" msgid="6167009778003223664">"Gagal menyimpan dokumen"</string> - <string name="create_error" msgid="3735649141335444215">"Gagal membuat folder"</string> - <string name="query_error" msgid="5999895349602476581">"Tidak dapat memuatkan kandungan pada masa ini"</string> - <string name="root_recent" msgid="4470053704320518133">"Terbaharu"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> kosong"</string> - <string name="root_type_service" msgid="2178854894416775409">"Perkhidmatan storan"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Pintasan"</string> - <string name="root_type_device" msgid="7121342474653483538">"Peranti"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Lebih banyak apl"</string> - <string name="empty" msgid="7858882803708117596">"Tiada item"</string> - <string name="no_results" msgid="6622510343880730446">"Tiada padanan dalam %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Tidak dapat membuka fail"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat memadam beberapa dokumen"</string> - <string name="share_via" msgid="8966594246261344259">"Kongsi melalui"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Menyalin fail"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Mengalihkan fail"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Memadamkan fail"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> lagi"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> fail.</item> - <item quantity="one">Menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> fail.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Mengalihkan <xliff:g id="COUNT_1">%1$d</xliff:g> fail.</item> - <item quantity="one">Mengalihkan <xliff:g id="COUNT_0">%1$d</xliff:g> fail.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Memadam <xliff:g id="COUNT_1">%1$d</xliff:g> fail.</item> - <item quantity="one">Memadam <xliff:g id="COUNT_0">%1$d</xliff:g> fail.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Buat asal"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Bersedia untuk salin..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Bersedia untuk mengalih…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Bersedia untuk memadam…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Tidak dapat menyalin <xliff:g id="COUNT_1">%1$d</xliff:g> fail</item> - <item quantity="one">Tidak dapat menyalin <xliff:g id="COUNT_0">%1$d</xliff:g> fail</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Tidak dapat mengalihkan <xliff:g id="COUNT_1">%1$d</xliff:g> fail</item> - <item quantity="one">Tidak dapat mengalihkan <xliff:g id="COUNT_0">%1$d</xliff:g> fail</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Tidak dapat memadamkan <xliff:g id="COUNT_1">%1$d</xliff:g> fail</item> - <item quantity="one">Tidak dapat memadamkan <xliff:g id="COUNT_0">%1$d</xliff:g> fail</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Ketik untuk melihat butiran"</string> - <string name="close" msgid="3043722427445528732">"Tutup"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Fail ini tidak disalin: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Fail ini tidak dialihkan: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Fail ini tidak dipadamkan: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Fail ini telah ditukarkan kepada format lain: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> fail disalin ke papan keratan.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fail disalin ke papan keratan.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Tidak boleh menampalkan fail yang dipilih dalam lokasi ini."</string> - <string name="menu_rename" msgid="7678802479104285353">"Namakan semula"</string> - <string name="rename_error" msgid="4203041674883412606">"Gagal menamakan semula dokumen"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Keluarkan"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sesetengah fail telah ditukarkan"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Beri <xliff:g id="APPNAME"><b>^1</b></xliff:g> akses kepada direktori <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> di <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Beri <xliff:g id="APPNAME"><b>^1</b></xliff:g> akses kepada direktori <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Beri <xliff:g id="APPNAME"><b>^1</b></xliff:g> akses kepada data anda, termasuk foto dan video pada <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Jangan tanya lagi"</string> - <string name="allow" msgid="7225948811296386551">"Benarkan"</string> - <string name="deny" msgid="2081879885755434506">"Nafi"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dipilih</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dipilih</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> item</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Padamkan \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Padamkan folder \"<xliff:g id="NAME">%1$s</xliff:g>\" dan kandungannya?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Padamkan <xliff:g id="COUNT_1">%1$d</xliff:g> fail?</item> - <item quantity="one">Padamkan <xliff:g id="COUNT_0">%1$d</xliff:g> fail?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Padamkan <xliff:g id="COUNT_1">%1$d</xliff:g> folder dan kandungannya?</item> - <item quantity="one">Padamkan <xliff:g id="COUNT_0">%1$d</xliff:g> folder dan kandungannya?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Padamkan <xliff:g id="COUNT_1">%1$d</xliff:g> item?</item> - <item quantity="one">Padamkan <xliff:g id="COUNT_0">%1$d</xliff:g> item?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-my-rMM/strings.xml b/packages/DocumentsUI/res/values-my-rMM/strings.xml deleted file mode 100644 index 366c484a9f86..000000000000 --- a/packages/DocumentsUI/res/values-my-rMM/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ဖိုင်များ"</string> - <string name="downloads_label" msgid="959113951084633612">"ဒေါင်းလုဒ်များ"</string> - <string name="title_open" msgid="4353228937663917801">"မှ ဖွင့်ပါ"</string> - <string name="title_save" msgid="2433679664882857999">"သို့ သိမ်းပါ"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"ဖိုလ်ဒါ အသစ်"</string> - <string name="menu_grid" msgid="6878021334497835259">"ဖယားကွက်မြင်ကွင်း"</string> - <string name="menu_list" msgid="7279285939892417279">"အစဉ်လိုက်မြင်ကွင်း"</string> - <string name="menu_sort" msgid="7677740407158414452">"အစဉ်အလိုက် စီခြင်း"</string> - <string name="menu_search" msgid="3816712084502856974">"ရှာဖွေရန်"</string> - <string name="menu_settings" msgid="8239065133341597825">"သိုလှောင်မှု ဆက်တင်များ"</string> - <string name="menu_open" msgid="432922957274920903">"ဖွင့်ရန်"</string> - <string name="menu_save" msgid="2394743337684426338">"သိမ်းရန်"</string> - <string name="menu_share" msgid="3075149983979628146">"မျှဝေခြင်း"</string> - <string name="menu_delete" msgid="8138799623850614177">"ဖျက်ရန်"</string> - <string name="menu_select_all" msgid="8323579667348729928">"အားလုံးကို ရွေးရန်"</string> - <string name="menu_copy" msgid="3612326052677229148">"…သို့ကူးယူရန်"</string> - <string name="menu_move" msgid="1828090633118079817">"...သို့ ရွှေ့ရန်"</string> - <string name="menu_new_window" msgid="1226032889278727538">"ဝင်းဒိုးသစ်"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"ဖြတ်ယူရန်"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"ကူးယူရန်"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"ကပ်ရန်"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"စက်ရှိစတိုရုံ ပြပါ"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"စက်ရှိစတိုရုံ ဖျောက်ထားပါ"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ဖိုင်အရွယ်အစား ပြပါ"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ဖိုင်အရွယ်အစား ဝှက်ပါ"</string> - <string name="button_select" msgid="527196987259139214">"ရွေးရန်"</string> - <string name="button_copy" msgid="8706475544635021302">"ကူးယူရန်"</string> - <string name="button_move" msgid="2202666023104202232">"ရွေ့မည်"</string> - <string name="button_dismiss" msgid="3714065566893946085">"ပယ်ရန်"</string> - <string name="button_retry" msgid="4392027584153752797">"ထပ် စမ်းကြည့်ပါ"</string> - <string name="sort_name" msgid="9183560467917256779">"အမည်ဖြင့်"</string> - <string name="sort_date" msgid="586080032956151448">"ပြင်ဆင်မှု ရက်စွဲဖြင့်"</string> - <string name="sort_size" msgid="3350681319735474741">"အရွယ်အစားဖြင့်"</string> - <string name="drawer_open" msgid="4545466532430226949">"ဖိုဒါကို ဖွင့်လိုက်ပါ"</string> - <string name="drawer_close" msgid="7602734368552123318">"ဖိုဒါကို ပိတ်လိုက်ပါ"</string> - <string name="save_error" msgid="6167009778003223664">"စာရွက်စာတန်း သိမ်းဆည်းမှု မအောင်မြင်ပါ"</string> - <string name="create_error" msgid="3735649141335444215">"အကန့်အသစ် ဖန်တီးခြင်း မအောင်မြင်ပါ"</string> - <string name="query_error" msgid="5999895349602476581">"အကြောင်းအရာများကို လောလောဆယ်တွင် တင်၍မရသေးပါ"</string> - <string name="root_recent" msgid="4470053704320518133">"လတ်တလော"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> အသုံးချနိုင်ပါသည်"</string> - <string name="root_type_service" msgid="2178854894416775409">"သိုလှောင်ရန်ဆားဗစ်များ"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"အတိုကောက်များ"</string> - <string name="root_type_device" msgid="7121342474653483538">"စက်ပစ္စည်းများ"</string> - <string name="root_type_apps" msgid="8838065367985945189">"နောက်ထပ်အပလီကေးရှင်းများ"</string> - <string name="empty" msgid="7858882803708117596">"ဘာမှ မရှိပါ"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s တွင်ကိုက်ညီမှုမရှိပါ"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ဖိုင်ကိုဖွင့်၍မရပါ"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"တချို့ စာရွက်စာတန်းများ မဖျက်စီးနိုင်ပါ"</string> - <string name="share_via" msgid="8966594246261344259">"မှ ဝေမျှပါ"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ဖိုင်များကူယူနေသည်"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ဖိုင်များ ရွှေ့နေသည်"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ဖိုင်များကို ဖျက်နေသည်"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ကျန်ရှိသည်"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ဖိုင်များကို ကူးယူနေသည်။</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ဖိုင် ကူးယူနေသည်။</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ဖိုင် ရွှေ့နေစဉ်</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ဖိုင် ရွှေ့နေစဉ်</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">ဖိုင် <xliff:g id="COUNT_1">%1$d</xliff:g> ခုကိုဖျက်နေသည်။</item> - <item quantity="one">ဖိုင် <xliff:g id="COUNT_0">%1$d</xliff:g> ခုကိုဖျက်နေသည်။</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"ပြန်ဖျက်ရန်"</string> - <string name="copy_preparing" msgid="3896202461003039386">"မိတ္တူကူးရန်ပြင်ဆင်နေ..."</string> - <string name="move_preparing" msgid="2772219441375531410">"ရွှေ့ရန် ပြင်ဆင်နေသည်…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"ဖျက်ရန်အတွက် ပြင်ဆင်နေသည်..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">ဖိုင်<xliff:g id="COUNT_1">%1$d</xliff:g> ခုကိုကူးယူ၍မရခဲ့ပါ</item> - <item quantity="one">ဖိုင်<xliff:g id="COUNT_0">%1$d</xliff:g> ခုကိုကူးယူ၍မရခဲ့ပါ</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">ဖိုင်<xliff:g id="COUNT_1">%1$d</xliff:g> ခုကိုရွှေ့၍မရခဲ့ပါ</item> - <item quantity="one">ဖိုင်<xliff:g id="COUNT_0">%1$d</xliff:g> ခုကိုရွှေ့၍မရခဲ့ပါ</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">ဖိုင်<xliff:g id="COUNT_1">%1$d</xliff:g> ခုကိုဖျက်၍မရခဲ့ပါ</item> - <item quantity="one">ဖိုင်<xliff:g id="COUNT_0">%1$d</xliff:g> ခုကိုဖျက်၍မရခဲ့ပါ</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"အသေးစိတ်ကြည့်ရန် တို့ပါ"</string> - <string name="close" msgid="3043722427445528732">"ပိတ်ပါ"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"ဤဖိုင်များကို မကူးယူခဲ့ပါ − <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"ဤဖိုင်များကို မရွှေ့ခဲ့ပါ − <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"ဤဖိုင်များကို ဖျက်၍မရခဲ့ပါ − <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ဤဖိုင်များကို အခြားပုံစံစနစ်တစ်ခုသို့ ပြောင်းလဲခဲ့သည် − <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"> ဖိုင် <xliff:g id="COUNT_1">%1$d</xliff:g> ဖိုင်ကိုအချက်အလက်သိမ်းတဲ့နေရာသို့ ကူးယူပါ။</item> - <item quantity="one"> ဖိုင် <xliff:g id="COUNT_0">%1$d</xliff:g> ဖိုင်ကိုအချက်အလက်သိမ်းတဲ့နေရာသို့ ကူးယူပါ။</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"ဤနေရာတွင် ရွေးချယ်ထားသည့် ဖိုင်များကို ကူးထည့်၍မရပါ။"</string> - <string name="menu_rename" msgid="7678802479104285353">"အမည်ပြောင်းရန်"</string> - <string name="rename_error" msgid="4203041674883412606">"စာရွက်စာတမ်းကို အမည်ပြောင်းခြင်း မအောင်မြင်ပါ"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"ထုတ်မည်"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"အချို့ဖိုင်များကို ပြောင်းလဲထားသည်"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ကို <xliff:g id="STORAGE"><i>^3</i></xliff:g> ရှိ <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> လမ်းညွှန်အား အသုံးပြုခွင့်ပေးမလား။"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> အား <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> စာရင်းကို အသုံးပြုခွင့်ပေးမလား။"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g> ရှိဓာတ်ပုံများနှင့် ဗီဒီယိုများအပါအဝင် သင့်ဒေတာများကို <xliff:g id="APPNAME"><b>^1</b></xliff:g> အားအသုံးပြုခွင့်ပေးမလား။"</string> - <string name="never_ask_again" msgid="4295278542972859268">"နောက်ထပ်မမေးပါနှင့်"</string> - <string name="allow" msgid="7225948811296386551">"ခွင့်ပြုသည်"</string> - <string name="deny" msgid="2081879885755434506">"ငြင်းပယ်သည်"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ခုရွေးချယ်ထားသည်</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ခုရွေးချယ်ထားသည်</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ခု</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ခု</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ကိုဖျက်မလား။"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ဖိုင်တွဲနှင့် ၎င်းတွင်ပါဝင်သည့် အကြောင်းအရာများကို ဖျက်မလား။"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">ဖိုင် <xliff:g id="COUNT_1">%1$d</xliff:g> ခုကိုဖျက်မလား။</item> - <item quantity="one">ဖိုင် <xliff:g id="COUNT_0">%1$d</xliff:g> ခုကိုဖျက်မလား။</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">ဖိုင်တွဲ <xliff:g id="COUNT_1">%1$d</xliff:g> ခုနှင့် ၎င်း၏အကြောင်းအရာများကို ဖျက်မလား။</item> - <item quantity="one">ဖိုင်တွဲ <xliff:g id="COUNT_0">%1$d</xliff:g> ခုနှင့် ၎င်း၏အကြောင်းအရာများကို ဖျက်မလား။</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">အကြောင်းအရာ <xliff:g id="COUNT_1">%1$d</xliff:g> ခုကိုဖျက်မလား။</item> - <item quantity="one">အကြောင်းအရာ <xliff:g id="COUNT_0">%1$d</xliff:g> ခုကိုဖျက်မလား။</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml deleted file mode 100644 index e7b057b85868..000000000000 --- a/packages/DocumentsUI/res/values-nb/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Filer"</string> - <string name="downloads_label" msgid="959113951084633612">"Nedlastinger"</string> - <string name="title_open" msgid="4353228937663917801">"Åpne fra"</string> - <string name="title_save" msgid="2433679664882857999">"Lagre i"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Ny mappe"</string> - <string name="menu_grid" msgid="6878021334497835259">"Rutenettvisning"</string> - <string name="menu_list" msgid="7279285939892417279">"Listevisning"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortér etter"</string> - <string name="menu_search" msgid="3816712084502856974">"Søk"</string> - <string name="menu_settings" msgid="8239065133341597825">"Lagringsinnstillinger"</string> - <string name="menu_open" msgid="432922957274920903">"Åpne"</string> - <string name="menu_save" msgid="2394743337684426338">"Lagre"</string> - <string name="menu_share" msgid="3075149983979628146">"Del"</string> - <string name="menu_delete" msgid="8138799623850614177">"Slett"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Markér alt"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiér til …"</string> - <string name="menu_move" msgid="1828090633118079817">"Flytt til"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nytt vindu"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Klipp ut"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiér"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Lim inn"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Vis den interne lagringen"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Skjul den interne lagringen"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Vis filstørrelsen"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Skjul filstørrelsen"</string> - <string name="button_select" msgid="527196987259139214">"Velg"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiér"</string> - <string name="button_move" msgid="2202666023104202232">"Flytt"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Avvis"</string> - <string name="button_retry" msgid="4392027584153752797">"Prøv på nytt"</string> - <string name="sort_name" msgid="9183560467917256779">"Etter navn"</string> - <string name="sort_date" msgid="586080032956151448">"Etter endringsdato"</string> - <string name="sort_size" msgid="3350681319735474741">"Etter størrelse"</string> - <string name="drawer_open" msgid="4545466532430226949">"Vis røtter"</string> - <string name="drawer_close" msgid="7602734368552123318">"Skjul røtter"</string> - <string name="save_error" msgid="6167009778003223664">"Kunne ikke lagre dokumentet"</string> - <string name="create_error" msgid="3735649141335444215">"Kunne ikke opprette mappen"</string> - <string name="query_error" msgid="5999895349602476581">"Kan ikke laste inn innholdet for øyeblikket"</string> - <string name="root_recent" msgid="4470053704320518133">"Siste"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ledig"</string> - <string name="root_type_service" msgid="2178854894416775409">"Lagringstjenester"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Snarveier"</string> - <string name="root_type_device" msgid="7121342474653483538">"Enheter"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Flere apper"</string> - <string name="empty" msgid="7858882803708117596">"Ingen elementer"</string> - <string name="no_results" msgid="6622510343880730446">"Ingen treff i %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Kan ikke åpne filen"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Enkelte dokumenter kunne ikke slettes"</string> - <string name="share_via" msgid="8966594246261344259">"Del via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopierer filer"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Flytter filer"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Sletter filene"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> gjenstår"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Kopierer <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - <item quantity="one">Kopierer <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Flytter <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - <item quantity="one">Flytter <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Sletter <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - <item quantity="one">Sletter <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Angre"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Forbereder kopiering …"</string> - <string name="move_preparing" msgid="2772219441375531410">"Forbereder flytting …"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Gjøres klar for sletting …"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Kunne ikke kopiere <xliff:g id="COUNT_1">%1$d</xliff:g> filer</item> - <item quantity="one">Kunne ikke kopiere <xliff:g id="COUNT_0">%1$d</xliff:g> fil</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Kunne ikke flytte <xliff:g id="COUNT_1">%1$d</xliff:g> filer</item> - <item quantity="one">Kunne ikke flytte <xliff:g id="COUNT_0">%1$d</xliff:g> fil</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Kunne ikke slette <xliff:g id="COUNT_1">%1$d</xliff:g> filer</item> - <item quantity="one">Kunne ikke slette <xliff:g id="COUNT_0">%1$d</xliff:g> fil</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Trykk for å se detaljer"</string> - <string name="close" msgid="3043722427445528732">"Lukk"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Disse filene er ikke kopiert: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Disse filene er ikke flyttet: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Disse filene ble ikke slettet: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Disse filene er konvertert til et annet format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Kopierte <xliff:g id="COUNT_1">%1$d</xliff:g> filer til utklippstavlen.</item> - <item quantity="one">Kopierte <xliff:g id="COUNT_0">%1$d</xliff:g> fil til utklippstavlen.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Kan ikke lime inn de valgte filene her."</string> - <string name="menu_rename" msgid="7678802479104285353">"Gi nytt navn"</string> - <string name="rename_error" msgid="4203041674883412606">"Kunne ikke gi dokumentet nytt navn"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Løs ut"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Noen filer er konvertert"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Vil du gi <xliff:g id="APPNAME"><b>^1</b></xliff:g> tilgang til <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>-katalogen på <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Vil du gi <xliff:g id="APPNAME"><b>^1</b></xliff:g> tilgang til <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>-katalogen?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Vil du gi <xliff:g id="APPNAME"><b>^1</b></xliff:g> tilgang til dataene dine – inkludert bilder og videoer – på <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ikke spør igjen"</string> - <string name="allow" msgid="7225948811296386551">"Tillat"</string> - <string name="deny" msgid="2081879885755434506">"Avslå"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> er valgt</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> er valgt</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> varer</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> vare</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Vil du slette «<xliff:g id="NAME">%1$s</xliff:g>»?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Vil du slette «<xliff:g id="NAME">%1$s</xliff:g>»-mappen og innholdet i den?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Vil du slette <xliff:g id="COUNT_1">%1$d</xliff:g> filer?</item> - <item quantity="one">Vil du slette <xliff:g id="COUNT_0">%1$d</xliff:g> fil?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Vil du slette <xliff:g id="COUNT_1">%1$d</xliff:g> mapper og innholdet i dem?</item> - <item quantity="one">Vil du slette <xliff:g id="COUNT_0">%1$d</xliff:g> mappe og innholdet i den?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Vil du slette <xliff:g id="COUNT_1">%1$d</xliff:g> elementer?</item> - <item quantity="one">Vil du slette <xliff:g id="COUNT_0">%1$d</xliff:g> element?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ne-rNP/strings.xml b/packages/DocumentsUI/res/values-ne-rNP/strings.xml deleted file mode 100644 index 62fbc1a3ee8f..000000000000 --- a/packages/DocumentsUI/res/values-ne-rNP/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"फाइलहरू"</string> - <string name="downloads_label" msgid="959113951084633612">"डाउनलोडहरू"</string> - <string name="title_open" msgid="4353228937663917801">"यसबाट खोल्नुहोस्"</string> - <string name="title_save" msgid="2433679664882857999">"यसमा सुरक्षित गर्नुहोस्"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"नयाँ फोल्डर"</string> - <string name="menu_grid" msgid="6878021334497835259">"ग्रिड दृश्य"</string> - <string name="menu_list" msgid="7279285939892417279">"सूची दृश्य"</string> - <string name="menu_sort" msgid="7677740407158414452">"यसद्वारा क्रमवद्घ गर्नुहोस्"</string> - <string name="menu_search" msgid="3816712084502856974">"खोज्नुहोस्"</string> - <string name="menu_settings" msgid="8239065133341597825">"भण्डारण सेटिङहरू"</string> - <string name="menu_open" msgid="432922957274920903">"खोल्नुहोस्"</string> - <string name="menu_save" msgid="2394743337684426338">"सुरक्षित गर्नुहोस्"</string> - <string name="menu_share" msgid="3075149983979628146">"साझेदारी गर्नुहोस्"</string> - <string name="menu_delete" msgid="8138799623850614177">"मेटाउनुहोस्"</string> - <string name="menu_select_all" msgid="8323579667348729928">"सबै चयन गर्नुहोस्"</string> - <string name="menu_copy" msgid="3612326052677229148">"यसमा प्रतिलिपि गर्नुहोस् ..."</string> - <string name="menu_move" msgid="1828090633118079817">"…मा सार्नुहोस्"</string> - <string name="menu_new_window" msgid="1226032889278727538">"नयाँ विन्डो"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"काट्नुहोस्"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"प्रतिलिपि बनाउनुहोस्"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"टाँस्नुहोस्"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"आन्तरिक भण्डारण देखाउनुहोस्"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"आन्तरिक भण्डारण लुकाउनुहोस्"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"फाइल आकार देखाउनुहोस्"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"फाइल आकार लुकाउनुहोस्"</string> - <string name="button_select" msgid="527196987259139214">"चयन गर्नुहोस्"</string> - <string name="button_copy" msgid="8706475544635021302">"प्रतिलिपि बनाउनुहोस्"</string> - <string name="button_move" msgid="2202666023104202232">"सार्नुहोस्"</string> - <string name="button_dismiss" msgid="3714065566893946085">"खारेज गर्नुहोस्"</string> - <string name="button_retry" msgid="4392027584153752797">"पुन: प्रयास गर्नुहोस्"</string> - <string name="sort_name" msgid="9183560467917256779">"नाम अनुसार"</string> - <string name="sort_date" msgid="586080032956151448">"परिमार्जित मिति अनुसार"</string> - <string name="sort_size" msgid="3350681319735474741">"आकार अनुसार"</string> - <string name="drawer_open" msgid="4545466532430226949">"मूलहरू देखाउनुहोस्"</string> - <string name="drawer_close" msgid="7602734368552123318">"मूलहरू लुकाउनुहोस्"</string> - <string name="save_error" msgid="6167009778003223664">"कागजात सुरक्षित गर्न विफल भयो"</string> - <string name="create_error" msgid="3735649141335444215">"फोल्डर सिर्जना गर्न असफल भयो"</string> - <string name="query_error" msgid="5999895349602476581">"अहिले सामग्री लोड गर्न सक्दैन"</string> - <string name="root_recent" msgid="4470053704320518133">"हालैको"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> खाली"</string> - <string name="root_type_service" msgid="2178854894416775409">"भण्डारण सेवाहरू"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"सर्टकटहरू"</string> - <string name="root_type_device" msgid="7121342474653483538">"उपकरणहरू"</string> - <string name="root_type_apps" msgid="8838065367985945189">"थप अनुप्रयोगहरू"</string> - <string name="empty" msgid="7858882803708117596">"कुनै वस्तु छैन।"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s मा कुनै पनि मेल खानेहरू छैन"</string> - <string name="toast_no_application" msgid="4632640357724698144">"फाइल खोल्न सक्दैन"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"केही कागजातहरू मेट्न असमर्थ छ"</string> - <string name="share_via" msgid="8966594246261344259">"माध्यमबाट साझेदारी गर्नुहोस्"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"फाइलहरू प्रतिलिपि गर्दै:"</string> - <string name="move_notification_title" msgid="6193835179777284805">"फाइलहरू सार्दै"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"फाइलहरूलाई मेट्दै"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g>बाँकी"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g>फाइलहरू प्रतिलिप गर्दै।</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> फाइल प्रतिलिपि गर्दै।</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फाइलहरू सार्दै।</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> फाइलहरु सार्दै।</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फाइलहरू मेट्दै।</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> फाइल मेट्दै।</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"अनडू गर्नुहोस्"</string> - <string name="copy_preparing" msgid="3896202461003039386">"प्रतिलिपिको लागि तयारी गर्दै ..."</string> - <string name="move_preparing" msgid="2772219441375531410">"सार्नको लागि तयारी गर्दै ..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"मेटाउन तयारी गर्दै..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> फाइलहरू प्रतिलिपि गर्न सकेन</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> फाइल प्रतिलिपि गर्न सकेन</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> फाइलहरू सार्न सकेन</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> फाइल सार्न सकेन</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> फाइलहरू मेटाउन सकेन</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> फाइल मेटाउन सकेन</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"विवरणहरू हेर्न ट्याप गर्नुहोस्"</string> - <string name="close" msgid="3043722427445528732">"बन्द गर्नुहोस्"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"यी फाइलहरू प्रतिलिपि गरिएको थिएनः <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"यी फाइलहरू सारिएको थिएन: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"यी फाइलहरूलाई मेटाइएको थिएन: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"यी फाइलहरू अर्को ढाँचामा परिणत गरिएका थिए: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"> क्लिपबोर्डमा <xliff:g id="COUNT_1">%1$d</xliff:g> फाइलहरू प्रतिलिपि बनाइए।</item> - <item quantity="one"> क्लिपबोर्डमा <xliff:g id="COUNT_0">%1$d</xliff:g> फाइलहरूका प्रतिलिपि बनाइए।</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"यो स्थानमा चयन गरिएका फाइलहरू टाँस्न सकिँदैन।"</string> - <string name="menu_rename" msgid="7678802479104285353">"पुन: नामाकरण गर्नुहोस्"</string> - <string name="rename_error" msgid="4203041674883412606">"कागजात पुन: नामाकरण गर्न असफल भयो"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"निकाल्नुहोस्"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"केही फाइलहरू परिवर्तन गरिएका थिए"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> लाई <xliff:g id="STORAGE"><i>^3</i></xliff:g> मा भएको <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> निर्देशिकामा पहुँच गर्न अनुमति दिने हो?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> लाई <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> निर्देशिकामाथि पहुँच गर्न अनुमति प्रदान गर्ने हो?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> लाई <xliff:g id="STORAGE"><i>^2</i></xliff:g> मा भएका तस्बिर र भिडियोहरू लगायत तपाईँको डेटामा पहुँच गर्नका लागि अनुमति दिने हो?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"फेरि नसोध्नुहोस्"</string> - <string name="allow" msgid="7225948811296386551">"अनुमति दिनुहोस्"</string> - <string name="deny" msgid="2081879885755434506">"अस्वीकार गर्नुहोस्"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> लाई चयन गरियो</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> लाई चयन गरियो</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> वस्तुहरू</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> वस्तु</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" लाई मेट्ने हो?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"फोल्डर \"<xliff:g id="NAME">%1$s</xliff:g>\" र यसका सामग्रीहरूलाई मेट्ने हो?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फाइलहरूलाई मेट्ने हो?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> फाइललाई मेट्ने हो?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> फोल्डरहरू र तिनीहरूका सामग्रीहरूलाई मेट्ने हो?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> फोल्डर र यसका सामग्रीहरूलाई मेट्ने हो?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> वस्तुहरूलाई मेट्ने हो?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> वस्तुलाई मेट्ने हो?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml deleted file mode 100644 index 446e4b01430b..000000000000 --- a/packages/DocumentsUI/res/values-nl/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Bestanden"</string> - <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> - <string name="title_open" msgid="4353228937663917801">"Openen vanuit"</string> - <string name="title_save" msgid="2433679664882857999">"Opslaan in"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nieuwe map"</string> - <string name="menu_grid" msgid="6878021334497835259">"Rasterweergave"</string> - <string name="menu_list" msgid="7279285939892417279">"Lijstweergave"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sorteren op"</string> - <string name="menu_search" msgid="3816712084502856974">"Zoeken"</string> - <string name="menu_settings" msgid="8239065133341597825">"Instellingen voor opslag"</string> - <string name="menu_open" msgid="432922957274920903">"Openen"</string> - <string name="menu_save" msgid="2394743337684426338">"Opslaan"</string> - <string name="menu_share" msgid="3075149983979628146">"Delen"</string> - <string name="menu_delete" msgid="8138799623850614177">"Verwijderen"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Alles selecteren"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiëren naar…"</string> - <string name="menu_move" msgid="1828090633118079817">"Verplaatsen naar…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nieuw venster"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Knippen"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiëren"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Plakken"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Interne opslag weergeven"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Interne opslag verbergen"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Bestandsgrootte weergeven"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Bestandsgrootte verbergen"</string> - <string name="button_select" msgid="527196987259139214">"Selecteren"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiëren"</string> - <string name="button_move" msgid="2202666023104202232">"Verplaatsen"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Sluiten"</string> - <string name="button_retry" msgid="4392027584153752797">"Opnieuw proberen"</string> - <string name="sort_name" msgid="9183560467917256779">"Op naam"</string> - <string name="sort_date" msgid="586080032956151448">"Op aanpassingsdatum"</string> - <string name="sort_size" msgid="3350681319735474741">"Op grootte"</string> - <string name="drawer_open" msgid="4545466532430226949">"Roots weergeven"</string> - <string name="drawer_close" msgid="7602734368552123318">"Roots verbergen"</string> - <string name="save_error" msgid="6167009778003223664">"Kan document niet opslaan"</string> - <string name="create_error" msgid="3735649141335444215">"Kan map niet maken"</string> - <string name="query_error" msgid="5999895349602476581">"Kan content momenteel niet laden"</string> - <string name="root_recent" msgid="4470053704320518133">"Recent"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> vrij"</string> - <string name="root_type_service" msgid="2178854894416775409">"Opslagservices"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Sneltoetsen"</string> - <string name="root_type_device" msgid="7121342474653483538">"Apparaten"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Meer apps"</string> - <string name="empty" msgid="7858882803708117596">"Geen items"</string> - <string name="no_results" msgid="6622510343880730446">"Geen overeenkomsten in %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Kan bestand niet openen"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Kan bepaalde documenten niet verwijderen"</string> - <string name="share_via" msgid="8966594246261344259">"Delen via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Bestanden kopiëren"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Bestanden verplaatsen"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Bestanden verwijderen"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> resterend"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> bestanden kopiëren.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> bestand kopiëren.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> bestanden verplaatsen.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> bestand verplaatsen.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> bestanden verwijderen.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> bestand verwijderen.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Ongedaan maken"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Kopiëren voorbereiden…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Verplaatsen voorbereiden…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Verwijderen voorbereiden…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Kan <xliff:g id="COUNT_1">%1$d</xliff:g> bestanden niet kopiëren</item> - <item quantity="one">Kan <xliff:g id="COUNT_0">%1$d</xliff:g> bestand niet kopiëren</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Kan <xliff:g id="COUNT_1">%1$d</xliff:g> bestanden niet verplaatsen</item> - <item quantity="one">Kan <xliff:g id="COUNT_0">%1$d</xliff:g> bestand niet verplaatsen</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Kan <xliff:g id="COUNT_1">%1$d</xliff:g> bestanden niet verwijderen</item> - <item quantity="one">Kan <xliff:g id="COUNT_0">%1$d</xliff:g> bestand niet verwijderen</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tik om details te bekijken"</string> - <string name="close" msgid="3043722427445528732">"Sluiten"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Deze bestanden zijn niet gekopieerd: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Deze bestanden zijn niet verplaatst: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Deze bestanden zijn niet verwijderd: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Deze bestanden zijn geconverteerd vanuit een andere indeling: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> bestanden gekopieerd naar klembord.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> bestand gekopieerd naar klembord.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Kan de geselecteerde bestanden niet plakken op deze locatie."</string> - <string name="menu_rename" msgid="7678802479104285353">"Naam wijzigen"</string> - <string name="rename_error" msgid="4203041674883412606">"Kan naam van document niet wijzigen"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Uitwerpen"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Sommige bestanden zijn geconverteerd"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> toegang verlenen tot de map <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> op <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> toegang verlenen tot de map <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> toegang verlenen tot je gegevens, waaronder foto\'s en video\'s, op <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Niet meer vragen"</string> - <string name="allow" msgid="7225948811296386551">"Toestaan"</string> - <string name="deny" msgid="2081879885755434506">"Weigeren"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> geselecteerd</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> geselecteerd</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> items</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"<xliff:g id="NAME">%1$s</xliff:g> verwijderen?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Map <xliff:g id="NAME">%1$s</xliff:g> en de bijbehorende inhoud verwijderen?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> bestanden verwijderen?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> bestand verwijderen?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> mappen en de bijbehorende inhoud verwijderen?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> map en de bijbehorende inhoud verwijderen?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> items verwijderen?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item verwijderen?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-pa-rIN/strings.xml b/packages/DocumentsUI/res/values-pa-rIN/strings.xml deleted file mode 100644 index db1bf33bd5bc..000000000000 --- a/packages/DocumentsUI/res/values-pa-rIN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ਫ਼ਾਈਲਾਂ"</string> - <string name="downloads_label" msgid="959113951084633612">"ਡਾਊਨਲੋਡ"</string> - <string name="title_open" msgid="4353228937663917801">"ਤੋਂ ਖੋਲ੍ਹੋ"</string> - <string name="title_save" msgid="2433679664882857999">"ਇਸ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"ਨਵਾਂ ਫੋਲਡਰ"</string> - <string name="menu_grid" msgid="6878021334497835259">"ਗ੍ਰਿਡ ਵਿਊ"</string> - <string name="menu_list" msgid="7279285939892417279">"ਸੂਚੀ ਦ੍ਰਿਸ਼"</string> - <string name="menu_sort" msgid="7677740407158414452">"ਇਸ ਮੁਤਾਬਕ ਛਾਂਟੋ"</string> - <string name="menu_search" msgid="3816712084502856974">"ਖੋਜੋ"</string> - <string name="menu_settings" msgid="8239065133341597825">"ਸਟੋਰੇਜ ਸੈਟਿੰਗਾਂ"</string> - <string name="menu_open" msgid="432922957274920903">"ਖੋਲ੍ਹੋ"</string> - <string name="menu_save" msgid="2394743337684426338">"ਰੱਖਿਅਤ ਕਰੋ"</string> - <string name="menu_share" msgid="3075149983979628146">"ਸਾਂਝਾ ਕਰੋ"</string> - <string name="menu_delete" msgid="8138799623850614177">"ਮਿਟਾਓ"</string> - <string name="menu_select_all" msgid="8323579667348729928">"ਸਭ ਚੁਣੋ"</string> - <string name="menu_copy" msgid="3612326052677229148">"ਇਸ ਵਿੱਚ ਕਾਪੀ ਕਰੋ…"</string> - <string name="menu_move" msgid="1828090633118079817">"ਏਥੇ ਤਬਾਦਲਾ ਕਰੋ..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"ਨਵੀਂ ਵਿੰਡੋ"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"ਕੱਟੋ"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"ਕਾਪੀ ਕਰੋ"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"ਪੇਸਟ ਕਰੋ"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"ਅੰਦਰੂਨੀ ਸਟੋਰੇਜ ਦਿਖਾਓ"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"ਅੰਦਰੂਨੀ ਸਟੋਰੇਜ ਲੁਕਾਓ"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ਫਾਈਲ ਆਕਾਰ ਦਿਖਾਓ"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ਫਾਈਲ ਆਕਾਰ ਲੁਕਾਓ"</string> - <string name="button_select" msgid="527196987259139214">"ਚੁਣੋ"</string> - <string name="button_copy" msgid="8706475544635021302">"ਕਾਪੀ ਕਰੋ"</string> - <string name="button_move" msgid="2202666023104202232">"ਮੂਵ ਕਰੋ"</string> - <string name="button_dismiss" msgid="3714065566893946085">"ਖਾਰਜ ਕਰੋ"</string> - <string name="button_retry" msgid="4392027584153752797">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string> - <string name="sort_name" msgid="9183560467917256779">"ਨਾਮ ਮੁਤਾਬਕ"</string> - <string name="sort_date" msgid="586080032956151448">"ਸੋਧੇ ਜਾਣ ਦੀ ਤਾਰੀਖ਼ ਮੁਤਾਬਕ"</string> - <string name="sort_size" msgid="3350681319735474741">"ਆਕਾਰ ਮੁਤਾਬਕ"</string> - <string name="drawer_open" msgid="4545466532430226949">"ਰੂਟਸ ਦਿਖਾਓ"</string> - <string name="drawer_close" msgid="7602734368552123318">"ਰੂਟਸ ਲੁਕਾਓ"</string> - <string name="save_error" msgid="6167009778003223664">"ਦਸਾਤਵੇਜ਼ ਸੁਰੱਖਿਅਤ ਕਰਨ ਵਿੱਚ ਅਸਫਲ"</string> - <string name="create_error" msgid="3735649141335444215">"ਫੋਲਡਰ ਬਣਾਉਣ ਲਈ ਅਸਫਲ"</string> - <string name="query_error" msgid="5999895349602476581">"ਇਸ ਵੇਲੇ ਸਮੱਗਰੀ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string> - <string name="root_recent" msgid="4470053704320518133">"ਹਾਲੀਆ"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ਖਾਲੀ"</string> - <string name="root_type_service" msgid="2178854894416775409">"ਸਟੋਰੇਜ ਸੇਵਾਵਾਂ"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"ਸ਼ੌਰਟਕਟਸ"</string> - <string name="root_type_device" msgid="7121342474653483538">"ਡਿਵਾਈਸਾਂ"</string> - <string name="root_type_apps" msgid="8838065367985945189">"ਹੋਰ ਐਪਸ"</string> - <string name="empty" msgid="7858882803708117596">"ਕੋਈ ਆਈਟਮਾਂ ਨਹੀਂ"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s ਵਿੱਚ ਕੋਈ ਮੇਲ ਨਹੀਂ"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ਫ਼ਾਈਲ ਨੂੰ ਖੋਲ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"ਕੁਝ ਦਸਤਾਵੇਜ਼ ਮਿਟਾਉਣ ਵਿੱਚ ਅਸਮਰੱਥ"</string> - <string name="share_via" msgid="8966594246261344259">"ਇਸ ਰਾਹੀਂ ਸਾਂਝਾ ਕਰੋ"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ਫਾਈਲਾਂ ਕਾਪੀ ਕਰ ਰਿਹਾ ਹੈ"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ਫ਼ਾਈਲਾਂ ਨੂੰ ਮੂਵ ਕਰ ਰਿਹਾ ਹੈ"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ਬਾਕੀ"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one"> <xliff:g id="COUNT_1">%1$d</xliff:g> ਫਾਈਲਾਂ ਕਾਪੀ ਕਰ ਰਿਹਾ ਹੈ।</item> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ਫਾਈਲਾਂ ਕਾਪੀ ਕਰ ਰਿਹਾ ਹੈ।</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਮੂਵ ਕਰਨਾ।</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਮੂਵ ਕਰਨਾ।</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਮਿਟਾ ਰਿਹਾ ਹੈ।</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਮਿਟਾ ਰਿਹਾ ਹੈ।</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"ਅਣਕੀਤਾ ਕਰੋ"</string> - <string name="copy_preparing" msgid="3896202461003039386">"ਕਾਪੀ ਲਈ ਤਿਆਰ ਕਰ ਰਿਹਾ ਹੈ…"</string> - <string name="move_preparing" msgid="2772219441375531410">"ਮੂਵ ਲਈ ਤਿਆਰ ਕਰ ਰਿਹਾ ਹੈ..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"ਮਿਟਾਉਣ ਦੀ ਤਿਆਰੀ ਹੋ ਰਹੀ ਹੈ…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਕਾਪੀ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਕਾਪੀ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਤਬਦੀਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਤਬਦੀਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"ਵੇਰਵਿਆਂ ਨੂੰ ਵੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string> - <string name="close" msgid="3043722427445528732">"ਬੰਦ ਕਰੋ"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"ਇਹ ਫ਼ਾਈਲਾਂ ਕਾਪੀ ਨਹੀਂ ਹੋਈਆਂ ਸਨ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"ਇਹ ਫ਼ਾਈਲਾਂ ਤਬਦੀਲ ਨਹੀਂ ਹੋਈਆਂ ਸਨ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"ਇਹਨਾਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਇਆ ਨਹੀਂ ਗਿਆ ਸੀ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ਇਹ ਫ਼ਾਈਲਾਂ ਕਿਸੇ ਹੋਰ ਫੌਰਮੈਟ ਵਿੱਚ ਤਬਦੀਲ ਕੀਤੀਆਂ ਗਈਆਂ ਸਨ: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ <xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਦੀ ਪ੍ਰਤੀਲਿਪੀ ਬਣਾਈ ਗਈ।</item> - <item quantity="other">ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ <xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਦੀ ਪ੍ਰਤੀਲਿਪੀ ਬਣਾਈ ਗਈ।</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"ਇਸ ਸਥਾਨ ਵਿੱਚ ਚੁਣੀਆਂ ਗਈਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਪੇਸਟ ਨਹੀਂ ਕਰ ਸਕਦਾ ਹੈ।"</string> - <string name="menu_rename" msgid="7678802479104285353">"ਮੁੜ-ਨਾਮਕਰਨ ਕਰੋ"</string> - <string name="rename_error" msgid="4203041674883412606">"ਦਸਤਾਵੇਜ਼ ਦਾ ਮੁੜ-ਨਾਮਕਰਨ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"ਬਾਹਰ ਕੱਢੋ"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"ਕੁਝ ਫ਼ਾਈਲਾਂ ਤਬਦੀਲ ਕੀਤੀਆਂ ਗਈਆਂ ਸਨ"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"ਕੀ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ਨੂੰ <xliff:g id="STORAGE"><i>^3</i></xliff:g> \'ਤੇ <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ਡਾਇਰੈਕਟਰੀ \'ਤੇ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"ਕੀ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ਨੂੰ <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ਡਾਇਰੈਕਟਰੀ \'ਤੇ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"ਕੀ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ਨੂੰ <xliff:g id="STORAGE"><i>^2</i></xliff:g> \'ਤੇ ਫੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਸਮੇਤ, ਤੁਹਾਡੇ ਡੈਟੇ \'ਤੇ ਪਹੁੰਚ ਦੇਣੀ ਹੈ?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"ਦੁਬਾਰਾ ਨਾ ਪੁੱਛੋ"</string> - <string name="allow" msgid="7225948811296386551">"ਆਗਿਆ ਦਿਓ"</string> - <string name="deny" msgid="2081879885755434506">"ਅਸਵੀਕਾਰ ਕਰੋ"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣੀ ਗਈ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਚੁਣੀਆਂ ਗਈਆਂ</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ਆਈਟਮਾਂ</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ਆਈਟਮਾਂ</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"ਕੀ \"<xliff:g id="NAME">%1$s</xliff:g>\" ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"ਫੋਲਡਰ \"<xliff:g id="NAME">%1$s</xliff:g>\" ਅਤੇ ਉਸ ਦੀਆਂ ਸਮੱਗਰੀਆਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">ਕੀ <xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?</item> - <item quantity="other">ਕੀ <xliff:g id="COUNT_1">%1$d</xliff:g> ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">ਕੀ <xliff:g id="COUNT_1">%1$d</xliff:g> ਫੋਲਡਰਾਂ ਅਤੇ ਉਹਨਾਂ ਦੀਆਂ ਸਮੱਗਰੀਆਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?</item> - <item quantity="other">ਕੀ <xliff:g id="COUNT_1">%1$d</xliff:g> ਫੋਲਡਰਾਂ ਅਤੇ ਉਹਨਾਂ ਦੀਆਂ ਸਮੱਗਰੀਆਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">ਕੀ <xliff:g id="COUNT_1">%1$d</xliff:g> ਆਈਟਮਾਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?</item> - <item quantity="other">ਕੀ <xliff:g id="COUNT_1">%1$d</xliff:g> ਆਈਟਮਾਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml deleted file mode 100644 index 835cbd32ed7f..000000000000 --- a/packages/DocumentsUI/res/values-pl/strings.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Pliki"</string> - <string name="downloads_label" msgid="959113951084633612">"Pobrane"</string> - <string name="title_open" msgid="4353228937663917801">"Otwórz z"</string> - <string name="title_save" msgid="2433679664882857999">"Zapisz w"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nowy folder"</string> - <string name="menu_grid" msgid="6878021334497835259">"Widok siatki"</string> - <string name="menu_list" msgid="7279285939892417279">"Widok listy"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortuj według"</string> - <string name="menu_search" msgid="3816712084502856974">"Szukaj"</string> - <string name="menu_settings" msgid="8239065133341597825">"Ustawienia pamięci"</string> - <string name="menu_open" msgid="432922957274920903">"Otwórz"</string> - <string name="menu_save" msgid="2394743337684426338">"Zapisz"</string> - <string name="menu_share" msgid="3075149983979628146">"Udostępnij"</string> - <string name="menu_delete" msgid="8138799623850614177">"Usuń"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Zaznacz wszystko"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiuj do…"</string> - <string name="menu_move" msgid="1828090633118079817">"Przenieś do…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nowe okno"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Wytnij"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiuj"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Wklej"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Pokaż pamięć wewnętrzną"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ukryj pamięć wewnętrzną"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Pokaż rozmiar pliku"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ukryj rozmiar pliku"</string> - <string name="button_select" msgid="527196987259139214">"Wybierz"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiuj"</string> - <string name="button_move" msgid="2202666023104202232">"Przenieś"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Zamknij"</string> - <string name="button_retry" msgid="4392027584153752797">"Spróbuj ponownie"</string> - <string name="sort_name" msgid="9183560467917256779">"Według nazwy"</string> - <string name="sort_date" msgid="586080032956151448">"Według daty edycji"</string> - <string name="sort_size" msgid="3350681319735474741">"Według rozmiaru"</string> - <string name="drawer_open" msgid="4545466532430226949">"Pokaż elementy główne"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ukryj elementy główne"</string> - <string name="save_error" msgid="6167009778003223664">"Nie udało się zapisać dokumentu"</string> - <string name="create_error" msgid="3735649141335444215">"Nie udało się utworzyć folderu"</string> - <string name="query_error" msgid="5999895349602476581">"Teraz nie można załadować zawartości"</string> - <string name="root_recent" msgid="4470053704320518133">"Ostatnie"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> wolne"</string> - <string name="root_type_service" msgid="2178854894416775409">"Usługi pamięci masowej"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Skróty"</string> - <string name="root_type_device" msgid="7121342474653483538">"Urządzenia"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Więcej aplikacji"</string> - <string name="empty" msgid="7858882803708117596">"Brak elementów"</string> - <string name="no_results" msgid="6622510343880730446">"Brak wyników w %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Nie można otworzyć pliku"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Nie można usunąć niektórych dokumentów"</string> - <string name="share_via" msgid="8966594246261344259">"Udostępnij przez:"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopiowanie plików"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Przenoszenie plików"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Usuwam pliki"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Pozostało: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="few">Kopiowanie <xliff:g id="COUNT_1">%1$d</xliff:g> plików.</item> - <item quantity="many">Kopiowanie <xliff:g id="COUNT_1">%1$d</xliff:g> plików.</item> - <item quantity="other">Kopiowanie <xliff:g id="COUNT_1">%1$d</xliff:g> pliku.</item> - <item quantity="one">Kopiowanie <xliff:g id="COUNT_0">%1$d</xliff:g> pliku.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="few">Przenoszę <xliff:g id="COUNT_1">%1$d</xliff:g> pliki.</item> - <item quantity="many">Przenoszę <xliff:g id="COUNT_1">%1$d</xliff:g> plików.</item> - <item quantity="other">Przenoszę <xliff:g id="COUNT_1">%1$d</xliff:g> pliku.</item> - <item quantity="one">Przenoszę <xliff:g id="COUNT_0">%1$d</xliff:g> plik.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="few">Usuwam <xliff:g id="COUNT_1">%1$d</xliff:g> pliki.</item> - <item quantity="many">Usuwam <xliff:g id="COUNT_1">%1$d</xliff:g> plików.</item> - <item quantity="other">Usuwam <xliff:g id="COUNT_1">%1$d</xliff:g> pliku.</item> - <item quantity="one">Usuwam <xliff:g id="COUNT_0">%1$d</xliff:g> plik.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Cofnij"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Przygotowuję do kopiowania…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Przygotowuję przenoszenie…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Przygotowuję do usunięcia…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="few">Nie udało się skopiować <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> - <item quantity="many">Nie udało się skopiować <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> - <item quantity="other">Nie udało się skopiować <xliff:g id="COUNT_1">%1$d</xliff:g> pliku</item> - <item quantity="one">Nie udało się skopiować <xliff:g id="COUNT_0">%1$d</xliff:g> pliku</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="few">Nie udało się przenieść <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> - <item quantity="many">Nie udało się przenieść <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> - <item quantity="other">Nie udało się przenieść <xliff:g id="COUNT_1">%1$d</xliff:g> pliku</item> - <item quantity="one">Nie udało się przenieść <xliff:g id="COUNT_0">%1$d</xliff:g> pliku</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="few">Nie udało się usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> - <item quantity="many">Nie udało się usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> plików</item> - <item quantity="other">Nie udało się usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> pliku</item> - <item quantity="one">Nie udało się usunąć <xliff:g id="COUNT_0">%1$d</xliff:g> pliku</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Kliknij, by zobaczyć szczegóły"</string> - <string name="close" msgid="3043722427445528732">"Zamknij"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Te pliki nie zostały skopiowane: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Te pliki nie zostały przeniesione: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Te pliki nie zostały usunięte: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Te pliki zostały przekonwertowane na inny format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="few">Skopiowano <xliff:g id="COUNT_1">%1$d</xliff:g> pliki do schowka.</item> - <item quantity="many">Skopiowano <xliff:g id="COUNT_1">%1$d</xliff:g> plików do schowka.</item> - <item quantity="other">Skopiowano <xliff:g id="COUNT_1">%1$d</xliff:g> pliku do schowka.</item> - <item quantity="one">Skopiowano <xliff:g id="COUNT_0">%1$d</xliff:g> plik do schowka.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Nie można wkleić wybranych plików w tej lokalizacji."</string> - <string name="menu_rename" msgid="7678802479104285353">"Zmień nazwę"</string> - <string name="rename_error" msgid="4203041674883412606">"Nie udało się zmienić nazwy dokumentu"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Odłącz"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Niektóre pliki zostały przekonwertowane"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Zezwolić aplikacji <xliff:g id="APPNAME"><b>^1</b></xliff:g> na dostęp do katalogu <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> w pamięci masowej <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Przyznać aplikacji <xliff:g id="APPNAME"><b>^1</b></xliff:g> dostęp do katalogu <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Zezwolić aplikacji <xliff:g id="APPNAME"><b>^1</b></xliff:g> na dostęp do Twoich danych, w tym zdjęć i filmów, zapisanych w pamięci <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Nie pytaj ponownie"</string> - <string name="allow" msgid="7225948811296386551">"Zezwól"</string> - <string name="deny" msgid="2081879885755434506">"Odmów"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="few">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="many">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Wybrano <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">Wybrano <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> elementy</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> elementów</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementu</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> element</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Usunąć „<xliff:g id="NAME">%1$s</xliff:g>”?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Usunąć folder „<xliff:g id="NAME">%1$s</xliff:g>” i jego zawartość?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="few">Usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> pliki?</item> - <item quantity="many">Usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> plików?</item> - <item quantity="other">Usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> pliku?</item> - <item quantity="one">Usunąć <xliff:g id="COUNT_0">%1$d</xliff:g> plik?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="few">Usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> foldery wraz z zawartością?</item> - <item quantity="many">Usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> folderów wraz z zawartością?</item> - <item quantity="other">Usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> folderu wraz z zawartością?</item> - <item quantity="one">Usunąć <xliff:g id="COUNT_0">%1$d</xliff:g> folder wraz z zawartością?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="few">Usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> elementy?</item> - <item quantity="many">Usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> elementów?</item> - <item quantity="other">Usunąć <xliff:g id="COUNT_1">%1$d</xliff:g> elementu?</item> - <item quantity="one">Usunąć <xliff:g id="COUNT_0">%1$d</xliff:g> element?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-pt-rBR/strings.xml b/packages/DocumentsUI/res/values-pt-rBR/strings.xml deleted file mode 100644 index 21344991e1dc..000000000000 --- a/packages/DocumentsUI/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Arquivos"</string> - <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> - <string name="title_open" msgid="4353228937663917801">"Abrir de"</string> - <string name="title_save" msgid="2433679664882857999">"Salvar em"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nova pasta"</string> - <string name="menu_grid" msgid="6878021334497835259">"Visualização em grade"</string> - <string name="menu_list" msgid="7279285939892417279">"Visualização em lista"</string> - <string name="menu_sort" msgid="7677740407158414452">"Classificar por"</string> - <string name="menu_search" msgid="3816712084502856974">"Pesquisar"</string> - <string name="menu_settings" msgid="8239065133341597825">"Configurações de armazenamento"</string> - <string name="menu_open" msgid="432922957274920903">"Abrir"</string> - <string name="menu_save" msgid="2394743337684426338">"Salvar"</string> - <string name="menu_share" msgid="3075149983979628146">"Compartilhar"</string> - <string name="menu_delete" msgid="8138799623850614177">"Excluir"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Selecionar tudo"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copiar para..."</string> - <string name="menu_move" msgid="1828090633118079817">"Mover para..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nova janela"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cortar"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copiar"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Colar"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Mostrar armaz. interno"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ocultar armaz. interno"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tam. do arquivo"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tam. do arquivo"</string> - <string name="button_select" msgid="527196987259139214">"Selecionar"</string> - <string name="button_copy" msgid="8706475544635021302">"Copiar"</string> - <string name="button_move" msgid="2202666023104202232">"Mover"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Dispensar"</string> - <string name="button_retry" msgid="4392027584153752797">"Tentar novamente"</string> - <string name="sort_name" msgid="9183560467917256779">"Por nome"</string> - <string name="sort_date" msgid="586080032956151448">"Por data de modificação"</string> - <string name="sort_size" msgid="3350681319735474741">"Por tamanho"</string> - <string name="drawer_open" msgid="4545466532430226949">"Mostrar raízes"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string> - <string name="save_error" msgid="6167009778003223664">"Falha ao salvar o documento"</string> - <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string> - <string name="query_error" msgid="5999895349602476581">"Não é possível carregar o conteúdo no momento"</string> - <string name="root_recent" msgid="4470053704320518133">"Recentes"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> livres"</string> - <string name="root_type_service" msgid="2178854894416775409">"Serviços de armazenamento"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Atalhos"</string> - <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Mais apps"</string> - <string name="empty" msgid="7858882803708117596">"Nenhum item"</string> - <string name="no_results" msgid="6622510343880730446">"Nenhum resultado em %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Não é possível abrir o arquivo"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Não foi possível excluir alguns documentos"</string> - <string name="share_via" msgid="8966594246261344259">"Compartilhar via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copiando arquivos"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Movendo arquivos"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Excluindo arquivos"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> restantes"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Movendo <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - <item quantity="other">Movendo <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Excluindo <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - <item quantity="other">Excluindo <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Desfazer"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Preparando para mover..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Preparando-se para excluir..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - <item quantity="other">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - <item quantity="other">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Não foi possível excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - <item quantity="other">Não foi possível excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tocar para ver detalhes"</string> - <string name="close" msgid="3043722427445528732">"Fechar"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Estes arquivos não foram copiados: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Estes arquivos não foram movidos: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Estes arquivos não foram excluídos: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Esses arquivos foram convertidos em outro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> arquivos copiados para a área de transferência.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> arquivos copiados para a área de transferência.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Não é possível colar os arquivos selecionados neste local."</string> - <string name="menu_rename" msgid="7678802479104285353">"Renomear"</string> - <string name="rename_error" msgid="4203041674883412606">"Falha ao renomear documento"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Ejetar"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alguns arquivos foram convertidos"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Conceder ao <xliff:g id="APPNAME"><b>^1</b></xliff:g> acesso ao diretório <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> no <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Conceder acesso ao diretório <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> para <xliff:g id="APPNAME"><b>^1</b></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Conceder a <xliff:g id="APPNAME"><b>^1</b></xliff:g> acesso aos seus dados, incluindo fotos e vídeos, no/na <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Não perguntar novamente"</string> - <string name="allow" msgid="7225948811296386551">"Permitir"</string> - <string name="deny" msgid="2081879885755434506">"Negar"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionado</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> itens</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> itens</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Excluir \" <xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Excluir pasta \"<xliff:g id="NAME">%1$s</xliff:g>\" e o respectivo conteúdo?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos?</item> - <item quantity="other">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> pastas e o respectivo conteúdo?</item> - <item quantity="other">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> pastas e o respectivo conteúdo?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> itens?</item> - <item quantity="other">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> itens?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml deleted file mode 100644 index f8b54a42444e..000000000000 --- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Ficheiros"</string> - <string name="downloads_label" msgid="959113951084633612">"Transferências"</string> - <string name="title_open" msgid="4353228937663917801">"Abrir de"</string> - <string name="title_save" msgid="2433679664882857999">"Guardar em"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nova pasta"</string> - <string name="menu_grid" msgid="6878021334497835259">"Vista de grelha"</string> - <string name="menu_list" msgid="7279285939892417279">"Vista de lista"</string> - <string name="menu_sort" msgid="7677740407158414452">"Ordenar por"</string> - <string name="menu_search" msgid="3816712084502856974">"Pesquisar"</string> - <string name="menu_settings" msgid="8239065133341597825">"Defin. de armazenamento"</string> - <string name="menu_open" msgid="432922957274920903">"Abrir"</string> - <string name="menu_save" msgid="2394743337684426338">"Guardar"</string> - <string name="menu_share" msgid="3075149983979628146">"Partilhar"</string> - <string name="menu_delete" msgid="8138799623850614177">"Eliminar"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Selecionar tudo"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copiar para…"</string> - <string name="menu_move" msgid="1828090633118079817">"Mover para..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nova janela"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cortar"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copiar"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Colar"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Mostrar mem. armaz. int."</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ocultar mem. armaz. int."</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tam. de fich."</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tam. de fich."</string> - <string name="button_select" msgid="527196987259139214">"Selecionar"</string> - <string name="button_copy" msgid="8706475544635021302">"Copiar"</string> - <string name="button_move" msgid="2202666023104202232">"Mover"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Ignorar"</string> - <string name="button_retry" msgid="4392027584153752797">"Tentar novamente"</string> - <string name="sort_name" msgid="9183560467917256779">"Por nome"</string> - <string name="sort_date" msgid="586080032956151448">"Por data de modificação"</string> - <string name="sort_size" msgid="3350681319735474741">"Por tamanho"</string> - <string name="drawer_open" msgid="4545466532430226949">"Mostrar raízes"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string> - <string name="save_error" msgid="6167009778003223664">"Falha ao guardar o documento"</string> - <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string> - <string name="query_error" msgid="5999895349602476581">"Não é possível carregar o conteúdo neste momento"</string> - <string name="root_recent" msgid="4470053704320518133">"Recentes"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> espaço livre"</string> - <string name="root_type_service" msgid="2178854894416775409">"Serv. de armazenamento"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Atalhos"</string> - <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Mais aplicações"</string> - <string name="empty" msgid="7858882803708117596">"Sem itens"</string> - <string name="no_results" msgid="6622510343880730446">"Sem correspondências para %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Não é possível abrir o ficheiro"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Não é possível eliminar alguns documentos"</string> - <string name="share_via" msgid="8966594246261344259">"Partilhar através de"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"A copiar ficheiros"</string> - <string name="move_notification_title" msgid="6193835179777284805">"A mover ficheiros"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Eliminar ficheiros"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Faltam <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">A copiar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> - <item quantity="one">A copiar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">A mover <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> - <item quantity="one">A mover <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">A eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros.</item> - <item quantity="one">A eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Anular"</string> - <string name="copy_preparing" msgid="3896202461003039386">"A preparar para copiar…"</string> - <string name="move_preparing" msgid="2772219441375531410">"A preparar para mover…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"A preparar para eliminar…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> - <item quantity="one">Não foi possível copiar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> - <item quantity="one">Não foi possível mover <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Não foi possível eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros</item> - <item quantity="one">Não foi possível eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Toque para ver detalhes"</string> - <string name="close" msgid="3043722427445528732">"Fechar"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Os seguintes ficheiros não foram copiados: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Os seguintes ficheiros não foram movidos: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Estes ficheiros não foram eliminados: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Estes ficheiros foram convertidos para outro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Copiou <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros para a área de transferência.</item> - <item quantity="one">Copiou <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro para a área de transferência.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Não é possível colar os ficheiros selecionados nesta localização."</string> - <string name="menu_rename" msgid="7678802479104285353">"Mudar o nome"</string> - <string name="rename_error" msgid="4203041674883412606">"Falha ao mudar o nome do documento"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Ejetar"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alguns ficheiros foram convertidos"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Pretende conceder a <xliff:g id="APPNAME"><b>^1</b></xliff:g> acesso ao diretório <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> no(a) <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Pretende conceder a <xliff:g id="APPNAME"><b>^1</b></xliff:g> acesso ao diretório <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Pretende conceder a <xliff:g id="APPNAME"><b>^1</b></xliff:g> acesso aos seus dados, incluindo fotos e vídeos, no(a) <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Não perguntar novamente"</string> - <string name="allow" msgid="7225948811296386551">"Permitir"</string> - <string name="deny" msgid="2081879885755434506">"Recusar"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selecionado</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> itens</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> item</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Pretende eliminar \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Pretende eliminar a pasta \"<xliff:g id="NAME">%1$s</xliff:g>\" e os respetivos conteúdos?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Pretende eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> ficheiros?</item> - <item quantity="one">Pretende eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> ficheiro?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Pretende eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> pastas e os respetivos conteúdos?</item> - <item quantity="one">Pretende eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> pasta e os respetivos conteúdos?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Pretende eliminar <xliff:g id="COUNT_1">%1$d</xliff:g> itens?</item> - <item quantity="one">Pretende eliminar <xliff:g id="COUNT_0">%1$d</xliff:g> item?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml deleted file mode 100644 index 21344991e1dc..000000000000 --- a/packages/DocumentsUI/res/values-pt/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Arquivos"</string> - <string name="downloads_label" msgid="959113951084633612">"Downloads"</string> - <string name="title_open" msgid="4353228937663917801">"Abrir de"</string> - <string name="title_save" msgid="2433679664882857999">"Salvar em"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nova pasta"</string> - <string name="menu_grid" msgid="6878021334497835259">"Visualização em grade"</string> - <string name="menu_list" msgid="7279285939892417279">"Visualização em lista"</string> - <string name="menu_sort" msgid="7677740407158414452">"Classificar por"</string> - <string name="menu_search" msgid="3816712084502856974">"Pesquisar"</string> - <string name="menu_settings" msgid="8239065133341597825">"Configurações de armazenamento"</string> - <string name="menu_open" msgid="432922957274920903">"Abrir"</string> - <string name="menu_save" msgid="2394743337684426338">"Salvar"</string> - <string name="menu_share" msgid="3075149983979628146">"Compartilhar"</string> - <string name="menu_delete" msgid="8138799623850614177">"Excluir"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Selecionar tudo"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copiar para..."</string> - <string name="menu_move" msgid="1828090633118079817">"Mover para..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nova janela"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cortar"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copiar"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Colar"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Mostrar armaz. interno"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ocultar armaz. interno"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Mostrar tam. do arquivo"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ocultar tam. do arquivo"</string> - <string name="button_select" msgid="527196987259139214">"Selecionar"</string> - <string name="button_copy" msgid="8706475544635021302">"Copiar"</string> - <string name="button_move" msgid="2202666023104202232">"Mover"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Dispensar"</string> - <string name="button_retry" msgid="4392027584153752797">"Tentar novamente"</string> - <string name="sort_name" msgid="9183560467917256779">"Por nome"</string> - <string name="sort_date" msgid="586080032956151448">"Por data de modificação"</string> - <string name="sort_size" msgid="3350681319735474741">"Por tamanho"</string> - <string name="drawer_open" msgid="4545466532430226949">"Mostrar raízes"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ocultar raízes"</string> - <string name="save_error" msgid="6167009778003223664">"Falha ao salvar o documento"</string> - <string name="create_error" msgid="3735649141335444215">"Falha ao criar a pasta"</string> - <string name="query_error" msgid="5999895349602476581">"Não é possível carregar o conteúdo no momento"</string> - <string name="root_recent" msgid="4470053704320518133">"Recentes"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> livres"</string> - <string name="root_type_service" msgid="2178854894416775409">"Serviços de armazenamento"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Atalhos"</string> - <string name="root_type_device" msgid="7121342474653483538">"Dispositivos"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Mais apps"</string> - <string name="empty" msgid="7858882803708117596">"Nenhum item"</string> - <string name="no_results" msgid="6622510343880730446">"Nenhum resultado em %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Não é possível abrir o arquivo"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Não foi possível excluir alguns documentos"</string> - <string name="share_via" msgid="8966594246261344259">"Compartilhar via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Copiando arquivos"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Movendo arquivos"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Excluindo arquivos"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> restantes"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - <item quantity="other">Copiando <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Movendo <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - <item quantity="other">Movendo <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Excluindo <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - <item quantity="other">Excluindo <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Desfazer"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Preparando para copiar..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Preparando para mover..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Preparando-se para excluir..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - <item quantity="other">Não foi possível copiar <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - <item quantity="other">Não foi possível mover <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Não foi possível excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - <item quantity="other">Não foi possível excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tocar para ver detalhes"</string> - <string name="close" msgid="3043722427445528732">"Fechar"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Estes arquivos não foram copiados: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Estes arquivos não foram movidos: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Estes arquivos não foram excluídos: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Esses arquivos foram convertidos em outro formato: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> arquivos copiados para a área de transferência.</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> arquivos copiados para a área de transferência.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Não é possível colar os arquivos selecionados neste local."</string> - <string name="menu_rename" msgid="7678802479104285353">"Renomear"</string> - <string name="rename_error" msgid="4203041674883412606">"Falha ao renomear documento"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Ejetar"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Alguns arquivos foram convertidos"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Conceder ao <xliff:g id="APPNAME"><b>^1</b></xliff:g> acesso ao diretório <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> no <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Conceder acesso ao diretório <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> para <xliff:g id="APPNAME"><b>^1</b></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Conceder a <xliff:g id="APPNAME"><b>^1</b></xliff:g> acesso aos seus dados, incluindo fotos e vídeos, no/na <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Não perguntar novamente"</string> - <string name="allow" msgid="7225948811296386551">"Permitir"</string> - <string name="deny" msgid="2081879885755434506">"Negar"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionado</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> itens</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> itens</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Excluir \" <xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Excluir pasta \"<xliff:g id="NAME">%1$s</xliff:g>\" e o respectivo conteúdo?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos?</item> - <item quantity="other">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> arquivos?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> pastas e o respectivo conteúdo?</item> - <item quantity="other">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> pastas e o respectivo conteúdo?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> itens?</item> - <item quantity="other">Excluir <xliff:g id="COUNT_1">%1$d</xliff:g> itens?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml deleted file mode 100644 index a10a1db19723..000000000000 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ /dev/null @@ -1,156 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fișiere"</string> - <string name="downloads_label" msgid="959113951084633612">"Descărcări"</string> - <string name="title_open" msgid="4353228937663917801">"Deschideți din"</string> - <string name="title_save" msgid="2433679664882857999">"Salvați în"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Dosar nou"</string> - <string name="menu_grid" msgid="6878021334497835259">"Afișare tip grilă"</string> - <string name="menu_list" msgid="7279285939892417279">"Afișare tip listă"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortați după"</string> - <string name="menu_search" msgid="3816712084502856974">"Căutați"</string> - <string name="menu_settings" msgid="8239065133341597825">"Setări de stocare"</string> - <string name="menu_open" msgid="432922957274920903">"Deschideți"</string> - <string name="menu_save" msgid="2394743337684426338">"Salvați"</string> - <string name="menu_share" msgid="3075149983979628146">"Distribuiți"</string> - <string name="menu_delete" msgid="8138799623850614177">"Ștergeți"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Selectați tot"</string> - <string name="menu_copy" msgid="3612326052677229148">"Copiați în…"</string> - <string name="menu_move" msgid="1828090633118079817">"Mutați în…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Fereastră nouă"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Decupați"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Copiați"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Inserați"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Afișați stocarea internă"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ascundeți stocarea internă"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Afișați dimensiunea"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ascundeți dimensiunea"</string> - <string name="button_select" msgid="527196987259139214">"Selectați"</string> - <string name="button_copy" msgid="8706475544635021302">"Copiați"</string> - <string name="button_move" msgid="2202666023104202232">"Mutați"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Închideți"</string> - <string name="button_retry" msgid="4392027584153752797">"Încercați din nou"</string> - <string name="sort_name" msgid="9183560467917256779">"După nume"</string> - <string name="sort_date" msgid="586080032956151448">"După data modificării"</string> - <string name="sort_size" msgid="3350681319735474741">"După dimensiune"</string> - <string name="drawer_open" msgid="4545466532430226949">"Afișați directoarele rădăcină"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ascundeți directoarele rădăcină"</string> - <string name="save_error" msgid="6167009778003223664">"Salvarea documentului nu a reușit"</string> - <string name="create_error" msgid="3735649141335444215">"Eroare la crearea dosarului"</string> - <string name="query_error" msgid="5999895349602476581">"Momentan, conținutul nu poate fi încărcat"</string> - <string name="root_recent" msgid="4470053704320518133">"Recente"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> spațiu liber"</string> - <string name="root_type_service" msgid="2178854894416775409">"Servicii de stocare"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Comenzi rapide"</string> - <string name="root_type_device" msgid="7121342474653483538">"Dispozitive"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Alte aplicații"</string> - <string name="empty" msgid="7858882803708117596">"Niciun element"</string> - <string name="no_results" msgid="6622510343880730446">"Niciun rezultat în %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Fișierul nu poate fi deschis"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Unele documente nu au putut fi șterse"</string> - <string name="share_via" msgid="8966594246261344259">"Trimiteți prin"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Se copiază fișierele"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Se mută fișierele"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Se șterg fișierele"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Timp rămas: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="few">Se copiază <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere.</item> - <item quantity="other">Se copiază <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere.</item> - <item quantity="one">Se copiază <xliff:g id="COUNT_0">%1$d</xliff:g> fișier.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="few">Se mută <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere.</item> - <item quantity="other">Se mută <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere.</item> - <item quantity="one">Se mută <xliff:g id="COUNT_0">%1$d</xliff:g> fișier.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="few">Se șterg <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere.</item> - <item quantity="other">Se șterg <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere.</item> - <item quantity="one">Se șterge <xliff:g id="COUNT_0">%1$d</xliff:g> fișier.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Anulați"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Se pregătește copierea..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Se pregătește mutarea…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Se pregătește ștergerea…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="few">Nu s-au putut copia <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere</item> - <item quantity="other">Nu s-au putut copia <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere</item> - <item quantity="one">Nu s-a putut copia <xliff:g id="COUNT_0">%1$d</xliff:g> fișier</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="few">Nu s-au putut muta <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere</item> - <item quantity="other">Nu s-au putut muta <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere</item> - <item quantity="one">Nu s-a putut muta <xliff:g id="COUNT_0">%1$d</xliff:g> fișier</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="few">Nu s-au putut șterge <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere</item> - <item quantity="other">Nu s-au putut șterge <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere</item> - <item quantity="one">Nu s-a putut șterge <xliff:g id="COUNT_0">%1$d</xliff:g> fișier</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Atingeți pentru a vedea detaliile"</string> - <string name="close" msgid="3043722427445528732">"Închideți"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Aceste fișiere nu au fost copiate: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Aceste fișiere nu au fost mutate: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Aceste fișiere nu au fost șterse: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Aceste fișiere au fost convertite în alt format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="few">Au fost copiate <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere în clipboard.</item> - <item quantity="other">Au fost copiate <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere în clipboard.</item> - <item quantity="one">A fost copiat <xliff:g id="COUNT_0">%1$d</xliff:g> fișier în clipboard.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Fișierele selectate nu au putut fi inserate în această locație."</string> - <string name="menu_rename" msgid="7678802479104285353">"Redenumiți"</string> - <string name="rename_error" msgid="4203041674883412606">"Documentul nu a putut fi redenumit"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Scoateți"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Unele fișiere au fost convertite"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Permiteți aplicației <xliff:g id="APPNAME"><b>^1</b></xliff:g> accesul la directorul <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> de pe <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Permiteți aplicației <xliff:g id="APPNAME"><b>^1</b></xliff:g> să acceseze directorul <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Permiteți aplicației <xliff:g id="APPNAME"><b>^1</b></xliff:g> să vă acceseze datele, inclusiv fotografiile și videoclipurile, de pe <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Nu mai întreba"</string> - <string name="allow" msgid="7225948811296386551">"Permiteți"</string> - <string name="deny" msgid="2081879885755434506">"Refuzați"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> selectate</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selectate</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selectat</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> elemente</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> de elemente</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> element</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Ștergeți „<xliff:g id="NAME">%1$s</xliff:g>”?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Ștergeți dosarul „<xliff:g id="NAME">%1$s</xliff:g>” și conținutul acestuia?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="few">Ștergeți <xliff:g id="COUNT_1">%1$d</xliff:g> fișiere?</item> - <item quantity="other">Ștergeți <xliff:g id="COUNT_1">%1$d</xliff:g> de fișiere?</item> - <item quantity="one">Ștergeți <xliff:g id="COUNT_0">%1$d</xliff:g> fișier?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="few">Ștergeți <xliff:g id="COUNT_1">%1$d</xliff:g> dosare și conținutul acestora?</item> - <item quantity="other">Ștergeți <xliff:g id="COUNT_1">%1$d</xliff:g> de dosare și conținutul acestora?</item> - <item quantity="one">Ștergeți <xliff:g id="COUNT_0">%1$d</xliff:g> dosar și conținutul acestuia?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="few">Ștergeți <xliff:g id="COUNT_1">%1$d</xliff:g> elemente?</item> - <item quantity="other">Ștergeți <xliff:g id="COUNT_1">%1$d</xliff:g> de elemente?</item> - <item quantity="one">Ștergeți <xliff:g id="COUNT_0">%1$d</xliff:g> element?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml deleted file mode 100644 index d4a3365af971..000000000000 --- a/packages/DocumentsUI/res/values-ru/strings.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Файлы"</string> - <string name="downloads_label" msgid="959113951084633612">"Загрузки"</string> - <string name="title_open" msgid="4353228937663917801">"Открыть"</string> - <string name="title_save" msgid="2433679664882857999">"Сохранить"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Создать папку"</string> - <string name="menu_grid" msgid="6878021334497835259">"Сетка"</string> - <string name="menu_list" msgid="7279285939892417279">"Список"</string> - <string name="menu_sort" msgid="7677740407158414452">"Сортировать"</string> - <string name="menu_search" msgid="3816712084502856974">"Поиск"</string> - <string name="menu_settings" msgid="8239065133341597825">"Память"</string> - <string name="menu_open" msgid="432922957274920903">"Открыть"</string> - <string name="menu_save" msgid="2394743337684426338">"Сохранить"</string> - <string name="menu_share" msgid="3075149983979628146">"Поделиться"</string> - <string name="menu_delete" msgid="8138799623850614177">"Удалить"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Выбрать все"</string> - <string name="menu_copy" msgid="3612326052677229148">"Копировать в…"</string> - <string name="menu_move" msgid="1828090633118079817">"Переместить в…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Новое окно"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Вырезать"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Копировать"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Вставить"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Внутренняя память"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Скрыть внутреннюю память"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Показать размер файлов"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Скрыть размер файлов"</string> - <string name="button_select" msgid="527196987259139214">"Выбрать"</string> - <string name="button_copy" msgid="8706475544635021302">"Копировать"</string> - <string name="button_move" msgid="2202666023104202232">"Переместить"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Скрыть"</string> - <string name="button_retry" msgid="4392027584153752797">"Повторить"</string> - <string name="sort_name" msgid="9183560467917256779">"По названию"</string> - <string name="sort_date" msgid="586080032956151448">"По дате изменения"</string> - <string name="sort_size" msgid="3350681319735474741">"По размеру"</string> - <string name="drawer_open" msgid="4545466532430226949">"Показать"</string> - <string name="drawer_close" msgid="7602734368552123318">"Скрыть"</string> - <string name="save_error" msgid="6167009778003223664">"Не удалось сохранить документ"</string> - <string name="create_error" msgid="3735649141335444215">"Не удалось создать папку"</string> - <string name="query_error" msgid="5999895349602476581">"Не удалось загрузить контент"</string> - <string name="root_recent" msgid="4470053704320518133">"Недавние"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Свободно <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Службы хранения"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Ярлыки"</string> - <string name="root_type_device" msgid="7121342474653483538">"Устройства"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Другие приложения"</string> - <string name="empty" msgid="7858882803708117596">"Ничего нет"</string> - <string name="no_results" msgid="6622510343880730446">"В \"%1$s\" ничего не найдено"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Не удалось открыть файл"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Не удалось удалить некоторые документы"</string> - <string name="share_via" msgid="8966594246261344259">"Поделиться"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Копирование файлов"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Перемещение файлов"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Удаление файлов…"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Осталось <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файл...</item> - <item quantity="few">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файла...</item> - <item quantity="many">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файлов...</item> - <item quantity="other">Копируется <xliff:g id="COUNT_1">%1$d</xliff:g> файла...</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Перемещение <xliff:g id="COUNT_1">%1$d</xliff:g> файла...</item> - <item quantity="few">Перемещение <xliff:g id="COUNT_1">%1$d</xliff:g> файлов...</item> - <item quantity="many">Перемещение <xliff:g id="COUNT_1">%1$d</xliff:g> файлов...</item> - <item quantity="other">Перемещение <xliff:g id="COUNT_1">%1$d</xliff:g> файла...</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Удаление <xliff:g id="COUNT_1">%1$d</xliff:g> файла…</item> - <item quantity="few">Удаление <xliff:g id="COUNT_1">%1$d</xliff:g> файлов…</item> - <item quantity="many">Удаление <xliff:g id="COUNT_1">%1$d</xliff:g> файлов…</item> - <item quantity="other">Удаление <xliff:g id="COUNT_1">%1$d</xliff:g> файла…</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Отменить"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Подготовка к копированию…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Подготовка…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Подготовка к удалению…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> из <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - <item quantity="many">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файлов</item> - <item quantity="other">Не удалось скопировать <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Не удалось переместить <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Не удалось переместить <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - <item quantity="many">Не удалось переместить <xliff:g id="COUNT_1">%1$d</xliff:g> файлов</item> - <item quantity="other">Не удалось переместить <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Не удалось удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Не удалось удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - <item quantity="many">Не удалось удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файлов</item> - <item quantity="other">Не удалось удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Нажмите, чтобы узнать подробности."</string> - <string name="close" msgid="3043722427445528732">"Закрыть"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Не удалось скопировать следующие файлы: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Не удалось переместить следующие файлы: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Следующие файлы не были удалены: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Формат этих файлов изменен: <xliff:g id="LIST">%1$s</xliff:g>."</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">Скопирован <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Скопировано <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - <item quantity="many">Скопировано <xliff:g id="COUNT_1">%1$d</xliff:g> файлов</item> - <item quantity="other">Скопированы <xliff:g id="COUNT_1">%1$d</xliff:g> файла</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Не удается вставить сюда выбранные файлы"</string> - <string name="menu_rename" msgid="7678802479104285353">"Переименовать"</string> - <string name="rename_error" msgid="4203041674883412606">"Не удалось переименовать документ"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Извлечь"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Формат некоторых файлов изменен"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Открыть приложению \"<xliff:g id="APPNAME"><b>^1</b></xliff:g>\" доступ к папке \"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>\" на устройстве \"<xliff:g id="STORAGE"><i>^3</i></xliff:g>\"?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Открыть приложению \"<xliff:g id="APPNAME"><b>^1</b></xliff:g>\" доступ к папке \"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>\"?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Открыть приложению \"<xliff:g id="APPNAME"><b>^1</b></xliff:g>\" доступ к вашим данным, включая фото и видео, на носителе: <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Больше не спрашивать"</string> - <string name="allow" msgid="7225948811296386551">"Разрешить"</string> - <string name="deny" msgid="2081879885755434506">"Отклонить"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="few">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="many">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Выбрано: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> объект</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> объекта</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> объектов</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> объекта</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Удалить файл \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Удалить папку \"<xliff:g id="NAME">%1$s</xliff:g>\" со всем содержимым?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файл?</item> - <item quantity="few">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файла?</item> - <item quantity="many">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файлов?</item> - <item quantity="other">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> файла?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> папку со всем содержимым?</item> - <item quantity="few">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> папки со всем содержимым?</item> - <item quantity="many">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> папок со всем содержимым?</item> - <item quantity="other">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> папки со всем содержимым?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> объект?</item> - <item quantity="few">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> объекта?</item> - <item quantity="many">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> объектов?</item> - <item quantity="other">Удалить <xliff:g id="COUNT_1">%1$d</xliff:g> объекта?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-si-rLK/strings.xml b/packages/DocumentsUI/res/values-si-rLK/strings.xml deleted file mode 100644 index 9fd9be85c99b..000000000000 --- a/packages/DocumentsUI/res/values-si-rLK/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ගොනු"</string> - <string name="downloads_label" msgid="959113951084633612">"බාගැනීම්"</string> - <string name="title_open" msgid="4353228937663917801">"විවෘත වන්නේ"</string> - <string name="title_save" msgid="2433679664882857999">"සුරකින්නේ"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"නව ෆෝල්ඩරය"</string> - <string name="menu_grid" msgid="6878021334497835259">"ජාල පෙනුම"</string> - <string name="menu_list" msgid="7279285939892417279">"ලැයිස්තු පෙනුම"</string> - <string name="menu_sort" msgid="7677740407158414452">"අනුපිළිවෙලට සකසා ඇත්තේ"</string> - <string name="menu_search" msgid="3816712084502856974">"සෙවීම"</string> - <string name="menu_settings" msgid="8239065133341597825">"ගබඩා සැකසීම්"</string> - <string name="menu_open" msgid="432922957274920903">"විවෘත කරන්න"</string> - <string name="menu_save" msgid="2394743337684426338">"සුරකින්න"</string> - <string name="menu_share" msgid="3075149983979628146">"බෙදාගන්න"</string> - <string name="menu_delete" msgid="8138799623850614177">"මකන්න"</string> - <string name="menu_select_all" msgid="8323579667348729928">"සියල්ල තෝරන්න"</string> - <string name="menu_copy" msgid="3612326052677229148">"වෙත පිටපත් කරන්න..."</string> - <string name="menu_move" msgid="1828090633118079817">"වෙත ගෙනයන්න..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"නව කවුළුව"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"කපන්න"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"පිටපත් කරන්න"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"අලවන්න"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"අභ්යන්තර ආචයනය පෙන්වන්න"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"අභ්යන්තර ආචයනය සඟවන්න"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ගොනු ප්රමණය පෙන්වන්න"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ගොනු ප්රමණය සඟවන්න"</string> - <string name="button_select" msgid="527196987259139214">"තෝරන්න"</string> - <string name="button_copy" msgid="8706475544635021302">"පිටපත් කිරීම"</string> - <string name="button_move" msgid="2202666023104202232">"ගෙන යන්න"</string> - <string name="button_dismiss" msgid="3714065566893946085">"ඉවතලන්න"</string> - <string name="button_retry" msgid="4392027584153752797">"නැවත උත්සාහ කරන්න"</string> - <string name="sort_name" msgid="9183560467917256779">"නමින්"</string> - <string name="sort_date" msgid="586080032956151448">"වෙනස් කරන ලද දිනයෙන්"</string> - <string name="sort_size" msgid="3350681319735474741">"ප්රමාණය මගින්"</string> - <string name="drawer_open" msgid="4545466532430226949">"මුල් පෙන්වන්න"</string> - <string name="drawer_close" msgid="7602734368552123318">"මුල් සඟවන්න"</string> - <string name="save_error" msgid="6167009778003223664">"ලේඛනය සුරැකීමට අපොහොසත් විය"</string> - <string name="create_error" msgid="3735649141335444215">"ෆෝල්ඩරය සැදීම අසාර්ථක විය"</string> - <string name="query_error" msgid="5999895349602476581">"මේ මොහොතේ අන්තර්ගතය පූරණය කිරීමට නොහැකිය"</string> - <string name="root_recent" msgid="4470053704320518133">"මෑත"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ඉතිරියි"</string> - <string name="root_type_service" msgid="2178854894416775409">"ආචයන සේවා"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"කෙටිමං"</string> - <string name="root_type_device" msgid="7121342474653483538">"උපාංග"</string> - <string name="root_type_apps" msgid="8838065367985945189">"තවත් යෙදුම්"</string> - <string name="empty" msgid="7858882803708117596">"අයිතම නැත"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s හි තරඟ නැත"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ගොනුව විවෘත කළ නොහැකිය"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"සමහර ලේඛන මැකීමට නොහැකි විය"</string> - <string name="share_via" msgid="8966594246261344259">"හරහා බෙදාගන්න"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ගොනු පිටපත් කරමින්"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ගොනු ගෙන යාම"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ගොනු මකමින්"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> ඉතිරියි"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් පිටපත් කරමින්.</item> - <item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් පිටපත් කරමින්.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් ගෙන යමින්.</item> - <item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් ගෙන යමින්.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g>ක් මකමින්.</item> - <item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g>ක් මකමින්.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"අස් කරන්න"</string> - <string name="copy_preparing" msgid="3896202461003039386">"පිටපතක් සඳහා සූදානම් කරමින්..."</string> - <string name="move_preparing" msgid="2772219441375531410">"ගෙන යාම සඳහා පිළියෙළ කරමින් ..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"මැකීම සඳහා සූදානම් කරමින්..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g>ක් පිටපත් කළ නොහැකි විය</item> - <item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g>ක් පිටපත් කළ නොහැකි විය</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g>ක් ගෙන යාමට නොහැකි විය</item> - <item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g>ක් ගෙන යාමට නොහැකි විය</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g>ක් මැකීමට නොහැකි විය</item> - <item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g>ක් මැකීමට නොහැකි විය</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"විස්තර බැලීමට තට්ටු කරන්න"</string> - <string name="close" msgid="3043722427445528732">"වසන්න"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"මෙම ගොනු පිටපත් නොකරන ලදී: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"මෙම ගොනු ගෙන නොයන ලදී: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"මෙම ගොනු නොමකන ලදී: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"මෙම ගොනු වෙනත් ආකෘතියකට පරිවර්තනය කරන ලදී: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">පසුරු පුවරුවට ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් පිටපත් කරන ලදි.</item> - <item quantity="other">පසුරු පුවරුවට ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් පිටපත් කරන ලදි.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"මෙම ස්ථානය තුළ තෝරාගත් ගොනු ඇලවිය නොහැක."</string> - <string name="menu_rename" msgid="7678802479104285353">"යළි නම් කරන්න"</string> - <string name="rename_error" msgid="4203041674883412606">"ලේඛනය යළි නම් කිරීම අසාර්ථක විය"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"පිටතට ගන්න"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"සමහර ගොනු පරිවර්තනය කරන ලදී"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> හට <xliff:g id="STORAGE"><i>^3</i></xliff:g> මත <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> නාමාවලිය වෙත ප්රවේශය දෙන්නද?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ප්රවේශය <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> නාමාවලිය වෙත ලබා දෙන්නද?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g> හි, ඡායාරූප සහ වීඩියෝ ඇතුළුව, ඔබේ දත්තවලට <xliff:g id="APPNAME"><b>^1</b></xliff:g> හට ප්රවේශය ලබා දෙන්නද?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"නැවත අසන්න එපා"</string> - <string name="allow" msgid="7225948811296386551">"අවසර දෙන්න"</string> - <string name="deny" msgid="2081879885755434506">"ප්රතික්ෂේප කරන්න"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g>ක් තෝරන ලදී</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g>ක් තෝරන ලදී</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one">අයිතම <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">අයිතම <xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" මකන්නද?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ෆෝල්ඩරය හා එහි අන්තර්ගත මකන්නද?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් මකන්නද?</item> - <item quantity="other">ගොනු <xliff:g id="COUNT_1">%1$d</xliff:g> ක් මකන්නද?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">ෆෝල්ඩර <xliff:g id="COUNT_1">%1$d</xliff:g> ක් හා එහි අන්තර්ගත මකන්නද?</item> - <item quantity="other">ෆෝල්ඩර <xliff:g id="COUNT_1">%1$d</xliff:g> ක් හා එහි අන්තර්ගත මකන්නද?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">අයිතම <xliff:g id="COUNT_1">%1$d</xliff:g> ක් මකන්නද?</item> - <item quantity="other">අයිතම <xliff:g id="COUNT_1">%1$d</xliff:g> ක් මකන්නද?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml deleted file mode 100644 index 1336694957ef..000000000000 --- a/packages/DocumentsUI/res/values-sk/strings.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Súbory"</string> - <string name="downloads_label" msgid="959113951084633612">"Stiahnuté súbory"</string> - <string name="title_open" msgid="4353228937663917801">"Otvoriť z"</string> - <string name="title_save" msgid="2433679664882857999">"Uložiť do"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nový priečinok"</string> - <string name="menu_grid" msgid="6878021334497835259">"Zobrazenie mriežky"</string> - <string name="menu_list" msgid="7279285939892417279">"Zobrazenie zoznamu"</string> - <string name="menu_sort" msgid="7677740407158414452">"Zoradiť podľa"</string> - <string name="menu_search" msgid="3816712084502856974">"Hľadať"</string> - <string name="menu_settings" msgid="8239065133341597825">"Nastavenia úložiska"</string> - <string name="menu_open" msgid="432922957274920903">"Otvoriť"</string> - <string name="menu_save" msgid="2394743337684426338">"Uložiť"</string> - <string name="menu_share" msgid="3075149983979628146">"Zdieľať"</string> - <string name="menu_delete" msgid="8138799623850614177">"Odstrániť"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Vybrať všetko"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopírovať do…"</string> - <string name="menu_move" msgid="1828090633118079817">"Presunúť do…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nové okno"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Vystrihnúť"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopírovať"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Prilepiť"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Zobraziť interné úložisko"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Skryť interné úložisko"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Zobraziť veľkosť súboru"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Skryť veľkosť súboru"</string> - <string name="button_select" msgid="527196987259139214">"Vybrať"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopírovať"</string> - <string name="button_move" msgid="2202666023104202232">"Presunúť"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Odmietnuť"</string> - <string name="button_retry" msgid="4392027584153752797">"Skúsiť znova"</string> - <string name="sort_name" msgid="9183560467917256779">"Podľa názvu"</string> - <string name="sort_date" msgid="586080032956151448">"Podľa dátumu zmeny"</string> - <string name="sort_size" msgid="3350681319735474741">"Podľa veľkosti"</string> - <string name="drawer_open" msgid="4545466532430226949">"Zobraziť korene"</string> - <string name="drawer_close" msgid="7602734368552123318">"Skryť korene"</string> - <string name="save_error" msgid="6167009778003223664">"Dokument sa nepodarilo uložiť"</string> - <string name="create_error" msgid="3735649141335444215">"Priečinok sa nepodarilo vytvoriť"</string> - <string name="query_error" msgid="5999895349602476581">"Obsah momentálne nie je možné načítať"</string> - <string name="root_recent" msgid="4470053704320518133">"Nedávne"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Voľné <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Služby úložiska"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Skratky"</string> - <string name="root_type_device" msgid="7121342474653483538">"Zariadenia"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Ďalšie aplikácie"</string> - <string name="empty" msgid="7858882803708117596">"Žiadne položky"</string> - <string name="no_results" msgid="6622510343880730446">"Žiadne zhody – %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Súbor nie je možné otvoriť"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Niektoré dokumenty sa nepodarilo odstrániť"</string> - <string name="share_via" msgid="8966594246261344259">"Zdieľať"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopírovanie súborov"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Presúvajú sa súbory"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Odstraňujú sa súbory"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Zostáva: <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="few">Kopírujú sa <xliff:g id="COUNT_1">%1$d</xliff:g> súbory.</item> - <item quantity="many">Kopíruje sa <xliff:g id="COUNT_1">%1$d</xliff:g> súboru.</item> - <item quantity="other">Kopíruje sa <xliff:g id="COUNT_1">%1$d</xliff:g> súborov.</item> - <item quantity="one">Kopíruje sa <xliff:g id="COUNT_0">%1$d</xliff:g> súbor.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="few">Presúvajú sa <xliff:g id="COUNT_1">%1$d</xliff:g> súbory.</item> - <item quantity="many">Presúva sa <xliff:g id="COUNT_1">%1$d</xliff:g> súboru.</item> - <item quantity="other">Presúva sa <xliff:g id="COUNT_1">%1$d</xliff:g> súborov.</item> - <item quantity="one">Presúva sa <xliff:g id="COUNT_0">%1$d</xliff:g> súbor.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="few">Odstraňujú sa <xliff:g id="COUNT_1">%1$d</xliff:g> súbory.</item> - <item quantity="many">Odstraňuje sa <xliff:g id="COUNT_1">%1$d</xliff:g> súboru.</item> - <item quantity="other">Odstraňuje sa <xliff:g id="COUNT_1">%1$d</xliff:g> súborov.</item> - <item quantity="one">Odstraňuje sa <xliff:g id="COUNT_0">%1$d</xliff:g> súbor.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Späť"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Pripravuje sa na kopírovanie..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Prebieha príprava na presunutie…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Príprava na odstránenie…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="few">Nepodarilo sa skopírovať <xliff:g id="COUNT_1">%1$d</xliff:g> súbory</item> - <item quantity="many">Nepodarilo sa skopírovať <xliff:g id="COUNT_1">%1$d</xliff:g> súboru</item> - <item quantity="other">Nepodarilo sa skopírovať <xliff:g id="COUNT_1">%1$d</xliff:g> súborov</item> - <item quantity="one">Nepodarilo sa skopírovať <xliff:g id="COUNT_0">%1$d</xliff:g> súbor</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> súbory nie je možné presunúť</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> súboru nie je možné presunúť</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> súborov nie je možné presunúť</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> súbor nie je možné presunúť</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="few">Nepodarilo sa odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súbory</item> - <item quantity="many">Nepodarilo sa odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súboru</item> - <item quantity="other">Nepodarilo sa odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súborov</item> - <item quantity="one">Nepodarilo sa odstrániť <xliff:g id="COUNT_0">%1$d</xliff:g> súbor</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Klepnutím zobrazíte podrobnosti"</string> - <string name="close" msgid="3043722427445528732">"Zavrieť"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Tieto súbory neboli skopírované: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Tieto súbory neboli presunuté: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Tieto súbory neboli odstránené: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Tieto súbory boli konvertované do iného formátu: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="few">Do schránky boli skopírované <xliff:g id="COUNT_1">%1$d</xliff:g> súbory.</item> - <item quantity="many">Do schránky bolo skopírovaného <xliff:g id="COUNT_1">%1$d</xliff:g> súboru.</item> - <item quantity="other">Do schránky bolo skopírovaných <xliff:g id="COUNT_1">%1$d</xliff:g> súborov.</item> - <item quantity="one">Do schránky bol skopírovaný <xliff:g id="COUNT_0">%1$d</xliff:g> súbor.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Do tohto umiestnenia nie je možné prilepiť vybrané súbory"</string> - <string name="menu_rename" msgid="7678802479104285353">"Premenovať"</string> - <string name="rename_error" msgid="4203041674883412606">"Premenovanie dokumentu zlyhalo"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Odpojiť"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Niektoré súbory boli konvertované"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Udeliť aplikácii <xliff:g id="APPNAME"><b>^1</b></xliff:g> prístup k adresáru <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> v úložisku <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Udeliť aplikácii <xliff:g id="APPNAME"><b>^1</b></xliff:g> prístup k adresáru <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Chcete aplikácii <xliff:g id="APPNAME"><b>^1</b></xliff:g> udeliť prístup k dátam (vrátane fotiek a videí) v úložisku <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Nabudúce sa nepýtať"</string> - <string name="allow" msgid="7225948811296386551">"Povoliť"</string> - <string name="deny" msgid="2081879885755434506">"Zamietnuť"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="few">Vybraté: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="many">Vybraté: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Vybraté: <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">Vybraté: <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> položky</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> položky</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> položiek</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> položka</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Odstrániť <xliff:g id="NAME">%1$s</xliff:g>?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Odstrániť priečinok <xliff:g id="NAME">%1$s</xliff:g> a jeho obsah?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="few">Odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súbory?</item> - <item quantity="many">Odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súboru?</item> - <item quantity="other">Odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> súborov?</item> - <item quantity="one">Odstrániť <xliff:g id="COUNT_0">%1$d</xliff:g> súbor?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="few">Odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> priečinky a ich obsah?</item> - <item quantity="many">Odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> priečinka a jeho obsah?</item> - <item quantity="other">Odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> priečinkov a ich obsah?</item> - <item quantity="one">Odstrániť <xliff:g id="COUNT_0">%1$d</xliff:g> priečinok a jeho obsah?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="few">Odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> položky?</item> - <item quantity="many">Odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> položky?</item> - <item quantity="other">Odstrániť <xliff:g id="COUNT_1">%1$d</xliff:g> položiek?</item> - <item quantity="one">Odstrániť <xliff:g id="COUNT_0">%1$d</xliff:g> položku?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-sl/strings.xml b/packages/DocumentsUI/res/values-sl/strings.xml deleted file mode 100644 index a6a5fa474b84..000000000000 --- a/packages/DocumentsUI/res/values-sl/strings.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Datoteke"</string> - <string name="downloads_label" msgid="959113951084633612">"Prenosi"</string> - <string name="title_open" msgid="4353228937663917801">"Odpri iz mape"</string> - <string name="title_save" msgid="2433679664882857999">"Shrani v"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Nova mapa"</string> - <string name="menu_grid" msgid="6878021334497835259">"Mrežni pogled"</string> - <string name="menu_list" msgid="7279285939892417279">"Pogled seznama"</string> - <string name="menu_sort" msgid="7677740407158414452">"Razvrsti glede na"</string> - <string name="menu_search" msgid="3816712084502856974">"Iskanje"</string> - <string name="menu_settings" msgid="8239065133341597825">"Nastavitve shrambe"</string> - <string name="menu_open" msgid="432922957274920903">"Odpri"</string> - <string name="menu_save" msgid="2394743337684426338">"Shrani"</string> - <string name="menu_share" msgid="3075149983979628146">"Skupna raba"</string> - <string name="menu_delete" msgid="8138799623850614177">"Izbriši"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Izberi vse"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiraj v …"</string> - <string name="menu_move" msgid="1828090633118079817">"Premakni v ..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Novo okno"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Izreži"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiraj"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Prilepi"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Pokaži notranjo shrambo"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Skrij notranjo shrambo"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Pokaži velikost datoteke"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Skrij velikost datoteke"</string> - <string name="button_select" msgid="527196987259139214">"Izberi"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiraj"</string> - <string name="button_move" msgid="2202666023104202232">"Premik"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Opusti"</string> - <string name="button_retry" msgid="4392027584153752797">"Poskusite znova"</string> - <string name="sort_name" msgid="9183560467917256779">"Po imenu"</string> - <string name="sort_date" msgid="586080032956151448">"Po datumu spremembe"</string> - <string name="sort_size" msgid="3350681319735474741">"Po velikosti"</string> - <string name="drawer_open" msgid="4545466532430226949">"Pokaži korene"</string> - <string name="drawer_close" msgid="7602734368552123318">"Skrij korene"</string> - <string name="save_error" msgid="6167009778003223664">"Dokumenta ni bilo mogoče shraniti"</string> - <string name="create_error" msgid="3735649141335444215">"Mape ni bilo mogoče ustvariti"</string> - <string name="query_error" msgid="5999895349602476581">"Vsebine trenutno ni mogoče naložiti"</string> - <string name="root_recent" msgid="4470053704320518133">"Nedavno"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Prosto: <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Storitve shrambe"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Bližnjice"</string> - <string name="root_type_device" msgid="7121342474653483538">"Naprave"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Več aplikacij"</string> - <string name="empty" msgid="7858882803708117596">"Ni elementov"</string> - <string name="no_results" msgid="6622510343880730446">"Tukaj ni ujemanj: %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Datoteke ni mogoče odpreti"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Nekaterih dokumentov ni mogoče izbrisati"</string> - <string name="share_via" msgid="8966594246261344259">"Deli z drugimi prek"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopiranje datotek"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Premikanje datotek"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Brisanje datotek"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Še <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="two">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> - <item quantity="few">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> - <item quantity="other">Kopiranje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Premikanje <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="two">Premikanje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> - <item quantity="few">Premikanje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> - <item quantity="other">Premikanje <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Izbris <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke</item> - <item quantity="two">Izbris <xliff:g id="COUNT_1">%1$d</xliff:g> datotek</item> - <item quantity="few">Izbris <xliff:g id="COUNT_1">%1$d</xliff:g> datotek</item> - <item quantity="other">Izbris <xliff:g id="COUNT_1">%1$d</xliff:g> datotek</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Razveljavi"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Pripravljanje na kopiranje …"</string> - <string name="move_preparing" msgid="2772219441375531410">"Priprava na premikanje …"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Pripravljanje na izbris …"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteke ni bilo mogoče kopirati</item> - <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> datotek ni bilo mogoče kopirati</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> datotek ni bilo mogoče kopirati</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> datotek ni bilo mogoče kopirati</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteke ni bilo mogoče premakniti</item> - <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> datotek ni bilo mogoče premakniti</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> datotek ni bilo mogoče premakniti</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> datotek ni bilo mogoče premakniti</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> datoteke ni bilo mogoče izbrisati</item> - <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> datotek ni bilo mogoče izbrisati</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> datotek ni bilo mogoče izbrisati</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> datotek ni bilo mogoče izbrisati</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Dotaknite se za prikaz podrobnosti"</string> - <string name="close" msgid="3043722427445528732">"Zapri"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Te datoteke niso bile kopirane: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Te datoteke niso bile premaknjene: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Te datoteke niso bile izbrisane: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Te datoteke so bile spremenjene v drugo obliko zapisa: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">V odložišče je bila kopirana <xliff:g id="COUNT_1">%1$d</xliff:g> datoteka.</item> - <item quantity="two">V odložišče sta bili kopirani <xliff:g id="COUNT_1">%1$d</xliff:g> datoteki.</item> - <item quantity="few">V odložišče so bile kopirane <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke.</item> - <item quantity="other">V odložišče je bilo kopiranih <xliff:g id="COUNT_1">%1$d</xliff:g> datotek.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Izbranih datotek ni mogoče prilepiti sem."</string> - <string name="menu_rename" msgid="7678802479104285353">"Preimenuj"</string> - <string name="rename_error" msgid="4203041674883412606">"Dokumenta ni bilo mogoče preimenovati"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Izvrzi"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Nekatere datoteke so bile pretvorjene"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Želite aplikaciji <xliff:g id="APPNAME"><b>^1</b></xliff:g> dovoliti dostop do imenika <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> v shrambi <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Želite aplikaciji <xliff:g id="APPNAME"><b>^1</b></xliff:g> dovoliti dostop do imenika <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Odobrite aplikaciji <xliff:g id="APPNAME"><b>^1</b></xliff:g> dostop do podatkov, vključno s fotografijami in videoposnetki, v shrambi <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ne sprašuj več"</string> - <string name="allow" msgid="7225948811296386551">"Dovoli"</string> - <string name="deny" msgid="2081879885755434506">"Zavrni"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> izbran</item> - <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> izbrana</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> izbrani</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> izbranih</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> element</item> - <item quantity="two"><xliff:g id="COUNT_1">%1$d</xliff:g> elementa</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> elementi</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> elementov</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Ali želite izbrisati »<xliff:g id="NAME">%1$s</xliff:g>«?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Ali želite izbrisati mapo »<xliff:g id="NAME">%1$s</xliff:g>« in njeno vsebino?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> datoteko?</item> - <item quantity="two">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> datoteki?</item> - <item quantity="few">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> datoteke?</item> - <item quantity="other">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> datotek?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> mapo in njihovo vsebino?</item> - <item quantity="two">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> mapi in njihovo vsebino?</item> - <item quantity="few">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> mape in njihovo vsebino?</item> - <item quantity="other">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> map in njihovo vsebino?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> element?</item> - <item quantity="two">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> elementa?</item> - <item quantity="few">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> elemente?</item> - <item quantity="other">Ali želite izbrisati <xliff:g id="COUNT_1">%1$d</xliff:g> elementov?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-sq-rAL/strings.xml b/packages/DocumentsUI/res/values-sq-rAL/strings.xml deleted file mode 100644 index 0f041a34baa6..000000000000 --- a/packages/DocumentsUI/res/values-sq-rAL/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Skedarët"</string> - <string name="downloads_label" msgid="959113951084633612">"Shkarkimet"</string> - <string name="title_open" msgid="4353228937663917801">"Hap nga"</string> - <string name="title_save" msgid="2433679664882857999">"Ruaje te"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Dosje e re"</string> - <string name="menu_grid" msgid="6878021334497835259">"Pamje rrjete"</string> - <string name="menu_list" msgid="7279285939892417279">"Pamje liste"</string> - <string name="menu_sort" msgid="7677740407158414452">"Rendit sipas"</string> - <string name="menu_search" msgid="3816712084502856974">"Kërko"</string> - <string name="menu_settings" msgid="8239065133341597825">"Cilësimet e hapësirës ruajtëse"</string> - <string name="menu_open" msgid="432922957274920903">"Hap"</string> - <string name="menu_save" msgid="2394743337684426338">"Ruaj"</string> - <string name="menu_share" msgid="3075149983979628146">"Shpërnda"</string> - <string name="menu_delete" msgid="8138799623850614177">"Fshi"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Zgjidhi të gjitha"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopjo te..."</string> - <string name="menu_move" msgid="1828090633118079817">"Zhvendos te..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Dritare e re"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Prit"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopjo"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Ngjit"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Trego hapësirën e brendshme ruajtëse"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Fshih hapësirën ruajtëse të brendshme"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Shfaq madhësinë e skedarit"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Fshih madhësinë e skedarit"</string> - <string name="button_select" msgid="527196987259139214">"Zgjidh"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopjo"</string> - <string name="button_move" msgid="2202666023104202232">"Zhvendos"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Largoje"</string> - <string name="button_retry" msgid="4392027584153752797">"Provo sërish"</string> - <string name="sort_name" msgid="9183560467917256779">"Sipas emrit"</string> - <string name="sort_date" msgid="586080032956151448">"Sipas datës së modifikimit"</string> - <string name="sort_size" msgid="3350681319735474741">"Sipas madhësisë"</string> - <string name="drawer_open" msgid="4545466532430226949">"Trego rrënjët"</string> - <string name="drawer_close" msgid="7602734368552123318">"Fshih rrënjët"</string> - <string name="save_error" msgid="6167009778003223664">"Ruajtja e dokumentit dështoi"</string> - <string name="create_error" msgid="3735649141335444215">"Krijimi i dosjes dështoi"</string> - <string name="query_error" msgid="5999895349602476581">"Përmbajtja nuk mund të ngarkohet për momentin"</string> - <string name="root_recent" msgid="4470053704320518133">"Të kohëve të fundit"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Të lirë: <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Shërbimet e hapësirës ruajtëse"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Shkurtore"</string> - <string name="root_type_device" msgid="7121342474653483538">"Pajisjet"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Aplikacione të tjera"</string> - <string name="empty" msgid="7858882803708117596">"Nuk ka artikuj"</string> - <string name="no_results" msgid="6622510343880730446">"Nuk ka asnjë përputhje në %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Skedari nuk mund të hapet"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"E pamundur të fshihen disa dokumente"</string> - <string name="share_via" msgid="8966594246261344259">"Shpërnda publikisht përmes"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Po kopjon skedarët"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Po zhvendos skedarët"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Po fshin skedarët"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> të mbetura"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Po kopjon <xliff:g id="COUNT_1">%1$d</xliff:g> skedarë.</item> - <item quantity="one">Po kopjon <xliff:g id="COUNT_0">%1$d</xliff:g> skedar.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Po zhvendos <xliff:g id="COUNT_1">%1$d</xliff:g> skedarë.</item> - <item quantity="one">Po zhvendos <xliff:g id="COUNT_0">%1$d</xliff:g> skedar.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Po fshin <xliff:g id="COUNT_1">%1$d</xliff:g> skedarë.</item> - <item quantity="one">Po fshin <xliff:g id="COUNT_0">%1$d</xliff:g> skedar.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Zhbëj"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Po përgatitet për kopjimin…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Po përgatitet për zhvendosjen…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Po përgatitet për fshirje…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> skedarë nuk mund të kopjoheshin</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> skedar nuk mund të kopjohej</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> skedarë nuk mund të zhvendoseshin</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> skedar nuk mund të zhvendosej</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> skedarë nuk mund të fshiheshin</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> skedar nuk mund të fshihej</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Trokit për të parë detajet"</string> - <string name="close" msgid="3043722427445528732">"Mbyll"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Këta skedarë nuk u kopjuan: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Këta skedarë nuk u zhvendosën: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Këta skedarë nuk u fshinë: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Këta skedarë janë konvertuar në format tjetër: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">U kopjuan <xliff:g id="COUNT_1">%1$d</xliff:g> skedarë në kujtesën e fragmenteve.</item> - <item quantity="one">U kopjua <xliff:g id="COUNT_0">%1$d</xliff:g> skedar në kujtesën e fragmenteve.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Skedarët e zgjedhur nuk mund të ngjiten në këtë vendndodhje."</string> - <string name="menu_rename" msgid="7678802479104285353">"Riemërto"</string> - <string name="rename_error" msgid="4203041674883412606">"Riemërtimi i dokumentit dështoi"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Nxirr"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Disa skedarë u konvertuan"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Jepi aplikacionit <xliff:g id="APPNAME"><b>^1</b></xliff:g> qasje te direktoria <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> në <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"T\'i jepet aplikacionit <xliff:g id="APPNAME"><b>^1</b></xliff:g> qasje te direktoria <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"T\'i jepet aplikacionit <xliff:g id="APPNAME"><b>^1</b></xliff:g> qasje te të dhënat, duke përfshirë fotografitë dhe videot, në <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Mos pyet përsëri"</string> - <string name="allow" msgid="7225948811296386551">"Lejo"</string> - <string name="deny" msgid="2081879885755434506">"Moho"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> të zgjedhur</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> i zgjedhur</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> artikuj</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> artikull</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Të fshihet \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Të fshihet dosja \"<xliff:g id="NAME">%1$s</xliff:g>\" dhe përmbajtja e saj?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Të fshihen <xliff:g id="COUNT_1">%1$d</xliff:g> skedarë?</item> - <item quantity="one">Të fshihet <xliff:g id="COUNT_0">%1$d</xliff:g> skedar?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Të fshihen <xliff:g id="COUNT_1">%1$d</xliff:g> dosje dhe përmbajtjet e saj?</item> - <item quantity="one">Të fshihet <xliff:g id="COUNT_0">%1$d</xliff:g> dosje dhe përmbajtjet e saj?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Të fshihen <xliff:g id="COUNT_1">%1$d</xliff:g> artikuj?</item> - <item quantity="one">Të fshihet <xliff:g id="COUNT_0">%1$d</xliff:g> artikull?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml deleted file mode 100644 index cd2e4dfd6085..000000000000 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ /dev/null @@ -1,156 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Датотеке"</string> - <string name="downloads_label" msgid="959113951084633612">"Преузимања"</string> - <string name="title_open" msgid="4353228937663917801">"Отвори са"</string> - <string name="title_save" msgid="2433679664882857999">"Сачувај у"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Нови директоријум"</string> - <string name="menu_grid" msgid="6878021334497835259">"Приказ мреже"</string> - <string name="menu_list" msgid="7279285939892417279">"Приказ листе"</string> - <string name="menu_sort" msgid="7677740407158414452">"Сортирај према"</string> - <string name="menu_search" msgid="3816712084502856974">"Претражи"</string> - <string name="menu_settings" msgid="8239065133341597825">"Подешавања меморије"</string> - <string name="menu_open" msgid="432922957274920903">"Отвори"</string> - <string name="menu_save" msgid="2394743337684426338">"Сачувај"</string> - <string name="menu_share" msgid="3075149983979628146">"Дели"</string> - <string name="menu_delete" msgid="8138799623850614177">"Избриши"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Изабери све"</string> - <string name="menu_copy" msgid="3612326052677229148">"Копирај на..."</string> - <string name="menu_move" msgid="1828090633118079817">"Премести у..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Нови прозор"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Исеци"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Копирај"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Налепи"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Прикажи интерну меморију"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Сакриј интерну меморију"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Прикажи величину датотеке"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Сакриј величину датотеке"</string> - <string name="button_select" msgid="527196987259139214">"Изабери"</string> - <string name="button_copy" msgid="8706475544635021302">"Копирај"</string> - <string name="button_move" msgid="2202666023104202232">"Премести"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Одбаци"</string> - <string name="button_retry" msgid="4392027584153752797">"Покушај поново"</string> - <string name="sort_name" msgid="9183560467917256779">"Према имену"</string> - <string name="sort_date" msgid="586080032956151448">"Према датуму измене"</string> - <string name="sort_size" msgid="3350681319735474741">"Према величини"</string> - <string name="drawer_open" msgid="4545466532430226949">"Прикажи основне елементе"</string> - <string name="drawer_close" msgid="7602734368552123318">"Сакриј основне елементе"</string> - <string name="save_error" msgid="6167009778003223664">"Чување документа није успело"</string> - <string name="create_error" msgid="3735649141335444215">"Директоријум није направљен"</string> - <string name="query_error" msgid="5999895349602476581">"Учитавање садржаја тренутно није могуће"</string> - <string name="root_recent" msgid="4470053704320518133">"Недавно"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"Слободно је <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"Услуге складиштења"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Пречице"</string> - <string name="root_type_device" msgid="7121342474653483538">"Уређаји"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Још апликација"</string> - <string name="empty" msgid="7858882803708117596">"Нема ставки"</string> - <string name="no_results" msgid="6622510343880730446">"Нема подударања у %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Отварање датотеке није успело"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Није могуће избрисати неке документе"</string> - <string name="share_via" msgid="8966594246261344259">"Делите преко"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Копирање датотека"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Датотеке се премештају"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Датотеке се бришу"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Још <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке.</item> - <item quantity="few">Копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке.</item> - <item quantity="other">Копирање <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Премешта се <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> - <item quantity="few">Премештају се <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке.</item> - <item quantity="other">Премешта се <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Брише се <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> - <item quantity="few">Бришу се <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке.</item> - <item quantity="other">Брише се <xliff:g id="COUNT_1">%1$d</xliff:g> датотека.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Опозови"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Припрема се копирање…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Припрема се премештање..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Припрема се брисање…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Нисмо успели да копирамо <xliff:g id="COUNT_1">%1$d</xliff:g> датотеку</item> - <item quantity="few">Нисмо успели да копирамо <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке</item> - <item quantity="other">Нисмо успели да копирамо <xliff:g id="COUNT_1">%1$d</xliff:g> датотека</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Премештање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке није успело</item> - <item quantity="few">Премештање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке није успело</item> - <item quantity="other">Премештање <xliff:g id="COUNT_1">%1$d</xliff:g> датотека није успело</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Брисање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке није успело</item> - <item quantity="few">Брисање <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке није успело</item> - <item quantity="other">Брисање <xliff:g id="COUNT_1">%1$d</xliff:g> датотека није успело</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Додирните да бисте приказали детаље"</string> - <string name="close" msgid="3043722427445528732">"Затвори"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Следеће датотеке нису копиране: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Следеће датотеке нису премештене: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Следеће датотеке нису избрисане: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ове датотеке су конвертоване у други формат: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">Копирали сте <xliff:g id="COUNT_1">%1$d</xliff:g> датотеку у привремену меморију.</item> - <item quantity="few">Копирали сте <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке у привремену меморију.</item> - <item quantity="other">Копирали сте <xliff:g id="COUNT_1">%1$d</xliff:g> датотека у привремену меморију.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Изабране датотеке не могу да се налепе на овој локацији."</string> - <string name="menu_rename" msgid="7678802479104285353">"Преименуј"</string> - <string name="rename_error" msgid="4203041674883412606">"Преименовање документа није успело"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Избаци"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Неке датотеке су конвертоване"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Желите ли да апликацији <xliff:g id="APPNAME"><b>^1</b></xliff:g> одобрите приступ директоријуму <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> на меморијском простору <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Желите да дозволите да <xliff:g id="APPNAME"><b>^1</b></xliff:g> приступа директоријуму <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Желите да ли да дозволите да апликација <xliff:g id="APPNAME"><b>^1</b></xliff:g> приступа подацима, укључујући слике и видео снимке, на локацији <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Не питај поново"</string> - <string name="allow" msgid="7225948811296386551">"Дозволи"</string> - <string name="deny" msgid="2081879885755434506">"Одбиј"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one">Изабрана је <xliff:g id="COUNT_1">%1$d</xliff:g> ставка</item> - <item quantity="few">Изабране су <xliff:g id="COUNT_1">%1$d</xliff:g> ставке</item> - <item quantity="other">Изабрано је <xliff:g id="COUNT_1">%1$d</xliff:g> ставки</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ставка</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> ставке</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ставки</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Желите ли да избришете „<xliff:g id="NAME">%1$s</xliff:g>“?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Желите ли да избришете директоријум „<xliff:g id="NAME">%1$s</xliff:g>“ и његов садржај?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Желите ли да избришете <xliff:g id="COUNT_1">%1$d</xliff:g> датотеку?</item> - <item quantity="few">Желите ли да избришете <xliff:g id="COUNT_1">%1$d</xliff:g> датотеке?</item> - <item quantity="other">Желите ли да избришете <xliff:g id="COUNT_1">%1$d</xliff:g> датотека?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Желите ли да избришете <xliff:g id="COUNT_1">%1$d</xliff:g> директоријум и њихов садржај?</item> - <item quantity="few">Желите ли да избришете <xliff:g id="COUNT_1">%1$d</xliff:g> директоријума и њихов садржај?</item> - <item quantity="other">Желите ли да избришете <xliff:g id="COUNT_1">%1$d</xliff:g> директоријума и њихов садржај?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Желите ли да избришете <xliff:g id="COUNT_1">%1$d</xliff:g> ставку?</item> - <item quantity="few">Желите ли да избришете <xliff:g id="COUNT_1">%1$d</xliff:g> ставке?</item> - <item quantity="other">Желите ли да избришете <xliff:g id="COUNT_1">%1$d</xliff:g> ставки?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml deleted file mode 100644 index 4f23527dd951..000000000000 --- a/packages/DocumentsUI/res/values-sv/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Filer"</string> - <string name="downloads_label" msgid="959113951084633612">"Nedladdningar"</string> - <string name="title_open" msgid="4353228937663917801">"Öppna från"</string> - <string name="title_save" msgid="2433679664882857999">"Spara till"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Ny mapp"</string> - <string name="menu_grid" msgid="6878021334497835259">"Rutnätsvy"</string> - <string name="menu_list" msgid="7279285939892417279">"Listvy"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sortera efter"</string> - <string name="menu_search" msgid="3816712084502856974">"Sök"</string> - <string name="menu_settings" msgid="8239065133341597825">"Lagringsinställningar"</string> - <string name="menu_open" msgid="432922957274920903">"Öppna"</string> - <string name="menu_save" msgid="2394743337684426338">"Spara"</string> - <string name="menu_share" msgid="3075149983979628146">"Dela"</string> - <string name="menu_delete" msgid="8138799623850614177">"Ta bort"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Markera allt"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopiera till …"</string> - <string name="menu_move" msgid="1828090633118079817">"Flytta till ..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Nytt fönster"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Klipp ut"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopiera"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Klistra in"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Visa internminne"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Dölj internminne"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Visa filstorlek"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Dölj filstorlek"</string> - <string name="button_select" msgid="527196987259139214">"Välj"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopiera"</string> - <string name="button_move" msgid="2202666023104202232">"Flytta"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Ta bort permanent"</string> - <string name="button_retry" msgid="4392027584153752797">"Försök igen"</string> - <string name="sort_name" msgid="9183560467917256779">"Efter namn"</string> - <string name="sort_date" msgid="586080032956151448">"Efter ändringsdatum"</string> - <string name="sort_size" msgid="3350681319735474741">"Efter storlek"</string> - <string name="drawer_open" msgid="4545466532430226949">"Visa rötter"</string> - <string name="drawer_close" msgid="7602734368552123318">"Dölj rötter"</string> - <string name="save_error" msgid="6167009778003223664">"Det gick inte att spara dokumentet"</string> - <string name="create_error" msgid="3735649141335444215">"Det gick inte att skapa mappen"</string> - <string name="query_error" msgid="5999895349602476581">"Det går inte att läsa in innehållet just nu"</string> - <string name="root_recent" msgid="4470053704320518133">"Senaste"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ledigt"</string> - <string name="root_type_service" msgid="2178854894416775409">"Lagringstjänster"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Genvägar"</string> - <string name="root_type_device" msgid="7121342474653483538">"Enheter"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Fler appar"</string> - <string name="empty" msgid="7858882803708117596">"Inga objekt"</string> - <string name="no_results" msgid="6622510343880730446">"Det finns inga träffar i %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Det går inte att öppna filen"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Det gick inte att ta bort vissa dokument"</string> - <string name="share_via" msgid="8966594246261344259">"Dela via"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kopierar filer"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Filer flyttas"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Filerna tas bort"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> återstår"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Kopierar <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - <item quantity="one">Kopierar <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Flyttar <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - <item quantity="one">Flyttar <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Raderar <xliff:g id="COUNT_1">%1$d</xliff:g> filer.</item> - <item quantity="one">Raderar <xliff:g id="COUNT_0">%1$d</xliff:g> fil.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Ångra"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Kopieringen förbereds …"</string> - <string name="move_preparing" msgid="2772219441375531410">"Förbereder för att flytta …"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Radering förbereds …"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Det gick inte att kopiera <xliff:g id="COUNT_1">%1$d</xliff:g> filer</item> - <item quantity="one">Det gick inte att kopiera <xliff:g id="COUNT_0">%1$d</xliff:g> fil</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Det gick inte att flytta <xliff:g id="COUNT_1">%1$d</xliff:g> filer</item> - <item quantity="one">Det gick inte att flytta <xliff:g id="COUNT_0">%1$d</xliff:g> fil</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Det gick inte att radera <xliff:g id="COUNT_1">%1$d</xliff:g> filer</item> - <item quantity="one">Det gick inte att radera <xliff:g id="COUNT_0">%1$d</xliff:g> fil</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Tryck om du vill visa informationen"</string> - <string name="close" msgid="3043722427445528732">"Stäng"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Följande filer kopierades inte: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Följande filer flyttades inte: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Följande filer raderades inte: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Filerna konverterades till ett annat format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> filer har kopierats till Urklipp.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> fil har kopierats till Urklipp.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Det går inte att klistra in den valda filen på den här platsen."</string> - <string name="menu_rename" msgid="7678802479104285353">"Byt namn"</string> - <string name="rename_error" msgid="4203041674883412606">"Det gick inte att byta namn på dokumentet"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Mata ut"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Vissa filer konverterades"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Vill du ge <xliff:g id="APPNAME"><b>^1</b></xliff:g> åtkomst till katalogen <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> på <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Vill du ge <xliff:g id="APPNAME"><b>^1</b></xliff:g> åtkomst till katalogen <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Vill du ge <xliff:g id="APPNAME"><b>^1</b></xliff:g> åtkomst till din data (inklusive foton och videor) på <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Fråga inte igen"</string> - <string name="allow" msgid="7225948811296386551">"Tillåt"</string> - <string name="deny" msgid="2081879885755434506">"Neka"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> har valts</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> har valts</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> objekt</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> objekt</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Vill du radera <xliff:g id="NAME">%1$s</xliff:g>?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Vill du radera mappen <xliff:g id="NAME">%1$s</xliff:g> och dess innehåll?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Vill du radera <xliff:g id="COUNT_1">%1$d</xliff:g> filer?</item> - <item quantity="one">Vill du radera <xliff:g id="COUNT_0">%1$d</xliff:g> fil?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Vill du radera <xliff:g id="COUNT_1">%1$d</xliff:g> mappar och deras innehåll?</item> - <item quantity="one">Vill du radera <xliff:g id="COUNT_0">%1$d</xliff:g> mapp och dess innehåll?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Vill du radera <xliff:g id="COUNT_1">%1$d</xliff:g> objekt?</item> - <item quantity="one">Vill du radera <xliff:g id="COUNT_0">%1$d</xliff:g> objekt?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml deleted file mode 100644 index ac635821555e..000000000000 --- a/packages/DocumentsUI/res/values-sw/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Faili"</string> - <string name="downloads_label" msgid="959113951084633612">"Vipakuliwa"</string> - <string name="title_open" msgid="4353228937663917801">"Fungua kutoka"</string> - <string name="title_save" msgid="2433679664882857999">"Hifadhi kwenye"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Folda mpya"</string> - <string name="menu_grid" msgid="6878021334497835259">"Mwonekano gridi"</string> - <string name="menu_list" msgid="7279285939892417279">"Mwonekano orodha"</string> - <string name="menu_sort" msgid="7677740407158414452">"Panga kwa"</string> - <string name="menu_search" msgid="3816712084502856974">"Utafutaji"</string> - <string name="menu_settings" msgid="8239065133341597825">"Mipangilio ya hifadhi"</string> - <string name="menu_open" msgid="432922957274920903">"Fungua"</string> - <string name="menu_save" msgid="2394743337684426338">"Hifadhi"</string> - <string name="menu_share" msgid="3075149983979628146">"Shiriki"</string> - <string name="menu_delete" msgid="8138799623850614177">"Futa"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Chagua zote"</string> - <string name="menu_copy" msgid="3612326052677229148">"Nakili kwenda..."</string> - <string name="menu_move" msgid="1828090633118079817">"Hamisha hadi..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Dirisha jipya"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Kata"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Nakili"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Bandika"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Onyesha hifadhi ya ndani"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ficha hifadhi ya ndani"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Onyesha ukubwa wa faili"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ficha ukubwa wa faili"</string> - <string name="button_select" msgid="527196987259139214">"Teua"</string> - <string name="button_copy" msgid="8706475544635021302">"Nakili"</string> - <string name="button_move" msgid="2202666023104202232">"Hamisha"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Ondoa"</string> - <string name="button_retry" msgid="4392027584153752797">"Jaribu Tena"</string> - <string name="sort_name" msgid="9183560467917256779">"Kwa jina"</string> - <string name="sort_date" msgid="586080032956151448">"Kwa tarehe viliporekebishwa"</string> - <string name="sort_size" msgid="3350681319735474741">"Kwa ukubwa"</string> - <string name="drawer_open" msgid="4545466532430226949">"Onyesha usuli"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ficha usuli"</string> - <string name="save_error" msgid="6167009778003223664">"Imeshindwa kuhifadhi hati"</string> - <string name="create_error" msgid="3735649141335444215">"Ilishindwa kuunda folda"</string> - <string name="query_error" msgid="5999895349602476581">"Haiwezi kupakia maudhui kwa sasa"</string> - <string name="root_recent" msgid="4470053704320518133">"Za hivi karibuni"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bila malipo"</string> - <string name="root_type_service" msgid="2178854894416775409">"Huduma za hifadhi"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Njia za mkato"</string> - <string name="root_type_device" msgid="7121342474653483538">"Vifaa"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Programu zaidi"</string> - <string name="empty" msgid="7858882803708117596">"Hakuna chochote"</string> - <string name="no_results" msgid="6622510343880730446">"Hakuna zinazolingana katika %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Haiwezi kufungua faili"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Imeshindwa kufuta baadhi ya hati"</string> - <string name="share_via" msgid="8966594246261344259">"Shiriki kupitia"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Inanakili faili"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Inahamisha faili"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Inafuta faili"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Zimesalia <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Inanakili faili <xliff:g id="COUNT_1">%1$d</xliff:g>.</item> - <item quantity="one">Inanakili faili <xliff:g id="COUNT_0">%1$d</xliff:g>.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Inahamisha faili <xliff:g id="COUNT_1">%1$d</xliff:g>.</item> - <item quantity="one">Inahamisha faili <xliff:g id="COUNT_0">%1$d</xliff:g>.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Inafuta faili <xliff:g id="COUNT_1">%1$d</xliff:g>.</item> - <item quantity="one">Inafuta faili <xliff:g id="COUNT_0">%1$d</xliff:g>.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Tendua"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Inaanda kunakili..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Inatayarisha kuhamisha..."</string> - <string name="delete_preparing" msgid="5655813182533491992">"Inajitayarisha kufuta..."</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Haikuweza kunakili faili <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">Haikuweza kunakili faili <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Haikuweza kuhamisha faili <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">Haikuweza kuhamisha faili <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Haikuweza kufuta faili <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">Haikuweza kufuta faili <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Gonga ili uangalie maelezo"</string> - <string name="close" msgid="3043722427445528732">"Funga"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Haikunakili faili zifuatazo: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Haikuhamisha faili zifuatazo: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Imeshindwa kufuta faili zifuatazo: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Faili hizi zimebadilishwa muundo. <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Alinakili faili <xliff:g id="COUNT_1">%1$d</xliff:g> kwenye ubao wa kunakili.</item> - <item quantity="one">Alinakili faili <xliff:g id="COUNT_0">%1$d</xliff:g> kwenye ubao wa kunakili.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Haiwezi kubandika faili zilizochaguliwa katika eneo hili."</string> - <string name="menu_rename" msgid="7678802479104285353">"Badilisha jina"</string> - <string name="rename_error" msgid="4203041674883412606">"Imeshindwa kubadilisha jina la hati"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Ondoa"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Baadhi ya faili zimebadilishwa muundo"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Ungependa kuruhusu <xliff:g id="APPNAME"><b>^1</b></xliff:g> ifikie saraka ya <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> kwenye <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Ungependa kuruhusu <xliff:g id="APPNAME"><b>^1</b></xliff:g> ifikie saraka ya <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Ungependa kuruhusu <xliff:g id="APPNAME"><b>^1</b></xliff:g> ifikie data yako, ikiwa ni pamoja na picha na video kwenye <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Usiniulize tena"</string> - <string name="allow" msgid="7225948811296386551">"Ruhusu"</string> - <string name="deny" msgid="2081879885755434506">"Kataza"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> zimechaguliwa</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> imechaguliwa</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other">Vipengee <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">Kipengee <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Ungependa kufuta \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Ungependa kufuta folda ya \"<xliff:g id="NAME">%1$s</xliff:g>\" na maudhui yake?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Ungependa kufuta faili <xliff:g id="COUNT_1">%1$d</xliff:g>?</item> - <item quantity="one">Ungependa kufuta faili <xliff:g id="COUNT_0">%1$d</xliff:g>?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Ungependa kufuta folda <xliff:g id="COUNT_1">%1$d</xliff:g> na maudhui yaliyomo?</item> - <item quantity="one">Ungependa kufuta folda <xliff:g id="COUNT_0">%1$d</xliff:g> na maudhui yaliyomo?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Ungependa kufuta vipengee <xliff:g id="COUNT_1">%1$d</xliff:g>?</item> - <item quantity="one">Ungependa kufuta kipengee <xliff:g id="COUNT_0">%1$d</xliff:g>?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-sw600dp/dimens.xml b/packages/DocumentsUI/res/values-sw600dp/dimens.xml deleted file mode 100644 index 642ff7e9a500..000000000000 --- a/packages/DocumentsUI/res/values-sw600dp/dimens.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<resources> - <dimen name="root_icon_margin">8dp</dimen> -</resources> diff --git a/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml b/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml deleted file mode 100644 index 1b67ee50ca7d..000000000000 --- a/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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> - <dimen name="list_item_height">64dp</dimen> - <dimen name="list_item_padding">24dp</dimen> - - <dimen name="list_divider_inset">80dp</dimen> - - <dimen name="max_drawer_width">320dp</dimen> -</resources> diff --git a/packages/DocumentsUI/res/values-sw720dp-land/layouts.xml b/packages/DocumentsUI/res/values-sw720dp-land/layouts.xml deleted file mode 100644 index 0e1807ce165b..000000000000 --- a/packages/DocumentsUI/res/values-sw720dp-land/layouts.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<resources> - <item name="files_activity" type="layout">@layout/fixed_layout</item> -</resources> diff --git a/packages/DocumentsUI/res/values-sw720dp/colors.xml b/packages/DocumentsUI/res/values-sw720dp/colors.xml deleted file mode 100644 index 3ecafe29c8c4..000000000000 --- a/packages/DocumentsUI/res/values-sw720dp/colors.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<resources> - <color name="menu_search_background">#ff676f74</color> -</resources> diff --git a/packages/DocumentsUI/res/values-sw720dp/config.xml b/packages/DocumentsUI/res/values-sw720dp/config.xml deleted file mode 100644 index 4898e74a6146..000000000000 --- a/packages/DocumentsUI/res/values-sw720dp/config.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<resources> - <!-- Indicates if search view is taking the whole toolbar space --> - <bool name="full_bar_search_view">false</bool> -</resources> diff --git a/packages/DocumentsUI/res/values-sw720dp/dimens.xml b/packages/DocumentsUI/res/values-sw720dp/dimens.xml deleted file mode 100644 index 982b204c6c51..000000000000 --- a/packages/DocumentsUI/res/values-sw720dp/dimens.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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> - <dimen name="grid_padding_horiz">16dp</dimen> - <dimen name="grid_padding_vert">16dp</dimen> - - <dimen name="list_item_padding">24dp</dimen> - - <dimen name="max_drawer_width">320dp</dimen> -</resources> diff --git a/packages/DocumentsUI/res/values-ta-rIN/strings.xml b/packages/DocumentsUI/res/values-ta-rIN/strings.xml deleted file mode 100644 index f29370b41344..000000000000 --- a/packages/DocumentsUI/res/values-ta-rIN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"கோப்புகள்"</string> - <string name="downloads_label" msgid="959113951084633612">"இறக்கங்கள்"</string> - <string name="title_open" msgid="4353228937663917801">"இதில் திற"</string> - <string name="title_save" msgid="2433679664882857999">"இதில் சேமி"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"புதிய கோப்புறை"</string> - <string name="menu_grid" msgid="6878021334497835259">"கட்டக் காட்சி"</string> - <string name="menu_list" msgid="7279285939892417279">"பட்டியல்"</string> - <string name="menu_sort" msgid="7677740407158414452">"இதன்படி வரிசைப்படுத்து"</string> - <string name="menu_search" msgid="3816712084502856974">"தேடு"</string> - <string name="menu_settings" msgid="8239065133341597825">"சேமிப்பிட அமைப்புகள்"</string> - <string name="menu_open" msgid="432922957274920903">"திற"</string> - <string name="menu_save" msgid="2394743337684426338">"சேமி"</string> - <string name="menu_share" msgid="3075149983979628146">"பகிர்"</string> - <string name="menu_delete" msgid="8138799623850614177">"நீக்கு"</string> - <string name="menu_select_all" msgid="8323579667348729928">"எல்லாவற்றையும் தேர்ந்தெடு"</string> - <string name="menu_copy" msgid="3612326052677229148">"இங்கு நகலெடு…"</string> - <string name="menu_move" msgid="1828090633118079817">"இதற்கு நகர்த்து…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"புதிய சாளரம்"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"வெட்டு"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"நகலெடு"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"ஒட்டு"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"அகச் சேமிப்பகத்தைக் காட்டு"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"அகச் சேமிப்பகத்தை மறை"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"கோப்பு அளவைக் காட்டு"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"கோப்பு அளவை மறை"</string> - <string name="button_select" msgid="527196987259139214">"தேர்ந்தெடு"</string> - <string name="button_copy" msgid="8706475544635021302">"நகலெடு"</string> - <string name="button_move" msgid="2202666023104202232">"நகர்த்து"</string> - <string name="button_dismiss" msgid="3714065566893946085">"நிராகரி"</string> - <string name="button_retry" msgid="4392027584153752797">"மீண்டும் முயற்சிக்கவும்"</string> - <string name="sort_name" msgid="9183560467917256779">"பெயரின்படி"</string> - <string name="sort_date" msgid="586080032956151448">"திருத்தப்பட்ட தேதியின்படி"</string> - <string name="sort_size" msgid="3350681319735474741">"அளவின்படி"</string> - <string name="drawer_open" msgid="4545466532430226949">"வழிகளைக் காட்டு"</string> - <string name="drawer_close" msgid="7602734368552123318">"வழிகளை மறை"</string> - <string name="save_error" msgid="6167009778003223664">"ஆவணத்தைச் சேமிப்பதில் தோல்வி"</string> - <string name="create_error" msgid="3735649141335444215">"கோப்புறையை உருவாக்குவதில் தோல்வி"</string> - <string name="query_error" msgid="5999895349602476581">"தற்போது உள்ளடக்கத்தை ஏற்ற முடியாது"</string> - <string name="root_recent" msgid="4470053704320518133">"சமீபத்தியவை"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> இலவசம்"</string> - <string name="root_type_service" msgid="2178854894416775409">"சேமிப்பிட சாதனங்கள்"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"குறுக்குவழிகள்"</string> - <string name="root_type_device" msgid="7121342474653483538">"சாதனங்கள்"</string> - <string name="root_type_apps" msgid="8838065367985945189">"மேலும் பயன்பாடுகள்"</string> - <string name="empty" msgid="7858882803708117596">"எதுவும் இல்லை"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s இல் பொருந்தும் முடிவு இல்லை"</string> - <string name="toast_no_application" msgid="4632640357724698144">"கோப்பைத் திறக்க முடியாது"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"சில ஆவணங்களை நீக்க முடியவில்லை"</string> - <string name="share_via" msgid="8966594246261344259">"இதன் வழியாகப் பகிர்"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"கோப்புகளை நகலெடுத்தல்"</string> - <string name="move_notification_title" msgid="6193835179777284805">"கோப்புகளை நகர்த்துதல்"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"கோப்புகளை நீக்குகிறது"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> மீதமுள்ளது"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நகலெடுக்கிறது.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நகலெடுக்கிறது.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நகர்த்துகிறது.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நகர்த்துகிறது.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நீக்குகிறது.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நீக்குகிறது.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"செயல்தவிர்"</string> - <string name="copy_preparing" msgid="3896202461003039386">"நகல் தயாராகிறது…"</string> - <string name="move_preparing" msgid="2772219441375531410">"நகர்த்துவதற்குத் தயார்படுத்துகிறது…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"நீக்கத் தயாராகிறது…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நகலெடுக்க முடியவில்லை</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நகலெடுக்க முடியவில்லை</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நகர்த்த முடியவில்லை</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நகர்த்த முடியவில்லை</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நீக்க முடியவில்லை</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நீக்க முடியவில்லை</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"விவரங்களைப் பார்க்க, தட்டவும்"</string> - <string name="close" msgid="3043722427445528732">"மூடு"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"பின்வரும் கோப்புகள் நகலெடுக்கப்படவில்லை: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"பின்வரும் கோப்புகள் நகர்த்தப்படவில்லை: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"பின்வரும் கோப்புகள் நீக்கப்படவில்லை: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"இந்தக் கோப்புகள் வேறொரு வடிவத்திற்கு மாற்றப்பட்டன: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">கிளிப்போர்டிற்கு <xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகள் நகலெடுக்கப்பட்டன.</item> - <item quantity="one">கிளிப்போர்டிற்கு <xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பு நகலெடுக்கப்பட்டது.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"தேர்ந்தெடுத்த கோப்புகளை இங்கு ஒட்ட முடியாது."</string> - <string name="menu_rename" msgid="7678802479104285353">"மறுபெயரிடு"</string> - <string name="rename_error" msgid="4203041674883412606">"ஆவணத்திற்கு மறுபெயரிடுவதில் தோல்வி"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"வெளியேற்று"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"சில கோப்புகள் மாற்றப்பட்டன"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="STORAGE"><i>^3</i></xliff:g> இல் உள்ள <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> கோப்பகத்தை அணுக <xliff:g id="APPNAME"><b>^1</b></xliff:g>ஐ அனுமதிக்கவா?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g> கோப்பகத்தை அணுக, <xliff:g id="APPNAME"><b>^1</b></xliff:g>ஐ அனுமதிக்கவா?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g> இல் உள்ள படங்கள், வீடியோக்கள் உட்பட எல்லா தரவையும் அணுக, <xliff:g id="APPNAME"><b>^1</b></xliff:g>ஐ அனுமதிக்கவா?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"மீண்டும் கேட்காதே"</string> - <string name="allow" msgid="7225948811296386551">"அனுமதி"</string> - <string name="deny" msgid="2081879885755434506">"நிராகரி"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டன</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> தேர்ந்தெடுக்கப்பட்டது</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> உருப்படிகள்</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> உருப்படி</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\"ஐ நீக்கவா?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" கோப்புறையையும் அதன் உள்ளடக்கத்தையும் நீக்கவா?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புகளை நீக்கவா?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்பை நீக்கவா?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> கோப்புறைகளையும் அவற்றின் உள்ளடக்கத்தையும் நீக்கவா?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> கோப்புறையையும் அதன் உள்ளடக்கத்தையும் நீக்கவா?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> உருப்படிகளை நீக்கவா?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> உருப்படியை நீக்கவா?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-te-rIN/strings.xml b/packages/DocumentsUI/res/values-te-rIN/strings.xml deleted file mode 100644 index 38bb007d0f23..000000000000 --- a/packages/DocumentsUI/res/values-te-rIN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ఫైల్లు"</string> - <string name="downloads_label" msgid="959113951084633612">"డౌన్లోడ్లు"</string> - <string name="title_open" msgid="4353228937663917801">"ఇక్కడి నుండి తెరువు"</string> - <string name="title_save" msgid="2433679664882857999">"ఇందులో సేవ్ చేయి"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"కొత్త ఫోల్డర్"</string> - <string name="menu_grid" msgid="6878021334497835259">"గ్రిడ్ వీక్షణ"</string> - <string name="menu_list" msgid="7279285939892417279">"జాబితా వీక్షణ"</string> - <string name="menu_sort" msgid="7677740407158414452">"ఇలా క్రమబద్ధీకరించు"</string> - <string name="menu_search" msgid="3816712084502856974">"శోధించు"</string> - <string name="menu_settings" msgid="8239065133341597825">"నిల్వ సెట్టింగ్లు"</string> - <string name="menu_open" msgid="432922957274920903">"తెరువు"</string> - <string name="menu_save" msgid="2394743337684426338">"సేవ్ చేయి"</string> - <string name="menu_share" msgid="3075149983979628146">"భాగస్వామ్యం చేయి"</string> - <string name="menu_delete" msgid="8138799623850614177">"తొలగించు"</string> - <string name="menu_select_all" msgid="8323579667348729928">"అన్నీ ఎంచుకోండి"</string> - <string name="menu_copy" msgid="3612326052677229148">"ఇక్కడికి కాపీ చేయి…"</string> - <string name="menu_move" msgid="1828090633118079817">"దీనికి తరలించు..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"కొత్త విండో"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"కత్తిరించు"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"కాపీ చేయి"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"అతికించు"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"అంతర్గత నిల్వను చూపు"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"అంతర్గత నిల్వను దాచు"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"ఫైల్ పరిమాణాన్ని చూపు"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ఫైల్ పరిమాణాన్ని దాచు"</string> - <string name="button_select" msgid="527196987259139214">"ఎంచుకోండి"</string> - <string name="button_copy" msgid="8706475544635021302">"కాపీ చేయి"</string> - <string name="button_move" msgid="2202666023104202232">"తరలించు"</string> - <string name="button_dismiss" msgid="3714065566893946085">"తీసివేయి"</string> - <string name="button_retry" msgid="4392027584153752797">"మళ్లీ ప్రయత్నించు"</string> - <string name="sort_name" msgid="9183560467917256779">"పేరు ద్వారా"</string> - <string name="sort_date" msgid="586080032956151448">"సవరించిన తేదీ ద్వారా"</string> - <string name="sort_size" msgid="3350681319735474741">"పరిమాణం ద్వారా"</string> - <string name="drawer_open" msgid="4545466532430226949">"మూలాలను చూపు"</string> - <string name="drawer_close" msgid="7602734368552123318">"మూలాలను దాచు"</string> - <string name="save_error" msgid="6167009778003223664">"పత్రాన్ని సేవ్ చేయడంలో విఫలమైంది"</string> - <string name="create_error" msgid="3735649141335444215">"ఫోల్డర్ను సృష్టించడంలో విఫలమైంది"</string> - <string name="query_error" msgid="5999895349602476581">"ఈ సమయంలో కంటెంట్ను లోడ్ చేయడం సాధ్యపడదు"</string> - <string name="root_recent" msgid="4470053704320518133">"ఇటీవల"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ఖాళీ"</string> - <string name="root_type_service" msgid="2178854894416775409">"నిల్వ పరికరాలు"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"సత్వరమార్గాలు"</string> - <string name="root_type_device" msgid="7121342474653483538">"పరికరాలు"</string> - <string name="root_type_apps" msgid="8838065367985945189">"మరిన్ని అనువర్తనాలు"</string> - <string name="empty" msgid="7858882803708117596">"అంశాలు లేవు"</string> - <string name="no_results" msgid="6622510343880730446">"%1$sలో సరిపోలినవి లేవు"</string> - <string name="toast_no_application" msgid="4632640357724698144">"ఫైల్ను తెరవడం సాధ్యపడదు"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"కొన్ని పత్రాలను తొలగించడం సాధ్యపడలేదు"</string> - <string name="share_via" msgid="8966594246261344259">"దీని ద్వారా భాగస్వామ్యం చేయండి"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"ఫైల్లు కాపీ అవుతున్నాయి"</string> - <string name="move_notification_title" msgid="6193835179777284805">"ఫైల్లను తరలిస్తోంది"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"ఫైల్లను తొలగిస్తోంది"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> మిగిలి ఉంది"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను కాపీ చేస్తోంది.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను కాపీ చేస్తోంది.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను తరలిస్తోంది.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను తరలిస్తోంది.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను తొలగిస్తోంది.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను తొలగిస్తోంది.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"చర్య రద్దు చేయి"</string> - <string name="copy_preparing" msgid="3896202461003039386">"కాపీ చేయడానికి సిద్ధం చేస్తోంది…"</string> - <string name="move_preparing" msgid="2772219441375531410">"తరలించడానికి సిద్ధమవుతోంది…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"తొలగించడానికి సిద్ధం చేస్తోంది…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను కాపీ చేయడం సాధ్యపడలేదు</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను కాపీ చేయడం సాధ్యపడలేదు</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను తరలించడం సాధ్యపడలేదు</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను తరలించడం సాధ్యపడలేదు</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను తొలగించడం సాధ్యపడలేదు</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను తొలగించడం సాధ్యపడలేదు</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"వివరాలను వీక్షించడానికి నొక్కండి"</string> - <string name="close" msgid="3043722427445528732">"మూసివేయి"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"ఈ ఫైల్లు కాపీ చేయబడలేదు: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"ఈ ఫైల్లు తరలించబడలేదు: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"ఈ ఫైల్లు తొలగించబడలేదు: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ఈ ఫైల్లు మరొక ఆకృతికి మార్చబడ్డాయి: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">క్లిప్బోర్డ్కి <xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను కాపీ చేసారు.</item> - <item quantity="one">క్లిప్బోర్డ్కి <xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను కాపీ చేసారు.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"ఎంచుకున్న ఫైల్లను ఈ స్థానంలోకి తీసుకురావడం సాధ్యపడదు."</string> - <string name="menu_rename" msgid="7678802479104285353">"పేరు మార్చు"</string> - <string name="rename_error" msgid="4203041674883412606">"పత్రం పేరు మార్చడంలో విఫలమైంది"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"తొలగించు"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"కొన్ని పైల్లు మార్చబడ్డాయి"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g>కి <xliff:g id="STORAGE"><i>^3</i></xliff:g>లో <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> డైరెక్టరీ ప్రాప్యతను మంజూరు చేయాలా?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g>కి <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> డైరెక్టరీ ప్రాప్యతను మంజూరు చేయాలా?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="STORAGE"><i>^2</i></xliff:g>లో ఫోటోలు మరియు వీడియోలతో సహా మీ డేటా ప్రాప్యతను <xliff:g id="APPNAME"><b>^1</b></xliff:g>కి మంజూరు చేయాలా?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"మళ్లీ అడగవద్దు"</string> - <string name="allow" msgid="7225948811296386551">"అనుమతించండి"</string> - <string name="deny" msgid="2081879885755434506">"తిరస్కరించండి"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఎంచుకోబడ్డాయి</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఎంచుకోబడింది</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> అంశాలు</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> అంశం</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\"ని తొలగించాలా?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" ఫోల్డర్ని మరియు అందులోని కంటెంట్లను తొలగించాలా?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫైల్లను తొలగించాలా?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫైల్ను తొలగించాలా?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ఫోల్డర్లు మరియు వీటిలోని కంటెంట్లను తొలగించాలా?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ఫోల్డర్ మరియు దీనిలోని కంటెంట్లను తొలగించాలా?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> అంశాలను తొలగించాలా?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> అంశాన్ని తొలగించాలా?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml deleted file mode 100644 index f64be88848c9..000000000000 --- a/packages/DocumentsUI/res/values-th/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"ไฟล์"</string> - <string name="downloads_label" msgid="959113951084633612">"การดาวน์โหลด"</string> - <string name="title_open" msgid="4353228937663917801">"เปิดจาก"</string> - <string name="title_save" msgid="2433679664882857999">"บันทึกไปยัง"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"โฟลเดอร์ใหม่"</string> - <string name="menu_grid" msgid="6878021334497835259">"มุมมองตาราง"</string> - <string name="menu_list" msgid="7279285939892417279">"มุมมองรายการ"</string> - <string name="menu_sort" msgid="7677740407158414452">"จัดเรียงตาม"</string> - <string name="menu_search" msgid="3816712084502856974">"ค้นหา"</string> - <string name="menu_settings" msgid="8239065133341597825">"การตั้งค่าที่เก็บข้อมูล"</string> - <string name="menu_open" msgid="432922957274920903">"เปิด"</string> - <string name="menu_save" msgid="2394743337684426338">"บันทึก"</string> - <string name="menu_share" msgid="3075149983979628146">"แชร์"</string> - <string name="menu_delete" msgid="8138799623850614177">"ลบ"</string> - <string name="menu_select_all" msgid="8323579667348729928">"เลือกทั้งหมด"</string> - <string name="menu_copy" msgid="3612326052677229148">"คัดลอกไปยัง…"</string> - <string name="menu_move" msgid="1828090633118079817">"ย้ายไปที่…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"หน้าต่างใหม่"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"ตัด"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"คัดลอก"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"วาง"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"แสดงที่จัดเก็บภายใน"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"ซ่อนที่จัดเก็บภายใน"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"แสดงขนาดไฟล์"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"ซ่อนขนาดไฟล์"</string> - <string name="button_select" msgid="527196987259139214">"เลือก"</string> - <string name="button_copy" msgid="8706475544635021302">"คัดลอก"</string> - <string name="button_move" msgid="2202666023104202232">"ย้าย"</string> - <string name="button_dismiss" msgid="3714065566893946085">"ปิด"</string> - <string name="button_retry" msgid="4392027584153752797">"ลองอีกครั้ง"</string> - <string name="sort_name" msgid="9183560467917256779">"ตามชื่อ"</string> - <string name="sort_date" msgid="586080032956151448">"ตามวันที่ที่ปรับเปลี่ยน"</string> - <string name="sort_size" msgid="3350681319735474741">"ตามขนาด"</string> - <string name="drawer_open" msgid="4545466532430226949">"แสดงราก"</string> - <string name="drawer_close" msgid="7602734368552123318">"ซ่อนราก"</string> - <string name="save_error" msgid="6167009778003223664">"การบันทึกเอกสารล้มเหลว"</string> - <string name="create_error" msgid="3735649141335444215">"การสร้างโฟลเดอร์ล้มเหลว"</string> - <string name="query_error" msgid="5999895349602476581">"โหลดเนื้อหาไม่ได้ในขณะนี้"</string> - <string name="root_recent" msgid="4470053704320518133">"ล่าสุด"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"ว่าง <xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"บริการที่เก็บข้อมูล"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"ทางลัด"</string> - <string name="root_type_device" msgid="7121342474653483538">"อุปกรณ์"</string> - <string name="root_type_apps" msgid="8838065367985945189">"แอปเพิ่มเติม"</string> - <string name="empty" msgid="7858882803708117596">"ไม่มีรายการ"</string> - <string name="no_results" msgid="6622510343880730446">"ไม่พบข้อมูลที่ตรงกันใน %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"เปิดไฟล์ไม่ได้"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"ไม่สามารถลบเอกสารบางรายการ"</string> - <string name="share_via" msgid="8966594246261344259">"แชร์ผ่าน"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"กำลังคัดลอกไฟล์"</string> - <string name="move_notification_title" msgid="6193835179777284805">"กำลังย้ายไฟล์"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"กำลังลบไฟล์"</string> - <string name="copy_remaining" msgid="6283790937387975095">"เหลือ <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">กำลังคัดลอก <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> - <item quantity="one">กำลังคัดลอก <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">กำลังย้าย <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> - <item quantity="one">กำลังย้าย <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">กำลังลบ <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> - <item quantity="one">กำลังลบ <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"เลิกทำ"</string> - <string name="copy_preparing" msgid="3896202461003039386">"กำลังเตรียมการคัดลอก…"</string> - <string name="move_preparing" msgid="2772219441375531410">"กำลังเตรียมการย้าย…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"กำลังเตรียมลบ…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">คัดลอกไม่ได้ <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> - <item quantity="one">คัดลอกไม่ได้ <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">ย้ายไม่ได้ <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> - <item quantity="one">ย้ายไม่ได้ <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">ลบไม่ได้ <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์</item> - <item quantity="one">ลบไม่ได้ <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"แตะเพื่อดูรายละเอียด"</string> - <string name="close" msgid="3043722427445528732">"ปิด"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"ไม่ได้คัดลอกไฟล์เหล่านี้: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"ไม่ได้ย้ายไฟล์เหล่านี้: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"ไม่ได้ลบไฟล์เหล่านี้: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ไฟล์ต่อไปนี้แปลงเป็นอีกรูปแบบหนึ่งแล้ว: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">คัดลอก <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์ไปยังคลิปบอร์ดแล้ว</item> - <item quantity="one">คัดลอก <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์ไปยังคลิปบอร์ดแล้ว</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"ไม่สามารถวางไฟล์ที่เลือกในตำแหน่งนี้"</string> - <string name="menu_rename" msgid="7678802479104285353">"เปลี่ยนชื่อ"</string> - <string name="rename_error" msgid="4203041674883412606">"ไม่สามารถเปลี่ยนชื่อเอกสาร"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"นำอุปกรณ์ออก"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"แปลงบางไฟล์แล้ว"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"ให้สิทธิ์ <xliff:g id="APPNAME"><b>^1</b></xliff:g> ในการเข้าถึงไดเรกทอรี <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ใน <xliff:g id="STORAGE"><i>^3</i></xliff:g> ไหม"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"ให้สิทธิ์ <xliff:g id="APPNAME"><b>^1</b></xliff:g> เข้าถึงไดเรกทอรี <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ไหม"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"ให้สิทธิ์ <xliff:g id="APPNAME"><b>^1</b></xliff:g> เข้าถึงข้อมูลของคุณ รวมถึงรูปภาพและวิดีโอใน <xliff:g id="STORAGE"><i>^2</i></xliff:g> ไหม"</string> - <string name="never_ask_again" msgid="4295278542972859268">"ไม่ต้องถามอีก"</string> - <string name="allow" msgid="7225948811296386551">"อนุญาต"</string> - <string name="deny" msgid="2081879885755434506">"ปฏิเสธ"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">เลือกไว้ <xliff:g id="COUNT_1">%1$d</xliff:g> รายการ</item> - <item quantity="one">เลือกไว้ <xliff:g id="COUNT_0">%1$d</xliff:g> รายการ</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> รายการ</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> รายการ</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"ลบ \"<xliff:g id="NAME">%1$s</xliff:g>\" ไหม"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"ลบโฟลเดอร์ \"<xliff:g id="NAME">%1$s</xliff:g>\" และเนื้อหาข้างในไหม"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">ลบ <xliff:g id="COUNT_1">%1$d</xliff:g> ไฟล์ใช่ไหม</item> - <item quantity="one">ลบ <xliff:g id="COUNT_0">%1$d</xliff:g> ไฟล์ใช่ไหม</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">ลบ <xliff:g id="COUNT_1">%1$d</xliff:g> โฟลเดอร์และเนื้อหาข้างในใช่ไหม</item> - <item quantity="one">ลบ <xliff:g id="COUNT_0">%1$d</xliff:g> โฟลเดอร์และเนื้อหาข้างในใช่ไหม</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">ลบ <xliff:g id="COUNT_1">%1$d</xliff:g> รายการใช่ไหม</item> - <item quantity="one">ลบ <xliff:g id="COUNT_0">%1$d</xliff:g> รายการใช่ไหม</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml deleted file mode 100644 index 22474469c16e..000000000000 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Mga File"</string> - <string name="downloads_label" msgid="959113951084633612">"Mga Download"</string> - <string name="title_open" msgid="4353228937663917801">"Buksan mula sa"</string> - <string name="title_save" msgid="2433679664882857999">"I-save sa"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Bagong folder"</string> - <string name="menu_grid" msgid="6878021334497835259">"View na grid"</string> - <string name="menu_list" msgid="7279285939892417279">"View na listahan"</string> - <string name="menu_sort" msgid="7677740407158414452">"Uriin ayon sa"</string> - <string name="menu_search" msgid="3816712084502856974">"Maghanap"</string> - <string name="menu_settings" msgid="8239065133341597825">"Mga setting ng storage"</string> - <string name="menu_open" msgid="432922957274920903">"Buksan"</string> - <string name="menu_save" msgid="2394743337684426338">"I-save"</string> - <string name="menu_share" msgid="3075149983979628146">"Ibahagi"</string> - <string name="menu_delete" msgid="8138799623850614177">"I-delete"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Piliin lahat"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopyahin sa..."</string> - <string name="menu_move" msgid="1828090633118079817">"Ilipat sa…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Bagong window"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"I-cut"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopyahin"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"I-paste"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Ipakita internal storage"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Itago internal storage"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Ipakita ang laki ng file"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Itago ang laki ng file"</string> - <string name="button_select" msgid="527196987259139214">"Pumili"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopyahin"</string> - <string name="button_move" msgid="2202666023104202232">"Ilipat"</string> - <string name="button_dismiss" msgid="3714065566893946085">"I-dismiss"</string> - <string name="button_retry" msgid="4392027584153752797">"Subukang Muli"</string> - <string name="sort_name" msgid="9183560467917256779">"Ayon sa pangalan"</string> - <string name="sort_date" msgid="586080032956151448">"Ayon sa petsa ng pagbago"</string> - <string name="sort_size" msgid="3350681319735474741">"Ayon sa laki"</string> - <string name="drawer_open" msgid="4545466532430226949">"Ipakita ang mga root"</string> - <string name="drawer_close" msgid="7602734368552123318">"Itago ang mga root"</string> - <string name="save_error" msgid="6167009778003223664">"Hindi na-save ang dokumento"</string> - <string name="create_error" msgid="3735649141335444215">"Hindi nagawa ang folder"</string> - <string name="query_error" msgid="5999895349602476581">"Hindi ma-load ang content sa ngayon"</string> - <string name="root_recent" msgid="4470053704320518133">"Kamakailan"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> ang libre"</string> - <string name="root_type_service" msgid="2178854894416775409">"Mga serbisyo ng storage"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Mga Shortcut"</string> - <string name="root_type_device" msgid="7121342474653483538">"Mga Device"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Higit pang apps"</string> - <string name="empty" msgid="7858882803708117596">"Walang mga item"</string> - <string name="no_results" msgid="6622510343880730446">"Walang mga katugma sa %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Hindi mabuksan ang file"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Hindi matanggal ang ilang dokumento"</string> - <string name="share_via" msgid="8966594246261344259">"Ibahagi sa pamamagitan ng"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Kinokopya ang mga file"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Inililipat ang mga file"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Pagde-delete ng mga file"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> na lang ang natitira"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Kumokopya ng <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> - <item quantity="other">Kumokopya ng <xliff:g id="COUNT_1">%1$d</xliff:g> na file.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Inililipat ang <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> - <item quantity="other">Inililipat ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Dine-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> file.</item> - <item quantity="other">Dine-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"I-undo"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Naghahanda para sa pagkopya…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Naghahanda para sa paglilipat…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Naghahanda para sa pag-delete…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Hindi makopya ang <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> - <item quantity="other">Hindi makopya ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Hindi mailipat ang <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> - <item quantity="other">Hindi mailipat ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Hindi ma-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> file</item> - <item quantity="other">Hindi ma-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"I-tap upang tingnan ang mga detalye"</string> - <string name="close" msgid="3043722427445528732">"Isara"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Hindi nakopya ang mga file na ito: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Hindi nailipat ang mga file na ito: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Hindi na-delete ang mga file na ito: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Na-convert ang mga file na ito sa ibang format: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">Nakopya ang <xliff:g id="COUNT_1">%1$d</xliff:g> file sa clipboard.</item> - <item quantity="other">Nakopya ang <xliff:g id="COUNT_1">%1$d</xliff:g> na file sa clipboard.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Hindi mai-paste sa lokasyong ito ang mga piniling file."</string> - <string name="menu_rename" msgid="7678802479104285353">"Palitan ang pangalan"</string> - <string name="rename_error" msgid="4203041674883412606">"Hindi napalitan ang pangalan ng dokumento"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"I-eject"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Na-convert ang ilang file"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Bigyan ang <xliff:g id="APPNAME"><b>^1</b></xliff:g> ng access sa directory ng <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> sa <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Bibigyan ang <xliff:g id="APPNAME"><b>^1</b></xliff:g> ng access sa direktoryong <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Bigyan ang <xliff:g id="APPNAME"><b>^1</b></xliff:g> ng access sa iyong data, kabilang ang mga larawan at video, sa <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Huwag nang tatanunging muli"</string> - <string name="allow" msgid="7225948811296386551">"Payagan"</string> - <string name="deny" msgid="2081879885755434506">"Tanggihan"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> ang napili</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ang napili</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> item</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> na item</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Gusto mo bang i-delete ang \"<xliff:g id="NAME">%1$s</xliff:g>?\""</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Gusto mo bang i-delete ang folder na \"<xliff:g id="NAME">%1$s</xliff:g>\" at ang mga content nito?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Gusto mo bang i-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> file?</item> - <item quantity="other">Gusto mo bang i-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> (na) file?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Gusto mo bang i-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> folder at mga content ng mga ito?</item> - <item quantity="other">Gusto mo bang i-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> na folder at mga content ng mga ito?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Gusto mo bang i-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> item?</item> - <item quantity="other">Gusto mo bang i-delete ang <xliff:g id="COUNT_1">%1$d</xliff:g> na item?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml deleted file mode 100644 index 9dcc0e156947..000000000000 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Dosyalar"</string> - <string name="downloads_label" msgid="959113951084633612">"İndirilenler"</string> - <string name="title_open" msgid="4353228937663917801">"Şuradan aç:"</string> - <string name="title_save" msgid="2433679664882857999">"Şuraya kaydet:"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Yeni klasör"</string> - <string name="menu_grid" msgid="6878021334497835259">"Tablo görünümü"</string> - <string name="menu_list" msgid="7279285939892417279">"Liste görünümü"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sıralama ölçütü"</string> - <string name="menu_search" msgid="3816712084502856974">"Ara"</string> - <string name="menu_settings" msgid="8239065133341597825">"Depolama ayarları"</string> - <string name="menu_open" msgid="432922957274920903">"Aç"</string> - <string name="menu_save" msgid="2394743337684426338">"Kaydet"</string> - <string name="menu_share" msgid="3075149983979628146">"Paylaş"</string> - <string name="menu_delete" msgid="8138799623850614177">"Sil"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Tümünü seç"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopyala…"</string> - <string name="menu_move" msgid="1828090633118079817">"Taşı..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Yeni pencere"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Kes"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopyala"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Yapıştır"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Dahili depolamayı göster"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Dahili depolamayı gizle"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Dosya boyutunu göster"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Dosya boyutunu gizle"</string> - <string name="button_select" msgid="527196987259139214">"Seç"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopyala"</string> - <string name="button_move" msgid="2202666023104202232">"Taşı"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Kapat"</string> - <string name="button_retry" msgid="4392027584153752797">"Tekrar Dene"</string> - <string name="sort_name" msgid="9183560467917256779">"Ada göre"</string> - <string name="sort_date" msgid="586080032956151448">"Değişiklik tarihine göre"</string> - <string name="sort_size" msgid="3350681319735474741">"Boyuta göre"</string> - <string name="drawer_open" msgid="4545466532430226949">"Kökleri göster"</string> - <string name="drawer_close" msgid="7602734368552123318">"Kökleri sakla"</string> - <string name="save_error" msgid="6167009778003223664">"Doküman kaydedilemedi"</string> - <string name="create_error" msgid="3735649141335444215">"Klasör oluşturulamadı"</string> - <string name="query_error" msgid="5999895349602476581">"İçerik şu anda yüklenemiyor"</string> - <string name="root_recent" msgid="4470053704320518133">"En son"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> boş"</string> - <string name="root_type_service" msgid="2178854894416775409">"Depolama hizmetleri"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Kısayollar"</string> - <string name="root_type_device" msgid="7121342474653483538">"Cihazlar"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Diğer uygulamalar"</string> - <string name="empty" msgid="7858882803708117596">"Öğe yok"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s içinde eşleşme bulunamadı"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Dosya açılamıyor"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Bazı dokümanlar silinemiyor"</string> - <string name="share_via" msgid="8966594246261344259">"Şunu kullanarak paylaş:"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Dosyalar kopyalanıyor"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Dosyalar taşınıyor"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Dosyalar siliniyor"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> kaldı"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya kopyalanıyor.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya kopyalanıyor.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya taşınıyor.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya taşınıyor.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya siliniyor.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya siliniyor.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Geri al"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Kopyalanmak için hazırlanıyor…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Taşıma için hazırlanıyor…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Silmek için hazırlanıyor…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya kopyalanamadı</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya kopyalanamadı</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya taşınamadı</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya taşınamadı</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya silinemedi</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya silinemedi</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Ayrıntıları görmek için hafifçe dokunun"</string> - <string name="close" msgid="3043722427445528732">"Kapat"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Şu dosyalar kopyalanamadı: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Şu dosyalar taşınamadı: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Şu dosyalar silinemedi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Bu dosyalar başka bir biçime dönüştürüldü: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya panoya kopyalandı.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya panoya kopyalandı.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Seçili dosyalar bu konuma yapıştırılamıyor."</string> - <string name="menu_rename" msgid="7678802479104285353">"Yeniden adlandır"</string> - <string name="rename_error" msgid="4203041674883412606">"Dokümanın adı değiştirilemedi"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Çıkar"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Bazı dosyalar dönüştürüldü"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> uygulamasına <xliff:g id="STORAGE"><i>^3</i></xliff:g> depolama alanındaki <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> dizinine erişim izni verilsin mi?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g> dizinine erişmek için <xliff:g id="APPNAME"><b>^1</b></xliff:g> uygulamasına izin verilsin mi?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> uygulamasının, fotoğraflar ve videolar dahil olmak üzere <xliff:g id="STORAGE"><i>^2</i></xliff:g> üzerindeki verilerinize erişmesine izin verilsin mi?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Tekrar sorma"</string> - <string name="allow" msgid="7225948811296386551">"İzin Ver"</string> - <string name="deny" msgid="2081879885755434506">"Reddet"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> öğe seçildi</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> öğe seçildi</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> öğe</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> öğe</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" silinsin mi?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" adlı klasör ve içindekiler silinsin mi?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> dosya silinsin mi?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> dosya silinsin mi?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> klasör ve içindekiler silinsin mi?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> klasör ve içindekiler silinsin mi?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> öğe silinsin mi?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> öğe silinsin mi?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml deleted file mode 100644 index 6d28f4172a67..000000000000 --- a/packages/DocumentsUI/res/values-uk/strings.xml +++ /dev/null @@ -1,168 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Файли"</string> - <string name="downloads_label" msgid="959113951084633612">"Завантаження"</string> - <string name="title_open" msgid="4353228937663917801">"Відкрити"</string> - <string name="title_save" msgid="2433679664882857999">"Зберегти в"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Нова папка"</string> - <string name="menu_grid" msgid="6878021334497835259">"Режим таблиці"</string> - <string name="menu_list" msgid="7279285939892417279">"Режим списку"</string> - <string name="menu_sort" msgid="7677740407158414452">"Параметри сортування"</string> - <string name="menu_search" msgid="3816712084502856974">"Пошук"</string> - <string name="menu_settings" msgid="8239065133341597825">"Налаштування пам’яті"</string> - <string name="menu_open" msgid="432922957274920903">"Відкрити"</string> - <string name="menu_save" msgid="2394743337684426338">"Зберегти"</string> - <string name="menu_share" msgid="3075149983979628146">"Поділитися"</string> - <string name="menu_delete" msgid="8138799623850614177">"Видалити"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Вибрати все"</string> - <string name="menu_copy" msgid="3612326052677229148">"Копіювати в…"</string> - <string name="menu_move" msgid="1828090633118079817">"Перемістити в…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Нове вікно"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Вирізати"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Копіювати"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Вставити"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Показати внутр. пам’ять"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Сховати внутр. пам’ять"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Показати розмір файлу"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Сховати розмір файлу"</string> - <string name="button_select" msgid="527196987259139214">"Вибрати"</string> - <string name="button_copy" msgid="8706475544635021302">"Копіювати"</string> - <string name="button_move" msgid="2202666023104202232">"Перемістити"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Закрити"</string> - <string name="button_retry" msgid="4392027584153752797">"Повторити спробу"</string> - <string name="sort_name" msgid="9183560467917256779">"За назвою"</string> - <string name="sort_date" msgid="586080032956151448">"За датою змінення"</string> - <string name="sort_size" msgid="3350681319735474741">"За розміром"</string> - <string name="drawer_open" msgid="4545466532430226949">"Показати кореневі каталоги"</string> - <string name="drawer_close" msgid="7602734368552123318">"Сховати кореневі каталоги"</string> - <string name="save_error" msgid="6167009778003223664">"Не вдалося зберегти документ"</string> - <string name="create_error" msgid="3735649141335444215">"Помилка створення папки"</string> - <string name="query_error" msgid="5999895349602476581">"Зараз не вдається завантажити вміст"</string> - <string name="root_recent" msgid="4470053704320518133">"Останні"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> вільного місця"</string> - <string name="root_type_service" msgid="2178854894416775409">"Онлайн-сховища"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Ярлики"</string> - <string name="root_type_device" msgid="7121342474653483538">"Пристрої"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Інші програми"</string> - <string name="empty" msgid="7858882803708117596">"Нічого немає"</string> - <string name="no_results" msgid="6622510343880730446">"Немає збігів для запиту \"%1$s\""</string> - <string name="toast_no_application" msgid="4632640357724698144">"Не вдалося відкрити файл"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Не вдалося видалити деякі документи"</string> - <string name="share_via" msgid="8966594246261344259">"Надіслати через"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Копіювання файлів"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Переміщення файлів"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Видалення файлів"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Залишилося <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлу.</item> - <item quantity="few">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item> - <item quantity="many">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item> - <item quantity="other">Копіювання <xliff:g id="COUNT_1">%1$d</xliff:g> файлу.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Переміщення <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - <item quantity="few">Переміщення <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item> - <item quantity="many">Переміщення <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item> - <item quantity="other">Переміщення <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Видалення <xliff:g id="COUNT_1">%1$d</xliff:g> файлу.</item> - <item quantity="few">Видалення <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item> - <item quantity="many">Видалення <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item> - <item quantity="other">Видалення <xliff:g id="COUNT_1">%1$d</xliff:g> файлу.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Відмінити"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Підготовка до копіювання…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Підготовка до переміщення…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Підготовка до видалення…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> з <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Не вдалося скопіювати <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Не вдалося скопіювати <xliff:g id="COUNT_1">%1$d</xliff:g> файли</item> - <item quantity="many">Не вдалося скопіювати <xliff:g id="COUNT_1">%1$d</xliff:g> файлів</item> - <item quantity="other">Не вдалося скопіювати <xliff:g id="COUNT_1">%1$d</xliff:g> файлу</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Не вдалося перемістити <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Не вдалося перемістити <xliff:g id="COUNT_1">%1$d</xliff:g> файли</item> - <item quantity="many">Не вдалося перемістити <xliff:g id="COUNT_1">%1$d</xliff:g> файлів</item> - <item quantity="other">Не вдалося перемістити <xliff:g id="COUNT_1">%1$d</xliff:g> файлу</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Не вдалося видалити <xliff:g id="COUNT_1">%1$d</xliff:g> файл</item> - <item quantity="few">Не вдалося видалити <xliff:g id="COUNT_1">%1$d</xliff:g> файли</item> - <item quantity="many">Не вдалося видалити <xliff:g id="COUNT_1">%1$d</xliff:g> файлів</item> - <item quantity="other">Не вдалося видалити <xliff:g id="COUNT_1">%1$d</xliff:g> файлу</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Торкніться, щоб переглянути деталі"</string> - <string name="close" msgid="3043722427445528732">"Закрити"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Ці файли не скопійовано: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Ці файли не переміщено: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Ці файли не видалено: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ці файли конвертовано в інший формат: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">У буфер обміну скопійовано <xliff:g id="COUNT_1">%1$d</xliff:g> файл.</item> - <item quantity="few">У буфер обміну скопійовано <xliff:g id="COUNT_1">%1$d</xliff:g> файли.</item> - <item quantity="many">У буфер обміну скопійовано <xliff:g id="COUNT_1">%1$d</xliff:g> файлів.</item> - <item quantity="other">У буфер обміну скопійовано <xliff:g id="COUNT_1">%1$d</xliff:g> файла.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Не вдається вставити вибрані файли в цю папку."</string> - <string name="menu_rename" msgid="7678802479104285353">"Перейменувати"</string> - <string name="rename_error" msgid="4203041674883412606">"Не вдалося перейменувати документ"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Вийняти"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Деякі файли конвертовано"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Надати додатку <xliff:g id="APPNAME"><b>^1</b></xliff:g> доступ до каталогу <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> на пристрої пам’яті <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Надати додатку <xliff:g id="APPNAME"><b>^1</b></xliff:g> доступ до каталогу \"<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>\"?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Надати додатку <xliff:g id="APPNAME"><b>^1</b></xliff:g> доступ до ваших даних, зокрема до фотографій і відео, які містить <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Не запитувати знову"</string> - <string name="allow" msgid="7225948811296386551">"Дозвол."</string> - <string name="deny" msgid="2081879885755434506">"Забор."</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="few">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="many">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Вибрано <xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> елемент</item> - <item quantity="few"><xliff:g id="COUNT_1">%1$d</xliff:g> елементи</item> - <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> елементів</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> елемента</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Видалити файл <xliff:g id="NAME">%1$s</xliff:g>?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Видалити папку \"<xliff:g id="NAME">%1$s</xliff:g>\" та її вміст?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> файл?</item> - <item quantity="few">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> файли?</item> - <item quantity="many">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> файлів?</item> - <item quantity="other">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> файлу?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> папку та їх вміст?</item> - <item quantity="few">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> папки та їх вміст?</item> - <item quantity="many">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> папок та їх вміст?</item> - <item quantity="other">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> папки та їх вміст?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> елемент?</item> - <item quantity="few">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> елементи?</item> - <item quantity="many">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> елементів?</item> - <item quantity="other">Видалити <xliff:g id="COUNT_1">%1$d</xliff:g> елемента?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-ur-rPK/strings.xml b/packages/DocumentsUI/res/values-ur-rPK/strings.xml deleted file mode 100644 index 54289f8bc663..000000000000 --- a/packages/DocumentsUI/res/values-ur-rPK/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"فائلیں"</string> - <string name="downloads_label" msgid="959113951084633612">"ڈاؤن لوڈز"</string> - <string name="title_open" msgid="4353228937663917801">"کھولیں از"</string> - <string name="title_save" msgid="2433679664882857999">"اس میں محفوظ کریں"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"نیا فولڈر"</string> - <string name="menu_grid" msgid="6878021334497835259">"گرڈ منظر"</string> - <string name="menu_list" msgid="7279285939892417279">"فہرست منظر"</string> - <string name="menu_sort" msgid="7677740407158414452">"ترتیب دیں بلحاظ"</string> - <string name="menu_search" msgid="3816712084502856974">"تلاش کریں"</string> - <string name="menu_settings" msgid="8239065133341597825">"اسٹوریج کی ترتیبات"</string> - <string name="menu_open" msgid="432922957274920903">"کھولیں"</string> - <string name="menu_save" msgid="2394743337684426338">"محفوظ کریں"</string> - <string name="menu_share" msgid="3075149983979628146">"اشتراک کریں"</string> - <string name="menu_delete" msgid="8138799623850614177">"حذف کریں"</string> - <string name="menu_select_all" msgid="8323579667348729928">"سبھی کو منتخب کریں"</string> - <string name="menu_copy" msgid="3612326052677229148">"اس میں کاپی کریں…"</string> - <string name="menu_move" msgid="1828090633118079817">"اس میں منتقل کریں…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"نئی ونڈو"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"کٹ کریں"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"کاپی کریں"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"پیسٹ کریں"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"داخلی اسٹوریج دکھائیں"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"داخلی اسٹوریج چھپائیں"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"فائل سائز دکھائیں"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"فائل سائز چھپائیں"</string> - <string name="button_select" msgid="527196987259139214">"منتخب کریں"</string> - <string name="button_copy" msgid="8706475544635021302">"کاپی کریں"</string> - <string name="button_move" msgid="2202666023104202232">"منتقل کریں"</string> - <string name="button_dismiss" msgid="3714065566893946085">"برخاست کریں"</string> - <string name="button_retry" msgid="4392027584153752797">"دوبارہ کوشش کریں"</string> - <string name="sort_name" msgid="9183560467917256779">"نام کے لحاظ سے"</string> - <string name="sort_date" msgid="586080032956151448">"ترمیم کی تاریخ کے لحاظ سے"</string> - <string name="sort_size" msgid="3350681319735474741">"سائز کے لحاظ سے"</string> - <string name="drawer_open" msgid="4545466532430226949">"روٹس دکھائیں"</string> - <string name="drawer_close" msgid="7602734368552123318">"روٹس کو چھپائیں"</string> - <string name="save_error" msgid="6167009778003223664">"دستاویز کو محفوظ کرنے میں ناکام ہو گیا۔"</string> - <string name="create_error" msgid="3735649141335444215">"فولڈر بنانے میں ناکام ہو گیا"</string> - <string name="query_error" msgid="5999895349602476581">"اس وقت مواد لوڈ نہیں ہو سکتا"</string> - <string name="root_recent" msgid="4470053704320518133">"حالیہ"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> خالی"</string> - <string name="root_type_service" msgid="2178854894416775409">"اسٹوریج سروسز"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"شارٹ کٹس"</string> - <string name="root_type_device" msgid="7121342474653483538">"آلات"</string> - <string name="root_type_apps" msgid="8838065367985945189">"مزید ایپس"</string> - <string name="empty" msgid="7858882803708117596">"کوئی آئٹمز نہيں ہیں"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s میں کوئی مماثل نہیں"</string> - <string name="toast_no_application" msgid="4632640357724698144">"فائل نہیں کھل سکتی"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"کچھ دستاویزات کو حذف کرنے سے قاصر"</string> - <string name="share_via" msgid="8966594246261344259">"اشتراک کریں بذریعہ"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"فائلیں کاپی ہو رہی ہیں"</string> - <string name="move_notification_title" msgid="6193835179777284805">"فائلیں منتقل ہو رہی ہیں"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"فائلیں حذف کی جا رہی ہیں"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> باقی ہے"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں کاپی کی جا رہی ہیں۔</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل کاپی کی جا رہی ہے۔</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلز منتقل کی جا رہی ہیں۔</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل منتقل کی جا رہی ہے۔</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں حذف ہو رہی ہیں۔</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل حذف ہو رہی ہے۔</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"کالعدم کریں"</string> - <string name="copy_preparing" msgid="3896202461003039386">"کاپی کیلئے تیار ہو رہا ہے…"</string> - <string name="move_preparing" msgid="2772219441375531410">"منتقلی کیلئے تیار ہو رہی ہیں…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"حذف کرنے کیلئے تیاری ہو رہی ہے…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں کاپی نہیں ہو سکیں</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل کاپی نہیں ہو سکی</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں منتقل نہیں ہو سکیں</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل منتقل نہیں ہو سکی</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں حذف نہیں ہو سکیں</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل حذف نہیں ہو سکی</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"تفصیلات دیکھنے کیلئے تھپتھپائیں"</string> - <string name="close" msgid="3043722427445528732">"بند کریں"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"یہ فائلیں کاپی نہیں ہوئیں: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"یہ فائلیں منتقل نہیں ہوئیں: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"یہ فائلیں حذف نہیں ہوئیں: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"ان فائلوں کو ایک دوسرے فارمیٹ میں تبدیل کیا گیا تھا: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلز کلپ بورڈ پر کاپی کی گئیں۔</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل کلپ بورڈ پر کاپی کی گئی۔</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"منتخب کردہ فائلز کو اس مقام پر پیسٹ نہیں کیا جا سکتا۔"</string> - <string name="menu_rename" msgid="7678802479104285353">"نام تبدیل کریں"</string> - <string name="rename_error" msgid="4203041674883412606">"دستاویز کا نام تبدیل کرنے میں ناکام"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"خارج کریں"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"کچھ فائلوں کو تبدیل کیا گیا تھا"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> کو <xliff:g id="STORAGE"><i>^3</i></xliff:g> پر <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ڈائرکٹری تک رسائی عطا کریں؟"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> کو <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ڈائرکٹری تک رسائی دیں؟"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> کو اپنے ڈیٹا بشمول <xliff:g id="STORAGE"><i>^2</i></xliff:g> پر موجود تصاویر اور ویڈیوز تک رسائی عطا کریں؟"</string> - <string name="never_ask_again" msgid="4295278542972859268">"دوبارہ نہ پوچھیں"</string> - <string name="allow" msgid="7225948811296386551">"اجازت دیں"</string> - <string name="deny" msgid="2081879885755434506">"مسترد کریں"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> منتخب کردہ</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> منتخب کردہ</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> آئٹمز</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> آئٹم</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"\"<xliff:g id="NAME">%1$s</xliff:g>\" حذف کریں؟"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"\"<xliff:g id="NAME">%1$s</xliff:g>\" فولڈر اور اس کی مشمولات حذف کریں؟"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فائلیں حذف کریں؟</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فائل حذف کریں؟</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> فولڈرز اور ان کے مشمولات حذف کریں؟</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> فولڈر اور اس کے مشمولات حذف کریں؟</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> آئٹمز حذف کریں؟</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> آئٹم حذف کریں؟</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml deleted file mode 100644 index de13d51716b4..000000000000 --- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Fayllar"</string> - <string name="downloads_label" msgid="959113951084633612">"Yuklanmalar"</string> - <string name="title_open" msgid="4353228937663917801">"Ochish"</string> - <string name="title_save" msgid="2433679664882857999">"Saqlash"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Yangi jild"</string> - <string name="menu_grid" msgid="6878021334497835259">"To‘r ko‘rinishida"</string> - <string name="menu_list" msgid="7279285939892417279">"Ro‘yxat ko‘rinishida"</string> - <string name="menu_sort" msgid="7677740407158414452">"Saralash"</string> - <string name="menu_search" msgid="3816712084502856974">"Qidirish"</string> - <string name="menu_settings" msgid="8239065133341597825">"Xotira sozlamalari"</string> - <string name="menu_open" msgid="432922957274920903">"Ochish"</string> - <string name="menu_save" msgid="2394743337684426338">"Saqlash"</string> - <string name="menu_share" msgid="3075149983979628146">"Baham ko‘rish"</string> - <string name="menu_delete" msgid="8138799623850614177">"O‘chirish"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Hammasini belgilash"</string> - <string name="menu_copy" msgid="3612326052677229148">"Nusxalash…"</string> - <string name="menu_move" msgid="1828090633118079817">"Ko‘chirib o‘tkazish…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Yangi oyna"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Kesish"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Nusxalash"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Joylash"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Ichki xotirani ko‘rsatish"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ichki xotirani berkitish"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Fayllar hajmi ko‘rsatilsin"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Fayllar hajmi ko‘rsatilmasin"</string> - <string name="button_select" msgid="527196987259139214">"Tanlash"</string> - <string name="button_copy" msgid="8706475544635021302">"Nusxalash"</string> - <string name="button_move" msgid="2202666023104202232">"Ko‘chirib o‘tkazish"</string> - <string name="button_dismiss" msgid="3714065566893946085">"O‘chirish"</string> - <string name="button_retry" msgid="4392027584153752797">"Qayta urinish"</string> - <string name="sort_name" msgid="9183560467917256779">"Nomi bo‘yicha"</string> - <string name="sort_date" msgid="586080032956151448">"Tahrir sanasi bo‘yicha"</string> - <string name="sort_size" msgid="3350681319735474741">"Hajmi bo‘yicha"</string> - <string name="drawer_open" msgid="4545466532430226949">"Asosiy jildlarni ko‘rsatish"</string> - <string name="drawer_close" msgid="7602734368552123318">"Asosiy jildlarni yashirish"</string> - <string name="save_error" msgid="6167009778003223664">"Hujjat saqlanmadi"</string> - <string name="create_error" msgid="3735649141335444215">"Jild yaratilmadi"</string> - <string name="query_error" msgid="5999895349602476581">"Ayni paytda kontentni yuklab bo‘lmayapti"</string> - <string name="root_recent" msgid="4470053704320518133">"Yaqinda"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> bo‘sh"</string> - <string name="root_type_service" msgid="2178854894416775409">"Xotira xizmatlari"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Yorliqlar"</string> - <string name="root_type_device" msgid="7121342474653483538">"Qurilmalar"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Ko‘proq dasturlar"</string> - <string name="empty" msgid="7858882803708117596">"Hech narsa yo‘q"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s jildidan topilmadi"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Fayl ochilmadi"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Ba’zi hujjatlar o‘chirilmadi"</string> - <string name="share_via" msgid="8966594246261344259">"Baham ko‘rish"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Fayllar nusxalanmoqda"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Ko‘chirib o‘tkazilmoqda"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Fayllar o‘chirilmoqda"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> qoldi"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other"> <xliff:g id="COUNT_1">%1$d</xliff:g> ta fayl nusxalanmoqda</item> - <item quantity="one"> <xliff:g id="COUNT_0">%1$d</xliff:g> ta fayl nusxalanmoqda</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta fayl ko‘chirib o‘tkazilmoqda.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta fayl ko‘chirib o‘tkazilmoqda.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta fayl o‘chirilmoqda.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta fayl o‘chirilmoqda.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Bekor qilish"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Nuxsa olishga tayyorgarlik..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Ko‘chirishga tayyorgarlik…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"O‘chirishga tayyorlanmoqda…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta fayldan nusxa olib bo‘lmadi</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta fayldan nusxa olib bo‘lmadi</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta faylni ko‘chirib bo‘lmadi</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta faylni ko‘chirib bo‘lmadi</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta faylni o‘chirib bo‘lmadi</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta faylni o‘chirib bo‘lmadi</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Batafsil ma’lumot olish uchun bosing"</string> - <string name="close" msgid="3043722427445528732">"Yopish"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Quyidagi fayllardan nusxa olinmadi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Quyidagi fayllar ko‘chirilmadi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Quyidagi fayllar o‘chirib tashlanmadi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Ushbu fayllar boshqa formatga o‘girildi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta fayldan vaqtinchalik xotiraga nusxa olindi.</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta fayldan vaqtinchalik xotiraga nusxa olindi.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Tanlangan fayllarni bu yerga joylab bo‘lmadi."</string> - <string name="menu_rename" msgid="7678802479104285353">"Qayta nomlash"</string> - <string name="rename_error" msgid="4203041674883412606">"Hujjatni qayta nomlab bo‘lmadi"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Chiqarish"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Bir nechta fayllar o‘girildi"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ilovasiga <xliff:g id="STORAGE"><i>^3</i></xliff:g> xotirasidagi “<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>” jildidan foydalanishiga ruxsat berilsinmi?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ilovasiga “<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>” jildidan foydalanishiga ruxsat berilsinmi?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"<xliff:g id="APPNAME"><b>^1</b></xliff:g> ilovasiga <xliff:g id="STORAGE"><i>^2</i></xliff:g> xotirasidagi ma’lumotlardan, jumladan, rasmlar va videolardan foydalanishiga ruxsat berilsinmi?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Boshqa so‘ralmasin"</string> - <string name="allow" msgid="7225948811296386551">"Ruxsat berish"</string> - <string name="deny" msgid="2081879885755434506">"Rad qilish"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta belgilandi</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta belgilandi</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta element</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta element</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"“<xliff:g id="NAME">%1$s</xliff:g>” o‘chirib tashlansinmi?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"“<xliff:g id="NAME">%1$s</xliff:g>” jildi ichidagi kontentlari bilan o‘chirib tashlansinmi?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta fayl o‘chirilsinmi?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta fayl o‘chirib tashlansinmi?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta jild ichidagi kontentlari bilan o‘chirib tashlansinmi?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta jild ichidagi kontentlari bilan o‘chirib tashlansinmi?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> ta element o‘chirib tashlansinmi?</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> ta element o‘chirib tashlansinmi?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml deleted file mode 100644 index 37f29a821240..000000000000 --- a/packages/DocumentsUI/res/values-vi/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Tệp"</string> - <string name="downloads_label" msgid="959113951084633612">"Tải xuống"</string> - <string name="title_open" msgid="4353228937663917801">"Mở từ"</string> - <string name="title_save" msgid="2433679664882857999">"Lưu vào"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Thư mục mới"</string> - <string name="menu_grid" msgid="6878021334497835259">"Chế độ xem lưới"</string> - <string name="menu_list" msgid="7279285939892417279">"Chế độ xem danh sách"</string> - <string name="menu_sort" msgid="7677740407158414452">"Sắp xếp theo"</string> - <string name="menu_search" msgid="3816712084502856974">"Tìm kiếm"</string> - <string name="menu_settings" msgid="8239065133341597825">"Cài đặt bộ nhớ"</string> - <string name="menu_open" msgid="432922957274920903">"Mở"</string> - <string name="menu_save" msgid="2394743337684426338">"Lưu"</string> - <string name="menu_share" msgid="3075149983979628146">"Chia sẻ"</string> - <string name="menu_delete" msgid="8138799623850614177">"Xóa"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Chọn tất cả"</string> - <string name="menu_copy" msgid="3612326052677229148">"Sao chép vào…"</string> - <string name="menu_move" msgid="1828090633118079817">"Chuyển tới..."</string> - <string name="menu_new_window" msgid="1226032889278727538">"Cửa sổ mới"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Cắt"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Sao chép"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Dán"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Hiển thị bộ nhớ trong"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Ẩn bộ nhớ trong"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Hiển thị kích thước tệp"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Ẩn kích thước tệp"</string> - <string name="button_select" msgid="527196987259139214">"Chọn"</string> - <string name="button_copy" msgid="8706475544635021302">"Sao chép"</string> - <string name="button_move" msgid="2202666023104202232">"Di chuyển"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Loại bỏ"</string> - <string name="button_retry" msgid="4392027584153752797">"Thử lại"</string> - <string name="sort_name" msgid="9183560467917256779">"Theo tên"</string> - <string name="sort_date" msgid="586080032956151448">"Theo ngày sửa đổi"</string> - <string name="sort_size" msgid="3350681319735474741">"Theo kích thước"</string> - <string name="drawer_open" msgid="4545466532430226949">"Hiển thị gốc"</string> - <string name="drawer_close" msgid="7602734368552123318">"Ẩn gốc"</string> - <string name="save_error" msgid="6167009778003223664">"Không lưu tài liệu được"</string> - <string name="create_error" msgid="3735649141335444215">"Không thể tạo thư mục"</string> - <string name="query_error" msgid="5999895349602476581">"Không thể tải nội dung vào lúc này"</string> - <string name="root_recent" msgid="4470053704320518133">"Gần đây"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> còn trống"</string> - <string name="root_type_service" msgid="2178854894416775409">"Dịch vụ lưu trữ"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Lối tắt"</string> - <string name="root_type_device" msgid="7121342474653483538">"Thiết bị"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Các ứng dụng khác"</string> - <string name="empty" msgid="7858882803708117596">"Không có mục nào"</string> - <string name="no_results" msgid="6622510343880730446">"Không có kết quả phù hợp trong %1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Không thể mở tệp"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Không thể xóa một số tài liệu"</string> - <string name="share_via" msgid="8966594246261344259">"Chia sẻ qua"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Đang sao chép tệp"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Đang di chuyển tệp"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Đang xóa tệp"</string> - <string name="copy_remaining" msgid="6283790937387975095">"Còn <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">Đang sao chép <xliff:g id="COUNT_1">%1$d</xliff:g> tệp.</item> - <item quantity="one">Đang sao chép <xliff:g id="COUNT_0">%1$d</xliff:g> tệp.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">Đang di chuyển <xliff:g id="COUNT_1">%1$d</xliff:g> tệp.</item> - <item quantity="one">Đang di chuyển <xliff:g id="COUNT_0">%1$d</xliff:g> tệp.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">Xóa <xliff:g id="COUNT_1">%1$d</xliff:g> tệp.</item> - <item quantity="one">Xóa <xliff:g id="COUNT_0">%1$d</xliff:g> tệp.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Hoàn tác"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Đang chuẩn bị sao chép…"</string> - <string name="move_preparing" msgid="2772219441375531410">"Đang chuẩn bị di chuyển…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Đang chuẩn bị xóa…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">Không thể sao chép <xliff:g id="COUNT_1">%1$d</xliff:g> tệp</item> - <item quantity="one">Không thể sao chép <xliff:g id="COUNT_0">%1$d</xliff:g> tệp</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">Không thể di chuyển <xliff:g id="COUNT_1">%1$d</xliff:g> tệp</item> - <item quantity="one">Không thể di chuyển <xliff:g id="COUNT_0">%1$d</xliff:g> tệp</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">Không thể xóa <xliff:g id="COUNT_1">%1$d</xliff:g> tệp</item> - <item quantity="one">Không thể xóa <xliff:g id="COUNT_0">%1$d</xliff:g> tệp</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Nhấn để xem chi tiết"</string> - <string name="close" msgid="3043722427445528732">"Đóng"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Những tệp này chưa được sao chép: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Những tệp này chưa được di chuyển: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Những tệp này chưa được xóa: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Các tệp này đã được chuyển đổi sang định dạng khác: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">Đã sao chép <xliff:g id="COUNT_1">%1$d</xliff:g> tệp vào khay nhớ tạm.</item> - <item quantity="one">Đã sao chép <xliff:g id="COUNT_0">%1$d</xliff:g> tệp vào khay nhớ tạm.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Không thể dán các tệp đã chọn vào vị trí này."</string> - <string name="menu_rename" msgid="7678802479104285353">"Đổi tên"</string> - <string name="rename_error" msgid="4203041674883412606">"Không đổi được tên tài liệu"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Đẩy ra"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Đã chuyển đổi một số tệp"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Cấp cho <xliff:g id="APPNAME"><b>^1</b></xliff:g> quyền truy cập vào thư mục <xliff:g id="DIRECTORY"><i>^2</i></xliff:g> trong <xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Cấp cho <xliff:g id="APPNAME"><b>^1</b></xliff:g> quyền truy cập thư mục <xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Cấp cho <xliff:g id="APPNAME"><b>^1</b></xliff:g> quyền truy cập vào dữ liệu của bạn, kể cả ảnh và video trên <xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Không hỏi lại"</string> - <string name="allow" msgid="7225948811296386551">"Cho phép"</string> - <string name="deny" msgid="2081879885755434506">"Từ chối"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">Đã chọn <xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="one">Đã chọn <xliff:g id="COUNT_0">%1$d</xliff:g></item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> mục</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> mục</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Xóa \"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Xóa thư mục \"<xliff:g id="NAME">%1$s</xliff:g>\" và nội dung của thư mục?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">Xóa <xliff:g id="COUNT_1">%1$d</xliff:g> tệp?</item> - <item quantity="one">Xóa <xliff:g id="COUNT_0">%1$d</xliff:g> tệp?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">Xóa <xliff:g id="COUNT_1">%1$d</xliff:g> thư mục và nội dung trong đó?</item> - <item quantity="one">Xóa <xliff:g id="COUNT_0">%1$d</xliff:g> thư mục và nội dung trong đó?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">Xóa <xliff:g id="COUNT_1">%1$d</xliff:g> mục?</item> - <item quantity="one">Xóa <xliff:g id="COUNT_0">%1$d</xliff:g> mục?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml deleted file mode 100644 index 61f125b22e87..000000000000 --- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"文件"</string> - <string name="downloads_label" msgid="959113951084633612">"下载"</string> - <string name="title_open" msgid="4353228937663917801">"打开文件"</string> - <string name="title_save" msgid="2433679664882857999">"保存文件"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"新建文件夹"</string> - <string name="menu_grid" msgid="6878021334497835259">"网格视图"</string> - <string name="menu_list" msgid="7279285939892417279">"列表视图"</string> - <string name="menu_sort" msgid="7677740407158414452">"排序依据"</string> - <string name="menu_search" msgid="3816712084502856974">"搜索"</string> - <string name="menu_settings" msgid="8239065133341597825">"存储设置"</string> - <string name="menu_open" msgid="432922957274920903">"打开"</string> - <string name="menu_save" msgid="2394743337684426338">"保存"</string> - <string name="menu_share" msgid="3075149983979628146">"分享"</string> - <string name="menu_delete" msgid="8138799623850614177">"删除"</string> - <string name="menu_select_all" msgid="8323579667348729928">"全选"</string> - <string name="menu_copy" msgid="3612326052677229148">"复制到…"</string> - <string name="menu_move" msgid="1828090633118079817">"移动到…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"新建窗口"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"剪切"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"复制"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"粘贴"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"显示内部存储设备"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"隐藏内部存储设备"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"显示文件大小"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"隐藏文件大小"</string> - <string name="button_select" msgid="527196987259139214">"选择"</string> - <string name="button_copy" msgid="8706475544635021302">"复制"</string> - <string name="button_move" msgid="2202666023104202232">"移动"</string> - <string name="button_dismiss" msgid="3714065566893946085">"关闭"</string> - <string name="button_retry" msgid="4392027584153752797">"重试"</string> - <string name="sort_name" msgid="9183560467917256779">"按名称"</string> - <string name="sort_date" msgid="586080032956151448">"按修改日期"</string> - <string name="sort_size" msgid="3350681319735474741">"按大小"</string> - <string name="drawer_open" msgid="4545466532430226949">"显示根目录"</string> - <string name="drawer_close" msgid="7602734368552123318">"隐藏根目录"</string> - <string name="save_error" msgid="6167009778003223664">"无法保存文档"</string> - <string name="create_error" msgid="3735649141335444215">"无法创建文件夹"</string> - <string name="query_error" msgid="5999895349602476581">"暂时无法加载内容"</string> - <string name="root_recent" msgid="4470053704320518133">"最近"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"可用空间:<xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"存储服务"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"捷径"</string> - <string name="root_type_device" msgid="7121342474653483538">"设备"</string> - <string name="root_type_apps" msgid="8838065367985945189">"更多应用"</string> - <string name="empty" msgid="7858882803708117596">"无任何文件"</string> - <string name="no_results" msgid="6622510343880730446">"%1$s中没有任何相符项"</string> - <string name="toast_no_application" msgid="4632640357724698144">"无法打开文件"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"无法删除部分文档"</string> - <string name="share_via" msgid="8966594246261344259">"分享方式"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"正在复制文件"</string> - <string name="move_notification_title" msgid="6193835179777284805">"正在移动文件"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"正在删除文件"</string> - <string name="copy_remaining" msgid="6283790937387975095">"剩余时间:<xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">正在复制 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件。</item> - <item quantity="one">正在复制 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件。</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">正在移动 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件。</item> - <item quantity="one">正在移动 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件。</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">正在删除 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件。</item> - <item quantity="one">正在删除 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件。</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"撤消"</string> - <string name="copy_preparing" msgid="3896202461003039386">"正在准备复制…"</string> - <string name="move_preparing" msgid="2772219441375531410">"正在准备移动…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"正在准备删除…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">无法复制 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件</item> - <item quantity="one">无法复制 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">无法移动 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件</item> - <item quantity="one">无法移动 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">无法删除 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件</item> - <item quantity="one">无法删除 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"点按即可查看详情"</string> - <string name="close" msgid="3043722427445528732">"关闭"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"无法复制以下文件:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"无法移动以下文件:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"未能删除以下文件:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"下列文件已转换成其他格式:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">已将 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件复制到剪贴板。</item> - <item quantity="one">已将 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件复制到剪贴板。</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"无法将所选文件粘贴到此位置。"</string> - <string name="menu_rename" msgid="7678802479104285353">"重命名"</string> - <string name="rename_error" msgid="4203041674883412606">"无法重命名文档"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"弹出"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"部分文件已转换成其他格式"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"要授权<xliff:g id="APPNAME"><b>^1</b></xliff:g>访问 <xliff:g id="STORAGE"><i>^3</i></xliff:g>上的“<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>”目录吗?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"要授权<xliff:g id="APPNAME"><b>^1</b></xliff:g>访问“<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>”目录吗?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"要授权<xliff:g id="APPNAME"><b>^1</b></xliff:g>访问您 <xliff:g id="STORAGE"><i>^2</i></xliff:g>上的数据(包括照片和视频)吗?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"不再询问"</string> - <string name="allow" msgid="7225948811296386551">"允许"</string> - <string name="deny" msgid="2081879885755434506">"拒绝"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">已选择 <xliff:g id="COUNT_1">%1$d</xliff:g> 项</item> - <item quantity="one">已选择 <xliff:g id="COUNT_0">%1$d</xliff:g> 项</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 项</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 项</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"确定要删除“<xliff:g id="NAME">%1$s</xliff:g>”吗?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"要删除文件夹“<xliff:g id="NAME">%1$s</xliff:g>”及其中的内容吗?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">删除 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件?</item> - <item quantity="one">删除 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">删除 <xliff:g id="COUNT_1">%1$d</xliff:g> 个文件夹及其中的内容?</item> - <item quantity="one">删除 <xliff:g id="COUNT_0">%1$d</xliff:g> 个文件夹及其中的内容?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">删除 <xliff:g id="COUNT_1">%1$d</xliff:g> 项?</item> - <item quantity="one">删除 <xliff:g id="COUNT_0">%1$d</xliff:g> 项?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml deleted file mode 100644 index 5fcf5af34c53..000000000000 --- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"檔案"</string> - <string name="downloads_label" msgid="959113951084633612">"下載"</string> - <string name="title_open" msgid="4353228937663917801">"開啟檔案"</string> - <string name="title_save" msgid="2433679664882857999">"儲存至"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"新增資料夾"</string> - <string name="menu_grid" msgid="6878021334497835259">"格狀檢視"</string> - <string name="menu_list" msgid="7279285939892417279">"清單檢視"</string> - <string name="menu_sort" msgid="7677740407158414452">"排序方式"</string> - <string name="menu_search" msgid="3816712084502856974">"搜尋"</string> - <string name="menu_settings" msgid="8239065133341597825">"儲存空間設定"</string> - <string name="menu_open" msgid="432922957274920903">"開啟"</string> - <string name="menu_save" msgid="2394743337684426338">"儲存"</string> - <string name="menu_share" msgid="3075149983979628146">"分享"</string> - <string name="menu_delete" msgid="8138799623850614177">"刪除"</string> - <string name="menu_select_all" msgid="8323579667348729928">"全部選取"</string> - <string name="menu_copy" msgid="3612326052677229148">"複製到…"</string> - <string name="menu_move" msgid="1828090633118079817">"移至…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"新視窗"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"剪下"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"複製"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"貼上"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"顯示內部儲存空間"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"隱藏內部儲存空間"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"顯示檔案大小"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"隱藏檔案大小"</string> - <string name="button_select" msgid="527196987259139214">"選取"</string> - <string name="button_copy" msgid="8706475544635021302">"複製"</string> - <string name="button_move" msgid="2202666023104202232">"移動"</string> - <string name="button_dismiss" msgid="3714065566893946085">"關閉"</string> - <string name="button_retry" msgid="4392027584153752797">"再試一次"</string> - <string name="sort_name" msgid="9183560467917256779">"按名稱"</string> - <string name="sort_date" msgid="586080032956151448">"按修改日期"</string> - <string name="sort_size" msgid="3350681319735474741">"按大小"</string> - <string name="drawer_open" msgid="4545466532430226949">"顯示根目錄"</string> - <string name="drawer_close" msgid="7602734368552123318">"隱藏根目錄"</string> - <string name="save_error" msgid="6167009778003223664">"無法儲存文件"</string> - <string name="create_error" msgid="3735649141335444215">"無法建立資料夾"</string> - <string name="query_error" msgid="5999895349602476581">"目前無法載入內容"</string> - <string name="root_recent" msgid="4470053704320518133">"最近"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"可用空間:<xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"儲存空間服務"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"捷徑"</string> - <string name="root_type_device" msgid="7121342474653483538">"裝置"</string> - <string name="root_type_apps" msgid="8838065367985945189">"更多應用程式"</string> - <string name="empty" msgid="7858882803708117596">"沒有項目"</string> - <string name="no_results" msgid="6622510343880730446">"「%1$s」中沒有相符結果"</string> - <string name="toast_no_application" msgid="4632640357724698144">"無法開啟檔案"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string> - <string name="share_via" msgid="8966594246261344259">"分享方式:"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"正在複製檔案"</string> - <string name="move_notification_title" msgid="6193835179777284805">"正在移動檔案"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"正在刪除檔案"</string> - <string name="copy_remaining" msgid="6283790937387975095">"剩餘 <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">正在複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> - <item quantity="one">正在複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">正在轉移 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> - <item quantity="one">正在轉移 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">正在刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> - <item quantity="one">正在刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"復原"</string> - <string name="copy_preparing" msgid="3896202461003039386">"正在準備複製…"</string> - <string name="move_preparing" msgid="2772219441375531410">"正在準備移動…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"正在準備刪除…"</string> - <string name="delete_progress" msgid="5399405983046157222">"第 <xliff:g id="COUNT_0">%1$d</xliff:g> 個,共 <xliff:g id="TOTALCOUNT">%2$d</xliff:g> 個"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">無法複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案</item> - <item quantity="one">無法複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">無法移動 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案</item> - <item quantity="one">無法移動 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">無法刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案</item> - <item quantity="one">無法刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"輕按即可查看詳細資訊"</string> - <string name="close" msgid="3043722427445528732">"關閉"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"以下檔案未能複製:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"以下檔案未能移動:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"無法刪除以下檔案:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"這些檔案已轉換成其他格式:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">已複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案到剪貼簿。</item> - <item quantity="one">已複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案到剪貼簿。</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"無法在此位置貼上選取檔案。"</string> - <string name="menu_rename" msgid="7678802479104285353">"重新命名"</string> - <string name="rename_error" msgid="4203041674883412606">"無法重新命名文件"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"逐出"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"部分檔案已轉換成其他格式"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"要為「<xliff:g id="APPNAME"><b>^1</b></xliff:g>」開放 <xliff:g id="STORAGE"><i>^3</i></xliff:g>上的「<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>」目錄存取權嗎?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"要為「<xliff:g id="APPNAME"><b>^1</b></xliff:g>」開放「<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>」目錄的存取權嗎?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"要向「<xliff:g id="APPNAME"><b>^1</b></xliff:g>」開放 <xliff:g id="STORAGE"><i>^2</i></xliff:g>上的相片和影片等資料的存取權嗎?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"不要再詢問"</string> - <string name="allow" msgid="7225948811296386551">"允許"</string> - <string name="deny" msgid="2081879885755434506">"拒絕"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">已選取 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item> - <item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"要刪除「<xliff:g id="NAME">%1$s</xliff:g>」嗎?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"要刪除「<xliff:g id="NAME">%1$s</xliff:g>」資料夾及其內容嗎?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">要刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案嗎?</item> - <item quantity="one">要刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案嗎?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">要刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個資料夾及其內容嗎?</item> - <item quantity="one">要刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個資料夾及其內容嗎?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">要刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目嗎?</item> - <item quantity="one">要刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目嗎?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml deleted file mode 100644 index baa6df93d864..000000000000 --- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"檔案"</string> - <string name="downloads_label" msgid="959113951084633612">"下載"</string> - <string name="title_open" msgid="4353228937663917801">"開啟檔案"</string> - <string name="title_save" msgid="2433679664882857999">"儲存至"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"新增資料夾"</string> - <string name="menu_grid" msgid="6878021334497835259">"格狀檢視"</string> - <string name="menu_list" msgid="7279285939892417279">"清單檢視"</string> - <string name="menu_sort" msgid="7677740407158414452">"排序依據"</string> - <string name="menu_search" msgid="3816712084502856974">"搜尋"</string> - <string name="menu_settings" msgid="8239065133341597825">"Storage 設定"</string> - <string name="menu_open" msgid="432922957274920903">"開啟"</string> - <string name="menu_save" msgid="2394743337684426338">"儲存"</string> - <string name="menu_share" msgid="3075149983979628146">"共用"</string> - <string name="menu_delete" msgid="8138799623850614177">"刪除"</string> - <string name="menu_select_all" msgid="8323579667348729928">"全選"</string> - <string name="menu_copy" msgid="3612326052677229148">"複製到…"</string> - <string name="menu_move" msgid="1828090633118079817">"移至…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"新增視窗"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"剪下"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"複製"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"貼上"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"顯示內部儲存空間"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"隱藏內部儲存空間"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"顯示檔案大小"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"隱藏檔案大小"</string> - <string name="button_select" msgid="527196987259139214">"選取"</string> - <string name="button_copy" msgid="8706475544635021302">"複製"</string> - <string name="button_move" msgid="2202666023104202232">"移動"</string> - <string name="button_dismiss" msgid="3714065566893946085">"關閉"</string> - <string name="button_retry" msgid="4392027584153752797">"再試一次"</string> - <string name="sort_name" msgid="9183560467917256779">"依名稱"</string> - <string name="sort_date" msgid="586080032956151448">"依修改日期"</string> - <string name="sort_size" msgid="3350681319735474741">"依大小"</string> - <string name="drawer_open" msgid="4545466532430226949">"顯示根目錄"</string> - <string name="drawer_close" msgid="7602734368552123318">"隱藏根目錄"</string> - <string name="save_error" msgid="6167009778003223664">"無法儲存文件"</string> - <string name="create_error" msgid="3735649141335444215">"無法建立資料夾"</string> - <string name="query_error" msgid="5999895349602476581">"目前無法載入內容"</string> - <string name="root_recent" msgid="4470053704320518133">"最近"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"可用空間:<xliff:g id="SIZE">%1$s</xliff:g>"</string> - <string name="root_type_service" msgid="2178854894416775409">"儲存空間服務"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"捷徑"</string> - <string name="root_type_device" msgid="7121342474653483538">"裝置"</string> - <string name="root_type_apps" msgid="8838065367985945189">"更多應用程式"</string> - <string name="empty" msgid="7858882803708117596">"沒有任何項目"</string> - <string name="no_results" msgid="6622510343880730446">"沒有與「%1$s」相符的結果"</string> - <string name="toast_no_application" msgid="4632640357724698144">"無法開啟檔案"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string> - <string name="share_via" msgid="8966594246261344259">"分享方式:"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"複製檔案"</string> - <string name="move_notification_title" msgid="6193835179777284805">"正在移動檔案"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"正在刪除檔案"</string> - <string name="copy_remaining" msgid="6283790937387975095">"剩餘 <xliff:g id="DURATION">%s</xliff:g>"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="other">正在複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> - <item quantity="one">正在複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="other">正在移動 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> - <item quantity="one">正在移動 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="other">正在刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案。</item> - <item quantity="one">正在刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案。</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"復原"</string> - <string name="copy_preparing" msgid="3896202461003039386">"正在準備複製…"</string> - <string name="move_preparing" msgid="2772219441375531410">"準備移動…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"正在準備刪除…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="other">無法複製 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案</item> - <item quantity="one">無法複製 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案</item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="other">無法移動 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案</item> - <item quantity="one">無法移動 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案</item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="other">無法刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案</item> - <item quantity="one">無法刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案</item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"輕觸即可查看詳細資訊"</string> - <string name="close" msgid="3043722427445528732">"關閉"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"未複製下列檔案:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"未移動下列檔案:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"未刪除下列檔案:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"下列檔案已轉換成其他格式:<xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="other">已將 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案複製到剪貼簿。</item> - <item quantity="one">已將 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案複製到剪貼簿。</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"無法將所選檔案貼到這個位置。"</string> - <string name="menu_rename" msgid="7678802479104285353">"重新命名"</string> - <string name="rename_error" msgid="4203041674883412606">"無法重新命名文件"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"退出"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"部分檔案已轉換成其他格式"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"要允許<xliff:g id="APPNAME"><b>^1</b></xliff:g>存取 <xliff:g id="STORAGE"><i>^3</i></xliff:g>上的「<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>」目錄嗎?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"要允許<xliff:g id="APPNAME"><b>^1</b></xliff:g>存取「<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>」目錄嗎?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"要允許「<xliff:g id="APPNAME"><b>^1</b></xliff:g>」存取 <xliff:g id="STORAGE"><i>^2</i></xliff:g>上的資料 (包括相片和影片) 嗎?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"不要再詢問"</string> - <string name="allow" msgid="7225948811296386551">"允許"</string> - <string name="deny" msgid="2081879885755434506">"拒絕"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="other">已選取 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item> - <item quantity="one">已選取 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> 個項目</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> 個項目</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"要刪除「<xliff:g id="NAME">%1$s</xliff:g>」嗎?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"要刪除「<xliff:g id="NAME">%1$s</xliff:g>」資料夾和當中的內容嗎?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="other">要刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個檔案嗎?</item> - <item quantity="one">要刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個檔案嗎?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="other">要刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個資料夾和當中的內容嗎?</item> - <item quantity="one">要刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個資料夾和當中的內容嗎?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="other">要刪除 <xliff:g id="COUNT_1">%1$d</xliff:g> 個項目嗎?</item> - <item quantity="one">要刪除 <xliff:g id="COUNT_0">%1$d</xliff:g> 個項目嗎?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml deleted file mode 100644 index 11779413fc07..000000000000 --- a/packages/DocumentsUI/res/values-zu/strings.xml +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="1551050262492398204">"Amafayela"</string> - <string name="downloads_label" msgid="959113951084633612">"Okulandiwe"</string> - <string name="title_open" msgid="4353228937663917801">"Vula kusuka ku-"</string> - <string name="title_save" msgid="2433679664882857999">"Londoloza ku-"</string> - <string name="menu_create_dir" msgid="2547620241173881754">"Ifolda entsha"</string> - <string name="menu_grid" msgid="6878021334497835259">"Ukubuka kwegridi"</string> - <string name="menu_list" msgid="7279285939892417279">"Ukubuka uhlu"</string> - <string name="menu_sort" msgid="7677740407158414452">"Hlunga nge-"</string> - <string name="menu_search" msgid="3816712084502856974">"Sesha"</string> - <string name="menu_settings" msgid="8239065133341597825">"Izilungiselelo zesitoreji"</string> - <string name="menu_open" msgid="432922957274920903">"Vula"</string> - <string name="menu_save" msgid="2394743337684426338">"Londoloza"</string> - <string name="menu_share" msgid="3075149983979628146">"Yabelana"</string> - <string name="menu_delete" msgid="8138799623850614177">"Susa"</string> - <string name="menu_select_all" msgid="8323579667348729928">"Khetha konke"</string> - <string name="menu_copy" msgid="3612326052677229148">"Kopishela ku…"</string> - <string name="menu_move" msgid="1828090633118079817">"Hambisa ku…"</string> - <string name="menu_new_window" msgid="1226032889278727538">"Iwindi elisha"</string> - <string name="menu_cut_to_clipboard" msgid="2467149185452488383">"Sika"</string> - <string name="menu_copy_to_clipboard" msgid="489311381979634291">"Kopisha"</string> - <string name="menu_paste_from_clipboard" msgid="2071583031180257091">"Namathisela"</string> - <string name="menu_advanced_show" msgid="4693652895715631401">"Bonisa isitoreji sangaphakathi"</string> - <string name="menu_advanced_hide" msgid="4218809952721972589">"Fihla isitoreji sangaphakathi"</string> - <string name="menu_file_size_show" msgid="3240323619260823076">"Bonisa usayizi wefayela"</string> - <string name="menu_file_size_hide" msgid="8881975928502581042">"Fihla usayizi wefayela"</string> - <string name="button_select" msgid="527196987259139214">"Khetha"</string> - <string name="button_copy" msgid="8706475544635021302">"Kopisha"</string> - <string name="button_move" msgid="2202666023104202232">"Hambisa"</string> - <string name="button_dismiss" msgid="3714065566893946085">"Cashisa"</string> - <string name="button_retry" msgid="4392027584153752797">"Zama futhi"</string> - <string name="sort_name" msgid="9183560467917256779">"Ngegama"</string> - <string name="sort_date" msgid="586080032956151448">"Ngedethi yokuguqula"</string> - <string name="sort_size" msgid="3350681319735474741">"Ngosayizi"</string> - <string name="drawer_open" msgid="4545466532430226949">"Bonisa izimpande"</string> - <string name="drawer_close" msgid="7602734368552123318">"Fihla izimpande"</string> - <string name="save_error" msgid="6167009778003223664">"Yehlulekile ukulondoloza idokhumenti"</string> - <string name="create_error" msgid="3735649141335444215">"Yehlulekile ukudala ifolda"</string> - <string name="query_error" msgid="5999895349602476581">"Ayikwazanga ukulayisha okuqukethwe okwamanje"</string> - <string name="root_recent" msgid="4470053704320518133">"Okwakamuva"</string> - <string name="root_available_bytes" msgid="8568452858617033281">"<xliff:g id="SIZE">%1$s</xliff:g> okhululekile"</string> - <string name="root_type_service" msgid="2178854894416775409">"Amasevisi wesitoreji"</string> - <string name="root_type_shortcut" msgid="3318760609471618093">"Izinqamuleli"</string> - <string name="root_type_device" msgid="7121342474653483538">"Amadivayisi"</string> - <string name="root_type_apps" msgid="8838065367985945189">"Izinhlelo zokusebenza eziningi"</string> - <string name="empty" msgid="7858882803708117596">"Azikho izinto"</string> - <string name="no_results" msgid="6622510343880730446">"Akukho okufanayo ku-%1$s"</string> - <string name="toast_no_application" msgid="4632640357724698144">"Ayikwazanga ukuvula ifayela"</string> - <string name="toast_failed_delete" msgid="2180678019407244069">"Ayikwazi ukususa amanye amadokhumenti"</string> - <string name="share_via" msgid="8966594246261344259">"Yabelana nge-"</string> - <string name="copy_notification_title" msgid="6374299806748219777">"Ikopisha amafayela"</string> - <string name="move_notification_title" msgid="6193835179777284805">"Ihambisa amafayela"</string> - <string name="delete_notification_title" msgid="3329403967712437496">"Ukususa amafayela"</string> - <string name="copy_remaining" msgid="6283790937387975095">"<xliff:g id="DURATION">%s</xliff:g> okusele"</string> - <plurals name="copy_begin" formatted="false" msgid="9071199452634086365"> - <item quantity="one">Ikopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item> - <item quantity="other">Ikopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item> - </plurals> - <plurals name="move_begin" formatted="false" msgid="8430330882138871643"> - <item quantity="one">Ihambisa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item> - <item quantity="other">Ihambisa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item> - </plurals> - <plurals name="deleting" formatted="false" msgid="5054338566802559411"> - <item quantity="one">Isusa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item> - <item quantity="other">Isusa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>.</item> - </plurals> - <string name="undo" msgid="7905788502491742328">"Hlehlisa"</string> - <string name="copy_preparing" msgid="3896202461003039386">"Ilungiselela ukukopisha..."</string> - <string name="move_preparing" msgid="2772219441375531410">"Ilungiselela ukuhambisa…"</string> - <string name="delete_preparing" msgid="5655813182533491992">"Ilungiselela ukususa…"</string> - <string name="delete_progress" msgid="5399405983046157222">"<xliff:g id="COUNT_0">%1$d</xliff:g> / <xliff:g id="TOTALCOUNT">%2$d</xliff:g>"</string> - <plurals name="copy_error_notification_title" formatted="false" msgid="7160447124922897689"> - <item quantity="one">Ayikwazanga ukukopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Ayikwazanga ukukopisha amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <plurals name="move_error_notification_title" formatted="false" msgid="2710901971014783012"> - <item quantity="one">Ayikwazanga ukuhambisa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Ayikwazanga ukuhambisa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <plurals name="delete_error_notification_title" formatted="false" msgid="7228393157786591199"> - <item quantity="one">Ayikwazanga ukususa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> - <item quantity="other">Ayikwazanga ukususa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g></item> - </plurals> - <string name="notification_touch_for_details" msgid="6268189413228855582">"Thepha ukuze ubuke imininingwane"</string> - <string name="close" msgid="3043722427445528732">"Vala"</string> - <string name="copy_failure_alert_content" msgid="4563147454522476183">"Lawo mafayela awakopishwanga: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="move_failure_alert_content" msgid="2635075788682922861">"Lawa mafayela awazange ahanjiswe: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="delete_failure_alert_content" msgid="892393767207938353">"Lawa mafayela awazange asuswe: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <string name="copy_converted_warning_content" msgid="5753861488218674361">"Lawo mafayela aguqulelwe kwenye ifomethi: <xliff:g id="LIST">%1$s</xliff:g>"</string> - <plurals name="clipboard_files_clipped" formatted="false" msgid="855459017537058539"> - <item quantity="one">Kukopishwe amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g> kubhodi lokunamathisela.</item> - <item quantity="other">Kukopishwe amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g> kubhodi lokunamathisela.</item> - </plurals> - <string name="clipboard_files_cannot_paste" msgid="2878324825602325706">"Ayikwazi ukunamathisela amafayela akhethiwe kule ndawo."</string> - <string name="menu_rename" msgid="7678802479104285353">"Qamba kabusha"</string> - <string name="rename_error" msgid="4203041674883412606">"Yehlulekile ukuqamba kabusha idokhumenti"</string> - <string name="menu_eject_root" msgid="2768224615494227325">"Khipha"</string> - <string name="notification_copy_files_converted_title" msgid="3153573223054275181">"Amanye amafayela aguqulelwe"</string> - <string name="open_external_dialog_request" msgid="5789329484285817629">"Nika i-<xliff:g id="APPNAME"><b>^1</b></xliff:g> ukufinyelela ekuqondiseni kwe-<xliff:g id="DIRECTORY"><i>^2</i></xliff:g> ku-<xliff:g id="STORAGE"><i>^3</i></xliff:g>?"</string> - <string name="open_external_dialog_request_primary_volume" msgid="6635562535713428688">"Nika ukufinyelela kwe-<xliff:g id="APPNAME"><b>^1</b></xliff:g> kwinkomba ye-<xliff:g id="DIRECTORY"><i>^2</i></xliff:g>?"</string> - <string name="open_external_dialog_root_request" msgid="8899108702926347720">"Nikeza i-<xliff:g id="APPNAME"><b>^1</b></xliff:g> ukufinyelela kudatha yakho, okufaka izithombe namavidiyo, ku-<xliff:g id="STORAGE"><i>^2</i></xliff:g>?"</string> - <string name="never_ask_again" msgid="4295278542972859268">"Ungaphindi ubuze"</string> - <string name="allow" msgid="7225948811296386551">"Vumela"</string> - <string name="deny" msgid="2081879885755434506">"Yala"</string> - <plurals name="elements_selected" formatted="false" msgid="1376955402452875047"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> okukhethiwe</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> okukhethiwe</item> - </plurals> - <plurals name="elements_dragged" formatted="false" msgid="3727204615215602228"> - <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> izinto</item> - <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> izinto</item> - </plurals> - <string name="delete_filename_confirmation_message" msgid="5312817725577537488">"Susa i-\"<xliff:g id="NAME">%1$s</xliff:g>\"?"</string> - <string name="delete_foldername_confirmation_message" msgid="5885501832257285329">"Susa ifolda engu-\"<xliff:g id="NAME">%1$s</xliff:g>\" nokuqukethwe kwalo?"</string> - <plurals name="delete_files_confirmation_message" formatted="false" msgid="8417505791395471802"> - <item quantity="one">Susa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>?</item> - <item quantity="other">Susa amafayela angu-<xliff:g id="COUNT_1">%1$d</xliff:g>?</item> - </plurals> - <plurals name="delete_folders_confirmation_message" formatted="false" msgid="9185648028213507769"> - <item quantity="one">Susa amafolda angu-<xliff:g id="COUNT_1">%1$d</xliff:g> nokuqukethwe kwawo?</item> - <item quantity="other">Susa amafolda angu-<xliff:g id="COUNT_1">%1$d</xliff:g> nokuqukethwe kwawo?</item> - </plurals> - <plurals name="delete_items_confirmation_message" formatted="false" msgid="5376214433530243459"> - <item quantity="one">Susa izinto ezingu-<xliff:g id="COUNT_1">%1$d</xliff:g>?</item> - <item quantity="other">Susa izinto ezingu-<xliff:g id="COUNT_1">%1$d</xliff:g>?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values/attrs.xml b/packages/DocumentsUI/res/values/attrs.xml deleted file mode 100644 index 46ca582e7fdf..000000000000 --- a/packages/DocumentsUI/res/values/attrs.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> -<resources> - <declare-styleable name="HighlightedItemView"> - <attr name="state_highlighted" format="boolean"/> - </declare-styleable> -</resources> diff --git a/packages/DocumentsUI/res/values/colors.xml b/packages/DocumentsUI/res/values/colors.xml deleted file mode 100644 index 9da77420e0b8..000000000000 --- a/packages/DocumentsUI/res/values/colors.xml +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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> - <!-- This is the window background, but also the background for anything - else that needs to manually declare a background matching the "default" - app background (e.g. the drawer overlay). --> - <color name="window_background">#fff1f1f1</color> - <color name="drawer_background">#fff1f1f1</color> - <color name="directory_background">#fff7f7f7</color> - <color name="menu_search_background">@android:color/transparent</color> - - <color name="primary_dark">@*android:color/primary_dark_device_default_settings</color> - <color name="primary">@*android:color/primary_device_default_settings</color> - <color name="accent">@*android:color/accent_device_default_light</color> - <color name="accent_dark">@*android:color/accent_device_default_dark</color> - - <color name="band_select_background">#88ffffff</color> - <color name="band_select_border">#44000000</color> - - <color name="root_activated_color">@*android:color/accent_device_default_700</color> - - <!-- TODO: Would be nice to move this to a color-set, but not sure how to support animation --> - <color name="item_doc_background">#fffafafa</color> - <color name="item_doc_background_disabled">#fff4f4f4</color> - <color name="item_doc_background_selected">@*android:color/accent_device_default_50</color> - <color name="item_breadcrumb_background_hovered">#1affffff</color> - -</resources> diff --git a/packages/DocumentsUI/res/values/config.xml b/packages/DocumentsUI/res/values/config.xml deleted file mode 100644 index f883164f120b..000000000000 --- a/packages/DocumentsUI/res/values/config.xml +++ /dev/null @@ -1,31 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<resources> - <!-- Allow Advanced Devices default value to be customised --> - <bool name="config_defaultAdvancedDevices">false</bool> - - <!-- Intentionally unset. Vendors should set this in an overlay. --> - <string name="trusted_quick_viewer_package" translatable="false"></string> - - <!-- Flags setup as productivity oriented in which case Downloads app will be presented - as Files app. Including showing of the Documents and "advanced" roots. --> - <bool name="productivity_device">false</bool> - - <!-- Indicates if search view is taking the whole toolbar space --> - <bool name="full_bar_search_view">true</bool> - -</resources> diff --git a/packages/DocumentsUI/res/values/dimens.xml b/packages/DocumentsUI/res/values/dimens.xml deleted file mode 100644 index 7cda3410106f..000000000000 --- a/packages/DocumentsUI/res/values/dimens.xml +++ /dev/null @@ -1,51 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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> - <dimen name="grid_container_padding">10dp</dimen> - <dimen name="list_container_padding">0dp</dimen> - <dimen name="icon_size">40dp</dimen> - <dimen name="root_icon_size">24dp</dimen> - <dimen name="root_icon_margin">0dp</dimen> - <dimen name="check_icon_size">30dp</dimen> - <dimen name="list_item_thumbnail_size">40dp</dimen> - <dimen name="grid_item_icon_size">30dp</dimen> - <dimen name="progress_bar_height">4dp</dimen> - <dimen name="grid_width">152dp</dimen> - <dimen name="grid_height">176dp</dimen> - <dimen name="grid_item_width">152dp</dimen> - <dimen name="grid_item_height">176dp</dimen> - <dimen name="grid_item_margin">4dp</dimen> - <dimen name="grid_padding_horiz">4dp</dimen> - <dimen name="grid_padding_vert">4dp</dimen> - <dimen name="list_item_height">72dp</dimen> - <dimen name="list_item_padding">16dp</dimen> - <dimen name="breadcrumb_item_padding">8dp</dimen> - <dimen name="breadcrumb_item_height">36dp</dimen> - <dimen name="list_divider_inset">72dp</dimen> - <dimen name="dir_elevation">8dp</dimen> - <dimen name="drag_shadow_size">120dp</dimen> - <dimen name="grid_item_elevation">2dp</dimen> - <dimen name="max_drawer_width">280dp</dimen> - - <dimen name="drawer_edge_width">12dp</dimen> - - <dimen name="drag_shadow_width">160dp</dimen> - <dimen name="drag_shadow_height">48dp</dimen> - - <dimen name="autoscroll_edge_height">32dp</dimen> - -</resources> diff --git a/packages/DocumentsUI/res/values/layouts.xml b/packages/DocumentsUI/res/values/layouts.xml deleted file mode 100644 index a60ce87ba92c..000000000000 --- a/packages/DocumentsUI/res/values/layouts.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<resources> - <item name="documents_activity" type="layout">@layout/drawer_layout</item> - <item name="files_activity" type="layout">@layout/drawer_layout</item> -</resources> diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml deleted file mode 100644 index 416bb6f4f1a1..000000000000 --- a/packages/DocumentsUI/res/values/strings.xml +++ /dev/null @@ -1,256 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Title of the documents application [CHAR LIMIT=32] --> - <string name="app_label">Files</string> - - <!-- Title of the standalone downloads activity. [CHAR LIMIT=32] --> - <string name="downloads_label">Downloads</string> - - <!-- Action bar title prompting user to choose a location to open a document from [CHAR LIMIT=32] --> - <string name="title_open">Open from</string> - <!-- Action bar title prompting user to choose a location to save a document to [CHAR LIMIT=32] --> - <string name="title_save">Save to</string> - - <!-- Menu item that creates a new directory/folder at the current location [CHAR LIMIT=24] --> - <string name="menu_create_dir">New folder</string> - <!-- Menu item that switches view to show documents as a large-format grid of thumbnails [CHAR LIMIT=24] --> - <string name="menu_grid">Grid view</string> - <!-- Menu item that switches view to show documents as a list [CHAR LIMIT=24] --> - <string name="menu_list">List view</string> - <!-- Menu item that switches the criteria with which documents are sorted [CHAR LIMIT=24] --> - <string name="menu_sort">Sort by</string> - <!-- Menu item that enters a mode to search for documents [CHAR LIMIT=24] --> - <string name="menu_search">Search</string> - <!-- Menu item that enters activity to change settings for current root [CHAR LIMIT=24] --> - <string name="menu_settings">Storage settings</string> - - <!-- Menu item title that opens the selected documents [CHAR LIMIT=24] --> - <string name="menu_open">Open</string> - <!-- Menu item title that saves the current document [CHAR LIMIT=24] --> - <string name="menu_save">Save</string> - <!-- Menu item title that shares the selected documents [CHAR LIMIT=24] --> - <string name="menu_share">Share</string> - <!-- Menu item title that deletes the selected documents [CHAR LIMIT=24] --> - <string name="menu_delete">Delete</string> - <!-- Menu item title that selects all documents in the current directory [CHAR LIMIT=24] --> - <string name="menu_select_all">Select all</string> - <!-- Menu item title that copies the selected documents [CHAR LIMIT=24] --> - <string name="menu_copy">Copy to\u2026</string> - <!-- Menu item title that moves the selected documents [CHAR LIMIT=24] --> - <string name="menu_move">Move to\u2026</string> - - <!-- Menu item title that creates a new window in the activity [CHAR LIMIT=24] --> - <string name="menu_new_window">New window</string> - <!-- Menu item title that cuts the selected documents to clipboard [CHAR LIMIT=24] --> - <string name="menu_cut_to_clipboard">Cut</string> - <!-- Menu item title that copies the selected documents to clipboard [CHAR LIMIT=24] --> - <string name="menu_copy_to_clipboard">Copy</string> - <!-- Menu item title that pastes files from the clipboard [CHAR LIMIT=24] --> - <string name="menu_paste_from_clipboard">Paste</string> - - <!-- Menu item that reveals internal storage built into the device [CHAR LIMIT=24] --> - <string name="menu_advanced_show">Show internal storage</string> - <!-- Menu item that hides internal storage built into the device [CHAR LIMIT=24] --> - <string name="menu_advanced_hide">Hide internal storage</string> - - <!-- Menu item that reveals the sizes of displayed files [CHAR LIMIT=24] --> - <string name="menu_file_size_show">Show file size</string> - <!-- Menu item that hides the sizes of displayed files [CHAR LIMIT=24] --> - <string name="menu_file_size_hide">Hide file size</string> - - <!-- Button label that select the current directory [CHAR LIMIT=24] --> - <string name="button_select">Select</string> - <!-- Button label that copies files to the current directory [CHAR LIMIT=24] --> - <string name="button_copy">Copy</string> - <!-- Button label that moves files to the current directory [CHAR LIMIT=24] --> - <string name="button_move">Move</string> - <!-- Button label that hides the error bar [CHAR LIMIT=24] --> - <string name="button_dismiss">Dismiss</string> - <string name="button_retry">Try Again</string> - - <!-- Mode that sorts documents by their display name alphabetically [CHAR LIMIT=24] --> - <string name="sort_name">By name</string> - <!-- Mode that sorts documents by their last modified time in descending order; most recent first [CHAR LIMIT=24] --> - <string name="sort_date">By date modified</string> - <!-- Mode that sorts documents by their file size in descending order; largest first [CHAR LIMIT=24] --> - <string name="sort_size">By size</string> - - <!-- Accessibility title to open the drawer showing all roots where documents can be stored [CHAR LIMIT=32] --> - <string name="drawer_open">Show roots</string> - <!-- Accessibility title to close the drawer showing all roots where documents can be stored [CHAR LIMIT=32] --> - <string name="drawer_close">Hide roots</string> - - <!-- Toast shown when saving a document failed with an error [CHAR LIMIT=48] --> - <string name="save_error">Failed to save document</string> - <!-- Toast shown when creating a folder failed with an error [CHAR LIMIT=48] --> - <string name="create_error">Failed to create folder</string> - <!-- Error message shown when querying for a list of documents failed [CHAR LIMIT=48] --> - <string name="query_error">Can\u2019t load content at the moment</string> - - <!-- Title of storage root location that contains recently modified or used documents [CHAR LIMIT=24] --> - <string name="root_recent">Recent</string> - <!-- Subtitle of storage root indicating the total free space available, in bytes [CHAR LIMIT=24] --> - <string name="root_available_bytes"><xliff:g id="size" example="3GB">%1$s</xliff:g> free</string> - - <!-- Header title for list of storage roots that contains cloud services [CHAR LIMIT=24] --> - <string name="root_type_service">Storage services</string> - <!-- Header title for list of storage roots that contains shortcuts to documents that may be available elsewhere [CHAR LIMIT=24] --> - <string name="root_type_shortcut">Shortcuts</string> - <!-- Header title for list of storage roots that contains physical devices [CHAR LIMIT=24] --> - <string name="root_type_device">Devices</string> - <!-- Header title for list of additional apps that can provide documents [CHAR LIMIT=24] --> - <string name="root_type_apps">More apps</string> - - <!-- Text shown when a directory of documents is empty [CHAR LIMIT=24] --> - <string name="empty">No items</string> - <!-- Text shown when a file search returns no items [CHAR LIMIT=32] --> - <string name="no_results">No matches in %1$s</string> - - <!-- Toast shown when no app can be found to open the selected document [CHAR LIMIT=48] --> - <string name="toast_no_application">Can\u2019t open file</string> - <!-- Toast shown when some of the selected documents failed to be deleted [CHAR LIMIT=48] --> - <string name="toast_failed_delete">Unable to delete some documents</string> - - <!-- Title of dialog when prompting user to select an app to share documents with [CHAR LIMIT=32] --> - <string name="share_via">Share via</string> - - <!-- Title of the copy notification [CHAR LIMIT=24] --> - <string name="copy_notification_title">Copying files</string> - <!-- Title of the move notification [CHAR LIMIT=24] --> - <string name="move_notification_title">Moving files</string> - <!-- Title of the move notification [CHAR LIMIT=24] --> - <string name="delete_notification_title">Deleting files</string> - <!-- Text shown on the copy notification to indicate remaining time, in minutes [CHAR LIMIT=24] --> - <string name="copy_remaining"><xliff:g id="duration" example="3 minutes">%s</xliff:g> left</string> - <!-- Toast shown when a file copy is kicked off --> - <plurals name="copy_begin"> - <item quantity="one">Copying <xliff:g id="count" example="1">%1$d</xliff:g> file.</item> - <item quantity="other">Copying <xliff:g id="count" example="3">%1$d</xliff:g> files.</item> - </plurals> - <plurals name="move_begin"> - <item quantity="one">Moving <xliff:g id="count" example="1">%1$d</xliff:g> file.</item> - <item quantity="other">Moving <xliff:g id="count" example="3">%1$d</xliff:g> files.</item> - </plurals> - <!-- Text shown when files are deleted --> - <plurals name="deleting"> - <item quantity="one">Deleting <xliff:g id="count" example="1">%1$d</xliff:g> file.</item> - <item quantity="other">Deleting <xliff:g id="count" example="3">%1$d</xliff:g> files.</item> - </plurals> - <!-- Text shown for the undo button --> - <string name="undo">Undo</string> - <!-- Text shown on the notification while DocumentsUI performs setup in preparation for copying files [CHAR LIMIT=32] --> - <string name="copy_preparing">Preparing for copy\u2026</string> - <!-- Text shown on the notification while DocumentsUI performs setup in preparation for moving files [CHAR LIMIT=32] --> - <string name="move_preparing">Preparing for move\u2026</string> - <!-- Text shown on the notification while DocumentsUI performs setup in preparation for deleting files [CHAR LIMIT=32] --> - <string name="delete_preparing">Preparing for delete\u2026</string> - <!-- Text progress shown on the notification while DocumentsUI is deleting files. --> - <string name="delete_progress"><xliff:g id="count" example="3">%1$d</xliff:g> / <xliff:g id="totalCount" example="5">%2$d</xliff:g></string> - <!-- Title of the copy error notification [CHAR LIMIT=48] --> - <plurals name="copy_error_notification_title"> - <item quantity="one">Couldn\u2019t copy <xliff:g id="count" example="1">%1$d</xliff:g> file</item> - <item quantity="other">Couldn\u2019t copy <xliff:g id="count" example="2">%1$d</xliff:g> files</item> - </plurals> - <!-- Title of the move error notification [CHAR LIMIT=48] --> - <plurals name="move_error_notification_title"> - <item quantity="one">Couldn\u2019t move <xliff:g id="count" example="1">%1$d</xliff:g> file</item> - <item quantity="other">Couldn\u2019t move <xliff:g id="count" example="2">%1$d</xliff:g> files</item> - </plurals> - <!-- Title of the delete error notification [CHAR LIMIT=48] --> - <plurals name="delete_error_notification_title"> - <item quantity="one">Couldn\u2019t delete <xliff:g id="count" example="1">%1$d</xliff:g> file</item> - <item quantity="other">Couldn\u2019t delete <xliff:g id="count" example="2">%1$d</xliff:g> files</item> - </plurals> - <!-- Second line for notifications saying that more information will be shown after touching [CHAR LIMIT=48] --> - <string name="notification_touch_for_details">Tap to view details</string> - <!-- Label of the close dialog button.[CHAR LIMIT=24] --> - <string name="close">Close</string> - <!-- Contents of the copying failure alert dialog. [CHAR LIMIT=48] --> - <string name="copy_failure_alert_content">These files weren\u2019t copied: <xliff:g id="list">%1$s</xliff:g></string> - <!-- Contents of the moving failure alert dialog. [CHAR LIMIT=48] --> - <string name="move_failure_alert_content">These files weren\u2019t moved: <xliff:g id="list">%1$s</xliff:g></string> - <!-- Message shown to users when an operation to delete one or more files has failed. Presented in a dialog. [CHAR LIMIT=48] --> - <string name="delete_failure_alert_content">These files weren\u2019t deleted: <xliff:g id="list">%1$s</xliff:g></string> - <!-- Contents of the copying warning dialog due to converted files. [CHAR LIMIT=64] --> - <string name="copy_converted_warning_content">These files were converted to another format: <xliff:g id="list" example="Document.pdf, Photo.jpg, Song.ogg">%1$s</xliff:g></string> - <!-- Toast shown when a user copies files to clipboard. --> - <plurals name="clipboard_files_clipped"> - <item quantity="one">Copied <xliff:g id="count" example="1">%1$d</xliff:g> file to clipboard.</item> - <item quantity="other">Copied <xliff:g id="count" example="3">%1$d</xliff:g> files to clipboard.</item> - </plurals> - <!-- Toast shown when a user tries to paste files into an unsupported location. --> - <string name="clipboard_files_cannot_paste">Cannot paste the selected files in this location.</string> - <!-- Menu item that renames the selected document [CHAR LIMIT=24] --> - <string name="menu_rename">Rename</string> - <!-- Toast shown when renaming document failed with an error [CHAR LIMIT=48] --> - <string name="rename_error">Failed to rename document</string> - <!-- Context Menu item that ejects the root selected [CHAR LIMIT=24] --> - <string name="menu_eject_root">Eject</string> - <!-- First line for notifications saying that some files were converted to a different format - during a copy. [CHAR LIMIT=48] --> - <string name="notification_copy_files_converted_title">Some files were converted</string> - - <!-- Text in an alert dialog asking user to grant app access to a given directory in an external storage volume --> - <string name="open_external_dialog_request">Grant <xliff:g id="appName" example="System Settings"><b>^1</b></xliff:g> - access to <xliff:g id="directory" example="Pictures"><i>^2</i></xliff:g> directory on - <xliff:g id="storage" example="SD Card"><i>^3</i></xliff:g>?</string> - <!-- Text in an alert dialog asking user to grant app access to a given directory in the internal storage --> - <string name="open_external_dialog_request_primary_volume">Grant <xliff:g id="appName" example="System Settings"><b>^1</b></xliff:g> - access to <xliff:g id="directory" example="Pictures"><i>^2</i></xliff:g> directory?</string> - <!-- Text in an alert dialog asking user to grant app access to all data in an external storage volume --> - <string name="open_external_dialog_root_request">Grant <xliff:g id="appName" example="System Settings"><b>^1</b></xliff:g> - access to your data, including photos and videos, on <xliff:g id="storage" example="SD Card"><i>^2</i></xliff:g>?</string> - <!-- Checkbox that allows user to not be questioned about the directory access request again --> - <string name="never_ask_again">Don\'t ask again</string> - <!-- Text in the button asking user to allow access to a given directory. --> - <string name="allow">Allow</string> - <!-- Text in the button asking user to deny access to a given directory. --> - <string name="deny">Deny</string> - <!-- Dialog text shown to users when asking if they want to delete files (a confirmation). --> - <!-- Label text showing user how many items are selected. Can be one or more elements. --> - <plurals name="elements_selected"> - <item quantity="one"><xliff:g id="count" example="1">%1$d</xliff:g> selected</item> - <item quantity="other"><xliff:g id="count" example="3">%1$d</xliff:g> selected</item> - </plurals> - - <!-- Label text showing user how many items are being dragged. Can be one or more elements. --> - <plurals name="elements_dragged"> - <item quantity="one"><xliff:g id="count" example="1">%1$d</xliff:g> item</item> - <item quantity="other"><xliff:g id="count" example="3">%1$d</xliff:g> items</item> - </plurals> - - <!-- Dialog text shown to users when asking if they want to delete a file (a confirmation) --> - <string name="delete_filename_confirmation_message">Delete \"<xliff:g id="name" example="cat.jpg">%1$s</xliff:g>\"?</string> - <!-- Dialog text shown to users when asking if they want to delete a folder (a confirmation) --> - <string name="delete_foldername_confirmation_message">Delete folder \"<xliff:g id="name" example="Photos">%1$s</xliff:g>\" and its contents?</string> - <!-- Dialog text shown to users when asking if they want to delete files (a confirmation). --> - <plurals name="delete_files_confirmation_message"> - <item quantity="one">Delete <xliff:g id="count" example="1">%1$d</xliff:g> file?</item> - <item quantity="other">Delete <xliff:g id="count" example="3">%1$d</xliff:g> files?</item> - </plurals> - <!-- Dialog text shown to users when asking if they want to delete folders (a confirmation). --> - <plurals name="delete_folders_confirmation_message"> - <item quantity="one">Delete <xliff:g id="count" example="1">%1$d</xliff:g> folder and its contents?</item> - <item quantity="other">Delete <xliff:g id="count" example="3">%1$d</xliff:g> folders and their contents?</item> - </plurals> - <!-- Dialog text shown to users when asking if they want to delete mixed type items: files and folders (a confirmation). --> - <plurals name="delete_items_confirmation_message"> - <item quantity="one">Delete <xliff:g id="count" example="1">%1$d</xliff:g> item?</item> - <item quantity="other">Delete <xliff:g id="count" example="3">%1$d</xliff:g> items?</item> - </plurals> -</resources> diff --git a/packages/DocumentsUI/res/values/styles.xml b/packages/DocumentsUI/res/values/styles.xml deleted file mode 100644 index b5e32d405ac7..000000000000 --- a/packages/DocumentsUI/res/values/styles.xml +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2013 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 xmlns:android="http://schemas.android.com/apk/res/android"> - - <style name="ActionBarTheme" parent="@*android:style/ThemeOverlay.Material.Dark.ActionBar" /> - <style name="ActionBarPopupTheme" parent="@*android:style/ThemeOverlay.Material.Light" /> - - <style name="DocumentsTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar"> - <item name="actionBarWidgetTheme">@null</item> - <item name="actionBarTheme">@style/ActionBarTheme</item> - <item name="actionBarPopupTheme">@style/ActionBarPopupTheme</item> - - <item name="android:windowBackground">@color/window_background</item> - <item name="android:colorPrimaryDark">@color/primary_dark</item> - <item name="android:colorPrimary">@color/primary</item> - <item name="android:colorAccent">@color/accent</item> - <item name="android:colorControlActivated">?android:attr/colorAccent</item> - <item name="android:queryBackground">@color/menu_search_background</item> - - <item name="android:listDivider">@*android:drawable/list_divider_material</item> - - <item name="android:windowActionBar">false</item> - <item name="android:windowActionModeOverlay">true</item> - <item name="android:windowNoTitle">true</item> - - <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item> - </style> - - <style name="TrimmedHorizontalProgressBar" parent="android:Widget.Material.ProgressBar.Horizontal"> - <item name="android:indeterminateDrawable">@drawable/progress_indeterminate_horizontal_material_trimmed</item> - <item name="android:minHeight">3dp</item> - <item name="android:maxHeight">3dp</item> - </style> - -</resources> diff --git a/packages/DocumentsUI/res/values/tags.xml b/packages/DocumentsUI/res/values/tags.xml deleted file mode 100644 index a7ff3d6c81cc..000000000000 --- a/packages/DocumentsUI/res/values/tags.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2016 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<resources> - <item name="drag_hovering_tag" type="id" /> - <item name="item_position_tag" type="id" /> - <item name="layout_id_tag" type="id" /> -</resources>
\ No newline at end of file diff --git a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java b/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java deleted file mode 100644 index d8d8d3e56ec8..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/BaseActivity.java +++ /dev/null @@ -1,866 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.Shared.EXTRA_BENCHMARK; -import static com.android.documentsui.State.ACTION_CREATE; -import static com.android.documentsui.State.ACTION_GET_CONTENT; -import static com.android.documentsui.State.ACTION_OPEN; -import static com.android.documentsui.State.ACTION_OPEN_TREE; -import static com.android.documentsui.State.ACTION_PICK_COPY_DESTINATION; -import static com.android.documentsui.State.MODE_GRID; - -import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.ProviderInfo; -import android.database.ContentObserver; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import android.os.MessageQueue.IdleHandler; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Root; -import android.support.annotation.CallSuper; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.util.Log; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; - -import com.android.documentsui.MenuManager.DirectoryDetails; -import com.android.documentsui.NavigationViewManager.Breadcrumb; -import com.android.documentsui.SearchViewManager.SearchManagerListener; -import com.android.documentsui.State.ViewMode; -import com.android.documentsui.dirlist.AnimationView; -import com.android.documentsui.dirlist.DirectoryFragment; -import com.android.documentsui.dirlist.FragmentTuner; -import com.android.documentsui.dirlist.Model; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperationService; -import com.android.documentsui.services.FileOperations; - -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.concurrent.Executor; - -public abstract class BaseActivity extends Activity - implements SearchManagerListener, NavigationViewManager.Environment { - - public final FileOperations.Callback fileOpCallback = (status, opType, docCount) -> { - if (status == FileOperations.Callback.STATUS_REJECTED) { - Snackbars.showPasteFailed(this); - return; - } - - if (docCount == 0) { - // Nothing has been pasted, so there is no need to show a snackbar. - return; - } - - switch (opType) { - case FileOperationService.OPERATION_MOVE: - Snackbars.showMove(this, docCount); - break; - case FileOperationService.OPERATION_COPY: - Snackbars.showCopy(this, docCount); - break; - case FileOperationService.OPERATION_DELETE: - // We don't show anything for deletion. - break; - default: - throw new UnsupportedOperationException("Unsupported Operation: " + opType); - } - }; - - private static final String BENCHMARK_TESTING_PACKAGE = "com.android.documentsui.appperftests"; - - State mState; - @Nullable RetainedState mRetainedState; - RootsCache mRoots; - SearchViewManager mSearchManager; - DrawerController mDrawer; - NavigationViewManager mNavigator; - List<EventListener> mEventListeners = new ArrayList<>(); - - private final String mTag; - private final ContentObserver mRootsCacheObserver = new ContentObserver(new Handler()) { - @Override - public void onChange(boolean selfChange) { - new HandleRootsChangedTask(BaseActivity.this).execute(getCurrentRoot()); - } - }; - - @LayoutRes - private int mLayoutId; - - private boolean mNavDrawerHasFocus; - private long mStartTime; - - public abstract void onDocumentPicked(DocumentInfo doc, Model model); - public abstract void onDocumentsPicked(List<DocumentInfo> docs); - public abstract FragmentTuner createFragmentTuner(); - public abstract MenuManager getMenuManager(); - public abstract DirectoryDetails getDirectoryDetails(); - - abstract void onTaskFinished(Uri... uris); - abstract void refreshDirectory(int anim); - /** Allows sub-classes to include information in a newly created State instance. */ - abstract void includeState(State initialState); - - public BaseActivity(@LayoutRes int layoutId, String tag) { - mLayoutId = layoutId; - mTag = tag; - } - - @CallSuper - @Override - public void onCreate(Bundle icicle) { - // Record the time when onCreate is invoked for metric. - mStartTime = new Date().getTime(); - - super.onCreate(icicle); - - final Intent intent = getIntent(); - - addListenerForLaunchCompletion(); - - setContentView(mLayoutId); - - mDrawer = DrawerController.create(this); - mState = getState(icicle); - Metrics.logActivityLaunch(this, mState, intent); - - // we're really interested in retainining state in our very complex - // DirectoryFragment. So we do a little code yoga to extend - // support to that fragment. - mRetainedState = (RetainedState) getLastNonConfigurationInstance(); - mRoots = DocumentsApplication.getRootsCache(this); - - getContentResolver().registerContentObserver( - RootsCache.sNotificationUri, false, mRootsCacheObserver); - - mSearchManager = new SearchViewManager(this, icicle); - - DocumentsToolbar toolbar = (DocumentsToolbar) findViewById(R.id.toolbar); - setActionBar(toolbar); - - Breadcrumb breadcrumb = - Shared.findView(this, R.id.dropdown_breadcrumb, R.id.horizontal_breadcrumb); - assert(breadcrumb != null); - - mNavigator = new NavigationViewManager(mDrawer, toolbar, mState, this, breadcrumb); - - // Base classes must update result in their onCreate. - setResult(Activity.RESULT_CANCELED); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean showMenu = super.onCreateOptionsMenu(menu); - - getMenuInflater().inflate(R.menu.activity, menu); - mNavigator.update(); - boolean fullBarSearch = getResources().getBoolean(R.bool.full_bar_search_view); - mSearchManager.install((DocumentsToolbar) findViewById(R.id.toolbar), fullBarSearch); - - return showMenu; - } - - @Override - @CallSuper - public boolean onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - mSearchManager.showMenu(canSearchRoot()); - return true; - } - - @Override - protected void onDestroy() { - getContentResolver().unregisterContentObserver(mRootsCacheObserver); - super.onDestroy(); - } - - private State getState(@Nullable Bundle icicle) { - if (icicle != null) { - State state = icicle.<State>getParcelable(Shared.EXTRA_STATE); - if (DEBUG) Log.d(mTag, "Recovered existing state object: " + state); - return state; - } - - State state = new State(); - - final Intent intent = getIntent(); - - state.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false); - state.forceSize = intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_FILESIZE, false); - state.showSize = state.forceSize || LocalPreferences.getDisplayFileSize(this); - state.initAcceptMimes(intent); - state.excludedAuthorities = getExcludedAuthorities(); - - includeState(state); - - // Advanced roots are shown by default without menu option if forced by config or intent. - boolean forceAdvanced = Shared.shouldShowDeviceRoot(this, intent); - boolean chosenAdvanced = LocalPreferences.getShowDeviceRoot(this, state.action); - state.showAdvanced = forceAdvanced || chosenAdvanced; - - // Menu option is shown for whitelisted intents if advanced roots are not shown by default. - state.showAdvancedOption = !forceAdvanced && ( - Shared.shouldShowFancyFeatures(this) - || state.action == ACTION_OPEN - || state.action == ACTION_CREATE - || state.action == ACTION_OPEN_TREE - || state.action == ACTION_PICK_COPY_DESTINATION - || state.action == ACTION_GET_CONTENT); - - if (DEBUG) Log.d(mTag, "Created new state object: " + state); - - return state; - } - - public void setRootsDrawerOpen(boolean open) { - mNavigator.revealRootsDrawer(open); - } - - void onRootPicked(RootInfo root) { - // Clicking on the current root removes search - mSearchManager.cancelSearch(); - - // Skip refreshing if root nor directory didn't change - if (root.equals(getCurrentRoot()) && mState.stack.size() == 1) { - return; - } - - mState.derivedMode = LocalPreferences.getViewMode(this, root, MODE_GRID); - - // Clear entire backstack and start in new root - mState.onRootChanged(root); - - // Recents is always in memory, so we just load it directly. - // Otherwise we delegate loading data from disk to a task - // to ensure a responsive ui. - if (mRoots.isRecentsRoot(root)) { - refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE); - } else { - new PickRootTask(this, root).executeOnExecutor(getExecutorForCurrentDirectory()); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - - case R.id.menu_create_dir: - showCreateDirectoryDialog(); - return true; - - case R.id.menu_search: - // SearchViewManager listens for this directly. - return false; - - case R.id.menu_sort_name: - setUserSortOrder(State.SORT_ORDER_DISPLAY_NAME); - return true; - - case R.id.menu_sort_date: - setUserSortOrder(State.SORT_ORDER_LAST_MODIFIED); - return true; - - case R.id.menu_sort_size: - setUserSortOrder(State.SORT_ORDER_SIZE); - return true; - - case R.id.menu_grid: - setViewMode(State.MODE_GRID); - return true; - - case R.id.menu_list: - setViewMode(State.MODE_LIST); - return true; - - case R.id.menu_advanced: - setDisplayAdvancedDevices(!mState.showAdvanced); - return true; - - case R.id.menu_file_size: - setDisplayFileSize(!LocalPreferences.getDisplayFileSize(this)); - return true; - - default: - return super.onOptionsItemSelected(item); - } - } - - final @Nullable DirectoryFragment getDirectoryFragment() { - return DirectoryFragment.get(getFragmentManager()); - } - - void showCreateDirectoryDialog() { - Metrics.logUserAction(this, Metrics.USER_ACTION_CREATE_DIR); - - CreateDirectoryFragment.show(getFragmentManager()); - } - - void onDirectoryCreated(DocumentInfo doc) { - // By default we do nothing, just let the new directory appear. - // DocumentsActivity auto-opens directories after creating them - // As that is more attuned to the "picker" use cases it supports. - } - - /** - * Returns true if a directory can be created in the current location. - * @return - */ - boolean canCreateDirectory() { - final RootInfo root = getCurrentRoot(); - final DocumentInfo cwd = getCurrentDirectory(); - return cwd != null - && cwd.isCreateSupported() - && !mSearchManager.isSearching() - && !root.isRecents() - && !root.isDownloads(); - } - - void openContainerDocument(DocumentInfo doc) { - assert(doc.isContainer()); - - notifyDirectoryNavigated(doc.derivedUri); - - mState.pushDocument(doc); - // Show an opening animation only if pressing "back" would get us back to the - // previous directory. Especially after opening a root document, pressing - // back, wouldn't go to the previous root, but close the activity. - final int anim = (mState.hasLocationChanged() && mState.stack.size() > 1) - ? AnimationView.ANIM_ENTER : AnimationView.ANIM_NONE; - refreshCurrentRootAndDirectory(anim); - } - - /** - * Refreshes the content of the director and the menu/action bar. - * The current directory name and selection will get updated. - * @param anim - */ - @Override - public final void refreshCurrentRootAndDirectory(int anim) { - mSearchManager.cancelSearch(); - - refreshDirectory(anim); - - final RootsFragment roots = RootsFragment.get(getFragmentManager()); - if (roots != null) { - roots.onCurrentRootChanged(); - } - - mNavigator.update(); - invalidateOptionsMenu(); - } - - final void loadRoot(final Uri uri) { - new LoadRootTask(this, uri).executeOnExecutor( - ProviderExecutor.forAuthority(uri.getAuthority())); - } - - /** - * This is called when user hovers over a doc for enough time during a drag n' drop, to open a - * folder that accepts drop. We should only open a container that's not an archive. - */ - public void springOpenDirectory(DocumentInfo doc) { - } - - /** - * Called when search results changed. - * Refreshes the content of the directory. It doesn't refresh elements on the action bar. - * e.g. The current directory name displayed on the action bar won't get updated. - */ - @Override - public void onSearchChanged(@Nullable String query) { - // We should not get here if root is not searchable - assert(canSearchRoot()); - reloadSearch(query); - } - - @Override - public void onSearchFinished() { - // Restores menu icons state - invalidateOptionsMenu(); - } - - private void reloadSearch(String query) { - FragmentManager fm = getFragmentManager(); - RootInfo root = getCurrentRoot(); - DocumentInfo cwd = getCurrentDirectory(); - - DirectoryFragment.reloadSearch(fm, root, cwd, query); - } - - final List<String> getExcludedAuthorities() { - List<String> authorities = new ArrayList<>(); - if (getIntent().getBooleanExtra(DocumentsContract.EXTRA_EXCLUDE_SELF, false)) { - // Exclude roots provided by the calling package. - String packageName = getCallingPackageMaybeExtra(); - try { - PackageInfo pkgInfo = getPackageManager().getPackageInfo(packageName, - PackageManager.GET_PROVIDERS); - for (ProviderInfo provider: pkgInfo.providers) { - authorities.add(provider.authority); - } - } catch (PackageManager.NameNotFoundException e) { - Log.e(mTag, "Calling package name does not resolve: " + packageName); - } - } - return authorities; - } - - boolean canSearchRoot() { - final RootInfo root = getCurrentRoot(); - return (root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0; - } - - final String getCallingPackageMaybeExtra() { - String callingPackage = getCallingPackage(); - // System apps can set the calling package name using an extra. - try { - ApplicationInfo info = getPackageManager().getApplicationInfo(callingPackage, 0); - if (info.isSystemApp() || info.isUpdatedSystemApp()) { - final String extra = getIntent().getStringExtra(DocumentsContract.EXTRA_PACKAGE_NAME); - if (extra != null) { - callingPackage = extra; - } - } - } finally { - return callingPackage; - } - } - - public static BaseActivity get(Fragment fragment) { - return (BaseActivity) fragment.getActivity(); - } - - public State getDisplayState() { - return mState; - } - - /* - * Get the default directory to be presented after starting the activity. - * Method can be overridden if the change of the behavior of the the child activity is needed. - */ - public Uri getDefaultRoot() { - return Shared.shouldShowDocumentsRoot(this, getIntent()) - ? DocumentsContract.buildHomeUri() - : DocumentsContract.buildRootUri( - "com.android.providers.downloads.documents", "downloads"); - } - - /** - * Set internal storage visible based on explicit user action. - */ - void setDisplayAdvancedDevices(boolean display) { - Metrics.logUserAction(this, - display ? Metrics.USER_ACTION_SHOW_ADVANCED : Metrics.USER_ACTION_HIDE_ADVANCED); - - LocalPreferences.setShowDeviceRoot(this, mState.action, display); - mState.showAdvanced = display; - RootsFragment.get(getFragmentManager()).onDisplayStateChanged(); - invalidateOptionsMenu(); - } - - /** - * Set file size visible based on explicit user action. - */ - void setDisplayFileSize(boolean display) { - Metrics.logUserAction(this, - display ? Metrics.USER_ACTION_SHOW_SIZE : Metrics.USER_ACTION_HIDE_SIZE); - - LocalPreferences.setDisplayFileSize(this, display); - mState.showSize = display; - DirectoryFragment dir = getDirectoryFragment(); - if (dir != null) { - dir.onDisplayStateChanged(); - } - invalidateOptionsMenu(); - } - - /** - * Set state sort order based on explicit user action. - */ - void setUserSortOrder(int sortOrder) { - switch(sortOrder) { - case State.SORT_ORDER_DISPLAY_NAME: - Metrics.logUserAction(this, Metrics.USER_ACTION_SORT_NAME); - break; - case State.SORT_ORDER_LAST_MODIFIED: - Metrics.logUserAction(this, Metrics.USER_ACTION_SORT_DATE); - break; - case State.SORT_ORDER_SIZE: - Metrics.logUserAction(this, Metrics.USER_ACTION_SORT_SIZE); - break; - } - - mState.userSortOrder = sortOrder; - DirectoryFragment dir = getDirectoryFragment(); - if (dir != null) { - dir.onSortOrderChanged(); - } - } - - /** - * Set mode based on explicit user action. - */ - void setViewMode(@ViewMode int mode) { - if (mode == State.MODE_GRID) { - Metrics.logUserAction(this, Metrics.USER_ACTION_GRID); - } else if (mode == State.MODE_LIST) { - Metrics.logUserAction(this, Metrics.USER_ACTION_LIST); - } - - LocalPreferences.setViewMode(this, getCurrentRoot(), mode); - mState.derivedMode = mode; - - // view icon needs to be updated, but we *could* do it - // in onOptionsItemSelected, and not do the full invalidation - // But! That's a larger refactoring we'll save for another day. - invalidateOptionsMenu(); - DirectoryFragment dir = getDirectoryFragment(); - if (dir != null) { - dir.onViewModeChanged(); - } - } - - public void setPending(boolean pending) { - final SaveFragment save = SaveFragment.get(getFragmentManager()); - if (save != null) { - save.setPending(pending); - } - } - - @Override - protected void onSaveInstanceState(Bundle state) { - super.onSaveInstanceState(state); - state.putParcelable(Shared.EXTRA_STATE, mState); - mSearchManager.onSaveInstanceState(state); - } - - @Override - protected void onRestoreInstanceState(Bundle state) { - super.onRestoreInstanceState(state); - } - - /** - * Delegate ths call to the current fragment so it can save selection. - * Feel free to expand on this with other useful state. - */ - @Override - public RetainedState onRetainNonConfigurationInstance() { - RetainedState retained = new RetainedState(); - DirectoryFragment fragment = DirectoryFragment.get(getFragmentManager()); - if (fragment != null) { - fragment.retainState(retained); - } - return retained; - } - - public @Nullable RetainedState getRetainedState() { - return mRetainedState; - } - - @Override - public boolean isSearchExpanded() { - return mSearchManager.isExpanded(); - } - - @Override - public RootInfo getCurrentRoot() { - if (mState.stack.root != null) { - return mState.stack.root; - } else { - return mRoots.getRecentsRoot(); - } - } - - public DocumentInfo getCurrentDirectory() { - return mState.stack.peek(); - } - - public Executor getExecutorForCurrentDirectory() { - final DocumentInfo cwd = getCurrentDirectory(); - if (cwd != null && cwd.authority != null) { - return ProviderExecutor.forAuthority(cwd.authority); - } else { - return AsyncTask.THREAD_POOL_EXECUTOR; - } - } - - @Override - public void onBackPressed() { - // While action bar is expanded, the state stack UI is hidden. - if (mSearchManager.cancelSearch()) { - return; - } - - DirectoryFragment dir = getDirectoryFragment(); - if (dir != null && dir.onBackPressed()) { - return; - } - - if (!mState.hasLocationChanged()) { - super.onBackPressed(); - return; - } - - if (onBeforePopDir() || popDir()) { - return; - } - - super.onBackPressed(); - } - - boolean onBeforePopDir() { - // Files app overrides this with some fancy logic. - return false; - } - - public void onStackPicked(DocumentStack stack) { - try { - // Update the restored stack to ensure we have freshest data - stack.updateDocuments(getContentResolver()); - mState.setStack(stack); - refreshCurrentRootAndDirectory(AnimationView.ANIM_SIDE); - - } catch (FileNotFoundException e) { - Log.w(mTag, "Failed to restore stack: " + e); - } - } - - /** - * Declare a global key handler to route key events when there isn't a specific focus view. This - * covers the scenario where a user opens DocumentsUI and just starts typing. - * - * @param keyCode - * @param event - * @return - */ - @CallSuper - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (Events.isNavigationKeyCode(keyCode)) { - // Forward all unclaimed navigation keystrokes to the DirectoryFragment. This causes any - // stray navigation keystrokes focus the content pane, which is probably what the user - // is trying to do. - DirectoryFragment df = DirectoryFragment.get(getFragmentManager()); - if (df != null) { - df.requestFocus(); - return true; - } - } else if (keyCode == KeyEvent.KEYCODE_TAB) { - // Tab toggles focus on the navigation drawer. - toggleNavDrawerFocus(); - return true; - } else if (keyCode == KeyEvent.KEYCODE_DEL) { - popDir(); - return true; - } - return super.onKeyDown(keyCode, event); - } - - public void addEventListener(EventListener listener) { - mEventListeners.add(listener); - } - - public void removeEventListener(EventListener listener) { - mEventListeners.remove(listener); - } - - public void notifyDirectoryLoaded(Uri uri) { - for (EventListener listener : mEventListeners) { - listener.onDirectoryLoaded(uri); - } - } - - void notifyDirectoryNavigated(Uri uri) { - for (EventListener listener : mEventListeners) { - listener.onDirectoryNavigated(uri); - } - } - - /** - * Toggles focus between the navigation drawer and the directory listing. If the drawer isn't - * locked, open/close it as appropriate. - */ - void toggleNavDrawerFocus() { - if (mNavDrawerHasFocus) { - mDrawer.setOpen(false); - DirectoryFragment df = DirectoryFragment.get(getFragmentManager()); - if (df != null) { - df.requestFocus(); - } - } else { - mDrawer.setOpen(true); - RootsFragment rf = RootsFragment.get(getFragmentManager()); - if (rf != null) { - rf.requestFocus(); - } - } - mNavDrawerHasFocus = !mNavDrawerHasFocus; - } - - /** - * Pops the top entry off the directory stack, and returns the user to the previous directory. - * If the directory stack only contains one item, this method does nothing. - * - * @return Whether the stack was popped. - */ - private boolean popDir() { - if (mState.stack.size() > 1) { - mState.stack.pop(); - refreshCurrentRootAndDirectory(AnimationView.ANIM_LEAVE); - return true; - } - return false; - } - - /** - * Closes the activity when it's idle. - */ - private void addListenerForLaunchCompletion() { - addEventListener(new EventListener() { - @Override - public void onDirectoryNavigated(Uri uri) { - } - - @Override - public void onDirectoryLoaded(Uri uri) { - removeEventListener(this); - getMainLooper().getQueue().addIdleHandler(new IdleHandler() { - @Override - public boolean queueIdle() { - // If startup benchmark is requested by a whitelisted testing package, then - // close the activity once idle, and notify the testing activity. - if (getIntent().getBooleanExtra(EXTRA_BENCHMARK, false) && - BENCHMARK_TESTING_PACKAGE.equals(getCallingPackage())) { - setResult(RESULT_OK); - finish(); - } - - Metrics.logStartupMs( - BaseActivity.this, (int) (new Date().getTime() - mStartTime)); - - // Remove the idle handler. - return false; - } - }); - new Handler().post(new Runnable() { - @Override public void run() { - } - }); - } - }); - } - - private static final class PickRootTask extends PairedTask<BaseActivity, Void, DocumentInfo> { - private RootInfo mRoot; - - public PickRootTask(BaseActivity activity, RootInfo root) { - super(activity); - mRoot = root; - } - - @Override - protected DocumentInfo run(Void... params) { - return mRoot.getRootDocumentBlocking(mOwner); - } - - @Override - protected void finish(DocumentInfo result) { - if (result != null) { - mOwner.openContainerDocument(result); - } - } - } - - private static final class HandleRootsChangedTask - extends PairedTask<BaseActivity, RootInfo, RootInfo> { - RootInfo mCurrentRoot; - DocumentInfo mDefaultRootDocument; - - public HandleRootsChangedTask(BaseActivity activity) { - super(activity); - } - - @Override - protected RootInfo run(RootInfo... roots) { - assert(roots.length == 1); - mCurrentRoot = roots[0]; - final Collection<RootInfo> cachedRoots = mOwner.mRoots.getRootsBlocking(); - for (final RootInfo root : cachedRoots) { - if (root.getUri().equals(mCurrentRoot.getUri())) { - // We don't need to change the current root as the current root was not removed. - return null; - } - } - - // Choose the default root. - final RootInfo defaultRoot = mOwner.mRoots.getDefaultRootBlocking(mOwner.mState); - assert(defaultRoot != null); - if (!defaultRoot.isRecents()) { - mDefaultRootDocument = defaultRoot.getRootDocumentBlocking(mOwner); - } - return defaultRoot; - } - - @Override - protected void finish(RootInfo defaultRoot) { - if (defaultRoot == null) { - return; - } - - // If the activity has been launched for the specific root and it is removed, finish the - // activity. - final Uri uri = mOwner.getIntent().getData(); - if (uri != null && uri.equals(mCurrentRoot.getUri())) { - mOwner.finish(); - return; - } - - // Clear entire backstack and start in new root. - mOwner.mState.onRootChanged(defaultRoot); - mOwner.mSearchManager.update(defaultRoot); - - if (defaultRoot.isRecents()) { - mOwner.refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE); - } else { - mOwner.openContainerDocument(mDefaultRootDocument); - } - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/BootReceiver.java b/packages/DocumentsUI/src/com/android/documentsui/BootReceiver.java deleted file mode 100644 index cdea9d75fd82..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/BootReceiver.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -/** - * Prime {@link RootsCache} when the system is booted. - */ -public class BootReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - // We already spun up our application object before getting here, which - // kicked off a task to load roots, so this broadcast is finished once - // that first pass is done. - DocumentsApplication.getRootsCache(context).setBootCompletedResult(goAsync()); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/CheckedTask.java b/packages/DocumentsUI/src/com/android/documentsui/CheckedTask.java deleted file mode 100644 index 747eb9c51985..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/CheckedTask.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.os.AsyncTask; - -/** - * An {@link AsyncTask} that guards work with checks that a paired {@link Check} - * has not yet given signals to stop progress. - * - * <p>Use this type of task for greater safety when executing tasks that might complete - * after the owner of the task has explicitly given a signal to stop progress. - * - * <p>Also useful as tasks can be static, limiting scope, but still have access to - * signal from the owning class. - * - * @template Input input type - * @template Output output type - */ -abstract class CheckedTask<Input, Output> - extends AsyncTask<Input, Void, Output> { - - private Check mCheck; - - public CheckedTask(Check check) { - mCheck = check; - } - - /** Called prior to run being executed. Analogous to {@link AsyncTask#onPreExecute} */ - void prepare() {} - - /** Analogous to {@link AsyncTask#doInBackground} */ - abstract Output run(Input... input); - - /** Analogous to {@link AsyncTask#onPostExecute} */ - abstract void finish(Output output); - - @Override - final protected void onPreExecute() { - if (mCheck.stop()) { - return; - } - prepare(); - } - - @Override - final protected Output doInBackground(Input... input) { - if (mCheck.stop()) { - return null; - } - return run(input); - } - - @Override - final protected void onPostExecute(Output result) { - if (mCheck.stop()) { - return; - } - finish(result); - } - - @FunctionalInterface - interface Check { - boolean stop(); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java deleted file mode 100644 index 5b5a96e5c043..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.TAG; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.FragmentManager; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.support.annotation.Nullable; -import android.support.design.widget.Snackbar; -import android.util.Log; -import android.view.KeyEvent; -import android.view.inputmethod.EditorInfo; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.TextView.OnEditorActionListener; - -import com.android.documentsui.model.DocumentInfo; - -/** - * Dialog to create a new directory. - */ -public class CreateDirectoryFragment extends DialogFragment { - private static final String TAG_CREATE_DIRECTORY = "create_directory"; - - public static void show(FragmentManager fm) { - final CreateDirectoryFragment dialog = new CreateDirectoryFragment(); - dialog.show(fm, TAG_CREATE_DIRECTORY); - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final Context context = getActivity(); - final ContentResolver resolver = context.getContentResolver(); - - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - final LayoutInflater dialogInflater = LayoutInflater.from(builder.getContext()); - - final View view = dialogInflater.inflate(R.layout.dialog_file_name, null, false); - final EditText editText = (EditText) view.findViewById(android.R.id.text1); - - builder.setTitle(R.string.menu_create_dir); - builder.setView(view); - - builder.setPositiveButton( - android.R.string.ok, - new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - createDirectory(editText.getText().toString()); - } - }); - - builder.setNegativeButton(android.R.string.cancel, null); - final AlertDialog dialog = builder.create(); - - // Workaround for the problem - virtual keyboard doesn't show on the phone. - Shared.ensureKeyboardPresent(context, dialog); - - editText.setOnEditorActionListener( - new OnEditorActionListener() { - @Override - public boolean onEditorAction( - TextView view, int actionId, @Nullable KeyEvent event) { - if ((actionId == EditorInfo.IME_ACTION_DONE) || (event != null - && event.getKeyCode() == KeyEvent.KEYCODE_ENTER - && event.hasNoModifiers())) { - createDirectory(editText.getText().toString()); - dialog.dismiss(); - return true; - } - return false; - } - }); - - - return dialog; - } - - private void createDirectory(String name) { - final BaseActivity activity = (BaseActivity) getActivity(); - final DocumentInfo cwd = activity.getCurrentDirectory(); - - new CreateDirectoryTask(activity, cwd, name).executeOnExecutor( - ProviderExecutor.forAuthority(cwd.authority)); - } - - private class CreateDirectoryTask extends AsyncTask<Void, Void, DocumentInfo> { - private final BaseActivity mActivity; - private final DocumentInfo mCwd; - private final String mDisplayName; - - public CreateDirectoryTask( - BaseActivity activity, DocumentInfo cwd, String displayName) { - mActivity = activity; - mCwd = cwd; - mDisplayName = displayName; - } - - @Override - protected void onPreExecute() { - mActivity.setPending(true); - } - - @Override - protected DocumentInfo doInBackground(Void... params) { - final ContentResolver resolver = mActivity.getContentResolver(); - ContentProviderClient client = null; - try { - client = DocumentsApplication.acquireUnstableProviderOrThrow( - resolver, mCwd.derivedUri.getAuthority()); - final Uri childUri = DocumentsContract.createDocument( - client, mCwd.derivedUri, Document.MIME_TYPE_DIR, mDisplayName); - return DocumentInfo.fromUri(resolver, childUri); - } catch (Exception e) { - Log.w(TAG, "Failed to create directory", e); - return null; - } finally { - ContentProviderClient.releaseQuietly(client); - } - } - - @Override - protected void onPostExecute(DocumentInfo result) { - if (result != null) { - // Navigate into newly created child - mActivity.onDirectoryCreated(result); - Metrics.logCreateDirOperation(getContext()); - } else { - Snackbars.makeSnackbar(mActivity, R.string.create_error, Snackbar.LENGTH_SHORT) - .show(); - Metrics.logCreateDirError(getContext()); - } - mActivity.setPending(false); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java deleted file mode 100644 index d2e918c918e8..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.Shared.TAG; -import static com.android.documentsui.State.SORT_ORDER_DISPLAY_NAME; -import static com.android.documentsui.State.SORT_ORDER_LAST_MODIFIED; -import static com.android.documentsui.State.SORT_ORDER_SIZE; - -import android.content.AsyncTaskLoader; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; -import android.os.RemoteException; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.util.Log; - -import com.android.documentsui.dirlist.DirectoryFragment; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.RootInfo; - -import libcore.io.IoUtils; - -import java.io.FileNotFoundException; - -public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { - - private static final String[] SEARCH_REJECT_MIMES = new String[] { Document.MIME_TYPE_DIR }; - - private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver(); - - private final int mType; - private final RootInfo mRoot; - private final Uri mUri; - private final int mUserSortOrder; - private final boolean mSearchMode; - - private DocumentInfo mDoc; - private CancellationSignal mSignal; - private DirectoryResult mResult; - - public DirectoryLoader(Context context, int type, RootInfo root, DocumentInfo doc, Uri uri, - int userSortOrder, boolean inSearchMode) { - super(context, ProviderExecutor.forAuthority(root.authority)); - mType = type; - mRoot = root; - mUri = uri; - mUserSortOrder = userSortOrder; - mDoc = doc; - mSearchMode = inSearchMode; - } - - @Override - public final DirectoryResult loadInBackground() { - synchronized (this) { - if (isLoadInBackgroundCanceled()) { - throw new OperationCanceledException(); - } - mSignal = new CancellationSignal(); - } - - final ContentResolver resolver = getContext().getContentResolver(); - final String authority = mUri.getAuthority(); - - final DirectoryResult result = new DirectoryResult(); - result.doc = mDoc; - - // Use default document when searching - if (mSearchMode) { - final Uri docUri = DocumentsContract.buildDocumentUri( - mRoot.authority, mRoot.documentId); - try { - mDoc = DocumentInfo.fromUri(resolver, docUri); - } catch (FileNotFoundException e) { - Log.w(TAG, "Failed to query", e); - result.exception = e; - return result; - } - } - - if (mUserSortOrder != State.SORT_ORDER_UNKNOWN) { - result.sortOrder = mUserSortOrder; - } else { - if ((mDoc.flags & Document.FLAG_DIR_PREFERS_LAST_MODIFIED) != 0) { - result.sortOrder = State.SORT_ORDER_LAST_MODIFIED; - } else { - result.sortOrder = State.SORT_ORDER_DISPLAY_NAME; - } - } - - // Search always uses ranking from provider - if (mSearchMode) { - result.sortOrder = State.SORT_ORDER_UNKNOWN; - } - - if (DEBUG) - Log.d(TAG, "userSortOrder=" + mUserSortOrder + ", sortOrder=" + result.sortOrder); - - ContentProviderClient client = null; - Cursor cursor = null; - try { - client = DocumentsApplication.acquireUnstableProviderOrThrow(resolver, authority); - cursor = client.query( - mUri, null, null, null, getQuerySortOrder(result.sortOrder), mSignal); - if (cursor == null) { - throw new RemoteException("Provider returned null"); - } - - cursor.registerContentObserver(mObserver); - - cursor = new RootCursorWrapper(mUri.getAuthority(), mRoot.rootId, cursor, -1); - - if (mSearchMode) { - // Filter directories out of search results, for now - cursor = new FilteringCursorWrapper(cursor, null, SEARCH_REJECT_MIMES); - } - - result.client = client; - result.cursor = cursor; - } catch (Exception e) { - Log.w(TAG, "Failed to query", e); - result.exception = e; - ContentProviderClient.releaseQuietly(client); - } finally { - synchronized (this) { - mSignal = null; - } - } - - return result; - } - - @Override - public void cancelLoadInBackground() { - super.cancelLoadInBackground(); - - synchronized (this) { - if (mSignal != null) { - mSignal.cancel(); - } - } - } - - @Override - public void deliverResult(DirectoryResult result) { - if (isReset()) { - IoUtils.closeQuietly(result); - return; - } - DirectoryResult oldResult = mResult; - mResult = result; - - if (isStarted()) { - super.deliverResult(result); - } - - if (oldResult != null && oldResult != result) { - IoUtils.closeQuietly(oldResult); - } - } - - @Override - protected void onStartLoading() { - if (mResult != null) { - deliverResult(mResult); - } - if (takeContentChanged() || mResult == null) { - forceLoad(); - } - } - - @Override - protected void onStopLoading() { - cancelLoad(); - } - - @Override - public void onCanceled(DirectoryResult result) { - IoUtils.closeQuietly(result); - } - - @Override - protected void onReset() { - super.onReset(); - - // Ensure the loader is stopped - onStopLoading(); - - IoUtils.closeQuietly(mResult); - mResult = null; - - getContext().getContentResolver().unregisterContentObserver(mObserver); - } - - public static String getQuerySortOrder(int sortOrder) { - switch (sortOrder) { - case SORT_ORDER_DISPLAY_NAME: - return Document.COLUMN_DISPLAY_NAME + " ASC"; - case SORT_ORDER_LAST_MODIFIED: - return Document.COLUMN_LAST_MODIFIED + " DESC"; - case SORT_ORDER_SIZE: - return Document.COLUMN_SIZE + " DESC"; - default: - return null; - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryResult.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryResult.java deleted file mode 100644 index 62686439c11b..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryResult.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.State.MODE_UNKNOWN; -import static com.android.documentsui.State.SORT_ORDER_UNKNOWN; - -import android.content.ContentProviderClient; -import android.database.Cursor; - -import com.android.documentsui.model.DocumentInfo; - -import libcore.io.IoUtils; - -public class DirectoryResult implements AutoCloseable { - ContentProviderClient client; - public Cursor cursor; - public Exception exception; - public DocumentInfo doc; - - public int sortOrder = SORT_ORDER_UNKNOWN; - - @Override - public void close() { - IoUtils.closeQuietly(cursor); - ContentProviderClient.releaseQuietly(client); - cursor = null; - client = null; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/Display.java b/packages/DocumentsUI/src/com/android/documentsui/Display.java deleted file mode 100644 index 8b13222dcce7..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/Display.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.app.Activity; -import android.content.Context; -import android.graphics.Point; -import android.util.TypedValue; - -/* - * Convenience class for getting display related attributes - */ -public final class Display { - /* - * Returns the screen width in raw pixels. - */ - public static float screenWidth(Activity activity) { - Point size = new Point(); - activity.getWindowManager().getDefaultDisplay().getSize(size); - return size.x; - } - - /* - * Returns logical density of the display. - */ - public static float density(Context context) { - return context.getResources().getDisplayMetrics().density; - } - - /* - * Returns action bar height in raw pixels. - */ - public static float actionBarHeight(Context context) { - int actionBarHeight = 0; - TypedValue tv = new TypedValue(); - if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { - actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, - context.getResources().getDisplayMetrics()); - } - return actionBarHeight; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java deleted file mode 100644 index 05f36e86640a..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ /dev/null @@ -1,583 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.State.ACTION_CREATE; -import static com.android.documentsui.State.ACTION_GET_CONTENT; -import static com.android.documentsui.State.ACTION_OPEN; -import static com.android.documentsui.State.ACTION_OPEN_TREE; -import static com.android.documentsui.State.ACTION_PICK_COPY_DESTINATION; - -import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; -import android.content.ClipData; -import android.content.ComponentName; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Intent; -import android.content.pm.ResolveInfo; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.os.Parcelable; -import android.provider.DocumentsContract; -import android.support.design.widget.Snackbar; -import android.util.Log; -import android.view.Menu; - -import com.android.documentsui.MenuManager.DirectoryDetails; -import com.android.documentsui.RecentsProvider.RecentColumns; -import com.android.documentsui.RecentsProvider.ResumeColumns; -import com.android.documentsui.dirlist.AnimationView; -import com.android.documentsui.dirlist.DirectoryFragment; -import com.android.documentsui.dirlist.FragmentTuner; -import com.android.documentsui.dirlist.FragmentTuner.DocumentsTuner; -import com.android.documentsui.dirlist.Model; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DurableUtils; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperationService; - -import libcore.io.IoUtils; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -public class DocumentsActivity extends BaseActivity { - private static final int CODE_FORWARD = 42; - private static final String TAG = "DocumentsActivity"; - private DocumentsMenuManager mMenuManager; - private DirectoryDetails mDetails; - - public DocumentsActivity() { - super(R.layout.documents_activity, TAG); - } - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - mMenuManager = new DocumentsMenuManager(mSearchManager, getDisplayState()); - mDetails = new DirectoryDetails(this); - - if (mState.action == ACTION_CREATE) { - final String mimeType = getIntent().getType(); - final String title = getIntent().getStringExtra(Intent.EXTRA_TITLE); - SaveFragment.show(getFragmentManager(), mimeType, title); - } else if (mState.action == ACTION_OPEN_TREE || - mState.action == ACTION_PICK_COPY_DESTINATION) { - PickFragment.show(getFragmentManager()); - } - - if (mState.action == ACTION_GET_CONTENT) { - final Intent moreApps = new Intent(getIntent()); - moreApps.setComponent(null); - moreApps.setPackage(null); - RootsFragment.show(getFragmentManager(), moreApps); - } else if (mState.action == ACTION_OPEN || - mState.action == ACTION_CREATE || - mState.action == ACTION_OPEN_TREE || - mState.action == ACTION_PICK_COPY_DESTINATION) { - RootsFragment.show(getFragmentManager(), (Intent) null); - } - - if (mState.restored) { - if (DEBUG) Log.d(TAG, "Stack already resolved"); - } else { - // We set the activity title in AsyncTask.onPostExecute(). - // To prevent talkback from reading aloud the default title, we clear it here. - setTitle(""); - - // As a matter of policy we don't load the last used stack for the copy - // destination picker (user is already in Files app). - // Concensus was that the experice was too confusing. - // In all other cases, where the user is visiting us from another app - // we restore the stack as last used from that app. - if (mState.action == ACTION_PICK_COPY_DESTINATION) { - if (DEBUG) Log.d(TAG, "Launching directly into Home directory."); - loadRoot(getDefaultRoot()); - } else { - if (DEBUG) Log.d(TAG, "Attempting to load last used stack for calling package."); - new LoadLastUsedStackTask(this).execute(); - } - } - } - - @Override - void includeState(State state) { - final Intent intent = getIntent(); - final String action = intent.getAction(); - if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) { - state.action = ACTION_OPEN; - } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) { - state.action = ACTION_CREATE; - } else if (Intent.ACTION_GET_CONTENT.equals(action)) { - state.action = ACTION_GET_CONTENT; - } else if (Intent.ACTION_OPEN_DOCUMENT_TREE.equals(action)) { - state.action = ACTION_OPEN_TREE; - } else if (Shared.ACTION_PICK_COPY_DESTINATION.equals(action)) { - state.action = ACTION_PICK_COPY_DESTINATION; - } - - if (state.action == ACTION_OPEN || state.action == ACTION_GET_CONTENT) { - state.allowMultiple = intent.getBooleanExtra( - Intent.EXTRA_ALLOW_MULTIPLE, false); - } - - if (state.action == ACTION_OPEN || state.action == ACTION_GET_CONTENT - || state.action == ACTION_CREATE) { - state.openableOnly = intent.hasCategory(Intent.CATEGORY_OPENABLE); - } - - if (state.action == ACTION_PICK_COPY_DESTINATION) { - // Indicates that a copy operation (or move) includes a directory. - // Why? Directory creation isn't supported by some roots (like Downloads). - // This allows us to restrict available roots to just those with support. - state.directoryCopy = intent.getBooleanExtra( - Shared.EXTRA_DIRECTORY_COPY, false); - state.copyOperationSubType = intent.getIntExtra( - FileOperationService.EXTRA_OPERATION_TYPE, - FileOperationService.OPERATION_COPY); - } - } - - public void onAppPicked(ResolveInfo info) { - final Intent intent = new Intent(getIntent()); - intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_FORWARD_RESULT); - intent.setComponent(new ComponentName( - info.activityInfo.applicationInfo.packageName, info.activityInfo.name)); - startActivityForResult(intent, CODE_FORWARD); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (DEBUG) Log.d(TAG, "onActivityResult() code=" + resultCode); - - // Only relay back results when not canceled; otherwise stick around to - // let the user pick another app/backend. - if (requestCode == CODE_FORWARD && resultCode != RESULT_CANCELED) { - - // Remember that we last picked via external app - final String packageName = getCallingPackageMaybeExtra(); - final ContentValues values = new ContentValues(); - values.put(ResumeColumns.EXTERNAL, 1); - getContentResolver().insert(RecentsProvider.buildResume(packageName), values); - - // Pass back result to original caller - setResult(resultCode, data); - finish(); - } else { - super.onActivityResult(requestCode, resultCode, data); - } - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - mDrawer.update(); - mNavigator.update(); - } - - @Override - public String getDrawerTitle() { - String title = getIntent().getStringExtra(DocumentsContract.EXTRA_PROMPT); - if (title == null) { - if (mState.action == ACTION_OPEN || - mState.action == ACTION_GET_CONTENT || - mState.action == ACTION_OPEN_TREE) { - title = getResources().getString(R.string.title_open); - } else if (mState.action == ACTION_CREATE || - mState.action == ACTION_PICK_COPY_DESTINATION) { - title = getResources().getString(R.string.title_save); - } else { - // If all else fails, just call it "Documents". - title = getResources().getString(R.string.app_label); - } - } - - return title; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - mMenuManager.updateOptionMenu(menu, mDetails); - - final DocumentInfo cwd = getCurrentDirectory(); - - if (mState.action == ACTION_CREATE) { - final FragmentManager fm = getFragmentManager(); - SaveFragment.get(fm).prepareForDirectory(cwd); - } - - return true; - } - - @Override - void refreshDirectory(int anim) { - final FragmentManager fm = getFragmentManager(); - final RootInfo root = getCurrentRoot(); - final DocumentInfo cwd = getCurrentDirectory(); - - if (cwd == null) { - // No directory means recents - if (mState.action == ACTION_CREATE || - mState.action == ACTION_OPEN_TREE || - mState.action == ACTION_PICK_COPY_DESTINATION) { - RecentsCreateFragment.show(fm); - } else { - DirectoryFragment.showRecentsOpen(fm, anim); - - // In recents we pick layout mode based on the mimetype, - // picking GRID for visual types. We intentionally don't - // consult a user's saved preferences here since they are - // set per root (not per root and per mimetype). - boolean visualMimes = MimePredicate.mimeMatches( - MimePredicate.VISUAL_MIMES, mState.acceptMimes); - mState.derivedMode = visualMimes ? State.MODE_GRID : State.MODE_LIST; - } - } else { - // Normal boring directory - DirectoryFragment.showDirectory(fm, root, cwd, anim); - } - - // Forget any replacement target - if (mState.action == ACTION_CREATE) { - final SaveFragment save = SaveFragment.get(fm); - if (save != null) { - save.setReplaceTarget(null); - } - } - - if (mState.action == ACTION_OPEN_TREE || - mState.action == ACTION_PICK_COPY_DESTINATION) { - final PickFragment pick = PickFragment.get(fm); - if (pick != null) { - pick.setPickTarget(mState.action, mState.copyOperationSubType, cwd); - } - } - } - - void onSaveRequested(DocumentInfo replaceTarget) { - new ExistingFinishTask(this, replaceTarget.derivedUri) - .executeOnExecutor(getExecutorForCurrentDirectory()); - } - - @Override - void onDirectoryCreated(DocumentInfo doc) { - assert(doc.isDirectory()); - openContainerDocument(doc); - } - - void onSaveRequested(String mimeType, String displayName) { - new CreateFinishTask(this, mimeType, displayName) - .executeOnExecutor(getExecutorForCurrentDirectory()); - } - - @Override - public void onDocumentPicked(DocumentInfo doc, Model model) { - final FragmentManager fm = getFragmentManager(); - if (doc.isContainer()) { - openContainerDocument(doc); - } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { - // Explicit file picked, return - new ExistingFinishTask(this, doc.derivedUri) - .executeOnExecutor(getExecutorForCurrentDirectory()); - } else if (mState.action == ACTION_CREATE) { - // Replace selected file - SaveFragment.get(fm).setReplaceTarget(doc); - } - } - - @Override - public void onDocumentsPicked(List<DocumentInfo> docs) { - if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { - final int size = docs.size(); - final Uri[] uris = new Uri[size]; - for (int i = 0; i < size; i++) { - uris[i] = docs.get(i).derivedUri; - } - new ExistingFinishTask(this, uris) - .executeOnExecutor(getExecutorForCurrentDirectory()); - } - } - - public void onPickRequested(DocumentInfo pickTarget) { - Uri result; - if (mState.action == ACTION_OPEN_TREE) { - result = DocumentsContract.buildTreeDocumentUri( - pickTarget.authority, pickTarget.documentId); - } else if (mState.action == ACTION_PICK_COPY_DESTINATION) { - result = pickTarget.derivedUri; - } else { - // Should not be reached. - throw new IllegalStateException("Invalid mState.action."); - } - new PickFinishTask(this, result).executeOnExecutor(getExecutorForCurrentDirectory()); - } - - void writeStackToRecentsBlocking() { - final ContentResolver resolver = getContentResolver(); - final ContentValues values = new ContentValues(); - - final byte[] rawStack = DurableUtils.writeToArrayOrNull(mState.stack); - if (mState.action == ACTION_CREATE || - mState.action == ACTION_OPEN_TREE || - mState.action == ACTION_PICK_COPY_DESTINATION) { - // Remember stack for last create - values.clear(); - values.put(RecentColumns.KEY, mState.stack.buildKey()); - values.put(RecentColumns.STACK, rawStack); - resolver.insert(RecentsProvider.buildRecent(), values); - } - - // Remember location for next app launch - final String packageName = getCallingPackageMaybeExtra(); - values.clear(); - values.put(ResumeColumns.STACK, rawStack); - values.put(ResumeColumns.EXTERNAL, 0); - resolver.insert(RecentsProvider.buildResume(packageName), values); - } - - @Override - void onTaskFinished(Uri... uris) { - if (DEBUG) Log.d(TAG, "onFinished() " + Arrays.toString(uris)); - - final Intent intent = new Intent(); - if (uris.length == 1) { - intent.setData(uris[0]); - } else if (uris.length > 1) { - final ClipData clipData = new ClipData( - null, mState.acceptMimes, new ClipData.Item(uris[0])); - for (int i = 1; i < uris.length; i++) { - clipData.addItem(new ClipData.Item(uris[i])); - } - intent.setClipData(clipData); - } - - if (mState.action == ACTION_GET_CONTENT) { - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - } else if (mState.action == ACTION_OPEN_TREE) { - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION - | Intent.FLAG_GRANT_WRITE_URI_PERMISSION - | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION - | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); - } else if (mState.action == ACTION_PICK_COPY_DESTINATION) { - // Picking a copy destination is only used internally by us, so we - // don't need to extend permissions to the caller. - intent.putExtra(Shared.EXTRA_STACK, (Parcelable) mState.stack); - intent.putExtra(FileOperationService.EXTRA_OPERATION_TYPE, mState.copyOperationSubType); - } else { - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION - | Intent.FLAG_GRANT_WRITE_URI_PERMISSION - | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); - } - - setResult(Activity.RESULT_OK, intent); - finish(); - } - - - public static DocumentsActivity get(Fragment fragment) { - return (DocumentsActivity) fragment.getActivity(); - } - - @Override - public FragmentTuner createFragmentTuner() { - // Currently DocumentsTuner maintains a state specific to the fragment instance. Because of - // that, we create a new instance everytime it is needed - return new DocumentsTuner(this, getDisplayState()); - } - - @Override - public MenuManager getMenuManager() { - return mMenuManager; - } - - @Override - public DirectoryDetails getDirectoryDetails() { - return mDetails; - } - - /** - * Loads the last used path (stack) from Recents (history). - * The path selected is based on the calling package name. So the last - * path for an app like Gmail can be different than the last path - * for an app like DropBox. - */ - private static final class LoadLastUsedStackTask - extends PairedTask<DocumentsActivity, Void, Void> { - - private volatile boolean mRestoredStack; - private volatile boolean mExternal; - private State mState; - - public LoadLastUsedStackTask(DocumentsActivity activity) { - super(activity); - mState = activity.mState; - } - - @Override - protected Void run(Void... params) { - if (DEBUG && !mState.stack.isEmpty()) { - Log.w(TAG, "Overwriting existing stack."); - } - RootsCache roots = DocumentsApplication.getRootsCache(mOwner); - - String packageName = mOwner.getCallingPackageMaybeExtra(); - Uri resumeUri = RecentsProvider.buildResume(packageName); - Cursor cursor = mOwner.getContentResolver().query(resumeUri, null, null, null, null); - try { - if (cursor.moveToFirst()) { - mExternal = cursor.getInt(cursor.getColumnIndex(ResumeColumns.EXTERNAL)) != 0; - final byte[] rawStack = cursor.getBlob( - cursor.getColumnIndex(ResumeColumns.STACK)); - DurableUtils.readFromArray(rawStack, mState.stack); - mRestoredStack = true; - } - } catch (IOException e) { - Log.w(TAG, "Failed to resume: " + e); - } finally { - IoUtils.closeQuietly(cursor); - } - - if (mRestoredStack) { - // Update the restored stack to ensure we have freshest data - final Collection<RootInfo> matchingRoots = roots.getMatchingRootsBlocking(mState); - try { - mState.stack.updateRoot(matchingRoots); - mState.stack.updateDocuments(mOwner.getContentResolver()); - } catch (FileNotFoundException e) { - Log.w(TAG, "Failed to restore stack for package: " + packageName - + " because of error: "+ e); - mState.stack.reset(); - mRestoredStack = false; - } - } - - return null; - } - - @Override - protected void finish(Void result) { - mState.restored = true; - mState.external = mExternal; - mOwner.refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE); - } - } - - private static final class PickFinishTask extends PairedTask<DocumentsActivity, Void, Void> { - private final Uri mUri; - - public PickFinishTask(DocumentsActivity activity, Uri uri) { - super(activity); - mUri = uri; - } - - @Override - protected Void run(Void... params) { - mOwner.writeStackToRecentsBlocking(); - return null; - } - - @Override - protected void finish(Void result) { - mOwner.onTaskFinished(mUri); - } - } - - private static final class ExistingFinishTask extends PairedTask<DocumentsActivity, Void, Void> { - private final Uri[] mUris; - - public ExistingFinishTask(DocumentsActivity activity, Uri... uris) { - super(activity); - mUris = uris; - } - - @Override - protected Void run(Void... params) { - mOwner.writeStackToRecentsBlocking(); - return null; - } - - @Override - protected void finish(Void result) { - mOwner.onTaskFinished(mUris); - } - } - - /** - * Task that creates a new document in the background. - */ - private static final class CreateFinishTask extends PairedTask<DocumentsActivity, Void, Uri> { - private final String mMimeType; - private final String mDisplayName; - - public CreateFinishTask(DocumentsActivity activity, String mimeType, String displayName) { - super(activity); - mMimeType = mimeType; - mDisplayName = displayName; - } - - @Override - protected void prepare() { - mOwner.setPending(true); - } - - @Override - protected Uri run(Void... params) { - final ContentResolver resolver = mOwner.getContentResolver(); - final DocumentInfo cwd = mOwner.getCurrentDirectory(); - - ContentProviderClient client = null; - Uri childUri = null; - try { - client = DocumentsApplication.acquireUnstableProviderOrThrow( - resolver, cwd.derivedUri.getAuthority()); - childUri = DocumentsContract.createDocument( - client, cwd.derivedUri, mMimeType, mDisplayName); - } catch (Exception e) { - Log.w(TAG, "Failed to create document", e); - } finally { - ContentProviderClient.releaseQuietly(client); - } - - if (childUri != null) { - mOwner.writeStackToRecentsBlocking(); - } - - return childUri; - } - - @Override - protected void finish(Uri result) { - if (result != null) { - mOwner.onTaskFinished(result); - } else { - Snackbars.makeSnackbar( - mOwner, R.string.save_error, Snackbar.LENGTH_SHORT).show(); - } - - mOwner.setPending(false); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java deleted file mode 100644 index 3b2529fd493b..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.app.ActivityManager; -import android.app.Application; -import android.content.BroadcastReceiver; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.Uri; -import android.os.RemoteException; -import android.text.format.DateUtils; - -import com.android.documentsui.clipping.ClipStorage; -import com.android.documentsui.clipping.DocumentClipper; - -public class DocumentsApplication extends Application { - private static final long PROVIDER_ANR_TIMEOUT = 20 * DateUtils.SECOND_IN_MILLIS; - - private RootsCache mRoots; - - private ThumbnailCache mThumbnailCache; - private ClipStorage mClipStorage; - private DocumentClipper mClipper; - - public static RootsCache getRootsCache(Context context) { - return ((DocumentsApplication) context.getApplicationContext()).mRoots; - } - - public static ThumbnailCache getThumbnailCache(Context context) { - final DocumentsApplication app = (DocumentsApplication) context.getApplicationContext(); - return app.mThumbnailCache; - } - - public static ContentProviderClient acquireUnstableProviderOrThrow( - ContentResolver resolver, String authority) throws RemoteException { - final ContentProviderClient client = resolver.acquireUnstableContentProviderClient( - authority); - if (client == null) { - throw new RemoteException("Failed to acquire provider for " + authority); - } - client.setDetectNotResponding(PROVIDER_ANR_TIMEOUT); - return client; - } - - public static DocumentClipper getDocumentClipper(Context context) { - return ((DocumentsApplication) context.getApplicationContext()).mClipper; - } - - public static ClipStorage getClipStorage(Context context) { - return ((DocumentsApplication) context.getApplicationContext()).mClipStorage; - } - - @Override - public void onCreate() { - super.onCreate(); - - final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); - final int memoryClassBytes = am.getMemoryClass() * 1024 * 1024; - - mRoots = new RootsCache(this); - mRoots.updateAsync(false); - - mThumbnailCache = new ThumbnailCache(memoryClassBytes / 4); - - mClipStorage = new ClipStorage( - ClipStorage.prepareStorage(getCacheDir()), - getSharedPreferences(ClipStorage.PREF_NAME, 0)); - mClipper = new DocumentClipper(this, mClipStorage); - - final IntentFilter packageFilter = new IntentFilter(); - packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); - packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED); - packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); - packageFilter.addAction(Intent.ACTION_PACKAGE_DATA_CLEARED); - packageFilter.addDataScheme("package"); - registerReceiver(mCacheReceiver, packageFilter); - - final IntentFilter localeFilter = new IntentFilter(); - localeFilter.addAction(Intent.ACTION_LOCALE_CHANGED); - registerReceiver(mCacheReceiver, localeFilter); - } - - @Override - public void onTrimMemory(int level) { - super.onTrimMemory(level); - - mThumbnailCache.onTrimMemory(level); - } - - private BroadcastReceiver mCacheReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - final Uri data = intent.getData(); - if (data != null) { - final String packageName = data.getSchemeSpecificPart(); - mRoots.updatePackageAsync(packageName); - } else { - mRoots.updateAsync(true); - } - } - }; -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsMenuManager.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsMenuManager.java deleted file mode 100644 index 9b07b4907e98..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsMenuManager.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.State.ACTION_CREATE; -import static com.android.documentsui.State.ACTION_GET_CONTENT; -import static com.android.documentsui.State.ACTION_OPEN; -import static com.android.documentsui.State.ACTION_OPEN_TREE; -import static com.android.documentsui.State.ACTION_PICK_COPY_DESTINATION; - -import android.view.Menu; -import android.view.MenuItem; - -import com.android.documentsui.MenuManager.DirectoryDetails; - -final class DocumentsMenuManager extends MenuManager { - - private boolean mPicking; - - public DocumentsMenuManager(SearchViewManager searchManager, State displayState) { - super(searchManager, displayState); - - mPicking = mState.action == ACTION_CREATE - || mState.action == ACTION_OPEN_TREE - || mState.action == ACTION_PICK_COPY_DESTINATION; - } - - @Override - public void updateOptionMenu(Menu menu, DirectoryDetails details) { - super.updateOptionMenu(menu, details); - if (mPicking) { - // May already be hidden because the root - // doesn't support search. - mSearchManager.showMenu(false); - } - } - - @Override - void updateModePicker(MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) { - // No display options in recent directories - if (mPicking && directoryDetails.isInRecents()) { - grid.setVisible(false); - list.setVisible(false); - } else { - super.updateModePicker(grid, list, directoryDetails); - } - } - - @Override - void updateFileSize(MenuItem fileSize, DirectoryDetails directoryDetails) { - super.updateFileSize(fileSize, directoryDetails); - fileSize.setVisible(fileSize.isVisible() && !mPicking); - } - - @Override - void updateSelectAll(MenuItem selectAll, SelectionDetails selectionDetails) { - selectAll.setVisible(mState.allowMultiple); - } - - @Override - void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) { - createDir.setVisible(mPicking); - createDir.setEnabled(mPicking && directoryDetails.canCreateDirectory()); - } - - @Override - void updateOpen(MenuItem open, SelectionDetails selectionDetails) { - open.setVisible(mState.action == ACTION_GET_CONTENT - || mState.action == ACTION_OPEN); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsToolbar.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsToolbar.java deleted file mode 100644 index 7742cbf226e8..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsToolbar.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.MenuItem; -import android.widget.Toolbar; - -/** - * ToolBar of Documents UI. - */ -public class DocumentsToolbar extends Toolbar { - interface OnActionViewCollapsedListener { - void onActionViewCollapsed(); - } - - private OnActionViewCollapsedListener mOnActionViewCollapsedListener; - - public DocumentsToolbar(Context context, AttributeSet attrs, - int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - public DocumentsToolbar(Context context, AttributeSet attrs, - int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public DocumentsToolbar(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public DocumentsToolbar(Context context) { - super(context); - } - - @Override - public void collapseActionView() { - super.collapseActionView(); - if (mOnActionViewCollapsedListener != null) { - mOnActionViewCollapsedListener.onActionViewCollapsed(); - } - } - - /** - * Adds a listener that is invoked after collapsing the action view. - * @param listener - */ - public void setOnActionViewCollapsedListener( - OnActionViewCollapsedListener listener) { - mOnActionViewCollapsedListener = listener; - } - - public MenuItem getSearchMenu() { - return getMenu().findItem(R.id.menu_search); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DragOverTextView.java b/packages/DocumentsUI/src/com/android/documentsui/DragOverTextView.java deleted file mode 100644 index e9fc2a0fe3a1..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/DragOverTextView.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View.OnDragListener; -import android.widget.TextView; - -/** - * An {@link TextView} that uses drawable states to distinct between normal and highlighted states. - */ - -public final class DragOverTextView extends TextView { - private static final int[] STATE_HIGHLIGHTED = {R.attr.state_highlighted}; - - private boolean mHighlighted = false; - - public DragOverTextView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected int[] onCreateDrawableState(int extraSpace) { - final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); - - if (mHighlighted) { - mergeDrawableStates(drawableState, STATE_HIGHLIGHTED); - } - - return drawableState; - } - - public void setHighlight(boolean highlight) { - mHighlighted = highlight; - refreshDrawableState(); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DrawerController.java b/packages/DocumentsUI/src/com/android/documentsui/DrawerController.java deleted file mode 100644 index 97d459bf1862..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/DrawerController.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; - -import android.annotation.IntDef; -import android.app.Activity; -import android.support.annotation.ColorRes; -import android.support.v4.app.ActionBarDrawerToggle; -import android.support.v4.widget.DrawerLayout; -import android.support.v4.widget.DrawerLayout.DrawerListener; -import android.util.Log; -import android.view.View; -import android.widget.Toolbar; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * A facade over the various pieces comprising "roots fragment in a Drawer". - * - * @see DrawerController#create(DrawerLayout) - */ -abstract class DrawerController implements DrawerListener { - public static final String TAG = "DrawerController"; - - // Drawer opening triggered by tapping the navigation icon - public static final int OPENED_HAMBURGER = 0; - // Drawer opening triggered by swiping right from the edge of the screen - public static final int OPENED_SWIPE = 1; - // Mostly programmatically forced drawer opening - public static final int OPENED_OTHER = 2; - - @IntDef(flag = true, value = { - OPENED_HAMBURGER, - OPENED_SWIPE, - OPENED_OTHER - }) - @Retention(RetentionPolicy.SOURCE) - public @interface Trigger {} - - /** - * Toggles the drawer and sets the OPENED_OTHER as the action that causes opening the drawer. - * @param open - */ - abstract void setOpen(boolean open); - - /** - * Toggles the drawer. - * @param open - * @param trigger Indicates what action caused opening the drawer. It is ignored for closing. - */ - abstract void setOpen(boolean open, @Trigger int trigger); - abstract boolean isPresent(); - abstract boolean isOpen(); - abstract void setTitle(String title); - abstract void update(); - - /** - * Returns a controller suitable for {@code Layout}. - */ - static DrawerController create(Activity activity) { - - DrawerLayout layout = (DrawerLayout) activity.findViewById(R.id.drawer_layout); - - if (layout == null) { - return new DummyDrawerController(); - } - - View drawer = activity.findViewById(R.id.drawer_roots); - Toolbar toolbar = (Toolbar) activity.findViewById(R.id.roots_toolbar); - - drawer.getLayoutParams().width = calculateDrawerWidth(activity); - - ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( - activity, - layout, - R.drawable.ic_hamburger, - R.string.drawer_open, - R.string.drawer_close); - - return new RuntimeDrawerController(layout, drawer, toggle, toolbar); - } - - /** - * Returns a controller suitable for {@code Layout}. - */ - static DrawerController createDummy() { - return new DummyDrawerController(); - } - - private static int calculateDrawerWidth(Activity activity) { - // Material design specification for navigation drawer: - // https://www.google.com/design/spec/patterns/navigation-drawer.html - float width = Display.screenWidth(activity) - Display.actionBarHeight(activity); - float maxWidth = activity.getResources().getDimension(R.dimen.max_drawer_width); - int finalWidth = (int) ((width > maxWidth ? maxWidth : width)); - - if (DEBUG) - Log.d(TAG, "Calculated drawer width:" + (finalWidth / Display.density(activity))); - - return finalWidth; - } - - /** - * Runtime controller that manages a real drawer. - */ - private static final class RuntimeDrawerController extends DrawerController - implements ItemDragListener.DragHost { - private final ActionBarDrawerToggle mToggle; - private DrawerLayout mLayout; - private View mDrawer; - private Toolbar mToolbar; - private @Trigger int mTrigger = OPENED_OTHER; - - public RuntimeDrawerController( - DrawerLayout layout, View drawer, ActionBarDrawerToggle toggle, - Toolbar drawerToolbar) { - mToolbar = drawerToolbar; - assert(layout != null); - - mLayout = layout; - mDrawer = drawer; - mToggle = toggle; - - mLayout.setDrawerListener(this); - - View edge = layout.findViewById(R.id.drawer_edge); - edge.setOnDragListener(new ItemDragListener<>(this)); - } - - @Override - public void runOnUiThread(Runnable runnable) { - mDrawer.post(runnable); - } - - @Override - public void setDropTargetHighlight(View v, boolean highlight) { - assert (v.getId() == R.id.drawer_edge); - - @ColorRes int id = highlight ? R.color.item_doc_background_selected : - android.R.color.transparent; - v.setBackgroundColor(id); - } - - @Override - public void onViewHovered(View v) { - assert (v.getId() == R.id.drawer_edge); - - setOpen(true); - } - - @Override - void setOpen(boolean open) { - setOpen(open, OPENED_OTHER); - } - - @Override - void setOpen(boolean open, @Trigger int trigger) { - if (open) { - mLayout.openDrawer(mDrawer); - mTrigger = trigger; - } else { - mLayout.closeDrawer(mDrawer); - } - } - - @Override - boolean isOpen() { - return mLayout.isDrawerOpen(mDrawer); - } - - @Override - boolean isPresent() { - return true; - } - - @Override - void setTitle(String title) { - mToolbar.setTitle(title); - } - - @Override - void update() { - mToggle.syncState(); - } - - @Override - public void onDrawerSlide(View drawerView, float slideOffset) { - mToggle.onDrawerSlide(drawerView, slideOffset); - } - - @Override - public void onDrawerOpened(View drawerView) { - mToggle.onDrawerOpened(drawerView); - Metrics.logDrawerOpened(mToolbar.getContext(), mTrigger); - } - - @Override - public void onDrawerClosed(View drawerView) { - mToggle.onDrawerClosed(drawerView); - mTrigger = OPENED_OTHER; - } - - @Override - public void onDrawerStateChanged(int newState) { - mToggle.onDrawerStateChanged(newState); - if (newState == DrawerLayout.STATE_DRAGGING) { - mTrigger = OPENED_SWIPE; - } - } - } - - /* - * Dummy controller useful with clients that don't host a real drawer. - */ - private static final class DummyDrawerController extends DrawerController { - - @Override - void setOpen(boolean open) {} - - @Override - void setOpen(boolean open, @Trigger int trigger) {} - - @Override - boolean isOpen() { - return false; - } - - @Override - boolean isPresent() { - return false; - } - - @Override - void setTitle(String title) {} - - @Override - void update() {} - - @Override - public void onDrawerSlide(View drawerView, float slideOffset) {} - - @Override - public void onDrawerOpened(View drawerView) {} - - @Override - public void onDrawerClosed(View drawerView) {} - - @Override - public void onDrawerStateChanged(int newState) {} - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/DropdownBreadcrumb.java b/packages/DocumentsUI/src/com/android/documentsui/DropdownBreadcrumb.java deleted file mode 100644 index 71d7334960e8..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/DropdownBreadcrumb.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.Spinner; -import android.widget.TextView; - -import com.android.documentsui.NavigationViewManager.Breadcrumb; -import com.android.documentsui.NavigationViewManager.Environment; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.RootInfo; - -import java.util.function.Consumer; - -/** - * Dropdown implementation of breadcrumb used for phone device layouts - */ - -public final class DropdownBreadcrumb extends Spinner implements Breadcrumb { - - private DropdownAdapter mAdapter; - - public DropdownBreadcrumb( - Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - public DropdownBreadcrumb(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public DropdownBreadcrumb(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public DropdownBreadcrumb(Context context) { - super(context); - } - - @Override - public void setup(Environment env, State state, Consumer<Integer> listener) { - mAdapter = new DropdownAdapter(state, env); - setOnItemSelectedListener( - new OnItemSelectedListener() { - @Override - public void onItemSelected( - AdapterView<?> parent, View view, int position, long id) { - listener.accept(position); - } - - @Override - public void onNothingSelected(AdapterView<?> parent) {} - }); - } - - @Override - public void show(boolean visibility) { - if (visibility) { - setVisibility(VISIBLE); - setAdapter(mAdapter); - } else { - setVisibility(GONE); - setAdapter(null); - } - } - - @Override - public void postUpdate() { - setSelection(mAdapter.getCount() - 1, false); - } - - private static final class DropdownAdapter extends BaseAdapter { - private Environment mEnv; - private State mState; - - public DropdownAdapter(State state, Environment env) { - mState = state; - mEnv = env; - } - - @Override - public int getCount() { - return mState.stack.size(); - } - - @Override - public DocumentInfo getItem(int position) { - return mState.stack.get(mState.stack.size() - position - 1); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.item_subdir_title, parent, false); - } - - final TextView title = (TextView) convertView.findViewById(android.R.id.title); - final DocumentInfo doc = getItem(position); - - if (position == 0) { - final RootInfo root = mEnv.getCurrentRoot(); - title.setText(root.title); - } else { - title.setText(doc.displayName); - } - - return convertView; - } - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.item_subdir, parent, false); - } - - final TextView title = (TextView) convertView.findViewById(android.R.id.title); - final DocumentInfo doc = getItem(position); - - if (position == 0) { - final RootInfo root = mEnv.getCurrentRoot(); - title.setText(root.title); - } else { - title.setText(doc.displayName); - } - - return convertView; - } - } - -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/EjectRootTask.java b/packages/DocumentsUI/src/com/android/documentsui/EjectRootTask.java deleted file mode 100644 index e47a262307d9..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/EjectRootTask.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.net.Uri; -import android.provider.DocumentsContract; -import android.util.Log; - -import java.util.function.BooleanSupplier; -import java.util.function.Consumer; - -final class EjectRootTask extends CheckedTask<Void, Boolean> { - private final String mAuthority; - private final String mRootId; - private final Consumer<Boolean> mCallback; - private Context mContext; - - /** - * @param ejectCanceledCheck The method reference we use to see whether eject should be stopped - * at any point - * @param finishCallback The end callback necessary when the eject task finishes - */ - public EjectRootTask(Context context, - String authority, - String rootId, - BooleanSupplier ejectCanceledCheck, - Consumer<Boolean> finishCallback) { - super(ejectCanceledCheck::getAsBoolean); - mAuthority = authority; - mRootId = rootId; - mContext = context; - mCallback = finishCallback; - } - - @Override - protected Boolean run(Void... params) { - final ContentResolver resolver = mContext.getContentResolver(); - - Uri rootUri = DocumentsContract.buildRootUri(mAuthority, mRootId); - ContentProviderClient client = null; - try { - client = DocumentsApplication.acquireUnstableProviderOrThrow( - resolver, mAuthority); - return DocumentsContract.ejectRoot(client, rootUri); - } catch (Exception e) { - Log.w(Shared.TAG, "Failed to eject root", e); - } finally { - ContentProviderClient.releaseQuietly(client); - } - - return false; - } - - @Override - protected void finish(Boolean ejected) { - mCallback.accept(ejected); - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/src/com/android/documentsui/EventListener.java b/packages/DocumentsUI/src/com/android/documentsui/EventListener.java deleted file mode 100644 index c15e9a641cfe..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/EventListener.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.net.Uri; -import android.support.annotation.Nullable; - -public interface EventListener { - /** - * @param uri Uri navigated to. If recents, then null. - */ - void onDirectoryNavigated(@Nullable Uri uri); - - /** - * @param uri Uri of the loaded directory. If recents, then null. - */ - void onDirectoryLoaded(@Nullable Uri uri); -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/Events.java b/packages/DocumentsUI/src/com/android/documentsui/Events.java deleted file mode 100644 index 95934c3fb5cc..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/Events.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; - -import android.graphics.Point; -import android.support.v7.widget.RecyclerView; -import android.util.Log; -import android.util.Pools; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.View; - -/** - * Utility code for dealing with MotionEvents. - */ -public final class Events { - - /** - * Returns true if event was triggered by a mouse. - */ - public static boolean isMouseEvent(MotionEvent e) { - int toolType = e.getToolType(0); - return toolType == MotionEvent.TOOL_TYPE_MOUSE; - } - - /** - * Returns true if event was triggered by a finger or stylus touch. - */ - public static boolean isActionDown(MotionEvent e) { - return e.getActionMasked() == MotionEvent.ACTION_DOWN; - } - - /** - * Returns true if event was triggered by a finger or stylus touch. - */ - public static boolean isActionUp(MotionEvent e) { - return e.getActionMasked() == MotionEvent.ACTION_UP; - } - - /** - * Returns true if the shift is pressed. - */ - public boolean isShiftPressed(MotionEvent e) { - return hasShiftBit(e.getMetaState()); - } - - /** - * Whether or not the given keyCode represents a navigation keystroke (e.g. up, down, home). - * - * @param keyCode - * @return - */ - public static boolean isNavigationKeyCode(int keyCode) { - switch (keyCode) { - case KeyEvent.KEYCODE_DPAD_UP: - case KeyEvent.KEYCODE_DPAD_DOWN: - case KeyEvent.KEYCODE_DPAD_LEFT: - case KeyEvent.KEYCODE_DPAD_RIGHT: - case KeyEvent.KEYCODE_MOVE_HOME: - case KeyEvent.KEYCODE_MOVE_END: - case KeyEvent.KEYCODE_PAGE_UP: - case KeyEvent.KEYCODE_PAGE_DOWN: - return true; - default: - return false; - } - } - - - /** - * Returns true if the "SHIFT" bit is set. - */ - public static boolean hasShiftBit(int metaState) { - return (metaState & KeyEvent.META_SHIFT_ON) != 0; - } - - /** - * A facade over MotionEvent primarily designed to permit for unit testing - * of related code. - */ - public interface InputEvent extends AutoCloseable { - boolean isMouseEvent(); - boolean isPrimaryButtonPressed(); - boolean isSecondaryButtonPressed(); - boolean isShiftKeyDown(); - - /** Returns true if the action is the initial press of a mouse or touch. */ - boolean isActionDown(); - - /** Returns true if the action is the final release of a mouse or touch. */ - boolean isActionUp(); - - // Eliminate the checked Exception from Autoclosable. - @Override - public void close(); - - Point getOrigin(); - float getX(); - float getY(); - float getRawX(); - float getRawY(); - - /** Returns true if the there is an item under the finger/cursor. */ - boolean isOverItem(); - - /** Returns the adapter position of the item under the finger/cursor. */ - int getItemPosition(); - } - - public static final class MotionInputEvent implements InputEvent { - private static final String TAG = "MotionInputEvent"; - - private static final Pools.SimplePool<MotionInputEvent> sPool = new Pools.SimplePool<>(1); - - private MotionEvent mEvent; - interface PositionProvider { - int get(MotionEvent e); - } - - private int mPosition; - - private MotionInputEvent() { - if (DEBUG) Log.i(TAG, "Created a new instance."); - } - - public static MotionInputEvent obtain(MotionEvent event, RecyclerView view) { - Shared.checkMainLoop(); - - MotionInputEvent instance = sPool.acquire(); - instance = (instance != null ? instance : new MotionInputEvent()); - - instance.mEvent = event; - - // Consider determining position lazily as an optimization. - View child = view.findChildViewUnder(event.getX(), event.getY()); - instance.mPosition = (child != null) - ? view.getChildAdapterPosition(child) - : RecyclerView.NO_POSITION; - - return instance; - } - - public static MotionInputEvent obtain( - MotionEvent event, PositionProvider positionProvider) { - Shared.checkMainLoop(); - - MotionInputEvent instance = sPool.acquire(); - instance = (instance != null ? instance : new MotionInputEvent()); - - instance.mEvent = event; - instance.mPosition = positionProvider.get(event); - - return instance; - } - - public void recycle() { - Shared.checkMainLoop(); - - mEvent = null; - mPosition = -1; - - boolean released = sPool.release(this); - // This assert is used to guarantee we won't generate too many instances that can't be - // held in the pool, which indicates our pool size is too small. - // - // Right now one instance is enough because we expect all instances are only used in - // main thread. - assert(released); - } - - @Override - public void close() { - recycle(); - } - - @Override - public boolean isMouseEvent() { - return Events.isMouseEvent(mEvent); - } - - @Override - public boolean isPrimaryButtonPressed() { - return mEvent.isButtonPressed(MotionEvent.BUTTON_PRIMARY); - } - - @Override - public boolean isSecondaryButtonPressed() { - return mEvent.isButtonPressed(MotionEvent.BUTTON_SECONDARY); - } - - @Override - public boolean isShiftKeyDown() { - return Events.hasShiftBit(mEvent.getMetaState()); - } - - @Override - public boolean isActionDown() { - return mEvent.getActionMasked() == MotionEvent.ACTION_DOWN; - } - - @Override - public boolean isActionUp() { - return mEvent.getActionMasked() == MotionEvent.ACTION_UP; - } - - @Override - public Point getOrigin() { - return new Point((int) mEvent.getX(), (int) mEvent.getY()); - } - - @Override - public float getX() { - return mEvent.getX(); - } - - @Override - public float getY() { - return mEvent.getY(); - } - - @Override - public float getRawX() { - return mEvent.getRawX(); - } - - @Override - public float getRawY() { - return mEvent.getRawY(); - } - - @Override - public boolean isOverItem() { - return getItemPosition() != RecyclerView.NO_POSITION; - } - - @Override - public int getItemPosition() { - return mPosition; - } - - @Override - public String toString() { - return new StringBuilder() - .append("MotionInputEvent {") - .append("isMouseEvent=").append(isMouseEvent()) - .append(" isPrimaryButtonPressed=").append(isPrimaryButtonPressed()) - .append(" isSecondaryButtonPressed=").append(isSecondaryButtonPressed()) - .append(" isShiftKeyDown=").append(isShiftKeyDown()) - .append(" isActionDown=").append(isActionDown()) - .append(" isActionUp=").append(isActionUp()) - .append(" getOrigin=").append(getOrigin()) - .append(" isOverItem=").append(isOverItem()) - .append(" getItemPosition=").append(getItemPosition()) - .append("}") - .toString(); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/Files.java b/packages/DocumentsUI/src/com/android/documentsui/Files.java deleted file mode 100644 index 009fecb4d719..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/Files.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import java.io.File; - -/** - * Utility class for working with {@link File} instances. - */ -public final class Files { - - private Files() {} // no initialization for utility classes. - - public static void deleteRecursively(File file) { - if (file.isDirectory()) { - for (File child : file.listFiles()) { - deleteRecursively(child); - } - } - file.delete(); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java deleted file mode 100644 index 54f3e61ea308..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java +++ /dev/null @@ -1,531 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.OperationDialogFragment.DIALOG_TYPE_UNKNOWN; -import static com.android.documentsui.Shared.DEBUG; - -import android.app.Activity; -import android.app.FragmentManager; -import android.content.ActivityNotFoundException; -import android.content.ClipData; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.os.Parcelable; -import android.provider.DocumentsContract; -import android.support.design.widget.Snackbar; -import android.util.Log; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; - -import com.android.documentsui.MenuManager.DirectoryDetails; -import com.android.documentsui.OperationDialogFragment.DialogType; -import com.android.documentsui.RecentsProvider.ResumeColumns; -import com.android.documentsui.clipping.DocumentClipper; -import com.android.documentsui.dirlist.AnimationView; -import com.android.documentsui.dirlist.DirectoryFragment; -import com.android.documentsui.dirlist.FragmentTuner; -import com.android.documentsui.dirlist.FragmentTuner.FilesTuner; -import com.android.documentsui.dirlist.Model; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.DurableUtils; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperationService; - -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -/** - * Standalone file management activity. - */ -public class FilesActivity extends BaseActivity { - - public static final String TAG = "FilesActivity"; - - // See comments where this const is referenced for details. - private static final int DRAWER_NO_FIDDLE_DELAY = 1500; - - // Track the time we opened the drawer in response to back being pressed. - // We use the time gap to figure out whether to close app or reopen the drawer. - private long mDrawerLastFiddled; - private DocumentClipper mClipper; - private FilesMenuManager mMenuManager; - private DirectoryDetails mDetails; - - public FilesActivity() { - super(R.layout.files_activity, TAG); - } - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - - mClipper = DocumentsApplication.getDocumentClipper(this); - mMenuManager = new FilesMenuManager(mSearchManager, getDisplayState()); - mDetails = new DirectoryDetails(this) { - @Override - public boolean hasItemsToPaste() { - return mClipper.hasItemsToPaste(); - } - }; - - RootsFragment.show(getFragmentManager(), this::openRootSettings); - - final Intent intent = getIntent(); - final Uri uri = intent.getData(); - - if (mState.restored) { - if (DEBUG) Log.d(TAG, "Stack already resolved for uri: " + intent.getData()); - } else if (!mState.stack.isEmpty()) { - // If a non-empty stack is present in our state, it was read (presumably) - // from EXTRA_STACK intent extra. In this case, we'll skip other means of - // loading or restoring the stack (like URI). - // - // When restoring from a stack, if a URI is present, it should only ever be: - // -- a launch URI: Launch URIs support sensible activity management, - // but don't specify a real content target) - // -- a fake Uri from notifications. These URIs have no authority (TODO: details). - // - // Any other URI is *sorta* unexpected...except when browsing an archive - // in downloads. - if(uri != null - && uri.getAuthority() != null - && !uri.equals(mState.stack.peek()) - && !LauncherActivity.isLaunchUri(uri)) { - if (DEBUG) Log.w(TAG, - "Launching with non-empty stack. Ignoring unexpected uri: " + uri); - } else { - if (DEBUG) Log.d(TAG, "Launching with non-empty stack."); - } - refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE); - } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { - assert(uri != null); - new OpenUriForViewTask(this).executeOnExecutor( - ProviderExecutor.forAuthority(uri.getAuthority()), uri); - } else if (DocumentsContract.isRootUri(this, uri)) { - if (DEBUG) Log.d(TAG, "Launching with root URI."); - // If we've got a specific root to display, restore that root using a dedicated - // authority. That way a misbehaving provider won't result in an ANR. - loadRoot(uri); - } else { - if (DEBUG) Log.d(TAG, "All other means skipped. Launching into default directory."); - loadRoot(getDefaultRoot()); - } - - final @DialogType int dialogType = intent.getIntExtra( - FileOperationService.EXTRA_DIALOG_TYPE, DIALOG_TYPE_UNKNOWN); - // DialogFragment takes care of restoring the dialog on configuration change. - // Only show it manually for the first time (icicle is null). - if (icicle == null && dialogType != DIALOG_TYPE_UNKNOWN) { - final int opType = intent.getIntExtra( - FileOperationService.EXTRA_OPERATION_TYPE, - FileOperationService.OPERATION_COPY); - final ArrayList<DocumentInfo> srcList = - intent.getParcelableArrayListExtra(FileOperationService.EXTRA_SRC_LIST); - OperationDialogFragment.show( - getFragmentManager(), - dialogType, - srcList, - mState.stack, - opType); - } - } - - @Override - void includeState(State state) { - final Intent intent = getIntent(); - - state.action = State.ACTION_BROWSE; - state.allowMultiple = true; - - // Options specific to the DocumentsActivity. - assert(!intent.hasExtra(Intent.EXTRA_LOCAL_ONLY)); - - final DocumentStack stack = intent.getParcelableExtra(Shared.EXTRA_STACK); - if (stack != null) { - state.stack = stack; - } - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - // This check avoids a flicker from "Recents" to "Home". - // Only update action bar at this point if there is an active - // serach. Why? Because this avoid an early (undesired) load of - // the recents root...which is the default root in other activities. - // In Files app "Home" is the default, but it is loaded async. - // update will be called once Home root is loaded. - // Except while searching we need this call to ensure the - // search bits get layed out correctly. - if (mSearchManager.isSearching()) { - mNavigator.update(); - } - } - - @Override - public void onResume() { - super.onResume(); - - final RootInfo root = getCurrentRoot(); - - // If we're browsing a specific root, and that root went away, then we - // have no reason to hang around. - // TODO: Rather than just disappearing, maybe we should inform - // the user what has happened, let them close us. Less surprising. - if (mRoots.getRootBlocking(root.authority, root.rootId) == null) { - finish(); - } - } - - @Override - public String getDrawerTitle() { - Intent intent = getIntent(); - return (intent != null && intent.hasExtra(Intent.EXTRA_TITLE)) - ? intent.getStringExtra(Intent.EXTRA_TITLE) - : getTitle().toString(); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - mMenuManager.updateOptionMenu(menu, mDetails); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_create_dir: - assert(canCreateDirectory()); - showCreateDirectoryDialog(); - break; - case R.id.menu_new_window: - createNewWindow(); - break; - case R.id.menu_paste_from_clipboard: - DirectoryFragment dir = getDirectoryFragment(); - if (dir != null) { - dir.pasteFromClipboard(); - } - break; - case R.id.menu_settings: - final RootInfo root = getCurrentRoot(); - openRootSettings(root); - break; - default: - return super.onOptionsItemSelected(item); - } - return true; - } - - void openRootSettings(RootInfo root) { - Metrics.logUserAction(this, Metrics.USER_ACTION_SETTINGS); - final Intent intent = new Intent(DocumentsContract.ACTION_DOCUMENT_ROOT_SETTINGS); - intent.setDataAndType(root.getUri(), DocumentsContract.Root.MIME_TYPE_ITEM); - startActivity(intent); - } - - private void createNewWindow() { - Metrics.logUserAction(this, Metrics.USER_ACTION_NEW_WINDOW); - - Intent intent = LauncherActivity.createLaunchIntent(this); - intent.putExtra(Shared.EXTRA_STACK, (Parcelable) mState.stack); - - // With new multi-window mode we have to pick how we are launched. - // By default we'd be launched in-place above the existing app. - // By setting launch-to-side ActivityManager will open us to side. - if (isInMultiWindowMode()) { - intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT); - } - - startActivity(intent); - } - - @Override - void refreshDirectory(int anim) { - final FragmentManager fm = getFragmentManager(); - final RootInfo root = getCurrentRoot(); - final DocumentInfo cwd = getCurrentDirectory(); - - assert(!mSearchManager.isSearching()); - - if (cwd == null) { - DirectoryFragment.showRecentsOpen(fm, anim); - } else { - // Normal boring directory - DirectoryFragment.showDirectory(fm, root, cwd, anim); - } - } - - @Override - public void onDocumentsPicked(List<DocumentInfo> docs) { - throw new UnsupportedOperationException(); - } - - @Override - public void onDocumentPicked(DocumentInfo doc, Model model) { - // Anything on downloads goes through the back through downloads manager - // (that's the MANAGE_DOCUMENT bit). - // This is done for two reasons: - // 1) The file in question might be a failed/queued or otherwise have some - // specialized download handling. - // 2) For APKs, the download manager will add on some important security stuff - // like origin URL. - // All other files not on downloads, event APKs, would get no benefit from this - // treatment, thusly the "isDownloads" check. - - // Launch MANAGE_DOCUMENTS only for the root level files, so it's not called for - // files in archives. Also, if the activity is already browsing a ZIP from downloads, - // then skip MANAGE_DOCUMENTS. - final boolean isViewing = Intent.ACTION_VIEW.equals(getIntent().getAction()); - final boolean isInArchive = mState.stack.size() > 1; - if (getCurrentRoot().isDownloads() && !isInArchive && !isViewing) { - // First try managing the document; we expect manager to filter - // based on authority, so we don't grant. - final Intent manage = new Intent(DocumentsContract.ACTION_MANAGE_DOCUMENT); - manage.setData(doc.derivedUri); - - try { - startActivity(manage); - return; - } catch (ActivityNotFoundException ex) { - // fall back to regular handling below. - } - } - - if (doc.isContainer()) { - openContainerDocument(doc); - } else { - openDocument(doc, model); - } - } - - @Override - public void springOpenDirectory(DocumentInfo doc) { - assert(doc.isContainer()); - assert(!doc.isArchive()); - openContainerDocument(doc); - } - - /** - * Launches an intent to view the specified document. - */ - private void openDocument(DocumentInfo doc, Model model) { - Intent intent = new QuickViewIntentBuilder( - getPackageManager(), getResources(), doc, model).build(); - - if (intent != null) { - // TODO: un-work around issue b/24963914. Should be fixed soon. - try { - startActivity(intent); - return; - } catch (SecurityException e) { - // Carry on to regular view mode. - Log.e(TAG, "Caught security error: " + e.getLocalizedMessage()); - } - } - - // Fall back to traditional VIEW action... - intent = new Intent(Intent.ACTION_VIEW); - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setData(doc.derivedUri); - - if (DEBUG && intent.getClipData() != null) { - Log.d(TAG, "Starting intent w/ clip data: " + intent.getClipData()); - } - - try { - startActivity(intent); - } catch (ActivityNotFoundException e) { - Snackbars.makeSnackbar( - this, R.string.toast_no_application, Snackbar.LENGTH_SHORT).show(); - } - } - - @Override - public boolean onKeyShortcut(int keyCode, KeyEvent event) { - DirectoryFragment dir; - // TODO: All key events should be statically bound using alphabeticShortcut. - // But not working. - switch (keyCode) { - case KeyEvent.KEYCODE_A: - dir = getDirectoryFragment(); - if (dir != null) { - dir.selectAllFiles(); - } - return true; - case KeyEvent.KEYCODE_X: - dir = getDirectoryFragment(); - if (dir != null) { - dir.cutSelectedToClipboard(); - } - return true; - case KeyEvent.KEYCODE_C: - dir = getDirectoryFragment(); - if (dir != null) { - dir.copySelectedToClipboard(); - } - return true; - case KeyEvent.KEYCODE_V: - dir = getDirectoryFragment(); - if (dir != null) { - dir.pasteFromClipboard(); - } - return true; - default: - return super.onKeyShortcut(keyCode, event); - } - } - - // Do some "do what a I want" drawer fiddling, but don't - // do it if user already hit back recently and we recently - // did some fiddling. - @Override - boolean onBeforePopDir() { - int size = mState.stack.size(); - - if (mDrawer.isPresent() - && (System.currentTimeMillis() - mDrawerLastFiddled) > DRAWER_NO_FIDDLE_DELAY) { - // Close drawer if it is open. - if (mDrawer.isOpen()) { - mDrawer.setOpen(false); - mDrawerLastFiddled = System.currentTimeMillis(); - return true; - } - - // Open the Close drawer if it is closed and we're at the top of a root. - if (size <= 1) { - mDrawer.setOpen(true); - // Remember so we don't just close it again if back is pressed again. - mDrawerLastFiddled = System.currentTimeMillis(); - return true; - } - } - - return false; - } - - // Turns out only DocumentsActivity was ever calling saveStackBlocking. - // There may be a case where we want to contribute entries from - // Behavior here in FilesActivity, but it isn't yet obvious. - // TODO: Contribute to recents, or remove this. - void writeStackToRecentsBlocking() { - final ContentResolver resolver = getContentResolver(); - final ContentValues values = new ContentValues(); - - final byte[] rawStack = DurableUtils.writeToArrayOrNull(mState.stack); - - // Remember location for next app launch - final String packageName = getCallingPackageMaybeExtra(); - values.clear(); - values.put(ResumeColumns.STACK, rawStack); - values.put(ResumeColumns.EXTERNAL, 0); - resolver.insert(RecentsProvider.buildResume(packageName), values); - } - - @Override - void onTaskFinished(Uri... uris) { - if (DEBUG) Log.d(TAG, "onFinished() " + Arrays.toString(uris)); - - final Intent intent = new Intent(); - if (uris.length == 1) { - intent.setData(uris[0]); - } else if (uris.length > 1) { - final ClipData clipData = new ClipData( - null, mState.acceptMimes, new ClipData.Item(uris[0])); - for (int i = 1; i < uris.length; i++) { - clipData.addItem(new ClipData.Item(uris[i])); - } - intent.setClipData(clipData); - } - - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION - | Intent.FLAG_GRANT_WRITE_URI_PERMISSION - | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); - - setResult(Activity.RESULT_OK, intent); - finish(); - } - - @Override - public FragmentTuner createFragmentTuner() { - return new FilesTuner(this, getDisplayState()); - } - - @Override - public MenuManager getMenuManager() { - return mMenuManager; - } - - @Override - public DirectoryDetails getDirectoryDetails() { - return mDetails; - } - - /** - * Builds a stack for the specific Uris. Multi roots are not supported, as it's impossible - * to know which root to select. Also, the stack doesn't contain intermediate directories. - * It's primarly used for opening ZIP archives from Downloads app. - */ - private static final class OpenUriForViewTask extends PairedTask<FilesActivity, Uri, Void> { - - private final State mState; - public OpenUriForViewTask(FilesActivity activity) { - super(activity); - mState = activity.mState; - } - - @Override - public Void run(Uri... params) { - final Uri uri = params[0]; - - final RootsCache rootsCache = DocumentsApplication.getRootsCache(mOwner); - final String authority = uri.getAuthority(); - - final Collection<RootInfo> roots = - rootsCache.getRootsForAuthorityBlocking(authority); - if (roots.isEmpty()) { - Log.e(TAG, "Failed to find root for the requested Uri: " + uri); - return null; - } - - final RootInfo root = roots.iterator().next(); - mState.stack.root = root; - try { - mState.stack.add(DocumentInfo.fromUri(mOwner.getContentResolver(), uri)); - } catch (FileNotFoundException e) { - Log.e(TAG, "Failed to resolve DocumentInfo from Uri: " + uri); - } - mState.stack.add(root.getRootDocumentBlocking(mOwner)); - return null; - } - - @Override - public void finish(Void result) { - mOwner.refreshCurrentRootAndDirectory(AnimationView.ANIM_NONE); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesMenuManager.java b/packages/DocumentsUI/src/com/android/documentsui/FilesMenuManager.java deleted file mode 100644 index a7e490506954..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/FilesMenuManager.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.view.Menu; -import android.view.MenuItem; - -import com.android.documentsui.model.RootInfo; - -final class FilesMenuManager extends MenuManager { - - public FilesMenuManager(SearchViewManager searchManager, State displayState) { - super(searchManager, displayState); - } - - @Override - public void updateOptionMenu(Menu menu, DirectoryDetails details) { - super.updateOptionMenu(menu, details); - - // It hides icon if searching in progress - mSearchManager.updateMenu(); - } - - @Override - void updateSettings(MenuItem settings, RootInfo root) { - settings.setVisible(true); - settings.setEnabled(root.hasSettings()); - } - - @Override - void updateEject(MenuItem eject, RootInfo root) { - eject.setVisible(true); - eject.setEnabled(root.supportsEject() && !root.ejecting); - } - - @Override - void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) { - settings.setVisible(directoryDetails.hasRootSettings()); - } - - @Override - void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) { - newWindow.setVisible(directoryDetails.shouldShowFancyFeatures()); - } - - @Override - void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) { - moveTo.setVisible(true); - moveTo.setEnabled(!selectionDetails.containsPartialFiles() && selectionDetails.canDelete()); - } - - @Override - void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) { - copyTo.setVisible(true); - copyTo.setEnabled(!selectionDetails.containsPartialFiles()); - } - - @Override - void updateSelectAll(MenuItem selectAll, SelectionDetails selectionDetails) { - selectAll.setVisible(true); - } - - @Override - void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) { - createDir.setVisible(true); - createDir.setEnabled(directoryDetails.canCreateDirectory()); - } - - @Override - void updateShare(MenuItem share, SelectionDetails selectionDetails) { - share.setVisible(!selectionDetails.containsDirectories() - && !selectionDetails.containsPartialFiles()); - } - - @Override - void updateDelete(MenuItem delete, SelectionDetails selectionDetails) { - delete.setVisible(selectionDetails.canDelete()); - } - - @Override - void updateRename(MenuItem rename, SelectionDetails selectionDetails) { - rename.setVisible(true); - rename.setEnabled(!selectionDetails.containsPartialFiles() && selectionDetails.canRename()); - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilteringCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/FilteringCursorWrapper.java deleted file mode 100644 index 7426af56ecb1..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/FilteringCursorWrapper.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.Shared.TAG; -import static com.android.documentsui.model.DocumentInfo.getCursorLong; -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.database.AbstractCursor; -import android.database.Cursor; -import android.os.Bundle; -import android.provider.DocumentsContract.Document; -import android.util.Log; - -/** - * Cursor wrapper that filters MIME types not matching given list. - */ -public class FilteringCursorWrapper extends AbstractCursor { - private final Cursor mCursor; - - private final int[] mPosition; - private int mCount; - - public FilteringCursorWrapper(Cursor cursor, String[] acceptMimes) { - this(cursor, acceptMimes, null, Long.MIN_VALUE); - } - - public FilteringCursorWrapper(Cursor cursor, String[] acceptMimes, String[] rejectMimes) { - this(cursor, acceptMimes, rejectMimes, Long.MIN_VALUE); - } - - public FilteringCursorWrapper( - Cursor cursor, String[] acceptMimes, String[] rejectMimes, long rejectBefore) { - mCursor = cursor; - - final int count = cursor.getCount(); - mPosition = new int[count]; - - cursor.moveToPosition(-1); - while (cursor.moveToNext() && mCount < count) { - final String mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - final long lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED); - if (rejectMimes != null && MimePredicate.mimeMatches(rejectMimes, mimeType)) { - continue; - } - if (lastModified < rejectBefore) { - continue; - } - if (MimePredicate.mimeMatches(acceptMimes, mimeType)) { - mPosition[mCount++] = cursor.getPosition(); - } - } - - if (DEBUG && mCount != cursor.getCount()) { - Log.d(TAG, "Before filtering " + cursor.getCount() + ", after " + mCount); - } - } - - @Override - public Bundle getExtras() { - return mCursor.getExtras(); - } - - @Override - public void close() { - super.close(); - mCursor.close(); - } - - @Override - public boolean onMove(int oldPosition, int newPosition) { - return mCursor.moveToPosition(mPosition[newPosition]); - } - - @Override - public String[] getColumnNames() { - return mCursor.getColumnNames(); - } - - @Override - public int getCount() { - return mCount; - } - - @Override - public double getDouble(int column) { - return mCursor.getDouble(column); - } - - @Override - public float getFloat(int column) { - return mCursor.getFloat(column); - } - - @Override - public int getInt(int column) { - return mCursor.getInt(column); - } - - @Override - public long getLong(int column) { - return mCursor.getLong(column); - } - - @Override - public short getShort(int column) { - return mCursor.getShort(column); - } - - @Override - public String getString(int column) { - return mCursor.getString(column); - } - - @Override - public int getType(int column) { - return mCursor.getType(column); - } - - @Override - public boolean isNull(int column) { - return mCursor.isNull(column); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/GridItemThumbnail.java b/packages/DocumentsUI/src/com/android/documentsui/GridItemThumbnail.java deleted file mode 100644 index 38d6d725c159..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/GridItemThumbnail.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.util.AttributeSet; -import android.widget.ImageView; - -/** - * Ensures that grid thumbnails are always square. - */ -public class GridItemThumbnail extends ImageView { - public GridItemThumbnail(Context context) { - super(context); - } - - public GridItemThumbnail(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public GridItemThumbnail(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - @Override - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - // Grid layout uses item width to figure out the number of columns, then dynamically fits - // rows into the view. The upshot of this is that changing the item width will mess up the - // grid layout - so to make the items square, throw out the height and use the width for - // both dimensions. The grid layout will correctly adjust the row height. - // - // Note that this code will need to be changed if the layout manager's orientation is - // changed from VERTICAL to HORIZONTAL. - super.onMeasure(widthMeasureSpec, widthMeasureSpec); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/HorizontalBreadcrumb.java b/packages/DocumentsUI/src/com/android/documentsui/HorizontalBreadcrumb.java deleted file mode 100644 index 7a08071fd76e..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/HorizontalBreadcrumb.java +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.util.AttributeSet; -import android.view.GestureDetector; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; - -import com.android.documentsui.NavigationViewManager.Breadcrumb; -import com.android.documentsui.NavigationViewManager.Environment; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.RootInfo; - -import java.util.function.Consumer; - -/** - * Horizontal implementation of breadcrumb used for tablet / desktop device layouts - */ -public final class HorizontalBreadcrumb extends RecyclerView - implements Breadcrumb, ItemDragListener.DragHost { - - private static final int USER_NO_SCROLL_OFFSET_THRESHOLD = 5; - - private LinearLayoutManager mLayoutManager; - private BreadcrumbAdapter mAdapter; - private Consumer<Integer> mListener; - - public HorizontalBreadcrumb(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public HorizontalBreadcrumb(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public HorizontalBreadcrumb(Context context) { - super(context); - } - - @Override - public void setup(Environment env, - com.android.documentsui.State state, - Consumer<Integer> listener) { - - mListener = listener; - mLayoutManager = new LinearLayoutManager( - getContext(), LinearLayoutManager.HORIZONTAL, false); - mAdapter = new BreadcrumbAdapter( - state, env, new ItemDragListener<>(this)); - - setLayoutManager(mLayoutManager); - addOnItemTouchListener(new ClickListener(getContext(), this::onSingleTapUp)); - } - - @Override - public void show(boolean visibility) { - if (visibility) { - setVisibility(VISIBLE); - boolean shouldScroll = !hasUserDefineScrollOffset(); - if (getAdapter() == null) { - setAdapter(mAdapter); - } else { - int currentItemCount = mAdapter.getItemCount(); - int lastItemCount = mAdapter.getLastItemSize(); - if (currentItemCount > lastItemCount) { - mAdapter.notifyItemRangeInserted(lastItemCount, - currentItemCount - lastItemCount); - mAdapter.notifyItemChanged(lastItemCount - 1); - } else if (currentItemCount < lastItemCount) { - mAdapter.notifyItemRangeRemoved(currentItemCount, - lastItemCount - currentItemCount); - mAdapter.notifyItemChanged(currentItemCount - 1); - } - } - if (shouldScroll) { - mLayoutManager.scrollToPosition(mAdapter.getItemCount() - 1); - } - } else { - setVisibility(GONE); - setAdapter(null); - } - mAdapter.updateLastItemSize(); - } - - private boolean hasUserDefineScrollOffset() { - final int maxOffset = computeHorizontalScrollRange() - computeHorizontalScrollExtent(); - return (maxOffset - computeHorizontalScrollOffset() > USER_NO_SCROLL_OFFSET_THRESHOLD); - } - - @Override - public void postUpdate() { - } - - @Override - public void runOnUiThread(Runnable runnable) { - post(runnable); - } - - @Override - public void setDropTargetHighlight(View v, boolean highlight) { - RecyclerView.ViewHolder vh = getChildViewHolder(v); - if (vh instanceof BreadcrumbHolder) { - ((BreadcrumbHolder) vh).setHighlighted(highlight); - } - } - - @Override - public void onViewHovered(View v) { - int pos = getChildAdapterPosition(v); - if (pos != mAdapter.getItemCount() - 1) { - mListener.accept(pos); - } - } - - private void onSingleTapUp(MotionEvent e) { - View itemView = findChildViewUnder(e.getX(), e.getY()); - int pos = getChildAdapterPosition(itemView); - if (pos != mAdapter.getItemCount() - 1) { - mListener.accept(pos); - } - } - - private static final class BreadcrumbAdapter - extends RecyclerView.Adapter<BreadcrumbHolder> { - - private final Environment mEnv; - private final com.android.documentsui.State mState; - private final OnDragListener mDragListener; - // We keep the old item size so the breadcrumb will only re-render views that are necessary - private int mLastItemSize; - - public BreadcrumbAdapter(com.android.documentsui.State state, - Environment env, - OnDragListener dragListener) { - mState = state; - mEnv = env; - mDragListener = dragListener; - mLastItemSize = mState.stack.size(); - } - - @Override - public BreadcrumbHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View v = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.navigation_breadcrumb_item, null); - return new BreadcrumbHolder(v); - } - - @Override - public void onBindViewHolder(BreadcrumbHolder holder, int position) { - final DocumentInfo doc = getItem(position); - final int horizontalPadding = (int) holder.itemView.getResources() - .getDimension(R.dimen.breadcrumb_item_padding); - - if (position == 0) { - final RootInfo root = mEnv.getCurrentRoot(); - holder.title.setText(root.title); - holder.title.setPadding(0, 0, horizontalPadding, 0); - } else { - holder.title.setText(doc.displayName); - holder.title.setPadding(horizontalPadding, 0, horizontalPadding, 0); - } - - if (position == getItemCount() - 1) { - holder.arrow.setVisibility(View.GONE); - } else { - holder.arrow.setVisibility(View.VISIBLE); - } - holder.itemView.setOnDragListener(mDragListener); - } - - private DocumentInfo getItem(int position) { - return mState.stack.get(mState.stack.size() - position - 1); - } - - @Override - public int getItemCount() { - return mState.stack.size(); - } - - public int getLastItemSize() { - return mLastItemSize; - } - - public void updateLastItemSize() { - mLastItemSize = mState.stack.size(); - } - } - - private static class BreadcrumbHolder extends RecyclerView.ViewHolder { - - protected DragOverTextView title; - protected ImageView arrow; - - public BreadcrumbHolder(View itemView) { - super(itemView); - title = (DragOverTextView) itemView.findViewById(R.id.breadcrumb_text); - arrow = (ImageView) itemView.findViewById(R.id.breadcrumb_arrow); - } - - /** - * Highlights the associated item view. - * @param highlighted - */ - public void setHighlighted(boolean highlighted) { - title.setHighlight(highlighted); - } - } - - private static final class ClickListener extends GestureDetector - implements OnItemTouchListener { - - public ClickListener(Context context, Consumer<MotionEvent> listener) { - super(context, new SimpleOnGestureListener() { - @Override - public boolean onSingleTapUp(MotionEvent e) { - listener.accept(e); - return true; - } - }); - } - - @Override - public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { - onTouchEvent(e); - return false; - } - - @Override - public void onTouchEvent(RecyclerView rv, MotionEvent e) { - onTouchEvent(e); - } - - @Override - public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java deleted file mode 100644 index 177ba0d20154..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.content.pm.PackageManager; -import android.content.pm.ProviderInfo; -import android.graphics.drawable.Drawable; -import android.provider.DocumentsContract.Document; -import android.util.TypedValue; - -public class IconUtils { - public static Drawable loadPackageIcon(Context context, String authority, int icon) { - if (icon != 0) { - if (authority != null) { - final PackageManager pm = context.getPackageManager(); - final ProviderInfo info = pm.resolveContentProvider(authority, 0); - if (info != null) { - return pm.getDrawable(info.packageName, icon, info.applicationInfo); - } - } else { - return context.getDrawable(icon); - } - } - return null; - } - - public static Drawable loadMimeIcon( - Context context, String mimeType, String authority, String docId, int mode) { - if (Document.MIME_TYPE_DIR.equals(mimeType)) { - // TODO: eventually move these hacky assets into that package - if ("com.android.providers.media.documents".equals(authority) - && docId.startsWith("album")) { - return context.getDrawable(R.drawable.ic_doc_album); - } - - if (mode == State.MODE_GRID) { - return context.getDrawable(R.drawable.ic_grid_folder); - } else { - return context.getDrawable(com.android.internal.R.drawable.ic_doc_folder); - } - } - - return loadMimeIcon(context, mimeType); - } - - public static Drawable loadMimeIcon(Context context, String mimeType) { - return context.getContentResolver().getTypeDrawable(mimeType); - } - - public static Drawable applyTintColor(Context context, int drawableId, int tintColorId) { - final Drawable icon = context.getDrawable(drawableId); - icon.mutate(); - icon.setTintList(context.getColorStateList(tintColorId)); - return icon; - } - - public static Drawable applyTintAttr(Context context, int drawableId, int tintAttrId) { - final TypedValue outValue = new TypedValue(); - context.getTheme().resolveAttribute(tintAttrId, outValue, true); - return applyTintColor(context, drawableId, outValue.resourceId); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/ItemDragListener.java b/packages/DocumentsUI/src/com/android/documentsui/ItemDragListener.java deleted file mode 100644 index 152d3a0e03e3..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/ItemDragListener.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.ClipData; -import android.graphics.drawable.Drawable; -import android.util.Log; -import android.view.DragEvent; -import android.view.View; -import android.view.View.OnDragListener; - -import com.android.documentsui.ItemDragListener.DragHost; -import com.android.internal.annotations.VisibleForTesting; - -import java.util.Timer; -import java.util.TimerTask; - -/** - * An {@link OnDragListener} that adds support for "spring loading views". Use this when you want - * items to pop-open when user hovers on them during a drag n drop. - */ -public class ItemDragListener<H extends DragHost> implements OnDragListener { - - private static final String TAG = "ItemDragListener"; - - @VisibleForTesting - static final int SPRING_TIMEOUT = 1000; - - protected final H mDragHost; - private final Timer mHoverTimer; - - public ItemDragListener(H dragHost) { - this(dragHost, new Timer()); - } - - @VisibleForTesting - protected ItemDragListener(H dragHost, Timer timer) { - mDragHost = dragHost; - mHoverTimer = timer; - } - - @Override - public boolean onDrag(final View v, DragEvent event) { - switch (event.getAction()) { - case DragEvent.ACTION_DRAG_STARTED: - return true; - case DragEvent.ACTION_DRAG_ENTERED: - handleEnteredEvent(v); - return true; - case DragEvent.ACTION_DRAG_LOCATION: - handleLocationEvent(v, event.getX(), event.getY()); - return true; - case DragEvent.ACTION_DRAG_EXITED: - case DragEvent.ACTION_DRAG_ENDED: - handleExitedEndedEvent(v); - return true; - case DragEvent.ACTION_DROP: - return handleDropEvent(v, event); - } - - return false; - } - - private void handleEnteredEvent(View v) { - mDragHost.setDropTargetHighlight(v, true); - - TimerTask task = createOpenTask(v); - assert (task != null); - v.setTag(R.id.drag_hovering_tag, task); - mHoverTimer.schedule(task, SPRING_TIMEOUT); - } - - private void handleLocationEvent(View v, float x, float y) { - Drawable background = v.getBackground(); - if (background != null) { - background.setHotspot(x, y); - } - } - - private void handleExitedEndedEvent(View v) { - mDragHost.setDropTargetHighlight(v, false); - - TimerTask task = (TimerTask) v.getTag(R.id.drag_hovering_tag); - if (task != null) { - task.cancel(); - } - } - - private boolean handleDropEvent(View v, DragEvent event) { - ClipData clipData = event.getClipData(); - if (clipData == null) { - Log.w(TAG, "Received invalid drop event with null clipdata. Ignoring."); - return false; - } - - return handleDropEventChecked(v, event); - } - - @VisibleForTesting - TimerTask createOpenTask(final View v) { - TimerTask task = new TimerTask() { - @Override - public void run() { - mDragHost.runOnUiThread(() -> { - mDragHost.onViewHovered(v); - }); - } - }; - return task; - } - - /** - * Handles a drop event. Override it if you want to do something on drop event. It's called when - * {@link DragEvent#ACTION_DROP} happens. ClipData in DragEvent is guaranteed not null. - * - * @param v The view where user drops. - * @param event the drag event. - * @return true if this event is consumed; false otherwise - */ - public boolean handleDropEventChecked(View v, DragEvent event) { - return false; // we didn't handle the drop - } - - /** - * An interface {@link ItemDragListener} uses to make some callbacks. - */ - public interface DragHost { - - /** - * Runs this runnable in main thread. - */ - void runOnUiThread(Runnable runnable); - - /** - * Highlights/unhighlights the view to visually indicate this view is being hovered. - * @param v the view being hovered - * @param highlight true if highlight the view; false if unhighlight it - */ - void setDropTargetHighlight(View v, boolean highlight); - - /** - * Notifies hovering timeout has elapsed - * @param v the view being hovered - */ - void onViewHovered(View v); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/LauncherActivity.java b/packages/DocumentsUI/src/com/android/documentsui/LauncherActivity.java deleted file mode 100644 index 5e27e78af222..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/LauncherActivity.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; - -import android.app.Activity; -import android.app.ActivityManager; -import android.app.ActivityManager.AppTask; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.support.annotation.Nullable; -import android.util.Log; - -import java.util.List; - -/** - * Provides FilesActivity task grouping support. This allows multiple FilesActivities to be - * launched (a behavior imparted by way of {@code documentLaunchMode="intoExisting"} and - * our use of pseudo document {@link Uri}s. This also lets us move an existing task - * to the foreground when a suitable task exists. - * - * Requires that {@code documentLaunchMode="intoExisting"} be set on target activity. - * - */ -public class LauncherActivity extends Activity { - - private static final String LAUNCH_CONTROL_AUTHORITY = "com.android.documentsui.launchControl"; - private static final String TAG = "LauncherActivity"; - - // Array of boolean extras that should be copied when creating new launch intents. - // Missing intents will be ignored. - private static final String[] PERSISTENT_BOOLEAN_EXTRAS = { - DocumentsContract.EXTRA_SHOW_FILESIZE, - DocumentsContract.EXTRA_SHOW_ADVANCED, - DocumentsContract.EXTRA_FANCY_FEATURES, - Shared.EXTRA_PRODUCTIVITY_MODE - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - ActivityManager activities = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); - - Intent intent = findTask(activities); - if (intent != null) { - restoreTask(intent); - } else { - startTask(); - } - - finish(); - } - - private @Nullable Intent findTask(ActivityManager activities) { - List<AppTask> tasks = activities.getAppTasks(); - for (AppTask task : tasks) { - Intent intent = task.getTaskInfo().baseIntent; - Uri uri = intent.getData(); - if (isLaunchUri(uri)) { - return intent; - } - } - return null; - } - - private void startTask() { - Intent intent = createLaunchIntent(this); - - // Forward any flags from the original intent. - intent.setFlags(getIntent().getFlags()); - if (DEBUG) Log.d(TAG, "Starting new task > " + intent.getData()); - startActivity(intent); - } - - private void restoreTask(Intent intent) { - if (DEBUG) Log.d(TAG, "Restoring existing task > " + intent.getData()); - // TODO: This doesn't appear to restore a task once it has stopped running. - startActivity(intent); - } - - static final Intent createLaunchIntent(Activity activity) { - Intent intent = new Intent(activity, FilesActivity.class); - intent.setData(buildLaunchUri()); - - // Relay any config overrides bits present in the original intent. - Intent original = activity.getIntent(); - if (original != null) { - copyExtras(original, intent); - if (original.hasExtra(Intent.EXTRA_TITLE)) { - intent.putExtra( - Intent.EXTRA_TITLE, - original.getStringExtra(Intent.EXTRA_TITLE)); - } - } - return intent; - } - - private static void copyExtras(Intent src, Intent dest) { - for (String extra : PERSISTENT_BOOLEAN_EXTRAS) { - if (src.hasExtra(extra)) { - dest.putExtra(extra, src.getBooleanExtra(extra, false)); - } - } - } - - private static Uri buildLaunchUri() { - return new Uri.Builder() - .authority(LAUNCH_CONTROL_AUTHORITY) - .fragment(String.valueOf(System.currentTimeMillis())) - .build(); - } - - static boolean isLaunchUri(@Nullable Uri uri) { - boolean result = uri != null && LAUNCH_CONTROL_AUTHORITY.equals(uri.getAuthority()); - return result; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/ListItem.java b/packages/DocumentsUI/src/com/android/documentsui/ListItem.java deleted file mode 100644 index 6d6f21ea30bd..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/ListItem.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.graphics.Rect; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.widget.LinearLayout; - -/** - * Layout for a single item in List mode. This class overrides the default focus listener in order - * to light up a focus indicator when it is focused. - */ -public class ListItem extends LinearLayout -{ - public ListItem(Context context) { - super(context); - } - - public ListItem(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { - TypedValue color = new TypedValue(); - int colorId = gainFocus ? android.R.attr.colorAccent : android.R.color.transparent; - getContext().getTheme().resolveAttribute(colorId, color, true); - - findViewById(R.id.focus_indicator).setBackgroundColor(color.data); - super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/LoadRootTask.java b/packages/DocumentsUI/src/com/android/documentsui/LoadRootTask.java deleted file mode 100644 index c5d359b1246b..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/LoadRootTask.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.net.Uri; -import android.provider.DocumentsContract; -import android.util.Log; - -import com.android.documentsui.model.RootInfo; - -final class LoadRootTask extends PairedTask<BaseActivity, Void, RootInfo> { - private static final String TAG = "RestoreRootTask"; - - private final Uri mRootUri; - - public LoadRootTask(BaseActivity activity, Uri rootUri) { - super(activity); - mRootUri = rootUri; - } - - @Override - protected RootInfo run(Void... params) { - String rootId = DocumentsContract.getRootId(mRootUri); - return mOwner.mRoots.getRootOneshot(mRootUri.getAuthority(), rootId); - } - - @Override - protected void finish(RootInfo root) { - mOwner.mState.restored = true; - - if (root != null) { - mOwner.onRootPicked(root); - } else { - Log.w(TAG, "Failed to find root: " + mRootUri); - mOwner.finish(); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java deleted file mode 100644 index d2e9885edf14..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.State.MODE_UNKNOWN; - -import android.annotation.IntDef; -import android.annotation.Nullable; -import android.content.Context; -import android.content.SharedPreferences; -import android.os.UserHandle; -import android.preference.PreferenceManager; - -import com.android.documentsui.State.ActionType; -import com.android.documentsui.State.ViewMode; -import com.android.documentsui.model.RootInfo; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -public class LocalPreferences { - private static final String KEY_FILE_SIZE = "fileSize"; - private static final String INCLUDE_DEVICE_ROOT = "includeDeviceRoot-"; - private static final String ROOT_VIEW_MODE_PREFIX = "rootViewMode-"; - - public static boolean getDisplayFileSize(Context context) { - return getPrefs(context).getBoolean(KEY_FILE_SIZE, false); - } - - public static @ViewMode int getViewMode(Context context, RootInfo root, - @ViewMode int fallback) { - return getPrefs(context).getInt(createKey(root), fallback); - } - - public static void setDisplayFileSize(Context context, boolean display) { - getPrefs(context).edit().putBoolean(KEY_FILE_SIZE, display).apply(); - } - - public static boolean getShowDeviceRoot(Context context, @ActionType int action) { - return getPrefs(context).getBoolean(INCLUDE_DEVICE_ROOT + action, false); - } - - public static void setShowDeviceRoot( - Context context, @ActionType int action, boolean display) { - getPrefs(context).edit().putBoolean(INCLUDE_DEVICE_ROOT + action, display).apply(); - } - - public static void setViewMode(Context context, RootInfo root, @ViewMode int viewMode) { - assert(viewMode != MODE_UNKNOWN); - getPrefs(context).edit().putInt(createKey(root), viewMode).apply(); - } - - private static SharedPreferences getPrefs(Context context) { - return PreferenceManager.getDefaultSharedPreferences(context); - } - - private static String createKey(RootInfo root) { - return ROOT_VIEW_MODE_PREFIX + root.authority + root.rootId; - } - - public static final int PERMISSION_ASK = 0; - public static final int PERMISSION_ASK_AGAIN = 1; - public static final int PERMISSION_NEVER_ASK = -1; - - @IntDef(flag = true, value = { - PERMISSION_ASK, - PERMISSION_ASK_AGAIN, - PERMISSION_NEVER_ASK, - }) - @Retention(RetentionPolicy.SOURCE) - public @interface PermissionStatus {} - - /** - * Methods below are used to keep track of denied user requests on scoped directory access so - * the dialog is not offered when user checked the 'Do not ask again' box - * - * <p>It uses a shared preferences, whose key is: - * <ol> - * <li>{@code USER_ID|PACKAGE_NAME|VOLUME_UUID|DIRECTORY} for storage volumes that have a UUID - * (typically physical volumes like SD cards). - * <li>{@code USER_ID|PACKAGE_NAME||DIRECTORY} for storage volumes that do not have a UUID - * (typically the emulated volume used for primary storage - * </ol> - */ - static @PermissionStatus int getScopedAccessPermissionStatus(Context context, - String packageName, @Nullable String uuid, String directory) { - final String key = getScopedAccessDenialsKey(packageName, uuid, directory); - return getPrefs(context).getInt(key, PERMISSION_ASK); - } - - static void setScopedAccessPermissionStatus(Context context, String packageName, - @Nullable String uuid, String directory, @PermissionStatus int status) { - final String key = getScopedAccessDenialsKey(packageName, uuid, directory); - getPrefs(context).edit().putInt(key, status).apply(); - } - - private static String getScopedAccessDenialsKey(String packageName, String uuid, - String directory) { - final int userId = UserHandle.myUserId(); - return uuid == null - ? userId + "|" + packageName + "||" + directory - : userId + "|" + packageName + "|" + uuid + "|" + directory; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/MenuManager.java b/packages/DocumentsUI/src/com/android/documentsui/MenuManager.java deleted file mode 100644 index a23203b955be..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/MenuManager.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.annotation.Nullable; -import android.provider.DocumentsContract.Root; -import android.view.Menu; -import android.view.MenuItem; - -import com.android.documentsui.model.RootInfo; - -public abstract class MenuManager { - - final State mState; - final SearchViewManager mSearchManager; - - public MenuManager(SearchViewManager searchManager, State displayState) { - mSearchManager = searchManager; - mState = displayState; - } - - /** @See DirectoryFragment.SelectionModeListener#updateActionMenu */ - public void updateActionMenu(Menu menu, SelectionDetails selection) { - updateOpen(menu.findItem(R.id.menu_open), selection); - updateDelete(menu.findItem(R.id.menu_delete), selection); - updateShare(menu.findItem(R.id.menu_share), selection); - updateRename(menu.findItem(R.id.menu_rename), selection); - updateSelectAll(menu.findItem(R.id.menu_select_all), selection); - updateMoveTo(menu.findItem(R.id.menu_move_to), selection); - updateCopyTo(menu.findItem(R.id.menu_copy_to), selection); - - Menus.disableHiddenItems(menu); - } - - /** @See Activity#onPrepareOptionsMenu */ - public void updateOptionMenu(Menu menu, DirectoryDetails directoryDetails) { - updateCreateDir(menu.findItem(R.id.menu_create_dir), directoryDetails); - updateSettings(menu.findItem(R.id.menu_settings), directoryDetails); - updateNewWindow(menu.findItem(R.id.menu_new_window), directoryDetails); - updateFileSize(menu.findItem(R.id.menu_file_size), directoryDetails); - updateModePicker(menu.findItem( - R.id.menu_grid), menu.findItem(R.id.menu_list), directoryDetails); - updateSort(menu.findItem(R.id.menu_sort), - menu.findItem(R.id.menu_sort_size), - directoryDetails); - updateAdvanced(menu.findItem(R.id.menu_advanced), directoryDetails); - - Menus.disableHiddenItems(menu); - } - - /** @See DirectoryFragment.onCreateContextMenu */ - public void updateContextMenu(Menu menu, - @Nullable SelectionDetails selectionDetails, - DirectoryDetails directoryDetails) { - - MenuItem cut = menu.findItem(R.id.menu_cut_to_clipboard); - MenuItem copy = menu.findItem(R.id.menu_copy_to_clipboard); - MenuItem paste = menu.findItem(R.id.menu_paste_from_clipboard); - MenuItem delete = menu.findItem(R.id.menu_delete); - MenuItem rename = menu.findItem(R.id.menu_rename); - MenuItem createDir = menu.findItem(R.id.menu_create_dir); - - if (selectionDetails == null) { - cut.setEnabled(false); - copy.setEnabled(false); - rename.setEnabled(false); - delete.setEnabled(false); - } else { - copy.setEnabled(!selectionDetails.containsPartialFiles()); - cut.setEnabled( - !selectionDetails.containsPartialFiles() && selectionDetails.canDelete()); - updateRename(rename, selectionDetails); - updateDelete(delete, selectionDetails); - } - menu.findItem(R.id.menu_paste_from_clipboard) - .setEnabled(directoryDetails.hasItemsToPaste()); - updateCreateDir(createDir, directoryDetails); - - //Cut, Copy, Paste and Delete should always be visible - cut.setVisible(true); - copy.setVisible(true); - paste.setVisible(true); - delete.setVisible(true); - } - - public void updateRootContextMenu(Menu menu, RootInfo root) { - MenuItem settings = menu.findItem(R.id.menu_settings); - MenuItem eject = menu.findItem(R.id.menu_eject_root); - - updateSettings(settings, root); - updateEject(eject, root); - } - - void updateModePicker(MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) { - grid.setVisible(mState.derivedMode != State.MODE_GRID); - list.setVisible(mState.derivedMode != State.MODE_LIST); - } - - void updateFileSize(MenuItem fileSize, DirectoryDetails directoryDetails) { - fileSize.setVisible(!mState.forceSize); - fileSize.setTitle(directoryDetails.getDisplayFileSize() - ? R.string.menu_file_size_hide : R.string.menu_file_size_show); - } - - void updateSort(MenuItem sort, MenuItem sortSize, DirectoryDetails directoryDetails) { - // Search uses backend ranking; no sorting, recents doesn't support sort. - sort.setEnabled(!directoryDetails.isInRecents() && !mSearchManager.isSearching()); - sort.setVisible(true); - sortSize.setVisible(mState.showSize); // Only sort by size when file sizes are visible - } - - void updateAdvanced(MenuItem advanced, DirectoryDetails directoryDetails) { - advanced.setVisible(mState.showAdvancedOption); - advanced.setTitle(mState.showAdvancedOption && mState.showAdvanced - ? R.string.menu_advanced_hide : R.string.menu_advanced_show); - } - - void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) { - settings.setVisible(false); - } - - void updateSettings(MenuItem settings, RootInfo root) { - settings.setVisible(false); - } - - void updateEject(MenuItem eject, RootInfo root) { - eject.setVisible(false); - } - - void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) { - newWindow.setVisible(false); - } - - void updateOpen(MenuItem open, SelectionDetails selectionDetails) { - open.setVisible(false); - } - - void updateShare(MenuItem share, SelectionDetails selectionDetails) { - share.setVisible(false); - } - - void updateDelete(MenuItem delete, SelectionDetails selectionDetails) { - delete.setVisible(false); - } - - void updateRename(MenuItem rename, SelectionDetails selectionDetails) { - rename.setVisible(false); - } - - void updateMoveTo(MenuItem moveTo, SelectionDetails selectionDetails) { - moveTo.setVisible(false); - } - - void updateCopyTo(MenuItem copyTo, SelectionDetails selectionDetails) { - copyTo.setVisible(false); - } - - abstract void updateSelectAll(MenuItem selectAll, SelectionDetails selectionDetails); - abstract void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails); - - /** - * Access to meta data about the selection. - */ - public interface SelectionDetails { - boolean containsDirectories(); - - boolean containsPartialFiles(); - - // TODO: Update these to express characteristics instead of answering concrete questions, - // since the answer to those questions is (or can be) activity specific. - boolean canDelete(); - - boolean canRename(); - } - - public static class DirectoryDetails { - private final BaseActivity mActivity; - - public DirectoryDetails(BaseActivity activity) { - mActivity = activity; - } - - public boolean shouldShowFancyFeatures() { - return Shared.shouldShowFancyFeatures(mActivity); - } - - public boolean hasRootSettings() { - return mActivity.getCurrentRoot().hasSettings(); - } - - public boolean hasItemsToPaste() { - return false; - } - - public boolean isInRecents() { - return mActivity.getCurrentDirectory() == null; - } - - public boolean canCreateDirectory() { - return mActivity.canCreateDirectory(); - } - - public boolean getDisplayFileSize() { - return LocalPreferences.getDisplayFileSize(mActivity); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/Menus.java b/packages/DocumentsUI/src/com/android/documentsui/Menus.java deleted file mode 100644 index 5277d2bb86e9..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/Menus.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.view.Menu; -import android.view.MenuItem; - -public final class Menus { - - private Menus() {} - - /** - * Disables hidden menu items so that they are not invokable via command shortcuts - */ - public static void disableHiddenItems(Menu menu, MenuItem... exclusions) { - for (int i = 0; i < menu.size(); i++) { - MenuItem item = menu.getItem(i); - if (item.isVisible()) { - continue; - } - if (contains(exclusions, item)) { - continue; - } - item.setEnabled(false); - } - } - - private static boolean contains(MenuItem[] exclusions, MenuItem item) { - for (int x = 0; x < exclusions.length; x++) { - if (exclusions[x] == item) { - return true; - } - } - return false; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/MessageBar.java b/packages/DocumentsUI/src/com/android/documentsui/MessageBar.java deleted file mode 100644 index 5c6213fdc933..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/MessageBar.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.annotation.Nullable; -import android.app.Fragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; - -/** - * A message bar displaying some info/error messages and a Dismiss button. - */ -public class MessageBar extends Fragment { - private View mView; - private ViewGroup mContainer; - - /** - * Creates an instance of a MessageBar. Note that the new MessagBar is not visible by default, - * and has to be shown by calling MessageBar.show. - */ - public static MessageBar create(FragmentManager fm) { - final MessageBar fragment = new MessageBar(); - - final FragmentTransaction ft = fm.beginTransaction(); - ft.replace(R.id.container_message_bar, fragment); - ft.commitAllowingStateLoss(); - - return fragment; - } - - /** - * Sets the info message. Can be null, in which case no info message will be displayed. The - * message bar layout will be adjusted accordingly. - */ - public void setInfo(@Nullable String info) { - View infoContainer = mView.findViewById(R.id.container_info); - if (info != null) { - TextView infoText = (TextView) mView.findViewById(R.id.textview_info); - infoText.setText(info); - infoContainer.setVisibility(View.VISIBLE); - } else { - infoContainer.setVisibility(View.GONE); - } - } - - /** - * Sets the error message. Can be null, in which case no error message will be displayed. The - * message bar layout will be adjusted accordingly. - */ - public void setError(@Nullable String error) { - View errorView = mView.findViewById(R.id.container_error); - if (error != null) { - TextView errorText = (TextView) mView.findViewById(R.id.textview_error); - errorText.setText(error); - errorView.setVisibility(View.VISIBLE); - } else { - errorView.setVisibility(View.GONE); - } - } - - @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - mView = inflater.inflate(R.layout.fragment_message_bar, container, false); - - ImageView infoIcon = (ImageView) mView.findViewById(R.id.icon_info); - infoIcon.setImageResource(R.drawable.ic_dialog_info); - - ImageView errorIcon = (ImageView) mView.findViewById(R.id.icon_error); - errorIcon.setImageResource(R.drawable.ic_dialog_alert); - - Button dismiss = (Button) mView.findViewById(R.id.button_dismiss); - dismiss.setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - hide(); - } - }); - - mContainer = container; - - return mView; - } - - public void hide() { - // The container view is used to show/hide the error bar. If a container is not provided, - // fall back to showing/hiding the error bar View, which also works, but does not provide - // the same animated transition. - if (mContainer != null) { - mContainer.setVisibility(View.GONE); - } else { - mView.setVisibility(View.GONE); - } - } - - public void show() { - // The container view is used to show/hide the error bar. If a container is not provided, - // fall back to showing/hiding the error bar View, which also works, but does not provide - // the same animated transition. - if (mContainer != null) { - mContainer.setVisibility(View.VISIBLE); - } else { - mView.setVisibility(View.VISIBLE); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java b/packages/DocumentsUI/src/com/android/documentsui/Metrics.java deleted file mode 100644 index 3c45a934eb6c..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java +++ /dev/null @@ -1,853 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static android.os.Environment.STANDARD_DIRECTORIES; -import static com.android.documentsui.Shared.DEBUG; - -import android.annotation.IntDef; -import android.annotation.Nullable; -import android.annotation.StringDef; -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ResolveInfo; -import android.net.Uri; -import android.provider.DocumentsContract; -import android.util.Log; - -import com.android.documentsui.State.ActionType; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperationService; -import com.android.documentsui.services.FileOperationService.OpType; -import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.MetricsProto.MetricsEvent; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.List; - -/** @hide */ -public final class Metrics { - private static final String TAG = "Metrics"; - - // These are the native provider authorities that the metrics code is capable of recognizing and - // explicitly counting. - private static final String AUTHORITY_MEDIA = "com.android.providers.media.documents"; - private static final String AUTHORITY_STORAGE = "com.android.externalstorage.documents"; - private static final String AUTHORITY_DOWNLOADS = "com.android.providers.downloads.documents"; - private static final String AUTHORITY_MTP = "com.android.mtp.documents"; - - // These strings have to be whitelisted in tron. Do not change them. - private static final String COUNT_LAUNCH_ACTION = "docsui_launch_action"; - private static final String COUNT_ROOT_VISITED = "docsui_root_visited"; - private static final String COUNT_OPEN_MIME = "docsui_open_mime"; - private static final String COUNT_CREATE_MIME = "docsui_create_mime"; - private static final String COUNT_GET_CONTENT_MIME = "docsui_get_content_mime"; - private static final String COUNT_BROWSE_ROOT = "docsui_browse_root"; - @Deprecated private static final String COUNT_MANAGE_ROOT = "docsui_manage_root"; - @Deprecated private static final String COUNT_MULTI_WINDOW = "docsui_multi_window"; - private static final String COUNT_FILEOP_SYSTEM = "docsui_fileop_system"; - private static final String COUNT_FILEOP_EXTERNAL = "docsui_fileop_external"; - private static final String COUNT_FILEOP_CANCELED = "docsui_fileop_canceled"; - private static final String COUNT_STARTUP_MS = "docsui_startup_ms"; - private static final String COUNT_DRAWER_OPENED = "docsui_drawer_opened"; - private static final String COUNT_USER_ACTION = "docsui_menu_action"; - - // Indices for bucketing roots in the roots histogram. "Other" is the catch-all index for any - // root that is not explicitly recognized by the Metrics code (see {@link - // #getSanitizedRootIndex}). Apps are also bucketed in this histogram. - // Do not change or rearrange these values, that will break historical data. Only add to the end - // of the list. - // Do not use negative numbers or zero; clearcut only handles positive integers. - private static final int ROOT_NONE = 1; - private static final int ROOT_OTHER = 2; - private static final int ROOT_AUDIO = 3; - private static final int ROOT_DEVICE_STORAGE = 4; - private static final int ROOT_DOWNLOADS = 5; - private static final int ROOT_HOME = 6; - private static final int ROOT_IMAGES = 7; - private static final int ROOT_RECENTS = 8; - private static final int ROOT_VIDEOS = 9; - private static final int ROOT_MTP = 10; - // Apps aren't really "roots", but they are treated as such in the roots fragment UI and so they - // are logged analogously to roots. - private static final int ROOT_THIRD_PARTY_APP = 100; - - @IntDef(flag = true, value = { - ROOT_NONE, - ROOT_OTHER, - ROOT_AUDIO, - ROOT_DEVICE_STORAGE, - ROOT_DOWNLOADS, - ROOT_HOME, - ROOT_IMAGES, - ROOT_RECENTS, - ROOT_VIDEOS, - ROOT_MTP, - ROOT_THIRD_PARTY_APP - }) - @Retention(RetentionPolicy.SOURCE) - public @interface Root {} - - // Indices for bucketing mime types. - // Do not change or rearrange these values, that will break historical data. Only add to the end - // of the list. - // Do not use negative numbers or zero; clearcut only handles positive integers. - private static final int MIME_NONE = 1; // null mime - private static final int MIME_ANY = 2; // */* - private static final int MIME_APPLICATION = 3; // application/* - private static final int MIME_AUDIO = 4; // audio/* - private static final int MIME_IMAGE = 5; // image/* - private static final int MIME_MESSAGE = 6; // message/* - private static final int MIME_MULTIPART = 7; // multipart/* - private static final int MIME_TEXT = 8; // text/* - private static final int MIME_VIDEO = 9; // video/* - private static final int MIME_OTHER = 10; // anything not enumerated below - - @IntDef(flag = true, value = { - MIME_NONE, - MIME_ANY, - MIME_APPLICATION, - MIME_AUDIO, - MIME_IMAGE, - MIME_MESSAGE, - MIME_MULTIPART, - MIME_TEXT, - MIME_VIDEO, - MIME_OTHER - }) - @Retention(RetentionPolicy.SOURCE) - public @interface Mime {} - - // Codes representing different kinds of file operations. These are used for bucketing - // operations in the COUNT_FILEOP_{SYSTEM|EXTERNAL} histograms. - // Do not change or rearrange these values, that will break historical data. Only add to the - // list. - // Do not use negative numbers or zero; clearcut only handles positive integers. - private static final int FILEOP_OTHER = 1; // any file operation not listed below - private static final int FILEOP_COPY_INTRA_PROVIDER = 2; // Copy within a provider - private static final int FILEOP_COPY_SYSTEM_PROVIDER = 3; // Copy to a system provider. - private static final int FILEOP_COPY_EXTERNAL_PROVIDER = 4; // Copy to a 3rd-party provider. - private static final int FILEOP_MOVE_INTRA_PROVIDER = 5; // Move within a provider. - private static final int FILEOP_MOVE_SYSTEM_PROVIDER = 6; // Move to a system provider. - private static final int FILEOP_MOVE_EXTERNAL_PROVIDER = 7; // Move to a 3rd-party provider. - private static final int FILEOP_DELETE = 8; - private static final int FILEOP_RENAME = 9; - private static final int FILEOP_CREATE_DIR = 10; - private static final int FILEOP_OTHER_ERROR = 100; - private static final int FILEOP_DELETE_ERROR = 101; - private static final int FILEOP_MOVE_ERROR = 102; - private static final int FILEOP_COPY_ERROR = 103; - private static final int FILEOP_RENAME_ERROR = 104; - private static final int FILEOP_CREATE_DIR_ERROR = 105; - - @IntDef(flag = true, value = { - FILEOP_OTHER, - FILEOP_COPY_INTRA_PROVIDER, - FILEOP_COPY_SYSTEM_PROVIDER, - FILEOP_COPY_EXTERNAL_PROVIDER, - FILEOP_MOVE_INTRA_PROVIDER, - FILEOP_MOVE_SYSTEM_PROVIDER, - FILEOP_MOVE_EXTERNAL_PROVIDER, - FILEOP_DELETE, - FILEOP_RENAME, - FILEOP_CREATE_DIR, - FILEOP_OTHER_ERROR, - FILEOP_COPY_ERROR, - FILEOP_MOVE_ERROR, - FILEOP_DELETE_ERROR, - FILEOP_RENAME_ERROR, - FILEOP_CREATE_DIR_ERROR - }) - @Retention(RetentionPolicy.SOURCE) - public @interface FileOp {} - - // Codes representing different kinds of file operations. These are used for bucketing - // operations in the COUNT_FILEOP_CANCELED histogram. - // Do not change or rearrange these values, that will break historical data. Only add to the - // list. - // Do not use negative numbers or zero; clearcut only handles positive integers. - private static final int OPERATION_UNKNOWN = 1; - private static final int OPERATION_COPY = 2; - private static final int OPERATION_MOVE = 3; - private static final int OPERATION_DELETE= 4; - - @IntDef(flag = true, value = { - OPERATION_UNKNOWN, - OPERATION_COPY, - OPERATION_MOVE, - OPERATION_DELETE - }) - @Retention(RetentionPolicy.SOURCE) - public @interface MetricsOpType {} - - // Codes representing different provider types. Used for sorting file operations when logging. - private static final int PROVIDER_INTRA = 0; - private static final int PROVIDER_SYSTEM = 1; - private static final int PROVIDER_EXTERNAL = 2; - - @IntDef(flag = false, value = { - PROVIDER_INTRA, - PROVIDER_SYSTEM, - PROVIDER_EXTERNAL - }) - @Retention(RetentionPolicy.SOURCE) - public @interface Provider {} - - - // Codes representing different user actions. These are used for bucketing stats in the - // COUNT_USER_ACTION histogram. - // The historgram includes action triggered from menu or invoked by keyboard shortcut. - // Do not change or rearrange these values, that will break historical data. Only add to the - // list. - // Do not use negative numbers or zero; clearcut only handles positive integers. - public static final int USER_ACTION_OTHER = 1; - public static final int USER_ACTION_GRID = 2; - public static final int USER_ACTION_LIST = 3; - public static final int USER_ACTION_SORT_NAME = 4; - public static final int USER_ACTION_SORT_DATE = 5; - public static final int USER_ACTION_SORT_SIZE = 6; - public static final int USER_ACTION_SEARCH = 7; - public static final int USER_ACTION_SHOW_SIZE = 8; - public static final int USER_ACTION_HIDE_SIZE = 9; - public static final int USER_ACTION_SETTINGS = 10; - public static final int USER_ACTION_COPY_TO = 11; - public static final int USER_ACTION_MOVE_TO = 12; - public static final int USER_ACTION_DELETE = 13; - public static final int USER_ACTION_RENAME = 14; - public static final int USER_ACTION_CREATE_DIR = 15; - public static final int USER_ACTION_SELECT_ALL = 16; - public static final int USER_ACTION_SHARE = 17; - public static final int USER_ACTION_OPEN = 18; - public static final int USER_ACTION_SHOW_ADVANCED = 19; - public static final int USER_ACTION_HIDE_ADVANCED = 20; - public static final int USER_ACTION_NEW_WINDOW = 21; - public static final int USER_ACTION_PASTE_CLIPBOARD = 22; - public static final int USER_ACTION_COPY_CLIPBOARD = 23; - public static final int USER_ACTION_DRAG_N_DROP = 24; - public static final int USER_ACTION_DRAG_N_DROP_MULTI_WINDOW = 25; - public static final int USER_ACTION_CUT_CLIPBOARD = 26; - - @IntDef(flag = false, value = { - USER_ACTION_OTHER, - USER_ACTION_GRID, - USER_ACTION_LIST, - USER_ACTION_SORT_NAME, - USER_ACTION_SORT_DATE, - USER_ACTION_SORT_SIZE, - USER_ACTION_SEARCH, - USER_ACTION_SHOW_SIZE, - USER_ACTION_HIDE_SIZE, - USER_ACTION_SETTINGS, - USER_ACTION_COPY_TO, - USER_ACTION_MOVE_TO, - USER_ACTION_DELETE, - USER_ACTION_RENAME, - USER_ACTION_CREATE_DIR, - USER_ACTION_SELECT_ALL, - USER_ACTION_SHARE, - USER_ACTION_OPEN, - USER_ACTION_SHOW_ADVANCED, - USER_ACTION_HIDE_ADVANCED, - USER_ACTION_NEW_WINDOW, - USER_ACTION_PASTE_CLIPBOARD, - USER_ACTION_COPY_CLIPBOARD, - USER_ACTION_DRAG_N_DROP, - USER_ACTION_DRAG_N_DROP_MULTI_WINDOW, - USER_ACTION_CUT_CLIPBOARD - }) - @Retention(RetentionPolicy.SOURCE) - public @interface UserAction {} - - // Codes representing different menu actions. These are used for bucketing stats in the - // COUNT_MENU_ACTION histogram. - // Do not change or rearrange these values, that will break historical data. Only add to the - // list. - // Do not use negative numbers or zero; clearcut only handles positive integers. - private static final int ACTION_OTHER = 1; - private static final int ACTION_OPEN = 2; - private static final int ACTION_CREATE = 3; - private static final int ACTION_GET_CONTENT = 4; - private static final int ACTION_OPEN_TREE = 5; - @Deprecated private static final int ACTION_MANAGE = 6; - private static final int ACTION_BROWSE = 7; - private static final int ACTION_PICK_COPY_DESTINATION = 8; - - @IntDef(flag = true, value = { - ACTION_OTHER, - ACTION_OPEN, - ACTION_CREATE, - ACTION_GET_CONTENT, - ACTION_OPEN_TREE, - ACTION_MANAGE, - ACTION_BROWSE, - ACTION_PICK_COPY_DESTINATION - }) - @Retention(RetentionPolicy.SOURCE) - public @interface MetricsAction {} - - // Codes representing different actions to open the drawer. They are used for bucketing stats in - // the COUNT_DRAWER_OPENED histogram. - // Do not change or rearrange these values, that will break historical data. Only add to the - // list. - // Do not use negative numbers or zero; clearcut only handles positive integers. - private static final int DRAWER_OPENED_HAMBURGER = 1; - private static final int DRAWER_OPENED_SWIPE = 2; - - @IntDef(flag = true, value = { - DRAWER_OPENED_HAMBURGER, - DRAWER_OPENED_SWIPE - }) - @Retention(RetentionPolicy.SOURCE) - public @interface DrawerTrigger {} - - /** - * Logs when DocumentsUI is started, and how. Call this when DocumentsUI first starts up. - * - * @param context - * @param state - * @param intent - */ - public static void logActivityLaunch(Context context, State state, Intent intent) { - // Log the launch action. - logHistogram(context, COUNT_LAUNCH_ACTION, toMetricsAction(state.action)); - // Then log auxiliary data (roots/mime types) associated with some actions. - Uri uri = intent.getData(); - switch (state.action) { - case State.ACTION_OPEN: - logHistogram(context, COUNT_OPEN_MIME, sanitizeMime(intent.getType())); - break; - case State.ACTION_CREATE: - logHistogram(context, COUNT_CREATE_MIME, sanitizeMime(intent.getType())); - break; - case State.ACTION_GET_CONTENT: - logHistogram(context, COUNT_GET_CONTENT_MIME, sanitizeMime(intent.getType())); - break; - case State.ACTION_BROWSE: - logHistogram(context, COUNT_BROWSE_ROOT, sanitizeRoot(uri)); - break; - default: - break; - } - } - - /** - * Logs a root visited event. Call this when the user visits on a root in the RootsFragment. - * - * @param context - * @param info - */ - public static void logRootVisited(Context context, RootInfo info) { - logHistogram(context, COUNT_ROOT_VISITED, sanitizeRoot(info)); - } - - /** - * Logs an app visited event. Call this when the user visits on an app in the RootsFragment. - * - * @param context - * @param info - */ - public static void logAppVisited(Context context, ResolveInfo info) { - logHistogram(context, COUNT_ROOT_VISITED, sanitizeRoot(info)); - } - - /** - * Logs a drawer opened event. Call this when the user opens drawer by swipe or by clicking the - * hamburger icon. - * @param context - * @param trigger type of action that opened the drawer - */ - public static void logDrawerOpened(Context context, @DrawerController.Trigger int trigger) { - if (trigger == DrawerController.OPENED_HAMBURGER) { - logHistogram(context, COUNT_DRAWER_OPENED, DRAWER_OPENED_HAMBURGER); - } else if (trigger == DrawerController.OPENED_SWIPE) { - logHistogram(context, COUNT_DRAWER_OPENED, DRAWER_OPENED_SWIPE); - } - } - - /** - * Logs file operation stats. Call this when a file operation has completed. The given - * DocumentInfo is only used to distinguish broad categories of actions (e.g. copying from one - * provider to another vs copying within a given provider). No PII is logged. - * - * @param context - * @param operationType - * @param srcs - * @param dst - */ - public static void logFileOperation( - Context context, - @OpType int operationType, - List<DocumentInfo> srcs, - @Nullable DocumentInfo dst) { - ProviderCounts counts = countProviders(srcs, dst); - - if (counts.intraProvider > 0) { - logIntraProviderFileOps(context, dst.authority, operationType); - } - if (counts.systemProvider > 0) { - // Log file operations on system providers. - logInterProviderFileOps(context, COUNT_FILEOP_SYSTEM, dst, operationType); - } - if (counts.externalProvider > 0) { - // Log file operations on external providers. - logInterProviderFileOps(context, COUNT_FILEOP_EXTERNAL, dst, operationType); - } - } - - /** - * Logs create directory operation. It is a part of file operation stats. We do not - * differentiate between internal and external locations, all create directory operations are - * logged under COUNT_FILEOP_SYSTEM. Call this when a create directory operation has completed. - * - * @param context - */ - public static void logCreateDirOperation(Context context) { - logHistogram(context, COUNT_FILEOP_SYSTEM, FILEOP_CREATE_DIR); - } - - /** - * Logs rename file operation. It is a part of file operation stats. We do not differentiate - * between internal and external locations, all rename operations are logged under - * COUNT_FILEOP_SYSTEM. Call this when a rename file operation has completed. - * - * @param context - */ - public static void logRenameFileOperation(Context context) { - logHistogram(context, COUNT_FILEOP_SYSTEM, FILEOP_RENAME); - } - - /** - * Logs some kind of file operation error. Call this when a file operation (e.g. copy, delete) - * fails. - * - * @param context - * @param operationType - * @param failedFiles - */ - public static void logFileOperationErrors(Context context, @OpType int operationType, - List<DocumentInfo> failedFiles) { - ProviderCounts counts = countProviders(failedFiles, null); - - @FileOp int opCode = FILEOP_OTHER_ERROR; - switch (operationType) { - case FileOperationService.OPERATION_COPY: - opCode = FILEOP_COPY_ERROR; - break; - case FileOperationService.OPERATION_DELETE: - opCode = FILEOP_DELETE_ERROR; - break; - case FileOperationService.OPERATION_MOVE: - opCode = FILEOP_MOVE_ERROR; - break; - } - if (counts.systemProvider > 0) { - logHistogram(context, COUNT_FILEOP_SYSTEM, opCode); - } - if (counts.externalProvider > 0) { - logHistogram(context, COUNT_FILEOP_EXTERNAL, opCode); - } - } - - /** - * Logs create directory operation error. We do not differentiate between internal and external - * locations, all create directory errors are logged under COUNT_FILEOP_SYSTEM. Call this when a - * create directory operation fails. - * - * @param context - */ - public static void logCreateDirError(Context context) { - logHistogram(context, COUNT_FILEOP_SYSTEM, FILEOP_CREATE_DIR_ERROR); - } - - /** - * Logs rename file operation error. We do not differentiate between internal and external - * locations, all rename errors are logged under COUNT_FILEOP_SYSTEM. Call this - * when a rename file operation fails. - * - * @param context - */ - public static void logRenameFileError(Context context) { - logHistogram(context, COUNT_FILEOP_SYSTEM, FILEOP_RENAME_ERROR); - } - - /** - * Logs the cancellation of a file operation. Call this when a Job is canceled. - * @param context - * @param operationType - */ - public static void logFileOperationCancelled(Context context, @OpType int operationType) { - logHistogram(context, COUNT_FILEOP_CANCELED, toMetricsOpType(operationType)); - } - - /** - * Logs startup time in milliseconds. - * @param context - * @param startupMs Startup time in milliseconds. - */ - public static void logStartupMs(Context context, int startupMs) { - logHistogram(context, COUNT_STARTUP_MS, startupMs); - } - - private static void logInterProviderFileOps( - Context context, - String histogram, - DocumentInfo dst, - @OpType int operationType) { - if (operationType == FileOperationService.OPERATION_DELETE) { - logHistogram(context, histogram, FILEOP_DELETE); - } else { - assert(dst != null); - @Provider int providerType = - isSystemProvider(dst.authority) ? PROVIDER_SYSTEM : PROVIDER_EXTERNAL; - logHistogram(context, histogram, getOpCode(operationType, providerType)); - } - } - - private static void logIntraProviderFileOps( - Context context, String authority, @OpType int operationType) { - // Find the right histogram to log to, then log the operation. - String histogram = isSystemProvider(authority) ? COUNT_FILEOP_SYSTEM : COUNT_FILEOP_EXTERNAL; - logHistogram(context, histogram, getOpCode(operationType, PROVIDER_INTRA)); - } - - // Types for logInvalidScopedAccessRequest - public static final String SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS = - "docsui_scoped_directory_access_invalid_args"; - public static final String SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY = - "docsui_scoped_directory_access_invalid_dir"; - public static final String SCOPED_DIRECTORY_ACCESS_ERROR = - "docsui_scoped_directory_access_error"; - - @StringDef(value = { - SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS, - SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY, - SCOPED_DIRECTORY_ACCESS_ERROR - }) - @Retention(RetentionPolicy.SOURCE) - public @interface InvalidScopedAccess{} - - public static void logInvalidScopedAccessRequest(Context context, - @InvalidScopedAccess String type) { - switch (type) { - case SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS: - case SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY: - case SCOPED_DIRECTORY_ACCESS_ERROR: - logCount(context, type); - break; - default: - Log.wtf(TAG, "invalid InvalidScopedAccess: " + type); - } - } - - // Types for logValidScopedAccessRequest - public static final int SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED = 0; - public static final int SCOPED_DIRECTORY_ACCESS_GRANTED = 1; - public static final int SCOPED_DIRECTORY_ACCESS_DENIED = 2; - public static final int SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST = 3; - public static final int SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED = 4; - - @IntDef(flag = true, value = { - SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED, - SCOPED_DIRECTORY_ACCESS_GRANTED, - SCOPED_DIRECTORY_ACCESS_DENIED, - SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST, - SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED - }) - @Retention(RetentionPolicy.SOURCE) - public @interface ScopedAccessGrant {} - - public static void logValidScopedAccessRequest(Activity activity, String directory, - @ScopedAccessGrant int type) { - int index = -1; - if (OpenExternalDirectoryActivity.DIRECTORY_ROOT.equals(directory)) { - index = -2; - } else { - for (int i = 0; i < STANDARD_DIRECTORIES.length; i++) { - if (STANDARD_DIRECTORIES[i].equals(directory)) { - index = i; - break; - } - } - } - final String packageName = activity.getCallingPackage(); - switch (type) { - case SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED: - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_PACKAGE, packageName); - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED_BY_FOLDER, index); - break; - case SCOPED_DIRECTORY_ACCESS_GRANTED: - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_PACKAGE, packageName); - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_GRANTED_BY_FOLDER, index); - break; - case SCOPED_DIRECTORY_ACCESS_DENIED: - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_PACKAGE, packageName); - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_BY_FOLDER, index); - break; - case SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST: - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_PACKAGE, packageName); - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST_BY_FOLDER, index); - break; - case SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED: - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_PACKAGE, packageName); - MetricsLogger.action(activity, MetricsEvent - .ACTION_SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED_BY_FOLDER, index); - break; - default: - Log.wtf(TAG, "invalid ScopedAccessGrant: " + type); - } - } - - /** - * Logs the action that was started by user. - * @param context - * @param userAction - */ - public static void logUserAction(Context context, @UserAction int userAction) { - logHistogram(context, COUNT_USER_ACTION, userAction); - } - - /** - * Internal method for making a MetricsLogger.count call. Increments the given counter by 1. - * - * @param context - * @param name The counter to increment. - */ - private static void logCount(Context context, String name) { - if (DEBUG) Log.d(TAG, name + ": " + 1); - MetricsLogger.count(context, name, 1); - } - - /** - * Internal method for making a MetricsLogger.histogram call. - * - * @param context - * @param name The name of the histogram. - * @param bucket The bucket to increment. - */ - private static void logHistogram(Context context, String name, @ActionType int bucket) { - if (DEBUG) Log.d(TAG, name + ": " + bucket); - MetricsLogger.histogram(context, name, bucket); - } - - /** - * Generates an integer identifying the given root. For privacy, this function only recognizes a - * small set of hard-coded roots (ones provided by the system). Other roots are all grouped into - * a single ROOT_OTHER bucket. - */ - private static @Root int sanitizeRoot(Uri uri) { - if (uri == null || uri.getAuthority() == null || LauncherActivity.isLaunchUri(uri)) { - return ROOT_NONE; - } - - switch (uri.getAuthority()) { - case AUTHORITY_MEDIA: - switch (DocumentsContract.getRootId(uri)) { - case "audio_root": - return ROOT_AUDIO; - case "images_root": - return ROOT_IMAGES; - case "videos_root": - return ROOT_VIDEOS; - default: - return ROOT_OTHER; - } - case AUTHORITY_STORAGE: - if ("home".equals(DocumentsContract.getRootId(uri))) { - return ROOT_HOME; - } else { - return ROOT_DEVICE_STORAGE; - } - case AUTHORITY_DOWNLOADS: - return ROOT_DOWNLOADS; - case AUTHORITY_MTP: - return ROOT_MTP; - default: - return ROOT_OTHER; - } - } - - /** @see #sanitizeRoot(Uri) */ - private static @Root int sanitizeRoot(RootInfo root) { - if (root.isRecents()) { - // Recents root is special and only identifiable via this method call. Other roots are - // identified by URI. - return ROOT_RECENTS; - } else { - return sanitizeRoot(root.getUri()); - } - } - - /** @see #sanitizeRoot(Uri) */ - private static @Root int sanitizeRoot(ResolveInfo info) { - // Log all apps under a single bucket in the roots histogram. - return ROOT_THIRD_PARTY_APP; - } - - /** - * Generates an int identifying a mime type. For privacy, this function only recognizes a small - * set of hard-coded types. For any other type, this function returns "other". - * - * @param mimeType - * @return - */ - private static @Mime int sanitizeMime(String mimeType) { - if (mimeType == null) { - return MIME_NONE; - } else if ("*/*".equals(mimeType)) { - return MIME_ANY; - } else { - String type = mimeType.substring(0, mimeType.indexOf('/')); - switch (type) { - case "application": - return MIME_APPLICATION; - case "audio": - return MIME_AUDIO; - case "image": - return MIME_IMAGE; - case "message": - return MIME_MESSAGE; - case "multipart": - return MIME_MULTIPART; - case "text": - return MIME_TEXT; - case "video": - return MIME_VIDEO; - } - } - // Bucket all other types into one bucket. - return MIME_OTHER; - } - - private static boolean isSystemProvider(String authority) { - switch (authority) { - case AUTHORITY_MEDIA: - case AUTHORITY_STORAGE: - case AUTHORITY_DOWNLOADS: - return true; - default: - return false; - } - } - - /** - * @param operation - * @param providerType - * @return An opcode, suitable for use as histogram bucket, for the given operation/provider - * combination. - */ - private static @FileOp int getOpCode(@OpType int operation, @Provider int providerType) { - switch (operation) { - case FileOperationService.OPERATION_COPY: - switch (providerType) { - case PROVIDER_INTRA: - return FILEOP_COPY_INTRA_PROVIDER; - case PROVIDER_SYSTEM: - return FILEOP_COPY_SYSTEM_PROVIDER; - case PROVIDER_EXTERNAL: - return FILEOP_COPY_EXTERNAL_PROVIDER; - } - case FileOperationService.OPERATION_MOVE: - switch (providerType) { - case PROVIDER_INTRA: - return FILEOP_MOVE_INTRA_PROVIDER; - case PROVIDER_SYSTEM: - return FILEOP_MOVE_SYSTEM_PROVIDER; - case PROVIDER_EXTERNAL: - return FILEOP_MOVE_EXTERNAL_PROVIDER; - } - case FileOperationService.OPERATION_DELETE: - return FILEOP_DELETE; - default: - Log.w(TAG, "Unrecognized operation type when logging a file operation"); - return FILEOP_OTHER; - } - } - - /** - * Maps FileOperationService OpType values, to MetricsOpType values. - */ - private static @MetricsOpType int toMetricsOpType(@OpType int operation) { - switch (operation) { - case FileOperationService.OPERATION_COPY: - return OPERATION_COPY; - case FileOperationService.OPERATION_MOVE: - return OPERATION_MOVE; - case FileOperationService.OPERATION_DELETE: - return OPERATION_DELETE; - case FileOperationService.OPERATION_UNKNOWN: - default: - return OPERATION_UNKNOWN; - } - } - - private static @MetricsAction int toMetricsAction(int action) { - switch(action) { - case State.ACTION_OPEN: - return ACTION_OPEN; - case State.ACTION_CREATE: - return ACTION_CREATE; - case State.ACTION_GET_CONTENT: - return ACTION_GET_CONTENT; - case State.ACTION_OPEN_TREE: - return ACTION_OPEN_TREE; - case State.ACTION_BROWSE: - return ACTION_BROWSE; - case State.ACTION_PICK_COPY_DESTINATION: - return ACTION_PICK_COPY_DESTINATION; - default: - return ACTION_OTHER; - } - } - - /** - * Count the given src documents and provide a tally of how many come from the same provider as - * the dst document (if a dst is provided), how many come from system providers, and how many - * come from external 3rd-party providers. - */ - private static ProviderCounts countProviders( - List<DocumentInfo> srcs, @Nullable DocumentInfo dst) { - ProviderCounts counts = new ProviderCounts(); - for (DocumentInfo doc: srcs) { - if (dst != null && doc.authority.equals(dst.authority)) { - counts.intraProvider++; - } else if (isSystemProvider(doc.authority)){ - counts.systemProvider++; - } else { - counts.externalProvider++; - } - } - return counts; - } - - private static class ProviderCounts { - int intraProvider; - int systemProvider; - int externalProvider; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java deleted file mode 100644 index 859763b833f0..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.annotation.Nullable; -import android.provider.DocumentsContract.Document; - -import com.android.documentsui.model.DocumentInfo; -import com.android.internal.util.Predicate; - -public class MimePredicate implements Predicate<DocumentInfo> { - private final String[] mFilters; - - private static final String APK_TYPE = "application/vnd.android.package-archive"; - /** - * MIME types that are visual in nature. For example, they should always be - * shown as thumbnails in list mode. - */ - public static final String[] VISUAL_MIMES = new String[] { "image/*", "video/*" }; - - public MimePredicate(String[] filters) { - mFilters = filters; - } - - @Override - public boolean apply(DocumentInfo doc) { - if (doc.isDirectory()) { - return true; - } - if (mimeMatches(mFilters, doc.mimeType)) { - return true; - } - return false; - } - - public static boolean mimeMatches(String[] filters, String[] tests) { - if (tests == null) { - return false; - } - for (String test : tests) { - if (mimeMatches(filters, test)) { - return true; - } - } - return false; - } - - public static boolean mimeMatches(String filter, String[] tests) { - if (tests == null) { - return true; - } - for (String test : tests) { - if (mimeMatches(filter, test)) { - return true; - } - } - return false; - } - - public static boolean mimeMatches(String[] filters, String test) { - if (filters == null) { - return true; - } - for (String filter : filters) { - if (mimeMatches(filter, test)) { - return true; - } - } - return false; - } - - public static boolean mimeMatches(String filter, String test) { - if (test == null) { - return false; - } else if (filter == null || "*/*".equals(filter)) { - return true; - } else if (filter.equals(test)) { - return true; - } else if (filter.endsWith("/*")) { - return filter.regionMatches(0, test, 0, filter.indexOf('/')); - } else { - return false; - } - } - - public static boolean isApkType(@Nullable String mimeType) { - return APK_TYPE.equals(mimeType); - } - - public static boolean isDirectoryType(@Nullable String mimeType) { - return Document.MIME_TYPE_DIR.equals(mimeType); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/NavigationViewManager.java b/packages/DocumentsUI/src/com/android/documentsui/NavigationViewManager.java deleted file mode 100644 index 25542461748a..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/NavigationViewManager.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; - -import android.annotation.Nullable; -import android.graphics.drawable.Drawable; -import android.util.Log; -import android.view.View; - -import com.android.documentsui.dirlist.AnimationView; -import com.android.documentsui.model.RootInfo; - -import java.util.function.Consumer; - -/** - * A facade over the portions of the app and drawer toolbars. - */ -public class NavigationViewManager { - - private static final String TAG = "NavigationViewManager"; - - final DrawerController mDrawer; - final DocumentsToolbar mToolbar; - final State mState; - final NavigationViewManager.Environment mEnv; - final Breadcrumb mBreadcrumb; - - public NavigationViewManager( - DrawerController drawer, - DocumentsToolbar toolbar, - State state, - NavigationViewManager.Environment env, - Breadcrumb breadcrumb) { - - mToolbar = toolbar; - mDrawer = drawer; - mState = state; - mEnv = env; - mBreadcrumb = breadcrumb; - mBreadcrumb.setup(env, state, this::onNavigationItemSelected); - - mToolbar.setNavigationOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - onNavigationIconClicked(); - } - }); - } - - private void onNavigationIconClicked() { - if (mDrawer.isPresent()) { - mDrawer.setOpen(true, DrawerController.OPENED_HAMBURGER); - } - } - - void onNavigationItemSelected(int position) { - boolean changed = false; - while (mState.stack.size() > position + 1) { - changed = true; - mState.popDocument(); - } - if (changed) { - mEnv.refreshCurrentRootAndDirectory(AnimationView.ANIM_LEAVE); - } - } - - void update() { - - // TODO: Looks to me like this block is never getting hit. - if (mEnv.isSearchExpanded()) { - mToolbar.setTitle(null); - mBreadcrumb.show(false); - return; - } - - mDrawer.setTitle(mEnv.getDrawerTitle()); - - mToolbar.setNavigationIcon(getActionBarIcon()); - mToolbar.setNavigationContentDescription(R.string.drawer_open); - - if (mState.stack.size() <= 1) { - mBreadcrumb.show(false); - String title = mEnv.getCurrentRoot().title; - if (DEBUG) Log.d(TAG, "New toolbar title is: " + title); - mToolbar.setTitle(title); - } else { - mBreadcrumb.show(true); - mToolbar.setTitle(null); - mBreadcrumb.postUpdate(); - } - - if (DEBUG) Log.d(TAG, "Final toolbar title is: " + mToolbar.getTitle()); - } - - // Hamburger if drawer is present, else sad nullness. - private @Nullable Drawable getActionBarIcon() { - if (mDrawer.isPresent()) { - return mToolbar.getContext().getDrawable(R.drawable.ic_hamburger); - } else { - return null; - } - } - - void revealRootsDrawer(boolean open) { - mDrawer.setOpen(open); - } - - interface Breadcrumb { - void setup(Environment env, State state, Consumer<Integer> listener); - void show(boolean visibility); - void postUpdate(); - } - - interface Environment { - RootInfo getCurrentRoot(); - String getDrawerTitle(); - void refreshCurrentRootAndDirectory(int animation); - boolean isSearchExpanded(); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java b/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java deleted file mode 100644 index 6588ee1c91c6..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/OpenExternalDirectoryActivity.java +++ /dev/null @@ -1,512 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static android.os.Environment.isStandardDirectory; -import static android.os.Environment.STANDARD_DIRECTORIES; -import static android.os.storage.StorageVolume.EXTRA_DIRECTORY_NAME; -import static android.os.storage.StorageVolume.EXTRA_STORAGE_VOLUME; - -import static com.android.documentsui.LocalPreferences.getScopedAccessPermissionStatus; -import static com.android.documentsui.LocalPreferences.PERMISSION_ASK; -import static com.android.documentsui.LocalPreferences.PERMISSION_ASK_AGAIN; -import static com.android.documentsui.LocalPreferences.PERMISSION_NEVER_ASK; -import static com.android.documentsui.LocalPreferences.setScopedAccessPermissionStatus; -import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED; -import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED; -import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_DENIED; -import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST; -import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_ERROR; -import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_GRANTED; -import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS; -import static com.android.documentsui.Metrics.SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY; -import static com.android.documentsui.Metrics.logInvalidScopedAccessRequest; -import static com.android.documentsui.Metrics.logValidScopedAccessRequest; -import static com.android.documentsui.Shared.DEBUG; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.ActivityManager; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.content.ContentProviderClient; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.Intent; -import android.content.UriPermission; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.net.Uri; -import android.os.Bundle; -import android.os.Parcelable; -import android.os.RemoteException; -import android.os.UserHandle; -import android.os.storage.StorageManager; -import android.os.storage.StorageVolume; -import android.os.storage.VolumeInfo; -import android.provider.DocumentsContract; -import android.text.TextUtils; -import android.util.Log; -import android.view.View; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.TextView; - -import java.io.File; -import java.io.IOException; -import java.util.List; - -/** - * Activity responsible for handling {@link Intent#ACTION_OPEN_EXTERNAL_DOCUMENT}. - */ -public class OpenExternalDirectoryActivity extends Activity { - private static final String TAG = "OpenExternalDirectory"; - private static final String FM_TAG = "open_external_directory"; - private static final String EXTERNAL_STORAGE_AUTH = "com.android.externalstorage.documents"; - private static final String EXTRA_FILE = "com.android.documentsui.FILE"; - private static final String EXTRA_APP_LABEL = "com.android.documentsui.APP_LABEL"; - private static final String EXTRA_VOLUME_LABEL = "com.android.documentsui.VOLUME_LABEL"; - private static final String EXTRA_VOLUME_UUID = "com.android.documentsui.VOLUME_UUID"; - private static final String EXTRA_IS_ROOT = "com.android.documentsui.IS_ROOT"; - private static final String EXTRA_IS_PRIMARY = "com.android.documentsui.IS_PRIMARY"; - // Special directory name representing the full volume - static final String DIRECTORY_ROOT = "ROOT_DIRECTORY"; - - private ContentProviderClient mExternalStorageClient; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (savedInstanceState != null) { - if (DEBUG) Log.d(TAG, "activity.onCreateDialog(): reusing instance"); - return; - } - - final Intent intent = getIntent(); - if (intent == null) { - if (DEBUG) Log.d(TAG, "missing intent"); - logInvalidScopedAccessRequest(this, SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS); - setResult(RESULT_CANCELED); - finish(); - return; - } - final Parcelable storageVolume = intent.getParcelableExtra(EXTRA_STORAGE_VOLUME); - if (!(storageVolume instanceof StorageVolume)) { - if (DEBUG) - Log.d(TAG, "extra " + EXTRA_STORAGE_VOLUME + " is not a StorageVolume: " - + storageVolume); - logInvalidScopedAccessRequest(this, SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS); - setResult(RESULT_CANCELED); - finish(); - return; - } - String directoryName = intent.getStringExtra(EXTRA_DIRECTORY_NAME ); - if (directoryName == null) { - directoryName = DIRECTORY_ROOT; - } - final StorageVolume volume = (StorageVolume) storageVolume; - if (getScopedAccessPermissionStatus(getApplicationContext(), getCallingPackage(), - volume.getUuid(), directoryName) == PERMISSION_NEVER_ASK) { - logValidScopedAccessRequest(this, directoryName, - SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED); - setResult(RESULT_CANCELED); - finish(); - return; - } - - final int userId = UserHandle.myUserId(); - if (!showFragment(this, userId, volume, directoryName)) { - setResult(RESULT_CANCELED); - finish(); - return; - } - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (mExternalStorageClient != null) { - mExternalStorageClient.close(); - } - } - - /** - * Validates the given path (volume + directory) and display the appropriate dialog asking the - * user to grant access to it. - */ - private static boolean showFragment(OpenExternalDirectoryActivity activity, int userId, - StorageVolume storageVolume, String directoryName) { - if (DEBUG) - Log.d(TAG, "showFragment() for volume " + storageVolume.dump() + ", directory " - + directoryName + ", and user " + userId); - final boolean isRoot = directoryName.equals(DIRECTORY_ROOT); - final boolean isPrimary = storageVolume.isPrimary(); - - if (isRoot && isPrimary) { - if (DEBUG) Log.d(TAG, "root access requested on primary volume"); - return false; - } - - final File volumeRoot = storageVolume.getPathFile(); - File file; - try { - file = isRoot ? volumeRoot : new File(volumeRoot, directoryName).getCanonicalFile(); - } catch (IOException e) { - Log.e(TAG, "Could not get canonical file for volume " + storageVolume.dump() - + " and directory " + directoryName); - logInvalidScopedAccessRequest(activity, SCOPED_DIRECTORY_ACCESS_ERROR); - return false; - } - final StorageManager sm = - (StorageManager) activity.getSystemService(Context.STORAGE_SERVICE); - - final String root, directory; - if (isRoot) { - root = volumeRoot.getAbsolutePath(); - directory = "."; - } else { - root = file.getParent(); - directory = file.getName(); - // Verify directory is valid. - if (TextUtils.isEmpty(directory) || !isStandardDirectory(directory)) { - if (DEBUG) - Log.d(TAG, "Directory '" + directory + "' is not standard (full path: '" - + file.getAbsolutePath() + "')"); - logInvalidScopedAccessRequest(activity, SCOPED_DIRECTORY_ACCESS_INVALID_DIRECTORY); - return false; - } - } - - // Gets volume label and converted path. - String volumeLabel = null; - String volumeUuid = null; - final List<VolumeInfo> volumes = sm.getVolumes(); - if (DEBUG) Log.d(TAG, "Number of volumes: " + volumes.size()); - File internalRoot = null; - boolean found = true; - for (VolumeInfo volume : volumes) { - if (isRightVolume(volume, root, userId)) { - found = true; - internalRoot = volume.getInternalPathForUser(userId); - // Must convert path before calling getDocIdForFileCreateNewDir() - if (DEBUG) Log.d(TAG, "Converting " + root + " to " + internalRoot); - file = isRoot ? internalRoot : new File(internalRoot, directory); - volumeUuid = storageVolume.getUuid(); - volumeLabel = sm.getBestVolumeDescription(volume); - if (TextUtils.isEmpty(volumeLabel)) { - volumeLabel = storageVolume.getDescription(activity); - } - if (TextUtils.isEmpty(volumeLabel)) { - volumeLabel = activity.getString(android.R.string.unknownName); - Log.w(TAG, "No volume description for " + volume + "; using " + volumeLabel); - } - break; - } - } - if (internalRoot == null) { - // Should not happen on normal circumstances, unless app crafted an invalid volume - // using reflection or the list of mounted volumes changed. - Log.e(TAG, "Didn't find right volume for '" + storageVolume.dump() + "' on " + volumes); - return false; - } - - // Checks if the user has granted the permission already. - final Intent intent = getIntentForExistingPermission(activity, isRoot, internalRoot, file); - if (intent != null) { - logValidScopedAccessRequest(activity, directory, - SCOPED_DIRECTORY_ACCESS_ALREADY_GRANTED); - activity.setResult(RESULT_OK, intent); - activity.finish(); - return true; - } - - if (!found) { - Log.e(TAG, "Could not get volume for " + file); - logInvalidScopedAccessRequest(activity, SCOPED_DIRECTORY_ACCESS_ERROR); - return false; - } - - // Gets the package label. - final String appLabel = getAppLabel(activity); - if (appLabel == null) { - // Error already logged. - return false; - } - - // Sets args that will be retrieve on onCreate() - final Bundle args = new Bundle(); - args.putString(EXTRA_FILE, file.getAbsolutePath()); - args.putString(EXTRA_VOLUME_LABEL, volumeLabel); - args.putString(EXTRA_VOLUME_UUID, volumeUuid); - args.putString(EXTRA_APP_LABEL, appLabel); - args.putBoolean(EXTRA_IS_ROOT, isRoot); - args.putBoolean(EXTRA_IS_PRIMARY, isPrimary); - - final FragmentManager fm = activity.getFragmentManager(); - final FragmentTransaction ft = fm.beginTransaction(); - final OpenExternalDirectoryDialogFragment fragment = - new OpenExternalDirectoryDialogFragment(); - fragment.setArguments(args); - ft.add(fragment, FM_TAG); - ft.commitAllowingStateLoss(); - - return true; - } - - private static String getAppLabel(Activity activity) { - final String packageName = activity.getCallingPackage(); - final PackageManager pm = activity.getPackageManager(); - try { - return pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0)).toString(); - } catch (NameNotFoundException e) { - logInvalidScopedAccessRequest(activity, SCOPED_DIRECTORY_ACCESS_ERROR); - Log.w(TAG, "Could not get label for package " + packageName); - return null; - } - } - - private static boolean isRightVolume(VolumeInfo volume, String root, int userId) { - final File userPath = volume.getPathForUser(userId); - final String path = userPath == null ? null : volume.getPathForUser(userId).getPath(); - final boolean isMounted = volume.isMountedReadable(); - if (DEBUG) - Log.d(TAG, "Volume: " + volume - + "\n\tuserId: " + userId - + "\n\tuserPath: " + userPath - + "\n\troot: " + root - + "\n\tpath: " + path - + "\n\tisMounted: " + isMounted); - - return isMounted && root.equals(path); - } - - private static Uri getGrantedUriPermission(Context context, ContentProviderClient provider, - File file) { - // Calls ExternalStorageProvider to get the doc id for the file - final Bundle bundle; - try { - bundle = provider.call("getDocIdForFileCreateNewDir", file.getPath(), null); - } catch (RemoteException e) { - Log.e(TAG, "Did not get doc id from External Storage provider for " + file, e); - logInvalidScopedAccessRequest(context, SCOPED_DIRECTORY_ACCESS_ERROR); - return null; - } - final String docId = bundle == null ? null : bundle.getString("DOC_ID"); - if (docId == null) { - Log.e(TAG, "Did not get doc id from External Storage provider for " + file); - logInvalidScopedAccessRequest(context, SCOPED_DIRECTORY_ACCESS_ERROR); - return null; - } - if (DEBUG) Log.d(TAG, "doc id for " + file + ": " + docId); - - final Uri uri = DocumentsContract.buildTreeDocumentUri(EXTERNAL_STORAGE_AUTH, docId); - if (uri == null) { - Log.e(TAG, "Could not get URI for doc id " + docId); - return null; - } - if (DEBUG) Log.d(TAG, "URI for " + file + ": " + uri); - return uri; - } - - private static Intent createGrantedUriPermissionsIntent(Context context, - ContentProviderClient provider, File file) { - final Uri uri = getGrantedUriPermission(context, provider, file); - return createGrantedUriPermissionsIntent(uri); - } - - private static Intent createGrantedUriPermissionsIntent(Uri uri) { - final Intent intent = new Intent(); - intent.setData(uri); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION - | Intent.FLAG_GRANT_WRITE_URI_PERMISSION - | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION - | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); - return intent; - } - - private static Intent getIntentForExistingPermission(OpenExternalDirectoryActivity activity, - boolean isRoot, File root, File file) { - final String packageName = activity.getCallingPackage(); - final ContentProviderClient storageClient = activity.getExternalStorageClient(); - final Uri grantedUri = getGrantedUriPermission(activity, storageClient, file); - final Uri rootUri = root.equals(file) ? grantedUri - : getGrantedUriPermission(activity, storageClient, root); - - if (DEBUG) - Log.d(TAG, "checking if " + packageName + " already has permission for " + grantedUri - + " or its root (" + rootUri + ")"); - final ActivityManager am = - (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); - for (UriPermission uriPermission : am.getGrantedUriPermissions(packageName).getList()) { - final Uri uri = uriPermission.getUri(); - if (uri == null) { - Log.w(TAG, "null URI for " + uriPermission); - continue; - } - if (uri.equals(grantedUri) || uri.equals(rootUri)) { - if (DEBUG) Log.d(TAG, packageName + " already has permission: " + uriPermission); - return createGrantedUriPermissionsIntent(grantedUri); - } - } - if (DEBUG) Log.d(TAG, packageName + " does not have permission for " + grantedUri); - return null; - } - - public static class OpenExternalDirectoryDialogFragment extends DialogFragment { - - private File mFile; - private String mVolumeUuid; - private String mVolumeLabel; - private String mAppLabel; - private boolean mIsRoot; - private boolean mIsPrimary; - private CheckBox mDontAskAgain; - private OpenExternalDirectoryActivity mActivity; - private AlertDialog mDialog; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setRetainInstance(true); - final Bundle args = getArguments(); - if (args != null) { - mFile = new File(args.getString(EXTRA_FILE)); - mVolumeUuid = args.getString(EXTRA_VOLUME_UUID); - mVolumeLabel = args.getString(EXTRA_VOLUME_LABEL); - mAppLabel = args.getString(EXTRA_APP_LABEL); - mIsRoot = args.getBoolean(EXTRA_IS_ROOT); - mIsPrimary= args.getBoolean(EXTRA_IS_PRIMARY); - } - mActivity = (OpenExternalDirectoryActivity) getActivity(); - } - - @Override - public void onDestroyView() { - // Workaround for https://code.google.com/p/android/issues/detail?id=17423 - if (mDialog != null && getRetainInstance()) { - mDialog.setDismissMessage(null); - } - super.onDestroyView(); - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - if (mDialog != null) { - if (DEBUG) Log.d(TAG, "fragment.onCreateDialog(): reusing dialog"); - return mDialog; - } - if (mActivity != getActivity()) { - // Sanity check. - Log.wtf(TAG, "activity references don't match on onCreateDialog(): mActivity = " - + mActivity + " , getActivity() = " + getActivity()); - mActivity = (OpenExternalDirectoryActivity) getActivity(); - } - final String directory = mFile.getName(); - final String directoryName = mIsRoot ? DIRECTORY_ROOT : directory; - final Context context = mActivity.getApplicationContext(); - final OnClickListener listener = new OnClickListener() { - - @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = null; - if (which == DialogInterface.BUTTON_POSITIVE) { - intent = createGrantedUriPermissionsIntent(mActivity, - mActivity.getExternalStorageClient(), mFile); - } - if (which == DialogInterface.BUTTON_NEGATIVE || intent == null) { - logValidScopedAccessRequest(mActivity, directoryName, - SCOPED_DIRECTORY_ACCESS_DENIED); - final boolean checked = mDontAskAgain.isChecked(); - if (checked) { - logValidScopedAccessRequest(mActivity, directory, - SCOPED_DIRECTORY_ACCESS_DENIED_AND_PERSIST); - setScopedAccessPermissionStatus(context, mActivity.getCallingPackage(), - mVolumeUuid, directoryName, PERMISSION_NEVER_ASK); - } else { - setScopedAccessPermissionStatus(context, mActivity.getCallingPackage(), - mVolumeUuid, directoryName, PERMISSION_ASK_AGAIN); - } - mActivity.setResult(RESULT_CANCELED); - } else { - logValidScopedAccessRequest(mActivity, directory, - SCOPED_DIRECTORY_ACCESS_GRANTED); - mActivity.setResult(RESULT_OK, intent); - } - mActivity.finish(); - } - }; - - @SuppressLint("InflateParams") - // It's ok pass null ViewRoot on AlertDialogs. - final View view = View.inflate(mActivity, R.layout.dialog_open_scoped_directory, null); - final CharSequence message; - if (mIsRoot) { - message = TextUtils.expandTemplate(getText( - R.string.open_external_dialog_root_request), mAppLabel, mVolumeLabel); - } else { - message = TextUtils.expandTemplate( - getText(mIsPrimary ? R.string.open_external_dialog_request_primary_volume - : R.string.open_external_dialog_request), - mAppLabel, directory, mVolumeLabel); - } - final TextView messageField = (TextView) view.findViewById(R.id.message); - messageField.setText(message); - mDialog = new AlertDialog.Builder(mActivity, R.style.Theme_AppCompat_Light_Dialog_Alert) - .setView(view) - .setPositiveButton(R.string.allow, listener) - .setNegativeButton(R.string.deny, listener) - .create(); - - mDontAskAgain = (CheckBox) view.findViewById(R.id.do_not_ask_checkbox); - if (getScopedAccessPermissionStatus(context, mActivity.getCallingPackage(), - mVolumeUuid, directoryName) == PERMISSION_ASK_AGAIN) { - mDontAskAgain.setVisibility(View.VISIBLE); - mDontAskAgain.setOnCheckedChangeListener(new OnCheckedChangeListener() { - - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(!isChecked); - } - }); - } - - return mDialog; - } - - @Override - public void onCancel(DialogInterface dialog) { - super.onCancel(dialog); - final Activity activity = getActivity(); - logValidScopedAccessRequest(activity, mFile.getName(), SCOPED_DIRECTORY_ACCESS_DENIED); - activity.setResult(RESULT_CANCELED); - activity.finish(); - } - } - - private synchronized ContentProviderClient getExternalStorageClient() { - if (mExternalStorageClient == null) { - mExternalStorageClient = - getContentResolver().acquireContentProviderClient(EXTERNAL_STORAGE_AUTH); - } - return mExternalStorageClient; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/OperationDialogFragment.java b/packages/DocumentsUI/src/com/android/documentsui/OperationDialogFragment.java deleted file mode 100644 index 140baad0383c..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/OperationDialogFragment.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.annotation.IntDef; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.content.DialogInterface; -import android.os.Bundle; -import android.text.Html; - -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.services.FileOperationService; -import com.android.documentsui.services.FileOperationService.OpType; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; - -/** - * Alert dialog for operation dialogs. - */ -public class OperationDialogFragment extends DialogFragment { - - public static final int DIALOG_TYPE_UNKNOWN = 0; - public static final int DIALOG_TYPE_FAILURE = 1; - public static final int DIALOG_TYPE_CONVERTED = 2; - - @IntDef(flag = true, value = { - DIALOG_TYPE_UNKNOWN, - DIALOG_TYPE_FAILURE, - DIALOG_TYPE_CONVERTED - }) - - @Retention(RetentionPolicy.SOURCE) - public @interface DialogType {} - - private static final String TAG = "OperationDialogFragment"; - - public static void show(FragmentManager fm, @DialogType int dialogType, - ArrayList<DocumentInfo> failedSrcList, DocumentStack dstStack, - @OpType int operationType) { - final Bundle args = new Bundle(); - args.putInt(FileOperationService.EXTRA_DIALOG_TYPE, dialogType); - args.putInt(FileOperationService.EXTRA_OPERATION_TYPE, operationType); - args.putParcelableArrayList(FileOperationService.EXTRA_SRC_LIST, failedSrcList); - - final FragmentTransaction ft = fm.beginTransaction(); - final OperationDialogFragment fragment = new OperationDialogFragment(); - fragment.setArguments(args); - - ft.add(fragment, TAG); - ft.commitAllowingStateLoss(); - } - - @Override - public Dialog onCreateDialog(Bundle inState) { - super.onCreate(inState); - - final @DialogType int dialogType = - getArguments().getInt(FileOperationService.EXTRA_DIALOG_TYPE); - final @OpType int operationType = - getArguments().getInt(FileOperationService.EXTRA_OPERATION_TYPE); - final ArrayList<DocumentInfo> srcList = getArguments().getParcelableArrayList( - FileOperationService.EXTRA_SRC_LIST); - - final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - String messageFormat; - - switch (dialogType) { - case DIALOG_TYPE_CONVERTED: - messageFormat = getString(R.string.copy_converted_warning_content); - break; - - case DIALOG_TYPE_FAILURE: - switch (operationType) { - case FileOperationService.OPERATION_COPY: - messageFormat = getString(R.string.copy_failure_alert_content); - break; - case FileOperationService.OPERATION_DELETE: - messageFormat = getString(R.string.delete_failure_alert_content); - break; - case FileOperationService.OPERATION_MOVE: - messageFormat = getString(R.string.move_failure_alert_content); - break; - default: - throw new UnsupportedOperationException(); - } - break; - - default: - throw new UnsupportedOperationException(); - } - - final StringBuilder list = new StringBuilder("<p>"); - for (DocumentInfo documentInfo : srcList) { - list.append(String.format("• %s<br>", Html.escapeHtml(documentInfo.displayName))); - } - list.append("</p>"); - builder.setMessage(Html.fromHtml(String.format(messageFormat, list.toString()))); - builder.setPositiveButton( - R.string.close, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - } - }); - - return builder.create(); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java b/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java deleted file mode 100644 index aef63afcbcd7..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.BroadcastReceiver; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; - -/** - * Clean up {@link RecentsProvider} when packages are removed. - */ -public class PackageReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - final ContentResolver resolver = context.getContentResolver(); - - final String action = intent.getAction(); - if (Intent.ACTION_PACKAGE_FULLY_REMOVED.equals(action)) { - resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE, null, null); - - } else if (Intent.ACTION_PACKAGE_DATA_CLEARED.equals(action)) { - final Uri data = intent.getData(); - if (data != null) { - final String packageName = data.getSchemeSpecificPart(); - resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE_PACKAGE, - packageName, null); - } - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/PairedTask.java b/packages/DocumentsUI/src/com/android/documentsui/PairedTask.java deleted file mode 100644 index 7d2da0b536f8..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/PairedTask.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.app.Activity; -import android.os.AsyncTask; - -/** - * An {@link CheckedTask} that guards work with checks that a paired {@link Activity} - * is still alive. Instances of this class make no progress. - * - * @template Owner Activity type. - * @template Input input type - * @template Output output type - */ -abstract class PairedTask<Owner extends Activity, Input, Output> - extends CheckedTask<Input, Output> { - - protected final Owner mOwner; - - public PairedTask(Owner owner) { - super(owner::isDestroyed); - mOwner = owner; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java b/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java deleted file mode 100644 index 933506c258f2..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/PickFragment.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.services.FileOperationService.OPERATION_DELETE; -import static com.android.documentsui.services.FileOperationService.OPERATION_MOVE; -import static com.android.documentsui.services.FileOperationService.OPERATION_UNKNOWN; - -import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; - -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.services.FileOperationService.OpType; - -/** - * Display pick confirmation bar, usually for selecting a directory. - */ -public class PickFragment extends Fragment { - public static final String TAG = "PickFragment"; - - private int mAction; - // Only legal values are OPERATION_COPY, OPERATION_MOVE, and unset (OPERATION_UNKNOWN). - private @OpType int mCopyOperationSubType = OPERATION_UNKNOWN; - private DocumentInfo mPickTarget; - private View mContainer; - private Button mPick; - private Button mCancel; - - public static void show(FragmentManager fm) { - // Fragment can be restored by FragmentManager automatically. - if (get(fm) != null) { - return; - } - - final PickFragment fragment = new PickFragment(); - final FragmentTransaction ft = fm.beginTransaction(); - ft.replace(R.id.container_save, fragment, TAG); - ft.commitAllowingStateLoss(); - } - - public static PickFragment get(FragmentManager fm) { - return (PickFragment) fm.findFragmentByTag(TAG); - } - - @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - mContainer = inflater.inflate(R.layout.fragment_pick, container, false); - - mPick = (Button) mContainer.findViewById(android.R.id.button1); - mPick.setOnClickListener(mPickListener); - - mCancel = (Button) mContainer.findViewById(android.R.id.button2); - mCancel.setOnClickListener(mCancelListener); - - updateView(); - return mContainer; - } - - private View.OnClickListener mPickListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - final DocumentsActivity activity = DocumentsActivity.get(PickFragment.this); - activity.onPickRequested(mPickTarget); - } - }; - - private View.OnClickListener mCancelListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - final BaseActivity activity = BaseActivity.get(PickFragment.this); - activity.setResult(Activity.RESULT_CANCELED); - activity.finish(); - } - }; - - /** - * @param action Which action defined in State is the picker shown for. - */ - public void setPickTarget( - int action, @OpType int copyOperationSubType, DocumentInfo pickTarget) { - assert(copyOperationSubType != OPERATION_DELETE); - - mAction = action; - mCopyOperationSubType = copyOperationSubType; - mPickTarget = pickTarget; - if (mContainer != null) { - updateView(); - } - } - - /** - * Applies the state of fragment to the view components. - */ - private void updateView() { - switch (mAction) { - case State.ACTION_OPEN_TREE: - mPick.setText(R.string.button_select); - mCancel.setVisibility(View.GONE); - break; - case State.ACTION_PICK_COPY_DESTINATION: - mPick.setText(mCopyOperationSubType == OPERATION_MOVE - ? R.string.button_move : R.string.button_copy); - mCancel.setVisibility(View.VISIBLE); - break; - default: - mContainer.setVisibility(View.GONE); - return; - } - - if (mPickTarget != null && ( - mAction == State.ACTION_OPEN_TREE || - mPickTarget.isCreateSupported())) { - mContainer.setVisibility(View.VISIBLE); - } else { - mContainer.setVisibility(View.GONE); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java b/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java deleted file mode 100644 index 8145edc4d7db..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.os.AsyncTask; - -import com.android.internal.annotations.GuardedBy; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; - -public class ProviderExecutor extends Thread implements Executor { - - @GuardedBy("sExecutors") - private static HashMap<String, ProviderExecutor> sExecutors = new HashMap<>(); - - public static ProviderExecutor forAuthority(String authority) { - synchronized (sExecutors) { - ProviderExecutor executor = sExecutors.get(authority); - if (executor == null) { - executor = new ProviderExecutor(); - executor.setName("ProviderExecutor: " + authority); - executor.start(); - sExecutors.put(authority, executor); - } - return executor; - } - } - - public interface Preemptable { - void preempt(); - } - - private final LinkedBlockingQueue<Runnable> mQueue = new LinkedBlockingQueue<Runnable>(); - - private final ArrayList<WeakReference<Preemptable>> mPreemptable = new ArrayList<>(); - - private void preempt() { - synchronized (mPreemptable) { - int count = 0; - for (WeakReference<Preemptable> ref : mPreemptable) { - final Preemptable p = ref.get(); - if (p != null) { - count++; - p.preempt(); - } - } - mPreemptable.clear(); - } - } - - /** - * Execute the given task. If given task is not {@link Preemptable}, it will - * preempt all outstanding preemptable tasks. - */ - public <P> void execute(AsyncTask<P, ?, ?> task, P... params) { - if (task instanceof Preemptable) { - synchronized (mPreemptable) { - mPreemptable.add(new WeakReference<Preemptable>((Preemptable) task)); - } - task.executeOnExecutor(mNonPreemptingExecutor, params); - } else { - task.executeOnExecutor(this, params); - } - } - - private Executor mNonPreemptingExecutor = new Executor() { - @Override - public void execute(Runnable command) { - assert(command != null); - mQueue.add(command); - } - }; - - @Override - public void execute(Runnable command) { - preempt(); - assert(command != null); - mQueue.add(command); - } - - @Override - public void run() { - while (true) { - try { - final Runnable command = mQueue.take(); - command.run(); - } catch (InterruptedException e) { - // That was weird; let's go look for more tasks. - } - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/QuickViewIntentBuilder.java b/packages/DocumentsUI/src/com/android/documentsui/QuickViewIntentBuilder.java deleted file mode 100644 index 5e3bbbb86486..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/QuickViewIntentBuilder.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.Shared.MAX_DOCS_IN_INTENT; -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.content.ClipData; -import android.content.ClipDescription; -import android.content.ComponentName; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.database.Cursor; -import android.net.Uri; -import android.os.Build; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.support.annotation.Nullable; -import android.text.TextUtils; -import android.util.Log; -import android.util.Range; - -import com.android.documentsui.dirlist.Model; -import com.android.documentsui.model.DocumentInfo; - -import java.util.ArrayList; -import java.util.List; - -/** - * Provides support for gather a list of quick-viewable files into a quick view intent. - */ -final class QuickViewIntentBuilder { - - private static final String TAG = "QuickViewIntentBuilder"; - - private final DocumentInfo mDocument; - private final Model mModel; - - private final PackageManager mPkgManager; - private final Resources mResources; - - public QuickViewIntentBuilder( - PackageManager pkgManager, - Resources resources, - DocumentInfo doc, - Model model) { - - mPkgManager = pkgManager; - mResources = resources; - mDocument = doc; - mModel = model; - } - - /** - * Builds the intent for quick viewing. Short circuits building if a handler cannot - * be resolved; in this case {@code null} is returned. - */ - @Nullable Intent build() { - if (DEBUG) Log.d(TAG, "Preparing intent for doc:" + mDocument.documentId); - - String trustedPkg = getQuickViewPackage(); - - if (!TextUtils.isEmpty(trustedPkg)) { - Intent intent = new Intent(Intent.ACTION_QUICK_VIEW); - intent.setDataAndType(mDocument.derivedUri, mDocument.mimeType); - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setPackage(trustedPkg); - if (hasRegisteredHandler(intent)) { - final ArrayList<Uri> uris = new ArrayList<Uri>(); - final int documentLocation = collectViewableUris(uris); - final Range<Integer> range = computeSiblingsRange(uris, documentLocation); - - ClipData clipData = null; - ClipData.Item item; - Uri uri; - for (int i = range.getLower(); i <= range.getUpper(); i++) { - uri = uris.get(i); - item = new ClipData.Item(uri); - if (DEBUG) Log.d(TAG, "Including file: " + uri); - if (clipData == null) { - clipData = new ClipData( - "URIs", new String[] { ClipDescription.MIMETYPE_TEXT_URILIST }, - item); - } else { - clipData.addItem(item); - } - } - - // The documentLocation variable contains an index in "uris". However, - // ClipData contains a slice of "uris", so we need to shift the location - // so it points to the same Uri. - intent.putExtra(Intent.EXTRA_INDEX, documentLocation - range.getLower()); - intent.setClipData(clipData); - - return intent; - } else { - Log.e(TAG, "Can't resolve trusted quick view package: " + trustedPkg); - } - } - - return null; - } - - private String getQuickViewPackage() { - String resValue = mResources.getString(R.string.trusted_quick_viewer_package); - if (Build.IS_DEBUGGABLE ) { - // Allow users of debug devices to override default quick viewer - // for the purposes of testing. - return android.os.SystemProperties.get("debug.quick_viewer", resValue); - } - return resValue; - } - - private int collectViewableUris(ArrayList<Uri> uris) { - final String[] siblingIds = mModel.getModelIds(); - uris.ensureCapacity(siblingIds.length); - - int documentLocation = 0; - Cursor cursor; - String mimeType; - String id; - String authority; - Uri uri; - - // Cursor's are not guaranteed to be immutable. Hence, traverse it only once. - for (int i = 0; i < siblingIds.length; i++) { - cursor = mModel.getItem(siblingIds[i]); - - if (cursor == null) { - if (DEBUG) Log.d(TAG, - "Unable to obtain cursor for sibling document, modelId: " - + siblingIds[i]); - continue; - } - - mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - if (Document.MIME_TYPE_DIR.equals(mimeType)) { - if (DEBUG) Log.d(TAG, - "Skipping directory, not supported by quick view. modelId: " - + siblingIds[i]); - continue; - } - - id = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); - authority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); - uri = DocumentsContract.buildDocumentUri(authority, id); - - uris.add(uri); - - if (id.equals(mDocument.documentId)) { - documentLocation = uris.size() - 1; // Position in "uris", not in the model. - if (DEBUG) Log.d(TAG, "Found starting point for QV. " + documentLocation); - } - } - - return documentLocation; - } - - private static Range<Integer> computeSiblingsRange(List<Uri> uris, int documentLocation) { - // Restrict number of siblings to avoid hitting the IPC limit. - // TODO: Remove this restriction once ClipData can hold an arbitrary number of - // items. - int firstSibling; - int lastSibling; - if (documentLocation < uris.size() / 2) { - firstSibling = Math.max(0, documentLocation - MAX_DOCS_IN_INTENT / 2); - lastSibling = Math.min(uris.size() - 1, firstSibling + MAX_DOCS_IN_INTENT - 1); - } else { - lastSibling = Math.min(uris.size() - 1, documentLocation + MAX_DOCS_IN_INTENT / 2); - firstSibling = Math.max(0, lastSibling - MAX_DOCS_IN_INTENT + 1); - } - - if (DEBUG) Log.d(TAG, "Copmuted siblings from index: " + firstSibling - + " to: " + lastSibling); - - return new Range(firstSibling, lastSibling); - } - - private boolean hasRegisteredHandler(Intent intent) { - // Try to resolve the intent. If a matching app isn't installed, it won't resolve. - return intent.resolveActivity(mPkgManager) != null; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java deleted file mode 100644 index 019ca86bd3db..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.TAG; -import static com.android.documentsui.State.ACTION_CREATE; - -import android.app.Fragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.app.LoaderManager.LoaderCallbacks; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Loader; -import android.database.Cursor; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Bundle; -import android.os.CancellationSignal; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.TextUtils.TruncateAt; -import android.text.style.ImageSpan; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.documentsui.Events.MotionInputEvent; -import com.android.documentsui.RecentsProvider.RecentColumns; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.DurableUtils; -import com.android.documentsui.model.RootInfo; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import libcore.io.IoUtils; - -/** - * Display directories where recent creates took place. - */ -public class RecentsCreateFragment extends Fragment { - - private View mEmptyView; - private RecyclerView mRecView; - private DocumentStackAdapter mAdapter; - private LoaderCallbacks<List<DocumentStack>> mCallbacks; - - private static final int LOADER_RECENTS = 3; - - public static void show(FragmentManager fm) { - final RecentsCreateFragment fragment = new RecentsCreateFragment(); - final FragmentTransaction ft = fm.beginTransaction(); - ft.replace(R.id.container_directory, fragment); - ft.commitAllowingStateLoss(); - } - - @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final Context context = inflater.getContext(); - - final View view = inflater.inflate(R.layout.fragment_directory, container, false); - - mRecView = (RecyclerView) view.findViewById(R.id.dir_list); - mRecView.setLayoutManager(new LinearLayoutManager(getContext())); - mRecView.addOnItemTouchListener(mItemListener); - - mEmptyView = view.findViewById(android.R.id.empty); - - mAdapter = new DocumentStackAdapter(); - mRecView.setAdapter(mAdapter); - - final RootsCache roots = DocumentsApplication.getRootsCache(context); - final State state = ((BaseActivity) getActivity()).getDisplayState(); - - mCallbacks = new LoaderCallbacks<List<DocumentStack>>() { - @Override - public Loader<List<DocumentStack>> onCreateLoader(int id, Bundle args) { - return new RecentsCreateLoader(context, roots, state); - } - - @Override - public void onLoadFinished( - Loader<List<DocumentStack>> loader, List<DocumentStack> data) { - mAdapter.update(data); - - // When launched into empty recents, show drawer - if (mAdapter.isEmpty() && !state.hasLocationChanged() - && state.action != ACTION_CREATE - && context instanceof DocumentsActivity) { - ((DocumentsActivity) context).setRootsDrawerOpen(true); - } - } - - @Override - public void onLoaderReset(Loader<List<DocumentStack>> loader) { - mAdapter.update(null); - } - }; - - return view; - } - - @Override - public void onStart() { - super.onStart(); - getLoaderManager().restartLoader(LOADER_RECENTS, getArguments(), mCallbacks); - } - - @Override - public void onStop() { - super.onStop(); - getLoaderManager().destroyLoader(LOADER_RECENTS); - } - - private RecyclerView.OnItemTouchListener mItemListener = - new RecyclerView.OnItemTouchListener() { - @Override - public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { - try (MotionInputEvent event = MotionInputEvent.obtain(e, mRecView)) { - if (event.isOverItem() && event.isActionUp()) { - final DocumentStack stack = mAdapter.getItem(event.getItemPosition()); - ((BaseActivity) getActivity()).onStackPicked(stack); - return true; - } - return false; - } - } - - @Override - public void onTouchEvent(RecyclerView rv, MotionEvent e) {} - @Override - public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {} - }; - - public static class RecentsCreateLoader extends UriDerivativeLoader<Uri, List<DocumentStack>> { - private final RootsCache mRoots; - private final State mState; - - public RecentsCreateLoader(Context context, RootsCache roots, State state) { - super(context, RecentsProvider.buildRecent()); - mRoots = roots; - mState = state; - } - - @Override - public List<DocumentStack> loadInBackground(Uri uri, CancellationSignal signal) { - final Collection<RootInfo> matchingRoots = mRoots.getMatchingRootsBlocking(mState); - final ArrayList<DocumentStack> result = new ArrayList<>(); - - final ContentResolver resolver = getContext().getContentResolver(); - final Cursor cursor = resolver.query( - uri, null, null, null, RecentColumns.TIMESTAMP + " DESC", signal); - try { - while (cursor != null && cursor.moveToNext()) { - final byte[] rawStack = cursor.getBlob( - cursor.getColumnIndex(RecentColumns.STACK)); - try { - final DocumentStack stack = new DocumentStack(); - DurableUtils.readFromArray(rawStack, stack); - - // Only update root here to avoid spinning up all - // providers; we update the stack during the actual - // restore. This also filters away roots that don't - // match current filter. - stack.updateRoot(matchingRoots); - result.add(stack); - } catch (IOException e) { - Log.w(TAG, "Failed to resolve stack: " + e); - } - } - } finally { - IoUtils.closeQuietly(cursor); - } - - return result; - } - } - - private static final class StackHolder extends RecyclerView.ViewHolder { - public View view; - public StackHolder(View view) { - super(view); - this.view = view; - } - } - - private class DocumentStackAdapter extends RecyclerView.Adapter<StackHolder> { - @Nullable private List<DocumentStack> mItems; - - DocumentStack getItem(int position) { - return mItems.get(position); - } - - @Override - public int getItemCount() { - return mItems == null ? 0 : mItems.size(); - } - - boolean isEmpty() { - return mItems == null ? true : mItems.isEmpty(); - } - - void update(@Nullable List<DocumentStack> items) { - mItems = items; - - if (isEmpty()) { - mEmptyView.setVisibility(View.VISIBLE); - } else { - mEmptyView.setVisibility(View.GONE); - } - - notifyDataSetChanged(); - } - - @Override - public StackHolder onCreateViewHolder(ViewGroup parent, int viewType) { - final Context context = parent.getContext(); - - final LayoutInflater inflater = LayoutInflater.from(context); - return new StackHolder( - inflater.inflate(R.layout.item_doc_list, parent, false)); - } - - @Override - public void onBindViewHolder(StackHolder holder, int position) { - Context context = getContext(); - View view = holder.view; - - final ImageView iconMime = (ImageView) view.findViewById(R.id.icon_mime); - final TextView title = (TextView) view.findViewById(android.R.id.title); - final View line2 = view.findViewById(R.id.line2); - - final DocumentStack stack = getItem(position); - iconMime.setImageDrawable(stack.root.loadIcon(context)); - - final Drawable crumb = context.getDrawable(R.drawable.ic_breadcrumb_arrow); - crumb.setBounds(0, 0, crumb.getIntrinsicWidth(), crumb.getIntrinsicHeight()); - - final SpannableStringBuilder builder = new SpannableStringBuilder(); - builder.append(stack.root.title); - for (int i = stack.size() - 2; i >= 0; i--) { - appendDrawable(builder, crumb); - builder.append(stack.get(i).displayName); - } - title.setText(builder); - title.setEllipsize(TruncateAt.MIDDLE); - - if (line2 != null) line2.setVisibility(View.GONE); - } - } - - private static void appendDrawable(SpannableStringBuilder b, Drawable d) { - final int length = b.length(); - b.append("\u232a"); - b.setSpan(new ImageSpan(d), length, b.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java deleted file mode 100644 index cebc9b05679e..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.Shared.TAG; -import static com.android.documentsui.State.SORT_ORDER_LAST_MODIFIED; - -import android.app.ActivityManager; -import android.content.AsyncTaskLoader; -import android.content.ContentProviderClient; -import android.content.Context; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.database.MergeCursor; -import android.net.Uri; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.text.format.DateUtils; -import android.util.Log; - -import com.android.documentsui.model.RootInfo; -import com.android.internal.annotations.GuardedBy; - -import com.google.common.util.concurrent.AbstractFuture; - -import libcore.io.IoUtils; - -import java.io.Closeable; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -public class RecentsLoader extends AsyncTaskLoader<DirectoryResult> { - // TODO: clean up cursor ownership so background thread doesn't traverse - // previously returned cursors for filtering/sorting; this currently races - // with the UI thread. - - private static final int MAX_OUTSTANDING_RECENTS = 4; - private static final int MAX_OUTSTANDING_RECENTS_SVELTE = 2; - - /** - * Time to wait for first pass to complete before returning partial results. - */ - private static final int MAX_FIRST_PASS_WAIT_MILLIS = 500; - - /** Maximum documents from a single root. */ - private static final int MAX_DOCS_FROM_ROOT = 64; - - /** Ignore documents older than this age. */ - private static final long REJECT_OLDER_THAN = 45 * DateUtils.DAY_IN_MILLIS; - - /** MIME types that should always be excluded from recents. */ - private static final String[] RECENT_REJECT_MIMES = new String[] { Document.MIME_TYPE_DIR }; - - private final Semaphore mQueryPermits; - - private final RootsCache mRoots; - private final State mState; - - @GuardedBy("mTasks") - private final HashMap<RootInfo, RecentsTask> mTasks = new HashMap<>(); - - private final int mSortOrder = State.SORT_ORDER_LAST_MODIFIED; - - private CountDownLatch mFirstPassLatch; - private volatile boolean mFirstPassDone; - - private DirectoryResult mResult; - - public RecentsLoader(Context context, RootsCache roots, State state) { - super(context); - mRoots = roots; - mState = state; - - // Keep clients around on high-RAM devices, since we'd be spinning them - // up moments later to fetch thumbnails anyway. - final ActivityManager am = (ActivityManager) getContext().getSystemService( - Context.ACTIVITY_SERVICE); - mQueryPermits = new Semaphore( - am.isLowRamDevice() ? MAX_OUTSTANDING_RECENTS_SVELTE : MAX_OUTSTANDING_RECENTS); - } - - @Override - public DirectoryResult loadInBackground() { - synchronized (mTasks) { - return loadInBackgroundLocked(); - } - } - - private DirectoryResult loadInBackgroundLocked() { - if (mFirstPassLatch == null) { - // First time through we kick off all the recent tasks, and wait - // around to see if everyone finishes quickly. - - final Collection<RootInfo> roots = mRoots.getMatchingRootsBlocking(mState); - for (RootInfo root : roots) { - if (root.supportsRecents()) { - mTasks.put(root, new RecentsTask(root.authority, root.rootId)); - } - } - - mFirstPassLatch = new CountDownLatch(mTasks.size()); - for (RecentsTask task : mTasks.values()) { - ProviderExecutor.forAuthority(task.authority).execute(task); - } - - try { - mFirstPassLatch.await(MAX_FIRST_PASS_WAIT_MILLIS, TimeUnit.MILLISECONDS); - mFirstPassDone = true; - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - final long rejectBefore = System.currentTimeMillis() - REJECT_OLDER_THAN; - - // Collect all finished tasks - boolean allDone = true; - List<Cursor> cursors = new ArrayList<>(); - for (RecentsTask task : mTasks.values()) { - if (task.isDone()) { - try { - final Cursor cursor = task.get(); - if (cursor == null) continue; - - final FilteringCursorWrapper filtered = new FilteringCursorWrapper( - cursor, mState.acceptMimes, RECENT_REJECT_MIMES, rejectBefore) { - @Override - public void close() { - // Ignored, since we manage cursor lifecycle internally - } - }; - cursors.add(filtered); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } catch (ExecutionException e) { - // We already logged on other side - } - } else { - allDone = false; - } - } - - if (DEBUG) { - Log.d(TAG, "Found " + cursors.size() + " of " + mTasks.size() + " recent queries done"); - } - - final DirectoryResult result = new DirectoryResult(); - result.sortOrder = SORT_ORDER_LAST_MODIFIED; - - final Cursor merged; - if (cursors.size() > 0) { - merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()])); - } else { - // Return something when nobody is ready - merged = new MatrixCursor(new String[0]); - } - - // Tell the UI if this is an in-progress result. When loading is complete, another update is - // sent with EXTRA_LOADING set to false. - Bundle extras = new Bundle(); - extras.putBoolean(DocumentsContract.EXTRA_LOADING, !allDone); - merged.setExtras(extras); - - result.cursor = merged; - - return result; - } - - @Override - public void cancelLoadInBackground() { - super.cancelLoadInBackground(); - } - - @Override - public void deliverResult(DirectoryResult result) { - if (isReset()) { - IoUtils.closeQuietly(result); - return; - } - DirectoryResult oldResult = mResult; - mResult = result; - - if (isStarted()) { - super.deliverResult(result); - } - - if (oldResult != null && oldResult != result) { - IoUtils.closeQuietly(oldResult); - } - } - - @Override - protected void onStartLoading() { - if (mResult != null) { - deliverResult(mResult); - } - if (takeContentChanged() || mResult == null) { - forceLoad(); - } - } - - @Override - protected void onStopLoading() { - cancelLoad(); - } - - @Override - public void onCanceled(DirectoryResult result) { - IoUtils.closeQuietly(result); - } - - @Override - protected void onReset() { - super.onReset(); - - // Ensure the loader is stopped - onStopLoading(); - - synchronized (mTasks) { - for (RecentsTask task : mTasks.values()) { - IoUtils.closeQuietly(task); - } - } - - IoUtils.closeQuietly(mResult); - mResult = null; - } - - // TODO: create better transfer of ownership around cursor to ensure its - // closed in all edge cases. - - public class RecentsTask extends AbstractFuture<Cursor> implements Runnable, Closeable { - public final String authority; - public final String rootId; - - private Cursor mWithRoot; - - public RecentsTask(String authority, String rootId) { - this.authority = authority; - this.rootId = rootId; - } - - @Override - public void run() { - if (isCancelled()) return; - - try { - mQueryPermits.acquire(); - } catch (InterruptedException e) { - return; - } - - try { - runInternal(); - } finally { - mQueryPermits.release(); - } - } - - public void runInternal() { - ContentProviderClient client = null; - try { - client = DocumentsApplication.acquireUnstableProviderOrThrow( - getContext().getContentResolver(), authority); - - final Uri uri = DocumentsContract.buildRecentDocumentsUri(authority, rootId); - final Cursor cursor = client.query( - uri, null, null, null, DirectoryLoader.getQuerySortOrder(mSortOrder)); - mWithRoot = new RootCursorWrapper(authority, rootId, cursor, MAX_DOCS_FROM_ROOT); - - } catch (Exception e) { - Log.w(TAG, "Failed to load " + authority + ", " + rootId, e); - } finally { - ContentProviderClient.releaseQuietly(client); - } - - set(mWithRoot); - - mFirstPassLatch.countDown(); - if (mFirstPassDone) { - onContentChanged(); - } - } - - @Override - public void close() throws IOException { - IoUtils.closeQuietly(mWithRoot); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java deleted file mode 100644 index 6ef9154451a2..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.content.ContentProvider; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.content.UriMatcher; -import android.content.pm.ResolveInfo; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.net.Uri; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Root; -import android.text.format.DateUtils; -import android.util.Log; - -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.DurableUtils; -import com.android.internal.util.Predicate; - -import com.google.android.collect.Sets; - -import libcore.io.IoUtils; - -import java.io.IOException; -import java.util.Set; - -public class RecentsProvider extends ContentProvider { - private static final String TAG = "RecentsProvider"; - - private static final long MAX_HISTORY_IN_MILLIS = 45 * DateUtils.DAY_IN_MILLIS; - - private static final String AUTHORITY = "com.android.documentsui.recents"; - - private static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH); - - private static final int URI_RECENT = 1; - private static final int URI_STATE = 2; - private static final int URI_RESUME = 3; - - public static final String METHOD_PURGE = "purge"; - public static final String METHOD_PURGE_PACKAGE = "purgePackage"; - - static { - sMatcher.addURI(AUTHORITY, "recent", URI_RECENT); - // state/authority/rootId/docId - sMatcher.addURI(AUTHORITY, "state/*/*/*", URI_STATE); - // resume/packageName - sMatcher.addURI(AUTHORITY, "resume/*", URI_RESUME); - } - - public static final String TABLE_RECENT = "recent"; - public static final String TABLE_STATE = "state"; - public static final String TABLE_RESUME = "resume"; - - public static class RecentColumns { - public static final String KEY = "key"; - public static final String STACK = "stack"; - public static final String TIMESTAMP = "timestamp"; - } - - public static class StateColumns { - public static final String AUTHORITY = "authority"; - public static final String ROOT_ID = Root.COLUMN_ROOT_ID; - public static final String DOCUMENT_ID = Document.COLUMN_DOCUMENT_ID; - - @Deprecated // mode is tracked in local preferences now...by root only - public static final String MODE = "mode"; - public static final String SORT_ORDER = "sortOrder"; - } - - public static class ResumeColumns { - public static final String PACKAGE_NAME = "package_name"; - public static final String STACK = "stack"; - public static final String TIMESTAMP = "timestamp"; - // Indicates handler was an external app, like photos. - public static final String EXTERNAL = "external"; - } - - public static Uri buildRecent() { - return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) - .authority(AUTHORITY).appendPath("recent").build(); - } - - public static Uri buildState(String authority, String rootId, String documentId) { - return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(AUTHORITY) - .appendPath("state").appendPath(authority).appendPath(rootId).appendPath(documentId) - .build(); - } - - public static Uri buildResume(String packageName) { - return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) - .authority(AUTHORITY).appendPath("resume").appendPath(packageName).build(); - } - - private DatabaseHelper mHelper; - - private static class DatabaseHelper extends SQLiteOpenHelper { - private static final String DB_NAME = "recents.db"; - - private static final int VERSION_INIT = 1; - private static final int VERSION_AS_BLOB = 3; - private static final int VERSION_ADD_EXTERNAL = 4; - private static final int VERSION_ADD_RECENT_KEY = 5; - - public DatabaseHelper(Context context) { - super(context, DB_NAME, null, VERSION_ADD_RECENT_KEY); - } - - @Override - public void onCreate(SQLiteDatabase db) { - - db.execSQL("CREATE TABLE " + TABLE_RECENT + " (" + - RecentColumns.KEY + " TEXT PRIMARY KEY ON CONFLICT REPLACE," + - RecentColumns.STACK + " BLOB DEFAULT NULL," + - RecentColumns.TIMESTAMP + " INTEGER" + - ")"); - - db.execSQL("CREATE TABLE " + TABLE_STATE + " (" + - StateColumns.AUTHORITY + " TEXT," + - StateColumns.ROOT_ID + " TEXT," + - StateColumns.DOCUMENT_ID + " TEXT," + - StateColumns.MODE + " INTEGER," + - StateColumns.SORT_ORDER + " INTEGER," + - "PRIMARY KEY (" + StateColumns.AUTHORITY + ", " + StateColumns.ROOT_ID + ", " - + StateColumns.DOCUMENT_ID + ")" + - ")"); - - db.execSQL("CREATE TABLE " + TABLE_RESUME + " (" + - ResumeColumns.PACKAGE_NAME + " TEXT NOT NULL PRIMARY KEY," + - ResumeColumns.STACK + " BLOB DEFAULT NULL," + - ResumeColumns.TIMESTAMP + " INTEGER," + - ResumeColumns.EXTERNAL + " INTEGER NOT NULL DEFAULT 0" + - ")"); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - Log.w(TAG, "Upgrading database; wiping app data"); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECENT); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_STATE); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_RESUME); - onCreate(db); - } - } - - @Override - public boolean onCreate() { - mHelper = new DatabaseHelper(getContext()); - return true; - } - - @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, - String sortOrder) { - final SQLiteDatabase db = mHelper.getReadableDatabase(); - switch (sMatcher.match(uri)) { - case URI_RECENT: - final long cutoff = System.currentTimeMillis() - MAX_HISTORY_IN_MILLIS; - return db.query(TABLE_RECENT, projection, RecentColumns.TIMESTAMP + ">" + cutoff, - null, null, null, sortOrder); - case URI_STATE: - final String authority = uri.getPathSegments().get(1); - final String rootId = uri.getPathSegments().get(2); - final String documentId = uri.getPathSegments().get(3); - return db.query(TABLE_STATE, projection, StateColumns.AUTHORITY + "=? AND " - + StateColumns.ROOT_ID + "=? AND " + StateColumns.DOCUMENT_ID + "=?", - new String[] { authority, rootId, documentId }, null, null, sortOrder); - case URI_RESUME: - final String packageName = uri.getPathSegments().get(1); - return db.query(TABLE_RESUME, projection, ResumeColumns.PACKAGE_NAME + "=?", - new String[] { packageName }, null, null, sortOrder); - default: - throw new UnsupportedOperationException("Unsupported Uri " + uri); - } - } - - @Override - public String getType(Uri uri) { - return null; - } - - @Override - public Uri insert(Uri uri, ContentValues values) { - final SQLiteDatabase db = mHelper.getWritableDatabase(); - final ContentValues key = new ContentValues(); - switch (sMatcher.match(uri)) { - case URI_RECENT: - values.put(RecentColumns.TIMESTAMP, System.currentTimeMillis()); - db.insert(TABLE_RECENT, null, values); - final long cutoff = System.currentTimeMillis() - MAX_HISTORY_IN_MILLIS; - db.delete(TABLE_RECENT, RecentColumns.TIMESTAMP + "<" + cutoff, null); - return uri; - case URI_STATE: - final String authority = uri.getPathSegments().get(1); - final String rootId = uri.getPathSegments().get(2); - final String documentId = uri.getPathSegments().get(3); - - key.put(StateColumns.AUTHORITY, authority); - key.put(StateColumns.ROOT_ID, rootId); - key.put(StateColumns.DOCUMENT_ID, documentId); - - // Ensure that row exists, then update with changed values - db.insertWithOnConflict(TABLE_STATE, null, key, SQLiteDatabase.CONFLICT_IGNORE); - db.update(TABLE_STATE, values, StateColumns.AUTHORITY + "=? AND " - + StateColumns.ROOT_ID + "=? AND " + StateColumns.DOCUMENT_ID + "=?", - new String[] { authority, rootId, documentId }); - - return uri; - case URI_RESUME: - values.put(ResumeColumns.TIMESTAMP, System.currentTimeMillis()); - - final String packageName = uri.getPathSegments().get(1); - key.put(ResumeColumns.PACKAGE_NAME, packageName); - - // Ensure that row exists, then update with changed values - db.insertWithOnConflict(TABLE_RESUME, null, key, SQLiteDatabase.CONFLICT_IGNORE); - db.update(TABLE_RESUME, values, ResumeColumns.PACKAGE_NAME + "=?", - new String[] { packageName }); - return uri; - default: - throw new UnsupportedOperationException("Unsupported Uri " + uri); - } - } - - @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - throw new UnsupportedOperationException("Unsupported Uri " + uri); - } - - @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { - throw new UnsupportedOperationException("Unsupported Uri " + uri); - } - - @Override - public Bundle call(String method, String arg, Bundle extras) { - if (METHOD_PURGE.equals(method)) { - // Purge references to unknown authorities - final Intent intent = new Intent(DocumentsContract.PROVIDER_INTERFACE); - final Set<String> knownAuth = Sets.newHashSet(); - for (ResolveInfo info : getContext() - .getPackageManager().queryIntentContentProviders(intent, 0)) { - knownAuth.add(info.providerInfo.authority); - } - - purgeByAuthority(new Predicate<String>() { - @Override - public boolean apply(String authority) { - // Purge unknown authorities - return !knownAuth.contains(authority); - } - }); - - return null; - - } else if (METHOD_PURGE_PACKAGE.equals(method)) { - // Purge references to authorities in given package - final Intent intent = new Intent(DocumentsContract.PROVIDER_INTERFACE); - intent.setPackage(arg); - final Set<String> packageAuth = Sets.newHashSet(); - for (ResolveInfo info : getContext() - .getPackageManager().queryIntentContentProviders(intent, 0)) { - packageAuth.add(info.providerInfo.authority); - } - - if (!packageAuth.isEmpty()) { - purgeByAuthority(new Predicate<String>() { - @Override - public boolean apply(String authority) { - // Purge authority matches - return packageAuth.contains(authority); - } - }); - } - - return null; - - } else { - return super.call(method, arg, extras); - } - } - - /** - * Purge all internal data whose authority matches the given - * {@link Predicate}. - */ - private void purgeByAuthority(Predicate<String> predicate) { - final SQLiteDatabase db = mHelper.getWritableDatabase(); - final DocumentStack stack = new DocumentStack(); - - Cursor cursor = db.query(TABLE_RECENT, null, null, null, null, null, null); - try { - while (cursor.moveToNext()) { - try { - final byte[] rawStack = cursor.getBlob( - cursor.getColumnIndex(RecentColumns.STACK)); - DurableUtils.readFromArray(rawStack, stack); - - if (stack.root != null && predicate.apply(stack.root.authority)) { - final String key = getCursorString(cursor, RecentColumns.KEY); - db.delete(TABLE_RECENT, RecentColumns.KEY + "=?", new String[] { key }); - } - } catch (IOException ignored) { - } - } - } finally { - IoUtils.closeQuietly(cursor); - } - - cursor = db.query(TABLE_STATE, new String[] { - StateColumns.AUTHORITY }, null, null, StateColumns.AUTHORITY, null, null); - try { - while (cursor.moveToNext()) { - final String authority = getCursorString(cursor, StateColumns.AUTHORITY); - if (predicate.apply(authority)) { - db.delete(TABLE_STATE, StateColumns.AUTHORITY + "=?", new String[] { - authority }); - if (DEBUG) Log.d(TAG, "Purged state for " + authority); - } - } - } finally { - IoUtils.closeQuietly(cursor); - } - - cursor = db.query(TABLE_RESUME, null, null, null, null, null, null); - try { - while (cursor.moveToNext()) { - try { - final byte[] rawStack = cursor.getBlob( - cursor.getColumnIndex(ResumeColumns.STACK)); - DurableUtils.readFromArray(rawStack, stack); - - if (stack.root != null && predicate.apply(stack.root.authority)) { - final String packageName = getCursorString( - cursor, ResumeColumns.PACKAGE_NAME); - db.delete(TABLE_RESUME, ResumeColumns.PACKAGE_NAME + "=?", - new String[] { packageName }); - } - } catch (IOException ignored) { - } - } - } finally { - IoUtils.closeQuietly(cursor); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RetainedState.java b/packages/DocumentsUI/src/com/android/documentsui/RetainedState.java deleted file mode 100644 index 57cf3b438b65..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RetainedState.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.support.annotation.Nullable; - -import com.android.documentsui.dirlist.MultiSelectManager.Selection; - -/** - * Object used to collect retained state from activity and fragments. Used - * with Activity#onRetainNonConfigurationInstance. Information stored in - * this class should be primarily ephemeral as instances of the class - * only last across configuration changes (like device rotation). When - * an application is fully town down, all instances are lost, fa-evah! - */ -public final class RetainedState { - public @Nullable Selection selection; - - public boolean hasSelection() { - return selection != null; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java deleted file mode 100644 index 0b58218ab1cc..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RootCursorWrapper.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.database.AbstractCursor; -import android.database.Cursor; -import android.os.Bundle; - -/** - * Cursor wrapper that adds columns to identify which root a document came from. - */ -public class RootCursorWrapper extends AbstractCursor { - private final String mAuthority; - private final String mRootId; - - private final Cursor mCursor; - private final int mCount; - - private final String[] mColumnNames; - - private final int mAuthorityIndex; - private final int mRootIdIndex; - - public static final String COLUMN_AUTHORITY = "android:authority"; - public static final String COLUMN_ROOT_ID = "android:rootId"; - - public RootCursorWrapper(String authority, String rootId, Cursor cursor, int maxCount) { - mAuthority = authority; - mRootId = rootId; - mCursor = cursor; - - final int count = cursor.getCount(); - if (maxCount > 0 && count > maxCount) { - mCount = maxCount; - } else { - mCount = count; - } - - if (cursor.getColumnIndex(COLUMN_AUTHORITY) != -1 - || cursor.getColumnIndex(COLUMN_ROOT_ID) != -1) { - throw new IllegalArgumentException("Cursor contains internal columns!"); - } - final String[] before = cursor.getColumnNames(); - mColumnNames = new String[before.length + 2]; - System.arraycopy(before, 0, mColumnNames, 0, before.length); - mAuthorityIndex = before.length; - mRootIdIndex = before.length + 1; - mColumnNames[mAuthorityIndex] = COLUMN_AUTHORITY; - mColumnNames[mRootIdIndex] = COLUMN_ROOT_ID; - } - - @Override - public Bundle getExtras() { - return mCursor.getExtras(); - } - - @Override - public void close() { - super.close(); - mCursor.close(); - } - - @Override - public boolean onMove(int oldPosition, int newPosition) { - return mCursor.moveToPosition(newPosition); - } - - @Override - public String[] getColumnNames() { - return mColumnNames; - } - - @Override - public int getCount() { - return mCount; - } - - @Override - public double getDouble(int column) { - return mCursor.getDouble(column); - } - - @Override - public float getFloat(int column) { - return mCursor.getFloat(column); - } - - @Override - public int getInt(int column) { - return mCursor.getInt(column); - } - - @Override - public long getLong(int column) { - return mCursor.getLong(column); - } - - @Override - public short getShort(int column) { - return mCursor.getShort(column); - } - - @Override - public String getString(int column) { - if (column == mAuthorityIndex) { - return mAuthority; - } else if (column == mRootIdIndex) { - return mRootId; - } else { - return mCursor.getString(column); - } - } - - @Override - public int getType(int column) { - return mCursor.getType(column); - } - - @Override - public boolean isNull(int column) { - return mCursor.isNull(column); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootItemView.java b/packages/DocumentsUI/src/com/android/documentsui/RootItemView.java deleted file mode 100644 index 93aa526aaa82..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RootItemView.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.util.AttributeSet; -import android.widget.LinearLayout; - -public final class RootItemView extends LinearLayout { - private static final int[] STATE_HIGHLIGHTED = {R.attr.state_highlighted}; - - private boolean mHighlighted = false; - - public RootItemView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public int[] onCreateDrawableState(int extraSpace) { - final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); - - if (mHighlighted) { - mergeDrawableStates(drawableState, STATE_HIGHLIGHTED); - } - - return drawableState; - } - - public void setHighlight(boolean highlight) { - mHighlighted = highlight; - refreshDrawableState(); - } - - /** - * Synthesizes pressed state to trick RippleDrawable starting a ripple effect. - */ - public void drawRipple() { - setPressed(true); - setPressed(false); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java deleted file mode 100644 index 117bb01b1fec..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ /dev/null @@ -1,529 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; - -import android.content.BroadcastReceiver.PendingResult; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.pm.ProviderInfo; -import android.content.pm.ResolveInfo; -import android.database.ContentObserver; -import android.database.Cursor; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import android.os.SystemClock; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Root; -import android.provider.DocumentsProvider; -import android.support.annotation.VisibleForTesting; -import android.util.Log; - -import com.android.documentsui.model.RootInfo; -import com.android.internal.annotations.GuardedBy; - -import libcore.io.IoUtils; - -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -/** - * Cache of known storage backends and their roots. - */ -public class RootsCache { - public static final Uri sNotificationUri = Uri.parse( - "content://com.android.documentsui.roots/"); - - private static final String TAG = "RootsCache"; - - private final Context mContext; - private final ContentObserver mObserver; - - private final RootInfo mRecentsRoot; - - private final Object mLock = new Object(); - private final CountDownLatch mFirstLoad = new CountDownLatch(1); - - @GuardedBy("mLock") - private boolean mFirstLoadDone; - @GuardedBy("mLock") - private PendingResult mBootCompletedResult; - - @GuardedBy("mLock") - private Multimap<String, RootInfo> mRoots = ArrayListMultimap.create(); - @GuardedBy("mLock") - private HashSet<String> mStoppedAuthorities = new HashSet<>(); - - @GuardedBy("mObservedAuthorities") - private final HashSet<String> mObservedAuthorities = new HashSet<>(); - - public RootsCache(Context context) { - mContext = context; - mObserver = new RootsChangedObserver(); - - // Create a new anonymous "Recents" RootInfo. It's a faker. - mRecentsRoot = new RootInfo() {{ - // Special root for recents - derivedIcon = R.drawable.ic_root_recent; - derivedType = RootInfo.TYPE_RECENTS; - flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_IS_CHILD - | Root.FLAG_SUPPORTS_CREATE; - title = mContext.getString(R.string.root_recent); - availableBytes = -1; - }}; - } - - private class RootsChangedObserver extends ContentObserver { - public RootsChangedObserver() { - super(new Handler()); - } - - @Override - public void onChange(boolean selfChange, Uri uri) { - if (uri == null) { - Log.w(TAG, "Received onChange event for null uri. Skipping."); - return; - } - if (DEBUG) Log.d(TAG, "Updating roots due to change at " + uri); - updateAuthorityAsync(uri.getAuthority()); - } - } - - /** - * Gather roots from all known storage providers. - */ - public void updateAsync(boolean forceRefreshAll) { - - // NOTE: This method is called when the UI language changes. - // For that reason we update our RecentsRoot to reflect - // the current language. - mRecentsRoot.title = mContext.getString(R.string.root_recent); - - // Nothing else about the root should ever change. - assert(mRecentsRoot.authority == null); - assert(mRecentsRoot.rootId == null); - assert(mRecentsRoot.derivedIcon == R.drawable.ic_root_recent); - assert(mRecentsRoot.derivedType == RootInfo.TYPE_RECENTS); - assert(mRecentsRoot.flags == (Root.FLAG_LOCAL_ONLY - | Root.FLAG_SUPPORTS_IS_CHILD - | Root.FLAG_SUPPORTS_CREATE)); - assert(mRecentsRoot.availableBytes == -1); - - new UpdateTask(forceRefreshAll, null) - .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - - /** - * Gather roots from storage providers belonging to given package name. - */ - public void updatePackageAsync(String packageName) { - new UpdateTask(false, packageName).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - - /** - * Gather roots from storage providers belonging to given authority. - */ - public void updateAuthorityAsync(String authority) { - final ProviderInfo info = mContext.getPackageManager().resolveContentProvider(authority, 0); - if (info != null) { - updatePackageAsync(info.packageName); - } - } - - public void setBootCompletedResult(PendingResult result) { - synchronized (mLock) { - // Quickly check if we've already finished loading, otherwise hang - // out until first pass is finished. - if (mFirstLoadDone) { - result.finish(); - } else { - mBootCompletedResult = result; - } - } - } - - /** - * Block until the first {@link UpdateTask} pass has finished. - * - * @return {@code true} if cached roots is ready to roll, otherwise - * {@code false} if we timed out while waiting. - */ - private boolean waitForFirstLoad() { - boolean success = false; - try { - success = mFirstLoad.await(15, TimeUnit.SECONDS); - } catch (InterruptedException e) { - } - if (!success) { - Log.w(TAG, "Timeout waiting for first update"); - } - return success; - } - - /** - * Load roots from authorities that are in stopped state. Normal - * {@link UpdateTask} passes ignore stopped applications. - */ - private void loadStoppedAuthorities() { - final ContentResolver resolver = mContext.getContentResolver(); - synchronized (mLock) { - for (String authority : mStoppedAuthorities) { - if (DEBUG) Log.d(TAG, "Loading stopped authority " + authority); - mRoots.putAll(authority, loadRootsForAuthority(resolver, authority, true)); - } - mStoppedAuthorities.clear(); - } - } - - /** - * Load roots from a stopped authority. Normal {@link UpdateTask} passes - * ignore stopped applications. - */ - private void loadStoppedAuthority(String authority) { - final ContentResolver resolver = mContext.getContentResolver(); - synchronized (mLock) { - if (!mStoppedAuthorities.contains(authority)) { - return; - } - if (DEBUG) { - Log.d(TAG, "Loading stopped authority " + authority); - } - mRoots.putAll(authority, loadRootsForAuthority(resolver, authority, true)); - mStoppedAuthorities.remove(authority); - } - } - - private class UpdateTask extends AsyncTask<Void, Void, Void> { - private final boolean mForceRefreshAll; - private final String mForceRefreshPackage; - - private final Multimap<String, RootInfo> mTaskRoots = ArrayListMultimap.create(); - private final HashSet<String> mTaskStoppedAuthorities = new HashSet<>(); - - /** - * Create task to update roots cache. - * - * @param forceRefreshAll when true, all previously cached values for - * all packages should be ignored. - * @param forceRefreshPackage when non-null, all previously cached - * values for this specific package should be ignored. - */ - public UpdateTask(boolean forceRefreshAll, String forceRefreshPackage) { - mForceRefreshAll = forceRefreshAll; - mForceRefreshPackage = forceRefreshPackage; - } - - @Override - protected Void doInBackground(Void... params) { - final long start = SystemClock.elapsedRealtime(); - - mTaskRoots.put(mRecentsRoot.authority, mRecentsRoot); - - final ContentResolver resolver = mContext.getContentResolver(); - final PackageManager pm = mContext.getPackageManager(); - - // Pick up provider with action string - final Intent intent = new Intent(DocumentsContract.PROVIDER_INTERFACE); - final List<ResolveInfo> providers = pm.queryIntentContentProviders(intent, 0); - for (ResolveInfo info : providers) { - handleDocumentsProvider(info.providerInfo); - } - - final long delta = SystemClock.elapsedRealtime() - start; - if (DEBUG) - Log.d(TAG, "Update found " + mTaskRoots.size() + " roots in " + delta + "ms"); - synchronized (mLock) { - mFirstLoadDone = true; - if (mBootCompletedResult != null) { - mBootCompletedResult.finish(); - mBootCompletedResult = null; - } - mRoots = mTaskRoots; - mStoppedAuthorities = mTaskStoppedAuthorities; - } - mFirstLoad.countDown(); - resolver.notifyChange(sNotificationUri, null, false); - return null; - } - - private void handleDocumentsProvider(ProviderInfo info) { - // Ignore stopped packages for now; we might query them - // later during UI interaction. - if ((info.applicationInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0) { - if (DEBUG) Log.d(TAG, "Ignoring stopped authority " + info.authority); - mTaskStoppedAuthorities.add(info.authority); - return; - } - - final boolean forceRefresh = mForceRefreshAll - || Objects.equals(info.packageName, mForceRefreshPackage); - mTaskRoots.putAll(info.authority, loadRootsForAuthority(mContext.getContentResolver(), - info.authority, forceRefresh)); - } - } - - /** - * Bring up requested provider and query for all active roots. - */ - private Collection<RootInfo> loadRootsForAuthority(ContentResolver resolver, String authority, - boolean forceRefresh) { - if (DEBUG) Log.d(TAG, "Loading roots for " + authority); - - synchronized (mObservedAuthorities) { - if (mObservedAuthorities.add(authority)) { - // Watch for any future updates - final Uri rootsUri = DocumentsContract.buildRootsUri(authority); - mContext.getContentResolver().registerContentObserver(rootsUri, true, mObserver); - } - } - - final Uri rootsUri = DocumentsContract.buildRootsUri(authority); - if (!forceRefresh) { - // Look for roots data that we might have cached for ourselves in the - // long-lived system process. - final Bundle systemCache = resolver.getCache(rootsUri); - if (systemCache != null) { - if (DEBUG) Log.d(TAG, "System cache hit for " + authority); - return systemCache.getParcelableArrayList(TAG); - } - } - - final ArrayList<RootInfo> roots = new ArrayList<>(); - ContentProviderClient client = null; - Cursor cursor = null; - try { - client = DocumentsApplication.acquireUnstableProviderOrThrow(resolver, authority); - cursor = client.query(rootsUri, null, null, null, null); - while (cursor.moveToNext()) { - final RootInfo root = RootInfo.fromRootsCursor(authority, cursor); - roots.add(root); - } - } catch (Exception e) { - Log.w(TAG, "Failed to load some roots from " + authority + ": " + e); - } finally { - IoUtils.closeQuietly(cursor); - ContentProviderClient.releaseQuietly(client); - } - - // Cache these freshly parsed roots over in the long-lived system - // process, in case our process goes away. The system takes care of - // invalidating the cache if the package or Uri changes. - final Bundle systemCache = new Bundle(); - systemCache.putParcelableArrayList(TAG, roots); - resolver.putCache(rootsUri, systemCache); - - return roots; - } - - /** - * Return the requested {@link RootInfo}, but only loading the roots for the - * requested authority. This is useful when we want to load fast without - * waiting for all the other roots to come back. - */ - public RootInfo getRootOneshot(String authority, String rootId) { - return getRootOneshot(authority, rootId, false); - } - - /** - * Return the requested {@link RootInfo}, but only loading the roots of the requested authority. - * It always fetches from {@link DocumentsProvider} if forceRefresh is true, which is used to - * get the most up-to-date free space before starting copy operations. - */ - public RootInfo getRootOneshot(String authority, String rootId, boolean forceRefresh) { - synchronized (mLock) { - RootInfo root = forceRefresh ? null : getRootLocked(authority, rootId); - if (root == null) { - mRoots.putAll(authority, loadRootsForAuthority( - mContext.getContentResolver(), authority, forceRefresh)); - root = getRootLocked(authority, rootId); - } - return root; - } - } - - public RootInfo getRootBlocking(String authority, String rootId) { - waitForFirstLoad(); - loadStoppedAuthorities(); - synchronized (mLock) { - return getRootLocked(authority, rootId); - } - } - - private RootInfo getRootLocked(String authority, String rootId) { - for (RootInfo root : mRoots.get(authority)) { - if (Objects.equals(root.rootId, rootId)) { - return root; - } - } - return null; - } - - public boolean isIconUniqueBlocking(RootInfo root) { - waitForFirstLoad(); - loadStoppedAuthorities(); - synchronized (mLock) { - final int rootIcon = root.derivedIcon != 0 ? root.derivedIcon : root.icon; - for (RootInfo test : mRoots.get(root.authority)) { - if (Objects.equals(test.rootId, root.rootId)) { - continue; - } - final int testIcon = test.derivedIcon != 0 ? test.derivedIcon : test.icon; - if (testIcon == rootIcon) { - return false; - } - } - return true; - } - } - - public RootInfo getRecentsRoot() { - return mRecentsRoot; - } - - public boolean isRecentsRoot(RootInfo root) { - return mRecentsRoot.equals(root); - } - - public Collection<RootInfo> getRootsBlocking() { - waitForFirstLoad(); - loadStoppedAuthorities(); - synchronized (mLock) { - return mRoots.values(); - } - } - - public Collection<RootInfo> getMatchingRootsBlocking(State state) { - waitForFirstLoad(); - loadStoppedAuthorities(); - synchronized (mLock) { - return getMatchingRoots(mRoots.values(), state); - } - } - - /** - * Returns a list of roots for the specified authority. If not found, then - * an empty list is returned. - */ - public Collection<RootInfo> getRootsForAuthorityBlocking(String authority) { - waitForFirstLoad(); - loadStoppedAuthority(authority); - synchronized (mLock) { - final Collection<RootInfo> roots = mRoots.get(authority); - return roots != null ? roots : Collections.<RootInfo>emptyList(); - } - } - - /** - * Returns the default root for the specified state. - */ - public RootInfo getDefaultRootBlocking(State state) { - for (RootInfo root : getMatchingRoots(getRootsBlocking(), state)) { - if (root.isDownloads()) { - return root; - } - } - return mRecentsRoot; - } - - @VisibleForTesting - static List<RootInfo> getMatchingRoots(Collection<RootInfo> roots, State state) { - final List<RootInfo> matching = new ArrayList<>(); - for (RootInfo root : roots) { - - if (DEBUG) Log.d(TAG, "Evaluating " + root); - - if (state.action == State.ACTION_CREATE && !root.supportsCreate()) { - if (DEBUG) Log.d(TAG, "Excluding read-only root because: ACTION_CREATE."); - continue; - } - - if (state.action == State.ACTION_PICK_COPY_DESTINATION - && !root.supportsCreate()) { - if (DEBUG) Log.d( - TAG, "Excluding read-only root because: ACTION_PICK_COPY_DESTINATION."); - continue; - } - - if (state.action == State.ACTION_OPEN_TREE && !root.supportsChildren()) { - if (DEBUG) Log.d( - TAG, "Excluding root !supportsChildren because: ACTION_OPEN_TREE."); - continue; - } - - if (!state.showAdvanced && root.isAdvanced()) { - if (DEBUG) Log.d(TAG, "Excluding root because: unwanted advanced device."); - continue; - } - - if (state.localOnly && !root.isLocalOnly()) { - if (DEBUG) Log.d(TAG, "Excluding root because: unwanted non-local device."); - continue; - } - - if (state.directoryCopy && root.isDownloads()) { - if (DEBUG) Log.d( - TAG, "Excluding downloads root because: unsupported directory copy."); - continue; - } - - if (state.action == State.ACTION_OPEN && root.isEmpty()) { - if (DEBUG) Log.d(TAG, "Excluding empty root because: ACTION_OPEN."); - continue; - } - - if (state.action == State.ACTION_GET_CONTENT && root.isEmpty()) { - if (DEBUG) Log.d(TAG, "Excluding empty root because: ACTION_GET_CONTENT."); - continue; - } - - final boolean overlap = - MimePredicate.mimeMatches(root.derivedMimeTypes, state.acceptMimes) || - MimePredicate.mimeMatches(state.acceptMimes, root.derivedMimeTypes); - if (!overlap) { - if (DEBUG) Log.d( - TAG, "Excluding root because: unsupported content types > " - + state.acceptMimes); - continue; - } - - if (state.excludedAuthorities.contains(root.authority)) { - if (DEBUG) Log.d(TAG, "Excluding root because: owned by calling package."); - continue; - } - - if (DEBUG) Log.d(TAG, "Including " + root); - matching.add(root); - } - return matching; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java deleted file mode 100644 index ca28622327c8..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java +++ /dev/null @@ -1,738 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; - -import android.annotation.LayoutRes; -import android.app.Activity; -import android.app.Fragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.app.LoaderManager.LoaderCallbacks; -import android.content.ClipData; -import android.content.Context; -import android.content.Intent; -import android.content.Loader; -import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.net.Uri; -import android.os.Bundle; -import android.os.Looper; -import android.provider.Settings; -import android.support.annotation.Nullable; -import android.text.TextUtils; -import android.text.format.Formatter; -import android.util.Log; -import android.view.ContextMenu; -import android.view.DragEvent; -import android.view.LayoutInflater; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnDragListener; -import android.view.View.OnGenericMotionListener; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.AdapterContextMenuInfo; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; - -import com.android.documentsui.CheckedTask.Check; -import com.android.documentsui.clipping.DocumentClipper; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperations; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.BooleanSupplier; -import java.util.function.Consumer; - -/** - * Display list of known storage backend roots. - */ -public class RootsFragment extends Fragment implements ItemDragListener.DragHost { - - private static final String TAG = "RootsFragment"; - private static final String EXTRA_INCLUDE_APPS = "includeApps"; - - private final OnDragListener mDragListener = new ItemDragListener<RootsFragment>(this) { - @Override - public boolean handleDropEventChecked(View v, DragEvent event) { - final int position = (Integer) v.getTag(R.id.item_position_tag); - final Item item = mAdapter.getItem(position); - - assert(item.isDropTarget()); - - BaseActivity activity = getBaseActivity(); - return item.dropOn(event.getClipData(), activity, RootsFragment.this::isDetached, - activity.fileOpCallback); - } - }; - - private ListView mList; - private RootsAdapter mAdapter; - private LoaderCallbacks<Collection<RootInfo>> mCallbacks; - private Consumer<RootInfo> mOpenSettings = (RootInfo) -> { - throw new UnsupportedOperationException("Can't open settings."); - }; - - public static void show(FragmentManager fm, Consumer<RootInfo> openSettings) { - RootsFragment fragment = show(fm, (Intent) null); - fragment.mOpenSettings = openSettings; - } - - public static RootsFragment show(FragmentManager fm, Intent includeApps) { - final Bundle args = new Bundle(); - args.putParcelable(EXTRA_INCLUDE_APPS, includeApps); - - final RootsFragment fragment = new RootsFragment(); - fragment.setArguments(args); - - final FragmentTransaction ft = fm.beginTransaction(); - ft.replace(R.id.container_roots, fragment); - ft.commitAllowingStateLoss(); - - return fragment; - } - - public static RootsFragment get(FragmentManager fm) { - return (RootsFragment) fm.findFragmentById(R.id.container_roots); - } - - @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - final View view = inflater.inflate(R.layout.fragment_roots, container, false); - mList = (ListView) view.findViewById(R.id.roots_list); - mList.setOnItemClickListener(mItemListener); - // ListView does not have right-click specific listeners, so we will have a - // GenericMotionListener to listen for it. - // Currently, right click is viewed the same as long press, so we will have to quickly - // register for context menu when we receive a right click event, and quickly unregister - // it afterwards to prevent context menus popping up upon long presses. - // All other motion events will then get passed to OnItemClickListener. - mList.setOnGenericMotionListener( - new OnGenericMotionListener() { - @Override - public boolean onGenericMotion(View v, MotionEvent event) { - if (Events.isMouseEvent(event) - && event.getButtonState() == MotionEvent.BUTTON_SECONDARY) { - registerForContextMenu(v); - v.showContextMenu(event.getX(), event.getY()); - unregisterForContextMenu(v); - return true; - } - return false; - } - }); - mList.setChoiceMode(ListView.CHOICE_MODE_SINGLE); - return view; - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - final Context context = getActivity(); - final RootsCache roots = DocumentsApplication.getRootsCache(context); - final State state = ((BaseActivity) context).getDisplayState(); - - mCallbacks = new LoaderCallbacks<Collection<RootInfo>>() { - @Override - public Loader<Collection<RootInfo>> onCreateLoader(int id, Bundle args) { - return new RootsLoader(context, roots, state); - } - - @Override - public void onLoadFinished( - Loader<Collection<RootInfo>> loader, Collection<RootInfo> result) { - if (!isAdded()) { - return; - } - - Intent handlerAppIntent = getArguments().getParcelable(EXTRA_INCLUDE_APPS); - - mAdapter = - new RootsAdapter(context, result, handlerAppIntent, state, mDragListener); - mList.setAdapter(mAdapter); - - onCurrentRootChanged(); - } - - @Override - public void onLoaderReset(Loader<Collection<RootInfo>> loader) { - mAdapter = null; - mList.setAdapter(null); - } - }; - } - - @Override - public void onResume() { - super.onResume(); - onDisplayStateChanged(); - } - - public void onDisplayStateChanged() { - final Context context = getActivity(); - final State state = ((BaseActivity) context).getDisplayState(); - - if (state.action == State.ACTION_GET_CONTENT) { - mList.setOnItemLongClickListener(mItemLongClickListener); - } else { - mList.setOnItemLongClickListener(null); - mList.setLongClickable(false); - } - - getLoaderManager().restartLoader(2, null, mCallbacks); - } - - public void onCurrentRootChanged() { - if (mAdapter == null) { - return; - } - - final RootInfo root = ((BaseActivity) getActivity()).getCurrentRoot(); - for (int i = 0; i < mAdapter.getCount(); i++) { - final Object item = mAdapter.getItem(i); - if (item instanceof RootItem) { - final RootInfo testRoot = ((RootItem) item).root; - if (Objects.equals(testRoot, root)) { - mList.setItemChecked(i, true); - return; - } - } - } - } - - /** - * Attempts to shift focus back to the navigation drawer. - */ - public void requestFocus() { - mList.requestFocus(); - } - - private void showAppDetails(ResolveInfo ri) { - final Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.setData(Uri.fromParts("package", ri.activityInfo.packageName, null)); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); - startActivity(intent); - } - - private BaseActivity getBaseActivity() { - return (BaseActivity) getActivity(); - } - - @Override - public void runOnUiThread(Runnable runnable) { - getActivity().runOnUiThread(runnable); - } - - /** - * {@inheritDoc} - * - * In RootsFragment we open the hovered root. - */ - @Override - public void onViewHovered(View v) { - // SpacerView doesn't have DragListener so this view is guaranteed to be a RootItemView. - RootItemView itemView = (RootItemView) v; - itemView.drawRipple(); - - final int position = (Integer) v.getTag(R.id.item_position_tag); - final Item item = mAdapter.getItem(position); - item.open(this); - } - - @Override - public void setDropTargetHighlight(View v, boolean highlight) { - // SpacerView doesn't have DragListener so this view is guaranteed to be a RootItemView. - RootItemView itemView = (RootItemView) v; - itemView.setHighlight(highlight); - } - - @Override - public void onCreateContextMenu( - ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo; - final Item item = mAdapter.getItem(adapterMenuInfo.position); - if (item instanceof RootItem) { - RootItem rootItem = (RootItem) item; - MenuInflater inflater = getActivity().getMenuInflater(); - inflater.inflate(R.menu.root_context_menu, menu); - (getBaseActivity()).getMenuManager().updateRootContextMenu(menu, rootItem.root); - } - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) item.getMenuInfo(); - // There is a possibility that this is called from DirectoryFragment since - // all fragments' onContextItemSelected gets called when any menu item is selected - // This is to guard against it since DirectoryFragment's RecylerView does not have a - // menuInfo - if (adapterMenuInfo == null) { - return false; - } - final RootItem rootItem = (RootItem) mAdapter.getItem(adapterMenuInfo.position); - switch (item.getItemId()) { - case R.id.menu_eject_root: - final View ejectIcon = adapterMenuInfo.targetView.findViewById(R.id.eject_icon); - ejectClicked(ejectIcon, rootItem.root); - return true; - case R.id.menu_settings: - mOpenSettings.accept(rootItem.root); - return true; - default: - if (DEBUG) Log.d(TAG, "Unhandled menu item selected: " + item); - return false; - } - } - - private static void ejectClicked(View ejectIcon, RootInfo root) { - assert(ejectIcon != null); - assert(ejectIcon.getContext() instanceof BaseActivity); - assert (!root.ejecting); - ejectIcon.setEnabled(false); - root.ejecting = true; - ejectRoot( - ejectIcon, - root.authority, - root.rootId, - new Consumer<Boolean>() { - @Override - public void accept(Boolean ejected) { - ejectIcon.setEnabled(!ejected); - root.ejecting = false; - } - }); - } - - static void ejectRoot( - View ejectIcon, String authority, String rootId, Consumer<Boolean> listener) { - BooleanSupplier predicate = () -> { - return !(ejectIcon.getVisibility() == View.VISIBLE); - }; - new EjectRootTask(ejectIcon.getContext(), - authority, - rootId, - predicate, - listener).executeOnExecutor(ProviderExecutor.forAuthority(authority)); - } - - private OnItemClickListener mItemListener = new OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - final Item item = mAdapter.getItem(position); - item.open(RootsFragment.this); - - ((BaseActivity) getActivity()).setRootsDrawerOpen(false); - } - }; - - private OnItemLongClickListener mItemLongClickListener = new OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { - final Item item = mAdapter.getItem(position); - return item.showAppDetails(RootsFragment.this); - } - }; - - private static abstract class Item { - private final @LayoutRes int mLayoutId; - private final String mStringId; - - public Item(@LayoutRes int layoutId, String stringId) { - mLayoutId = layoutId; - mStringId = stringId; - } - - public View getView(View convertView, ViewGroup parent) { - if (convertView == null - || (Integer) convertView.getTag(R.id.layout_id_tag) != mLayoutId) { - convertView = LayoutInflater.from(parent.getContext()) - .inflate(mLayoutId, parent, false); - } - convertView.setTag(R.id.layout_id_tag, mLayoutId); - bindView(convertView); - return convertView; - } - - boolean showAppDetails(RootsFragment fragment) { - return false; - } - - abstract void bindView(View convertView); - - abstract boolean isDropTarget(); - - abstract void open(RootsFragment fragment); - - boolean dropOn(ClipData data, Context context, Check check, - FileOperations.Callback callback) { - return false; - } - } - - private static class RootItem extends Item { - private static final String STRING_ID_FORMAT = "RootItem{%s/%s}"; - - public final RootInfo root; - - public RootItem(RootInfo root) { - super(R.layout.item_root, getStringId(root)); - this.root = root; - } - - private static String getStringId(RootInfo root) { - // Empty URI authority is invalid, so we can use empty string if root.authority is null. - // Directly passing null to String.format() will write "null" which can be a valid URI - // authority. - String authority = (root.authority == null ? "" : root.authority); - return String.format(STRING_ID_FORMAT, authority, root.rootId); - } - - @Override - public void bindView(View convertView) { - final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon); - final TextView title = (TextView) convertView.findViewById(android.R.id.title); - final TextView summary = (TextView) convertView.findViewById(android.R.id.summary); - final ImageView ejectIcon = (ImageView) convertView.findViewById(R.id.eject_icon); - - final Context context = convertView.getContext(); - icon.setImageDrawable(root.loadDrawerIcon(context)); - title.setText(root.title); - - if (root.supportsEject()) { - ejectIcon.setVisibility(View.VISIBLE); - ejectIcon.setImageDrawable(root.loadEjectIcon(context)); - ejectIcon.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View unmountIcon) { - RootsFragment.ejectClicked(unmountIcon, root); - } - }); - } else { - ejectIcon.setVisibility(View.GONE); - ejectIcon.setOnClickListener(null); - } - // Show available space if no summary - String summaryText = root.summary; - if (TextUtils.isEmpty(summaryText) && root.availableBytes >= 0) { - summaryText = context.getString(R.string.root_available_bytes, - Formatter.formatFileSize(context, root.availableBytes)); - } - - summary.setText(summaryText); - summary.setVisibility(TextUtils.isEmpty(summaryText) ? View.GONE : View.VISIBLE); - } - - @Override - boolean isDropTarget() { - return root.supportsCreate() && !root.isLibrary(); - } - - @Override - void open(RootsFragment fragment) { - BaseActivity activity = BaseActivity.get(fragment); - Metrics.logRootVisited(fragment.getActivity(), root); - activity.onRootPicked(root); - } - - @Override - boolean dropOn( - ClipData data, Context context, Check check, FileOperations.Callback callback) { - ProviderExecutor executor = ProviderExecutor.forAuthority(root.authority); - new DropOnRootTask(data, root, context, check, callback).executeOnExecutor(executor); - return true; - } - } - - private static class SpacerItem extends Item { - private static final String STRING_ID = "SpacerItem"; - - public SpacerItem() { - // Multiple spacer items can share the same string id as they're identical. - super(R.layout.item_root_spacer, STRING_ID); - } - - @Override - void bindView(View convertView) { - // Nothing to bind - } - - @Override - boolean isDropTarget() { - return false; - } - - @Override - void open(RootsFragment fragment) { - if (DEBUG) Log.d(TAG, "Ignoring click/hover on spacer item."); - } - } - - private static class AppItem extends Item { - private static final String STRING_ID_FORMAT = "AppItem{%s/%s}"; - - public final ResolveInfo info; - - public AppItem(ResolveInfo info) { - super(R.layout.item_root, getStringId(info)); - this.info = info; - } - - private static String getStringId(ResolveInfo info) { - ActivityInfo activityInfo = info.activityInfo; - - String component = String.format( - STRING_ID_FORMAT, activityInfo.applicationInfo.packageName, activityInfo.name); - return component; - } - - @Override - boolean showAppDetails(RootsFragment fragment) { - fragment.showAppDetails(info); - return true; - } - - @Override - void bindView(View convertView) { - final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon); - final TextView title = (TextView) convertView.findViewById(android.R.id.title); - final TextView summary = (TextView) convertView.findViewById(android.R.id.summary); - - final PackageManager pm = convertView.getContext().getPackageManager(); - icon.setImageDrawable(info.loadIcon(pm)); - title.setText(info.loadLabel(pm)); - - // TODO: match existing summary behavior from disambig dialog - summary.setVisibility(View.GONE); - } - - @Override - boolean isDropTarget() { - // We won't support drag n' drop in DocumentsActivity, and apps only show up there. - return false; - } - - @Override - void open(RootsFragment fragment) { - DocumentsActivity activity = DocumentsActivity.get(fragment); - Metrics.logAppVisited(fragment.getActivity(), info); - activity.onAppPicked(info); - } - } - - private static class DropOnRootTask extends CheckedTask<Void, DocumentInfo> { - private ClipData mData; - private RootInfo mDstRoot; - private Context mContext; - private FileOperations.Callback mCallback; - - private DropOnRootTask(ClipData data, RootInfo dstRoot, Context context, Check check, - FileOperations.Callback callback) { - super(check); - mData = data; - mDstRoot = dstRoot; - mContext = context; - mCallback = callback; - } - - @Override - public DocumentInfo run(Void... args) { - return mDstRoot.getRootDocumentBlocking(mContext); - } - - @Override - public void finish(DocumentInfo doc) { - if (doc != null) { - DocumentClipper clipper = - DocumentsApplication.getDocumentClipper(mContext); - clipper.copyFromClipData(mDstRoot, doc, mData, mCallback); - } else { - Log.e(TAG, "Failed to get doc."); - } - } - } - - private static class RootsAdapter extends ArrayAdapter<Item> { - private static final Map<String, Long> sIdMap = new HashMap<String, Long>(); - // the next available id to associate with a new string id - private static long sNextAvailableId; - - private OnDragListener mDragListener; - - /** - * @param handlerAppIntent When not null, apps capable of handling the original intent will - * be included in list of roots (in special section at bottom). - */ - public RootsAdapter(Context context, Collection<RootInfo> roots, - @Nullable Intent handlerAppIntent, State state, OnDragListener dragListener) { - super(context, 0); - - final List<RootItem> libraries = new ArrayList<>(); - final List<RootItem> others = new ArrayList<>(); - - for (final RootInfo root : roots) { - final RootItem item = new RootItem(root); - - if (root.isHome() && - !Shared.shouldShowDocumentsRoot(context, - ((Activity) context).getIntent())) { - continue; - } else if (root.isLibrary()) { - if (DEBUG) Log.d(TAG, "Adding " + root + " as library."); - libraries.add(item); - } else { - if (DEBUG) Log.d(TAG, "Adding " + root + " as non-library."); - others.add(item); - } - } - - final RootComparator comp = new RootComparator(); - Collections.sort(libraries, comp); - Collections.sort(others, comp); - - addAll(libraries); - // Only add the spacer if it is actually separating something. - if (!libraries.isEmpty() && !others.isEmpty()) { - add(new SpacerItem()); - } - addAll(others); - - // Include apps that can handle this intent too. - if (handlerAppIntent != null) { - includeHandlerApps(context, handlerAppIntent); - } - - mDragListener = dragListener; - } - - /** - * Adds apps capable of handling the original intent will be included in list of roots (in - * special section at bottom). - */ - private void includeHandlerApps(Context context, Intent handlerAppIntent) { - final PackageManager pm = context.getPackageManager(); - final List<ResolveInfo> infos = pm.queryIntentActivities( - handlerAppIntent, PackageManager.MATCH_DEFAULT_ONLY); - - final List<AppItem> apps = new ArrayList<>(); - - // Omit ourselves from the list - for (ResolveInfo info : infos) { - if (!context.getPackageName().equals(info.activityInfo.packageName)) { - apps.add(new AppItem(info)); - } - } - - if (apps.size() > 0) { - add(new SpacerItem()); - addAll(apps); - } - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public long getItemId(int position) { - // Ensure this method is only called in main thread because we don't have any - // concurrency protection. - assert(Looper.myLooper() == Looper.getMainLooper()); - - String stringId = getItem(position).mStringId; - - long id; - if (sIdMap.containsKey(stringId)) { - id = sIdMap.get(stringId); - } else { - id = sNextAvailableId++; - sIdMap.put(stringId, id); - } - - return id; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - final Item item = getItem(position); - final View view = item.getView(convertView, parent); - - if (item.isDropTarget()) { - view.setTag(R.id.item_position_tag, position); - view.setOnDragListener(mDragListener); - } else { - view.setTag(R.id.item_position_tag, null); - view.setOnDragListener(null); - } - return view; - } - - @Override - public boolean areAllItemsEnabled() { - return false; - } - - @Override - public boolean isEnabled(int position) { - return getItemViewType(position) != 1; - } - - @Override - public int getItemViewType(int position) { - final Item item = getItem(position); - if (item instanceof RootItem || item instanceof AppItem) { - return 0; - } else { - return 1; - } - } - - @Override - public int getViewTypeCount() { - return 2; - } - } - - public static class RootComparator implements Comparator<RootItem> { - @Override - public int compare(RootItem lhs, RootItem rhs) { - return lhs.root.compareTo(rhs.root); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsList.java b/packages/DocumentsUI/src/com/android/documentsui/RootsList.java deleted file mode 100644 index bf03ffd1e6d6..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsList.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.documentsui; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.KeyEvent; -import android.widget.ListView; - -/** - * The list in the navigation drawer. This class exists for the purpose of overriding the key - * handler on ListView. Ignoring keystrokes (e.g. the tab key) cannot be properly done using - * View.OnKeyListener. - */ -public class RootsList extends ListView { - - // Multiple constructors are needed to handle all the different ways this View could be - // constructed by the framework. Don't remove them! - public RootsList(Context context) { - super(context); - } - - public RootsList(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - public RootsList(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public RootsList(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - switch (keyCode) { - // Ignore tab key events - this causes them to bubble up to the global key handler where - // they are appropriately handled. See BaseActivity.onKeyDown. - case KeyEvent.KEYCODE_TAB: - return false; - // Prevent left/right arrow keystrokes from shifting focus away from the roots list. - case KeyEvent.KEYCODE_DPAD_LEFT: - case KeyEvent.KEYCODE_DPAD_RIGHT: - return true; - default: - return super.onKeyDown(keyCode, event); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RootsLoader.java deleted file mode 100644 index 5c4ccdddc39d..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsLoader.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.AsyncTaskLoader; -import android.content.Context; - -import com.android.documentsui.model.RootInfo; - -import java.util.Collection; - -public class RootsLoader extends AsyncTaskLoader<Collection<RootInfo>> { - private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver(); - - private final RootsCache mRoots; - private final State mState; - - private Collection<RootInfo> mResult; - - public RootsLoader(Context context, RootsCache roots, State state) { - super(context); - mRoots = roots; - mState = state; - - getContext().getContentResolver() - .registerContentObserver(RootsCache.sNotificationUri, false, mObserver); - } - - @Override - public final Collection<RootInfo> loadInBackground() { - return mRoots.getMatchingRootsBlocking(mState); - } - - @Override - public void deliverResult(Collection<RootInfo> result) { - if (isReset()) { - return; - } - - mResult = result; - - if (isStarted()) { - super.deliverResult(result); - } - } - - @Override - protected void onStartLoading() { - if (mResult != null) { - deliverResult(mResult); - } - if (takeContentChanged() || mResult == null) { - forceLoad(); - } - } - - @Override - protected void onStopLoading() { - cancelLoad(); - } - - @Override - protected void onReset() { - super.onReset(); - - // Ensure the loader is stopped - onStopLoading(); - - mResult = null; - - getContext().getContentResolver().unregisterContentObserver(mObserver); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java b/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java deleted file mode 100644 index a37590d2e0a6..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.app.Fragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.content.Context; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.ProgressBar; - -import com.android.documentsui.model.DocumentInfo; - -/** - * Display document title editor and save button. - */ -public class SaveFragment extends Fragment { - public static final String TAG = "SaveFragment"; - - private DocumentInfo mReplaceTarget; - private EditText mDisplayName; - private Button mSave; - private ProgressBar mProgress; - private boolean mIgnoreNextEdit; - - private static final String EXTRA_MIME_TYPE = "mime_type"; - private static final String EXTRA_DISPLAY_NAME = "display_name"; - - public static void show(FragmentManager fm, String mimeType, String displayName) { - final Bundle args = new Bundle(); - args.putString(EXTRA_MIME_TYPE, mimeType); - args.putString(EXTRA_DISPLAY_NAME, displayName); - - final SaveFragment fragment = new SaveFragment(); - fragment.setArguments(args); - - final FragmentTransaction ft = fm.beginTransaction(); - ft.replace(R.id.container_save, fragment, TAG); - ft.commitAllowingStateLoss(); - } - - public static SaveFragment get(FragmentManager fm) { - return (SaveFragment) fm.findFragmentByTag(TAG); - } - - @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final Context context = inflater.getContext(); - - final View view = inflater.inflate(R.layout.fragment_save, container, false); - - final ImageView icon = (ImageView) view.findViewById(android.R.id.icon); - icon.setImageDrawable( - IconUtils.loadMimeIcon(context, getArguments().getString(EXTRA_MIME_TYPE))); - - mDisplayName = (EditText) view.findViewById(android.R.id.title); - mDisplayName.addTextChangedListener(mDisplayNameWatcher); - mDisplayName.setText(getArguments().getString(EXTRA_DISPLAY_NAME)); - mDisplayName.setOnKeyListener( - new View.OnKeyListener() { - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - // Only handle key-down events. This is simpler, consistent with most other - // UIs, and enables the handling of repeated key events from holding down a - // key. - if (event.getAction() != KeyEvent.ACTION_DOWN) { - return false; - } - - // Returning false in this method will bubble the event up to - // {@link BaseActivity#onKeyDown}. In order to prevent backspace popping - // documents once the textView is empty, we are going to trap it here. - if (keyCode == KeyEvent.KEYCODE_DEL - && TextUtils.isEmpty(mDisplayName.getText())) { - return true; - } - - if (keyCode == KeyEvent.KEYCODE_ENTER && mSave.isEnabled()) { - performSave(); - return true; - } - return false; - } - }); - - mSave = (Button) view.findViewById(android.R.id.button1); - mSave.setOnClickListener(mSaveListener); - mSave.setEnabled(false); - - mProgress = (ProgressBar) view.findViewById(android.R.id.progress); - - return view; - } - - private TextWatcher mDisplayNameWatcher = new TextWatcher() { - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - if (mIgnoreNextEdit) { - mIgnoreNextEdit = false; - } else { - mReplaceTarget = null; - } - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - // ignored - } - - @Override - public void afterTextChanged(Editable s) { - // ignored - } - }; - - private View.OnClickListener mSaveListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - performSave(); - } - - }; - - private void performSave() { - final DocumentsActivity activity = DocumentsActivity.get(SaveFragment.this); - if (mReplaceTarget != null) { - activity.onSaveRequested(mReplaceTarget); - } else { - final String mimeType = getArguments().getString(EXTRA_MIME_TYPE); - final String displayName = mDisplayName.getText().toString(); - activity.onSaveRequested(mimeType, displayName); - } - } - - /** - * Set given document as target for in-place writing if user hits save - * without changing the filename. Can be set to {@code null} if user - * navigates outside the target directory. - */ - public void setReplaceTarget(DocumentInfo replaceTarget) { - mReplaceTarget = replaceTarget; - - if (mReplaceTarget != null) { - getArguments().putString(EXTRA_DISPLAY_NAME, replaceTarget.displayName); - mIgnoreNextEdit = true; - mDisplayName.setText(replaceTarget.displayName); - } - } - - public void prepareForDirectory(DocumentInfo cwd) { - setSaveEnabled(cwd != null && cwd.isCreateSupported()); - } - - private void setSaveEnabled(boolean enabled) { - mSave.setEnabled(enabled); - } - - public void setPending(boolean pending) { - mSave.setVisibility(pending ? View.INVISIBLE : View.VISIBLE); - mProgress.setVisibility(pending ? View.VISIBLE : View.GONE); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java b/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java deleted file mode 100644 index 46a14e644b03..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/SearchViewManager.java +++ /dev/null @@ -1,296 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; - -import android.annotation.Nullable; -import android.os.Bundle; -import android.provider.DocumentsContract.Root; -import android.text.TextUtils; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MenuItem.OnActionExpandListener; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnFocusChangeListener; -import android.widget.SearchView; -import android.widget.SearchView.OnQueryTextListener; - -import com.android.documentsui.model.RootInfo; - -/** - * Manages searching UI behavior. - */ -public class SearchViewManager implements - SearchView.OnCloseListener, OnQueryTextListener, OnClickListener, OnFocusChangeListener, - OnActionExpandListener { - - public interface SearchManagerListener { - void onSearchChanged(@Nullable String query); - void onSearchFinished(); - } - - private static final String TAG = "SearchManager"; - - private SearchManagerListener mListener; - private boolean mSearchExpanded; - private String mCurrentSearch; - private boolean mIgnoreNextClose; - private boolean mFullBar; - - private DocumentsToolbar mActionBar; - private MenuItem mMenuItem; - private SearchView mSearchView; - - public SearchViewManager(SearchManagerListener listener, @Nullable Bundle savedState) { - mListener = listener; - mCurrentSearch = savedState != null ? savedState.getString(Shared.EXTRA_QUERY) : null; - } - - public void setSearchMangerListener(SearchManagerListener listener) { - mListener = listener; - } - - public void install(DocumentsToolbar actionBar, boolean isFullBarSearch) { - mActionBar = actionBar; - mMenuItem = actionBar.getSearchMenu(); - mSearchView = (SearchView) mMenuItem.getActionView(); - - mSearchView.setOnQueryTextListener(this); - mSearchView.setOnCloseListener(this); - mSearchView.setOnSearchClickListener(this); - mSearchView.setOnQueryTextFocusChangeListener(this); - - mFullBar = isFullBarSearch; - if (mFullBar) { - mMenuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW - | MenuItem.SHOW_AS_ACTION_ALWAYS); - mMenuItem.setOnActionExpandListener(this); - } - - restoreSearch(); - } - - /** - * Used to hide menu icons, when the search is being restored. Needed because search restoration - * is done before onPrepareOptionsMenu(Menu menu) that is overriding the icons visibility. - */ - public void updateMenu() { - if (isSearching() && mFullBar) { - Menu menu = mActionBar.getMenu(); - menu.setGroupVisible(R.id.group_hide_when_searching, false); - } - } - - /** - * @param root Info about the current directory. - */ - void update(RootInfo root) { - if (mMenuItem == null) { - if (DEBUG) Log.d(TAG, "update called before Search MenuItem installed."); - return; - } - - if (mCurrentSearch != null) { - mMenuItem.expandActionView(); - - mSearchView.setIconified(false); - mSearchView.clearFocus(); - mSearchView.setQuery(mCurrentSearch, false); - } else { - mSearchView.clearFocus(); - if (!mSearchView.isIconified()) { - mIgnoreNextClose = true; - mSearchView.setIconified(true); - } - - if (mMenuItem.isActionViewExpanded()) { - mMenuItem.collapseActionView(); - } - } - - showMenu(root != null - && ((root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0)); - } - - protected void showMenu(boolean visible) { - if (mMenuItem == null) { - if (DEBUG) Log.d(TAG, "showMenu called before Search MenuItem installed."); - return; - } - - if (!visible) { - mCurrentSearch = null; - } - - mMenuItem.setVisible(visible); - } - - /** - * Cancels current search operation. Triggers clearing and collapsing the SearchView. - * - * @return True if it cancels search. False if it does not operate search currently. - */ - boolean cancelSearch() { - if (isExpanded() || isSearching()) { - // If the query string is not empty search view won't get iconified - mSearchView.setQuery("", false); - - if (mFullBar) { - onClose(); - } else { - // Causes calling onClose(). onClose() is triggering directory content update. - mSearchView.setIconified(true); - } - return true; - } - return false; - } - - /** - * Sets search view into the searching state. Used to restore state after device orientation - * change. - */ - private void restoreSearch() { - if (isSearching()) { - if(mFullBar) { - mMenuItem.expandActionView(); - } else { - mSearchView.setIconified(false); - } - onSearchExpanded(); - mSearchView.setQuery(mCurrentSearch, false); - mSearchView.clearFocus(); - } - } - - private void onSearchExpanded() { - mSearchExpanded = true; - if(mFullBar) { - Menu menu = mActionBar.getMenu(); - menu.setGroupVisible(R.id.group_hide_when_searching, false); - } - } - - /** - * Clears the search. Triggers refreshing of the directory content. - * @return True if the default behavior of clearing/dismissing SearchView should be overridden. - * False otherwise. - */ - @Override - public boolean onClose() { - mSearchExpanded = false; - if (mIgnoreNextClose) { - mIgnoreNextClose = false; - return false; - } - - // Refresh the directory if a search was done - if (mCurrentSearch != null) { - mCurrentSearch = null; - if (mListener != null) { - mListener.onSearchChanged(mCurrentSearch); - } - } - - if(mFullBar) { - mMenuItem.collapseActionView(); - } - mListener.onSearchFinished(); - - return false; - } - - /** - * Called when owning activity is saving state to be used to restore state during creation. - * @param state Bundle to save state too - */ - public void onSaveInstanceState(Bundle state) { - state.putString(Shared.EXTRA_QUERY, mCurrentSearch); - } - - /** - * Sets mSearchExpanded. Called when search icon is clicked to start search for both search view - * modes. - */ - @Override - public void onClick(View v) { - onSearchExpanded(); - } - - @Override - public boolean onQueryTextSubmit(String query) { - mCurrentSearch = query; - mSearchView.clearFocus(); - if (mListener != null) { - mListener.onSearchChanged(mCurrentSearch); - } - return true; - } - - /** - * Used to detect and handle back button pressed event when search is expanded. - */ - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (!hasFocus) { - if (mCurrentSearch == null) { - mSearchView.setIconified(true); - } else if (TextUtils.isEmpty(mSearchView.getQuery())) { - cancelSearch(); - } - } - } - - @Override - public boolean onQueryTextChange(String newText) { - return false; - } - - @Override - public boolean onMenuItemActionCollapse(MenuItem item) { - Menu menu = mActionBar.getMenu(); - menu.setGroupVisible(R.id.group_hide_when_searching, true); - - // Handles case when search view is collapsed by using the arrow on the left of the bar - if (isExpanded() || isSearching()) { - cancelSearch(); - return false; - } - return true; - } - - @Override - public boolean onMenuItemActionExpand(MenuItem item) { - return true; - } - - String getCurrentSearch() { - return mCurrentSearch; - } - - boolean isSearching() { - return mCurrentSearch != null; - } - - boolean isExpanded() { - return mSearchExpanded; - } - -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/SectionedListAdapter.java b/packages/DocumentsUI/src/com/android/documentsui/SectionedListAdapter.java deleted file mode 100644 index ae959f91dec0..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/SectionedListAdapter.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.ListAdapter; - -import java.util.ArrayList; - -/** - * Adapter that combines multiple adapters as sections, asking each section to - * provide a header, and correctly handling item types across child adapters. - */ -public class SectionedListAdapter extends BaseAdapter { - private ArrayList<SectionAdapter> mSections = new ArrayList<>(); - - public interface SectionAdapter extends ListAdapter { - public View getHeaderView(View convertView, ViewGroup parent); - } - - public void clearSections() { - mSections.clear(); - notifyDataSetChanged(); - } - - /** - * After mutating sections, you <em>must</em> - * {@link AdapterView#setAdapter(android.widget.Adapter)} to correctly - * recount view types. - */ - public void addSection(SectionAdapter adapter) { - mSections.add(adapter); - notifyDataSetChanged(); - } - - @Override - public int getCount() { - int count = 0; - final int size = mSections.size(); - for (int i = 0; i < size; i++) { - count += mSections.get(i).getCount() + 1; - } - return count; - } - - @Override - public Object getItem(int position) { - final int size = mSections.size(); - for (int i = 0; i < size; i++) { - final SectionAdapter section = mSections.get(i); - final int sectionSize = section.getCount() + 1; - - // Check if position inside this section - if (position == 0) { - return section; - } else if (position < sectionSize) { - return section.getItem(position - 1); - } - - // Otherwise jump into next section - position -= sectionSize; - } - throw new IllegalStateException("Unknown position " + position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - final int size = mSections.size(); - for (int i = 0; i < size; i++) { - final SectionAdapter section = mSections.get(i); - final int sectionSize = section.getCount() + 1; - - // Check if position inside this section - if (position == 0) { - return section.getHeaderView(convertView, parent); - } else if (position < sectionSize) { - return section.getView(position - 1, convertView, parent); - } - - // Otherwise jump into next section - position -= sectionSize; - } - throw new IllegalStateException("Unknown position " + position); - } - - @Override - public boolean areAllItemsEnabled() { - return false; - } - - @Override - public boolean isEnabled(int position) { - final int size = mSections.size(); - for (int i = 0; i < size; i++) { - final SectionAdapter section = mSections.get(i); - final int sectionSize = section.getCount() + 1; - - // Check if position inside this section - if (position == 0) { - return false; - } else if (position < sectionSize) { - return section.isEnabled(position - 1); - } - - // Otherwise jump into next section - position -= sectionSize; - } - throw new IllegalStateException("Unknown position " + position); - } - - @Override - public int getItemViewType(int position) { - int type = 1; - final int size = mSections.size(); - for (int i = 0; i < size; i++) { - final SectionAdapter section = mSections.get(i); - final int sectionSize = section.getCount() + 1; - - // Check if position inside this section - if (position == 0) { - return 0; - } else if (position < sectionSize) { - return type + section.getItemViewType(position - 1); - } - - // Otherwise jump into next section - position -= sectionSize; - type += section.getViewTypeCount(); - } - throw new IllegalStateException("Unknown position " + position); - } - - @Override - public int getViewTypeCount() { - int count = 1; - final int size = mSections.size(); - for (int i = 0; i < size; i++) { - count += mSections.get(i).getViewTypeCount(); - } - return count; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/Shared.java b/packages/DocumentsUI/src/com/android/documentsui/Shared.java deleted file mode 100644 index c1db87d507e0..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/Shared.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.os.Looper; -import android.provider.DocumentsContract; -import android.text.TextUtils; -import android.text.format.DateUtils; -import android.text.format.Time; -import android.util.Log; -import android.view.WindowManager; - -import java.text.Collator; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nullable; - -/** @hide */ -public final class Shared { - - public static final String TAG = "Documents"; - - public static final boolean DEBUG = true; - - /** Intent action name to pick a copy destination. */ - public static final String ACTION_PICK_COPY_DESTINATION = - "com.android.documentsui.PICK_COPY_DESTINATION"; - - /** - * Extra flag allowing app to be opened in productivity mode (less downloadsy). - * Useful developers and the likes. When set to true overrides the default - * config value of productivity_device. - */ - public static final String EXTRA_PRODUCTIVITY_MODE = "com.android.documentsui.PRODUCTIVITY"; - - /** - * Extra boolean flag for {@link ACTION_PICK_COPY_DESTINATION}, which - * specifies if the destination directory needs to create new directory or not. - */ - public static final String EXTRA_DIRECTORY_COPY = "com.android.documentsui.DIRECTORY_COPY"; - - /** - * Extra flag used to store the current stack so user opens in right spot. - */ - public static final String EXTRA_STACK = "com.android.documentsui.STACK"; - - /** - * Extra flag used to store query of type String in the bundle. - */ - public static final String EXTRA_QUERY = "query"; - - /** - * Extra flag used to store state of type State in the bundle. - */ - public static final String EXTRA_STATE = "state"; - - /** - * Extra flag used to store type of DirectoryFragment's type ResultType type in the bundle. - */ - public static final String EXTRA_TYPE = "type"; - - /** - * Extra flag used to store root of type RootInfo in the bundle. - */ - public static final String EXTRA_ROOT = "root"; - - /** - * Extra flag used to store document of DocumentInfo type in the bundle. - */ - public static final String EXTRA_DOC = "document"; - - /** - * Extra flag used to store DirectoryFragment's selection of Selection type in the bundle. - */ - public static final String EXTRA_SELECTION = "selection"; - - /** - * Extra flag used to store DirectoryFragment's search mode of boolean type in the bundle. - */ - public static final String EXTRA_SEARCH_MODE = "searchMode"; - - /** - * Extra flag used to store DirectoryFragment's ignore state of boolean type in the bundle. - */ - public static final String EXTRA_IGNORE_STATE = "ignoreState"; - - /** - * Extra for an Intent for enabling performance benchmark. Used only by tests. - */ - public static final String EXTRA_BENCHMARK = "com.android.documentsui.benchmark"; - - /** - * Maximum number of items in a Binder transaction packet. - */ - public static final int MAX_DOCS_IN_INTENT = 500; - - private static final Collator sCollator; - - static { - sCollator = Collator.getInstance(); - sCollator.setStrength(Collator.SECONDARY); - } - - /** - * Generates a formatted quantity string. - */ - public static final String getQuantityString(Context context, int resourceId, int quantity) { - return context.getResources().getQuantityString(resourceId, quantity, quantity); - } - - public static String formatTime(Context context, long when) { - // TODO: DateUtils should make this easier - Time then = new Time(); - then.set(when); - Time now = new Time(); - now.setToNow(); - - int flags = DateUtils.FORMAT_NO_NOON | DateUtils.FORMAT_NO_MIDNIGHT - | DateUtils.FORMAT_ABBREV_ALL; - - if (then.year != now.year) { - flags |= DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE; - } else if (then.yearDay != now.yearDay) { - flags |= DateUtils.FORMAT_SHOW_DATE; - } else { - flags |= DateUtils.FORMAT_SHOW_TIME; - } - - return DateUtils.formatDateTime(context, when, flags); - } - - /** - * A convenient way to transform any list into a (parcelable) ArrayList. - * Uses cast if possible, else creates a new list with entries from {@code list}. - */ - public static <T> ArrayList<T> asArrayList(List<T> list) { - return list instanceof ArrayList - ? (ArrayList<T>) list - : new ArrayList<T>(list); - } - - /** - * Compare two strings against each other using system default collator in a - * case-insensitive mode. Clusters strings prefixed with {@link DIR_PREFIX} - * before other items. - */ - public static int compareToIgnoreCaseNullable(String lhs, String rhs) { - final boolean leftEmpty = TextUtils.isEmpty(lhs); - final boolean rightEmpty = TextUtils.isEmpty(rhs); - - if (leftEmpty && rightEmpty) return 0; - if (leftEmpty) return -1; - if (rightEmpty) return 1; - - return sCollator.compare(lhs, rhs); - } - - public static boolean isHardwareKeyboardAvailable(Context context) { - return context.getResources().getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS; - } - - public static void ensureKeyboardPresent(Context context, AlertDialog dialog) { - if (!isHardwareKeyboardAvailable(context)) { - dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); - } - } - - /* - * Returns true if app is running in "productivity mode". - */ - private static boolean isProductivityMode(Context context, Intent intent) { - return intent.getBooleanExtra( - Shared.EXTRA_PRODUCTIVITY_MODE, - context.getResources().getBoolean(R.bool.productivity_device)); - } - - /* - * Returns true if "Documents" root should be shown. - */ - public static boolean shouldShowDocumentsRoot(Context context, Intent intent) { - return isProductivityMode(context, intent); - } - - /* - * Returns true if device root should be shown. - */ - public static boolean shouldShowDeviceRoot(Context context, Intent intent) { - return isProductivityMode(context, intent) - || intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, false); - } - - /** - * Returns true if device root should be shown. - */ - public static boolean shouldShowFancyFeatures(Activity activity) { - Intent intent = activity.getIntent(); - return isProductivityMode(activity, intent) - || intent.getBooleanExtra(DocumentsContract.EXTRA_FANCY_FEATURES, false); - } - - public static void checkMainLoop() { - if (Looper.getMainLooper() != Looper.myLooper()) { - Log.e(TAG, "Calling from non-UI thread!"); - } - } - - public static @Nullable <T> T findView(Activity activity, int... resources) { - for (int id : resources) { - @SuppressWarnings("unchecked") - T r = (T) activity.findViewById(id); - if (r != null) { - return r; - } - } - return null; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java b/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java deleted file mode 100644 index c3a82d779555..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/Snackbars.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.annotation.StringRes; -import android.app.Activity; -import android.support.design.widget.Snackbar; -import android.view.View; - -public final class Snackbars { - private Snackbars() {} - - public static final void showDocumentsClipped(Activity activity, int docCount) { - String msg = Shared.getQuantityString( - activity, R.plurals.clipboard_files_clipped, docCount); - Snackbars.makeSnackbar(activity, msg, Snackbar.LENGTH_SHORT).show(); - } - - public static final void showMove(Activity activity, int docCount) { - CharSequence message = Shared.getQuantityString(activity, R.plurals.move_begin, docCount); - makeSnackbar(activity, message, Snackbar.LENGTH_SHORT).show(); - } - - public static final void showCopy(Activity activity, int docCount) { - CharSequence message = Shared.getQuantityString(activity, R.plurals.copy_begin, docCount); - makeSnackbar(activity, message, Snackbar.LENGTH_SHORT).show(); - } - - public static final void showPasteFailed(Activity activity) { - makeSnackbar(activity, R.string.clipboard_files_cannot_paste, Snackbar.LENGTH_SHORT).show(); - } - - public static final Snackbar makeSnackbar(Activity activity, @StringRes int messageId, - int duration) { - return Snackbars.makeSnackbar( - activity, activity.getResources().getText(messageId), duration); - } - - public static final Snackbar makeSnackbar( - Activity activity, CharSequence message, int duration) { - final View view = activity.findViewById(R.id.coordinator_layout); - return Snackbar.make(view, message, duration); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/State.java b/packages/DocumentsUI/src/com/android/documentsui/State.java deleted file mode 100644 index 9cdf1a804ced..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/State.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.Shared.DEBUG; - -import android.annotation.IntDef; -import android.content.Intent; -import android.os.Parcel; -import android.os.Parcelable; -import android.util.Log; -import android.util.SparseArray; - -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.DurableUtils; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperationService; -import com.android.documentsui.services.FileOperationService.OpType; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class State implements android.os.Parcelable { - - private static final String TAG = "State"; - - @IntDef(flag = true, value = { - ACTION_BROWSE, - ACTION_PICK_COPY_DESTINATION, - ACTION_OPEN, - ACTION_CREATE, - ACTION_GET_CONTENT, - ACTION_OPEN_TREE - }) - @Retention(RetentionPolicy.SOURCE) - public @interface ActionType {} - // File manager and related private picking activity. - public static final int ACTION_BROWSE = 1; - public static final int ACTION_PICK_COPY_DESTINATION = 2; - // All public picking activities - public static final int ACTION_OPEN = 3; - public static final int ACTION_CREATE = 4; - public static final int ACTION_GET_CONTENT = 5; - public static final int ACTION_OPEN_TREE = 6; - - @IntDef(flag = true, value = { - MODE_UNKNOWN, - MODE_LIST, - MODE_GRID - }) - @Retention(RetentionPolicy.SOURCE) - public @interface ViewMode {} - public static final int MODE_UNKNOWN = 0; - public static final int MODE_LIST = 1; - public static final int MODE_GRID = 2; - - public static final int SORT_ORDER_UNKNOWN = 0; - public static final int SORT_ORDER_DISPLAY_NAME = 1; - public static final int SORT_ORDER_LAST_MODIFIED = 2; - public static final int SORT_ORDER_SIZE = 3; - - public @ActionType int action; - public String[] acceptMimes; - - /** Derived from local preferences */ - public @ViewMode int derivedMode = MODE_GRID; - - /** Explicit user choice */ - public int userSortOrder = SORT_ORDER_UNKNOWN; - /** Derived after loader */ - public int derivedSortOrder = SORT_ORDER_DISPLAY_NAME; - - public boolean allowMultiple; - public boolean forceSize; - public boolean showSize; - public boolean localOnly; - public boolean showAdvancedOption; - public boolean showAdvanced; - public boolean restored; - /* - * Indicates handler was an external app, like photos. - */ - public boolean external; - - // Indicates that a copy operation (or move) includes a directory. - // Why? Directory creation isn't supported by some roots (like Downloads). - // This allows us to restrict available roots to just those with support. - public boolean directoryCopy; - public boolean openableOnly; - - /** - * This is basically a sub-type for the copy operation. It can be either COPY or MOVE. - * The only legal values, if set, are: OPERATION_COPY, OPERATION_MOVE. Other pick - * operations don't use this. In those cases OPERATION_UNKNOWN is also legal. - */ - public @OpType int copyOperationSubType = FileOperationService.OPERATION_UNKNOWN; - - /** Current user navigation stack; empty implies recents. */ - public DocumentStack stack = new DocumentStack(); - private boolean mStackTouched; - private boolean mInitialRootChanged; - private boolean mInitialDocChanged; - - /** Instance state for every shown directory */ - public HashMap<String, SparseArray<Parcelable>> dirState = new HashMap<>(); - - /** Name of the package that started DocsUI */ - public List<String> excludedAuthorities = new ArrayList<>(); - - public void initAcceptMimes(Intent intent) { - if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) { - acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES); - } else { - String glob = intent.getType(); - acceptMimes = new String[] { glob != null ? glob : "*/*" }; - } - } - - public void onRootChanged(RootInfo root) { - if (DEBUG) Log.d(TAG, "Root changed to: " + root); - if (!mInitialRootChanged && stack.root != null && !root.equals(stack.root)) { - mInitialRootChanged = true; - } - stack.root = root; - stack.clear(); - mStackTouched = true; - } - - public void pushDocument(DocumentInfo info) { - if (DEBUG) Log.d(TAG, "Adding doc to stack: " + info); - if (!mInitialDocChanged && stack.size() > 0 && !info.equals(stack.peek())) { - mInitialDocChanged = true; - } - stack.push(info); - mStackTouched = true; - } - - public void popDocument() { - if (DEBUG) Log.d(TAG, "Popping doc off stack."); - stack.pop(); - mStackTouched = true; - } - - public void setStack(DocumentStack stack) { - if (DEBUG) Log.d(TAG, "Setting the whole darn stack to: " + stack); - this.stack = stack; - mStackTouched = true; - } - - // This will return true even when the initial location is set. - // To get a read on if the user has changed something, use #hasInitialLocationChanged. - public boolean hasLocationChanged() { - return mStackTouched; - } - - public boolean hasInitialLocationChanged() { - return mInitialRootChanged || mInitialDocChanged; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel out, int flags) { - out.writeInt(action); - out.writeStringArray(acceptMimes); - out.writeInt(userSortOrder); - out.writeInt(allowMultiple ? 1 : 0); - out.writeInt(forceSize ? 1 : 0); - out.writeInt(showSize ? 1 : 0); - out.writeInt(localOnly ? 1 : 0); - out.writeInt(showAdvancedOption ? 1 : 0); - out.writeInt(showAdvanced ? 1 : 0); - out.writeInt(restored ? 1 : 0); - out.writeInt(external ? 1 : 0); - DurableUtils.writeToParcel(out, stack); - out.writeMap(dirState); - out.writeList(excludedAuthorities); - out.writeInt(openableOnly ? 1 : 0); - out.writeInt(mStackTouched ? 1 : 0); - out.writeInt(mInitialRootChanged ? 1 : 0); - out.writeInt(mInitialDocChanged ? 1 : 0); - } - - public static final ClassLoaderCreator<State> CREATOR = new ClassLoaderCreator<State>() { - @Override - public State createFromParcel(Parcel in) { - return createFromParcel(in, null); - } - - @Override - public State createFromParcel(Parcel in, ClassLoader loader) { - final State state = new State(); - state.action = in.readInt(); - state.acceptMimes = in.readStringArray(); - state.userSortOrder = in.readInt(); - state.allowMultiple = in.readInt() != 0; - state.forceSize = in.readInt() != 0; - state.showSize = in.readInt() != 0; - state.localOnly = in.readInt() != 0; - state.showAdvancedOption = in.readInt() != 0; - state.showAdvanced = in.readInt() != 0; - state.restored = in.readInt() != 0; - state.external = in.readInt() != 0; - DurableUtils.readFromParcel(in, state.stack); - in.readMap(state.dirState, loader); - in.readList(state.excludedAuthorities, loader); - state.openableOnly = in.readInt() != 0; - state.mStackTouched = in.readInt() != 0; - state.mInitialRootChanged = in.readInt() != 0; - state.mInitialDocChanged = in.readInt() != 0; - return state; - } - - @Override - public State[] newArray(int size) { - return new State[size]; - } - }; -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/ThumbnailCache.java b/packages/DocumentsUI/src/com/android/documentsui/ThumbnailCache.java deleted file mode 100644 index 639d4fb4feb3..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/ThumbnailCache.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.annotation.IntDef; -import android.annotation.Nullable; -import android.content.ComponentCallbacks2; -import android.graphics.Bitmap; -import android.graphics.Point; -import android.net.Uri; -import android.util.LruCache; -import android.util.Pair; -import android.util.Pools; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.Comparator; -import java.util.HashMap; -import java.util.TreeMap; - -/** - * An LRU cache that supports finding the thumbnail of the requested uri with a different size than - * the requested one. - */ -public class ThumbnailCache { - - private static final SizeComparator SIZE_COMPARATOR = new SizeComparator(); - - /** - * A 2-dimensional index into {@link #mCache} entries. Pair<Uri, Point> is the key to - * {@link #mCache}. TreeMap is used to search the closest size to a given size and a given uri. - */ - private final HashMap<Uri, TreeMap<Point, Pair<Uri, Point>>> mSizeIndex; - private final Cache mCache; - - /** - * Creates a thumbnail LRU cache. - * - * @param maxCacheSizeInBytes the maximum size of thumbnails in bytes this cache can hold. - */ - public ThumbnailCache(int maxCacheSizeInBytes) { - mSizeIndex = new HashMap<>(); - mCache = new Cache(maxCacheSizeInBytes); - } - - /** - * Obtains thumbnail given a uri and a size. - * - * @param uri the uri of the thumbnail in need - * @param size the desired size of the thumbnail - * @return the thumbnail result - */ - public Result getThumbnail(Uri uri, Point size) { - TreeMap<Point, Pair<Uri, Point>> sizeMap; - sizeMap = mSizeIndex.get(uri); - if (sizeMap == null || sizeMap.isEmpty()) { - // There is not any thumbnail for this uri. - return Result.obtainMiss(); - } - - // Look for thumbnail of the same size. - Pair<Uri, Point> cacheKey = sizeMap.get(size); - if (cacheKey != null) { - Entry entry = mCache.get(cacheKey); - if (entry != null) { - return Result.obtain(Result.CACHE_HIT_EXACT, size, entry); - } - } - - // Look for thumbnail of bigger sizes. - Point otherSize = sizeMap.higherKey(size); - if (otherSize != null) { - cacheKey = sizeMap.get(otherSize); - - if (cacheKey != null) { - Entry entry = mCache.get(cacheKey); - if (entry != null) { - return Result.obtain(Result.CACHE_HIT_LARGER, otherSize, entry); - } - } - } - - // Look for thumbnail of smaller sizes. - otherSize = sizeMap.lowerKey(size); - if (otherSize != null) { - cacheKey = sizeMap.get(otherSize); - - if (cacheKey != null) { - Entry entry = mCache.get(cacheKey); - if (entry != null) { - return Result.obtain(Result.CACHE_HIT_SMALLER, otherSize, entry); - } - } - } - - // Cache miss. - return Result.obtainMiss(); - } - - /** - * Puts a thumbnail for the given uri and size in to the cache. - * @param uri the uri of the thumbnail - * @param size the size of the thumbnail - * @param thumbnail the thumbnail to put in cache - * @param lastModified last modified value of the thumbnail to track its validity - */ - public void putThumbnail(Uri uri, Point size, Bitmap thumbnail, long lastModified) { - Pair<Uri, Point> cacheKey = Pair.create(uri, size); - - TreeMap<Point, Pair<Uri, Point>> sizeMap; - synchronized (mSizeIndex) { - sizeMap = mSizeIndex.get(uri); - if (sizeMap == null) { - sizeMap = new TreeMap<>(SIZE_COMPARATOR); - mSizeIndex.put(uri, sizeMap); - } - } - - Entry entry = new Entry(thumbnail, lastModified); - mCache.put(cacheKey, entry); - synchronized (sizeMap) { - sizeMap.put(size, cacheKey); - } - } - - /** - * Removes all thumbnail cache associated to the given uri. - * @param uri the uri which thumbnail cache to remove - */ - public void removeUri(Uri uri) { - TreeMap<Point, Pair<Uri, Point>> sizeMap; - synchronized (mSizeIndex) { - sizeMap = mSizeIndex.get(uri); - } - - if (sizeMap != null) { - // Create an array to hold all values to avoid ConcurrentModificationException because - // removeKey() will be called by LruCache but we can't modify the map while we're - // iterating over the collection of values. - for (Pair<Uri, Point> index : sizeMap.values().toArray(new Pair[0])) { - mCache.remove(index); - } - } - } - - private void removeKey(Uri uri, Point size) { - TreeMap<Point, Pair<Uri, Point>> sizeMap; - synchronized (mSizeIndex) { - sizeMap = mSizeIndex.get(uri); - } - - assert(sizeMap != null); - synchronized (sizeMap) { - sizeMap.remove(size); - } - } - - public void onTrimMemory(int level) { - if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) { - mCache.evictAll(); - } else if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) { - mCache.trimToSize(mCache.size() / 2); - } - } - - /** - * A class that holds thumbnail and cache status. - */ - public static final class Result { - - @Retention(RetentionPolicy.SOURCE) - @IntDef({CACHE_MISS, CACHE_HIT_EXACT, CACHE_HIT_SMALLER, CACHE_HIT_LARGER}) - @interface Status {} - /** - * Indicates there is no thumbnail for the requested uri. The thumbnail will be null. - */ - public static final int CACHE_MISS = 0; - /** - * Indicates the thumbnail matches the requested size and requested uri. - */ - public static final int CACHE_HIT_EXACT = 1; - /** - * Indicates the thumbnail is in a smaller size than the requested one from the requested - * uri. - */ - public static final int CACHE_HIT_SMALLER = 2; - /** - * Indicates the thumbnail is in a larger size than the requested one from the requested - * uri. - */ - public static final int CACHE_HIT_LARGER = 3; - - private static final Pools.SimplePool<Result> sPool = new Pools.SimplePool<>(1); - - private @Status int mStatus; - private @Nullable Bitmap mThumbnail; - private @Nullable Point mSize; - private long mLastModified; - - private static Result obtainMiss() { - return obtain(CACHE_MISS, null, null, 0); - } - - private static Result obtain(@Status int status, Point size, Entry entry) { - return obtain(status, entry.mThumbnail, size, entry.mLastModified); - } - - private static Result obtain(@Status int status, @Nullable Bitmap thumbnail, - @Nullable Point size, long lastModified) { - Shared.checkMainLoop(); - - Result instance = sPool.acquire(); - instance = (instance != null ? instance : new Result()); - - instance.mStatus = status; - instance.mThumbnail = thumbnail; - instance.mSize = size; - instance.mLastModified = lastModified; - - return instance; - } - - private Result() {} - - public void recycle() { - Shared.checkMainLoop(); - - mStatus = -1; - mThumbnail = null; - mSize = null; - mLastModified = -1; - - boolean released = sPool.release(this); - // This assert is used to guarantee we won't generate too many instances that can't be - // held in the pool, which indicates our pool size is too small. - // - // Right now one instance is enough because we expect all instances are only used in - // main thread. - assert (released); - } - - public @Status int getStatus() { - return mStatus; - } - - public @Nullable Bitmap getThumbnail() { - return mThumbnail; - } - - public @Nullable Point getSize() { - return mSize; - } - - public long getLastModified() { - return mLastModified; - } - - public boolean isHit() { - return (mStatus != CACHE_MISS); - } - - public boolean isExactHit() { - return (mStatus == CACHE_HIT_EXACT); - } - } - - private static final class Entry { - private final Bitmap mThumbnail; - private final long mLastModified; - - private Entry(Bitmap thumbnail, long lastModified) { - mThumbnail = thumbnail; - mLastModified = lastModified; - } - } - - private final class Cache extends LruCache<Pair<Uri, Point>, Entry> { - - private Cache(int maxSizeBytes) { - super(maxSizeBytes); - } - - @Override - protected int sizeOf(Pair<Uri, Point> key, Entry value) { - return value.mThumbnail.getByteCount(); - } - - @Override - protected void entryRemoved( - boolean evicted, Pair<Uri, Point> key, Entry oldValue, Entry newValue) { - if (newValue == null) { - removeKey(key.first, key.second); - } - } - } - - private static final class SizeComparator implements Comparator<Point> { - @Override - public int compare(Point size0, Point size1) { - // Assume all sizes are roughly square, so we only compare them in one dimension. - return size0.x - size1.x; - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/UriDerivativeLoader.java b/packages/DocumentsUI/src/com/android/documentsui/UriDerivativeLoader.java deleted file mode 100644 index 7bb662c72cf5..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/UriDerivativeLoader.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.AsyncTaskLoader; -import android.content.Context; -import android.database.ContentObserver; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; - -/** - * Loader that derives its data from a Uri. Watches for {@link ContentObserver} - * changes while started, manages {@link CancellationSignal}, and caches - * returned results. - */ -public abstract class UriDerivativeLoader<Param, Res> extends AsyncTaskLoader<Res> { - final ForceLoadContentObserver mObserver; - - private final Param mParam; - - private Res mResult; - private CancellationSignal mCancellationSignal; - - @Override - public final Res loadInBackground() { - synchronized (this) { - if (isLoadInBackgroundCanceled()) { - throw new OperationCanceledException(); - } - mCancellationSignal = new CancellationSignal(); - } - try { - return loadInBackground(mParam, mCancellationSignal); - } finally { - synchronized (this) { - mCancellationSignal = null; - } - } - } - - public abstract Res loadInBackground(Param param, CancellationSignal signal); - - @Override - public void cancelLoadInBackground() { - super.cancelLoadInBackground(); - - synchronized (this) { - if (mCancellationSignal != null) { - mCancellationSignal.cancel(); - } - } - } - - @Override - public void deliverResult(Res result) { - if (isReset()) { - closeQuietly(result); - return; - } - Res oldResult = mResult; - mResult = result; - - if (isStarted()) { - super.deliverResult(result); - } - - if (oldResult != null && oldResult != result) { - closeQuietly(oldResult); - } - } - - public UriDerivativeLoader(Context context, Param param) { - super(context); - mObserver = new ForceLoadContentObserver(); - mParam = param; - } - - @Override - protected void onStartLoading() { - if (mResult != null) { - deliverResult(mResult); - } - if (takeContentChanged() || mResult == null) { - forceLoad(); - } - } - - @Override - protected void onStopLoading() { - cancelLoad(); - } - - @Override - public void onCanceled(Res result) { - closeQuietly(result); - } - - @Override - protected void onReset() { - super.onReset(); - - // Ensure the loader is stopped - onStopLoading(); - - closeQuietly(mResult); - mResult = null; - - getContext().getContentResolver().unregisterContentObserver(mObserver); - } - - private void closeQuietly(Res result) { - if (result instanceof AutoCloseable) { - try { - ((AutoCloseable) result).close(); - } catch (RuntimeException rethrown) { - throw rethrown; - } catch (Exception ignored) { - } - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/clipping/ClipStorage.java b/packages/DocumentsUI/src/com/android/documentsui/clipping/ClipStorage.java deleted file mode 100644 index 49edbcf904d5..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/clipping/ClipStorage.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.clipping; - -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.AsyncTask; -import android.support.annotation.VisibleForTesting; -import android.system.ErrnoException; -import android.system.Os; -import android.util.Log; - -import com.android.documentsui.Files; - -import java.io.Closeable; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.channels.FileLock; -import java.util.concurrent.TimeUnit; - -/** - * Provides support for storing lists of documents identified by Uri. - * - * This class uses a ring buffer to recycle clip file slots, to mitigate the issue of clip file - * deletions. Below is the directory layout: - * [cache dir] - * - [dir] 1 - * - [dir] 2 - * - ... to {@link #NUM_OF_SLOTS} - * When a clip data is actively being used: - * [cache dir] - * - [dir] 1 - * - [file] primary - * - [symlink] 1 > primary # copying to location X - * - [symlink] 2 > primary # copying to location Y - */ -public final class ClipStorage { - - public static final int NO_SELECTION_TAG = -1; - - public static final String PREF_NAME = "ClipStoragePref"; - - @VisibleForTesting - static final int NUM_OF_SLOTS = 20; - - private static final String TAG = "ClipStorage"; - - private static final long STALENESS_THRESHOLD = TimeUnit.DAYS.toMillis(2); - - private static final String NEXT_POS_TAG = "NextPosTag"; - private static final String PRIMARY_DATA_FILE_NAME = "primary"; - - private static final byte[] LINE_SEPARATOR = System.lineSeparator().getBytes(); - - private final File mOutDir; - private final SharedPreferences mPref; - - private final File[] mSlots = new File[NUM_OF_SLOTS]; - private int mNextPos; - - /** - * @param outDir see {@link #prepareStorage(File)}. - */ - public ClipStorage(File outDir, SharedPreferences pref) { - assert(outDir.isDirectory()); - mOutDir = outDir; - mPref = pref; - - mNextPos = mPref.getInt(NEXT_POS_TAG, 0); - } - - /** - * Tries to get the next available clip slot. It's guaranteed to return one. If none of - * slots is available, it returns the next slot of the most recently returned slot by this - * method. - * - * <p>This is not a perfect solution, but should be enough for most regular use. There are - * several situations this method may not work: - * <ul> - * <li>Making {@link #NUM_OF_SLOTS} - 1 times of large drag and drop or moveTo/copyTo/delete - * operations after cutting a primary clip, then the primary clip is overwritten.</li> - * <li>Having more than {@link #NUM_OF_SLOTS} queued jumbo file operations, one or more clip - * file may be overwritten.</li> - * </ul> - */ - synchronized int claimStorageSlot() { - int curPos = mNextPos; - for (int i = 0; i < NUM_OF_SLOTS; ++i, curPos = (curPos + 1) % NUM_OF_SLOTS) { - createSlotFileObject(curPos); - - if (!mSlots[curPos].exists()) { - break; - } - - // No file or only primary file exists, we deem it available. - if (mSlots[curPos].list().length <= 1) { - break; - } - // This slot doesn't seem available, but still need to check if it's a legacy of - // service being killed or a service crash etc. If it's stale, it's available. - else if (checkStaleFiles(curPos)) { - break; - } - } - - prepareSlot(curPos); - - mNextPos = (curPos + 1) % NUM_OF_SLOTS; - mPref.edit().putInt(NEXT_POS_TAG, mNextPos).commit(); - return curPos; - } - - private boolean checkStaleFiles(int pos) { - File slotData = toSlotDataFile(pos); - - // No need to check if the file exists. File.lastModified() returns 0L if the file doesn't - // exist. - return slotData.lastModified() + STALENESS_THRESHOLD <= System.currentTimeMillis(); - } - - private void prepareSlot(int pos) { - assert(mSlots[pos] != null); - - Files.deleteRecursively(mSlots[pos]); - mSlots[pos].mkdir(); - assert(mSlots[pos].isDirectory()); - } - - /** - * Returns a writer. Callers must close the writer when finished. - */ - private Writer createWriter(int tag) throws IOException { - File file = toSlotDataFile(tag); - return new Writer(file); - } - - /** - * Gets a {@link File} instance given a tag. - * - * This method creates a symbolic link in the slot folder to the data file as a reference - * counting method. When someone is done using this symlink, it's responsible to delete it. - * Therefore we can have a neat way to track how many things are still using this slot. - */ - public synchronized File getFile(int tag) throws IOException { - createSlotFileObject(tag); - - File primary = toSlotDataFile(tag); - - String linkFileName = Integer.toString(mSlots[tag].list().length); - File link = new File(mSlots[tag], linkFileName); - - try { - Os.symlink(primary.getAbsolutePath(), link.getAbsolutePath()); - } catch (ErrnoException e) { - e.rethrowAsIOException(); - } - return link; - } - - /** - * Returns a Reader. Callers must close the reader when finished. - */ - ClipStorageReader createReader(File file) throws IOException { - assert(file.getParentFile().getParentFile().equals(mOutDir)); - return new ClipStorageReader(file); - } - - private File toSlotDataFile(int pos) { - assert(mSlots[pos] != null); - return new File(mSlots[pos], PRIMARY_DATA_FILE_NAME); - } - - private void createSlotFileObject(int pos) { - if (mSlots[pos] == null) { - mSlots[pos] = new File(mOutDir, Integer.toString(pos)); - } - } - - /** - * Provides initialization of the clip data storage directory. - */ - public static File prepareStorage(File cacheDir) { - File clipDir = getClipDir(cacheDir); - clipDir.mkdir(); - - assert(clipDir.isDirectory()); - return clipDir; - } - - private static File getClipDir(File cacheDir) { - return new File(cacheDir, "clippings"); - } - - private static final class Writer implements Closeable { - - private final FileOutputStream mOut; - private final FileLock mLock; - - private Writer(File file) throws IOException { - assert(!file.exists()); - - mOut = new FileOutputStream(file); - - // Lock the file here so copy tasks would wait until everything is flushed to disk - // before start to run. - mLock = mOut.getChannel().lock(); - } - - public void write(Uri uri) throws IOException { - mOut.write(uri.toString().getBytes()); - mOut.write(LINE_SEPARATOR); - } - - @Override - public void close() throws IOException { - if (mLock != null) { - mLock.release(); - } - - if (mOut != null) { - mOut.close(); - } - } - } - - /** - * An {@link AsyncTask} that persists doc uris in {@link ClipStorage}. - */ - static final class PersistTask extends AsyncTask<Void, Void, Void> { - - private final ClipStorage mClipStorage; - private final Iterable<Uri> mUris; - private final int mTag; - - PersistTask(ClipStorage clipStorage, Iterable<Uri> uris, int tag) { - mClipStorage = clipStorage; - mUris = uris; - mTag = tag; - } - - @Override - protected Void doInBackground(Void... params) { - try(Writer writer = mClipStorage.createWriter(mTag)){ - for (Uri uri: mUris) { - assert(uri != null); - writer.write(uri); - } - } catch (IOException e) { - Log.e(TAG, "Caught exception trying to write jumbo clip to disk.", e); - } - - return null; - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/clipping/ClipStorageReader.java b/packages/DocumentsUI/src/com/android/documentsui/clipping/ClipStorageReader.java deleted file mode 100644 index 2bae0f8424ff..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/clipping/ClipStorageReader.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.clipping; - -import android.net.Uri; - -import java.io.Closeable; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.channels.FileLock; -import java.util.HashMap; -import java.util.Map; -import java.util.Scanner; - -/** - * Reader class used to read uris from clip files stored in {@link ClipStorage}. It provides - * synchronization within a single process as an addition to {@link FileLock} which is for - * cross-process synchronization. - */ -class ClipStorageReader implements Iterable<Uri>, Closeable { - - /** - * FileLock can't be held multiple times in a single JVM, but it's possible to have multiple - * readers reading the same clip file. Share the FileLock here so that it can be released - * when it's not needed. - */ - private static final Map<String, FileLockEntry> sLocks = new HashMap<>(); - - private final String mCanonicalPath; - private final Scanner mScanner; - - ClipStorageReader(File file) throws IOException { - FileInputStream inStream = new FileInputStream(file); - mScanner = new Scanner(inStream); - - mCanonicalPath = file.getCanonicalPath(); // Resolve symlink - synchronized (sLocks) { - if (sLocks.containsKey(mCanonicalPath)) { - // Read lock is already held by someone in this JVM, just increment the ref - // count. - sLocks.get(mCanonicalPath).mCount++; - } else { - // No map entry, need to lock the file so it won't pass this line until the - // corresponding writer is done writing. - FileLock lock = inStream.getChannel().lock(0L, Long.MAX_VALUE, true); - sLocks.put(mCanonicalPath, new FileLockEntry(1, lock, mScanner)); - } - } - } - - @Override - public Iterator iterator() { - return new Iterator(mScanner); - } - - @Override - public void close() throws IOException { - FileLockEntry ref; - synchronized (sLocks) { - ref = sLocks.get(mCanonicalPath); - - assert(ref.mCount > 0); - if (--ref.mCount == 0) { - // If ref count is 0 now, then there is no one who needs to hold the read lock. - // Release the lock, and remove the entry. - ref.mLock.release(); - ref.mScanner.close(); - sLocks.remove(mCanonicalPath); - } - } - - if (mScanner != ref.mScanner) { - mScanner.close(); - } - } - - private static final class Iterator implements java.util.Iterator { - private final Scanner mScanner; - - private Iterator(Scanner scanner) { - mScanner = scanner; - } - - @Override - public boolean hasNext() { - return mScanner.hasNextLine(); - } - - @Override - public Uri next() { - String line = mScanner.nextLine(); - return Uri.parse(line); - } - } - - private static final class FileLockEntry { - private final FileLock mLock; - // We need to keep this scanner here because if the scanner is closed, the file lock is - // closed too. - private final Scanner mScanner; - - private int mCount; - - private FileLockEntry(int count, FileLock lock, Scanner scanner) { - mCount = count; - mLock = lock; - mScanner = scanner; - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/clipping/DocumentClipper.java b/packages/DocumentsUI/src/com/android/documentsui/clipping/DocumentClipper.java deleted file mode 100644 index bdc1836f2688..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/clipping/DocumentClipper.java +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.clipping; - -import android.content.ClipData; -import android.content.ClipDescription; -import android.content.ClipboardManager; -import android.content.ContentResolver; -import android.content.Context; -import android.net.Uri; -import android.os.PersistableBundle; -import android.provider.DocumentsContract; -import android.support.annotation.Nullable; -import android.util.Log; - -import com.android.documentsui.Shared; -import com.android.documentsui.dirlist.MultiSelectManager.Selection; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperation; -import com.android.documentsui.services.FileOperationService; -import com.android.documentsui.services.FileOperationService.OpType; -import com.android.documentsui.services.FileOperations; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Function; - -/** - * ClipboardManager wrapper class providing higher level logical - * support for dealing with Documents. - */ -public final class DocumentClipper { - - private static final String TAG = "DocumentClipper"; - - static final String SRC_PARENT_KEY = "srcParent"; - static final String OP_TYPE_KEY = "opType"; - static final String OP_JUMBO_SELECTION_SIZE = "jumboSelection-size"; - static final String OP_JUMBO_SELECTION_TAG = "jumboSelection-tag"; - - private final Context mContext; - private final ClipStorage mClipStorage; - private final ClipboardManager mClipboard; - - public DocumentClipper(Context context, ClipStorage storage) { - mContext = context; - mClipStorage = storage; - mClipboard = context.getSystemService(ClipboardManager.class); - } - - public boolean hasItemsToPaste() { - if (mClipboard.hasPrimaryClip()) { - ClipData clipData = mClipboard.getPrimaryClip(); - - int count = clipData.getItemCount(); - if (count > 0) { - for (int i = 0; i < count; ++i) { - ClipData.Item item = clipData.getItemAt(i); - Uri uri = item.getUri(); - if (isDocumentUri(uri)) { - return true; - } - } - } - } - return false; - } - - private boolean isDocumentUri(@Nullable Uri uri) { - return uri != null && DocumentsContract.isDocumentUri(mContext, uri); - } - - /** - * Returns {@link ClipData} representing the selection, or null if selection is empty, - * or cannot be converted. - */ - public ClipData getClipDataForDocuments( - Function<String, Uri> uriBuilder, Selection selection, @OpType int opType) { - - assert(selection != null); - - if (selection.isEmpty()) { - Log.w(TAG, "Attempting to clip empty selection. Ignoring."); - return null; - } - - return (selection.size() > Shared.MAX_DOCS_IN_INTENT) - ? createJumboClipData(uriBuilder, selection, opType) - : createStandardClipData(uriBuilder, selection, opType); - } - - /** - * Returns ClipData representing the selection. - */ - private ClipData createStandardClipData( - Function<String, Uri> uriBuilder, Selection selection, @OpType int opType) { - - assert(!selection.isEmpty()); - assert(selection.size() <= Shared.MAX_DOCS_IN_INTENT); - - final ContentResolver resolver = mContext.getContentResolver(); - final ArrayList<ClipData.Item> clipItems = new ArrayList<>(); - final Set<String> clipTypes = new HashSet<>(); - - PersistableBundle bundle = new PersistableBundle(); - bundle.putInt(OP_TYPE_KEY, opType); - - for (String id : selection) { - assert(id != null); - Uri uri = uriBuilder.apply(id); - DocumentInfo.addMimeTypes(resolver, uri, clipTypes); - clipItems.add(new ClipData.Item(uri)); - } - - ClipDescription description = new ClipDescription( - "", // Currently "label" is not displayed anywhere in the UI. - clipTypes.toArray(new String[0])); - description.setExtras(bundle); - - return new ClipData(description, clipItems); - } - - /** - * Returns ClipData representing the list of docs - */ - private ClipData createJumboClipData( - Function<String, Uri> uriBuilder, Selection selection, @OpType int opType) { - - assert(!selection.isEmpty()); - assert(selection.size() > Shared.MAX_DOCS_IN_INTENT); - - final List<Uri> uris = new ArrayList<>(selection.size()); - - final int capacity = Math.min(selection.size(), Shared.MAX_DOCS_IN_INTENT); - final ArrayList<ClipData.Item> clipItems = new ArrayList<>(capacity); - - // Set up mime types for the first Shared.MAX_DOCS_IN_INTENT - final ContentResolver resolver = mContext.getContentResolver(); - final Set<String> clipTypes = new HashSet<>(); - int docCount = 0; - for (String id : selection) { - assert(id != null); - Uri uri = uriBuilder.apply(id); - if (docCount++ < Shared.MAX_DOCS_IN_INTENT) { - DocumentInfo.addMimeTypes(resolver, uri, clipTypes); - clipItems.add(new ClipData.Item(uri)); - } - - uris.add(uri); - } - - // Prepare metadata - PersistableBundle bundle = new PersistableBundle(); - bundle.putInt(OP_TYPE_KEY, opType); - bundle.putInt(OP_JUMBO_SELECTION_SIZE, selection.size()); - - // Creates a clip tag - int tag = mClipStorage.claimStorageSlot(); - bundle.putInt(OP_JUMBO_SELECTION_TAG, tag); - - ClipDescription description = new ClipDescription( - "", // Currently "label" is not displayed anywhere in the UI. - clipTypes.toArray(new String[0])); - description.setExtras(bundle); - - // Persists clip items - new ClipStorage.PersistTask(mClipStorage, uris, tag).execute(); - - return new ClipData(description, clipItems); - } - - /** - * Puts {@code ClipData} in a primary clipboard, describing a copy operation - */ - public void clipDocumentsForCopy(Function<String, Uri> uriBuilder, Selection selection) { - ClipData data = - getClipDataForDocuments(uriBuilder, selection, FileOperationService.OPERATION_COPY); - assert(data != null); - - mClipboard.setPrimaryClip(data); - } - - /** - * Puts {@Code ClipData} in a primary clipboard, describing a cut operation - */ - public void clipDocumentsForCut( - Function<String, Uri> uriBuilder, Selection selection, DocumentInfo parent) { - assert(!selection.isEmpty()); - assert(parent.derivedUri != null); - - ClipData data = getClipDataForDocuments(uriBuilder, selection, - FileOperationService.OPERATION_MOVE); - assert(data != null); - - PersistableBundle bundle = data.getDescription().getExtras(); - bundle.putString(SRC_PARENT_KEY, parent.derivedUri.toString()); - - mClipboard.setPrimaryClip(data); - } - - /** - * Copies documents from clipboard. It's the same as {@link #copyFromClipData} with clipData - * returned from {@link ClipboardManager#getPrimaryClip()}. - * - * @param destination destination document. - * @param docStack the document stack to the destination folder, - * @param callback callback to notify when operation finishes. - */ - public void copyFromClipboard( - DocumentInfo destination, - DocumentStack docStack, - FileOperations.Callback callback) { - - copyFromClipData(destination, docStack, mClipboard.getPrimaryClip(), callback); - } - - /** - * Copied documents from given clip data to a root directory. - * @param root the root which root directory to copy to - * @param destination the root directory - * @param clipData the clipData to copy from - * @param callback callback to notify when operation finishes - */ - public void copyFromClipData( - final RootInfo root, - final DocumentInfo destination, - final @Nullable ClipData clipData, - final FileOperations.Callback callback) { - DocumentStack dstStack = new DocumentStack(root, destination); - copyFromClipData(dstStack, clipData, callback); - } - - /** - * Copies documents from given clip data to a folder. - * - * @param destination destination folder - * @param docStack the document stack to the destination folder (not including the destination - * folder) - * @param clipData the clipData to copy from - * @param callback callback to notify when operation finishes - */ - public void copyFromClipData( - final DocumentInfo destination, - final DocumentStack docStack, - final @Nullable ClipData clipData, - final FileOperations.Callback callback) { - - DocumentStack dstStack = new DocumentStack(docStack, destination); - copyFromClipData(dstStack, clipData, callback); - } - - private void copyFromClipData( - final DocumentStack dstStack, - final @Nullable ClipData clipData, - final FileOperations.Callback callback) { - - if (clipData == null) { - Log.i(TAG, "Received null clipData. Ignoring."); - return; - } - - PersistableBundle bundle = clipData.getDescription().getExtras(); - @OpType int opType = getOpType(bundle); - try { - if (!canCopy(dstStack.peek())) { - callback.onOperationResult( - FileOperations.Callback.STATUS_REJECTED, getOpType(clipData), 0); - return; - } - - UrisSupplier uris = UrisSupplier.create(clipData, mContext); - if (uris.getItemCount() == 0) { - callback.onOperationResult( - FileOperations.Callback.STATUS_ACCEPTED, opType, 0); - return; - } - - String srcParentString = bundle.getString(SRC_PARENT_KEY); - Uri srcParent = srcParentString == null ? null : Uri.parse(srcParentString); - - FileOperation operation = new FileOperation.Builder() - .withOpType(opType) - .withSrcParent(srcParent) - .withDestination(dstStack) - .withSrcs(uris) - .build(); - - FileOperations.start(mContext, operation, callback); - } catch(IOException e) { - Log.e(TAG, "Cannot create uris supplier.", e); - callback.onOperationResult(FileOperations.Callback.STATUS_REJECTED, opType, 0); - return; - } - } - - /** - * Returns true if the list of files can be copied to destination. Note that this - * is a policy check only. Currently the method does not attempt to verify - * available space or any other environmental aspects possibly resulting in - * failure to copy. - * - * @return true if the list of files can be copied to destination. - */ - private static boolean canCopy(DocumentInfo dest) { - if (dest == null || !dest.isDirectory() || !dest.isCreateSupported()) { - return false; - } - - return true; - } - - public static @OpType int getOpType(ClipData data) { - PersistableBundle bundle = data.getDescription().getExtras(); - return getOpType(bundle); - } - - private static @OpType int getOpType(PersistableBundle bundle) { - return bundle.getInt(OP_TYPE_KEY); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/clipping/UrisSupplier.java b/packages/DocumentsUI/src/com/android/documentsui/clipping/UrisSupplier.java deleted file mode 100644 index 7b1ba3498da9..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/clipping/UrisSupplier.java +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.clipping; - -import static com.android.documentsui.clipping.DocumentClipper.OP_JUMBO_SELECTION_SIZE; -import static com.android.documentsui.clipping.DocumentClipper.OP_JUMBO_SELECTION_TAG; - -import android.content.ClipData; -import android.content.Context; -import android.net.Uri; -import android.os.Parcel; -import android.os.Parcelable; -import android.os.PersistableBundle; -import android.support.annotation.VisibleForTesting; -import android.util.Log; - -import com.android.documentsui.DocumentsApplication; -import com.android.documentsui.Shared; -import com.android.documentsui.dirlist.MultiSelectManager.Selection; -import com.android.documentsui.services.FileOperation; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Function; - -/** - * UrisSupplier provides doc uri list to {@link FileOperation}. - * - * <p>Under the hood it provides cross-process synchronization support such that its consumer doesn't - * need to explicitly synchronize its access. - */ -public abstract class UrisSupplier implements Parcelable { - - public abstract int getItemCount(); - - /** - * Gets doc list. This may only be called once because it may read a file - * to get the list. - * - * @param context We need context to obtain {@link ClipStorage}. It can't be sent in a parcel. - */ - public Iterable<Uri> getUris(Context context) throws IOException { - return getUris(DocumentsApplication.getClipStorage(context)); - } - - @VisibleForTesting - abstract Iterable<Uri> getUris(ClipStorage storage) throws IOException; - - public void dispose() {} - - @Override - public int describeContents() { - return 0; - } - - public static UrisSupplier create(ClipData clipData, Context context) throws IOException { - UrisSupplier uris; - PersistableBundle bundle = clipData.getDescription().getExtras(); - if (bundle.containsKey(OP_JUMBO_SELECTION_TAG)) { - uris = new JumboUrisSupplier(clipData, context); - } else { - uris = new StandardUrisSupplier(clipData); - } - - return uris; - } - - public static UrisSupplier create( - Selection selection, Function<String, Uri> uriBuilder, Context context) - throws IOException { - - ClipStorage storage = DocumentsApplication.getClipStorage(context); - - List<Uri> uris = new ArrayList<>(selection.size()); - for (String id : selection) { - uris.add(uriBuilder.apply(id)); - } - - return create(uris, storage); - } - - @VisibleForTesting - static UrisSupplier create(List<Uri> uris, ClipStorage storage) throws IOException { - UrisSupplier urisSupplier = (uris.size() > Shared.MAX_DOCS_IN_INTENT) - ? new JumboUrisSupplier(uris, storage) - : new StandardUrisSupplier(uris); - - return urisSupplier; - } - - private static class JumboUrisSupplier extends UrisSupplier { - private static final String TAG = "JumboUrisSupplier"; - - private final File mFile; - private final int mSelectionSize; - - private final transient AtomicReference<ClipStorageReader> mReader = - new AtomicReference<>(); - - private JumboUrisSupplier(ClipData clipData, Context context) throws IOException { - PersistableBundle bundle = clipData.getDescription().getExtras(); - final int tag = bundle.getInt(OP_JUMBO_SELECTION_TAG, ClipStorage.NO_SELECTION_TAG); - assert(tag != ClipStorage.NO_SELECTION_TAG); - mFile = DocumentsApplication.getClipStorage(context).getFile(tag); - assert(mFile.exists()); - - mSelectionSize = bundle.getInt(OP_JUMBO_SELECTION_SIZE); - assert(mSelectionSize > Shared.MAX_DOCS_IN_INTENT); - } - - private JumboUrisSupplier(Collection<Uri> uris, ClipStorage storage) throws IOException { - final int tag = storage.claimStorageSlot(); - new ClipStorage.PersistTask(storage, uris, tag).execute(); - - // There is a tiny race condition here. A job may starts to read before persist task - // starts to write, but it has to beat an IPC and background task schedule, which is - // pretty rare. Creating a symlink doesn't need that file to exist, but we can't assert - // on its existence. - mFile = storage.getFile(tag); - mSelectionSize = uris.size(); - } - - @Override - public int getItemCount() { - return mSelectionSize; - } - - @Override - Iterable<Uri> getUris(ClipStorage storage) throws IOException { - ClipStorageReader reader = mReader.getAndSet(storage.createReader(mFile)); - if (reader != null) { - reader.close(); - mReader.get().close(); - throw new IllegalStateException("This method can only be called once."); - } - - return mReader.get(); - } - - @Override - public void dispose() { - try { - ClipStorageReader reader = mReader.get(); - if (reader != null) { - reader.close(); - } - } catch (IOException e) { - Log.w(TAG, "Failed to close the reader.", e); - } - - // mFile is a symlink to the actual data file. Delete the symlink here so that we know - // there is one fewer referrer that needs the data file. The actual data file will be - // cleaned up during file slot rotation. See ClipStorage for more details. - mFile.delete(); - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("JumboUrisSupplier{"); - builder.append("file=").append(mFile.getAbsolutePath()); - builder.append(", selectionSize=").append(mSelectionSize); - builder.append("}"); - return builder.toString(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mFile.getAbsolutePath()); - dest.writeInt(mSelectionSize); - } - - private JumboUrisSupplier(Parcel in) { - mFile = new File(in.readString()); - mSelectionSize = in.readInt(); - } - - public static final Parcelable.Creator<JumboUrisSupplier> CREATOR = - new Parcelable.Creator<JumboUrisSupplier>() { - - @Override - public JumboUrisSupplier createFromParcel(Parcel source) { - return new JumboUrisSupplier(source); - } - - @Override - public JumboUrisSupplier[] newArray(int size) { - return new JumboUrisSupplier[size]; - } - }; - } - - /** - * This class and its constructor is visible for testing to create test doubles of - * {@link UrisSupplier}. - */ - @VisibleForTesting - public static class StandardUrisSupplier extends UrisSupplier { - private final List<Uri> mDocs; - - private StandardUrisSupplier(ClipData clipData) { - mDocs = listDocs(clipData); - } - - @VisibleForTesting - public StandardUrisSupplier(List<Uri> docs) { - mDocs = docs; - } - - private List<Uri> listDocs(ClipData clipData) { - ArrayList<Uri> docs = new ArrayList<>(clipData.getItemCount()); - - for (int i = 0; i < clipData.getItemCount(); ++i) { - Uri uri = clipData.getItemAt(i).getUri(); - assert(uri != null); - docs.add(uri); - } - - return docs; - } - - @Override - public int getItemCount() { - return mDocs.size(); - } - - @Override - Iterable<Uri> getUris(ClipStorage storage) { - return mDocs; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("StandardUrisSupplier{"); - builder.append("docs=").append(mDocs.toString()); - builder.append("}"); - return builder.toString(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeTypedList(mDocs); - } - - private StandardUrisSupplier(Parcel in) { - mDocs = in.createTypedArrayList(Uri.CREATOR); - } - - public static final Parcelable.Creator<StandardUrisSupplier> CREATOR = - new Parcelable.Creator<StandardUrisSupplier>() { - - @Override - public StandardUrisSupplier createFromParcel(Parcel source) { - return new StandardUrisSupplier(source); - } - - @Override - public StandardUrisSupplier[] newArray(int size) { - return new StandardUrisSupplier[size]; - } - }; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/AnimationView.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/AnimationView.java deleted file mode 100644 index a66645655619..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/AnimationView.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.annotation.IntDef; -import android.app.FragmentTransaction; -import android.content.Context; -import android.os.Bundle; -import android.util.AttributeSet; -import android.widget.LinearLayout; - -import com.android.documentsui.R; -import com.android.documentsui.Shared; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * This class exists solely to support animated transition of our directory fragment. - * The structure of this class is tightly coupled with the static animations defined in - * res/animator, specifically the "position" property referenced by - * res/animator/dir_{enter,leave}.xml. - */ -public class AnimationView extends LinearLayout { - - @IntDef(flag = true, value = { - ANIM_NONE, - ANIM_SIDE, - ANIM_LEAVE, - ANIM_ENTER - }) - @Retention(RetentionPolicy.SOURCE) - public @interface AnimationType {} - public static final int ANIM_NONE = 1; - public static final int ANIM_SIDE = 2; - public static final int ANIM_LEAVE = 3; - public static final int ANIM_ENTER = 4; - - private float mPosition = 0f; - - // The distance the animation will cover...currently matches the height of the - // content area. - private int mSpan; - - public AnimationView(Context context) { - super(context); - } - - public AnimationView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - mSpan = h; - setPosition(mPosition); - } - - public float getPosition() { - return mPosition; - } - - public void setPosition(float position) { - mPosition = position; - // Warning! If we ever decide to switch this to setX (slide left/right) - // please remember to add RLT variations of the animations under res/animator-ldrtl. - setY((mSpan > 0) ? (mPosition * mSpan) : 0); - - if (mPosition != 0) { - setTranslationZ(getResources().getDimensionPixelSize(R.dimen.dir_elevation)); - } else { - setTranslationZ(0); - } - } - - /** - * Configures custom animations on the transaction according to the specified - * @AnimationType. - */ - static void setupAnimations( - FragmentTransaction ft, @AnimationType int anim, Bundle args) { - switch (anim) { - case AnimationView.ANIM_SIDE: - args.putBoolean(Shared.EXTRA_IGNORE_STATE, true); - break; - case AnimationView.ANIM_ENTER: - // TODO: Document which behavior is being tailored - // by passing this bit. Remove if possible. - args.putBoolean(Shared.EXTRA_IGNORE_STATE, true); - ft.setCustomAnimations(R.animator.dir_enter, R.animator.fade_out); - break; - case AnimationView.ANIM_LEAVE: - ft.setCustomAnimations(R.animator.fade_in, R.animator.dir_leave); - break; - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/BandController.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/BandController.java deleted file mode 100644 index 5ab85c1fcc17..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/BandController.java +++ /dev/null @@ -1,1173 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.dirlist.ModelBackedDocumentsAdapter.ITEM_TYPE_DIRECTORY; -import static com.android.documentsui.dirlist.ModelBackedDocumentsAdapter.ITEM_TYPE_DOCUMENT; -import static com.android.documentsui.dirlist.ViewAutoScroller.NOT_SET; - -import android.graphics.Point; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.util.Log; -import android.util.SparseArray; -import android.util.SparseBooleanArray; -import android.util.SparseIntArray; -import android.view.MotionEvent; -import android.view.View; - -import com.android.documentsui.Events; -import com.android.documentsui.Events.InputEvent; -import com.android.documentsui.Events.MotionInputEvent; -import com.android.documentsui.R; -import com.android.documentsui.dirlist.MultiSelectManager.Selection; -import com.android.documentsui.dirlist.ViewAutoScroller.ScrollActionDelegate; -import com.android.documentsui.dirlist.ViewAutoScroller.ScrollDistanceDelegate; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Provides mouse driven band-select support when used in conjunction with {@link RecyclerView} - * and {@link MultiSelectManager}. This class is responsible for rendering the band select - * overlay and selecting overlaid items via MultiSelectManager. - */ -public class BandController extends RecyclerView.OnScrollListener { - - private static final String TAG = "BandController"; - private static final int AUTOSCROLL_EDGE_HEIGHT = 1; - - private final Runnable mModelBuilder; - private final SelectionEnvironment mEnvironment; - private final DocumentsAdapter mAdapter; - private final MultiSelectManager mSelectionManager; - private final Runnable mViewScroller; - private final GridModel.OnSelectionChangedListener mGridListener; - - @Nullable private Rect mBounds; - @Nullable private Point mCurrentPosition; - @Nullable private Point mOrigin; - @Nullable private BandController.GridModel mModel; - - private Selection mSelection; - - public BandController( - final RecyclerView view, - DocumentsAdapter adapter, - MultiSelectManager selectionManager) { - this(new RuntimeSelectionEnvironment(view), adapter, selectionManager); - - view.addOnItemTouchListener( - new RecyclerView.OnItemTouchListener() { - @Override - public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { - try (InputEvent event = MotionInputEvent.obtain(e, view)) { - return handleEvent(event); - } - } - @Override - public void onTouchEvent(RecyclerView rv, MotionEvent e) { - if (Events.isMouseEvent(e)) { - try (InputEvent event = MotionInputEvent.obtain(e, view)) { - processInputEvent(event); - } - } - } - @Override - public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {} - }); - } - - private BandController( - SelectionEnvironment env, - DocumentsAdapter adapter, - MultiSelectManager selectionManager) { - - selectionManager.bindContoller(this); - - mEnvironment = env; - mAdapter = adapter; - mSelectionManager = selectionManager; - - mEnvironment.addOnScrollListener(this); - mViewScroller = new ViewAutoScroller( - AUTOSCROLL_EDGE_HEIGHT, - new ScrollDistanceDelegate() { - @Override - public Point getCurrentPosition() { - return mCurrentPosition; - } - - @Override - public int getViewHeight() { - return mEnvironment.getHeight(); - } - - @Override - public boolean isActive() { - return BandController.this.isActive(); - } - }, - env); - - mAdapter.registerAdapterDataObserver( - new RecyclerView.AdapterDataObserver() { - @Override - public void onChanged() { - if (isActive()) { - endBandSelect(); - } - } - - @Override - public void onItemRangeChanged( - int startPosition, int itemCount, Object payload) { - // No change in position. Ignoring. - } - - @Override - public void onItemRangeInserted(int startPosition, int itemCount) { - if (isActive()) { - endBandSelect(); - } - } - - @Override - public void onItemRangeRemoved(int startPosition, int itemCount) { - assert(startPosition >= 0); - assert(itemCount > 0); - - // TODO: Should update grid model. - } - - @Override - public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { - throw new UnsupportedOperationException(); - } - }); - - mGridListener = new GridModel.OnSelectionChangedListener() { - - @Override - public void onSelectionChanged(Set<String> updatedSelection) { - BandController.this.onSelectionChanged(updatedSelection); - } - - @Override - public boolean onBeforeItemStateChange(String id, boolean nextState) { - return BandController.this.onBeforeItemStateChange(id, nextState); - } - }; - - mModelBuilder = new Runnable() { - @Override - public void run() { - mModel = new GridModel(mEnvironment, mAdapter); - mModel.addOnSelectionChangedListener(mGridListener); - } - }; - } - - private boolean isActive() { - return mModel != null; - } - - void bindSelection(Selection selection) { - mSelection = selection; - } - - private boolean handleEvent(InputEvent e) { - // Don't start, or extend bands on right click. - if (e.isSecondaryButtonPressed()) { - return false; - } - - if (!e.isMouseEvent() && isActive()) { - // Weird things happen if we keep up band select - // when touch events happen. - endBandSelect(); - return false; - } - - // b/23793622 notes the fact that we *never* receive ACTION_DOWN - // events in onTouchEvent. Where it not for this issue, we'd - // push start handling down into handleInputEvent. - if (shouldStart(e)) { - // endBandSelect is handled in handleInputEvent. - startBandSelect(e.getOrigin()); - } else if (isActive() && e.isActionUp()) { - // Same issue here w b/23793622. The ACTION_UP event - // is only evert dispatched to onTouchEvent when - // there is some associated motion. If a user taps - // mouse, but doesn't move, then band select gets - // started BUT not ended. Causing phantom - // bands to appear when the user later clicks to start - // band select. - if (e.isMouseEvent()) { - processInputEvent(e); - } - } - - return isActive(); - } - - /** - * Handle a change in layout by cleaning up and getting rid of the old model and creating - * a new model which will track the new layout. - */ - public void handleLayoutChanged() { - if (mModel != null) { - mModel.removeOnSelectionChangedListener(mGridListener); - mModel.stopListening(); - - // build a new model, all fresh and happy. - mModelBuilder.run(); - } - } - - boolean shouldStart(InputEvent e) { - return !isActive() - && e.isActionDown() // the initial button press - && mAdapter.getItemCount() > 0 - && e.getItemPosition() == RecyclerView.NO_ID; // in empty space - } - - boolean shouldStop(InputEvent input) { - return isActive() - && input.isMouseEvent() - && input.isActionUp(); - } - - /** - * Processes a MotionEvent by starting, ending, or resizing the band select overlay. - * @param input - */ - private void processInputEvent(InputEvent input) { - assert(input.isMouseEvent()); - - if (shouldStop(input)) { - endBandSelect(); - return; - } - - // We shouldn't get any events in this method when band select is not active, - // but it turns some guests show up late to the party. - if (!isActive()) { - return; - } - - mCurrentPosition = input.getOrigin(); - mModel.resizeSelection(input.getOrigin()); - scrollViewIfNecessary(); - resizeBandSelectRectangle(); - } - - /** - * Starts band select by adding the drawable to the RecyclerView's overlay. - */ - private void startBandSelect(Point origin) { - if (DEBUG) Log.d(TAG, "Starting band select @ " + origin); - - mOrigin = origin; - mModelBuilder.run(); // Creates a new selection model. - mModel.startSelection(mOrigin); - } - - /** - * Scrolls the view if necessary. - */ - private void scrollViewIfNecessary() { - mEnvironment.removeCallback(mViewScroller); - mViewScroller.run(); - mEnvironment.invalidateView(); - } - - /** - * Resizes the band select rectangle by using the origin and the current pointer position as - * two opposite corners of the selection. - */ - private void resizeBandSelectRectangle() { - mBounds = new Rect(Math.min(mOrigin.x, mCurrentPosition.x), - Math.min(mOrigin.y, mCurrentPosition.y), - Math.max(mOrigin.x, mCurrentPosition.x), - Math.max(mOrigin.y, mCurrentPosition.y)); - mEnvironment.showBand(mBounds); - } - - /** - * Ends band select by removing the overlay. - */ - private void endBandSelect() { - if (DEBUG) Log.d(TAG, "Ending band select."); - - mEnvironment.hideBand(); - mSelection.applyProvisionalSelection(); - mModel.endSelection(); - int firstSelected = mModel.getPositionNearestOrigin(); - if (firstSelected != NOT_SET) { - if (mSelection.contains(mAdapter.getModelId(firstSelected))) { - // TODO: firstSelected should really be lastSelected, we want to anchor the item - // where the mouse-up occurred. - mSelectionManager.setSelectionRangeBegin(firstSelected); - } else { - // TODO: Check if this is really happening. - Log.w(TAG, "First selected by band is NOT in selection!"); - } - } - - mModel = null; - mOrigin = null; - } - - private void onSelectionChanged(Set<String> updatedSelection) { - Map<String, Boolean> delta = mSelection.setProvisionalSelection(updatedSelection); - for (Map.Entry<String, Boolean> entry: delta.entrySet()) { - mSelectionManager.notifyItemStateChanged(entry.getKey(), entry.getValue()); - } - mSelectionManager.notifySelectionChanged(); - } - - private boolean onBeforeItemStateChange(String id, boolean nextState) { - return mSelectionManager.notifyBeforeItemStateChange(id, nextState); - } - - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - if (!isActive()) { - return; - } - - // Adjust the y-coordinate of the origin the opposite number of pixels so that the - // origin remains in the same place relative to the view's items. - mOrigin.y -= dy; - resizeBandSelectRectangle(); - } - - /** - * Provides a band selection item model for views within a RecyclerView. This class queries the - * RecyclerView to determine where its items are placed; then, once band selection is underway, - * it alerts listeners of which items are covered by the selections. - */ - @VisibleForTesting - static final class GridModel extends RecyclerView.OnScrollListener { - - public static final int NOT_SET = -1; - - // Enum values used to determine the corner at which the origin is located within the - private static final int UPPER = 0x00; - private static final int LOWER = 0x01; - private static final int LEFT = 0x00; - private static final int RIGHT = 0x02; - private static final int UPPER_LEFT = UPPER | LEFT; - private static final int UPPER_RIGHT = UPPER | RIGHT; - private static final int LOWER_LEFT = LOWER | LEFT; - private static final int LOWER_RIGHT = LOWER | RIGHT; - - private final SelectionEnvironment mHelper; - private final DocumentsAdapter mAdapter; - - private final List<GridModel.OnSelectionChangedListener> mOnSelectionChangedListeners = - new ArrayList<>(); - - // Map from the x-value of the left side of a SparseBooleanArray of adapter positions, keyed - // by their y-offset. For example, if the first column of the view starts at an x-value of 5, - // mColumns.get(5) would return an array of positions in that column. Within that array, the - // value for key y is the adapter position for the item whose y-offset is y. - private final SparseArray<SparseIntArray> mColumns = new SparseArray<>(); - - // List of limits along the x-axis (columns). - // This list is sorted from furthest left to furthest right. - private final List<GridModel.Limits> mColumnBounds = new ArrayList<>(); - - // List of limits along the y-axis (rows). Note that this list only contains items which - // have been in the viewport. - private final List<GridModel.Limits> mRowBounds = new ArrayList<>(); - - // The adapter positions which have been recorded so far. - private final SparseBooleanArray mKnownPositions = new SparseBooleanArray(); - - // Array passed to registered OnSelectionChangedListeners. One array is created and reused - // throughout the lifetime of the object. - private final Set<String> mSelection = new HashSet<>(); - - // The current pointer (in absolute positioning from the top of the view). - private Point mPointer = null; - - // The bounds of the band selection. - private RelativePoint mRelativeOrigin; - private RelativePoint mRelativePointer; - - private boolean mIsActive; - - // Tracks where the band select originated from. This is used to determine where selections - // should expand from when Shift+click is used. - private int mPositionNearestOrigin = NOT_SET; - - GridModel(SelectionEnvironment helper, DocumentsAdapter adapter) { - mHelper = helper; - mAdapter = adapter; - mHelper.addOnScrollListener(this); - } - - /** - * Stops listening to the view's scrolls. Call this function before discarding a - * BandSelecModel object to prevent memory leaks. - */ - void stopListening() { - mHelper.removeOnScrollListener(this); - } - - /** - * Start a band select operation at the given point. - * @param relativeOrigin The origin of the band select operation, relative to the viewport. - * For example, if the view is scrolled to the bottom, the top-left of the viewport - * would have a relative origin of (0, 0), even though its absolute point has a higher - * y-value. - */ - void startSelection(Point relativeOrigin) { - recordVisibleChildren(); - if (isEmpty()) { - // The selection band logic works only if there is at least one visible child. - return; - } - - mIsActive = true; - mPointer = mHelper.createAbsolutePoint(relativeOrigin); - mRelativeOrigin = new RelativePoint(mPointer); - mRelativePointer = new RelativePoint(mPointer); - computeCurrentSelection(); - notifyListeners(); - } - - /** - * Resizes the selection by adjusting the pointer (i.e., the corner of the selection - * opposite the origin. - * @param relativePointer The pointer (opposite of the origin) of the band select operation, - * relative to the viewport. For example, if the view is scrolled to the bottom, the - * top-left of the viewport would have a relative origin of (0, 0), even though its - * absolute point has a higher y-value. - */ - @VisibleForTesting - void resizeSelection(Point relativePointer) { - mPointer = mHelper.createAbsolutePoint(relativePointer); - updateModel(); - } - - /** - * Ends the band selection. - */ - void endSelection() { - mIsActive = false; - } - - /** - * @return The adapter position for the item nearest the origin corresponding to the latest - * band select operation, or NOT_SET if the selection did not cover any items. - */ - int getPositionNearestOrigin() { - return mPositionNearestOrigin; - } - - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - if (!mIsActive) { - return; - } - - mPointer.x += dx; - mPointer.y += dy; - recordVisibleChildren(); - updateModel(); - } - - /** - * Queries the view for all children and records their location metadata. - */ - private void recordVisibleChildren() { - for (int i = 0; i < mHelper.getVisibleChildCount(); i++) { - int adapterPosition = mHelper.getAdapterPositionAt(i); - // Sometimes the view is not attached, as we notify the multi selection manager - // synchronously, while views are attached asynchronously. As a result items which - // are in the adapter may not actually have a corresponding view (yet). - if (mHelper.hasView(adapterPosition) && - !mHelper.isLayoutItem(adapterPosition) && - !mKnownPositions.get(adapterPosition)) { - mKnownPositions.put(adapterPosition, true); - recordItemData(mHelper.getAbsoluteRectForChildViewAt(i), adapterPosition); - } - } - } - - /** - * Checks if there are any recorded children. - */ - private boolean isEmpty() { - return mColumnBounds.size() == 0 || mRowBounds.size() == 0; - } - - /** - * Updates the limits lists and column map with the given item metadata. - * @param absoluteChildRect The absolute rectangle for the child view being processed. - * @param adapterPosition The position of the child view being processed. - */ - private void recordItemData(Rect absoluteChildRect, int adapterPosition) { - if (mColumnBounds.size() != mHelper.getColumnCount()) { - // If not all x-limits have been recorded, record this one. - recordLimits( - mColumnBounds, new Limits(absoluteChildRect.left, absoluteChildRect.right)); - } - - recordLimits(mRowBounds, new Limits(absoluteChildRect.top, absoluteChildRect.bottom)); - - SparseIntArray columnList = mColumns.get(absoluteChildRect.left); - if (columnList == null) { - columnList = new SparseIntArray(); - mColumns.put(absoluteChildRect.left, columnList); - } - columnList.put(absoluteChildRect.top, adapterPosition); - } - - /** - * Ensures limits exists within the sorted list limitsList, and adds it to the list if it - * does not exist. - */ - private void recordLimits(List<GridModel.Limits> limitsList, GridModel.Limits limits) { - int index = Collections.binarySearch(limitsList, limits); - if (index < 0) { - limitsList.add(~index, limits); - } - } - - /** - * Handles a moved pointer; this function determines whether the pointer movement resulted - * in a selection change and, if it has, notifies listeners of this change. - */ - private void updateModel() { - RelativePoint old = mRelativePointer; - mRelativePointer = new RelativePoint(mPointer); - if (old != null && mRelativePointer.equals(old)) { - return; - } - - computeCurrentSelection(); - notifyListeners(); - } - - /** - * Computes the currently-selected items. - */ - private void computeCurrentSelection() { - if (areItemsCoveredByBand(mRelativePointer, mRelativeOrigin)) { - updateSelection(computeBounds()); - } else { - mSelection.clear(); - mPositionNearestOrigin = NOT_SET; - } - } - - /** - * Notifies all listeners of a selection change. Note that this function simply passes - * mSelection, so computeCurrentSelection() should be called before this - * function. - */ - private void notifyListeners() { - for (GridModel.OnSelectionChangedListener listener : mOnSelectionChangedListeners) { - listener.onSelectionChanged(mSelection); - } - } - - /** - * @param rect Rectangle including all covered items. - */ - private void updateSelection(Rect rect) { - int columnStart = - Collections.binarySearch(mColumnBounds, new Limits(rect.left, rect.left)); - assert(columnStart >= 0); - int columnEnd = columnStart; - - for (int i = columnStart; i < mColumnBounds.size() - && mColumnBounds.get(i).lowerLimit <= rect.right; i++) { - columnEnd = i; - } - - int rowStart = Collections.binarySearch(mRowBounds, new Limits(rect.top, rect.top)); - if (rowStart < 0) { - mPositionNearestOrigin = NOT_SET; - return; - } - - int rowEnd = rowStart; - for (int i = rowStart; i < mRowBounds.size() - && mRowBounds.get(i).lowerLimit <= rect.bottom; i++) { - rowEnd = i; - } - - updateSelection(columnStart, columnEnd, rowStart, rowEnd); - } - - /** - * Computes the selection given the previously-computed start- and end-indices for each - * row and column. - */ - private void updateSelection( - int columnStartIndex, int columnEndIndex, int rowStartIndex, int rowEndIndex) { - if (DEBUG) Log.d(TAG, String.format("updateSelection: %d, %d, %d, %d", - columnStartIndex, columnEndIndex, rowStartIndex, rowEndIndex)); - - mSelection.clear(); - for (int column = columnStartIndex; column <= columnEndIndex; column++) { - SparseIntArray items = mColumns.get(mColumnBounds.get(column).lowerLimit); - for (int row = rowStartIndex; row <= rowEndIndex; row++) { - // The default return value for SparseIntArray.get is 0, which is a valid - // position. Use a sentry value to prevent erroneously selecting item 0. - final int rowKey = mRowBounds.get(row).lowerLimit; - int position = items.get(rowKey, NOT_SET); - if (position != NOT_SET) { - String id = mAdapter.getModelId(position); - if (id != null) { - // The adapter inserts items for UI layout purposes that aren't associated - // with files. Those will have a null model ID. Don't select them. - if (canSelect(id)) { - mSelection.add(id); - } - } - if (isPossiblePositionNearestOrigin(column, columnStartIndex, columnEndIndex, - row, rowStartIndex, rowEndIndex)) { - // If this is the position nearest the origin, record it now so that it - // can be returned by endSelection() later. - mPositionNearestOrigin = position; - } - } - } - } - } - - /** - * @return True if the item is selectable. - */ - private boolean canSelect(String id) { - // TODO: Simplify the logic, so the check whether we can select is done in one place. - // Consider injecting FragmentTuner, or move the checks from MultiSelectManager to - // Selection. - for (GridModel.OnSelectionChangedListener listener : mOnSelectionChangedListeners) { - if (!listener.onBeforeItemStateChange(id, true)) { - return false; - } - } - return true; - } - - /** - * @return Returns true if the position is the nearest to the origin, or, in the case of the - * lower-right corner, whether it is possible that the position is the nearest to the - * origin. See comment below for reasoning for this special case. - */ - private boolean isPossiblePositionNearestOrigin(int columnIndex, int columnStartIndex, - int columnEndIndex, int rowIndex, int rowStartIndex, int rowEndIndex) { - int corner = computeCornerNearestOrigin(); - switch (corner) { - case UPPER_LEFT: - return columnIndex == columnStartIndex && rowIndex == rowStartIndex; - case UPPER_RIGHT: - return columnIndex == columnEndIndex && rowIndex == rowStartIndex; - case LOWER_LEFT: - return columnIndex == columnStartIndex && rowIndex == rowEndIndex; - case LOWER_RIGHT: - // Note that in some cases, the last row will not have as many items as there - // are columns (e.g., if there are 4 items and 3 columns, the second row will - // only have one item in the first column). This function is invoked for each - // position from left to right, so return true for any position in the bottom - // row and only the right-most position in the bottom row will be recorded. - return rowIndex == rowEndIndex; - default: - throw new RuntimeException("Invalid corner type."); - } - } - - /** - * Listener for changes in which items have been band selected. - */ - static interface OnSelectionChangedListener { - public void onSelectionChanged(Set<String> updatedSelection); - public boolean onBeforeItemStateChange(String id, boolean nextState); - } - - void addOnSelectionChangedListener(GridModel.OnSelectionChangedListener listener) { - mOnSelectionChangedListeners.add(listener); - } - - void removeOnSelectionChangedListener(GridModel.OnSelectionChangedListener listener) { - mOnSelectionChangedListeners.remove(listener); - } - - /** - * Limits of a view item. For example, if an item's left side is at x-value 5 and its right side - * is at x-value 10, the limits would be from 5 to 10. Used to record the left- and right sides - * of item columns and the top- and bottom sides of item rows so that it can be determined - * whether the pointer is located within the bounds of an item. - */ - private static class Limits implements Comparable<GridModel.Limits> { - int lowerLimit; - int upperLimit; - - Limits(int lowerLimit, int upperLimit) { - this.lowerLimit = lowerLimit; - this.upperLimit = upperLimit; - } - - @Override - public int compareTo(GridModel.Limits other) { - return lowerLimit - other.lowerLimit; - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof GridModel.Limits)) { - return false; - } - - return ((GridModel.Limits) other).lowerLimit == lowerLimit && - ((GridModel.Limits) other).upperLimit == upperLimit; - } - - @Override - public String toString() { - return "(" + lowerLimit + ", " + upperLimit + ")"; - } - } - - /** - * The location of a coordinate relative to items. This class represents a general area of the - * view as it relates to band selection rather than an explicit point. For example, two - * different points within an item are considered to have the same "location" because band - * selection originating within the item would select the same items no matter which point - * was used. Same goes for points between items as well as those at the very beginning or end - * of the view. - * - * Tracking a coordinate (e.g., an x-value) as a CoordinateLocation instead of as an int has the - * advantage of tying the value to the Limits of items along that axis. This allows easy - * selection of items within those Limits as opposed to a search through every item to see if a - * given coordinate value falls within those Limits. - */ - private static class RelativeCoordinate - implements Comparable<GridModel.RelativeCoordinate> { - /** - * Location describing points after the last known item. - */ - static final int AFTER_LAST_ITEM = 0; - - /** - * Location describing points before the first known item. - */ - static final int BEFORE_FIRST_ITEM = 1; - - /** - * Location describing points between two items. - */ - static final int BETWEEN_TWO_ITEMS = 2; - - /** - * Location describing points within the limits of one item. - */ - static final int WITHIN_LIMITS = 3; - - /** - * The type of this coordinate, which is one of AFTER_LAST_ITEM, BEFORE_FIRST_ITEM, - * BETWEEN_TWO_ITEMS, or WITHIN_LIMITS. - */ - final int type; - - /** - * The limits before the coordinate; only populated when type == WITHIN_LIMITS or type == - * BETWEEN_TWO_ITEMS. - */ - GridModel.Limits limitsBeforeCoordinate; - - /** - * The limits after the coordinate; only populated when type == BETWEEN_TWO_ITEMS. - */ - GridModel.Limits limitsAfterCoordinate; - - // Limits of the first known item; only populated when type == BEFORE_FIRST_ITEM. - GridModel.Limits mFirstKnownItem; - // Limits of the last known item; only populated when type == AFTER_LAST_ITEM. - GridModel.Limits mLastKnownItem; - - /** - * @param limitsList The sorted limits list for the coordinate type. If this - * CoordinateLocation is an x-value, mXLimitsList should be passed; otherwise, - * mYLimitsList should be pased. - * @param value The coordinate value. - */ - RelativeCoordinate(List<GridModel.Limits> limitsList, int value) { - int index = Collections.binarySearch(limitsList, new Limits(value, value)); - - if (index >= 0) { - this.type = WITHIN_LIMITS; - this.limitsBeforeCoordinate = limitsList.get(index); - } else if (~index == 0) { - this.type = BEFORE_FIRST_ITEM; - this.mFirstKnownItem = limitsList.get(0); - } else if (~index == limitsList.size()) { - GridModel.Limits lastLimits = limitsList.get(limitsList.size() - 1); - if (lastLimits.lowerLimit <= value && value <= lastLimits.upperLimit) { - this.type = WITHIN_LIMITS; - this.limitsBeforeCoordinate = lastLimits; - } else { - this.type = AFTER_LAST_ITEM; - this.mLastKnownItem = lastLimits; - } - } else { - GridModel.Limits limitsBeforeIndex = limitsList.get(~index - 1); - if (limitsBeforeIndex.lowerLimit <= value && value <= limitsBeforeIndex.upperLimit) { - this.type = WITHIN_LIMITS; - this.limitsBeforeCoordinate = limitsList.get(~index - 1); - } else { - this.type = BETWEEN_TWO_ITEMS; - this.limitsBeforeCoordinate = limitsList.get(~index - 1); - this.limitsAfterCoordinate = limitsList.get(~index); - } - } - } - - int toComparisonValue() { - if (type == BEFORE_FIRST_ITEM) { - return mFirstKnownItem.lowerLimit - 1; - } else if (type == AFTER_LAST_ITEM) { - return mLastKnownItem.upperLimit + 1; - } else if (type == BETWEEN_TWO_ITEMS) { - return limitsBeforeCoordinate.upperLimit + 1; - } else { - return limitsBeforeCoordinate.lowerLimit; - } - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof GridModel.RelativeCoordinate)) { - return false; - } - - GridModel.RelativeCoordinate otherCoordinate = (GridModel.RelativeCoordinate) other; - return toComparisonValue() == otherCoordinate.toComparisonValue(); - } - - @Override - public int compareTo(GridModel.RelativeCoordinate other) { - return toComparisonValue() - other.toComparisonValue(); - } - } - - /** - * The location of a point relative to the Limits of nearby items; consists of both an x- and - * y-RelativeCoordinateLocation. - */ - private class RelativePoint { - final GridModel.RelativeCoordinate xLocation; - final GridModel.RelativeCoordinate yLocation; - - RelativePoint(Point point) { - this.xLocation = new RelativeCoordinate(mColumnBounds, point.x); - this.yLocation = new RelativeCoordinate(mRowBounds, point.y); - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof RelativePoint)) { - return false; - } - - RelativePoint otherPoint = (RelativePoint) other; - return xLocation.equals(otherPoint.xLocation) && yLocation.equals(otherPoint.yLocation); - } - } - - /** - * Generates a rectangle which contains the items selected by the pointer and origin. - * @return The rectangle, or null if no items were selected. - */ - private Rect computeBounds() { - Rect rect = new Rect(); - rect.left = getCoordinateValue( - min(mRelativeOrigin.xLocation, mRelativePointer.xLocation), - mColumnBounds, - true); - rect.right = getCoordinateValue( - max(mRelativeOrigin.xLocation, mRelativePointer.xLocation), - mColumnBounds, - false); - rect.top = getCoordinateValue( - min(mRelativeOrigin.yLocation, mRelativePointer.yLocation), - mRowBounds, - true); - rect.bottom = getCoordinateValue( - max(mRelativeOrigin.yLocation, mRelativePointer.yLocation), - mRowBounds, - false); - return rect; - } - - /** - * Computes the corner of the selection nearest the origin. - * @return - */ - private int computeCornerNearestOrigin() { - int cornerValue = 0; - - if (mRelativeOrigin.yLocation == - min(mRelativeOrigin.yLocation, mRelativePointer.yLocation)) { - cornerValue |= UPPER; - } else { - cornerValue |= LOWER; - } - - if (mRelativeOrigin.xLocation == - min(mRelativeOrigin.xLocation, mRelativePointer.xLocation)) { - cornerValue |= LEFT; - } else { - cornerValue |= RIGHT; - } - - return cornerValue; - } - - private GridModel.RelativeCoordinate min(GridModel.RelativeCoordinate first, GridModel.RelativeCoordinate second) { - return first.compareTo(second) < 0 ? first : second; - } - - private GridModel.RelativeCoordinate max(GridModel.RelativeCoordinate first, GridModel.RelativeCoordinate second) { - return first.compareTo(second) > 0 ? first : second; - } - - /** - * @return The absolute coordinate (i.e., the x- or y-value) of the given relative - * coordinate. - */ - private int getCoordinateValue(GridModel.RelativeCoordinate coordinate, - List<GridModel.Limits> limitsList, boolean isStartOfRange) { - switch (coordinate.type) { - case RelativeCoordinate.BEFORE_FIRST_ITEM: - return limitsList.get(0).lowerLimit; - case RelativeCoordinate.AFTER_LAST_ITEM: - return limitsList.get(limitsList.size() - 1).upperLimit; - case RelativeCoordinate.BETWEEN_TWO_ITEMS: - if (isStartOfRange) { - return coordinate.limitsAfterCoordinate.lowerLimit; - } else { - return coordinate.limitsBeforeCoordinate.upperLimit; - } - case RelativeCoordinate.WITHIN_LIMITS: - return coordinate.limitsBeforeCoordinate.lowerLimit; - } - - throw new RuntimeException("Invalid coordinate value."); - } - - private boolean areItemsCoveredByBand( - RelativePoint first, RelativePoint second) { - return doesCoordinateLocationCoverItems(first.xLocation, second.xLocation) && - doesCoordinateLocationCoverItems(first.yLocation, second.yLocation); - } - - private boolean doesCoordinateLocationCoverItems( - GridModel.RelativeCoordinate pointerCoordinate, - GridModel.RelativeCoordinate originCoordinate) { - if (pointerCoordinate.type == RelativeCoordinate.BEFORE_FIRST_ITEM && - originCoordinate.type == RelativeCoordinate.BEFORE_FIRST_ITEM) { - return false; - } - - if (pointerCoordinate.type == RelativeCoordinate.AFTER_LAST_ITEM && - originCoordinate.type == RelativeCoordinate.AFTER_LAST_ITEM) { - return false; - } - - if (pointerCoordinate.type == RelativeCoordinate.BETWEEN_TWO_ITEMS && - originCoordinate.type == RelativeCoordinate.BETWEEN_TWO_ITEMS && - pointerCoordinate.limitsBeforeCoordinate.equals( - originCoordinate.limitsBeforeCoordinate) && - pointerCoordinate.limitsAfterCoordinate.equals( - originCoordinate.limitsAfterCoordinate)) { - return false; - } - - return true; - } - } - - /** - * Provides functionality for BandController. Exists primarily to tests that are - * fully isolated from RecyclerView. - */ - interface SelectionEnvironment extends ScrollActionDelegate { - void showBand(Rect rect); - void hideBand(); - void addOnScrollListener(RecyclerView.OnScrollListener listener); - void removeOnScrollListener(RecyclerView.OnScrollListener listener); - int getHeight(); - void invalidateView(); - Point createAbsolutePoint(Point relativePoint); - Rect getAbsoluteRectForChildViewAt(int index); - int getAdapterPositionAt(int index); - int getColumnCount(); - int getChildCount(); - int getVisibleChildCount(); - /** - * Layout items are excluded from the GridModel. - */ - boolean isLayoutItem(int adapterPosition); - /** - * Items may be in the adapter, but without an attached view. - */ - boolean hasView(int adapterPosition); - } - - /** Recycler view facade implementation backed by good ol' RecyclerView. */ - private static final class RuntimeSelectionEnvironment implements SelectionEnvironment { - - private final RecyclerView mView; - private final Drawable mBand; - - private boolean mIsOverlayShown = false; - - RuntimeSelectionEnvironment(RecyclerView view) { - mView = view; - mBand = mView.getContext().getTheme().getDrawable(R.drawable.band_select_overlay); - } - - @Override - public int getAdapterPositionAt(int index) { - return mView.getChildAdapterPosition(mView.getChildAt(index)); - } - - @Override - public void addOnScrollListener(RecyclerView.OnScrollListener listener) { - mView.addOnScrollListener(listener); - } - - @Override - public void removeOnScrollListener(RecyclerView.OnScrollListener listener) { - mView.removeOnScrollListener(listener); - } - - @Override - public Point createAbsolutePoint(Point relativePoint) { - return new Point(relativePoint.x + mView.computeHorizontalScrollOffset(), - relativePoint.y + mView.computeVerticalScrollOffset()); - } - - @Override - public Rect getAbsoluteRectForChildViewAt(int index) { - final View child = mView.getChildAt(index); - final Rect childRect = new Rect(); - child.getHitRect(childRect); - childRect.left += mView.computeHorizontalScrollOffset(); - childRect.right += mView.computeHorizontalScrollOffset(); - childRect.top += mView.computeVerticalScrollOffset(); - childRect.bottom += mView.computeVerticalScrollOffset(); - return childRect; - } - - @Override - public int getChildCount() { - return mView.getAdapter().getItemCount(); - } - - @Override - public int getVisibleChildCount() { - return mView.getChildCount(); - } - - @Override - public int getColumnCount() { - RecyclerView.LayoutManager layoutManager = mView.getLayoutManager(); - if (layoutManager instanceof GridLayoutManager) { - return ((GridLayoutManager) layoutManager).getSpanCount(); - } - - // Otherwise, it is a list with 1 column. - return 1; - } - - @Override - public int getHeight() { - return mView.getHeight(); - } - - @Override - public void invalidateView() { - mView.invalidate(); - } - - @Override - public void runAtNextFrame(Runnable r) { - mView.postOnAnimation(r); - } - - @Override - public void removeCallback(Runnable r) { - mView.removeCallbacks(r); - } - - @Override - public void scrollBy(int dy) { - mView.scrollBy(0, dy); - } - - @Override - public void showBand(Rect rect) { - mBand.setBounds(rect); - - if (!mIsOverlayShown) { - mView.getOverlay().add(mBand); - } - } - - @Override - public void hideBand() { - mView.getOverlay().remove(mBand); - } - - @Override - public boolean isLayoutItem(int pos) { - // The band selection model only operates on documents and directories. Exclude other - // types of adapter items (e.g. whitespace items like dividers). - RecyclerView.ViewHolder vh = mView.findViewHolderForAdapterPosition(pos); - switch (vh.getItemViewType()) { - case ITEM_TYPE_DOCUMENT: - case ITEM_TYPE_DIRECTORY: - return false; - default: - return true; - } - } - - @Override - public boolean hasView(int pos) { - return mView.findViewHolderForAdapterPosition(pos) != null; - } - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryDragListener.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryDragListener.java deleted file mode 100644 index f0a7aae2b0d4..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryDragListener.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.view.DragEvent; -import android.view.View; - -import com.android.documentsui.ItemDragListener; - -class DirectoryDragListener extends ItemDragListener<DirectoryFragment> { - - DirectoryDragListener(DirectoryFragment fragment) { - super(fragment); - } - - @Override - public boolean onDrag(View v, DragEvent event) { - final boolean result = super.onDrag(v, event); - - if (event.getAction() == DragEvent.ACTION_DRAG_STARTED) { - mDragHost.dragStarted(); - } else if (event.getAction() == DragEvent.ACTION_DRAG_ENDED) { - // getResult() is true if drag was accepted - mDragHost.dragStopped(event.getResult()); - } - - return result; - } - - @Override - public boolean handleDropEventChecked(View v, DragEvent event) { - return mDragHost.handleDropEvent(v, event); - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java deleted file mode 100644 index db19881e5c79..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ /dev/null @@ -1,1711 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.State.MODE_GRID; -import static com.android.documentsui.State.MODE_LIST; -import static com.android.documentsui.State.SORT_ORDER_UNKNOWN; -import static com.android.documentsui.model.DocumentInfo.getCursorInt; -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.annotation.IntDef; -import android.annotation.StringRes; -import android.app.Activity; -import android.app.ActivityManager; -import android.app.AlertDialog; -import android.app.Fragment; -import android.app.FragmentManager; -import android.app.FragmentTransaction; -import android.app.LoaderManager.LoaderCallbacks; -import android.content.ClipData; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.Loader; -import android.database.Cursor; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import android.os.Parcelable; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.support.v13.view.DragStartHelper; -import android.support.v4.widget.SwipeRefreshLayout; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.GridLayoutManager.SpanSizeLookup; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.RecyclerListener; -import android.support.v7.widget.RecyclerView.ViewHolder; -import android.text.BidiFormatter; -import android.text.TextUtils; -import android.util.Log; -import android.util.SparseArray; -import android.view.ActionMode; -import android.view.ContextMenu; -import android.view.DragEvent; -import android.view.HapticFeedbackConstants; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toolbar; - -import com.android.documentsui.BaseActivity; -import com.android.documentsui.DirectoryLoader; -import com.android.documentsui.DirectoryResult; -import com.android.documentsui.DocumentsActivity; -import com.android.documentsui.DocumentsApplication; -import com.android.documentsui.Events.InputEvent; -import com.android.documentsui.Events.MotionInputEvent; -import com.android.documentsui.ItemDragListener; -import com.android.documentsui.MenuManager; -import com.android.documentsui.Menus; -import com.android.documentsui.MessageBar; -import com.android.documentsui.Metrics; -import com.android.documentsui.MimePredicate; -import com.android.documentsui.R; -import com.android.documentsui.RecentsLoader; -import com.android.documentsui.RetainedState; -import com.android.documentsui.RootsCache; -import com.android.documentsui.Shared; -import com.android.documentsui.Snackbars; -import com.android.documentsui.State; -import com.android.documentsui.State.ViewMode; -import com.android.documentsui.ThumbnailCache; -import com.android.documentsui.clipping.DocumentClipper; -import com.android.documentsui.clipping.UrisSupplier; -import com.android.documentsui.dirlist.MultiSelectManager.Selection; -import com.android.documentsui.dirlist.UserInputHandler.DocumentDetails; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperation; -import com.android.documentsui.services.FileOperationService; -import com.android.documentsui.services.FileOperationService.OpType; -import com.android.documentsui.services.FileOperations; - -import java.io.IOException; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.function.Function; - -import javax.annotation.Nullable; - -/** - * Display the documents inside a single directory. - */ -public class DirectoryFragment extends Fragment - implements DocumentsAdapter.Environment, LoaderCallbacks<DirectoryResult>, - ItemDragListener.DragHost, SwipeRefreshLayout.OnRefreshListener { - - @IntDef(flag = true, value = { - TYPE_NORMAL, - TYPE_RECENT_OPEN - }) - @Retention(RetentionPolicy.SOURCE) - public @interface ResultType {} - public static final int TYPE_NORMAL = 1; - public static final int TYPE_RECENT_OPEN = 2; - - @IntDef(flag = true, value = { - REQUEST_COPY_DESTINATION - }) - @Retention(RetentionPolicy.SOURCE) - public @interface RequestCode {} - public static final int REQUEST_COPY_DESTINATION = 1; - - private static final String TAG = "DirectoryFragment"; - private static final int LOADER_ID = 42; - - private static final int CACHE_EVICT_LIMIT = 100; - private static final int REFRESH_SPINNER_DISMISS_DELAY = 500; - - private Model mModel; - private MultiSelectManager mSelectionMgr; - private Model.UpdateListener mModelUpdateListener = new ModelUpdateListener(); - private UserInputHandler<InputEvent> mInputHandler; - private SelectionModeListener mSelectionModeListener; - private FocusManager mFocusManager; - - private IconHelper mIconHelper; - - private SwipeRefreshLayout mRefreshLayout; - private View mEmptyView; - private RecyclerView mRecView; - private ListeningGestureDetector mGestureDetector; - - private String mStateKey; - - private int mLastSortOrder = SORT_ORDER_UNKNOWN; - private DocumentsAdapter mAdapter; - private FragmentTuner mTuner; - private DocumentClipper mClipper; - private GridLayoutManager mLayout; - private int mColumnCount = 1; // This will get updated when layout changes. - - private LayoutInflater mInflater; - private MessageBar mMessageBar; - private View mProgressBar; - - // Directory fragment state is defined by: root, document, query, type, selection - private @ResultType int mType = TYPE_NORMAL; - private RootInfo mRoot; - private DocumentInfo mDocument; - private String mQuery = null; - // Note, we use !null to indicate that selection was restored (from rotation). - // So don't fiddle with this field unless you've got the bigger picture in mind. - private @Nullable Selection mRestoredSelection = null; - // Here we save the clip details of moveTo/copyTo actions when picker shows up. - // This will be written to saved instance. - private @Nullable FileOperation mPendingOperation; - private boolean mSearchMode = false; - - private @Nullable BandController mBandController; - private @Nullable ActionMode mActionMode; - - private DragScrollListener mOnDragListener; - private MenuManager mMenuManager; - - @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - mInflater = inflater; - final View view = inflater.inflate(R.layout.fragment_directory, container, false); - - mMessageBar = MessageBar.create(getChildFragmentManager()); - mProgressBar = view.findViewById(R.id.progressbar); - - mRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh_layout); - mRefreshLayout.setOnRefreshListener(this); - - mEmptyView = view.findViewById(android.R.id.empty); - mRecView = (RecyclerView) view.findViewById(R.id.dir_list); - mRecView.setRecyclerListener( - new RecyclerListener() { - @Override - public void onViewRecycled(ViewHolder holder) { - cancelThumbnailTask(holder.itemView); - } - }); - - mRecView.setItemAnimator(new DirectoryItemAnimator(getActivity())); - - mOnDragListener = DragScrollListener.create( - getActivity(), new DirectoryDragListener(this), mRecView); - - // Make the recycler and the empty views responsive to drop events. - mRecView.setOnDragListener(mOnDragListener); - mEmptyView.setOnDragListener(mOnDragListener); - - return view; - } - - @Override - public void onDestroyView() { - mSelectionMgr.clearSelection(); - - // Cancel any outstanding thumbnail requests - final int count = mRecView.getChildCount(); - for (int i = 0; i < count; i++) { - final View view = mRecView.getChildAt(i); - cancelThumbnailTask(view); - } - - super.onDestroyView(); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - final Context context = getActivity(); - final State state = getDisplayState(); - - // Read arguments when object created for the first time. - // Restore state if fragment recreated. - Bundle args = savedInstanceState == null ? getArguments() : savedInstanceState; - mRoot = args.getParcelable(Shared.EXTRA_ROOT); - mDocument = args.getParcelable(Shared.EXTRA_DOC); - mStateKey = buildStateKey(mRoot, mDocument); - mQuery = args.getString(Shared.EXTRA_QUERY); - mType = args.getInt(Shared.EXTRA_TYPE); - mSearchMode = args.getBoolean(Shared.EXTRA_SEARCH_MODE); - mPendingOperation = args.getParcelable(FileOperationService.EXTRA_OPERATION); - - // Restore any selection we may have squirreled away in retained state. - @Nullable RetainedState retained = getBaseActivity().getRetainedState(); - if (retained != null && retained.hasSelection()) { - // We claim the selection for ourselves and null it out once used - // so we don't have a rando selection hanging around in RetainedState. - mRestoredSelection = retained.selection; - retained.selection = null; - } - - mIconHelper = new IconHelper(context, MODE_GRID); - - mAdapter = new SectionBreakDocumentsAdapterWrapper( - this, new ModelBackedDocumentsAdapter(this, mIconHelper)); - - mRecView.setAdapter(mAdapter); - - mLayout = new GridLayoutManager(getContext(), mColumnCount); - SpanSizeLookup lookup = mAdapter.createSpanSizeLookup(); - if (lookup != null) { - mLayout.setSpanSizeLookup(lookup); - } - mRecView.setLayoutManager(mLayout); - - // TODO: instead of inserting the view into the constructor, extract listener-creation code - // and set the listener on the view after the fact. Then the view doesn't need to be passed - // into the selection manager. - mSelectionMgr = new MultiSelectManager( - mAdapter, - state.allowMultiple - ? MultiSelectManager.MODE_MULTIPLE - : MultiSelectManager.MODE_SINGLE); - - // Make sure this is done after the RecyclerView is set up. - mFocusManager = new FocusManager(context, mRecView, mModel); - - mInputHandler = new UserInputHandler<>( - mSelectionMgr, - mFocusManager, - new Function<MotionEvent, InputEvent>() { - @Override - public InputEvent apply(MotionEvent t) { - return MotionInputEvent.obtain(t, mRecView); - } - }, - this::getTarget, - this::canSelect, - this::onRightClick, - this::onActivate, - (DocumentDetails ignored) -> { - return onDeleteSelectedDocuments(); - }); - - mGestureDetector = - new ListeningGestureDetector(this.getContext(), mDragHelper, mInputHandler); - - mRecView.addOnItemTouchListener(mGestureDetector); - mEmptyView.setOnTouchListener(mGestureDetector); - - if (state.allowMultiple) { - mBandController = new BandController(mRecView, mAdapter, mSelectionMgr); - } - - mSelectionModeListener = new SelectionModeListener(); - mSelectionMgr.addCallback(mSelectionModeListener); - - mModel = new Model(); - mModel.addUpdateListener(mAdapter); - mModel.addUpdateListener(mModelUpdateListener); - - final BaseActivity activity = getBaseActivity(); - mTuner = activity.createFragmentTuner(); - mMenuManager = activity.getMenuManager(); - mClipper = DocumentsApplication.getDocumentClipper(getContext()); - - final ActivityManager am = (ActivityManager) context.getSystemService( - Context.ACTIVITY_SERVICE); - boolean svelte = am.isLowRamDevice() && (mType == TYPE_RECENT_OPEN); - mIconHelper.setThumbnailsEnabled(!svelte); - - // Kick off loader at least once - getLoaderManager().restartLoader(LOADER_ID, null, this); - } - - public void retainState(RetainedState state) { - state.selection = mSelectionMgr.getSelection(new Selection()); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putInt(Shared.EXTRA_TYPE, mType); - outState.putParcelable(Shared.EXTRA_ROOT, mRoot); - outState.putParcelable(Shared.EXTRA_DOC, mDocument); - outState.putString(Shared.EXTRA_QUERY, mQuery); - outState.putBoolean(Shared.EXTRA_SEARCH_MODE, mSearchMode); - outState.putParcelable(FileOperationService.EXTRA_OPERATION, mPendingOperation); - } - - @Override - public void onActivityResult(@RequestCode int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case REQUEST_COPY_DESTINATION: - handleCopyResult(resultCode, data); - break; - default: - throw new UnsupportedOperationException("Unknown request code: " + requestCode); - } - } - - @Override - public void onCreateContextMenu(ContextMenu menu, - View v, - ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - MenuInflater inflater = getActivity().getMenuInflater(); - inflater.inflate(R.menu.context_menu, menu); - - menu.add(Menu.NONE, R.id.menu_create_dir, Menu.NONE, R.string.menu_create_dir); - menu.add(Menu.NONE, R.id.menu_delete, Menu.NONE, R.string.menu_delete); - menu.add(Menu.NONE, R.id.menu_rename, Menu.NONE, R.string.menu_rename); - - if (v == mRecView || v == mEmptyView) { - mMenuManager.updateContextMenu(menu, null, getBaseActivity().getDirectoryDetails()); - } else { - mMenuManager.updateContextMenu(menu, mSelectionModeListener, - getBaseActivity().getDirectoryDetails()); - } - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - return handleMenuItemClick(item); - } - - private void handleCopyResult(int resultCode, Intent data) { - - FileOperation operation = mPendingOperation; - mPendingOperation = null; - - if (resultCode == Activity.RESULT_CANCELED || data == null) { - // User pressed the back button or otherwise cancelled the destination pick. Don't - // proceed with the copy. - operation.dispose(); - return; - } - - operation.setDestination(data.getParcelableExtra(Shared.EXTRA_STACK)); - - BaseActivity activity = getBaseActivity(); - FileOperations.start(activity, operation, activity.fileOpCallback); - } - - protected boolean onRightClick(InputEvent e) { - if (e.getItemPosition() != RecyclerView.NO_POSITION) { - final DocumentHolder doc = getTarget(e); - if (!mSelectionMgr.getSelection().contains(doc.modelId)) { - mSelectionMgr.replaceSelection(Collections.singleton(doc.modelId)); - } - - // We are registering for context menu here so long-press doesn't trigger this - // floating context menu, and then quickly unregister right afterwards - registerForContextMenu(doc.itemView); - mRecView.showContextMenuForChild(doc.itemView, - e.getX() - doc.itemView.getLeft(), e.getY() - doc.itemView.getTop()); - unregisterForContextMenu(doc.itemView); - return true; - } - - // If there was no corresponding item pos, that means user right-clicked on the blank - // pane - // We would want to show different options then, and not select any item - // The blank pane could be the recyclerView or the emptyView, so we need to register - // according to whichever one is visible - if (mEmptyView.getVisibility() == View.VISIBLE) { - registerForContextMenu(mEmptyView); - mEmptyView.showContextMenu(e.getX(), e.getY()); - unregisterForContextMenu(mEmptyView); - return true; - } - - registerForContextMenu(mRecView); - mRecView.showContextMenu(e.getX(), e.getY()); - unregisterForContextMenu(mRecView); - return true; - } - - private boolean handleViewItem(String id) { - final Cursor cursor = mModel.getItem(id); - - if (cursor == null) { - Log.w(TAG, "Can't view item. Can't obtain cursor for modeId" + id); - return false; - } - - final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - if (mTuner.isDocumentEnabled(docMimeType, docFlags)) { - final DocumentInfo doc = DocumentInfo.fromDirectoryCursor(cursor); - getBaseActivity().onDocumentPicked(doc, mModel); - mSelectionMgr.clearSelection(); - return true; - } - return false; - } - - @Override - public void onStop() { - super.onStop(); - - // Remember last scroll location - final SparseArray<Parcelable> container = new SparseArray<Parcelable>(); - getView().saveHierarchyState(container); - final State state = getDisplayState(); - state.dirState.put(mStateKey, container); - } - - public void onDisplayStateChanged() { - updateDisplayState(); - } - - public void onSortOrderChanged() { - // Sort order is implemented as a sorting wrapper around directory - // results. So when sort order changes, we force a reload of the directory. - getLoaderManager().restartLoader(LOADER_ID, null, this); - } - - public void onViewModeChanged() { - // Mode change is just visual change; no need to kick loader. - updateDisplayState(); - } - - private void updateDisplayState() { - State state = getDisplayState(); - updateLayout(state.derivedMode); - mRecView.setAdapter(mAdapter); - } - - /** - * Updates the layout after the view mode switches. - * @param mode The new view mode. - */ - private void updateLayout(@ViewMode int mode) { - mColumnCount = calculateColumnCount(mode); - if (mLayout != null) { - mLayout.setSpanCount(mColumnCount); - } - - int pad = getDirectoryPadding(mode); - mRecView.setPadding(pad, pad, pad, pad); - mRecView.requestLayout(); - if (mBandController != null) { - mBandController.handleLayoutChanged(); - } - mIconHelper.setViewMode(mode); - } - - private int calculateColumnCount(@ViewMode int mode) { - if (mode == MODE_LIST) { - // List mode is a "grid" with 1 column. - return 1; - } - - int cellWidth = getResources().getDimensionPixelSize(R.dimen.grid_width); - int cellMargin = 2 * getResources().getDimensionPixelSize(R.dimen.grid_item_margin); - int viewPadding = mRecView.getPaddingLeft() + mRecView.getPaddingRight(); - - // RecyclerView sometimes gets a width of 0 (see b/27150284). Clamp so that we always lay - // out the grid with at least 2 columns. - int columnCount = Math.max(2, - (mRecView.getWidth() - viewPadding) / (cellWidth + cellMargin)); - - return columnCount; - } - - private int getDirectoryPadding(@ViewMode int mode) { - switch (mode) { - case MODE_GRID: - return getResources().getDimensionPixelSize(R.dimen.grid_container_padding); - case MODE_LIST: - return getResources().getDimensionPixelSize(R.dimen.list_container_padding); - default: - throw new IllegalArgumentException("Unsupported layout mode: " + mode); - } - } - - @Override - public int getColumnCount() { - return mColumnCount; - } - - // Support method to replace getOwner().foo() with something - // slightly less clumsy like: getOwner().foo(). - private BaseActivity getBaseActivity() { - return (BaseActivity) getActivity(); - } - - /** - * Manages the integration between our ActionMode and MultiSelectManager, initiating - * ActionMode when there is a selection, canceling it when there is no selection, - * and clearing selection when action mode is explicitly exited by the user. - */ - private final class SelectionModeListener implements MultiSelectManager.Callback, - ActionMode.Callback, MenuManager.SelectionDetails { - - private Selection mSelected = new Selection(); - - // Partial files are files that haven't been fully downloaded. - private int mPartialCount = 0; - private int mDirectoryCount = 0; - private int mNoDeleteCount = 0; - private int mNoRenameCount = 0; - - private Menu mMenu; - - @Override - public boolean onBeforeItemStateChange(String modelId, boolean selected) { - if (selected) { - final Cursor cursor = mModel.getItem(modelId); - if (cursor == null) { - Log.w(TAG, "Can't obtain cursor for modelId: " + modelId); - return false; - } - - final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - if (!mTuner.canSelectType(docMimeType, docFlags)) { - return false; - } - return mTuner.canSelectType(docMimeType, docFlags); - } - return true; - } - - @Override - public void onItemStateChanged(String modelId, boolean selected) { - final Cursor cursor = mModel.getItem(modelId); - if (cursor == null) { - Log.w(TAG, "Model returned null cursor for document: " + modelId - + ". Ignoring state changed event."); - return; - } - - // TODO: Should this be happening in onSelectionChanged? Technically this callback is - // triggered on "silent" selection updates (i.e. we might be reacting to unfinalized - // selection changes here) - final String mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - if (MimePredicate.isDirectoryType(mimeType)) { - mDirectoryCount += selected ? 1 : -1; - } - - final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - if ((docFlags & Document.FLAG_PARTIAL) != 0) { - mPartialCount += selected ? 1 : -1; - } - if ((docFlags & Document.FLAG_SUPPORTS_DELETE) == 0) { - mNoDeleteCount += selected ? 1 : -1; - } - if ((docFlags & Document.FLAG_SUPPORTS_RENAME) == 0) { - mNoRenameCount += selected ? 1 : -1; - } - } - - @Override - public void onSelectionChanged() { - mSelectionMgr.getSelection(mSelected); - if (mSelected.size() > 0) { - if (DEBUG) Log.d(TAG, "Maybe starting action mode."); - if (mActionMode == null) { - if (DEBUG) Log.d(TAG, "Yeah. Starting action mode."); - mActionMode = getActivity().startActionMode(this); - } - updateActionMenu(); - } else { - if (DEBUG) Log.d(TAG, "Finishing action mode."); - if (mActionMode != null) { - mActionMode.finish(); - } - } - - if (mActionMode != null) { - assert(!mSelected.isEmpty()); - final String title = Shared.getQuantityString(getActivity(), - R.plurals.elements_selected, mSelected.size()); - mActionMode.setTitle(title); - mRecView.announceForAccessibility(title); - } - } - - // Called when the user exits the action mode - @Override - public void onDestroyActionMode(ActionMode mode) { - if (DEBUG) Log.d(TAG, "Handling action mode destroyed."); - mActionMode = null; - // clear selection - mSelectionMgr.clearSelection(); - mSelected.clear(); - - mDirectoryCount = 0; - mPartialCount = 0; - mNoDeleteCount = 0; - mNoRenameCount = 0; - - // Re-enable TalkBack for the toolbars, as they are no longer covered by action mode. - final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); - toolbar.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); - - // This toolbar is not present in the fixed_layout - final Toolbar rootsToolbar = (Toolbar) getActivity().findViewById(R.id.roots_toolbar); - if (rootsToolbar != null) { - rootsToolbar.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); - } - } - - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - if (mRestoredSelection != null) { - // This is a careful little song and dance to avoid haptic feedback - // when selection has been restored after rotation. We're - // also responsible for cleaning up restored selection so the - // object dones't unnecessarily hang around. - mRestoredSelection = null; - } else { - mRecView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - } - - int size = mSelectionMgr.getSelection().size(); - mode.getMenuInflater().inflate(R.menu.mode_directory, menu); - mode.setTitle(TextUtils.formatSelectedCount(size)); - - if (size > 0) { - // Hide the toolbars if action mode is enabled, so TalkBack doesn't navigate to - // these controls when using linear navigation. - final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); - toolbar.setImportantForAccessibility( - View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); - - // This toolbar is not present in the fixed_layout - final Toolbar rootsToolbar = (Toolbar) getActivity().findViewById( - R.id.roots_toolbar); - if (rootsToolbar != null) { - rootsToolbar.setImportantForAccessibility( - View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS); - } - return true; - } - - return false; - } - - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - mMenu = menu; - updateActionMenu(); - return true; - } - - @Override - public boolean containsDirectories() { - return mDirectoryCount > 0; - } - - @Override - public boolean containsPartialFiles() { - return mPartialCount > 0; - } - - @Override - public boolean canDelete() { - return mNoDeleteCount == 0; - } - - @Override - public boolean canRename() { - return mNoRenameCount == 0 && mSelectionMgr.getSelection().size() == 1; - } - - private void updateActionMenu() { - assert(mMenu != null); - mMenuManager.updateActionMenu(mMenu, this); - Menus.disableHiddenItems(mMenu); - } - - @Override - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - return handleMenuItemClick(item); - } - } - - private boolean handleMenuItemClick(MenuItem item) { - Selection selection = mSelectionMgr.getSelection(new Selection()); - - switch (item.getItemId()) { - case R.id.menu_open: - openDocuments(selection); - mActionMode.finish(); - return true; - - case R.id.menu_share: - shareDocuments(selection); - // TODO: Only finish selection if share action is completed. - mActionMode.finish(); - return true; - - case R.id.menu_delete: - // deleteDocuments will end action mode if the documents are deleted. - // It won't end action mode if user cancels the delete. - deleteDocuments(selection); - return true; - - case R.id.menu_copy_to: - transferDocuments(selection, FileOperationService.OPERATION_COPY); - // TODO: Only finish selection mode if copy-to is not canceled. - // Need to plum down into handling the way we do with deleteDocuments. - mActionMode.finish(); - return true; - - case R.id.menu_move_to: - // Exit selection mode first, so we avoid deselecting deleted documents. - mActionMode.finish(); - transferDocuments(selection, FileOperationService.OPERATION_MOVE); - return true; - - case R.id.menu_cut_to_clipboard: - cutSelectedToClipboard(); - return true; - - case R.id.menu_copy_to_clipboard: - copySelectedToClipboard(); - return true; - - case R.id.menu_paste_from_clipboard: - pasteFromClipboard(); - return true; - - case R.id.menu_select_all: - selectAllFiles(); - return true; - - case R.id.menu_rename: - // Exit selection mode first, so we avoid deselecting deleted - // (renamed) documents. - mActionMode.finish(); - renameDocuments(selection); - return true; - - default: - // See if BaseActivity can handle this particular MenuItem - if (!getBaseActivity().onOptionsItemSelected(item)) { - if (DEBUG) Log.d(TAG, "Unhandled menu item selected: " + item); - return false; - } - return true; - } - } - - public final boolean onBackPressed() { - if (mSelectionMgr.hasSelection()) { - if (DEBUG) Log.d(TAG, "Clearing selection on selection manager."); - mSelectionMgr.clearSelection(); - return true; - } - return false; - } - - private void cancelThumbnailTask(View view) { - final ImageView iconThumb = (ImageView) view.findViewById(R.id.icon_thumb); - if (iconThumb != null) { - mIconHelper.stopLoading(iconThumb); - } - } - - private void openDocuments(final Selection selected) { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_OPEN); - - new GetDocumentsTask() { - @Override - void onDocumentsReady(List<DocumentInfo> docs) { - // TODO: Implement support in Files activity for opening multiple docs. - BaseActivity.get(DirectoryFragment.this).onDocumentsPicked(docs); - } - }.execute(selected); - } - - private void shareDocuments(final Selection selected) { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_SHARE); - - new GetDocumentsTask() { - @Override - void onDocumentsReady(List<DocumentInfo> docs) { - Intent intent; - - // Filter out directories and virtual files - those can't be shared. - List<DocumentInfo> docsForSend = new ArrayList<>(); - for (DocumentInfo doc: docs) { - if (!doc.isDirectory() && !doc.isVirtualDocument()) { - docsForSend.add(doc); - } - } - - if (docsForSend.size() == 1) { - final DocumentInfo doc = docsForSend.get(0); - - intent = new Intent(Intent.ACTION_SEND); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.addCategory(Intent.CATEGORY_DEFAULT); - intent.setType(doc.mimeType); - intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri); - - } else if (docsForSend.size() > 1) { - intent = new Intent(Intent.ACTION_SEND_MULTIPLE); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.addCategory(Intent.CATEGORY_DEFAULT); - - final ArrayList<String> mimeTypes = new ArrayList<>(); - final ArrayList<Uri> uris = new ArrayList<>(); - for (DocumentInfo doc : docsForSend) { - mimeTypes.add(doc.mimeType); - uris.add(doc.derivedUri); - } - - intent.setType(findCommonMimeType(mimeTypes)); - intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); - - } else { - return; - } - - intent = Intent.createChooser(intent, getActivity().getText(R.string.share_via)); - startActivity(intent); - } - }.execute(selected); - } - - private String generateDeleteMessage(final List<DocumentInfo> docs) { - String message; - int dirsCount = 0; - - for (DocumentInfo doc : docs) { - if (doc.isDirectory()) { - ++dirsCount; - } - } - - if (docs.size() == 1) { - // Deleteing 1 file xor 1 folder in cwd - - // Address b/28772371, where including user strings in message can result in - // broken bidirectional support. - String displayName = BidiFormatter.getInstance().unicodeWrap(docs.get(0).displayName); - message = dirsCount == 0 - ? getActivity().getString(R.string.delete_filename_confirmation_message, - displayName) - : getActivity().getString(R.string.delete_foldername_confirmation_message, - displayName); - } else if (dirsCount == 0) { - // Deleting only files in cwd - message = Shared.getQuantityString(getActivity(), - R.plurals.delete_files_confirmation_message, docs.size()); - } else if (dirsCount == docs.size()) { - // Deleting only folders in cwd - message = Shared.getQuantityString(getActivity(), - R.plurals.delete_folders_confirmation_message, docs.size()); - } else { - // Deleting mixed items (files and folders) in cwd - message = Shared.getQuantityString(getActivity(), - R.plurals.delete_items_confirmation_message, docs.size()); - } - return message; - } - - private boolean onDeleteSelectedDocuments() { - if (mSelectionMgr.hasSelection()) { - deleteDocuments(mSelectionMgr.getSelection(new Selection())); - } - return false; - } - - private boolean onActivate(DocumentDetails doc) { - // Toggle selection if we're in selection mode, othewise, view item. - if (mSelectionMgr.hasSelection()) { - mSelectionMgr.toggleSelection(doc.getModelId()); - } else { - handleViewItem(doc.getModelId()); - } - return true; - } - -// private boolean onSelect(DocumentDetails doc) { -// mSelectionMgr.toggleSelection(doc.getModelId()); -// mSelectionMgr.setSelectionRangeBegin(doc.getAdapterPosition()); -// return true; -// } - - private void deleteDocuments(final Selection selected) { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_DELETE); - - assert(!selected.isEmpty()); - - final DocumentInfo srcParent = getDisplayState().stack.peek(); - new GetDocumentsTask() { - @Override - void onDocumentsReady(final List<DocumentInfo> docs) { - - TextView message = - (TextView) mInflater.inflate(R.layout.dialog_delete_confirmation, null); - message.setText(generateDeleteMessage(docs)); - - // For now, we implement this dialog NOT - // as a fragment (which can survive rotation and have its own state), - // but as a simple runtime dialog. So rotating a device with an - // active delete dialog...results in that dialog disappearing. - // We can do better, but don't have cycles for it now. - new AlertDialog.Builder(getActivity()) - .setView(message) - .setPositiveButton( - android.R.string.ok, - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - // Finish selection mode first which clears selection so we - // don't end up trying to deselect deleted documents. - // This is done here, rather in the onActionItemClicked - // so we can avoid de-selecting items in the case where - // the user cancels the delete. - if (mActionMode != null) { - mActionMode.finish(); - } else { - Log.w(TAG, "Action mode is null before deleting documents."); - } - - UrisSupplier srcs; - try { - srcs = UrisSupplier.create( - selected, - mModel::getItemUri, - getContext()); - } catch(IOException e) { - throw new RuntimeException("Failed to create uri supplier.", e); - } - - FileOperation operation = new FileOperation.Builder() - .withOpType(FileOperationService.OPERATION_DELETE) - .withDestination(getDisplayState().stack) - .withSrcs(srcs) - .withSrcParent(srcParent.derivedUri) - .build(); - - BaseActivity activity = getBaseActivity(); - FileOperations.start(activity, operation, activity.fileOpCallback); - } - }) - .setNegativeButton(android.R.string.cancel, null) - .show(); - } - }.execute(selected); - } - - private void transferDocuments(final Selection selected, final @OpType int mode) { - if(mode == FileOperationService.OPERATION_COPY) { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_COPY_TO); - } else if (mode == FileOperationService.OPERATION_MOVE) { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_MOVE_TO); - } - - // Pop up a dialog to pick a destination. This is inadequate but works for now. - // TODO: Implement a picker that is to spec. - final Intent intent = new Intent( - Shared.ACTION_PICK_COPY_DESTINATION, - Uri.EMPTY, - getActivity(), - DocumentsActivity.class); - - UrisSupplier srcs; - try { - srcs = UrisSupplier.create(selected, mModel::getItemUri, getContext()); - } catch(IOException e) { - throw new RuntimeException("Failed to create uri supplier.", e); - } - - Uri srcParent = getDisplayState().stack.peek().derivedUri; - mPendingOperation = new FileOperation.Builder() - .withOpType(mode) - .withSrcParent(srcParent) - .withSrcs(srcs) - .build(); - - // Relay any config overrides bits present in the original intent. - Intent original = getActivity().getIntent(); - if (original != null && original.hasExtra(Shared.EXTRA_PRODUCTIVITY_MODE)) { - intent.putExtra( - Shared.EXTRA_PRODUCTIVITY_MODE, - original.getBooleanExtra(Shared.EXTRA_PRODUCTIVITY_MODE, false)); - } - - // Set an appropriate title on the drawer when it is shown in the picker. - // Coupled with the fact that we auto-open the drawer for copy/move operations - // it should basically be the thing people see first. - int drawerTitleId = mode == FileOperationService.OPERATION_MOVE - ? R.string.menu_move : R.string.menu_copy; - intent.putExtra(DocumentsContract.EXTRA_PROMPT, getResources().getString(drawerTitleId)); - - new GetDocumentsTask() { - @Override - void onDocumentsReady(List<DocumentInfo> docs) { - // Determine if there is a directory in the set of documents - // to be copied? Why? Directory creation isn't supported by some roots - // (like Downloads). This informs DocumentsActivity (the "picker") - // to restrict available roots to just those with support. - intent.putExtra(Shared.EXTRA_DIRECTORY_COPY, hasDirectory(docs)); - intent.putExtra(FileOperationService.EXTRA_OPERATION_TYPE, mode); - - // This just identifies the type of request...we'll check it - // when we reveive a response. - startActivityForResult(intent, REQUEST_COPY_DESTINATION); - } - - }.execute(selected); - } - - private static boolean hasDirectory(List<DocumentInfo> docs) { - for (DocumentInfo info : docs) { - if (Document.MIME_TYPE_DIR.equals(info.mimeType)) { - return true; - } - } - return false; - } - - private void renameDocuments(Selection selected) { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_RENAME); - - // Batch renaming not supported - // Rename option is only available in menu when 1 document selected - assert(selected.size() == 1); - - new GetDocumentsTask() { - @Override - void onDocumentsReady(List<DocumentInfo> docs) { - RenameDocumentFragment.show(getFragmentManager(), docs.get(0)); - } - }.execute(selected); - } - - @Override - public void initDocumentHolder(DocumentHolder holder) { - holder.addKeyEventListener(mInputHandler); - holder.itemView.setOnFocusChangeListener(mFocusManager); - } - - @Override - public void onBindDocumentHolder(DocumentHolder holder, Cursor cursor) { - setupDragAndDropOnDocumentView(holder.itemView, cursor); - } - - @Override - public State getDisplayState() { - return getBaseActivity().getDisplayState(); - } - - @Override - public Model getModel() { - return mModel; - } - - @Override - public boolean isDocumentEnabled(String docMimeType, int docFlags) { - return mTuner.isDocumentEnabled(docMimeType, docFlags); - } - - private void showEmptyDirectory() { - showEmptyView(R.string.empty, R.drawable.cabinet); - } - - private void showNoResults(RootInfo root) { - CharSequence msg = getContext().getResources().getText(R.string.no_results); - showEmptyView(String.format(String.valueOf(msg), root.title), R.drawable.cabinet); - } - - private void showQueryError() { - showEmptyView(R.string.query_error, R.drawable.hourglass); - } - - private void showEmptyView(@StringRes int id, int drawable) { - showEmptyView(getContext().getResources().getText(id), drawable); - } - - private void showEmptyView(CharSequence msg, int drawable) { - View content = mEmptyView.findViewById(R.id.content); - TextView msgView = (TextView) mEmptyView.findViewById(R.id.message); - ImageView imageView = (ImageView) mEmptyView.findViewById(R.id.artwork); - msgView.setText(msg); - imageView.setImageResource(drawable); - - mEmptyView.setVisibility(View.VISIBLE); - mEmptyView.requestFocus(); - mRecView.setVisibility(View.GONE); - } - - private void showDirectory() { - mEmptyView.setVisibility(View.GONE); - mRecView.setVisibility(View.VISIBLE); - mRecView.requestFocus(); - } - - private String findCommonMimeType(List<String> mimeTypes) { - String[] commonType = mimeTypes.get(0).split("/"); - if (commonType.length != 2) { - return "*/*"; - } - - for (int i = 1; i < mimeTypes.size(); i++) { - String[] type = mimeTypes.get(i).split("/"); - if (type.length != 2) continue; - - if (!commonType[1].equals(type[1])) { - commonType[1] = "*"; - } - - if (!commonType[0].equals(type[0])) { - commonType[0] = "*"; - commonType[1] = "*"; - break; - } - } - - return commonType[0] + "/" + commonType[1]; - } - - public void copySelectedToClipboard() { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_COPY_CLIPBOARD); - - Selection selection = mSelectionMgr.getSelection(new Selection()); - if (selection.isEmpty()) { - return; - } - mSelectionMgr.clearSelection(); - - mClipper.clipDocumentsForCopy(mModel::getItemUri, selection); - - Snackbars.showDocumentsClipped(getActivity(), selection.size()); - } - - public void cutSelectedToClipboard() { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_CUT_CLIPBOARD); - - Selection selection = mSelectionMgr.getSelection(new Selection()); - if (selection.isEmpty()) { - return; - } - mSelectionMgr.clearSelection(); - - mClipper.clipDocumentsForCut(mModel::getItemUri, selection, getDisplayState().stack.peek()); - - Snackbars.showDocumentsClipped(getActivity(), selection.size()); - } - - public void pasteFromClipboard() { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_PASTE_CLIPBOARD); - - BaseActivity activity = (BaseActivity) getActivity(); - DocumentInfo destination = activity.getCurrentDirectory(); - mClipper.copyFromClipboard( - destination, activity.getDisplayState().stack, activity.fileOpCallback); - getActivity().invalidateOptionsMenu(); - } - - public void selectAllFiles() { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_SELECT_ALL); - - // Exclude disabled files - List<String> enabled = new ArrayList<String>(); - for (String id : mAdapter.getModelIds()) { - Cursor cursor = getModel().getItem(id); - if (cursor == null) { - Log.w(TAG, "Skipping selection. Can't obtain cursor for modeId: " + id); - continue; - } - String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - if (isDocumentEnabled(docMimeType, docFlags)) { - enabled.add(id); - } - } - - // Only select things currently visible in the adapter. - boolean changed = mSelectionMgr.setItemsSelected(enabled, true); - if (changed) { - updateDisplayState(); - } - } - - /** - * Attempts to restore focus on the directory listing. - */ - public void requestFocus() { - mFocusManager.restoreLastFocus(); - } - - private void setupDragAndDropOnDocumentView(View view, Cursor cursor) { - final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - if (Document.MIME_TYPE_DIR.equals(docMimeType)) { - // Make a directory item a drop target. Drop on non-directories and empty space - // is handled at the list/grid view level. - view.setOnDragListener(mOnDragListener); - } - - if (mTuner.dragAndDropEnabled()) { - // Make all items draggable. - view.setOnLongClickListener(onLongClickListener); - } - } - - void dragStarted() { - // When files are selected for dragging, ActionMode is started. This obscures the breadcrumb - // with an ActionBar. In order to make drag and drop to the breadcrumb possible, we first - // end ActionMode so the breadcrumb is visible to the user. - if (mActionMode != null) { - mActionMode.finish(); - } - } - - void dragStopped(boolean result) { - if (result) { - mSelectionMgr.clearSelection(); - } - } - - @Override - public void runOnUiThread(Runnable runnable) { - getActivity().runOnUiThread(runnable); - } - - /** - * {@inheritDoc} - * - * In DirectoryFragment, we spring loads the hovered folder. - */ - @Override - public void onViewHovered(View view) { - BaseActivity activity = (BaseActivity) getActivity(); - if (getModelId(view) != null) { - activity.springOpenDirectory(getDestination(view)); - } - - activity.setRootsDrawerOpen(false); - } - - boolean handleDropEvent(View v, DragEvent event) { - BaseActivity activity = (BaseActivity) getActivity(); - activity.setRootsDrawerOpen(false); - - ClipData clipData = event.getClipData(); - assert (clipData != null); - - assert(DocumentClipper.getOpType(clipData) == FileOperationService.OPERATION_COPY); - - // Don't copy from the cwd into the cwd. Note: this currently doesn't work for - // multi-window drag, because localState isn't carried over from one process to - // another. - Object src = event.getLocalState(); - DocumentInfo dst = getDestination(v); - if (Objects.equals(src, dst)) { - if (DEBUG) Log.d(TAG, "Drop target same as source. Ignoring."); - return false; - } - - // Recognize multi-window drag and drop based on the fact that localState is not - // carried between processes. It will stop working when the localsState behavior - // is changed. The info about window should be passed in the localState then. - // The localState could also be null for copying from Recents in single window - // mode, but Recents doesn't offer this functionality (no directories). - Metrics.logUserAction(getContext(), - src == null ? Metrics.USER_ACTION_DRAG_N_DROP_MULTI_WINDOW - : Metrics.USER_ACTION_DRAG_N_DROP); - - mClipper.copyFromClipData(dst, getDisplayState().stack, clipData, activity.fileOpCallback); - return true; - } - - private DocumentInfo getDestination(View v) { - String id = getModelId(v); - if (id != null) { - Cursor dstCursor = mModel.getItem(id); - if (dstCursor == null) { - Log.w(TAG, "Invalid destination. Can't obtain cursor for modelId: " + id); - return null; - } - return DocumentInfo.fromDirectoryCursor(dstCursor); - } - - if (v == mRecView || v == mEmptyView) { - return getDisplayState().stack.peek(); - } - - return null; - } - - @Override - public void setDropTargetHighlight(View v, boolean highlight) { - // Note: use exact comparison - this code is searching for views which are children of - // the RecyclerView instance in the UI. - if (v.getParent() == mRecView) { - RecyclerView.ViewHolder vh = mRecView.getChildViewHolder(v); - if (vh instanceof DocumentHolder) { - ((DocumentHolder) vh).setHighlighted(highlight); - } - } - } - - private @Nullable DocumentHolder getTarget(InputEvent e) { - View childView = mRecView.findChildViewUnder(e.getX(), e.getY()); - if (childView != null) { - return (DocumentHolder) mRecView.getChildViewHolder(childView); - } else { - return null; - } - } - - /** - * Gets the model ID for a given RecyclerView item. - * @param view A View that is a document item view, or a child of a document item view. - * @return The Model ID for the given document, or null if the given view is not associated with - * a document item view. - */ - protected @Nullable String getModelId(View view) { - View itemView = mRecView.findContainingItemView(view); - if (itemView != null) { - RecyclerView.ViewHolder vh = mRecView.getChildViewHolder(itemView); - if (vh instanceof DocumentHolder) { - return ((DocumentHolder) vh).modelId; - } - } - return null; - } - - /** - * Abstract task providing support for loading documents *off* - * the main thread. And if it isn't obvious, creating a list - * of documents (especially large lists) can be pretty expensive. - */ - private abstract class GetDocumentsTask - extends AsyncTask<Selection, Void, List<DocumentInfo>> { - @Override - protected final List<DocumentInfo> doInBackground(Selection... selected) { - return mModel.getDocuments(selected[0]); - } - - @Override - protected final void onPostExecute(List<DocumentInfo> docs) { - onDocumentsReady(docs); - } - - abstract void onDocumentsReady(List<DocumentInfo> docs); - } - - @Override - public boolean isSelected(String modelId) { - return mSelectionMgr.getSelection().contains(modelId); - } - - private final class ModelUpdateListener implements Model.UpdateListener { - @Override - public void onModelUpdate(Model model) { - if (model.info != null || model.error != null) { - mMessageBar.setInfo(model.info); - mMessageBar.setError(model.error); - mMessageBar.show(); - } - - mProgressBar.setVisibility(model.isLoading() ? View.VISIBLE : View.GONE); - - if (model.isEmpty()) { - if (mSearchMode) { - showNoResults(getDisplayState().stack.root); - } else { - showEmptyDirectory(); - } - } else { - showDirectory(); - mAdapter.notifyDataSetChanged(); - } - - if (!model.isLoading()) { - getBaseActivity().notifyDirectoryLoaded( - model.doc != null ? model.doc.derivedUri : null); - } - } - - @Override - public void onModelUpdateFailed(Exception e) { - showQueryError(); - } - } - - private Drawable getDragIcon(Selection selection) { - if (selection.size() == 1) { - DocumentInfo doc = getSingleSelectedDocument(selection); - return mIconHelper.getDocumentIcon(getContext(), doc); - } - return getContext().getDrawable(com.android.internal.R.drawable.ic_doc_generic); - } - - private String getDragTitle(Selection selection) { - assert (!selection.isEmpty()); - if (selection.size() == 1) { - DocumentInfo doc = getSingleSelectedDocument(selection); - return doc.displayName; - } - - return Shared.getQuantityString(getContext(), R.plurals.elements_dragged, selection.size()); - } - - private DocumentInfo getSingleSelectedDocument(Selection selection) { - assert (selection.size() == 1); - final List<DocumentInfo> docs = mModel.getDocuments(mSelectionMgr.getSelection()); - assert (docs.size() == 1); - return docs.get(0); - } - - private DragStartHelper.OnDragStartListener mOnDragStartListener = - new DragStartHelper.OnDragStartListener() { - @Override - public boolean onDragStart(View v, DragStartHelper helper) { - Selection selection = mSelectionMgr.getSelection(); - - if (v == null) { - Log.d(TAG, "Ignoring drag event, null view"); - return false; - } - if (!isSelected(getModelId(v))) { - Log.d(TAG, "Ignoring drag event, unselected view."); - return false; - } - - // NOTE: Preparation of the ClipData object can require a lot of time - // and ideally should be done in the background. Unfortunately - // the current code layout and framework assumptions don't support - // this. So for now, we could end up doing a bunch of i/o on main thread. - v.startDragAndDrop( - mClipper.getClipDataForDocuments( - mModel::getItemUri, - selection, - FileOperationService.OPERATION_COPY), - new DragShadowBuilder( - getActivity(), - getDragTitle(selection), - getDragIcon(selection)), - getDisplayState().stack.peek(), - View.DRAG_FLAG_GLOBAL - | View.DRAG_FLAG_GLOBAL_URI_READ - | View.DRAG_FLAG_GLOBAL_URI_WRITE); - - return true; - } - }; - - - private DragStartHelper mDragHelper = new DragStartHelper(null, mOnDragStartListener); - - private View.OnLongClickListener onLongClickListener = new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - return mDragHelper.onLongClick(v); - } - }; - - private boolean canSelect(DocumentDetails doc) { - return canSelect(doc.getModelId()); - } - - private boolean canSelect(String modelId) { - - // TODO: Combine this method with onBeforeItemStateChange, as both of them are almost - // the same, and responsible for the same thing (whether to select or not). - final Cursor cursor = mModel.getItem(modelId); - if (cursor == null) { - Log.w(TAG, "Couldn't obtain cursor for modelId: " + modelId); - return false; - } - - final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - return mTuner.canSelectType(docMimeType, docFlags); - } - - public static void showDirectory( - FragmentManager fm, RootInfo root, DocumentInfo doc, int anim) { - create(fm, TYPE_NORMAL, root, doc, null, anim); - } - - public static void showRecentsOpen(FragmentManager fm, int anim) { - create(fm, TYPE_RECENT_OPEN, null, null, null, anim); - } - - public static void reloadSearch(FragmentManager fm, RootInfo root, DocumentInfo doc, - String query) { - DirectoryFragment df = get(fm); - - df.mQuery = query; - df.mRoot = root; - df.mDocument = doc; - df.mSearchMode = query != null; - df.getLoaderManager().restartLoader(LOADER_ID, null, df); - } - - public static void reload(FragmentManager fm, int type, RootInfo root, DocumentInfo doc, - String query) { - DirectoryFragment df = get(fm); - df.mType = type; - df.mQuery = query; - df.mRoot = root; - df.mDocument = doc; - df.mSearchMode = query != null; - df.getLoaderManager().restartLoader(LOADER_ID, null, df); - } - - public static void create(FragmentManager fm, int type, RootInfo root, DocumentInfo doc, - String query, int anim) { - final Bundle args = new Bundle(); - args.putInt(Shared.EXTRA_TYPE, type); - args.putParcelable(Shared.EXTRA_ROOT, root); - args.putParcelable(Shared.EXTRA_DOC, doc); - args.putString(Shared.EXTRA_QUERY, query); - args.putParcelable(Shared.EXTRA_SELECTION, new Selection()); - - final FragmentTransaction ft = fm.beginTransaction(); - AnimationView.setupAnimations(ft, anim, args); - - final DirectoryFragment fragment = new DirectoryFragment(); - fragment.setArguments(args); - - ft.replace(getFragmentId(), fragment); - ft.commitAllowingStateLoss(); - } - - private static String buildStateKey(RootInfo root, DocumentInfo doc) { - final StringBuilder builder = new StringBuilder(); - builder.append(root != null ? root.authority : "null").append(';'); - builder.append(root != null ? root.rootId : "null").append(';'); - builder.append(doc != null ? doc.documentId : "null"); - return builder.toString(); - } - - public static @Nullable DirectoryFragment get(FragmentManager fm) { - // TODO: deal with multiple directories shown at once - Fragment fragment = fm.findFragmentById(getFragmentId()); - return fragment instanceof DirectoryFragment - ? (DirectoryFragment) fragment - : null; - } - - private static int getFragmentId() { - return R.id.container_directory; - } - - @Override - public void onRefresh() { - // Remove thumbnail cache. We do this not because we're worried about stale thumbnails as it - // should be covered by last modified value we store in thumbnail cache, but rather to give - // the user a greater sense that contents are being reloaded. - ThumbnailCache cache = DocumentsApplication.getThumbnailCache(getContext()); - String[] ids = mModel.getModelIds(); - int numOfEvicts = Math.min(ids.length, CACHE_EVICT_LIMIT); - for (int i = 0; i < numOfEvicts; ++i) { - cache.removeUri(mModel.getItemUri(ids[i])); - } - - // Trigger loading - getLoaderManager().restartLoader(LOADER_ID, null, this); - } - - @Override - public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) { - Context context = getActivity(); - State state = getDisplayState(); - - Uri contentsUri; - switch (mType) { - case TYPE_NORMAL: - contentsUri = mSearchMode ? DocumentsContract.buildSearchDocumentsUri( - mRoot.authority, mRoot.rootId, mQuery) - : DocumentsContract.buildChildDocumentsUri( - mDocument.authority, mDocument.documentId); - if (mTuner.managedModeEnabled()) { - contentsUri = DocumentsContract.setManageMode(contentsUri); - } - return new DirectoryLoader( - context, mType, mRoot, mDocument, contentsUri, state.userSortOrder, - mSearchMode); - case TYPE_RECENT_OPEN: - final RootsCache roots = DocumentsApplication.getRootsCache(context); - return new RecentsLoader(context, roots, state); - - default: - throw new IllegalStateException("Unknown type " + mType); - } - } - - @Override - public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) { - if (!isAdded()) return; - - if (mSearchMode) { - Metrics.logUserAction(getContext(), Metrics.USER_ACTION_SEARCH); - } - - State state = getDisplayState(); - - mAdapter.notifyDataSetChanged(); - mModel.update(result); - - state.derivedSortOrder = result.sortOrder; - - updateLayout(state.derivedMode); - - if (mRestoredSelection != null) { - mSelectionMgr.restoreSelection(mRestoredSelection); - // Note, we'll take care of cleaning up retained selection - // in the selection handler where we already have some - // specialized code to handle when selection was restored. - } - - // Restore any previous instance state - final SparseArray<Parcelable> container = state.dirState.remove(mStateKey); - if (container != null && !getArguments().getBoolean(Shared.EXTRA_IGNORE_STATE, false)) { - getView().restoreHierarchyState(container); - } else if (mLastSortOrder != state.derivedSortOrder) { - // The derived sort order takes the user sort order into account, but applies - // directory-specific defaults when the user doesn't explicitly set the sort - // order. Scroll to the top if the sort order actually changed. - mRecView.smoothScrollToPosition(0); - } - - mLastSortOrder = state.derivedSortOrder; - - mTuner.onModelLoaded(mModel, mType, mSearchMode); - - if (mRefreshLayout.isRefreshing()) { - new Handler().postDelayed( - () -> mRefreshLayout.setRefreshing(false), - REFRESH_SPINNER_DISMISS_DELAY); - } - } - - @Override - public void onLoaderReset(Loader<DirectoryResult> loader) { - mModel.update(null); - - mRefreshLayout.setRefreshing(false); - } - } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryItemAnimator.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryItemAnimator.java deleted file mode 100644 index 1135c215660e..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryItemAnimator.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.animation.Animator; -import android.animation.ArgbEvaluator; -import android.animation.ValueAnimator; -import android.content.Context; -import android.support.v4.util.ArrayMap; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.RecyclerView; -import android.util.TypedValue; - -import com.android.documentsui.R; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * Performs change animations on Items in DirectoryFragment's RecyclerView. This class overrides - * the way selection animations are normally performed - instead of cross fading the old Item with a - * new Item, this class manually animates a background color change. This enables selected Items to - * correctly maintain focus. - */ -class DirectoryItemAnimator extends DefaultItemAnimator { - private final List<ColorAnimation> mPendingAnimations = new ArrayList<>(); - private final Map<RecyclerView.ViewHolder, ColorAnimation> mRunningAnimations = - new ArrayMap<>(); - private final Integer mDefaultColor; - private final Integer mSelectedColor; - - public DirectoryItemAnimator(Context context) { - mDefaultColor = context.getResources().getColor(R.color.item_doc_background); - mSelectedColor = context.getResources().getColor(R.color.item_doc_background_selected); - } - - @Override - public void runPendingAnimations() { - super.runPendingAnimations(); - for (ColorAnimation anim: mPendingAnimations) { - anim.start(); - mRunningAnimations.put(anim.viewHolder, anim); - } - mPendingAnimations.clear(); - } - - @Override - public void endAnimation(RecyclerView.ViewHolder vh) { - super.endAnimation(vh); - - for (int i = mPendingAnimations.size() - 1; i >= 0; --i) { - ColorAnimation anim = mPendingAnimations.get(i); - if (anim.viewHolder == vh) { - mPendingAnimations.remove(i); - anim.end(); - } - } - - ColorAnimation anim = mRunningAnimations.get(vh); - if (anim != null) { - anim.cancel(); - } - } - - @Override - public ItemHolderInfo recordPreLayoutInformation( - RecyclerView.State state, - RecyclerView.ViewHolder viewHolder, - @AdapterChanges int changeFlags, - List<Object> payloads) { - ItemInfo info = (ItemInfo) super.recordPreLayoutInformation(state, - viewHolder, changeFlags, payloads); - info.isActivated = viewHolder.itemView.isActivated(); - return info; - } - - - @Override - public ItemHolderInfo recordPostLayoutInformation( - RecyclerView.State state, RecyclerView.ViewHolder viewHolder) { - ItemInfo info = (ItemInfo) super.recordPostLayoutInformation(state, - viewHolder); - info.isActivated = viewHolder.itemView.isActivated(); - return info; - } - - @Override - public boolean animateChange(final RecyclerView.ViewHolder oldHolder, - RecyclerView.ViewHolder newHolder, ItemHolderInfo preInfo, - ItemHolderInfo postInfo) { - if (oldHolder != newHolder) { - return super.animateChange(oldHolder, newHolder, preInfo, postInfo); - } - - ItemInfo pre = (ItemInfo)preInfo; - ItemInfo post = (ItemInfo)postInfo; - - if (pre.isActivated == post.isActivated) { - dispatchAnimationFinished(oldHolder); - return false; - } else { - Integer startColor = pre.isActivated ? mSelectedColor : mDefaultColor; - Integer endColor = post.isActivated ? mSelectedColor : mDefaultColor; - oldHolder.itemView.setBackgroundColor(startColor); - mPendingAnimations.add(new ColorAnimation(oldHolder, startColor, endColor)); - } - return true; - } - - @Override - public ItemHolderInfo obtainHolderInfo() { - return new ItemInfo(); - } - - @Override - public boolean canReuseUpdatedViewHolder(RecyclerView.ViewHolder vh) { - return true; - } - - class ItemInfo extends DefaultItemAnimator.ItemHolderInfo { - boolean isActivated; - }; - - /** - * Animates changes in background color. - */ - class ColorAnimation - implements ValueAnimator.AnimatorUpdateListener, Animator.AnimatorListener { - ValueAnimator mValueAnimator; - final RecyclerView.ViewHolder viewHolder; - int mEndColor; - - public ColorAnimation(RecyclerView.ViewHolder vh, int startColor, int endColor) - { - viewHolder = vh; - mValueAnimator = ValueAnimator.ofObject(new ArgbEvaluator(), startColor, endColor); - mValueAnimator.addUpdateListener(this); - mValueAnimator.addListener(this); - - mEndColor = endColor; - } - - public void start() { - mValueAnimator.start(); - } - - public void cancel() { - mValueAnimator.cancel(); - } - - public void end() { - mValueAnimator.end(); - } - - @Override - public void onAnimationUpdate(ValueAnimator animator) { - viewHolder.itemView.setBackgroundColor((Integer)animator.getAnimatedValue()); - } - - @Override - public void onAnimationEnd(Animator animator) { - viewHolder.itemView.setBackgroundColor(mEndColor); - mRunningAnimations.remove(viewHolder); - dispatchAnimationFinished(viewHolder); - } - - @Override - public void onAnimationStart(Animator animation) { - dispatchAnimationStarted(viewHolder); - } - - @Override - public void onAnimationCancel(Animator animation) {} - - @Override - public void onAnimationRepeat(Animator animation) {} - }; -}; diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentHolder.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentHolder.java deleted file mode 100644 index c2b0bf21ff74..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentHolder.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.annotation.ColorInt; -import android.content.Context; -import android.database.Cursor; -import android.graphics.Rect; -import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.android.documentsui.Events.InputEvent; -import com.android.documentsui.R; -import com.android.documentsui.State; -import com.android.documentsui.dirlist.UserInputHandler.DocumentDetails; - -public abstract class DocumentHolder - extends RecyclerView.ViewHolder - implements View.OnKeyListener, - DocumentDetails { - - static final float DISABLED_ALPHA = 0.3f; - - @Deprecated // Public access is deprecated, use #getModelId. - public @Nullable String modelId; - - final Context mContext; - final @ColorInt int mDefaultBgColor; - final @ColorInt int mSelectedBgColor; - - // See #addKeyEventListener for details on the need for this field. - KeyboardEventListener mKeyEventListener; - - private View mSelectionHotspot; - - - public DocumentHolder(Context context, ViewGroup parent, int layout) { - this(context, inflateLayout(context, parent, layout)); - } - - public DocumentHolder(Context context, View item) { - super(item); - - itemView.setOnKeyListener(this); - - mContext = context; - - mDefaultBgColor = context.getColor(R.color.item_doc_background); - mSelectedBgColor = context.getColor(R.color.item_doc_background_selected); - - mSelectionHotspot = itemView.findViewById(R.id.icon_check); - } - - /** - * Binds the view to the given item data. - * @param cursor - * @param modelId - * @param state - */ - public abstract void bind(Cursor cursor, String modelId, State state); - - @Override - public String getModelId() { - return modelId; - } - - /** - * Makes the associated item view appear selected. Note that this merely affects the appearance - * of the view, it doesn't actually select the item. - * TODO: Use the DirectoryItemAnimator instead of manually controlling animation using a boolean - * flag. - * - * @param selected - * @param animate Whether or not to animate the change. Only selection changes initiated by the - * selection manager should be animated. See - * {@link ModelBackedDocumentsAdapter#onBindViewHolder(DocumentHolder, int, java.util.List)} - */ - public void setSelected(boolean selected, boolean animate) { - // Note: the animate param doesn't apply for this base implementation, because the - // DirectoryItemAnimator takes care of it. It's required by subclasses, which perform their - // own animation. - itemView.setActivated(selected); - itemView.setBackgroundColor(selected ? mSelectedBgColor : mDefaultBgColor); - } - - /** - * Highlights the associated item view. - * @param highlighted - */ - public void setHighlighted(boolean highlighted) { - itemView.setBackgroundColor(highlighted ? mSelectedBgColor : mDefaultBgColor); - } - - public void setEnabled(boolean enabled) { - setEnabledRecursive(itemView, enabled); - } - - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - assert(mKeyEventListener != null); - return mKeyEventListener.onKey(this, keyCode, event); - } - - /** - * Installs a delegate to receive keyboard input events. This arrangement is necessitated - * by the fact that a single listener cannot listen to all keyboard events - * on RecyclerView (our parent view). Not sure why this is, but have been - * assured it is the case. - * - * <p>Ideally we'd not involve DocumentHolder in propagation of events like this. - */ - public void addKeyEventListener(KeyboardEventListener listener) { - assert(mKeyEventListener == null); - mKeyEventListener = listener; - } - - @Override - public boolean isInSelectionHotspot(InputEvent event) { - // Do everything in global coordinates - it makes things simpler. - int[] coords = new int[2]; - mSelectionHotspot.getLocationOnScreen(coords); - Rect rect = new Rect(coords[0], coords[1], coords[0] + mSelectionHotspot.getWidth(), - coords[1] + mSelectionHotspot.getHeight()); - - // If the tap occurred within the icon rect, consider it a selection. - return rect.contains((int) event.getRawX(), (int) event.getRawY()); - } - - static void setEnabledRecursive(View itemView, boolean enabled) { - if (itemView == null) return; - if (itemView.isEnabled() == enabled) return; - itemView.setEnabled(enabled); - - if (itemView instanceof ViewGroup) { - final ViewGroup vg = (ViewGroup) itemView; - for (int i = vg.getChildCount() - 1; i >= 0; i--) { - setEnabledRecursive(vg.getChildAt(i), enabled); - } - } - } - - private static View inflateLayout(Context context, ViewGroup parent, int layout) { - final LayoutInflater inflater = LayoutInflater.from(context); - return inflater.inflate(layout, parent, false); - } - - /** - * Implement this in order to be able to respond to events coming from DocumentHolders. - * TODO: Make this bubble up logic events rather than having imperative commands. - */ - interface KeyboardEventListener { - - /** - * Handles key events on the document holder. - * - * @param doc The target DocumentHolder. - * @param keyCode Key code for the event. - * @param event KeyEvent for the event. - * @return Whether the event was handled. - */ - public boolean onKey(DocumentHolder doc, int keyCode, KeyEvent event); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java deleted file mode 100644 index 4b354479936e..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DocumentsAdapter.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.content.Context; -import android.database.Cursor; -import android.provider.DocumentsContract.Document; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; - -import com.android.documentsui.State; - -import java.util.List; - -/** - * DocumentsAdapter provides glue between a directory Model, and RecylcerView. We've - * abstracted this a bit in order to decompose some specialized support - * for adding dummy layout objects (@see SectionBreakDocumentsAdapter). Handling of the - * dummy layout objects was error prone when interspersed with the core mode / adapter code. - * - * @see ModelBackedDocumentsAdapter - * @see SectionBreakDocumentsAdapter - */ -abstract class DocumentsAdapter - extends RecyclerView.Adapter<DocumentHolder> - implements Model.UpdateListener { - - // Payloads for notifyItemChange to distinguish between selection and other events. - static final String SELECTION_CHANGED_MARKER = "Selection-Changed"; - - /** - * Returns a list of model IDs of items currently in the adapter. Excludes items that are - * currently hidden (see {@link #hide(String...)}). - * - * @return A list of Model IDs. - */ - abstract List<String> getModelIds(); - - /** - * Triggers item-change notifications by stable ID (as opposed to position). - * Passing an unrecognized ID will result in a warning in logcat, but no other error. - */ - abstract void onItemSelectionChanged(String id); - - /** - * @return The model ID of the item at the given adapter position. - */ - abstract String getModelId(int position); - - /** - * Returns a class that yields the span size for a particular element. This is - * primarily useful in {@link SectionBreakDocumentsAdapterWrapper} where - * we adjust sizes. - */ - GridLayoutManager.SpanSizeLookup createSpanSizeLookup() { - throw new UnsupportedOperationException(); - } - - static boolean isDirectory(Cursor cursor) { - final String mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - return Document.MIME_TYPE_DIR.equals(mimeType); - } - - boolean isDirectory(Model model, int position) { - String modelId = getModelIds().get(position); - Cursor cursor = model.getItem(modelId); - return isDirectory(cursor); - } - - /** - * Environmental access for View adapter implementations. - */ - interface Environment { - Context getContext(); - int getColumnCount(); - State getDisplayState(); - boolean isSelected(String id); - Model getModel(); - boolean isDocumentEnabled(String mimeType, int flags); - void initDocumentHolder(DocumentHolder holder); - void onBindDocumentHolder(DocumentHolder holder, Cursor cursor); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DragScrollListener.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DragScrollListener.java deleted file mode 100644 index 898a4a23a6e3..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DragScrollListener.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.Context; -import android.graphics.Point; -import android.view.DragEvent; -import android.view.View; -import android.view.View.OnDragListener; - -import com.android.documentsui.ItemDragListener; -import com.android.documentsui.ItemDragListener.DragHost; -import com.android.documentsui.dirlist.ViewAutoScroller.ScrollActionDelegate; -import com.android.documentsui.dirlist.ViewAutoScroller.ScrollDistanceDelegate; -import com.android.documentsui.R; - -import java.util.function.BooleanSupplier; -import java.util.function.IntSupplier; - -import javax.annotation.Nullable; - -/** - * This class acts as a middle-man handler for potential auto-scrolling before passing the dragEvent - * onto {@link DirectoryDragListener}. - */ -class DragScrollListener implements OnDragListener { - - private final ItemDragListener<? extends DragHost> mDragHandler; - private final IntSupplier mHeight; - private final BooleanSupplier mCanScrollUp; - private final BooleanSupplier mCanScrollDown; - private final int mAutoScrollEdgeHeight; - private final Runnable mDragScroller; - - private boolean mDragHappening; - private @Nullable Point mCurrentPosition; - - private DragScrollListener( - Context context, - ItemDragListener<? extends DragHost> dragHandler, - IntSupplier heightSupplier, - BooleanSupplier scrollUpSupplier, - BooleanSupplier scrollDownSupplier, - ViewAutoScroller.ScrollActionDelegate actionDelegate) { - mDragHandler = dragHandler; - mAutoScrollEdgeHeight = (int) context.getResources() - .getDimension(R.dimen.autoscroll_edge_height); - mHeight = heightSupplier; - mCanScrollUp = scrollUpSupplier; - mCanScrollDown = scrollDownSupplier; - - ScrollDistanceDelegate distanceDelegate = new ScrollDistanceDelegate() { - @Override - public Point getCurrentPosition() { - return mCurrentPosition; - } - - @Override - public int getViewHeight() { - return mHeight.getAsInt(); - } - - @Override - public boolean isActive() { - return mDragHappening; - } - }; - - mDragScroller = new ViewAutoScroller( - mAutoScrollEdgeHeight, distanceDelegate, actionDelegate); - } - - static DragScrollListener create( - Context context, ItemDragListener<? extends DragHost> dragHandler, View scrollView) { - ScrollActionDelegate actionDelegate = new ScrollActionDelegate() { - @Override - public void scrollBy(int dy) { - scrollView.scrollBy(0, dy); - } - - @Override - public void runAtNextFrame(Runnable r) { - scrollView.postOnAnimation(r); - - } - - @Override - public void removeCallback(Runnable r) { - scrollView.removeCallbacks(r); - } - }; - DragScrollListener listener = new DragScrollListener( - context, - dragHandler, - scrollView::getHeight, - () -> { - return scrollView.canScrollVertically(-1); - }, - () -> { - return scrollView.canScrollVertically(1); - }, - actionDelegate); - return listener; - } - - @Override - public boolean onDrag(View v, DragEvent event) { - boolean handled = false; - switch (event.getAction()) { - case DragEvent.ACTION_DRAG_STARTED: - mDragHappening = true; - break; - case DragEvent.ACTION_DRAG_ENDED: - mDragHappening = false; - break; - case DragEvent.ACTION_DRAG_ENTERED: - handled = insideDragZone(); - break; - case DragEvent.ACTION_DRAG_LOCATION: - handled = handleLocationEvent(v, event.getX(), event.getY()); - break; - default: - break; - } - - if (!handled) { - handled = mDragHandler.onDrag(v, event); - } - - return handled; - } - - private boolean handleLocationEvent(View v, float x, float y) { - mCurrentPosition = new Point(Math.round(v.getX() + x), Math.round(v.getY() + y)); - if (insideDragZone()) { - mDragScroller.run(); - return true; - } - return false; - } - - private boolean insideDragZone() { - if (mCurrentPosition == null) { - return false; - } - - boolean shouldScrollUp = mCurrentPosition.y < mAutoScrollEdgeHeight - && mCanScrollUp.getAsBoolean(); - boolean shouldScrollDown = mCurrentPosition.y > mHeight.getAsInt() - mAutoScrollEdgeHeight - && mCanScrollDown.getAsBoolean(); - return shouldScrollUp || shouldScrollDown; - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DragShadowBuilder.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DragShadowBuilder.java deleted file mode 100644 index c7d7a64c21e4..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DragShadowBuilder.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Point; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.documentsui.R; - -final class DragShadowBuilder extends View.DragShadowBuilder { - - private final View mShadowView; - private final TextView mTitle; - private final ImageView mIcon; - private final int mWidth; - private final int mHeight; - - public DragShadowBuilder(Context context, String title, Drawable icon) { - mWidth = context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_width); - mHeight= context.getResources().getDimensionPixelSize(R.dimen.drag_shadow_height); - - mShadowView = LayoutInflater.from(context).inflate(R.layout.drag_shadow_layout, null); - mTitle = (TextView) mShadowView.findViewById(android.R.id.title); - mIcon = (ImageView) mShadowView.findViewById(android.R.id.icon); - - mTitle.setText(title); - mIcon.setImageDrawable(icon); - } - - @Override - public void onProvideShadowMetrics( - Point shadowSize, Point shadowTouchPoint) { - shadowSize.set(mWidth, mHeight); - shadowTouchPoint.set(mWidth, mHeight); - } - - @Override - public void onDrawShadow(Canvas canvas) { - Rect r = canvas.getClipBounds(); - // Calling measure is necessary in order for all child views to get correctly laid out. - mShadowView.measure( - View.MeasureSpec.makeMeasureSpec(r.right- r.left, View.MeasureSpec.EXACTLY), - View.MeasureSpec.makeMeasureSpec(r.top- r.bottom, View.MeasureSpec.EXACTLY)); - mShadowView.layout(r.left, r.top, r.right, r.bottom); - mShadowView.draw(canvas); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusHandler.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusHandler.java deleted file mode 100644 index ba26d65065f2..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.view.KeyEvent; -import android.view.View; - -/** - * A class that handles navigation and focus within the DirectoryFragment. - */ -interface FocusHandler extends View.OnFocusChangeListener { - - /** - * Handles navigation (setting focus, adjusting selection if needed) arising from incoming key - * events. - * - * @param doc The DocumentHolder receiving the key event. - * @param keyCode - * @param event - * @return Whether the event was handled. - */ - boolean handleKey(DocumentHolder doc, int keyCode, KeyEvent event); - - @Override - void onFocusChange(View v, boolean hasFocus); - - /** - * Requests focus on the item that last had focus. Scrolls to that item if necessary. - */ - void restoreLastFocus(); - - /** - * @return The adapter position of the last focused item. - */ - int getFocusPosition(); - -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java deleted file mode 100644 index 1be2f65796f4..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FocusManager.java +++ /dev/null @@ -1,550 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.annotation.Nullable; -import android.content.Context; -import android.database.Cursor; -import android.os.Handler; -import android.os.Looper; -import android.os.SystemClock; -import android.provider.DocumentsContract.Document; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.text.Editable; -import android.text.Spannable; -import android.text.method.KeyListener; -import android.text.method.TextKeyListener; -import android.text.method.TextKeyListener.Capitalize; -import android.text.style.BackgroundColorSpan; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.widget.TextView; - -import com.android.documentsui.Events; -import com.android.documentsui.R; - -import java.util.ArrayList; -import java.util.List; -import java.util.Timer; -import java.util.TimerTask; - -/** - * A class that handles navigation and focus within the DirectoryFragment. - */ -final class FocusManager implements FocusHandler { - private static final String TAG = "FocusManager"; - - private RecyclerView mView; - private DocumentsAdapter mAdapter; - private GridLayoutManager mLayout; - - private TitleSearchHelper mSearchHelper; - private Model mModel; - - private int mLastFocusPosition = RecyclerView.NO_POSITION; - - public FocusManager(Context context, RecyclerView view, Model model) { - mView = view; - mAdapter = (DocumentsAdapter) view.getAdapter(); - mLayout = (GridLayoutManager) view.getLayoutManager(); - mModel = model; - - mSearchHelper = new TitleSearchHelper(context); - } - - @Override - public boolean handleKey(DocumentHolder doc, int keyCode, KeyEvent event) { - // Search helper gets first crack, for doing type-to-focus. - if (mSearchHelper.handleKey(doc, keyCode, event)) { - return true; - } - - // Translate space/shift-space into PgDn/PgUp - if (keyCode == KeyEvent.KEYCODE_SPACE) { - if (event.isShiftPressed()) { - keyCode = KeyEvent.KEYCODE_PAGE_UP; - } else { - keyCode = KeyEvent.KEYCODE_PAGE_DOWN; - } - } - - if (Events.isNavigationKeyCode(keyCode)) { - // Find the target item and focus it. - int endPos = findTargetPosition(doc.itemView, keyCode, event); - - if (endPos != RecyclerView.NO_POSITION) { - focusItem(endPos); - } - // Swallow all navigation keystrokes. Otherwise they go to the app's global - // key-handler, which will route them back to the DF and cause focus to be reset. - return true; - } - return false; - } - - @Override - public void onFocusChange(View v, boolean hasFocus) { - // Remember focus events on items. - if (hasFocus && v.getParent() == mView) { - mLastFocusPosition = mView.getChildAdapterPosition(v); - } - } - - @Override - public void restoreLastFocus() { - if (mAdapter.getItemCount() == 0) { - // Nothing to focus. - return; - } - - if (mLastFocusPosition != RecyclerView.NO_POSITION) { - // The system takes care of situations when a view is no longer on screen, etc, - focusItem(mLastFocusPosition); - } else { - // Focus the first visible item - focusItem(mLayout.findFirstVisibleItemPosition()); - } - } - - @Override - public int getFocusPosition() { - return mLastFocusPosition; - } - - /** - * Finds the destination position where the focus should land for a given navigation event. - * - * @param view The view that received the event. - * @param keyCode The key code for the event. - * @param event - * @return The adapter position of the destination item. Could be RecyclerView.NO_POSITION. - */ - private int findTargetPosition(View view, int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_MOVE_HOME: - return 0; - case KeyEvent.KEYCODE_MOVE_END: - return mAdapter.getItemCount() - 1; - case KeyEvent.KEYCODE_PAGE_UP: - case KeyEvent.KEYCODE_PAGE_DOWN: - return findPagedTargetPosition(view, keyCode, event); - } - - // Find a navigation target based on the arrow key that the user pressed. - int searchDir = -1; - switch (keyCode) { - case KeyEvent.KEYCODE_DPAD_UP: - searchDir = View.FOCUS_UP; - break; - case KeyEvent.KEYCODE_DPAD_DOWN: - searchDir = View.FOCUS_DOWN; - break; - } - - if (inGridMode()) { - int currentPosition = mView.getChildAdapterPosition(view); - // Left and right arrow keys only work in grid mode. - switch (keyCode) { - case KeyEvent.KEYCODE_DPAD_LEFT: - if (currentPosition > 0) { - // Stop backward focus search at the first item, otherwise focus will wrap - // around to the last visible item. - searchDir = View.FOCUS_BACKWARD; - } - break; - case KeyEvent.KEYCODE_DPAD_RIGHT: - if (currentPosition < mAdapter.getItemCount() - 1) { - // Stop forward focus search at the last item, otherwise focus will wrap - // around to the first visible item. - searchDir = View.FOCUS_FORWARD; - } - break; - } - } - - if (searchDir != -1) { - // Focus search behaves badly if the parent RecyclerView is focused. However, focusable - // shouldn't be unset on RecyclerView, otherwise focus isn't properly restored after - // events that cause a UI rebuild (like rotating the device). Compromise: turn focusable - // off while performing the focus search. - // TODO: Revisit this when RV focus issues are resolved. - mView.setFocusable(false); - View targetView = view.focusSearch(searchDir); - mView.setFocusable(true); - // TargetView can be null, for example, if the user pressed <down> at the bottom - // of the list. - if (targetView != null) { - // Ignore navigation targets that aren't items in the RecyclerView. - if (targetView.getParent() == mView) { - return mView.getChildAdapterPosition(targetView); - } - } - } - - return RecyclerView.NO_POSITION; - } - - /** - * Given a PgUp/PgDn event and the current view, find the position of the target view. - * This returns: - * <li>The position of the topmost (or bottom-most) visible item, if the current item is not - * the top- or bottom-most visible item. - * <li>The position of an item that is one page's worth of items up (or down) if the current - * item is the top- or bottom-most visible item. - * <li>The first (or last) item, if paging up (or down) would go past those limits. - * @param view The view that received the key event. - * @param keyCode Must be KEYCODE_PAGE_UP or KEYCODE_PAGE_DOWN. - * @param event - * @return The adapter position of the target item. - */ - private int findPagedTargetPosition(View view, int keyCode, KeyEvent event) { - int first = mLayout.findFirstVisibleItemPosition(); - int last = mLayout.findLastVisibleItemPosition(); - int current = mView.getChildAdapterPosition(view); - int pageSize = last - first + 1; - - if (keyCode == KeyEvent.KEYCODE_PAGE_UP) { - if (current > first) { - // If the current item isn't the first item, target the first item. - return first; - } else { - // If the current item is the first item, target the item one page up. - int target = current - pageSize; - return target < 0 ? 0 : target; - } - } - - if (keyCode == KeyEvent.KEYCODE_PAGE_DOWN) { - if (current < last) { - // If the current item isn't the last item, target the last item. - return last; - } else { - // If the current item is the last item, target the item one page down. - int target = current + pageSize; - int max = mAdapter.getItemCount() - 1; - return target < max ? target : max; - } - } - - throw new IllegalArgumentException("Unsupported keyCode: " + keyCode); - } - - /** - * Requests focus for the item in the given adapter position, scrolling the RecyclerView if - * necessary. - * - * @param pos - */ - private void focusItem(final int pos) { - focusItem(pos, null); - } - - /** - * Requests focus for the item in the given adapter position, scrolling the RecyclerView if - * necessary. - * - * @param pos - * @param callback A callback to call after the given item has been focused. - */ - private void focusItem(final int pos, @Nullable final FocusCallback callback) { - // If the item is already in view, focus it; otherwise, scroll to it and focus it. - RecyclerView.ViewHolder vh = mView.findViewHolderForAdapterPosition(pos); - if (vh != null) { - if (vh.itemView.requestFocus() && callback != null) { - callback.onFocus(vh.itemView); - } - } else { - // Set a one-time listener to request focus when the scroll has completed. - mView.addOnScrollListener( - new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(RecyclerView view, int newState) { - if (newState == RecyclerView.SCROLL_STATE_IDLE) { - // When scrolling stops, find the item and focus it. - RecyclerView.ViewHolder vh = - view.findViewHolderForAdapterPosition(pos); - if (vh != null) { - if (vh.itemView.requestFocus() && callback != null) { - callback.onFocus(vh.itemView); - } - } else { - // This might happen in weird corner cases, e.g. if the user is - // scrolling while a delete operation is in progress. In that - // case, just don't attempt to focus the missing item. - Log.w(TAG, "Unable to focus position " + pos + " after scroll"); - } - view.removeOnScrollListener(this); - } - } - }); - mView.smoothScrollToPosition(pos); - } - } - - /** - * @return Whether the layout manager is currently in a grid-configuration. - */ - private boolean inGridMode() { - return mLayout.getSpanCount() > 1; - } - - private interface FocusCallback { - public void onFocus(View view); - } - - /** - * A helper class for handling type-to-focus. Instantiate this class, and pass it KeyEvents via - * the {@link #handleKey(DocumentHolder, int, KeyEvent)} method. The class internally will build - * up a string from individual key events, and perform searching based on that string. When an - * item is found that matches the search term, that item will be focused. This class also - * highlights instances of the search term found in the view. - */ - private class TitleSearchHelper { - static private final int SEARCH_TIMEOUT = 500; // ms - - private final KeyListener mTextListener = new TextKeyListener(Capitalize.NONE, false); - private final Editable mSearchString = Editable.Factory.getInstance().newEditable(""); - private final Highlighter mHighlighter = new Highlighter(); - private final BackgroundColorSpan mSpan; - - private List<String> mIndex; - private boolean mActive; - private Timer mTimer; - private KeyEvent mLastEvent; - private Handler mUiRunner; - - public TitleSearchHelper(Context context) { - mSpan = new BackgroundColorSpan(context.getColor(R.color.accent_dark)); - // Handler for running things on the main UI thread. Needed for updating the UI from a - // timer (see #activate, below). - mUiRunner = new Handler(Looper.getMainLooper()); - } - - /** - * Handles alphanumeric keystrokes for type-to-focus. This method builds a search term out - * of individual key events, and then performs a search for the given string. - * - * @param doc The document holder receiving the key event. - * @param keyCode - * @param event - * @return Whether the event was handled. - */ - public boolean handleKey(DocumentHolder doc, int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_ESCAPE: - case KeyEvent.KEYCODE_ENTER: - if (mActive) { - // These keys end any active searches. - endSearch(); - return true; - } else { - // Don't handle these key events if there is no active search. - return false; - } - case KeyEvent.KEYCODE_SPACE: - // This allows users to search for files with spaces in their names, but ignores - // spacebar events when a text search is not active. Ignoring the spacebar - // event is necessary because other handlers (see FocusManager#handleKey) also - // listen for and handle it. - if (!mActive) { - return false; - } - } - - // Navigation keys also end active searches. - if (Events.isNavigationKeyCode(keyCode)) { - endSearch(); - // Don't handle the keycode, so navigation still occurs. - return false; - } - - // Build up the search string, and perform the search. - boolean handled = mTextListener.onKeyDown(doc.itemView, mSearchString, keyCode, event); - - // Delete is processed by the text listener, but not "handled". Check separately for it. - if (keyCode == KeyEvent.KEYCODE_DEL) { - handled = true; - } - - if (handled) { - mLastEvent = event; - if (mSearchString.length() == 0) { - // Don't perform empty searches. - return false; - } - search(); - } - - return handled; - } - - /** - * Activates the search helper, which changes its key handling and updates the search index - * and highlights if necessary. Call this each time the search term is updated. - */ - private void search() { - if (!mActive) { - // The model listener invalidates the search index when the model changes. - mModel.addUpdateListener(mModelListener); - - // Used to keep the current search alive until the timeout expires. If the user - // presses another key within that time, that keystroke is added to the current - // search. Otherwise, the current search ends, and subsequent keystrokes start a new - // search. - mTimer = new Timer(); - mActive = true; - } - - // If the search index was invalidated, rebuild it - if (mIndex == null) { - buildIndex(); - } - - // Search for the current search term. - // Perform case-insensitive search. - String searchString = mSearchString.toString().toLowerCase(); - for (int pos = 0; pos < mIndex.size(); pos++) { - String title = mIndex.get(pos); - if (title != null && title.startsWith(searchString)) { - focusItem(pos, new FocusCallback() { - @Override - public void onFocus(View view) { - mHighlighter.applyHighlight(view); - // Using a timer repeat period of SEARCH_TIMEOUT/2 means the amount of - // time between the last keystroke and a search expiring is actually - // between 500 and 750 ms. A smaller timer period results in less - // variability but does more polling. - mTimer.schedule(new TimeoutTask(), 0, SEARCH_TIMEOUT / 2); - } - }); - break; - } - } - } - - /** - * Ends the current search (see {@link #search()}. - */ - private void endSearch() { - if (mActive) { - mModel.removeUpdateListener(mModelListener); - mTimer.cancel(); - } - - mHighlighter.removeHighlight(); - - mIndex = null; - mSearchString.clear(); - mActive = false; - } - - /** - * Builds a search index for finding items by title. Queries the model and adapter, so both - * must be set up before calling this method. - */ - private void buildIndex() { - int itemCount = mAdapter.getItemCount(); - List<String> index = new ArrayList<>(itemCount); - for (int i = 0; i < itemCount; i++) { - String modelId = mAdapter.getModelId(i); - Cursor cursor = mModel.getItem(modelId); - if (modelId != null && cursor != null) { - String title = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); - // Perform case-insensitive search. - index.add(title.toLowerCase()); - } else { - index.add(""); - } - } - mIndex = index; - } - - private Model.UpdateListener mModelListener = new Model.UpdateListener() { - @Override - public void onModelUpdate(Model model) { - // Invalidate the search index when the model updates. - mIndex = null; - } - - @Override - public void onModelUpdateFailed(Exception e) { - // Invalidate the search index when the model updates. - mIndex = null; - } - }; - - private class TimeoutTask extends TimerTask { - @Override - public void run() { - long last = mLastEvent.getEventTime(); - long now = SystemClock.uptimeMillis(); - if ((now - last) > SEARCH_TIMEOUT) { - // endSearch must run on the main thread because it does UI work - mUiRunner.post(new Runnable() { - @Override - public void run() { - endSearch(); - } - }); - } - } - }; - - private class Highlighter { - private Spannable mCurrentHighlight; - - /** - * Applies title highlights to the given view. The view must have a title field that is a - * spannable text field. If this condition is not met, this function does nothing. - * - * @param view - */ - private void applyHighlight(View view) { - TextView titleView = (TextView) view.findViewById(android.R.id.title); - if (titleView == null) { - return; - } - - CharSequence tmpText = titleView.getText(); - if (tmpText instanceof Spannable) { - if (mCurrentHighlight != null) { - mCurrentHighlight.removeSpan(mSpan); - } - mCurrentHighlight = (Spannable) tmpText; - mCurrentHighlight.setSpan( - mSpan, 0, mSearchString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } - } - - /** - * Removes title highlights from the given view. The view must have a title field that is a - * spannable text field. If this condition is not met, this function does nothing. - * - * @param view - */ - private void removeHighlight() { - if (mCurrentHighlight != null) { - mCurrentHighlight.removeSpan(mSpan); - } - } - }; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java deleted file mode 100644 index 5201089b924c..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/FragmentTuner.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.State.ACTION_CREATE; -import static com.android.documentsui.State.ACTION_GET_CONTENT; -import static com.android.documentsui.State.ACTION_OPEN; -import static com.android.documentsui.State.ACTION_OPEN_TREE; -import static com.android.documentsui.State.ACTION_PICK_COPY_DESTINATION; - -import android.content.Context; -import android.provider.DocumentsContract.Document; - -import com.android.documentsui.BaseActivity; -import com.android.documentsui.MimePredicate; -import com.android.documentsui.State; -import com.android.documentsui.dirlist.DirectoryFragment.ResultType; - -/** - * Providers support for specializing the DirectoryFragment to the "host" Activity. - * Feel free to expand the role of this class to handle other specializations. - */ -public abstract class FragmentTuner { - - final Context mContext; - final State mState; - - public FragmentTuner(Context context, State state) { - mContext = context; - mState = state; - } - - // Subtly different from isDocumentEnabled. The reason may be illuminated as follows. - // A folder is enabled such that it may be double clicked, even in settings - // when the folder itself cannot be selected. This may also be true of container types. - public boolean canSelectType(String docMimeType, int docFlags) { - return true; - } - - public boolean isDocumentEnabled(String docMimeType, int docFlags) { - return true; - } - - /** - * When managed mode is enabled, active downloads will be visible in the UI. - * Presumably this should only be true when in the downloads directory. - */ - boolean managedModeEnabled() { - return false; - } - - /** - * Whether drag n' drop is allowed in this context - */ - boolean dragAndDropEnabled() { - return false; - } - - abstract void onModelLoaded(Model model, @ResultType int resultType, boolean isSearch); - - /** - * Provides support for Platform specific specializations of DirectoryFragment. - */ - public static final class DocumentsTuner extends FragmentTuner { - - // We use this to keep track of whether a model has been previously loaded or not so we can - // open the drawer on empty directories on first launch - private boolean mModelPreviousLoaded; - - public DocumentsTuner(Context context, State state) { - super(context, state); - } - - @Override - public boolean canSelectType(String docMimeType, int docFlags) { - if (!isDocumentEnabled(docMimeType, docFlags)) { - return false; - } - - if (MimePredicate.isDirectoryType(docMimeType)) { - return false; - } - - if (mState.action == ACTION_OPEN_TREE - || mState.action == ACTION_PICK_COPY_DESTINATION) { - // In this case nothing *ever* is selectable...the expected user behavior is - // they navigate *into* a folder, then click a confirmation button indicating - // that the current directory is the directory they are picking. - return false; - } - - return true; - } - - @Override - public boolean isDocumentEnabled(String mimeType, int docFlags) { - // Directories are always enabled. - if (MimePredicate.isDirectoryType(mimeType)) { - return true; - } - - switch (mState.action) { - case ACTION_CREATE: - // Read-only files are disabled when creating. - if ((docFlags & Document.FLAG_SUPPORTS_WRITE) == 0) { - return false; - } - case ACTION_OPEN: - case ACTION_GET_CONTENT: - final boolean isVirtual = (docFlags & Document.FLAG_VIRTUAL_DOCUMENT) != 0; - if (isVirtual && mState.openableOnly) { - return false; - } - } - - return MimePredicate.mimeMatches(mState.acceptMimes, mimeType); - } - - @Override - void onModelLoaded(Model model, @ResultType int resultType, boolean isSearch) { - boolean showDrawer = false; - - if (MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, mState.acceptMimes)) { - showDrawer = false; - } - if (mState.external && mState.action == ACTION_GET_CONTENT) { - showDrawer = true; - } - if (mState.action == ACTION_PICK_COPY_DESTINATION) { - showDrawer = true; - } - - // When launched into empty root, open drawer. - if (model.isEmpty()) { - showDrawer = true; - } - - if (showDrawer && !mState.hasInitialLocationChanged() && !isSearch - && !mModelPreviousLoaded) { - // This noops on layouts without drawer, so no need to guard. - ((BaseActivity) mContext).setRootsDrawerOpen(true); - } - mModelPreviousLoaded = true; - } - } - - /** - * Provides support for Files activity specific specializations of DirectoryFragment. - */ - public static final class FilesTuner extends FragmentTuner { - - // We use this to keep track of whether a model has been previously loaded or not so we can - // open the drawer on empty directories on first launch - private boolean mModelPreviousLoaded; - - public FilesTuner(Context context, State state) { - super(context, state); - } - - - - @Override - void onModelLoaded(Model model, @ResultType int resultType, boolean isSearch) { - // When launched into empty root, open drawer. - if (model.isEmpty() && !mState.hasInitialLocationChanged() && !isSearch - && !mModelPreviousLoaded) { - // This noops on layouts without drawer, so no need to guard. - ((BaseActivity) mContext).setRootsDrawerOpen(true); - } - mModelPreviousLoaded = true; - } - - @Override - public boolean managedModeEnabled() { - // When in downloads top level directory, we also show active downloads. - // And while we don't allow folders in Downloads, we do allow Zip files in - // downloads that themselves can be opened and viewed like directories. - // This method helps us understand when to kick in on those special behaviors. - return mState.stack.root != null - && mState.stack.root.isDownloads() - && mState.stack.size() == 1; - } - - @Override - public boolean dragAndDropEnabled() { - return true; - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDirectoryHolder.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDirectoryHolder.java deleted file mode 100644 index ce5bcb199454..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDirectoryHolder.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.content.Context; -import android.database.Cursor; -import android.provider.DocumentsContract.Document; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.documentsui.R; -import com.android.documentsui.State; - -final class GridDirectoryHolder extends DocumentHolder { - final TextView mTitle; - private ImageView mIconCheck; - private ImageView mIconMime; - - public GridDirectoryHolder(Context context, ViewGroup parent) { - super(context, parent, R.layout.item_dir_grid); - - mTitle = (TextView) itemView.findViewById(android.R.id.title); - mIconMime = (ImageView) itemView.findViewById(R.id.icon_mime_sm); - mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check); - } - - @Override - public void setSelected(boolean selected, boolean animate) { - super.setSelected(selected, animate); - float checkAlpha = selected ? 1f : 0f; - - if (animate) { - mIconCheck.animate().alpha(checkAlpha).start(); - mIconMime.animate().alpha(1f - checkAlpha).start(); - } else { - mIconCheck.setAlpha(checkAlpha); - mIconMime.setAlpha(1f - checkAlpha); - } - } - - /** - * Bind this view to the given document for display. - * @param cursor Pointing to the item to be bound. - * @param modelId The model ID of the item. - * @param state Current display state. - */ - public void bind(Cursor cursor, String modelId, State state) { - assert(cursor != null); - - this.modelId = modelId; - - final String docDisplayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); - mTitle.setText(docDisplayName, TextView.BufferType.SPANNABLE); - - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDocumentHolder.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDocumentHolder.java deleted file mode 100644 index 7ba4bddbe1f6..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/GridDocumentHolder.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.model.DocumentInfo.getCursorInt; -import static com.android.documentsui.model.DocumentInfo.getCursorLong; -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.annotation.ColorInt; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.text.format.Formatter; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.android.documentsui.R; -import com.android.documentsui.RootCursorWrapper; -import com.android.documentsui.Shared; -import com.android.documentsui.State; - -final class GridDocumentHolder extends DocumentHolder { - - private static boolean mHideTitles; - - final TextView mTitle; - final TextView mDate; - final TextView mSize; - final ImageView mIconMimeLg; - final ImageView mIconMimeSm; - final ImageView mIconThumb; - final ImageView mIconCheck; - final IconHelper mIconHelper; - - private final @ColorInt int mDisabledBgColor; - - public GridDocumentHolder(Context context, ViewGroup parent, IconHelper iconHelper) { - super(context, parent, R.layout.item_doc_grid); - - mDisabledBgColor = context.getColor(R.color.item_doc_background_disabled); - - mTitle = (TextView) itemView.findViewById(android.R.id.title); - mDate = (TextView) itemView.findViewById(R.id.date); - mSize = (TextView) itemView.findViewById(R.id.size); - mIconMimeLg = (ImageView) itemView.findViewById(R.id.icon_mime_lg); - mIconMimeSm = (ImageView) itemView.findViewById(R.id.icon_mime_sm); - mIconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb); - mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check); - - mIconHelper = iconHelper; - } - - @Override - public void setSelected(boolean selected, boolean animate) { - // We always want to make sure our check box disappears if we're not selected, - // even if the item is disabled. This is because this object can be reused - // and this method will be called to setup initial state. - float checkAlpha = selected ? 1f : 0f; - if (animate) { - mIconCheck.animate().alpha(checkAlpha).start(); - } else { - mIconCheck.setAlpha(checkAlpha); - } - - // But it should be an error to be set to selected && be disabled. - if (!itemView.isEnabled()) { - assert(!selected); - return; - } - - super.setSelected(selected, animate); - - if (animate) { - mIconMimeSm.animate().alpha(1f - checkAlpha).start(); - } else { - mIconMimeSm.setAlpha(1f - checkAlpha); - } - } - - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - - // Text colors enabled/disabled is handle via a color set. - itemView.setBackgroundColor(enabled ? mDefaultBgColor : mDisabledBgColor); - float imgAlpha = enabled ? 1f : DISABLED_ALPHA; - - mIconMimeLg.setAlpha(imgAlpha); - mIconMimeSm.setAlpha(imgAlpha); - mIconThumb.setAlpha(imgAlpha); - } - - /** - * Bind this view to the given document for display. - * @param cursor Pointing to the item to be bound. - * @param modelId The model ID of the item. - * @param state Current display state. - */ - public void bind(Cursor cursor, String modelId, State state) { - assert(cursor != null); - - this.modelId = modelId; - - final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); - final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); - final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - final String docDisplayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); - final long docLastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED); - final int docIcon = getCursorInt(cursor, Document.COLUMN_ICON); - final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - final long docSize = getCursorLong(cursor, Document.COLUMN_SIZE); - - mIconHelper.stopLoading(mIconThumb); - - mIconMimeLg.animate().cancel(); - mIconMimeLg.setAlpha(1f); - mIconThumb.animate().cancel(); - mIconThumb.setAlpha(0f); - - final Uri uri = DocumentsContract.buildDocumentUri(docAuthority, docId); - mIconHelper.load(uri, docMimeType, docFlags, docIcon, docLastModified, mIconThumb, - mIconMimeLg, mIconMimeSm); - - if (mHideTitles) { - mTitle.setVisibility(View.GONE); - } else { - mTitle.setText(docDisplayName, TextView.BufferType.SPANNABLE); - mTitle.setVisibility(View.VISIBLE); - } - - if (docLastModified == -1) { - mDate.setText(null); - } else { - mDate.setText(Shared.formatTime(mContext, docLastModified)); - } - - if (!state.showSize || Document.MIME_TYPE_DIR.equals(docMimeType) || docSize == -1) { - mSize.setVisibility(View.GONE); - } else { - mSize.setVisibility(View.VISIBLE); - mSize.setText(Formatter.formatFileSize(mContext, docSize)); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/IconHelper.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/IconHelper.java deleted file mode 100644 index ec723140f5cd..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/IconHelper.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.State.MODE_GRID; -import static com.android.documentsui.State.MODE_LIST; - -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Point; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.support.annotation.Nullable; -import android.util.Log; -import android.view.View; -import android.widget.ImageView; - -import com.android.documentsui.DocumentsApplication; -import com.android.documentsui.IconUtils; -import com.android.documentsui.MimePredicate; -import com.android.documentsui.ProviderExecutor; -import com.android.documentsui.ProviderExecutor.Preemptable; -import com.android.documentsui.R; -import com.android.documentsui.State; -import com.android.documentsui.State.ViewMode; -import com.android.documentsui.ThumbnailCache; -import com.android.documentsui.ThumbnailCache.Result; -import com.android.documentsui.model.DocumentInfo; - -import java.util.function.BiConsumer; - -/** - * A class to assist with loading and managing the Images (i.e. thumbnails and icons) associated - * with items in the directory listing. - */ -public class IconHelper { - private static final String TAG = "IconHelper"; - - // Two animations applied to image views. The first is used to switch mime icon and thumbnail. - // The second is used when we need to update thumbnail. - private static final BiConsumer<View, View> ANIM_FADE_IN = (mime, thumb) -> { - float alpha = mime.getAlpha(); - mime.animate().alpha(0f).start(); - thumb.setAlpha(0f); - thumb.animate().alpha(alpha).start(); - }; - private static final BiConsumer<View, View> ANIM_NO_OP = (mime, thumb) -> {}; - - private final Context mContext; - private final ThumbnailCache mThumbnailCache; - - // The display mode (MODE_GRID, MODE_LIST, etc). - private int mMode; - private Point mCurrentSize; - private boolean mThumbnailsEnabled = true; - - /** - * @param context - * @param mode MODE_GRID or MODE_LIST - */ - public IconHelper(Context context, int mode) { - mContext = context; - setViewMode(mode); - mThumbnailCache = DocumentsApplication.getThumbnailCache(context); - } - - /** - * Enables or disables thumbnails. When thumbnails are disabled, mime icons (or custom icons, if - * specified by the document) are used instead. - * - * @param enabled - */ - public void setThumbnailsEnabled(boolean enabled) { - mThumbnailsEnabled = enabled; - } - - /** - * Sets the current display mode. This affects the thumbnail sizes that are loaded. - * - * @param mode See {@link State.MODE_LIST} and {@link State.MODE_GRID}. - */ - public void setViewMode(@ViewMode int mode) { - mMode = mode; - int thumbSize = getThumbSize(mode); - mCurrentSize = new Point(thumbSize, thumbSize); - } - - private int getThumbSize(int mode) { - int thumbSize; - switch (mode) { - case MODE_GRID: - thumbSize = mContext.getResources().getDimensionPixelSize(R.dimen.grid_width); - break; - case MODE_LIST: - thumbSize = mContext.getResources().getDimensionPixelSize( - R.dimen.list_item_thumbnail_size); - break; - default: - throw new IllegalArgumentException("Unsupported layout mode: " + mode); - } - return thumbSize; - } - - /** - * Cancels any ongoing load operations associated with the given ImageView. - * - * @param icon - */ - public void stopLoading(ImageView icon) { - final LoaderTask oldTask = (LoaderTask) icon.getTag(); - if (oldTask != null) { - oldTask.preempt(); - icon.setTag(null); - } - } - - /** Internal task for loading thumbnails asynchronously. */ - private static class LoaderTask - extends AsyncTask<Uri, Void, Bitmap> - implements Preemptable { - private final Uri mUri; - private final ImageView mIconMime; - private final ImageView mIconThumb; - private final Point mThumbSize; - private final long mLastModified; - - // A callback to apply animation to image views after the thumbnail is loaded. - private final BiConsumer<View, View> mImageAnimator; - - private final CancellationSignal mSignal; - - public LoaderTask(Uri uri, ImageView iconMime, ImageView iconThumb, - Point thumbSize, long lastModified, BiConsumer<View, View> animator) { - mUri = uri; - mIconMime = iconMime; - mIconThumb = iconThumb; - mThumbSize = thumbSize; - mImageAnimator = animator; - mLastModified = lastModified; - mSignal = new CancellationSignal(); - if (DEBUG) Log.d(TAG, "Starting icon loader task for " + mUri); - } - - @Override - public void preempt() { - if (DEBUG) Log.d(TAG, "Icon loader task for " + mUri + " was cancelled."); - cancel(false); - mSignal.cancel(); - } - - @Override - protected Bitmap doInBackground(Uri... params) { - if (isCancelled()) { - return null; - } - - final Context context = mIconThumb.getContext(); - final ContentResolver resolver = context.getContentResolver(); - - ContentProviderClient client = null; - Bitmap result = null; - try { - client = DocumentsApplication.acquireUnstableProviderOrThrow( - resolver, mUri.getAuthority()); - result = DocumentsContract.getDocumentThumbnail(client, mUri, mThumbSize, mSignal); - if (result != null) { - final ThumbnailCache cache = DocumentsApplication.getThumbnailCache(context); - cache.putThumbnail(mUri, mThumbSize, result, mLastModified); - } - } catch (Exception e) { - if (!(e instanceof OperationCanceledException)) { - Log.w(TAG, "Failed to load thumbnail for " + mUri + ": " + e); - } - } finally { - ContentProviderClient.releaseQuietly(client); - } - return result; - } - - @Override - protected void onPostExecute(Bitmap result) { - if (DEBUG) Log.d(TAG, "Loader task for " + mUri + " completed"); - - if (mIconThumb.getTag() == this && result != null) { - mIconThumb.setTag(null); - mIconThumb.setImageBitmap(result); - - mImageAnimator.accept(mIconMime, mIconThumb); - } - } - } - - /** - * Load thumbnails for a directory list item. - * - * @param uri The URI for the file being represented. - * @param mimeType The mime type of the file being represented. - * @param docFlags Flags for the file being represented. - * @param docIcon Custom icon (if any) for the file being requested. - * @param docLastModified the last modified value of the file being requested. - * @param iconThumb The itemview's thumbnail icon. - * @param iconMime The itemview's mime icon. Hidden when iconThumb is shown. - * @param subIconMime The second itemview's mime icon. Always visible. - * @return - */ - public void load(Uri uri, String mimeType, int docFlags, int docIcon, long docLastModified, - ImageView iconThumb, ImageView iconMime, @Nullable ImageView subIconMime) { - boolean loadedThumbnail = false; - - final String docAuthority = uri.getAuthority(); - - final boolean supportsThumbnail = (docFlags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0; - final boolean allowThumbnail = (mMode == MODE_GRID) - || MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, mimeType); - final boolean showThumbnail = supportsThumbnail && allowThumbnail && mThumbnailsEnabled; - if (showThumbnail) { - loadedThumbnail = - loadThumbnail(uri, docAuthority, docLastModified, iconThumb, iconMime); - } - - final Drawable mimeIcon = getDocumentIcon(mContext, docAuthority, - DocumentsContract.getDocumentId(uri), mimeType, docIcon); - if (subIconMime != null) { - setMimeIcon(subIconMime, mimeIcon); - } - - if (loadedThumbnail) { - hideImageView(iconMime); - } else { - // Add a mime icon if the thumbnail is not shown. - setMimeIcon(iconMime, mimeIcon); - hideImageView(iconThumb); - } - } - - private boolean loadThumbnail(Uri uri, String docAuthority, long docLastModified, - ImageView iconThumb, ImageView iconMime) { - final Result result = mThumbnailCache.getThumbnail(uri, mCurrentSize); - - try { - final Bitmap cachedThumbnail = result.getThumbnail(); - iconThumb.setImageBitmap(cachedThumbnail); - - boolean stale = (docLastModified > result.getLastModified()); - if (DEBUG) Log.d(TAG, - String.format("Load thumbnail for %s, got result %d and stale %b.", - uri.toString(), result.getStatus(), stale)); - if (!result.isExactHit() || stale) { - final BiConsumer<View, View> animator = - (cachedThumbnail == null ? ANIM_FADE_IN : ANIM_NO_OP); - final LoaderTask task = new LoaderTask(uri, iconMime, iconThumb, mCurrentSize, - docLastModified, animator); - - iconThumb.setTag(task); - - ProviderExecutor.forAuthority(docAuthority).execute(task); - } - - return result.isHit(); - } finally { - result.recycle(); - } - } - - private void setMimeIcon(ImageView view, Drawable icon) { - view.setImageDrawable(icon); - view.setAlpha(1f); - } - - private void hideImageView(ImageView view) { - view.setImageDrawable(null); - view.setAlpha(0f); - } - - private Drawable getDocumentIcon( - Context context, String authority, String id, String mimeType, int icon) { - if (icon != 0) { - return IconUtils.loadPackageIcon(context, authority, icon); - } else { - return IconUtils.loadMimeIcon(context, mimeType, authority, id, mMode); - } - } - - /** - * Returns a mime icon or package icon for a {@link DocumentInfo}. - */ - public Drawable getDocumentIcon(Context context, DocumentInfo doc) { - return getDocumentIcon( - context, doc.authority, doc.documentId, doc.mimeType, doc.icon); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListDocumentHolder.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListDocumentHolder.java deleted file mode 100644 index e88be0cfe969..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListDocumentHolder.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.model.DocumentInfo.getCursorInt; -import static com.android.documentsui.model.DocumentInfo.getCursorLong; -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.text.format.Formatter; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.android.documentsui.R; -import com.android.documentsui.RootCursorWrapper; -import com.android.documentsui.Shared; -import com.android.documentsui.State; - -final class ListDocumentHolder extends DocumentHolder { - final TextView mTitle; - final LinearLayout mDetails; // Container of date/size/summary - final TextView mDate; - final TextView mSize; - final TextView mSummary; - final ImageView mIconMime; - final ImageView mIconThumb; - final ImageView mIconCheck; - final IconHelper mIconHelper; - - public ListDocumentHolder(Context context, ViewGroup parent, IconHelper iconHelper) { - super(context, parent, R.layout.item_doc_list); - - mTitle = (TextView) itemView.findViewById(android.R.id.title); - mDate = (TextView) itemView.findViewById(R.id.date); - mSize = (TextView) itemView.findViewById(R.id.size); - mSummary = (TextView) itemView.findViewById(android.R.id.summary); - mIconMime = (ImageView) itemView.findViewById(R.id.icon_mime); - mIconThumb = (ImageView) itemView.findViewById(R.id.icon_thumb); - mIconCheck = (ImageView) itemView.findViewById(R.id.icon_check); - // Warning: mDetails view doesn't exists in layout-sw720dp-land layout - mDetails = (LinearLayout) itemView.findViewById(R.id.line2); - - mIconHelper = iconHelper; - } - - @Override - public void setSelected(boolean selected, boolean animate) { - // We always want to make sure our check box disappears if we're not selected, - // even if the item is disabled. But it should be an error (see assert below) - // to be set to selected && be disabled. - float checkAlpha = selected ? 1f : 0f; - if (animate) { - mIconCheck.animate().alpha(checkAlpha).start(); - } else { - mIconCheck.setAlpha(checkAlpha); - } - - if (!itemView.isEnabled()) { - assert(!selected); - return; - } - - super.setSelected(selected, animate); - - if (animate) { - mIconMime.animate().alpha(1f - checkAlpha).start(); - mIconThumb.animate().alpha(1f - checkAlpha).start(); - } else { - mIconMime.setAlpha(1f - checkAlpha); - mIconThumb.setAlpha(1f - checkAlpha); - } - } - - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - - // Text colors enabled/disabled is handle via a color set. - final float imgAlpha = enabled ? 1f : DISABLED_ALPHA; - mIconMime.setAlpha(imgAlpha); - mIconThumb.setAlpha(imgAlpha); - } - - /** - * Bind this view to the given document for display. - * @param cursor Pointing to the item to be bound. - * @param modelId The model ID of the item. - * @param state Current display state. - */ - @Override - public void bind(Cursor cursor, String modelId, State state) { - assert(cursor != null); - - this.modelId = modelId; - - final String docAuthority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); - final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); - final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - final String docDisplayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); - final long docLastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED); - final int docIcon = getCursorInt(cursor, Document.COLUMN_ICON); - final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - final String docSummary = getCursorString(cursor, Document.COLUMN_SUMMARY); - final long docSize = getCursorLong(cursor, Document.COLUMN_SIZE); - final boolean isDirectory = Document.MIME_TYPE_DIR.equals(docMimeType); - - mIconHelper.stopLoading(mIconThumb); - - mIconMime.animate().cancel(); - mIconMime.setAlpha(1f); - mIconThumb.animate().cancel(); - mIconThumb.setAlpha(0f); - - final Uri uri = DocumentsContract.buildDocumentUri(docAuthority, docId); - mIconHelper.load(uri, docMimeType, docFlags, docIcon, docLastModified, mIconThumb, - mIconMime, null); - - mTitle.setText(docDisplayName, TextView.BufferType.SPANNABLE); - mTitle.setVisibility(View.VISIBLE); - - - boolean hasDetails = false; - if (isDirectory) { - // Note, we don't show any details for any directory...ever. - hasDetails = false; - } else { - if (docSummary != null) { - hasDetails = true; - mSummary.setText(docSummary); - mSummary.setVisibility(View.VISIBLE); - } else { - mSummary.setVisibility(View.INVISIBLE); - } - - if (docLastModified > 0) { - hasDetails = true; - mDate.setText(Shared.formatTime(mContext, docLastModified)); - } else { - mDate.setText(null); - } - - if (state.showSize && docSize > -1) { - hasDetails = true; - mSize.setVisibility(View.VISIBLE); - mSize.setText(Formatter.formatFileSize(mContext, docSize)); - } else { - mSize.setVisibility(View.GONE); - } - } - - // mDetails view doesn't exists in layout-sw720dp-land layout - if (mDetails != null) { - mDetails.setVisibility(hasDetails ? View.VISIBLE : View.GONE); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListeningGestureDetector.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListeningGestureDetector.java deleted file mode 100644 index 85ff6ed44119..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ListeningGestureDetector.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.Context; -import android.support.v13.view.DragStartHelper; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.RecyclerView.OnItemTouchListener; -import android.view.GestureDetector; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnTouchListener; - -import com.android.documentsui.Events; - -// Previously we listened to events with one class, only to bounce them forward -// to GestureDetector. We're still doing that here, but with a single class -// that reduces overall complexity in our glue code. -final class ListeningGestureDetector extends GestureDetector - implements OnItemTouchListener, OnTouchListener { - - private DragStartHelper mDragHelper; - private UserInputHandler mInputHandler; - - public ListeningGestureDetector( - Context context, DragStartHelper dragHelper, UserInputHandler handler) { - super(context, handler); - mDragHelper = dragHelper; - mInputHandler = handler; - setOnDoubleTapListener(handler); - } - - @Override - public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { - // TODO: If possible, move this into UserInputHandler. - if (e.getAction() == MotionEvent.ACTION_DOWN && Events.isMouseEvent(e)) { - mInputHandler.setLastButtonState(e.getButtonState()); - } - - // Detect drag events. When a drag is detected, intercept the rest of the gesture. - View itemView = rv.findChildViewUnder(e.getX(), e.getY()); - if (itemView != null && mDragHelper.onTouch(itemView, e)) { - return true; - } - // Forward unhandled events to the GestureDetector. - onTouchEvent(e); - - return false; - } - - @Override - public void onTouchEvent(RecyclerView rv, MotionEvent e) { - View itemView = rv.findChildViewUnder(e.getX(), e.getY()); - mDragHelper.onTouch(itemView, e); - // Note: even though this event is being handled as part of a drag gesture, continue - // forwarding to the GestureDetector. The detector needs to see the entire cluster of - // events in order to properly interpret gestures. - onTouchEvent(e); - } - - @Override - public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {} - - // For mEmptyView right-click context menu - @Override - public boolean onTouch(View v, MotionEvent event) { - if (event.getButtonState() == MotionEvent.BUTTON_SECONDARY) { - return mInputHandler.onSingleRightClickUp(event); - } - return false; - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java deleted file mode 100644 index 5c1522811364..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java +++ /dev/null @@ -1,440 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.State.SORT_ORDER_DISPLAY_NAME; -import static com.android.documentsui.State.SORT_ORDER_LAST_MODIFIED; -import static com.android.documentsui.State.SORT_ORDER_SIZE; -import static com.android.documentsui.model.DocumentInfo.getCursorLong; -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.database.Cursor; -import android.database.MergeCursor; -import android.net.Uri; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; -import android.util.Log; - -import com.android.documentsui.DirectoryResult; -import com.android.documentsui.RootCursorWrapper; -import com.android.documentsui.Shared; -import com.android.documentsui.dirlist.MultiSelectManager.Selection; -import com.android.documentsui.model.DocumentInfo; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * The data model for the current loaded directory. - */ -@VisibleForTesting -public class Model { - private static final String TAG = "Model"; - - private boolean mIsLoading; - private List<UpdateListener> mUpdateListeners = new ArrayList<>(); - @Nullable private Cursor mCursor; - private int mCursorCount; - /** Maps Model ID to cursor positions, for looking up items by Model ID. */ - private Map<String, Integer> mPositions = new HashMap<>(); - /** - * A sorted array of model IDs for the files currently in the Model. Sort order is determined - * by {@link #mSortOrder} - */ - private String mIds[] = new String[0]; - private int mSortOrder = SORT_ORDER_DISPLAY_NAME; - - @Nullable String info; - @Nullable String error; - @Nullable DocumentInfo doc; - - private void notifyUpdateListeners() { - for (UpdateListener listener: mUpdateListeners) { - listener.onModelUpdate(this); - } - } - - private void notifyUpdateListeners(Exception e) { - for (UpdateListener listener: mUpdateListeners) { - listener.onModelUpdateFailed(e); - } - } - - void update(DirectoryResult result) { - if (DEBUG) Log.i(TAG, "Updating model with new result set."); - - if (result == null) { - mCursor = null; - mCursorCount = 0; - mIds = new String[0]; - mPositions.clear(); - info = null; - error = null; - doc = null; - mIsLoading = false; - notifyUpdateListeners(); - return; - } - - if (result.exception != null) { - Log.e(TAG, "Error while loading directory contents", result.exception); - notifyUpdateListeners(result.exception); - return; - } - - mCursor = result.cursor; - mCursorCount = mCursor.getCount(); - mSortOrder = result.sortOrder; - doc = result.doc; - - updateModelData(); - - final Bundle extras = mCursor.getExtras(); - if (extras != null) { - info = extras.getString(DocumentsContract.EXTRA_INFO); - error = extras.getString(DocumentsContract.EXTRA_ERROR); - mIsLoading = extras.getBoolean(DocumentsContract.EXTRA_LOADING, false); - } - - notifyUpdateListeners(); - } - - @VisibleForTesting - int getItemCount() { - return mCursorCount; - } - - /** - * Scan over the incoming cursor data, generate Model IDs for each row, and sort the IDs - * according to the current sort order. - */ - private void updateModelData() { - int[] positions = new int[mCursorCount]; - mIds = new String[mCursorCount]; - boolean[] isDirs = new boolean[mCursorCount]; - String[] displayNames = null; - long[] longValues = null; - - switch (mSortOrder) { - case SORT_ORDER_DISPLAY_NAME: - displayNames = new String[mCursorCount]; - break; - case SORT_ORDER_LAST_MODIFIED: - case SORT_ORDER_SIZE: - longValues = new long[mCursorCount]; - break; - } - - String mimeType; - - mCursor.moveToPosition(-1); - for (int pos = 0; pos < mCursorCount; ++pos) { - if (!mCursor.moveToNext()) { - Log.e(TAG, "Fail to move cursor to next pos: " + pos); - return; - } - positions[pos] = pos; - - // Generates a Model ID for a cursor entry that refers to a document. The Model ID is a - // unique string that can be used to identify the document referred to by the cursor. - // If the cursor is a merged cursor over multiple authorities, then prefix the ids - // with the authority to avoid collisions. - if (mCursor instanceof MergeCursor) { - mIds[pos] = getCursorString(mCursor, RootCursorWrapper.COLUMN_AUTHORITY) + "|" + - getCursorString(mCursor, Document.COLUMN_DOCUMENT_ID); - } else { - mIds[pos] = getCursorString(mCursor, Document.COLUMN_DOCUMENT_ID); - } - - mimeType = getCursorString(mCursor, Document.COLUMN_MIME_TYPE); - isDirs[pos] = Document.MIME_TYPE_DIR.equals(mimeType); - - switch(mSortOrder) { - case SORT_ORDER_DISPLAY_NAME: - final String displayName = getCursorString( - mCursor, Document.COLUMN_DISPLAY_NAME); - displayNames[pos] = displayName; - break; - case SORT_ORDER_LAST_MODIFIED: - longValues[pos] = getLastModified(mCursor); - break; - case SORT_ORDER_SIZE: - longValues[pos] = getCursorLong(mCursor, Document.COLUMN_SIZE); - break; - } - } - - switch (mSortOrder) { - case SORT_ORDER_DISPLAY_NAME: - binarySort(displayNames, isDirs, positions, mIds); - break; - case SORT_ORDER_LAST_MODIFIED: - case SORT_ORDER_SIZE: - binarySort(longValues, isDirs, positions, mIds); - break; - } - - // Populate the positions. - mPositions.clear(); - for (int i = 0; i < mCursorCount; ++i) { - mPositions.put(mIds[i], positions[i]); - } - } - - /** - * Sorts model data. Takes three columns of index-corresponded data. The first column is the - * sort key. Rows are sorted in ascending alphabetical order on the sort key. - * Directories are always shown first. This code is based on TimSort.binarySort(). - * - * @param sortKey Data is sorted in ascending alphabetical order. - * @param isDirs Array saying whether an item is a directory or not. - * @param positions Cursor positions to be sorted. - * @param ids Model IDs to be sorted. - */ - private static void binarySort(String[] sortKey, boolean[] isDirs, int[] positions, String[] ids) { - final int count = positions.length; - for (int start = 1; start < count; start++) { - final int pivotPosition = positions[start]; - final String pivotValue = sortKey[start]; - final boolean pivotIsDir = isDirs[start]; - final String pivotId = ids[start]; - - int left = 0; - int right = start; - - while (left < right) { - int mid = (left + right) >>> 1; - - // Directories always go in front. - int compare = 0; - final boolean rhsIsDir = isDirs[mid]; - if (pivotIsDir && !rhsIsDir) { - compare = -1; - } else if (!pivotIsDir && rhsIsDir) { - compare = 1; - } else { - final String lhs = pivotValue; - final String rhs = sortKey[mid]; - compare = Shared.compareToIgnoreCaseNullable(lhs, rhs); - } - - if (compare < 0) { - right = mid; - } else { - left = mid + 1; - } - } - - int n = start - left; - switch (n) { - case 2: - positions[left + 2] = positions[left + 1]; - sortKey[left + 2] = sortKey[left + 1]; - isDirs[left + 2] = isDirs[left + 1]; - ids[left + 2] = ids[left + 1]; - case 1: - positions[left + 1] = positions[left]; - sortKey[left + 1] = sortKey[left]; - isDirs[left + 1] = isDirs[left]; - ids[left + 1] = ids[left]; - break; - default: - System.arraycopy(positions, left, positions, left + 1, n); - System.arraycopy(sortKey, left, sortKey, left + 1, n); - System.arraycopy(isDirs, left, isDirs, left + 1, n); - System.arraycopy(ids, left, ids, left + 1, n); - } - - positions[left] = pivotPosition; - sortKey[left] = pivotValue; - isDirs[left] = pivotIsDir; - ids[left] = pivotId; - } - } - - /** - * Sorts model data. Takes four columns of index-corresponded data. The first column is the sort - * key, and the second is an array of mime types. The rows are first bucketed by mime type - * (directories vs documents) and then each bucket is sorted independently in descending - * numerical order on the sort key. This code is based on TimSort.binarySort(). - * - * @param sortKey Data is sorted in descending numerical order. - * @param isDirs Array saying whether an item is a directory or not. - * @param positions Cursor positions to be sorted. - * @param ids Model IDs to be sorted. - */ - private static void binarySort( - long[] sortKey, boolean[] isDirs, int[] positions, String[] ids) { - final int count = positions.length; - for (int start = 1; start < count; start++) { - final int pivotPosition = positions[start]; - final long pivotValue = sortKey[start]; - final boolean pivotIsDir = isDirs[start]; - final String pivotId = ids[start]; - - int left = 0; - int right = start; - - while (left < right) { - int mid = ((left + right) >>> 1); - - // Directories always go in front. - int compare = 0; - final boolean rhsIsDir = isDirs[mid]; - if (pivotIsDir && !rhsIsDir) { - compare = -1; - } else if (!pivotIsDir && rhsIsDir) { - compare = 1; - } else { - final long lhs = pivotValue; - final long rhs = sortKey[mid]; - // Sort in descending numerical order. This matches legacy behaviour, which - // yields largest or most recent items on top. - compare = -Long.compare(lhs, rhs); - } - - // If numerical comparison yields a tie, use document ID as a tie breaker. This - // will yield stable results even if incoming items are continually shuffling and - // have identical numerical sort keys. One common example of this scenario is seen - // when sorting a set of active downloads by mod time. - if (compare == 0) { - compare = pivotId.compareTo(ids[mid]); - } - - if (compare < 0) { - right = mid; - } else { - left = mid + 1; - } - } - - int n = start - left; - switch (n) { - case 2: - positions[left + 2] = positions[left + 1]; - sortKey[left + 2] = sortKey[left + 1]; - isDirs[left + 2] = isDirs[left + 1]; - ids[left + 2] = ids[left + 1]; - case 1: - positions[left + 1] = positions[left]; - sortKey[left + 1] = sortKey[left]; - isDirs[left + 1] = isDirs[left]; - ids[left + 1] = ids[left]; - break; - default: - System.arraycopy(positions, left, positions, left + 1, n); - System.arraycopy(sortKey, left, sortKey, left + 1, n); - System.arraycopy(isDirs, left, isDirs, left + 1, n); - System.arraycopy(ids, left, ids, left + 1, n); - } - - positions[left] = pivotPosition; - sortKey[left] = pivotValue; - isDirs[left] = pivotIsDir; - ids[left] = pivotId; - } - } - - /** - * @return Timestamp for the given document. Some docs (e.g. active downloads) have a null - * timestamp - these will be replaced with MAX_LONG so that such files get sorted to the top - * when sorting by date. - */ - long getLastModified(Cursor cursor) { - long l = getCursorLong(mCursor, Document.COLUMN_LAST_MODIFIED); - return (l == -1) ? Long.MAX_VALUE : l; - } - - public @Nullable Cursor getItem(String modelId) { - Integer pos = mPositions.get(modelId); - if (pos == null) { - if (DEBUG) Log.d(TAG, "Unabled to find cursor position for modelId: " + modelId); - return null; - } - - if (!mCursor.moveToPosition(pos)) { - if (DEBUG) Log.d(TAG, - "Unabled to move cursor to position " + pos + " for modelId: " + modelId); - return null; - } - - return mCursor; - } - - boolean isEmpty() { - return mCursorCount == 0; - } - - boolean isLoading() { - return mIsLoading; - } - - List<DocumentInfo> getDocuments(Selection selection) { - final int size = (selection != null) ? selection.size() : 0; - - final List<DocumentInfo> docs = new ArrayList<>(size); - // NOTE: That as this now iterates over only final (non-provisional) selection. - for (String modelId: selection) { - final Cursor cursor = getItem(modelId); - if (cursor == null) { - Log.w(TAG, "Skipping document. Unabled to obtain cursor for modelId: " + modelId); - continue; - } - docs.add(DocumentInfo.fromDirectoryCursor(cursor)); - } - return docs; - } - - public Uri getItemUri(String modelId) { - final Cursor cursor = getItem(modelId); - return DocumentInfo.getUri(cursor); - } - - void addUpdateListener(UpdateListener listener) { - mUpdateListeners.add(listener); - } - - void removeUpdateListener(UpdateListener listener) { - mUpdateListeners.remove(listener); - } - - static interface UpdateListener { - /** - * Called when a successful update has occurred. - */ - void onModelUpdate(Model model); - - /** - * Called when an update has been attempted but failed. - */ - void onModelUpdateFailed(Exception e); - } - - /** - * @return An ordered array of model IDs representing the documents in the model. It is sorted - * according to the current sort order, which was set by the last model update. - */ - public String[] getModelIds() { - return mIds; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java deleted file mode 100644 index 2c1a221a4426..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapter.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.State.MODE_GRID; -import static com.android.documentsui.State.MODE_LIST; -import static com.android.documentsui.model.DocumentInfo.getCursorInt; -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.database.Cursor; -import android.provider.DocumentsContract.Document; -import android.util.Log; -import android.view.ViewGroup; - -import com.android.documentsui.State; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * Adapts from dirlist.Model to something RecyclerView understands. - */ -final class ModelBackedDocumentsAdapter extends DocumentsAdapter { - - private static final String TAG = "ModelBackedDocuments"; - public static final int ITEM_TYPE_DOCUMENT = 1; - public static final int ITEM_TYPE_DIRECTORY = 2; - - // Provides access to information needed when creating and view holders. This - // isn't an ideal pattern (more transitive dependency stuff) but good enough for now. - private final Environment mEnv; - private final IconHelper mIconHelper; // a transitive dependency of the holders. - - /** - * An ordered list of model IDs. This is the data structure that determines what shows up in - * the UI, and where. - */ - private List<String> mModelIds = new ArrayList<>(); - - // List of files that have been deleted. Some transient directory updates - // may happen while files are being deleted. During this time we don't - // want once-hidden files to be re-shown. We only remove - // items from this list when we get a model update where the model - // does not contain a corresponding id. This ensures hidden entries - // don't momentarily re-appear if we get intermediate updates from - // the file system. - private Set<String> mHiddenIds = new HashSet<>(); - - public ModelBackedDocumentsAdapter(Environment env, IconHelper iconHelper) { - mEnv = env; - mIconHelper = iconHelper; - } - - @Override - public DocumentHolder onCreateViewHolder(ViewGroup parent, int viewType) { - DocumentHolder holder = null; - final State state = mEnv.getDisplayState(); - switch (state.derivedMode) { - case MODE_GRID: - switch (viewType) { - case ITEM_TYPE_DIRECTORY: - holder = new GridDirectoryHolder(mEnv.getContext(), parent); - break; - case ITEM_TYPE_DOCUMENT: - holder = new GridDocumentHolder(mEnv.getContext(), parent, mIconHelper); - break; - default: - throw new IllegalStateException("Unsupported layout type."); - } - break; - case MODE_LIST: - holder = new ListDocumentHolder(mEnv.getContext(), parent, mIconHelper); - break; - default: - throw new IllegalStateException("Unsupported layout mode."); - } - - mEnv.initDocumentHolder(holder); - return holder; - } - - @Override - public void onBindViewHolder(DocumentHolder holder, int position, List<Object> payload) { - if (payload.contains(SELECTION_CHANGED_MARKER)) { - final boolean selected = mEnv.isSelected(mModelIds.get(position)); - holder.setSelected(selected, true); - } else { - onBindViewHolder(holder, position); - } - } - - @Override - public void onBindViewHolder(DocumentHolder holder, int position) { - String modelId = mModelIds.get(position); - Cursor cursor = mEnv.getModel().getItem(modelId); - holder.bind(cursor, modelId, mEnv.getDisplayState()); - - final String docMimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS); - - boolean enabled = mEnv.isDocumentEnabled(docMimeType, docFlags); - boolean selected = mEnv.isSelected(modelId); - if (!enabled) { - assert(!selected); - } - holder.setEnabled(enabled); - holder.setSelected(mEnv.isSelected(modelId), false); - - mEnv.onBindDocumentHolder(holder, cursor); - } - - @Override - public int getItemCount() { - return mModelIds.size(); - } - - @Override - public void onModelUpdate(Model model) { - if (DEBUG && mHiddenIds.size() > 0) { - Log.d(TAG, "Updating model with hidden ids: " + mHiddenIds); - } - - String[] modelIds = model.getModelIds(); - mModelIds = new ArrayList<>(modelIds.length); - for (String id : modelIds) { - if (!mHiddenIds.contains(id)) { - mModelIds.add(id); - } else { - if (DEBUG) Log.d(TAG, "Omitting hidden id from model during update: " + id); - } - } - - // Finally remove any hidden ids that aren't present in the model. - // This assumes that model updates represent a complete set of files. - mHiddenIds.retainAll(mModelIds); - } - - @Override - public void onModelUpdateFailed(Exception e) { - Log.w(TAG, "Model update failed.", e); - mModelIds.clear(); - } - - @Override - public String getModelId(int adapterPosition) { - return mModelIds.get(adapterPosition); - } - - @Override - public List<String> getModelIds() { - return mModelIds; - } - - @Override - public int getItemViewType(int position) { - return isDirectory(mEnv.getModel(), position) - ? ITEM_TYPE_DIRECTORY - : ITEM_TYPE_DOCUMENT; - } - - @Override - public void onItemSelectionChanged(String id) { - int position = mModelIds.indexOf(id); - - if (position >= 0) { - notifyItemChanged(position, SELECTION_CHANGED_MARKER); - } else { - Log.w(TAG, "Item change notification received for unknown item: " + id); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java deleted file mode 100644 index 9c0b967b7ce4..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/MultiSelectManager.java +++ /dev/null @@ -1,821 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.Shared.DEBUG; - -import android.annotation.IntDef; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.annotation.VisibleForTesting; -import android.support.v7.widget.RecyclerView; -import android.util.Log; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nullable; - -/** - * MultiSelectManager provides support traditional multi-item selection support to RecyclerView. - * Additionally it can be configured to restrict selection to a single element, @see - * #setSelectMode. - */ -public final class MultiSelectManager { - - @IntDef(flag = true, value = { - MODE_MULTIPLE, - MODE_SINGLE - }) - @Retention(RetentionPolicy.SOURCE) - public @interface SelectionMode {} - public static final int MODE_MULTIPLE = 0; - public static final int MODE_SINGLE = 1; - - private static final String TAG = "MultiSelectManager"; - - private final Selection mSelection = new Selection(); - - private final DocumentsAdapter mAdapter; - private final List<MultiSelectManager.Callback> mCallbacks = new ArrayList<>(1); - - private @Nullable Range mRanger; - private boolean mSingleSelect; - - public MultiSelectManager(DocumentsAdapter adapter, @SelectionMode int mode) { - - assert(adapter != null); - - mAdapter = adapter; - - mSingleSelect = mode == MODE_SINGLE; - mAdapter.registerAdapterDataObserver( - new RecyclerView.AdapterDataObserver() { - - private List<String> mModelIds; - - @Override - public void onChanged() { - mModelIds = mAdapter.getModelIds(); - - // Update the selection to remove any disappeared IDs. - mSelection.cancelProvisionalSelection(); - mSelection.intersect(mModelIds); - } - - @Override - public void onItemRangeChanged( - int startPosition, int itemCount, Object payload) { - // No change in position. Ignoring. - } - - @Override - public void onItemRangeInserted(int startPosition, int itemCount) { - mSelection.cancelProvisionalSelection(); - } - - @Override - public void onItemRangeRemoved(int startPosition, int itemCount) { - assert(startPosition >= 0); - assert(itemCount > 0); - - mSelection.cancelProvisionalSelection(); - // Remove any disappeared IDs from the selection. - mSelection.intersect(mModelIds); - } - - @Override - public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { - throw new UnsupportedOperationException(); - } - }); - } - - void bindContoller(BandController controller) { - // Provides BandController with access to private mSelection state. - controller.bindSelection(mSelection); - } - - /** - * Adds {@code callback} such that it will be notified when {@code MultiSelectManager} - * events occur. - * - * @param callback - */ - public void addCallback(MultiSelectManager.Callback callback) { - mCallbacks.add(callback); - } - - public boolean hasSelection() { - return !mSelection.isEmpty(); - } - - /** - * Returns a Selection object that provides a live view - * on the current selection. - * - * @see #getSelection(Selection) on how to get a snapshot - * of the selection that will not reflect future changes - * to selection. - * - * @return The current selection. - */ - public Selection getSelection() { - return mSelection; - } - - /** - * Updates {@code dest} to reflect the current selection. - * @param dest - * - * @return The Selection instance passed in, for convenience. - */ - public Selection getSelection(Selection dest) { - dest.copyFrom(mSelection); - return dest; - } - - public void replaceSelection(Iterable<String> ids) { - clearSelection(); - setItemsSelected(ids, true); - } - - /** - * Returns an unordered array of selected positions, including any - * provisional selection currently in effect. - */ - public void restoreSelection(Selection other) { - setItemsSelected(other.mSelection, true); - // NOTE: We intentionally don't restore provisional selection. It's provisional. - } - - /** - * Sets the selected state of the specified items. Note that the callback will NOT - * be consulted to see if an item can be selected. - * - * @param ids - * @param selected - * @return - */ - public boolean setItemsSelected(Iterable<String> ids, boolean selected) { - boolean changed = false; - for (String id: ids) { - boolean itemChanged = selected ? mSelection.add(id) : mSelection.remove(id); - if (itemChanged) { - notifyItemStateChanged(id, selected); - } - changed |= itemChanged; - } - notifySelectionChanged(); - return changed; - } - - /** - * Clears the selection and notifies (even if nothing changes). - */ - public void clearSelection() { - clearSelectionQuietly(); - notifySelectionChanged(); - } - - /** - * Clears the selection, without notifying selection listeners. UI elements still need to be - * notified about state changes so that they can update their appearance. - */ - private void clearSelectionQuietly() { - mRanger = null; - - if (!hasSelection()) { - return; - } - - Selection oldSelection = getSelection(new Selection()); - mSelection.clear(); - - for (String id: oldSelection.mSelection) { - notifyItemStateChanged(id, false); - } - for (String id: oldSelection.mProvisionalSelection) { - notifyItemStateChanged(id, false); - } - } - - void snapSelection(int position) { - mRanger.snapSelection(position); - - // We're being lazy here notifying even when something might not have changed. - // To make this more correct, we'd need to update the Ranger class to return - // information about what has changed. - notifySelectionChanged(); - } - - /** - * Toggles selection on the item with the given model ID. - * - * @param modelId - */ - public void toggleSelection(String modelId) { - assert(modelId != null); - - boolean changed = false; - if (mSelection.contains(modelId)) { - changed = attemptDeselect(modelId); - } else { - changed = attemptSelect(modelId); - } - - if (changed) { - notifySelectionChanged(); - } - } - - /** - * Starts a range selection. If a range selection is already active, this will start a new range - * selection (which will reset the range anchor). - * - * @param pos The anchor position for the selection range. - */ - void startRangeSelection(int pos) { - attemptSelect(mAdapter.getModelId(pos)); - setSelectionRangeBegin(pos); - } - - /** - * Sets the end point for the current range selection, started by a call to - * {@link #startRangeSelection(int)}. This function should only be called when a range selection - * is active (see {@link #isRangeSelectionActive()}. Items in the range [anchor, end] will be - * selected. - * - * @param pos The new end position for the selection range. - */ - void snapRangeSelection(int pos) { - if (!isRangeSelectionActive()) { - throw new IllegalStateException("Range start point not set."); - } - - mRanger.snapSelection(pos); - notifySelectionChanged(); - } - - /** - * Stops an in-progress range selection. - */ - void endRangeSelection() { - mRanger = null; - } - - /** - * @return Whether or not there is a current range selection active. - */ - boolean isRangeSelectionActive() { - return mRanger != null; - } - - /** - * Sets the magic location at which a selection range begins (the selection anchor). This value - * is consulted when determining how to extend, and modify selection ranges. Calling this when a - * range selection is active will reset the range selection. - * - * @throws IllegalStateException if {@code position} is not already be selected - * @param position - */ - void setSelectionRangeBegin(int position) { - if (position == RecyclerView.NO_POSITION) { - return; - } - - if (mSelection.contains(mAdapter.getModelId(position))) { - mRanger = new Range(position); - } - } - - /** - * Try to set selection state for all elements in range. Not that callbacks can cancel selection - * of specific items, so some or even all items may not reflect the desired state after the - * update is complete. - * - * @param begin Adapter position for range start (inclusive). - * @param end Adapter position for range end (inclusive). - * @param selected New selection state. - */ - private void updateRange(int begin, int end, boolean selected) { - assert(end >= begin); - for (int i = begin; i <= end; i++) { - String id = mAdapter.getModelId(i); - if (id == null) { - continue; - } - - if (selected) { - boolean canSelect = notifyBeforeItemStateChange(id, true); - if (canSelect) { - if (mSingleSelect && hasSelection()) { - clearSelectionQuietly(); - } - selectAndNotify(id); - } - } else { - attemptDeselect(id); - } - } - } - - /** - * @param modelId - * @return True if the update was applied. - */ - private boolean selectAndNotify(String modelId) { - boolean changed = mSelection.add(modelId); - if (changed) { - notifyItemStateChanged(modelId, true); - } - return changed; - } - - /** - * @param id - * @return True if the update was applied. - */ - private boolean attemptDeselect(String id) { - assert(id != null); - if (notifyBeforeItemStateChange(id, false)) { - mSelection.remove(id); - notifyItemStateChanged(id, false); - if (DEBUG) Log.d(TAG, "Selection after deselect: " + mSelection); - return true; - } else { - if (DEBUG) Log.d(TAG, "Select cancelled by listener."); - return false; - } - } - - /** - * @param id - * @return True if the update was applied. - */ - private boolean attemptSelect(String id) { - assert(id != null); - boolean canSelect = notifyBeforeItemStateChange(id, true); - if (!canSelect) { - return false; - } - if (mSingleSelect && hasSelection()) { - clearSelectionQuietly(); - } - - selectAndNotify(id); - return true; - } - - boolean notifyBeforeItemStateChange(String id, boolean nextState) { - int lastListener = mCallbacks.size() - 1; - for (int i = lastListener; i > -1; i--) { - if (!mCallbacks.get(i).onBeforeItemStateChange(id, nextState)) { - return false; - } - } - return true; - } - - /** - * Notifies registered listeners when the selection status of a single item - * (identified by {@code position}) changes. - */ - void notifyItemStateChanged(String id, boolean selected) { - assert(id != null); - int lastListener = mCallbacks.size() - 1; - for (int i = lastListener; i > -1; i--) { - mCallbacks.get(i).onItemStateChanged(id, selected); - } - mAdapter.onItemSelectionChanged(id); - } - - /** - * Notifies registered listeners when the selection has changed. This - * notification should be sent only once a full series of changes - * is complete, e.g. clearingSelection, or updating the single - * selection from one item to another. - */ - void notifySelectionChanged() { - int lastListener = mCallbacks.size() - 1; - for (int i = lastListener; i > -1; i--) { - mCallbacks.get(i).onSelectionChanged(); - } - } - - /** - * Class providing support for managing range selections. - */ - private final class Range { - private static final int UNDEFINED = -1; - - final int mBegin; - int mEnd = UNDEFINED; - - public Range(int begin) { - if (DEBUG) Log.d(TAG, "New Ranger created beginning @ " + begin); - mBegin = begin; - } - - private void snapSelection(int position) { - assert(mRanger != null); - assert(position != RecyclerView.NO_POSITION); - - if (mEnd == UNDEFINED || mEnd == mBegin) { - // Reset mEnd so it can be established in establishRange. - mEnd = UNDEFINED; - establishRange(position); - } else { - reviseRange(position); - } - } - - private void establishRange(int position) { - assert(mRanger.mEnd == UNDEFINED); - - if (position == mBegin) { - mEnd = position; - } - - if (position > mBegin) { - updateRange(mBegin + 1, position, true); - } else if (position < mBegin) { - updateRange(position, mBegin - 1, true); - } - - mEnd = position; - } - - private void reviseRange(int position) { - assert(mEnd != UNDEFINED); - assert(mBegin != mEnd); - - if (position == mEnd) { - if (DEBUG) Log.i(TAG, "Skipping no-op revision click on mEndRange."); - } - - if (mEnd > mBegin) { - reviseAscendingRange(position); - } else if (mEnd < mBegin) { - reviseDescendingRange(position); - } - // the "else" case is covered by checkState at beginning of method. - - mEnd = position; - } - - /** - * Updates an existing ascending seleciton. - * @param position - */ - private void reviseAscendingRange(int position) { - // Reducing or reversing the range.... - if (position < mEnd) { - if (position < mBegin) { - updateRange(mBegin + 1, mEnd, false); - updateRange(position, mBegin -1, true); - } else { - updateRange(position + 1, mEnd, false); - } - } - - // Extending the range... - else if (position > mEnd) { - updateRange(mEnd + 1, position, true); - } - } - - private void reviseDescendingRange(int position) { - // Reducing or reversing the range.... - if (position > mEnd) { - if (position > mBegin) { - updateRange(mEnd, mBegin - 1, false); - updateRange(mBegin + 1, position, true); - } else { - updateRange(mEnd, position - 1, false); - } - } - - // Extending the range... - else if (position < mEnd) { - updateRange(position, mEnd - 1, true); - } - } - } - - /** - * Object representing the current selection. Provides read only access - * public access, and private write access. - */ - public static final class Selection implements Iterable<String>, Parcelable { - - // This class tracks selected items by managing two sets: the saved selection, and the total - // selection. Saved selections are those which have been completed by tapping an item or by - // completing a band select operation. Provisional selections are selections which have been - // temporarily created by an in-progress band select operation (once the user releases the - // mouse button during a band select operation, the selected items become saved). The total - // selection is the combination of both the saved selection and the provisional - // selection. Tracking both separately is necessary to ensure that saved selections do not - // become deselected when they are removed from the provisional selection; for example, if - // item A is tapped (and selected), then an in-progress band select covers A then uncovers - // A, A should still be selected as it has been saved. To ensure this behavior, the saved - // selection must be tracked separately. - private final Set<String> mSelection; - private final Set<String> mProvisionalSelection; - private String mDirectoryKey; - - public Selection() { - mSelection = new HashSet<String>(); - mProvisionalSelection = new HashSet<String>(); - } - - /** - * Used by CREATOR. - */ - private Selection(String directoryKey, Set<String> selection) { - mDirectoryKey = directoryKey; - mSelection = selection; - mProvisionalSelection = new HashSet<String>(); - } - - /** - * @param id - * @return true if the position is currently selected. - */ - public boolean contains(@Nullable String id) { - return mSelection.contains(id) || mProvisionalSelection.contains(id); - } - - /** - * Returns an {@link Iterator} that iterators over the selection, *excluding* - * any provisional selection. - * - * {@inheritDoc} - */ - @Override - public Iterator<String> iterator() { - return mSelection.iterator(); - } - - /** - * @return size of the selection including both final and provisional selected items. - */ - public int size() { - return mSelection.size() + mProvisionalSelection.size(); - } - - /** - * @return true if the selection is empty. - */ - public boolean isEmpty() { - return mSelection.isEmpty() && mProvisionalSelection.isEmpty(); - } - - /** - * Sets the provisional selection, which is a temporary selection that can be saved, - * canceled, or adjusted at a later time. When a new provision selection is applied, the old - * one (if it exists) is abandoned. - * @return Map of ids added or removed. Added ids have a value of true, removed are false. - */ - @VisibleForTesting - protected Map<String, Boolean> setProvisionalSelection(Set<String> newSelection) { - Map<String, Boolean> delta = new HashMap<>(); - - for (String id: mProvisionalSelection) { - // Mark each item that used to be in the selection but is unsaved and not in the new - // provisional selection. - if (!newSelection.contains(id) && !mSelection.contains(id)) { - delta.put(id, false); - } - } - - for (String id: mSelection) { - // Mark each item that used to be in the selection but is unsaved and not in the new - // provisional selection. - if (!newSelection.contains(id)) { - delta.put(id, false); - } - } - - for (String id: newSelection) { - // Mark each item that was not previously in the selection but is in the new - // provisional selection. - if (!mSelection.contains(id) && !mProvisionalSelection.contains(id)) { - delta.put(id, true); - } - } - - // Now, iterate through the changes and actually add/remove them to/from the current - // selection. This could not be done in the previous loops because changing the size of - // the selection mid-iteration changes iteration order erroneously. - for (Map.Entry<String, Boolean> entry: delta.entrySet()) { - String id = entry.getKey(); - if (entry.getValue()) { - mProvisionalSelection.add(id); - } else { - mProvisionalSelection.remove(id); - } - } - - return delta; - } - - /** - * Saves the existing provisional selection. Once the provisional selection is saved, - * subsequent provisional selections which are different from this existing one cannot - * cause items in this existing provisional selection to become deselected. - */ - @VisibleForTesting - protected void applyProvisionalSelection() { - mSelection.addAll(mProvisionalSelection); - mProvisionalSelection.clear(); - } - - /** - * Abandons the existing provisional selection so that all items provisionally selected are - * now deselected. - */ - @VisibleForTesting - void cancelProvisionalSelection() { - mProvisionalSelection.clear(); - } - - /** @hide */ - @VisibleForTesting - boolean add(String id) { - if (!mSelection.contains(id)) { - mSelection.add(id); - return true; - } - return false; - } - - /** @hide */ - @VisibleForTesting - boolean remove(String id) { - if (mSelection.contains(id)) { - mSelection.remove(id); - return true; - } - return false; - } - - public void clear() { - mSelection.clear(); - } - - /** - * Trims this selection to be the intersection of itself with the set of given IDs. - */ - public void intersect(Collection<String> ids) { - mSelection.retainAll(ids); - mProvisionalSelection.retainAll(ids); - } - - @VisibleForTesting - void copyFrom(Selection source) { - mSelection.clear(); - mSelection.addAll(source.mSelection); - - mProvisionalSelection.clear(); - mProvisionalSelection.addAll(source.mProvisionalSelection); - } - - @Override - public String toString() { - if (size() <= 0) { - return "size=0, items=[]"; - } - - StringBuilder buffer = new StringBuilder(size() * 28); - buffer.append("Selection{") - .append("applied{size=" + mSelection.size()) - .append(", entries=" + mSelection) - .append("}, provisional{size=" + mProvisionalSelection.size()) - .append(", entries=" + mProvisionalSelection) - .append("}}"); - return buffer.toString(); - } - - @Override - public int hashCode() { - return mSelection.hashCode() ^ mProvisionalSelection.hashCode(); - } - - @Override - public boolean equals(Object that) { - if (this == that) { - return true; - } - - if (!(that instanceof Selection)) { - return false; - } - - return mSelection.equals(((Selection) that).mSelection) && - mProvisionalSelection.equals(((Selection) that).mProvisionalSelection); - } - - /** - * Sets the state key for this selection, which allows us to match selections - * to particular states (of DirectoryFragment). Basically this lets us avoid - * loading a persisted selection in the wrong directory. - */ - public void setDirectoryKey(String key) { - mDirectoryKey = key; - } - - /** - * Sets the state key for this selection, which allows us to match selections - * to particular states (of DirectoryFragment). Basically this lets us avoid - * loading a persisted selection in the wrong directory. - */ - public boolean hasDirectoryKey(String key) { - return key.equals(mDirectoryKey); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mDirectoryKey); - dest.writeStringList(new ArrayList<>(mSelection)); - // We don't include provisional selection since it is - // typically coupled to some other runtime state (like a band). - } - - public static final ClassLoaderCreator<Selection> CREATOR = - new ClassLoaderCreator<Selection>() { - @Override - public Selection createFromParcel(Parcel in) { - return createFromParcel(in, null); - } - - @Override - public Selection createFromParcel(Parcel in, ClassLoader loader) { - String directoryKey = in.readString(); - - ArrayList<String> selected = new ArrayList<>(); - in.readStringList(selected); - - return new Selection(directoryKey, new HashSet<String>(selected)); - } - - @Override - public Selection[] newArray(int size) { - return new Selection[size]; - } - }; - } - - public interface Callback { - /** - * Called when an item is selected or unselected while in selection mode. - * - * @param position Adapter position of the item that was checked or unchecked - * @param selected <code>true</code> if the item is now selected, <code>false</code> - * if the item is now unselected. - */ - public void onItemStateChanged(String id, boolean selected); - - /** - * Called prior to an item changing state. Callbacks can cancel - * the change at {@code position} by returning {@code false}. - * - * @param id Adapter position of the item that was checked or unchecked - * @param selected <code>true</code> if the item is to be selected, <code>false</code> - * if the item is to be unselected. - */ - public boolean onBeforeItemStateChange(String id, boolean selected); - - /** - * Called immediately after completion of any set of changes. - */ - public void onSelectionChanged(); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/RenameDocumentFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/RenameDocumentFragment.java deleted file mode 100644 index 73aa366ed639..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/RenameDocumentFragment.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.Shared.TAG; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.FragmentManager; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.support.annotation.Nullable; -import android.support.design.widget.Snackbar; -import android.util.Log; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.inputmethod.EditorInfo; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.TextView.OnEditorActionListener; - -import com.android.documentsui.BaseActivity; -import com.android.documentsui.DocumentsApplication; -import com.android.documentsui.Metrics; -import com.android.documentsui.R; -import com.android.documentsui.Shared; -import com.android.documentsui.Snackbars; -import com.android.documentsui.model.DocumentInfo; - -/** - * Dialog to rename file or directory. - */ -public class RenameDocumentFragment extends DialogFragment { - private static final String TAG_RENAME_DOCUMENT = "rename_document"; - private DocumentInfo mDocument; - private EditText mEditText; - - public static void show(FragmentManager fm, DocumentInfo document) { - final RenameDocumentFragment dialog = new RenameDocumentFragment(); - dialog.mDocument = document; - dialog.show(fm, TAG_RENAME_DOCUMENT); - } - - /** - * Creates the dialog UI. - * @param savedInstanceState - * @return - */ - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - Context context = getActivity(); - AlertDialog.Builder builder = new AlertDialog.Builder(context); - LayoutInflater dialogInflater = LayoutInflater.from(builder.getContext()); - View view = dialogInflater.inflate(R.layout.dialog_file_name, null, false); - - mEditText = (EditText) view.findViewById(android.R.id.text1); - builder.setTitle(R.string.menu_rename); - builder.setView(view); - - builder.setPositiveButton( - android.R.string.ok, - new OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - renameDocuments(mEditText.getText().toString()); - } - }); - - builder.setNegativeButton(android.R.string.cancel, null); - - final AlertDialog dialog = builder.create(); - - // Workaround for the problem - virtual keyboard doesn't show on the phone. - Shared.ensureKeyboardPresent(context, dialog); - - mEditText.setOnEditorActionListener( - new OnEditorActionListener() { - @Override - public boolean onEditorAction( - TextView view, int actionId, @Nullable KeyEvent event) { - if ((actionId == EditorInfo.IME_ACTION_DONE) || (event != null - && event.getKeyCode() == KeyEvent.KEYCODE_ENTER - && event.hasNoModifiers())) { - renameDocuments(mEditText.getText().toString()); - dialog.dismiss(); - return true; - } - return false; - } - }); - return dialog; - } - - /** - * Sets/Restores the data. - * @param savedInstanceState - * @return - */ - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - if(savedInstanceState == null) { - // Fragment created for the first time, we set the text. - // mDocument value was set in show - mEditText.setText(mDocument.displayName); - } - else { - // Fragment restored, text was restored automatically. - // mDocument value needs to be restored. - mDocument = savedInstanceState.getParcelable(Shared.EXTRA_DOC); - } - // Do selection in both cases, because we cleared it. - selectFileName(mEditText); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - // Clear selection before storing state and restore it manually, - // because otherwise after rotation selection is displayed with cut/copy menu visible :/ - clearFileNameSelection(mEditText); - - super.onSaveInstanceState(outState); - - outState.putParcelable(Shared.EXTRA_DOC, mDocument); - } - - /** - * Validates if string is a proper document name. - * Checks if string is not empty. More rules might be added later. - * @param docName string representing document name - * @returns true if string is a valid name. - **/ - private boolean isValidDocumentName(String docName) { - return !docName.isEmpty(); - } - - /** - * Fills text field with the file name and selects the name without extension. - * - * @param editText text field to be filled - */ - private void selectFileName(EditText editText) { - String text = editText.getText().toString(); - int separatorIndex = text.indexOf("."); - editText.setSelection(0, - (separatorIndex == -1 || mDocument.isDirectory()) ? text.length() : separatorIndex); - } - - /** - * Clears selection in text field. - * - * @param editText text field to be cleared. - */ - private void clearFileNameSelection(EditText editText) { - editText.setSelection(0, 0); - } - - private void renameDocuments(String newDisplayName) { - BaseActivity activity = (BaseActivity) getActivity(); - - if (isValidDocumentName(newDisplayName)) { - new RenameDocumentsTask(activity, newDisplayName).execute(mDocument); - } else { - Log.w(TAG, "Failed to rename file - invalid name:" + newDisplayName); - Snackbars.makeSnackbar(getActivity(), R.string.rename_error, - Snackbar.LENGTH_SHORT).show(); - } - - } - - private class RenameDocumentsTask extends AsyncTask<DocumentInfo, Void, DocumentInfo> { - private final BaseActivity mActivity; - private final String mNewDisplayName; - - public RenameDocumentsTask(BaseActivity activity, String newDisplayName) { - mActivity = activity; - mNewDisplayName = newDisplayName; - } - - @Override - protected void onPreExecute() { - mActivity.setPending(true); - } - - @Override - protected DocumentInfo doInBackground(DocumentInfo... document) { - assert(document.length == 1); - final ContentResolver resolver = mActivity.getContentResolver(); - ContentProviderClient client = null; - - try { - client = DocumentsApplication.acquireUnstableProviderOrThrow( - resolver, document[0].derivedUri.getAuthority()); - Uri newUri = DocumentsContract.renameDocument( - client, document[0].derivedUri, mNewDisplayName); - return DocumentInfo.fromUri(resolver, newUri); - } catch (Exception e) { - Log.w(TAG, "Failed to rename file", e); - return null; - } finally { - ContentProviderClient.releaseQuietly(client); - } - } - - @Override - protected void onPostExecute(DocumentInfo result) { - if (result != null) { - Metrics.logRenameFileOperation(getContext()); - } else { - Snackbars.makeSnackbar(mActivity, R.string.rename_error, Snackbar.LENGTH_SHORT) - .show(); - Metrics.logRenameFileError(getContext()); - } - mActivity.setPending(false); - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapper.java deleted file mode 100644 index 55a6de79d6c5..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapper.java +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.Context; -import android.database.Cursor; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView.AdapterDataObserver; -import android.view.ViewGroup; -import android.widget.Space; - -import com.android.documentsui.R; -import com.android.documentsui.State; - -import java.util.List; - -/** - * Adapter wrapper that inserts a sort of line break item between directories and regular files. - * Only needs to be used in GRID mode...at this time. - */ -final class SectionBreakDocumentsAdapterWrapper extends DocumentsAdapter { - - private static final String TAG = "SectionBreakDocumentsAdapterWrapper"; - private static final int ITEM_TYPE_SECTION_BREAK = Integer.MAX_VALUE; - - private final Environment mEnv; - private final DocumentsAdapter mDelegate; - - private int mBreakPosition = -1; - - SectionBreakDocumentsAdapterWrapper(Environment environment, DocumentsAdapter delegate) { - mEnv = environment; - mDelegate = delegate; - - // Relay events published by our delegate to our listeners (presumably RecyclerView) - // with adjusted positions. - mDelegate.registerAdapterDataObserver(new EventRelay()); - } - - public GridLayoutManager.SpanSizeLookup createSpanSizeLookup() { - return new GridLayoutManager.SpanSizeLookup() { - @Override - public int getSpanSize(int position) { - // Make layout whitespace span the grid. This has the effect of breaking - // grid rows whenever layout whitespace is encountered. - if (getItemViewType(position) == ITEM_TYPE_SECTION_BREAK) { - return mEnv.getColumnCount(); - } else { - return 1; - } - } - }; - } - - @Override - public DocumentHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == ITEM_TYPE_SECTION_BREAK) { - return new EmptyDocumentHolder(mEnv.getContext()); - } else { - return mDelegate.createViewHolder(parent, viewType); - } - } - - @Override - public void onBindViewHolder(DocumentHolder holder, int p, List<Object> payload) { - if (holder.getItemViewType() != ITEM_TYPE_SECTION_BREAK) { - mDelegate.onBindViewHolder(holder, toDelegatePosition(p), payload); - } else { - ((EmptyDocumentHolder)holder).bind(mEnv.getDisplayState()); - } - } - - @Override - public void onBindViewHolder(DocumentHolder holder, int p) { - if (holder.getItemViewType() != ITEM_TYPE_SECTION_BREAK) { - mDelegate.onBindViewHolder(holder, toDelegatePosition(p)); - } else { - ((EmptyDocumentHolder)holder).bind(mEnv.getDisplayState()); - } - } - - @Override - public int getItemCount() { - return mBreakPosition == -1 - ? mDelegate.getItemCount() - : mDelegate.getItemCount() + 1; - } - - @Override - public void onModelUpdate(Model model) { - mDelegate.onModelUpdate(model); - mBreakPosition = -1; - - // Walk down the list of IDs till we encounter something that's not a directory, and - // insert a whitespace element - this introduces a visual break in the grid between - // folders and documents. - // TODO: This code makes assumptions about the model, namely, that it performs a - // bucketed sort where directories will always be ordered before other files. CBB. - List<String> modelIds = mDelegate.getModelIds(); - for (int i = 0; i < modelIds.size(); i++) { - if (!isDirectory(model, i)) { - // If the break is the first thing in the list, then there are actually no - // directories. In that case, don't insert a break at all. - if (i > 0) { - mBreakPosition = i; - } - break; - } - } - } - - @Override - public void onModelUpdateFailed(Exception e) { - mDelegate.onModelUpdateFailed(e); - } - - @Override - public int getItemViewType(int p) { - if (p == mBreakPosition) { - return ITEM_TYPE_SECTION_BREAK; - } else { - return mDelegate.getItemViewType(toDelegatePosition(p)); - } - } - - /** - * Returns the position of an item in the delegate, adjusting - * values that are greater than the break position. - * - * @param p Position within the view - * @return Position within the delegate - */ - private int toDelegatePosition(int p) { - return (mBreakPosition != -1 && p > mBreakPosition) ? p - 1 : p; - } - - /** - * Returns the position of an item in the view, adjusting - * values that are greater than the break position. - * - * @param p Position within the delegate - * @return Position within the view - */ - private int toViewPosition(int p) { - // If position is greater than or equal to the break, increase by one. - return (mBreakPosition != -1 && p >= mBreakPosition) ? p + 1 : p; - } - - @Override - List<String> getModelIds() { - return mDelegate.getModelIds(); - } - - @Override - String getModelId(int p) { - return (p == mBreakPosition) ? null : mDelegate.getModelId(toDelegatePosition(p)); - } - - @Override - public void onItemSelectionChanged(String id) { - mDelegate.onItemSelectionChanged(id); - } - - // Listener we add to our delegate. This allows us to relay events published - // by the delegate to our listeners (presumably RecyclerView) with adjusted positions. - private final class EventRelay extends AdapterDataObserver { - public void onChanged() { - throw new UnsupportedOperationException(); - } - - public void onItemRangeChanged(int positionStart, int itemCount) { - throw new UnsupportedOperationException(); - } - - public void onItemRangeChanged(int positionStart, int itemCount, Object payload) { - assert(itemCount == 1); - notifyItemRangeChanged(toViewPosition(positionStart), itemCount, payload); - } - - public void onItemRangeInserted(int positionStart, int itemCount) { - assert(itemCount == 1); - if (positionStart < mBreakPosition) { - mBreakPosition++; - } - notifyItemRangeInserted(toViewPosition(positionStart), itemCount); - } - - public void onItemRangeRemoved(int positionStart, int itemCount) { - assert(itemCount == 1); - if (positionStart < mBreakPosition) { - mBreakPosition--; - } - notifyItemRangeRemoved(toViewPosition(positionStart), itemCount); - } - - public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { - throw new UnsupportedOperationException(); - } - } - - /** - * The most elegant transparent blank box that spans N rows ever conceived. - */ - private static final class EmptyDocumentHolder extends DocumentHolder { - final int mVisibleHeight; - - public EmptyDocumentHolder(Context context) { - super(context, new Space(context)); - - // Per UX spec, this puts a bigger gap between the folders and documents in the grid. - mVisibleHeight = context.getResources().getDimensionPixelSize( - R.dimen.grid_item_margin); - } - - public void bind(State state) { - bind(null, null, state); - } - - @Override - public void bind(Cursor cursor, String modelId, State state) { - if (state.derivedMode == State.MODE_GRID) { - itemView.setMinimumHeight(mVisibleHeight); - } else { - itemView.setMinimumHeight(0); - } - return; - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/TouchSwipeRefreshLayout.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/TouchSwipeRefreshLayout.java deleted file mode 100644 index 32bb5b183afe..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/TouchSwipeRefreshLayout.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.Context; -import android.content.res.TypedArray; -import android.support.annotation.ColorRes; -import android.support.v4.widget.SwipeRefreshLayout; -import android.util.AttributeSet; -import android.view.MotionEvent; - -import com.android.documentsui.Events; - -/** - * A {@link SwipeRefreshLayout} that only refresh on touch events. - */ -public class TouchSwipeRefreshLayout extends SwipeRefreshLayout { - - private static final int[] COLOR_RES = new int[] { android.R.attr.colorAccent }; - private static int COLOR_ACCENT_INDEX = 0; - - public TouchSwipeRefreshLayout(Context context) { - this(context, null); - } - - public TouchSwipeRefreshLayout(Context context, AttributeSet attrs) { - super(context, attrs); - - TypedArray a = context.obtainStyledAttributes(COLOR_RES); - @ColorRes int colorId = a.getResourceId(COLOR_ACCENT_INDEX, -1); - a.recycle(); - setColorSchemeResources(colorId); - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent e) { - return Events.isMouseEvent(e) ? false : super.onInterceptTouchEvent(e); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/UserInputHandler.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/UserInputHandler.java deleted file mode 100644 index 07b0cd8f7248..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/UserInputHandler.java +++ /dev/null @@ -1,423 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.Shared.DEBUG; - -import android.support.annotation.VisibleForTesting; -import android.util.Log; -import android.view.GestureDetector; -import android.view.KeyEvent; -import android.view.MotionEvent; - -import com.android.documentsui.Events; -import com.android.documentsui.Events.InputEvent; -import com.android.documentsui.dirlist.DocumentHolder.KeyboardEventListener; - -import java.util.function.Function; -import java.util.function.Predicate; - -/** - * Grand unified-ish gesture/event listener for items in the directory list. - */ -public final class UserInputHandler<T extends InputEvent> - extends GestureDetector.SimpleOnGestureListener - implements KeyboardEventListener { - - private static final String TAG = "UserInputHandler"; - - private final MultiSelectManager mSelectionMgr; - private final FocusHandler mFocusHandler; - private final Function<MotionEvent, T> mEventConverter; - private final Function<T, DocumentDetails> mDocFinder; - private final Predicate<DocumentDetails> mSelectable; - private final EventHandler mRightClickHandler; - private final DocumentHandler mActivateHandler; - private final DocumentHandler mDeleteHandler; - private final TouchInputDelegate mTouchDelegate; - private final MouseInputDelegate mMouseDelegate; - private final KeyInputHandler mKeyListener; - - public UserInputHandler( - MultiSelectManager selectionMgr, - FocusHandler focusHandler, - Function<MotionEvent, T> eventConverter, - Function<T, DocumentDetails> docFinder, - Predicate<DocumentDetails> selectable, - EventHandler rightClickHandler, - DocumentHandler activateHandler, - DocumentHandler deleteHandler) { - - mSelectionMgr = selectionMgr; - mFocusHandler = focusHandler; - mEventConverter = eventConverter; - mDocFinder = docFinder; - mSelectable = selectable; - mRightClickHandler = rightClickHandler; - mActivateHandler = activateHandler; - mDeleteHandler = deleteHandler; - - mTouchDelegate = new TouchInputDelegate(); - mMouseDelegate = new MouseInputDelegate(); - mKeyListener = new KeyInputHandler(); - } - - @Override - public boolean onSingleTapUp(MotionEvent e) { - try (T event = mEventConverter.apply(e)) { - return onSingleTapUp(event); - } - } - - @VisibleForTesting - boolean onSingleTapUp(T event) { - return event.isMouseEvent() - ? mMouseDelegate.onSingleTapUp(event) - : mTouchDelegate.onSingleTapUp(event); - } - - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - try (T event = mEventConverter.apply(e)) { - return onSingleTapConfirmed(event); - } - } - - @VisibleForTesting - boolean onSingleTapConfirmed(T event) { - return event.isMouseEvent() - ? mMouseDelegate.onSingleTapConfirmed(event) - : mTouchDelegate.onSingleTapConfirmed(event); - } - - @Override - public boolean onDoubleTap(MotionEvent e) { - try (T event = mEventConverter.apply(e)) { - return onDoubleTap(event); - } - } - - @VisibleForTesting - boolean onDoubleTap(T event) { - return event.isMouseEvent() - ? mMouseDelegate.onDoubleTap(event) - : mTouchDelegate.onDoubleTap(event); - } - - @Override - public void onLongPress(MotionEvent e) { - try (T event = mEventConverter.apply(e)) { - onLongPress(event); - } - } - - @VisibleForTesting - void onLongPress(T event) { - if (event.isMouseEvent()) { - mMouseDelegate.onLongPress(event); - } - mTouchDelegate.onLongPress(event); - } - - public boolean onSingleRightClickUp(MotionEvent e) { - try (T event = mEventConverter.apply(e)) { - return mMouseDelegate.onSingleRightClickUp(event); - } - } - - @Override - public boolean onKey(DocumentHolder doc, int keyCode, KeyEvent event) { - return mKeyListener.onKey(doc, keyCode, event); - } - - // TODO: Isolate this hack...see if we can't get this solved at the platform level. - public void setLastButtonState(int state) { - mMouseDelegate.setLastButtonState(state); - } - - private boolean activateDocument(DocumentDetails doc) { - return mActivateHandler.accept(doc); - } - - private boolean selectDocument(DocumentDetails doc) { - assert(doc != null); - mSelectionMgr.toggleSelection(doc.getModelId()); - mSelectionMgr.setSelectionRangeBegin(doc.getAdapterPosition()); - return true; - } - - boolean isRangeExtension(T event) { - return event.isShiftKeyDown() && mSelectionMgr.isRangeSelectionActive(); - } - - private void extendSelectionRange(T event) { - mSelectionMgr.snapSelection(event.getItemPosition()); - } - - private final class TouchInputDelegate { - - boolean onSingleTapUp(T event) { - if (!event.isOverItem()) { - if (DEBUG) Log.d(TAG, "Tap on non-item. Clearing selection."); - mSelectionMgr.clearSelection(); - return false; - } - - if (mSelectionMgr.hasSelection()) { - if (isRangeExtension(event)) { - mSelectionMgr.snapSelection(event.getItemPosition()); - } else { - selectDocument(mDocFinder.apply(event)); - } - return true; - } - - // Give the DocumentHolder a crack at the event. - DocumentDetails doc = mDocFinder.apply(event); - if (doc != null) { - // Touch events select if they occur in the selection hotspot, - // otherwise they activate. - return doc.isInSelectionHotspot(event) - ? selectDocument(doc) - : activateDocument(doc); - } - - return false; - } - - boolean onSingleTapConfirmed(T event) { - return false; - } - - boolean onDoubleTap(T event) { - return false; - } - - final void onLongPress(T event) { - if (!event.isOverItem()) { - return; - } - - if (isRangeExtension(event)) { - extendSelectionRange(event); - } else { - selectDocument(mDocFinder.apply(event)); - } - } - } - - private final class MouseInputDelegate { - - // From the RecyclerView, we get two events sent to - // ListeningGestureDetector#onInterceptTouchEvent on a mouse click; we first get an - // ACTION_DOWN Event for clicking on the mouse, and then an ACTION_UP event from releasing - // the mouse click. ACTION_UP event doesn't have information regarding the button (primary - // vs. secondary), so we have to save that somewhere first from ACTION_DOWN, and then reuse - // it later. The ACTION_DOWN event doesn't get forwarded to UserInputListener, - // so we have open up a public set method to set it. - private int mLastButtonState = -1; - - // true when the previous event has consumed a right click motion event - private boolean mAteRightClick; - - // The event has been handled in onSingleTapUp - private boolean mHandledTapUp; - - boolean onSingleTapUp(T event) { - if (eatRightClick()) { - return onSingleRightClickUp(event); - } - - if (!event.isOverItem()) { - mSelectionMgr.clearSelection(); - return false; - } - - if (mSelectionMgr.hasSelection()) { - if (isRangeExtension(event)) { - extendSelectionRange(event); - } else { - selectDocument(mDocFinder.apply(event)); - } - mHandledTapUp = true; - return true; - } - - // We'll toggle selection in onSingleTapConfirmed - // This avoids flickering on/off action mode when an item is double clicked. - if (!mSelectionMgr.hasSelection()) { - return false; - } - - DocumentDetails doc = mDocFinder.apply(event); - if (doc == null) { - return false; - } - - mHandledTapUp = true; - return selectDocument(doc); - } - - boolean onSingleTapConfirmed(T event) { - if (mAteRightClick) { - mAteRightClick = false; - return false; - } - if (mHandledTapUp) { - mHandledTapUp = false; - return false; - } - - if (mSelectionMgr.hasSelection()) { - return false; // should have been handled by onSingleTapUp. - } - - DocumentDetails doc = mDocFinder.apply(event); - if (doc == null) { - return false; - } - - return selectDocument(doc); - } - - boolean onDoubleTap(T event) { - mHandledTapUp = false; - DocumentDetails doc = mDocFinder.apply(event); - if (doc != null) { - return mSelectionMgr.hasSelection() - ? selectDocument(doc) - : activateDocument(doc); - } - return false; - } - - final void onLongPress(T event) { - if (!event.isOverItem()) { - return; - } - - if (isRangeExtension(event)) { - extendSelectionRange(event); - } else { - selectDocument(mDocFinder.apply(event)); - } - } - - private boolean onSingleRightClickUp(T event) { - return mRightClickHandler.apply(event); - } - - // hack alert from here through end of class. - private void setLastButtonState(int state) { - mLastButtonState = state; - } - - private boolean eatRightClick() { - if (mLastButtonState == MotionEvent.BUTTON_SECONDARY) { - mLastButtonState = -1; - mAteRightClick = true; - return true; - } - return false; - } - } - - private final class KeyInputHandler { - // TODO: Refactor FocusManager to depend only on DocumentDetails so we can eliminate - // difficult to test dependency on DocumentHolder. - - boolean onKey(DocumentHolder doc, int keyCode, KeyEvent event) { - // Only handle key-down events. This is simpler, consistent with most other UIs, and - // enables the handling of repeated key events from holding down a key. - if (event.getAction() != KeyEvent.ACTION_DOWN) { - return false; - } - - // Ignore tab key events. Those should be handled by the top-level key handler. - if (keyCode == KeyEvent.KEYCODE_TAB) { - return false; - } - - if (mFocusHandler.handleKey(doc, keyCode, event)) { - // Handle range selection adjustments. Extending the selection will adjust the - // bounds of the in-progress range selection. Each time an unshifted navigation - // event is received, the range selection is restarted. - if (shouldExtendSelection(doc, event)) { - if (!mSelectionMgr.isRangeSelectionActive()) { - // Start a range selection if one isn't active - mSelectionMgr.startRangeSelection(doc.getAdapterPosition()); - } - mSelectionMgr.snapRangeSelection(mFocusHandler.getFocusPosition()); - } else { - mSelectionMgr.endRangeSelection(); - } - return true; - } - - // Handle enter key events - switch (keyCode) { - case KeyEvent.KEYCODE_ENTER: - if (event.isShiftPressed()) { - selectDocument(doc); - } - // For non-shifted enter keypresses, fall through. - case KeyEvent.KEYCODE_DPAD_CENTER: - case KeyEvent.KEYCODE_BUTTON_A: - return activateDocument(doc); - case KeyEvent.KEYCODE_FORWARD_DEL: - // This has to be handled here instead of in a keyboard shortcut, because - // keyboard shortcuts all have to be modified with the 'Ctrl' key. - if (mSelectionMgr.hasSelection()) { - mDeleteHandler.accept(doc); - } - // Always handle the key, even if there was nothing to delete. This is a - // precaution to prevent other handlers from potentially picking up the event - // and triggering extra behaviors. - return true; - } - - return false; - } - - private boolean shouldExtendSelection(DocumentDetails doc, KeyEvent event) { - if (!Events.isNavigationKeyCode(event.getKeyCode()) || !event.isShiftPressed()) { - return false; - } - - return mSelectable.test(doc); - } - } - - /** - * Class providing limited access to document view info. - */ - public interface DocumentDetails { - String getModelId(); - int getAdapterPosition(); - boolean isInSelectionHotspot(InputEvent event); - } - - @FunctionalInterface - interface EventHandler { - boolean apply(InputEvent event); - } - - @FunctionalInterface - interface DocumentHandler { - boolean accept(DocumentDetails doc); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ViewAutoScroller.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/ViewAutoScroller.java deleted file mode 100644 index 5ef68ca794f6..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/ViewAutoScroller.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -package com.android.documentsui.dirlist; - -import android.graphics.Point; -import android.support.annotation.VisibleForTesting; - -import java.util.function.IntSupplier; -import java.util.function.LongSupplier; - -/** - * Provides auto-scrolling upon request when user's interaction with the application - * introduces a natural intent to scroll. Used by {@link BandController} and - * {@link DragScrollListener} to allow auto scrolling when user either does band selection, or - * attempting to drag and drop files to somewhere off the current screen. - */ -public final class ViewAutoScroller implements Runnable { - public static final int NOT_SET = -1; - /** - * The number of milliseconds of scrolling at which scroll speed continues to increase. - * At first, the scroll starts slowly; then, the rate of scrolling increases until it - * reaches its maximum value at after this many milliseconds. - */ - private static final long SCROLL_ACCELERATION_LIMIT_TIME_MS = 2000; - - // Top and bottom inner buffer such that user's cursor does not have to be exactly off screen - // for auto scrolling to begin - private final int mTopBottomThreshold; - private final ScrollDistanceDelegate mCalcDelegate; - private final ScrollActionDelegate mUiDelegate; - private final LongSupplier mCurrentTime; - - private long mScrollStartTime = NOT_SET; - - public ViewAutoScroller( - int topBottomThreshold, - ScrollDistanceDelegate calcDelegate, - ScrollActionDelegate uiDelegate) { - this(topBottomThreshold, calcDelegate, uiDelegate, System::currentTimeMillis); - } - - @VisibleForTesting - ViewAutoScroller( - int topBottomThreshold, - ScrollDistanceDelegate calcDelegate, - ScrollActionDelegate uiDelegate, - LongSupplier clock) { - mTopBottomThreshold = topBottomThreshold; - mCalcDelegate = calcDelegate; - mUiDelegate = uiDelegate; - mCurrentTime = clock; - } - - /** - * Attempts to smooth-scroll the view at the given UI frame. Application should be - * responsible to do any clean up (such as unsubscribing scrollListeners) after the run has - * finished, and re-run this method on the next UI frame if applicable. - */ - @Override - public void run() { - // Compute the number of pixels the pointer's y-coordinate is past the view. - // Negative values mean the pointer is at or before the top of the view, and - // positive values mean that the pointer is at or after the bottom of the view. Note - // that top/bottom threshold is added here so that the view still scrolls when the - // pointer are in these buffer pixels. - int pixelsPastView = 0; - - if (mCalcDelegate.getCurrentPosition().y <= mTopBottomThreshold) { - pixelsPastView = mCalcDelegate.getCurrentPosition().y - mTopBottomThreshold; - } else if (mCalcDelegate.getCurrentPosition().y >= mCalcDelegate.getViewHeight() - - mTopBottomThreshold) { - pixelsPastView = mCalcDelegate.getCurrentPosition().y - mCalcDelegate.getViewHeight() - + mTopBottomThreshold; - } - - if (!mCalcDelegate.isActive() || pixelsPastView == 0) { - // If the operation that started the scrolling is no longer inactive, or if it is active - // but not at the edge of the view, no scrolling is necessary. - mScrollStartTime = NOT_SET; - return; - } - - if (mScrollStartTime == NOT_SET) { - // If the pointer was previously not at the edge of the view but now is, set the - // start time for the scroll. - mScrollStartTime = mCurrentTime.getAsLong(); - } - - // Compute the number of pixels to scroll, and scroll that many pixels. - final int numPixels = computeScrollDistance( - pixelsPastView, mCurrentTime.getAsLong() - mScrollStartTime); - mUiDelegate.scrollBy(numPixels); - - // Remove callback to this, and then properly run at next frame again - mUiDelegate.removeCallback(this); - mUiDelegate.runAtNextFrame(this); - } - - /** - * Computes the number of pixels to scroll based on how far the pointer is past the end - * of the view and how long it has been there. Roughly based on ItemTouchHelper's - * algorithm for computing the number of pixels to scroll when an item is dragged to the - * end of a view. - * @param pixelsPastView - * @param scrollDuration - * @return - */ - public int computeScrollDistance(int pixelsPastView, long scrollDuration) { - final int maxScrollStep = mCalcDelegate.getViewHeight(); - final int direction = (int) Math.signum(pixelsPastView); - final int absPastView = Math.abs(pixelsPastView); - - // Calculate the ratio of how far out of the view the pointer currently resides to - // the entire height of the view. - final float outOfBoundsRatio = Math.min( - 1.0f, (float) absPastView / mCalcDelegate.getViewHeight()); - // Interpolate this ratio and use it to compute the maximum scroll that should be - // possible for this step. - final float cappedScrollStep = - direction * maxScrollStep * smoothOutOfBoundsRatio(outOfBoundsRatio); - - // Likewise, calculate the ratio of the time spent in the scroll to the limit. - final float timeRatio = Math.min( - 1.0f, (float) scrollDuration / SCROLL_ACCELERATION_LIMIT_TIME_MS); - // Interpolate this ratio and use it to compute the final number of pixels to - // scroll. - final int numPixels = (int) (cappedScrollStep * smoothTimeRatio(timeRatio)); - - // If the final number of pixels to scroll ends up being 0, the view should still - // scroll at least one pixel. - return numPixels != 0 ? numPixels : direction; - } - - /** - * Interpolates the given out of bounds ratio on a curve which starts at (0,0) and ends - * at (1,1) and quickly approaches 1 near the start of that interval. This ensures that - * drags that are at the edge or barely past the edge of the view still cause sufficient - * scrolling. The equation y=(x-1)^5+1 is used, but this could also be tweaked if - * needed. - * @param ratio A ratio which is in the range [0, 1]. - * @return A "smoothed" value, also in the range [0, 1]. - */ - private float smoothOutOfBoundsRatio(float ratio) { - return (float) Math.pow(ratio - 1.0f, 5) + 1.0f; - } - - /** - * Interpolates the given time ratio on a curve which starts at (0,0) and ends at (1,1) - * and stays close to 0 for most input values except those very close to 1. This ensures - * that scrolls start out very slowly but speed up drastically after the scroll has been - * in progress close to SCROLL_ACCELERATION_LIMIT_TIME_MS. The equation y=x^5 is used, - * but this could also be tweaked if needed. - * @param ratio A ratio which is in the range [0, 1]. - * @return A "smoothed" value, also in the range [0, 1]. - */ - private float smoothTimeRatio(float ratio) { - return (float) Math.pow(ratio, 5); - } - - /** - * Used by {@link run} to properly calculate the proper amount of pixels to scroll given time - * passed since scroll started, and to properly scroll / proper listener clean up if necessary. - */ - interface ScrollDistanceDelegate { - public Point getCurrentPosition(); - public int getViewHeight(); - public boolean isActive(); - } - - /** - * Used by {@link run} to do UI tasks, such as scrolling and rerunning at next UI cycle. - */ - interface ScrollActionDelegate { - public void scrollBy(int dy); - public void runAtNextFrame(Runnable r); - public void removeCallback(Runnable r); - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java deleted file mode 100644 index b54c9bb98ac7..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.model; - -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.database.Cursor; -import android.net.Uri; -import android.os.Parcel; -import android.os.Parcelable; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsProvider; -import android.support.annotation.VisibleForTesting; - -import com.android.documentsui.DocumentsApplication; -import com.android.documentsui.RootCursorWrapper; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.ProtocolException; -import java.util.Arrays; -import java.util.Objects; -import java.util.Set; - -import libcore.io.IoUtils; - -/** - * Representation of a {@link Document}. - */ -public class DocumentInfo implements Durable, Parcelable { - private static final int VERSION_INIT = 1; - private static final int VERSION_SPLIT_URI = 2; - - public String authority; - public String documentId; - public String mimeType; - public String displayName; - public long lastModified; - public int flags; - public String summary; - public long size; - public int icon; - - /** Derived fields that aren't persisted */ - public Uri derivedUri; - - public DocumentInfo() { - reset(); - } - - @Override - public void reset() { - authority = null; - documentId = null; - mimeType = null; - displayName = null; - lastModified = -1; - flags = 0; - summary = null; - size = -1; - icon = 0; - derivedUri = null; - } - - @Override - public void read(DataInputStream in) throws IOException { - final int version = in.readInt(); - switch (version) { - case VERSION_INIT: - throw new ProtocolException("Ignored upgrade"); - case VERSION_SPLIT_URI: - authority = DurableUtils.readNullableString(in); - documentId = DurableUtils.readNullableString(in); - mimeType = DurableUtils.readNullableString(in); - displayName = DurableUtils.readNullableString(in); - lastModified = in.readLong(); - flags = in.readInt(); - summary = DurableUtils.readNullableString(in); - size = in.readLong(); - icon = in.readInt(); - deriveFields(); - break; - default: - throw new ProtocolException("Unknown version " + version); - } - } - - @Override - public void write(DataOutputStream out) throws IOException { - out.writeInt(VERSION_SPLIT_URI); - DurableUtils.writeNullableString(out, authority); - DurableUtils.writeNullableString(out, documentId); - DurableUtils.writeNullableString(out, mimeType); - DurableUtils.writeNullableString(out, displayName); - out.writeLong(lastModified); - out.writeInt(flags); - DurableUtils.writeNullableString(out, summary); - out.writeLong(size); - out.writeInt(icon); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - DurableUtils.writeToParcel(dest, this); - } - - public static final Creator<DocumentInfo> CREATOR = new Creator<DocumentInfo>() { - @Override - public DocumentInfo createFromParcel(Parcel in) { - final DocumentInfo doc = new DocumentInfo(); - DurableUtils.readFromParcel(in, doc); - return doc; - } - - @Override - public DocumentInfo[] newArray(int size) { - return new DocumentInfo[size]; - } - }; - - public static DocumentInfo fromDirectoryCursor(Cursor cursor) { - assert(cursor != null); - final String authority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); - return fromCursor(cursor, authority); - } - - public static DocumentInfo fromCursor(Cursor cursor, String authority) { - assert(cursor != null); - final DocumentInfo info = new DocumentInfo(); - info.updateFromCursor(cursor, authority); - return info; - } - - public void updateFromCursor(Cursor cursor, String authority) { - this.authority = authority; - this.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); - this.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - this.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); - this.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED); - this.flags = getCursorInt(cursor, Document.COLUMN_FLAGS); - this.summary = getCursorString(cursor, Document.COLUMN_SUMMARY); - this.size = getCursorLong(cursor, Document.COLUMN_SIZE); - this.icon = getCursorInt(cursor, Document.COLUMN_ICON); - this.deriveFields(); - } - - public static DocumentInfo fromUri(ContentResolver resolver, Uri uri) - throws FileNotFoundException { - final DocumentInfo info = new DocumentInfo(); - info.updateFromUri(resolver, uri); - return info; - } - - /** - * Update a possibly stale restored document against a live - * {@link DocumentsProvider}. - */ - public void updateSelf(ContentResolver resolver) throws FileNotFoundException { - updateFromUri(resolver, derivedUri); - } - - public void updateFromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException { - ContentProviderClient client = null; - Cursor cursor = null; - try { - client = DocumentsApplication.acquireUnstableProviderOrThrow( - resolver, uri.getAuthority()); - cursor = client.query(uri, null, null, null, null); - if (!cursor.moveToFirst()) { - throw new FileNotFoundException("Missing details for " + uri); - } - updateFromCursor(cursor, uri.getAuthority()); - } catch (Throwable t) { - throw asFileNotFoundException(t); - } finally { - IoUtils.closeQuietly(cursor); - ContentProviderClient.releaseQuietly(client); - } - } - - @VisibleForTesting - void deriveFields() { - derivedUri = DocumentsContract.buildDocumentUri(authority, documentId); - } - - @Override - public String toString() { - return "Document{" - + "docId=" + documentId - + ", name=" + displayName - + ", isContainer=" + isContainer() - + ", isDirectory=" + isDirectory() - + ", isArchive=" + isArchive() - + ", isPartial=" + isPartial() - + ", isVirtualDocument=" + isVirtualDocument() - + ", isDeleteSupported=" + isDeleteSupported() - + ", isCreateSupported=" + isCreateSupported() - + ", isRenameSupported=" + isRenameSupported() - + "}"; - } - - public boolean isCreateSupported() { - return (flags & Document.FLAG_DIR_SUPPORTS_CREATE) != 0; - } - - public boolean isThumbnailSupported() { - return (flags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0; - } - - public boolean isDirectory() { - return Document.MIME_TYPE_DIR.equals(mimeType); - } - - public boolean isGridPreferred() { - return (flags & Document.FLAG_DIR_PREFERS_GRID) != 0; - } - - public boolean isDeleteSupported() { - return (flags & Document.FLAG_SUPPORTS_DELETE) != 0; - } - - public boolean isRemoveSupported() { - return (flags & Document.FLAG_SUPPORTS_REMOVE) != 0; - } - - public boolean isRenameSupported() { - return (flags & Document.FLAG_SUPPORTS_RENAME) != 0; - } - - public boolean isArchive() { - return (flags & Document.FLAG_ARCHIVE) != 0; - } - - public boolean isPartial() { - return (flags & Document.FLAG_PARTIAL) != 0; - } - - public boolean isContainer() { - return isDirectory() || isArchive(); - } - - public boolean isVirtualDocument() { - return (flags & Document.FLAG_VIRTUAL_DOCUMENT) != 0; - } - - @Override - public int hashCode() { - return derivedUri.hashCode() + mimeType.hashCode(); - } - - @Override - public boolean equals(Object o) { - if (o == null) { - return false; - } - - if (this == o) { - return true; - } - - if (o instanceof DocumentInfo) { - DocumentInfo other = (DocumentInfo) o; - // Uri + mime type should be totally unique. - return Objects.equals(derivedUri, other.derivedUri) - && Objects.equals(mimeType, other.mimeType); - } - - return false; - } - - public static String getCursorString(Cursor cursor, String columnName) { - final int index = cursor.getColumnIndex(columnName); - return (index != -1) ? cursor.getString(index) : null; - } - - /** - * Missing or null values are returned as -1. - */ - public static long getCursorLong(Cursor cursor, String columnName) { - final int index = cursor.getColumnIndex(columnName); - if (index == -1) return -1; - final String value = cursor.getString(index); - if (value == null) return -1; - try { - return Long.parseLong(value); - } catch (NumberFormatException e) { - return -1; - } - } - - /** - * Missing or null values are returned as 0. - */ - public static int getCursorInt(Cursor cursor, String columnName) { - final int index = cursor.getColumnIndex(columnName); - return (index != -1) ? cursor.getInt(index) : 0; - } - - public static FileNotFoundException asFileNotFoundException(Throwable t) - throws FileNotFoundException { - if (t instanceof FileNotFoundException) { - throw (FileNotFoundException) t; - } - final FileNotFoundException fnfe = new FileNotFoundException(t.getMessage()); - fnfe.initCause(t); - throw fnfe; - } - - public static Uri getUri(Cursor cursor) { - return DocumentsContract.buildDocumentUri( - getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY), - getCursorString(cursor, Document.COLUMN_DOCUMENT_ID)); - } - - public static void addMimeTypes(ContentResolver resolver, Uri uri, Set<String> mimeTypes) { - assert(uri != null); - if ("content".equals(uri.getScheme())) { - mimeTypes.add(resolver.getType(uri)); - final String[] streamTypes = resolver.getStreamTypes(uri, "*/*"); - if (streamTypes != null) { - mimeTypes.addAll(Arrays.asList(streamTypes)); - } - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java deleted file mode 100644 index ae7e8207b77e..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.model; - -import android.content.ContentResolver; -import android.os.Parcel; -import android.os.Parcelable; -import android.provider.DocumentsProvider; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.net.ProtocolException; -import java.util.Collection; -import java.util.LinkedList; - -/** - * Representation of a stack of {@link DocumentInfo}, usually the result of a - * user-driven traversal. - */ -public class DocumentStack extends LinkedList<DocumentInfo> implements Durable, Parcelable { - private static final int VERSION_INIT = 1; - private static final int VERSION_ADD_ROOT = 2; - - public RootInfo root; - - public DocumentStack() {}; - - /** - * Creates an instance, and pushes all docs to it in the same order as they're passed as - * parameters, i.e. the last document will be at the top of the stack. - */ - public DocumentStack(RootInfo root, DocumentInfo... docs) { - for (DocumentInfo doc : docs) { - push(doc); - } - - this.root = root; - } - - /** - * Makes a new copy, and pushes all docs to the new copy in the same order as they're passed - * as parameters, i.e. the last document will be at the top of the stack. - */ - public DocumentStack(DocumentStack src, DocumentInfo... docs) { - super(src); - for (DocumentInfo doc : docs) { - push(doc); - } - - root = src.root; - } - - public String getTitle() { - if (size() == 1 && root != null) { - return root.title; - } else if (size() > 1) { - return peek().displayName; - } else { - return null; - } - } - - public boolean isRecents() { - return size() == 0; - } - - public void updateRoot(Collection<RootInfo> matchingRoots) throws FileNotFoundException { - for (RootInfo root : matchingRoots) { - if (root.equals(this.root)) { - this.root = root; - return; - } - } - throw new FileNotFoundException("Failed to find matching root for " + root); - } - - /** - * Update a possibly stale restored stack against a live - * {@link DocumentsProvider}. - */ - public void updateDocuments(ContentResolver resolver) throws FileNotFoundException { - for (DocumentInfo info : this) { - info.updateSelf(resolver); - } - } - - /** - * Build key that uniquely identifies this stack. It omits most of the raw - * details included in {@link #write(DataOutputStream)}, since they change - * too regularly to be used as a key. - */ - public String buildKey() { - final StringBuilder builder = new StringBuilder(); - if (root != null) { - builder.append(root.authority).append('#'); - builder.append(root.rootId).append('#'); - } else { - builder.append("[null]").append('#'); - } - for (DocumentInfo doc : this) { - builder.append(doc.documentId).append('#'); - } - return builder.toString(); - } - - @Override - public void reset() { - clear(); - root = null; - } - - @Override - public void read(DataInputStream in) throws IOException { - final int version = in.readInt(); - switch (version) { - case VERSION_INIT: - throw new ProtocolException("Ignored upgrade"); - case VERSION_ADD_ROOT: - if (in.readBoolean()) { - root = new RootInfo(); - root.read(in); - } - final int size = in.readInt(); - for (int i = 0; i < size; i++) { - final DocumentInfo doc = new DocumentInfo(); - doc.read(in); - add(doc); - } - break; - default: - throw new ProtocolException("Unknown version " + version); - } - } - - @Override - public void write(DataOutputStream out) throws IOException { - out.writeInt(VERSION_ADD_ROOT); - if (root != null) { - out.writeBoolean(true); - root.write(out); - } else { - out.writeBoolean(false); - } - final int size = size(); - out.writeInt(size); - for (int i = 0; i < size; i++) { - final DocumentInfo doc = get(i); - doc.write(out); - } - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - DurableUtils.writeToParcel(dest, this); - } - - public static final Creator<DocumentStack> CREATOR = new Creator<DocumentStack>() { - @Override - public DocumentStack createFromParcel(Parcel in) { - final DocumentStack stack = new DocumentStack(); - DurableUtils.readFromParcel(in, stack); - return stack; - } - - @Override - public DocumentStack[] newArray(int size) { - return new DocumentStack[size]; - } - }; -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/Durable.java b/packages/DocumentsUI/src/com/android/documentsui/model/Durable.java deleted file mode 100644 index 01633edca33f..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/model/Durable.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.model; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; - -public interface Durable { - public void reset(); - public void read(DataInputStream in) throws IOException; - public void write(DataOutputStream out) throws IOException; -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DurableUtils.java b/packages/DocumentsUI/src/com/android/documentsui/model/DurableUtils.java deleted file mode 100644 index e21dd4930678..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DurableUtils.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.model; - -import static com.android.documentsui.Shared.TAG; - -import android.os.BadParcelableException; -import android.os.Parcel; -import android.util.Log; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; - -public class DurableUtils { - public static <D extends Durable> byte[] writeToArray(D d) throws IOException { - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - d.write(new DataOutputStream(out)); - return out.toByteArray(); - } - - public static <D extends Durable> D readFromArray(byte[] data, D d) throws IOException { - if (data == null) throw new IOException("Missing data"); - final ByteArrayInputStream in = new ByteArrayInputStream(data); - d.reset(); - try { - d.read(new DataInputStream(in)); - } catch (IOException e) { - d.reset(); - throw e; - } - return d; - } - - public static <D extends Durable> byte[] writeToArrayOrNull(D d) { - try { - return writeToArray(d); - } catch (IOException e) { - Log.w(TAG, "Failed to write", e); - return null; - } - } - - public static <D extends Durable> D readFromArrayOrNull(byte[] data, D d) { - try { - return readFromArray(data, d); - } catch (IOException e) { - Log.w(TAG, "Failed to read", e); - return null; - } - } - - public static <D extends Durable> void writeToParcel(Parcel parcel, D d) { - try { - parcel.writeByteArray(writeToArray(d)); - } catch (IOException e) { - throw new BadParcelableException(e); - } - } - - public static <D extends Durable> D readFromParcel(Parcel parcel, D d) { - try { - return readFromArray(parcel.createByteArray(), d); - } catch (IOException e) { - throw new BadParcelableException(e); - } - } - - public static void writeNullableString(DataOutputStream out, String value) throws IOException { - if (value != null) { - out.write(1); - out.writeUTF(value); - } else { - out.write(0); - } - } - - public static String readNullableString(DataInputStream in) throws IOException { - if (in.read() != 0) { - return in.readUTF(); - } else { - return null; - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java deleted file mode 100644 index e062dfb2f096..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.model; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.Shared.compareToIgnoreCaseNullable; -import static com.android.documentsui.model.DocumentInfo.getCursorInt; -import static com.android.documentsui.model.DocumentInfo.getCursorLong; -import static com.android.documentsui.model.DocumentInfo.getCursorString; - -import android.annotation.IntDef; -import android.annotation.Nullable; -import android.content.Context; -import android.database.Cursor; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.os.Parcel; -import android.os.Parcelable; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Root; -import android.text.TextUtils; -import android.util.Log; - -import com.android.documentsui.IconUtils; -import com.android.documentsui.R; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.net.ProtocolException; -import java.util.Objects; - -/** - * Representation of a {@link Root}. - */ -public class RootInfo implements Durable, Parcelable, Comparable<RootInfo> { - - private static final String TAG = "RootInfo"; - private static final int VERSION_INIT = 1; - private static final int VERSION_DROP_TYPE = 2; - - // The values of these constants determine the sort order of various roots in the RootsFragment. - @IntDef(flag = false, value = { - TYPE_IMAGES, - TYPE_VIDEO, - TYPE_AUDIO, - TYPE_RECENTS, - TYPE_DOWNLOADS, - TYPE_LOCAL, - TYPE_MTP, - TYPE_SD, - TYPE_USB, - TYPE_OTHER - }) - @Retention(RetentionPolicy.SOURCE) - public @interface RootType {} - public static final int TYPE_IMAGES = 1; - public static final int TYPE_VIDEO = 2; - public static final int TYPE_AUDIO = 3; - public static final int TYPE_RECENTS = 4; - public static final int TYPE_DOWNLOADS = 5; - public static final int TYPE_LOCAL = 6; - public static final int TYPE_MTP = 7; - public static final int TYPE_SD = 8; - public static final int TYPE_USB = 9; - public static final int TYPE_OTHER = 10; - - public String authority; - public String rootId; - public int flags; - public int icon; - public String title; - public String summary; - public String documentId; - public long availableBytes; - public String mimeTypes; - - /** Derived fields that aren't persisted */ - public String[] derivedMimeTypes; - public int derivedIcon; - public @RootType int derivedType; - // Currently, we are not persisting this and we should be asking Provider whether a Root - // is in the process of eject. Provider does not have this available yet. - public transient boolean ejecting; - - public RootInfo() { - reset(); - } - - @Override - public void reset() { - authority = null; - rootId = null; - flags = 0; - icon = 0; - title = null; - summary = null; - documentId = null; - availableBytes = -1; - mimeTypes = null; - ejecting = false; - - derivedMimeTypes = null; - derivedIcon = 0; - derivedType = 0; - } - - @Override - public void read(DataInputStream in) throws IOException { - final int version = in.readInt(); - switch (version) { - case VERSION_DROP_TYPE: - authority = DurableUtils.readNullableString(in); - rootId = DurableUtils.readNullableString(in); - flags = in.readInt(); - icon = in.readInt(); - title = DurableUtils.readNullableString(in); - summary = DurableUtils.readNullableString(in); - documentId = DurableUtils.readNullableString(in); - availableBytes = in.readLong(); - mimeTypes = DurableUtils.readNullableString(in); - deriveFields(); - break; - default: - throw new ProtocolException("Unknown version " + version); - } - } - - @Override - public void write(DataOutputStream out) throws IOException { - out.writeInt(VERSION_DROP_TYPE); - DurableUtils.writeNullableString(out, authority); - DurableUtils.writeNullableString(out, rootId); - out.writeInt(flags); - out.writeInt(icon); - DurableUtils.writeNullableString(out, title); - DurableUtils.writeNullableString(out, summary); - DurableUtils.writeNullableString(out, documentId); - out.writeLong(availableBytes); - DurableUtils.writeNullableString(out, mimeTypes); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - DurableUtils.writeToParcel(dest, this); - } - - public static final Creator<RootInfo> CREATOR = new Creator<RootInfo>() { - @Override - public RootInfo createFromParcel(Parcel in) { - final RootInfo root = new RootInfo(); - DurableUtils.readFromParcel(in, root); - return root; - } - - @Override - public RootInfo[] newArray(int size) { - return new RootInfo[size]; - } - }; - - public static RootInfo fromRootsCursor(String authority, Cursor cursor) { - final RootInfo root = new RootInfo(); - root.authority = authority; - root.rootId = getCursorString(cursor, Root.COLUMN_ROOT_ID); - root.flags = getCursorInt(cursor, Root.COLUMN_FLAGS); - root.icon = getCursorInt(cursor, Root.COLUMN_ICON); - root.title = getCursorString(cursor, Root.COLUMN_TITLE); - root.summary = getCursorString(cursor, Root.COLUMN_SUMMARY); - root.documentId = getCursorString(cursor, Root.COLUMN_DOCUMENT_ID); - root.availableBytes = getCursorLong(cursor, Root.COLUMN_AVAILABLE_BYTES); - root.mimeTypes = getCursorString(cursor, Root.COLUMN_MIME_TYPES); - root.deriveFields(); - return root; - } - - private void deriveFields() { - derivedMimeTypes = (mimeTypes != null) ? mimeTypes.split("\n") : null; - - if (isHome()) { - derivedType = TYPE_LOCAL; - derivedIcon = R.drawable.ic_root_documents; - } else if (isMtp()) { - derivedType = TYPE_MTP; - derivedIcon = R.drawable.ic_usb_storage; - } else if (isUsb()) { - derivedType = TYPE_USB; - derivedIcon = R.drawable.ic_usb_storage; - } else if (isSd()) { - derivedType = TYPE_SD; - derivedIcon = R.drawable.ic_sd_storage; - } else if (isExternalStorage()) { - derivedType = TYPE_LOCAL; - derivedIcon = R.drawable.ic_root_smartphone; - } else if (isDownloads()) { - derivedType = TYPE_DOWNLOADS; - derivedIcon = R.drawable.ic_root_download; - } else if (isImages()) { - derivedType = TYPE_IMAGES; - derivedIcon = com.android.internal.R.drawable.ic_doc_image; - } else if (isVideos()) { - derivedType = TYPE_VIDEO; - derivedIcon = com.android.internal.R.drawable.ic_doc_video; - } else if (isAudio()) { - derivedType = TYPE_AUDIO; - derivedIcon = com.android.internal.R.drawable.ic_doc_audio; - } else if (isRecents()) { - derivedType = TYPE_RECENTS; - } else { - derivedType = TYPE_OTHER; - } - - if (DEBUG) Log.d(TAG, "Finished deriving fields: " + this); - } - - public Uri getUri() { - return DocumentsContract.buildRootUri(authority, rootId); - } - - public boolean isRecents() { - return authority == null && rootId == null; - } - - public boolean isHome() { - // Note that "home" is the expected root id for the auto-created - // user home directory on external storage. The "home" value should - // match ExternalStorageProvider.ROOT_ID_HOME. - return isExternalStorage() && "home".equals(rootId); - } - - public boolean isExternalStorage() { - return "com.android.externalstorage.documents".equals(authority); - } - - public boolean isDownloads() { - return "com.android.providers.downloads.documents".equals(authority); - } - - public boolean isImages() { - return "com.android.providers.media.documents".equals(authority) - && "images_root".equals(rootId); - } - - public boolean isVideos() { - return "com.android.providers.media.documents".equals(authority) - && "videos_root".equals(rootId); - } - - public boolean isAudio() { - return "com.android.providers.media.documents".equals(authority) - && "audio_root".equals(rootId); - } - - public boolean isMtp() { - return "com.android.mtp.documents".equals(authority); - } - - public boolean isLibrary() { - return derivedType == TYPE_IMAGES - || derivedType == TYPE_VIDEO - || derivedType == TYPE_AUDIO - || derivedType == TYPE_RECENTS; - } - - public boolean hasSettings() { - return (flags & Root.FLAG_HAS_SETTINGS) != 0; - } - - public boolean supportsChildren() { - return (flags & Root.FLAG_SUPPORTS_IS_CHILD) != 0; - } - - public boolean supportsCreate() { - return (flags & Root.FLAG_SUPPORTS_CREATE) != 0; - } - - public boolean supportsRecents() { - return (flags & Root.FLAG_SUPPORTS_RECENTS) != 0; - } - - public boolean supportsSearch() { - return (flags & Root.FLAG_SUPPORTS_SEARCH) != 0; - } - - public boolean supportsEject() { - return (flags & Root.FLAG_SUPPORTS_EJECT) != 0; - } - - public boolean isAdvanced() { - return (flags & Root.FLAG_ADVANCED) != 0; - } - - public boolean isLocalOnly() { - return (flags & Root.FLAG_LOCAL_ONLY) != 0; - } - - public boolean isEmpty() { - return (flags & Root.FLAG_EMPTY) != 0; - } - - public boolean isSd() { - return (flags & Root.FLAG_REMOVABLE_SD) != 0; - } - - public boolean isUsb() { - return (flags & Root.FLAG_REMOVABLE_USB) != 0; - } - - public Drawable loadIcon(Context context) { - if (derivedIcon != 0) { - return context.getDrawable(derivedIcon); - } else { - return IconUtils.loadPackageIcon(context, authority, icon); - } - } - - public Drawable loadDrawerIcon(Context context) { - if (derivedIcon != 0) { - return IconUtils.applyTintColor(context, derivedIcon, R.color.item_root_icon); - } else { - return IconUtils.loadPackageIcon(context, authority, icon); - } - } - - public Drawable loadEjectIcon(Context context) { - return IconUtils.applyTintColor(context, R.drawable.ic_eject, R.color.item_eject_icon); - } - - /** - * Gets the {@link DocumentInfo} of the root folder of this root. - */ - public @Nullable DocumentInfo getRootDocumentBlocking(Context context) { - try { - final Uri uri = DocumentsContract.buildDocumentUri(authority, documentId); - return DocumentInfo.fromUri(context.getContentResolver(), uri); - } catch (FileNotFoundException e) { - Log.w(TAG, "Failed to find root", e); - return null; - } - } - - @Override - public boolean equals(Object o) { - if (o == null) { - return false; - } - - if (this == o) { - return true; - } - - if (o instanceof RootInfo) { - RootInfo other = (RootInfo) o; - return Objects.equals(authority, other.authority) - && Objects.equals(rootId, other.rootId); - } - - return false; - } - - @Override - public int hashCode() { - return Objects.hash(authority, rootId); - } - - @Override - public int compareTo(RootInfo other) { - // Sort by root type, then title, then summary. - int score = derivedType - other.derivedType; - if (score != 0) { - return score; - } - - score = compareToIgnoreCaseNullable(title, other.title); - if (score != 0) { - return score; - } - - return compareToIgnoreCaseNullable(summary, other.summary); - } - - @Override - public String toString() { - return "Root{" - + "authority=" + authority - + ", rootId=" + rootId - + ", title=" + title - + ", isUsb=" + isUsb() - + ", isSd=" + isSd() - + ", isMtp=" + isMtp() - + "}"; - } - - public String getDirectoryString() { - return !TextUtils.isEmpty(summary) ? summary : title; - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/CopyJob.java b/packages/DocumentsUI/src/com/android/documentsui/services/CopyJob.java deleted file mode 100644 index 8eabbe41f666..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/services/CopyJob.java +++ /dev/null @@ -1,727 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static android.os.SystemClock.elapsedRealtime; -import static android.provider.DocumentsContract.buildChildDocumentsUri; -import static android.provider.DocumentsContract.buildDocumentUri; -import static android.provider.DocumentsContract.getDocumentId; -import static android.provider.DocumentsContract.isChildDocument; - -import static com.android.documentsui.OperationDialogFragment.DIALOG_TYPE_CONVERTED; -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.model.DocumentInfo.getCursorLong; -import static com.android.documentsui.model.DocumentInfo.getCursorString; -import static com.android.documentsui.services.FileOperationService.EXTRA_DIALOG_TYPE; -import static com.android.documentsui.services.FileOperationService.EXTRA_OPERATION_TYPE; -import static com.android.documentsui.services.FileOperationService.EXTRA_SRC_LIST; -import static com.android.documentsui.services.FileOperationService.OPERATION_COPY; - -import android.annotation.StringRes; -import android.app.Notification; -import android.app.Notification.Builder; -import android.app.PendingIntent; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.res.AssetFileDescriptor; -import android.database.Cursor; -import android.net.Uri; -import android.os.CancellationSignal; -import android.os.ParcelFileDescriptor; -import android.os.RemoteException; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.text.format.DateUtils; -import android.util.Log; -import android.webkit.MimeTypeMap; - -import com.android.documentsui.DocumentsApplication; -import com.android.documentsui.Metrics; -import com.android.documentsui.R; -import com.android.documentsui.RootsCache; -import com.android.documentsui.clipping.UrisSupplier; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperationService.OpType; - -import libcore.io.IoUtils; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.List; - -class CopyJob extends Job { - - private static final String TAG = "CopyJob"; - - final List<DocumentInfo> mSrcs; - final ArrayList<DocumentInfo> convertedFiles = new ArrayList<>(); - - private long mStartTime = -1; - - private long mBatchSize; - private volatile long mBytesCopied; - // Speed estimation - private long mBytesCopiedSample; - private long mSampleTime; - private long mSpeed; - private long mRemainingTime; - - /** - * @see @link {@link Job} constructor for most param descriptions. - */ - CopyJob(Context service, Listener listener, String id, DocumentStack destination, - UrisSupplier srcs) { - this(service, listener, id, OPERATION_COPY, destination, srcs); - } - - CopyJob(Context service, Listener listener, String id, @OpType int opType, - DocumentStack destination, UrisSupplier srcs) { - super(service, listener, id, opType, destination, srcs); - - assert(srcs.getItemCount() > 0); - - // delay the initialization of it to setUp() because it may be IO extensive. - mSrcs = new ArrayList<>(srcs.getItemCount()); - } - - @Override - Builder createProgressBuilder() { - return super.createProgressBuilder( - service.getString(R.string.copy_notification_title), - R.drawable.ic_menu_copy, - service.getString(android.R.string.cancel), - R.drawable.ic_cab_cancel); - } - - @Override - public Notification getSetupNotification() { - return getSetupNotification(service.getString(R.string.copy_preparing)); - } - - Notification getProgressNotification(@StringRes int msgId) { - updateRemainingTimeEstimate(); - - if (mBatchSize >= 0) { - double completed = (double) this.mBytesCopied / mBatchSize; - mProgressBuilder.setProgress(100, (int) (completed * 100), false); - mProgressBuilder.setSubText( - NumberFormat.getPercentInstance().format(completed)); - } else { - // If the total file size failed to compute on some files, then show - // an indeterminate spinner. CopyJob would most likely fail on those - // files while copying, but would continue with another files. - // Also, if the total size is 0 bytes, show an indeterminate spinner. - mProgressBuilder.setProgress(0, 0, true); - } - - if (mRemainingTime > 0) { - mProgressBuilder.setContentText(service.getString(msgId, - DateUtils.formatDuration(mRemainingTime))); - } else { - mProgressBuilder.setContentText(null); - } - - return mProgressBuilder.build(); - } - - @Override - public Notification getProgressNotification() { - return getProgressNotification(R.string.copy_remaining); - } - - void onBytesCopied(long numBytes) { - this.mBytesCopied += numBytes; - } - - /** - * Generates an estimate of the remaining time in the copy. - */ - private void updateRemainingTimeEstimate() { - long elapsedTime = elapsedRealtime() - mStartTime; - - // mBytesCopied is modified in worker thread, but this method is called in monitor thread, - // so take a snapshot of mBytesCopied to make sure the updated estimate is consistent. - final long bytesCopied = mBytesCopied; - final long sampleDuration = Math.max(elapsedTime - mSampleTime, 1L); // avoid dividing 0 - final long sampleSpeed = ((bytesCopied - mBytesCopiedSample) * 1000) / sampleDuration; - if (mSpeed == 0) { - mSpeed = sampleSpeed; - } else { - mSpeed = ((3 * mSpeed) + sampleSpeed) / 4; - } - - if (mSampleTime > 0 && mSpeed > 0) { - mRemainingTime = ((mBatchSize - bytesCopied) * 1000) / mSpeed; - } else { - mRemainingTime = 0; - } - - mSampleTime = elapsedTime; - mBytesCopiedSample = bytesCopied; - } - - @Override - Notification getFailureNotification() { - return getFailureNotification( - R.plurals.copy_error_notification_title, R.drawable.ic_menu_copy); - } - - @Override - Notification getWarningNotification() { - final Intent navigateIntent = buildNavigateIntent(INTENT_TAG_WARNING); - navigateIntent.putExtra(EXTRA_DIALOG_TYPE, DIALOG_TYPE_CONVERTED); - navigateIntent.putExtra(EXTRA_OPERATION_TYPE, operationType); - - navigateIntent.putParcelableArrayListExtra(EXTRA_SRC_LIST, convertedFiles); - - // TODO: Consider adding a dialog on tapping the notification with a list of - // converted files. - final Notification.Builder warningBuilder = new Notification.Builder(service) - .setContentTitle(service.getResources().getString( - R.string.notification_copy_files_converted_title)) - .setContentText(service.getString( - R.string.notification_touch_for_details)) - .setContentIntent(PendingIntent.getActivity(appContext, 0, navigateIntent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT)) - .setCategory(Notification.CATEGORY_ERROR) - .setSmallIcon(R.drawable.ic_menu_copy) - .setAutoCancel(true); - return warningBuilder.build(); - } - - @Override - boolean setUp() { - try { - buildDocumentList(); - } catch (ResourceException e) { - Log.e(TAG, "Failed to get the list of docs.", e); - return false; - } - - // Check if user has canceled this task. - if (isCanceled()) { - return false; - } - - try { - mBatchSize = calculateSize(mSrcs); - } catch (ResourceException e) { - Log.w(TAG, "Failed to calculate total size. Copying without progress.", e); - mBatchSize = -1; - } - - // Check if user has canceled this task. We should check it again here as user cancels - // tasks in main thread, but this is running in a worker thread. calculateSize() may - // take a long time during which user can cancel this task, and we don't want to waste - // resources doing useless large chunk of work. - if (isCanceled()) { - return false; - } - - return checkSpace(); - } - - @Override - void start() { - mStartTime = elapsedRealtime(); - DocumentInfo srcInfo; - DocumentInfo dstInfo = stack.peek(); - for (int i = 0; i < mSrcs.size() && !isCanceled(); ++i) { - srcInfo = mSrcs.get(i); - - if (DEBUG) Log.d(TAG, - "Copying " + srcInfo.displayName + " (" + srcInfo.derivedUri + ")" - + " to " + dstInfo.displayName + " (" + dstInfo.derivedUri + ")"); - - try { - if (dstInfo.equals(srcInfo) || isDescendentOf(srcInfo, dstInfo)) { - Log.e(TAG, "Skipping recursive copy of " + srcInfo.derivedUri); - onFileFailed(srcInfo); - } else { - processDocument(srcInfo, null, dstInfo); - } - } catch (ResourceException e) { - Log.e(TAG, "Failed to copy " + srcInfo.derivedUri, e); - onFileFailed(srcInfo); - } - } - Metrics.logFileOperation(service, operationType, mSrcs, dstInfo); - } - - private void buildDocumentList() throws ResourceException { - try { - final ContentResolver resolver = appContext.getContentResolver(); - final Iterable<Uri> uris = srcs.getUris(appContext); - - int docProcessed = 0; - for (Uri uri : uris) { - DocumentInfo doc = DocumentInfo.fromUri(resolver, uri); - if (canCopy(doc, stack.root)) { - mSrcs.add(doc); - } else { - onFileFailed(doc); - } - ++docProcessed; - - if (isCanceled()) { - return; - } - } - - // If docProcessed is different than the count claimed by UrisSupplier, add the number - // to failedFileCount. - failedFileCount += (srcs.getItemCount() - docProcessed); - } catch(IOException e) { - failedFileCount += srcs.getItemCount(); - throw new ResourceException("Failed to open the list of docs to copy.", e); - } - } - - private static boolean canCopy(DocumentInfo doc, RootInfo root) { - // Can't copy folders to downloads, because we don't show folders there. - return !root.isDownloads() || !doc.isDirectory(); - } - - /** - * Checks whether the destination folder has enough space to take all source files. - * @return true if the root has enough space or doesn't provide free space info; otherwise false - */ - boolean checkSpace() { - return checkSpace(mBatchSize); - } - - /** - * Checks whether the destination folder has enough space to take files of batchSize - * @param batchSize the total size of files - * @return true if the root has enough space or doesn't provide free space info; otherwise false - */ - final boolean checkSpace(long batchSize) { - // Default to be true because if batchSize or available space is invalid, we still let the - // copy start anyway. - boolean result = true; - if (batchSize >= 0) { - RootsCache cache = DocumentsApplication.getRootsCache(appContext); - - // Query root info here instead of using stack.root because the number there may be - // stale. - RootInfo root = cache.getRootOneshot(stack.root.authority, stack.root.rootId, true); - if (root.availableBytes >= 0) { - result = (batchSize <= root.availableBytes); - } else { - Log.w(TAG, root.toString() + " doesn't provide available bytes."); - } - } - - if (!result) { - failedFileCount += mSrcs.size(); - failedFiles.addAll(mSrcs); - } - - return result; - } - - @Override - boolean hasWarnings() { - return !convertedFiles.isEmpty(); - } - - /** - * Logs progress on the current copy operation. Displays/Updates the progress notification. - * - * @param bytesCopied - */ - private void makeCopyProgress(long bytesCopied) { - onBytesCopied(bytesCopied); - } - - /** - * Copies a the given document to the given location. - * - * @param src DocumentInfos for the documents to copy. - * @param srcParent DocumentInfo for the parent of the document to process. - * @param dstDirInfo The destination directory. - * @throws ResourceException - * - * TODO: Stop passing srcParent, as it's not used for copy, but for move only. - */ - void processDocument(DocumentInfo src, DocumentInfo srcParent, - DocumentInfo dstDirInfo) throws ResourceException { - - // TODO: When optimized copy kicks in, we'll not making any progress updates. - // For now. Local storage isn't using optimized copy. - - // When copying within the same provider, try to use optimized copying. - // If not supported, then fallback to byte-by-byte copy/move. - if (src.authority.equals(dstDirInfo.authority)) { - if ((src.flags & Document.FLAG_SUPPORTS_COPY) != 0) { - try { - if (DocumentsContract.copyDocument(getClient(src), src.derivedUri, - dstDirInfo.derivedUri) != null) { - return; - } - } catch (RemoteException | RuntimeException e) { - Log.e(TAG, "Provider side copy failed for: " + src.derivedUri - + " due to an exception.", e); - } - - // If optimized copy fails, then fallback to byte-by-byte copy. - if (DEBUG) Log.d(TAG, "Fallback to byte-by-byte copy for: " + src.derivedUri); - } - } - - // If we couldn't do an optimized copy...we fall back to vanilla byte copy. - byteCopyDocument(src, dstDirInfo); - } - - void byteCopyDocument(DocumentInfo src, DocumentInfo dest) throws ResourceException { - final String dstMimeType; - final String dstDisplayName; - - if (DEBUG) Log.d(TAG, "Doing byte copy of document: " + src); - // If the file is virtual, but can be converted to another format, then try to copy it - // as such format. Also, append an extension for the target mime type (if known). - if (src.isVirtualDocument()) { - String[] streamTypes = null; - try { - streamTypes = getContentResolver().getStreamTypes(src.derivedUri, "*/*"); - } catch (RuntimeException e) { - throw new ResourceException( - "Failed to obtain streamable types for %s due to an exception.", - src.derivedUri, e); - } - if (streamTypes != null && streamTypes.length > 0) { - dstMimeType = streamTypes[0]; - final String extension = MimeTypeMap.getSingleton(). - getExtensionFromMimeType(dstMimeType); - dstDisplayName = src.displayName + - (extension != null ? "." + extension : src.displayName); - } else { - throw new ResourceException("Cannot copy virtual file %s. No streamable formats " - + "available.", src.derivedUri); - } - } else { - dstMimeType = src.mimeType; - dstDisplayName = src.displayName; - } - - // Create the target document (either a file or a directory), then copy recursively the - // contents (bytes or children). - Uri dstUri = null; - try { - dstUri = DocumentsContract.createDocument( - getClient(dest), dest.derivedUri, dstMimeType, dstDisplayName); - } catch (RemoteException | RuntimeException e) { - throw new ResourceException( - "Couldn't create destination document " + dstDisplayName + " in directory %s " - + "due to an exception.", dest.derivedUri, e); - } - if (dstUri == null) { - // If this is a directory, the entire subdir will not be copied over. - throw new ResourceException( - "Couldn't create destination document " + dstDisplayName + " in directory %s.", - dest.derivedUri); - } - - DocumentInfo dstInfo = null; - try { - dstInfo = DocumentInfo.fromUri(getContentResolver(), dstUri); - } catch (FileNotFoundException | RuntimeException e) { - throw new ResourceException("Could not load DocumentInfo for newly created file %s.", - dstUri); - } - - if (Document.MIME_TYPE_DIR.equals(src.mimeType)) { - copyDirectoryHelper(src, dstInfo); - } else { - copyFileHelper(src, dstInfo, dest, dstMimeType); - } - } - - /** - * Handles recursion into a directory and copying its contents. Note that in linux terms, this - * does the equivalent of "cp src/* dst", not "cp -r src dst". - * - * @param srcDir Info of the directory to copy from. The routine will copy the directory's - * contents, not the directory itself. - * @param destDir Info of the directory to copy to. Must be created beforehand. - * @throws ResourceException - */ - private void copyDirectoryHelper(DocumentInfo srcDir, DocumentInfo destDir) - throws ResourceException { - // Recurse into directories. Copy children into the new subdirectory. - final String queryColumns[] = new String[] { - Document.COLUMN_DISPLAY_NAME, - Document.COLUMN_DOCUMENT_ID, - Document.COLUMN_MIME_TYPE, - Document.COLUMN_SIZE, - Document.COLUMN_FLAGS - }; - Cursor cursor = null; - boolean success = true; - // Iterate over srcs in the directory; copy to the destination directory. - final Uri queryUri = buildChildDocumentsUri(srcDir.authority, srcDir.documentId); - try { - try { - cursor = getClient(srcDir).query(queryUri, queryColumns, null, null, null); - } catch (RemoteException | RuntimeException e) { - throw new ResourceException("Failed to query children of %s due to an exception.", - srcDir.derivedUri, e); - } - - DocumentInfo src; - while (cursor.moveToNext() && !isCanceled()) { - try { - src = DocumentInfo.fromCursor(cursor, srcDir.authority); - processDocument(src, srcDir, destDir); - } catch (RuntimeException e) { - Log.e(TAG, String.format( - "Failed to recursively process a file %s due to an exception.", - srcDir.derivedUri.toString()), e); - success = false; - } - } - } catch (RuntimeException e) { - Log.e(TAG, String.format( - "Failed to copy a file %s to %s. ", - srcDir.derivedUri.toString(), destDir.derivedUri.toString()), e); - success = false; - } finally { - IoUtils.closeQuietly(cursor); - } - - if (!success) { - throw new RuntimeException("Some files failed to copy during a recursive " - + "directory copy."); - } - } - - /** - * Handles copying a single file. - * - * @param src Info of the file to copy from. - * @param dest Info of the *file* to copy to. Must be created beforehand. - * @param destParent Info of the parent of the destination. - * @param mimeType Mime type for the target. Can be different than source for virtual files. - * @throws ResourceException - */ - private void copyFileHelper(DocumentInfo src, DocumentInfo dest, DocumentInfo destParent, - String mimeType) throws ResourceException { - CancellationSignal canceller = new CancellationSignal(); - AssetFileDescriptor srcFileAsAsset = null; - ParcelFileDescriptor srcFile = null; - ParcelFileDescriptor dstFile = null; - InputStream in = null; - ParcelFileDescriptor.AutoCloseOutputStream out = null; - boolean success = false; - - try { - // If the file is virtual, but can be converted to another format, then try to copy it - // as such format. - if (src.isVirtualDocument()) { - try { - srcFileAsAsset = getClient(src).openTypedAssetFileDescriptor( - src.derivedUri, mimeType, null, canceller); - } catch (FileNotFoundException | RemoteException | RuntimeException e) { - throw new ResourceException("Failed to open a file as asset for %s due to an " - + "exception.", src.derivedUri, e); - } - srcFile = srcFileAsAsset.getParcelFileDescriptor(); - try { - in = new AssetFileDescriptor.AutoCloseInputStream(srcFileAsAsset); - } catch (IOException e) { - throw new ResourceException("Failed to open a file input stream for %s due " - + "an exception.", src.derivedUri, e); - } - } else { - try { - srcFile = getClient(src).openFile(src.derivedUri, "r", canceller); - } catch (FileNotFoundException | RemoteException | RuntimeException e) { - throw new ResourceException( - "Failed to open a file for %s due to an exception.", src.derivedUri, e); - } - in = new ParcelFileDescriptor.AutoCloseInputStream(srcFile); - } - - try { - dstFile = getClient(dest).openFile(dest.derivedUri, "w", canceller); - } catch (FileNotFoundException | RemoteException | RuntimeException e) { - throw new ResourceException("Failed to open the destination file %s for writing " - + "due to an exception.", dest.derivedUri, e); - } - out = new ParcelFileDescriptor.AutoCloseOutputStream(dstFile); - - byte[] buffer = new byte[32 * 1024]; - int len; - try { - while ((len = in.read(buffer)) != -1) { - if (isCanceled()) { - if (DEBUG) Log.d(TAG, "Canceled copy mid-copy of: " + src.derivedUri); - return; - } - out.write(buffer, 0, len); - makeCopyProgress(len); - } - - // Need to invoke IoUtils.close explicitly to avoid from ignoring errors at flush. - IoUtils.close(dstFile.getFileDescriptor()); - srcFile.checkError(); - } catch (IOException e) { - throw new ResourceException( - "Failed to copy bytes from %s to %s due to an IO exception.", - src.derivedUri, dest.derivedUri, e); - } - - if (src.isVirtualDocument()) { - convertedFiles.add(src); - } - - success = true; - } finally { - if (!success) { - if (dstFile != null) { - try { - dstFile.closeWithError("Error copying bytes."); - } catch (IOException closeError) { - Log.w(TAG, "Error closing destination.", closeError); - } - } - - if (DEBUG) Log.d(TAG, "Cleaning up failed operation leftovers."); - canceller.cancel(); - try { - deleteDocument(dest, destParent); - } catch (ResourceException e) { - Log.w(TAG, "Failed to cleanup after copy error: " + src.derivedUri, e); - } - } - - // This also ensures the file descriptors are closed. - IoUtils.closeQuietly(in); - IoUtils.closeQuietly(out); - } - } - - /** - * Calculates the cumulative size of all the documents in the list. Directories are recursed - * into and totaled up. - * - * @param srcs - * @return Size in bytes. - * @throws ResourceException - */ - private long calculateSize(List<DocumentInfo> srcs) throws ResourceException { - long result = 0; - - for (DocumentInfo src : srcs) { - if (src.isDirectory()) { - // Directories need to be recursed into. - try { - result += calculateFileSizesRecursively(getClient(src), src.derivedUri); - } catch (RemoteException e) { - throw new ResourceException("Failed to obtain the client for %s.", - src.derivedUri, e); - } - } else { - result += src.size; - } - - if (isCanceled()) { - return result; - } - } - return result; - } - - /** - * Calculates (recursively) the cumulative size of all the files under the given directory. - * - * @throws ResourceException - */ - long calculateFileSizesRecursively( - ContentProviderClient client, Uri uri) throws ResourceException { - final String authority = uri.getAuthority(); - final Uri queryUri = buildChildDocumentsUri(authority, getDocumentId(uri)); - final String queryColumns[] = new String[] { - Document.COLUMN_DOCUMENT_ID, - Document.COLUMN_MIME_TYPE, - Document.COLUMN_SIZE - }; - - long result = 0; - Cursor cursor = null; - try { - cursor = client.query(queryUri, queryColumns, null, null, null); - while (cursor.moveToNext() && !isCanceled()) { - if (Document.MIME_TYPE_DIR.equals( - getCursorString(cursor, Document.COLUMN_MIME_TYPE))) { - // Recurse into directories. - final Uri dirUri = buildDocumentUri(authority, - getCursorString(cursor, Document.COLUMN_DOCUMENT_ID)); - result += calculateFileSizesRecursively(client, dirUri); - } else { - // This may return -1 if the size isn't defined. Ignore those cases. - long size = getCursorLong(cursor, Document.COLUMN_SIZE); - result += size > 0 ? size : 0; - } - } - } catch (RemoteException | RuntimeException e) { - throw new ResourceException( - "Failed to calculate size for %s due to an exception.", uri, e); - } finally { - IoUtils.closeQuietly(cursor); - } - - return result; - } - - /** - * Returns true if {@code doc} is a descendant of {@code parentDoc}. - * @throws ResourceException - */ - boolean isDescendentOf(DocumentInfo doc, DocumentInfo parent) - throws ResourceException { - if (parent.isDirectory() && doc.authority.equals(parent.authority)) { - try { - return isChildDocument(getClient(doc), doc.derivedUri, parent.derivedUri); - } catch (RemoteException | RuntimeException e) { - throw new ResourceException( - "Failed to check if %s is a child of %s due to an exception.", - doc.derivedUri, parent.derivedUri, e); - } - } - return false; - } - - @Override - public String toString() { - return new StringBuilder() - .append("CopyJob") - .append("{") - .append("id=" + id) - .append(", docs=" + srcs) - .append(", destination=" + stack) - .append("}") - .toString(); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/DeleteJob.java b/packages/DocumentsUI/src/com/android/documentsui/services/DeleteJob.java deleted file mode 100644 index 5a36818369db..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/services/DeleteJob.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.services.FileOperationService.OPERATION_DELETE; - -import android.app.Notification; -import android.app.Notification.Builder; -import android.content.ContentResolver; -import android.content.Context; -import android.net.Uri; -import android.util.Log; - -import com.android.documentsui.clipping.UrisSupplier; -import com.android.documentsui.Metrics; -import com.android.documentsui.R; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -final class DeleteJob extends Job { - - private static final String TAG = "DeleteJob"; - - private volatile int mDocsProcessed = 0; - - Uri mSrcParent; - /** - * Moves files to a destination identified by {@code destination}. - * Performs most work by delegating to CopyJob, then deleting - * a file after it has been copied. - * - * @see @link {@link Job} constructor for most param descriptions. - */ - DeleteJob(Context service, Listener listener, String id, Uri srcParent, DocumentStack stack, - UrisSupplier srcs) { - super(service, listener, id, OPERATION_DELETE, stack, srcs); - mSrcParent = srcParent; - } - - @Override - Builder createProgressBuilder() { - return super.createProgressBuilder( - service.getString(R.string.delete_notification_title), - R.drawable.ic_menu_delete, - service.getString(android.R.string.cancel), - R.drawable.ic_cab_cancel); - } - - @Override - public Notification getSetupNotification() { - return getSetupNotification(service.getString(R.string.delete_preparing)); - } - - @Override - public Notification getProgressNotification() { - mProgressBuilder.setProgress(srcs.getItemCount(), mDocsProcessed, false); - String format = service.getString(R.string.delete_progress); - mProgressBuilder.setSubText(String.format(format, mDocsProcessed, srcs.getItemCount())); - - mProgressBuilder.setContentText(null); - - return mProgressBuilder.build(); - } - - @Override - Notification getFailureNotification() { - return getFailureNotification( - R.plurals.delete_error_notification_title, R.drawable.ic_menu_delete); - } - - @Override - Notification getWarningNotification() { - throw new UnsupportedOperationException(); - } - - @Override - void start() { - try { - final List<DocumentInfo> srcs = new ArrayList<>(this.srcs.getItemCount()); - - final Iterable<Uri> uris = this.srcs.getUris(appContext); - - final ContentResolver resolver = appContext.getContentResolver(); - final DocumentInfo srcParent = DocumentInfo.fromUri(resolver, mSrcParent); - for (Uri uri : uris) { - DocumentInfo doc = DocumentInfo.fromUri(resolver, uri); - srcs.add(doc); - - if (DEBUG) Log.d(TAG, "Deleting document @ " + doc.derivedUri); - try { - deleteDocument(doc, srcParent); - - if (isCanceled()) { - // Canceled, dump the rest of the work. Deleted docs are not recoverable. - return; - } - } catch (ResourceException e) { - Log.e(TAG, "Failed to delete document @ " + doc.derivedUri, e); - onFileFailed(doc); - } - - ++mDocsProcessed; - } - - // If mDocProcessed is different than the count claimed by UrisSupplier, add the number - // to failedFileCount. - failedFileCount += (this.srcs.getItemCount() - mDocsProcessed); - Metrics.logFileOperation(service, operationType, srcs, null); - } catch(IOException e) { - Log.e(TAG, "Failed to get list of docs or parent source.", e); - failedFileCount += srcs.getItemCount(); - } - } - - @Override - public String toString() { - return new StringBuilder() - .append("DeleteJob") - .append("{") - .append("id=" + id) - .append(", docs=" + srcs) - .append(", srcParent=" + mSrcParent) - .append(", location=" + stack) - .append("}") - .toString(); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/FileOperation.java b/packages/DocumentsUI/src/com/android/documentsui/services/FileOperation.java deleted file mode 100644 index 43c3bd7e6788..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/services/FileOperation.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.services.FileOperationService.OPERATION_COPY; -import static com.android.documentsui.services.FileOperationService.OPERATION_DELETE; -import static com.android.documentsui.services.FileOperationService.OPERATION_MOVE; -import static com.android.documentsui.services.FileOperationService.OPERATION_UNKNOWN; - -import android.content.Context; -import android.net.Uri; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.annotation.VisibleForTesting; - -import com.android.documentsui.clipping.UrisSupplier; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.services.FileOperationService.OpType; - -/** - * FileOperation describes a file operation, such as move/copy/delete etc. - */ -public abstract class FileOperation implements Parcelable { - private final @OpType int mOpType; - - private final UrisSupplier mSrcs; - private DocumentStack mDestination; - - @VisibleForTesting - FileOperation(@OpType int opType, UrisSupplier srcs, DocumentStack destination) { - assert(opType != OPERATION_UNKNOWN); - assert(srcs.getItemCount() > 0); - - mOpType = opType; - mSrcs = srcs; - mDestination = destination; - } - - @Override - public int describeContents() { - return 0; - } - - public @OpType int getOpType() { - return mOpType; - } - - public UrisSupplier getSrc() { - return mSrcs; - } - - public DocumentStack getDestination() { - return mDestination; - } - - public void setDestination(DocumentStack destination) { - mDestination = destination; - } - - public void dispose() { - mSrcs.dispose(); - } - - abstract Job createJob(Context service, Job.Listener listener, String id); - - private void appendInfoTo(StringBuilder builder) { - builder.append("opType=").append(mOpType); - builder.append(", srcs=").append(mSrcs.toString()); - builder.append(", destination=").append(mDestination.toString()); - } - - @Override - public void writeToParcel(Parcel out, int flag) { - out.writeInt(mOpType); - out.writeParcelable(mSrcs, flag); - out.writeParcelable(mDestination, flag); - } - - private FileOperation(Parcel in) { - mOpType = in.readInt(); - mSrcs = in.readParcelable(FileOperation.class.getClassLoader()); - mDestination = in.readParcelable(FileOperation.class.getClassLoader()); - } - - public static class CopyOperation extends FileOperation { - private CopyOperation(UrisSupplier srcs, DocumentStack destination) { - super(OPERATION_COPY, srcs, destination); - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - - builder.append("CopyOperation{"); - super.appendInfoTo(builder); - builder.append("}"); - - return builder.toString(); - } - - CopyJob createJob(Context service, Job.Listener listener, String id) { - return new CopyJob(service, listener, id, getDestination(), getSrc()); - } - - private CopyOperation(Parcel in) { - super(in); - } - - public static final Parcelable.Creator<CopyOperation> CREATOR = - new Parcelable.Creator<CopyOperation>() { - - @Override - public CopyOperation createFromParcel(Parcel source) { - return new CopyOperation(source); - } - - @Override - public CopyOperation[] newArray(int size) { - return new CopyOperation[size]; - } - }; - } - - public static class MoveDeleteOperation extends FileOperation { - private final Uri mSrcParent; - - private MoveDeleteOperation( - @OpType int opType, UrisSupplier srcs, Uri srcParent, DocumentStack destination) { - super(opType, srcs, destination); - - assert(srcParent != null); - mSrcParent = srcParent; - } - - @Override - Job createJob(Context service, Job.Listener listener, String id) { - switch(getOpType()) { - case OPERATION_MOVE: - return new MoveJob( - service, listener, id, mSrcParent, getDestination(), getSrc()); - case OPERATION_DELETE: - return new DeleteJob( - service, listener, id, mSrcParent, getDestination(), getSrc()); - default: - throw new UnsupportedOperationException("Unsupported op type: " + getOpType()); - } - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - - builder.append("MoveDeleteOperation{"); - super.appendInfoTo(builder); - builder.append(", srcParent=").append(mSrcParent.toString()); - builder.append("}"); - - return builder.toString(); - } - - @Override - public void writeToParcel(Parcel out, int flag) { - super.writeToParcel(out, flag); - out.writeParcelable(mSrcParent, flag); - } - - private MoveDeleteOperation(Parcel in) { - super(in); - mSrcParent = in.readParcelable(null); - } - - public static final Parcelable.Creator<MoveDeleteOperation> CREATOR = - new Parcelable.Creator<MoveDeleteOperation>() { - - - @Override - public MoveDeleteOperation createFromParcel(Parcel source) { - return new MoveDeleteOperation(source); - } - - @Override - public MoveDeleteOperation[] newArray(int size) { - return new MoveDeleteOperation[size]; - } - }; - } - - public static class Builder { - private @OpType int mOpType; - private Uri mSrcParent; - private UrisSupplier mSrcs; - private DocumentStack mDestination; - - public Builder withOpType(@OpType int opType) { - mOpType = opType; - return this; - } - - public Builder withSrcParent(Uri srcParent) { - mSrcParent = srcParent; - return this; - } - - public Builder withSrcs(UrisSupplier srcs) { - mSrcs = srcs; - return this; - } - - public Builder withDestination(DocumentStack destination) { - mDestination = destination; - return this; - } - - public FileOperation build() { - switch (mOpType) { - case OPERATION_COPY: - return new CopyOperation(mSrcs, mDestination); - case OPERATION_MOVE: - case OPERATION_DELETE: - return new MoveDeleteOperation(mOpType, mSrcs, mSrcParent, mDestination); - default: - throw new UnsupportedOperationException("Unsupported op type: " + mOpType); - } - } - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/FileOperationService.java b/packages/DocumentsUI/src/com/android/documentsui/services/FileOperationService.java deleted file mode 100644 index b61c1c962b04..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/services/FileOperationService.java +++ /dev/null @@ -1,372 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.Shared.DEBUG; - -import android.annotation.IntDef; -import android.app.NotificationManager; -import android.app.Service; -import android.content.Intent; -import android.os.Handler; -import android.os.IBinder; -import android.os.PowerManager; -import android.support.annotation.VisibleForTesting; -import android.util.Log; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -import javax.annotation.concurrent.GuardedBy; - -public class FileOperationService extends Service implements Job.Listener { - - private static final int POOL_SIZE = 2; // "pool size", not *max* "pool size". - private static final int NOTIFICATION_ID_PROGRESS = 0; - private static final int NOTIFICATION_ID_FAILURE = 1; - private static final int NOTIFICATION_ID_WARNING = 2; - - public static final String TAG = "FileOperationService"; - - // Extra used for OperationDialogFragment, Notifications and picking copy destination. - public static final String EXTRA_OPERATION_TYPE = "com.android.documentsui.OPERATION_TYPE"; - - // Extras used for OperationDialogFragment... - public static final String EXTRA_DIALOG_TYPE = "com.android.documentsui.DIALOG_TYPE"; - public static final String EXTRA_SRC_LIST = "com.android.documentsui.SRC_LIST"; - - // Extras used to start or cancel a file operation... - public static final String EXTRA_JOB_ID = "com.android.documentsui.JOB_ID"; - public static final String EXTRA_OPERATION = "com.android.documentsui.OPERATION"; - public static final String EXTRA_CANCEL = "com.android.documentsui.CANCEL"; - - @IntDef(flag = true, value = { - OPERATION_UNKNOWN, - OPERATION_COPY, - OPERATION_MOVE, - OPERATION_DELETE - }) - @Retention(RetentionPolicy.SOURCE) - public @interface OpType {} - public static final int OPERATION_UNKNOWN = -1; - public static final int OPERATION_COPY = 1; - public static final int OPERATION_MOVE = 2; - public static final int OPERATION_DELETE = 3; - - // TODO: Move it to a shared file when more operations are implemented. - public static final int FAILURE_COPY = 1; - - // The executor and job factory are visible for testing and non-final - // so we'll have a way to inject test doubles from the test. It's - // a sub-optimal arrangement. - @VisibleForTesting ExecutorService executor; - - // Use a separate thread pool to prioritize deletions. - @VisibleForTesting ExecutorService deletionExecutor; - - // Use a handler to schedule monitor tasks. - @VisibleForTesting Handler handler; - - private PowerManager mPowerManager; - private PowerManager.WakeLock mWakeLock; // the wake lock, if held. - private NotificationManager mNotificationManager; - - @GuardedBy("mRunning") - private final Map<String, JobRecord> mRunning = new HashMap<>(); - - private int mLastServiceId; - - @Override - public void onCreate() { - // Allow tests to pre-set these with test doubles. - if (executor == null) { - executor = Executors.newFixedThreadPool(POOL_SIZE); - } - - if (deletionExecutor == null) { - deletionExecutor = Executors.newCachedThreadPool(); - } - - if (handler == null) { - // Monitor tasks are small enough to schedule them on main thread. - handler = new Handler(); - } - - if (DEBUG) Log.d(TAG, "Created."); - mPowerManager = getSystemService(PowerManager.class); - mNotificationManager = getSystemService(NotificationManager.class); - } - - @Override - public void onDestroy() { - if (DEBUG) Log.d(TAG, "Shutting down executor."); - - List<Runnable> unfinishedCopies = executor.shutdownNow(); - List<Runnable> unfinishedDeletions = deletionExecutor.shutdownNow(); - List<Runnable> unfinished = - new ArrayList<>(unfinishedCopies.size() + unfinishedDeletions.size()); - unfinished.addAll(unfinishedCopies); - unfinished.addAll(unfinishedDeletions); - if (!unfinished.isEmpty()) { - Log.w(TAG, "Shutting down, but executor reports running jobs: " + unfinished); - } - - executor = null; - deletionExecutor = null; - handler = null; - - if (DEBUG) Log.d(TAG, "Destroyed."); - } - - @Override - public int onStartCommand(Intent intent, int flags, int serviceId) { - // TODO: Ensure we're not being called with retry or redeliver. - // checkArgument(flags == 0); // retry and redeliver are not supported. - - String jobId = intent.getStringExtra(EXTRA_JOB_ID); - assert(jobId != null); - - if (DEBUG) Log.d(TAG, "onStartCommand: " + jobId + " with serviceId " + serviceId); - - if (intent.hasExtra(EXTRA_CANCEL)) { - handleCancel(intent); - } else { - FileOperation operation = intent.getParcelableExtra(EXTRA_OPERATION); - handleOperation(jobId, operation); - } - - // Track the service supplied id so we can stop the service once we're out of work to do. - mLastServiceId = serviceId; - - return START_NOT_STICKY; - } - - private void handleOperation(String jobId, FileOperation operation) { - synchronized (mRunning) { - if (mWakeLock == null) { - mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); - } - - if (mRunning.containsKey(jobId)) { - Log.w(TAG, "Duplicate job id: " + jobId - + ". Ignoring job request for operation: " + operation + "."); - return; - } - - Job job = operation.createJob(this, this, jobId); - - if (job == null) { - return; - } - - mWakeLock.acquire(); - - assert (job != null); - if (DEBUG) Log.d(TAG, "Scheduling job " + job.id + "."); - Future<?> future = getExecutorService(operation.getOpType()).submit(job); - mRunning.put(jobId, new JobRecord(job, future)); - } - } - - /** - * Cancels the operation corresponding to job id, identified in "EXTRA_JOB_ID". - * - * @param intent The cancellation intent. - */ - private void handleCancel(Intent intent) { - assert(intent.hasExtra(EXTRA_CANCEL)); - assert(intent.getStringExtra(EXTRA_JOB_ID) != null); - - String jobId = intent.getStringExtra(EXTRA_JOB_ID); - - if (DEBUG) Log.d(TAG, "handleCancel: " + jobId); - - synchronized (mRunning) { - // Do nothing if the cancelled ID doesn't match the current job ID. This prevents racey - // cancellation requests from affecting unrelated copy jobs. However, if the current job ID - // is null, the service most likely crashed and was revived by the incoming cancel intent. - // In that case, always allow the cancellation to proceed. - JobRecord record = mRunning.get(jobId); - if (record != null) { - record.job.cancel(); - } - } - - // Dismiss the progress notification here rather than in the copy loop. This preserves - // interactivity for the user in case the copy loop is stalled. - // Try to cancel it even if we don't have a job id...in case there is some sad - // orphan notification. - mNotificationManager.cancel(jobId, NOTIFICATION_ID_PROGRESS); - - // TODO: Guarantee the job is being finalized - } - - private ExecutorService getExecutorService(@OpType int operationType) { - switch (operationType) { - case OPERATION_COPY: - case OPERATION_MOVE: - return executor; - case OPERATION_DELETE: - return deletionExecutor; - default: - throw new UnsupportedOperationException(); - } - } - - @GuardedBy("mRunning") - private void deleteJob(Job job) { - if (DEBUG) Log.d(TAG, "deleteJob: " + job.id); - - JobRecord record = mRunning.remove(job.id); - assert(record != null); - record.job.cleanup(); - - if (mRunning.isEmpty()) { - shutdown(); - } - } - - /** - * Most likely shuts down. Won't shut down if service has a pending - * message. Thread pool is deal with in onDestroy. - */ - private void shutdown() { - if (DEBUG) Log.d(TAG, "Shutting down. Last serviceId was " + mLastServiceId); - mWakeLock.release(); - mWakeLock = null; - - // Turns out, for us, stopSelfResult always returns false in tests, - // so we can't guard executor shutdown. For this reason we move - // executor shutdown to #onDestroy. - boolean gonnaStop = stopSelfResult(mLastServiceId); - if (DEBUG) Log.d(TAG, "Stopping service: " + gonnaStop); - if (!gonnaStop) { - Log.w(TAG, "Service should be stopping, but reports otherwise."); - } - } - - @VisibleForTesting - boolean holdsWakeLock() { - return mWakeLock != null && mWakeLock.isHeld(); - } - - @Override - public void onStart(Job job) { - if (DEBUG) Log.d(TAG, "onStart: " + job.id); - - // Show start up notification - mNotificationManager.notify( - job.id, NOTIFICATION_ID_PROGRESS, job.getSetupNotification()); - - // Set up related monitor - JobMonitor monitor = new JobMonitor(job, mNotificationManager, handler); - monitor.start(); - } - - @Override - public void onFinished(Job job) { - assert(job.isFinished()); - if (DEBUG) Log.d(TAG, "onFinished: " + job.id); - - // Use the same thread of monitors to tackle notifications to avoid race conditions. - // Otherwise we may fail to dismiss progress notification. - handler.post(() -> { - // Dismiss the ongoing copy notification when the copy is done. - mNotificationManager.cancel(job.id, NOTIFICATION_ID_PROGRESS); - - if (job.hasFailures()) { - Log.e(TAG, "Job failed on files: " + job.failedFileCount + "."); - mNotificationManager.notify( - job.id, NOTIFICATION_ID_FAILURE, job.getFailureNotification()); - } - - if (job.hasWarnings()) { - if (DEBUG) Log.d(TAG, "Job finished with warnings."); - mNotificationManager.notify( - job.id, NOTIFICATION_ID_WARNING, job.getWarningNotification()); - } - }); - - synchronized (mRunning) { - deleteJob(job); - } - } - - private static final class JobRecord { - private final Job job; - private final Future<?> future; - - public JobRecord(Job job, Future<?> future) { - this.job = job; - this.future = future; - } - } - - /** - * A class used to periodically polls state of a job. - * - * <p>It's possible that jobs hang because underlying document providers stop responding. We - * still need to update notifications if jobs hang, so instead of jobs pushing their states, - * we poll states of jobs. - */ - private static final class JobMonitor implements Runnable { - private static final long PROGRESS_INTERVAL_MILLIS = 500L; - - private final Job mJob; - private final NotificationManager mNotificationManager; - private final Handler mHandler; - - private JobMonitor(Job job, NotificationManager notificationManager, Handler handler) { - mJob = job; - mNotificationManager = notificationManager; - mHandler = handler; - } - - private void start() { - mHandler.post(this); - } - - @Override - public void run() { - if (mJob.isFinished()) { - // Finish notification is already shown. Progress notification is removed. - // Just finish itself. - return; - } - - // Only job in set up state has progress bar - if (mJob.getState() == Job.STATE_SET_UP) { - mNotificationManager.notify( - mJob.id, NOTIFICATION_ID_PROGRESS, mJob.getProgressNotification()); - } - - mHandler.postDelayed(this, PROGRESS_INTERVAL_MILLIS); - } - } - - @Override - public IBinder onBind(Intent intent) { - return null; // Boilerplate. See super#onBind - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/FileOperations.java b/packages/DocumentsUI/src/com/android/documentsui/services/FileOperations.java deleted file mode 100644 index 01956a1b08eb..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/services/FileOperations.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static android.os.SystemClock.elapsedRealtime; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.services.FileOperationService.EXTRA_CANCEL; -import static com.android.documentsui.services.FileOperationService.EXTRA_JOB_ID; -import static com.android.documentsui.services.FileOperationService.EXTRA_OPERATION; - -import android.annotation.IntDef; -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.support.annotation.VisibleForTesting; -import android.util.Log; - -import com.android.documentsui.services.FileOperationService.OpType; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Helper functions for starting various file operations. - */ -public final class FileOperations { - - private static final String TAG = "FileOperations"; - - private static final IdBuilder idBuilder = new IdBuilder(); - - private FileOperations() {} - - public static String createJobId() { - return idBuilder.getNext(); - } - - /** - * Tries to start the activity. Returns the job id. - */ - public static String start(Context context, FileOperation operation, Callback callback) { - - if (DEBUG) Log.d(TAG, "Handling generic 'start' call."); - - String jobId = createJobId(); - Intent intent = createBaseIntent(context, jobId, operation); - - callback.onOperationResult(Callback.STATUS_ACCEPTED, operation.getOpType(), - operation.getSrc().getItemCount()); - - context.startService(intent); - - return jobId; - } - - @VisibleForTesting - public static void cancel(Activity activity, String jobId) { - if (DEBUG) Log.d(TAG, "Attempting to canceling operation: " + jobId); - - Intent intent = new Intent(activity, FileOperationService.class); - intent.putExtra(EXTRA_CANCEL, true); - intent.putExtra(EXTRA_JOB_ID, jobId); - - activity.startService(intent); - } - - /** - * Starts the service for an operation. - * - * @param jobId A unique jobid for this job. - * Use {@link #createJobId} if you don't have one handy. - * @return Id of the job. - */ - public static Intent createBaseIntent( - Context context, String jobId, FileOperation operation) { - - Intent intent = new Intent(context, FileOperationService.class); - intent.putExtra(EXTRA_JOB_ID, jobId); - intent.putExtra(EXTRA_OPERATION, operation); - - return intent; - } - - private static final class IdBuilder { - - // Remember last job time so we can guard against collisions. - private long mLastJobTime; - - // If we detect a collision, use subId to make distinct. - private int mSubId; - - public synchronized String getNext() { - long time = elapsedRealtime(); - if (time == mLastJobTime) { - mSubId++; - } else { - mSubId = 0; - } - mLastJobTime = time; - return String.valueOf(mLastJobTime) + "-" + String.valueOf(mSubId); - } - } - - /** - * A functional callback called when the file operation starts or fails to start. - */ - @FunctionalInterface - public interface Callback { - @Retention(RetentionPolicy.SOURCE) - @IntDef({STATUS_ACCEPTED, STATUS_REJECTED}) - @interface Status {} - static final int STATUS_ACCEPTED = 0; - static final int STATUS_REJECTED = 1; - - /** - * Performs operation when the file operation starts or fails to start. - * - * @param status {@link Status} of this operation - * @param opType file operation type {@link OpType}. - * @param docCount number of documents operated. - */ - void onOperationResult(@Status int status, @OpType int opType, int docCount); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/Job.java b/packages/DocumentsUI/src/com/android/documentsui/services/Job.java deleted file mode 100644 index 14ae66e6fa36..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/services/Job.java +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.DocumentsApplication.acquireUnstableProviderOrThrow; -import static com.android.documentsui.services.FileOperationService.EXTRA_CANCEL; -import static com.android.documentsui.services.FileOperationService.EXTRA_DIALOG_TYPE; -import static com.android.documentsui.services.FileOperationService.EXTRA_JOB_ID; -import static com.android.documentsui.services.FileOperationService.EXTRA_OPERATION_TYPE; -import static com.android.documentsui.services.FileOperationService.EXTRA_SRC_LIST; -import static com.android.documentsui.services.FileOperationService.OPERATION_UNKNOWN; - -import android.annotation.DrawableRes; -import android.annotation.IntDef; -import android.annotation.PluralsRes; -import android.app.Notification; -import android.app.Notification.Builder; -import android.app.PendingIntent; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Parcelable; -import android.os.RemoteException; -import android.provider.DocumentsContract; -import android.util.Log; - -import com.android.documentsui.clipping.UrisSupplier; -import com.android.documentsui.FilesActivity; -import com.android.documentsui.Metrics; -import com.android.documentsui.OperationDialogFragment; -import com.android.documentsui.R; -import com.android.documentsui.Shared; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.services.FileOperationService.OpType; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -/** - * A mashup of work item and ui progress update factory. Used by {@link FileOperationService} - * to do work and show progress relating to this work. - */ -abstract public class Job implements Runnable { - private static final String TAG = "Job"; - - @Retention(RetentionPolicy.SOURCE) - @IntDef({STATE_CREATED, STATE_STARTED, STATE_SET_UP, STATE_COMPLETED, STATE_CANCELED}) - @interface State {} - static final int STATE_CREATED = 0; - static final int STATE_STARTED = 1; - static final int STATE_SET_UP = 2; - static final int STATE_COMPLETED = 3; - /** - * A job is in canceled state as long as {@link #cancel()} is called on it, even after it is - * completed. - */ - static final int STATE_CANCELED = 4; - - static final String INTENT_TAG_WARNING = "warning"; - static final String INTENT_TAG_FAILURE = "failure"; - static final String INTENT_TAG_PROGRESS = "progress"; - static final String INTENT_TAG_CANCEL = "cancel"; - - final Context service; - final Context appContext; - final Listener listener; - - final @OpType int operationType; - final String id; - final DocumentStack stack; - final UrisSupplier srcs; - - int failedFileCount = 0; - final ArrayList<DocumentInfo> failedFiles = new ArrayList<>(); - final Notification.Builder mProgressBuilder; - - private final Map<String, ContentProviderClient> mClients = new HashMap<>(); - private volatile @State int mState = STATE_CREATED; - - /** - * A simple progressable job, much like an AsyncTask, but with support - * for providing various related notification, progress and navigation information. - * @param service The service context in which this job is running. - * @param listener - * @param id Arbitrary string ID - * @param stack The documents stack context relating to this request. This is the - * destination in the Files app where the user will be take when the - * navigation intent is invoked (presumably from notification). - * @param srcs the list of docs to operate on - */ - Job(Context service, Listener listener, String id, - @OpType int opType, DocumentStack stack, UrisSupplier srcs) { - - assert(opType != OPERATION_UNKNOWN); - - this.service = service; - this.appContext = service.getApplicationContext(); - this.listener = listener; - this.operationType = opType; - - this.id = id; - this.stack = stack; - this.srcs = srcs; - - mProgressBuilder = createProgressBuilder(); - } - - @Override - public final void run() { - if (isCanceled()) { - // Canceled before running - return; - } - - mState = STATE_STARTED; - listener.onStart(this); - try { - boolean result = setUp(); - if (result && !isCanceled()) { - mState = STATE_SET_UP; - start(); - } - } catch (RuntimeException e) { - // No exceptions should be thrown here, as all calls to the provider must be - // handled within Job implementations. However, just in case catch them here. - Log.e(TAG, "Operation failed due to an unhandled runtime exception.", e); - Metrics.logFileOperationErrors(service, operationType, failedFiles); - } finally { - mState = (mState == STATE_STARTED || mState == STATE_SET_UP) ? STATE_COMPLETED : mState; - listener.onFinished(this); - - // NOTE: If this details is a JumboClipDetails, and it's still referred in primary clip - // at this point, user won't be able to paste it to anywhere else because the underlying - srcs.dispose(); - } - } - - boolean setUp() { - return true; - } - abstract void start(); - - abstract Notification getSetupNotification(); - abstract Notification getProgressNotification(); - abstract Notification getFailureNotification(); - - abstract Notification getWarningNotification(); - - Uri getDataUriForIntent(String tag) { - return Uri.parse(String.format("data,%s-%s", tag, id)); - } - - ContentProviderClient getClient(DocumentInfo doc) throws RemoteException { - ContentProviderClient client = mClients.get(doc.authority); - if (client == null) { - // Acquire content providers. - client = acquireUnstableProviderOrThrow( - getContentResolver(), - doc.authority); - - mClients.put(doc.authority, client); - } - - assert(client != null); - return client; - } - - final void cleanup() { - for (ContentProviderClient client : mClients.values()) { - ContentProviderClient.releaseQuietly(client); - } - } - - final @State int getState() { - return mState; - } - - final void cancel() { - mState = STATE_CANCELED; - Metrics.logFileOperationCancelled(service, operationType); - } - - final boolean isCanceled() { - return mState == STATE_CANCELED; - } - - final boolean isFinished() { - return mState == STATE_CANCELED || mState == STATE_COMPLETED; - } - - final ContentResolver getContentResolver() { - return service.getContentResolver(); - } - - void onFileFailed(DocumentInfo file) { - ++failedFileCount; - failedFiles.add(file); - } - - final boolean hasFailures() { - return failedFileCount > 0; - } - - boolean hasWarnings() { - return false; - } - - final void deleteDocument(DocumentInfo doc, DocumentInfo parent) throws ResourceException { - try { - if (doc.isRemoveSupported()) { - DocumentsContract.removeDocument(getClient(doc), doc.derivedUri, parent.derivedUri); - } else if (doc.isDeleteSupported()) { - DocumentsContract.deleteDocument(getClient(doc), doc.derivedUri); - } else { - throw new ResourceException("Unable to delete source document as the file is " + - "not deletable nor removable: %s.", doc.derivedUri); - } - } catch (RemoteException | RuntimeException e) { - throw new ResourceException("Failed to delete file %s due to an exception.", - doc.derivedUri, e); - } - } - - Notification getSetupNotification(String content) { - mProgressBuilder.setProgress(0, 0, true) - .setContentText(content); - return mProgressBuilder.build(); - } - - Notification getFailureNotification(@PluralsRes int titleId, @DrawableRes int icon) { - final Intent navigateIntent = buildNavigateIntent(INTENT_TAG_FAILURE); - navigateIntent.putExtra(EXTRA_DIALOG_TYPE, OperationDialogFragment.DIALOG_TYPE_FAILURE); - navigateIntent.putExtra(EXTRA_OPERATION_TYPE, operationType); - navigateIntent.putParcelableArrayListExtra(EXTRA_SRC_LIST, failedFiles); - - final Notification.Builder errorBuilder = new Notification.Builder(service) - .setContentTitle(service.getResources().getQuantityString(titleId, - failedFileCount, failedFileCount)) - .setContentText(service.getString(R.string.notification_touch_for_details)) - .setContentIntent(PendingIntent.getActivity(appContext, 0, navigateIntent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT)) - .setCategory(Notification.CATEGORY_ERROR) - .setSmallIcon(icon) - .setAutoCancel(true); - - return errorBuilder.build(); - } - - abstract Builder createProgressBuilder(); - - final Builder createProgressBuilder( - String title, @DrawableRes int icon, - String actionTitle, @DrawableRes int actionIcon) { - Notification.Builder progressBuilder = new Notification.Builder(service) - .setContentTitle(title) - .setContentIntent( - PendingIntent.getActivity(appContext, 0, - buildNavigateIntent(INTENT_TAG_PROGRESS), 0)) - .setCategory(Notification.CATEGORY_PROGRESS) - .setSmallIcon(icon) - .setOngoing(true); - - final Intent cancelIntent = createCancelIntent(); - - progressBuilder.addAction( - actionIcon, - actionTitle, - PendingIntent.getService( - service, - 0, - cancelIntent, - PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_CANCEL_CURRENT)); - - return progressBuilder; - } - - /** - * Creates an intent for navigating back to the destination directory. - */ - Intent buildNavigateIntent(String tag) { - Intent intent = new Intent(service, FilesActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.setAction(DocumentsContract.ACTION_BROWSE); - intent.setData(getDataUriForIntent(tag)); - intent.putExtra(Shared.EXTRA_STACK, (Parcelable) stack); - return intent; - } - - Intent createCancelIntent() { - final Intent cancelIntent = new Intent(service, FileOperationService.class); - cancelIntent.setData(getDataUriForIntent(INTENT_TAG_CANCEL)); - cancelIntent.putExtra(EXTRA_CANCEL, true); - cancelIntent.putExtra(EXTRA_JOB_ID, id); - return cancelIntent; - } - - @Override - public String toString() { - return new StringBuilder() - .append("Job") - .append("{") - .append("id=" + id) - .append("}") - .toString(); - } - - /** - * Listener interface employed by the service that owns us as well as tests. - */ - interface Listener { - void onStart(Job job); - void onFinished(Job job); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java deleted file mode 100644 index ab0fae10ee77..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.Shared.DEBUG; -import static com.android.documentsui.services.FileOperationService.OPERATION_MOVE; - -import android.app.Notification; -import android.app.Notification.Builder; -import android.content.ContentResolver; -import android.content.Context; -import android.net.Uri; -import android.os.RemoteException; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.util.Log; - -import com.android.documentsui.R; -import com.android.documentsui.clipping.UrisSupplier; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; - -import java.io.FileNotFoundException; - -// TODO: Stop extending CopyJob. -final class MoveJob extends CopyJob { - - private static final String TAG = "MoveJob"; - - Uri mSrcParentUri; - DocumentInfo mSrcParent; - - /** - * Moves files to a destination identified by {@code destination}. - * Performs most work by delegating to CopyJob, then deleting - * a file after it has been copied. - * - * @see @link {@link Job} constructor for most param descriptions. - */ - MoveJob(Context service, Listener listener, - String id, Uri srcParent, DocumentStack destination, UrisSupplier srcs) { - super(service, listener, id, OPERATION_MOVE, destination, srcs); - mSrcParentUri = srcParent; - } - - @Override - Builder createProgressBuilder() { - return super.createProgressBuilder( - service.getString(R.string.move_notification_title), - R.drawable.ic_menu_copy, - service.getString(android.R.string.cancel), - R.drawable.ic_cab_cancel); - } - - @Override - public Notification getSetupNotification() { - return getSetupNotification(service.getString(R.string.move_preparing)); - } - - @Override - public Notification getProgressNotification() { - return getProgressNotification(R.string.copy_remaining); - } - - @Override - Notification getFailureNotification() { - return getFailureNotification( - R.plurals.move_error_notification_title, R.drawable.ic_menu_copy); - } - - @Override - public boolean setUp() { - final ContentResolver resolver = appContext.getContentResolver(); - try { - mSrcParent = DocumentInfo.fromUri(resolver, mSrcParentUri); - } catch(FileNotFoundException e) { - Log.e(TAG, "Failed to create srcParent.", e); - failedFileCount += srcs.getItemCount(); - return false; - } - - return super.setUp(); - } - - /** - * {@inheritDoc} - * - * Only check space for moves across authorities. For now we don't know if the doc in - * {@link #mSrcs} is in the same root of destination, and if it's optimized move in the same - * root it should succeed regardless of free space, but it's for sure a failure if there is no - * enough free space if docs are moved from another authority. - */ - @Override - boolean checkSpace() { - long size = 0; - for (DocumentInfo src : mSrcs) { - if (!src.authority.equals(stack.root.authority)) { - if (src.isDirectory()) { - try { - size += calculateFileSizesRecursively(getClient(src), src.derivedUri); - } catch (RemoteException|ResourceException e) { - Log.w(TAG, "Failed to obtain client for %s" + src.derivedUri + ".", e); - - // Failed to calculate size, but move may still succeed. - return true; - } - } else { - size += src.size; - } - } - } - - return checkSpace(size); - } - - void processDocument(DocumentInfo src, DocumentInfo srcParent, DocumentInfo dest) - throws ResourceException { - - // TODO: When optimized move kicks in, we're not making any progress updates. FIX IT! - - // When moving within the same provider, try to use optimized moving. - // If not supported, then fallback to byte-by-byte copy/move. - if (src.authority.equals(dest.authority)) { - if ((src.flags & Document.FLAG_SUPPORTS_MOVE) != 0) { - try { - if (DocumentsContract.moveDocument(getClient(src), src.derivedUri, - srcParent != null ? srcParent.derivedUri : mSrcParent.derivedUri, - dest.derivedUri) != null) { - return; - } - } catch (RemoteException | RuntimeException e) { - Log.e(TAG, "Provider side move failed for: " + src.derivedUri - + " due to an exception: ", e); - } - // If optimized move fails, then fallback to byte-by-byte copy. - if (DEBUG) Log.d(TAG, "Fallback to byte-by-byte move for: " + src.derivedUri); - } - } - - // Moving virtual files by bytes is not supported. This is because, it would involve - // conversion, and the source file should not be deleted in such case (as it's a different - // file). - if (src.isVirtualDocument()) { - throw new ResourceException("Cannot move virtual file %s byte by byte.", - src.derivedUri); - } - - // If we couldn't do an optimized copy...we fall back to vanilla byte copy. - byteCopyDocument(src, dest); - - // Remove the source document. - deleteDocument(src, srcParent); - } - - @Override - public String toString() { - return new StringBuilder() - .append("MoveJob") - .append("{") - .append("id=" + id) - .append(", srcs=" + mSrcs) - .append(", srcParent=" + mSrcParent) - .append(", destination=" + stack) - .append("}") - .toString(); - } -} diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/ResourceException.java b/packages/DocumentsUI/src/com/android/documentsui/services/ResourceException.java deleted file mode 100644 index 7d3d91a2d50d..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/services/ResourceException.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import android.net.Uri; - -public class ResourceException extends Exception { - public ResourceException(String message, Exception e) { - super(message, e); - } - - public ResourceException(String message, Uri uri1, Exception e) { - super(String.format(message, uri1.toString()), e); - } - - public ResourceException(String message, Uri uri1, Uri uri2, Exception e) { - super(String.format(message, uri1.toString(), uri2.toString()), e); - } - - public ResourceException(String message) { - super(message); - } - - public ResourceException(String message, Uri uri1) { - super(String.format(message, uri1.toString())); - } - - public ResourceException(String message, Uri uri1, Uri uri2) { - super(message.format(uri1.toString(), uri2.toString())); - } -} diff --git a/packages/DocumentsUI/tests/Android.mk b/packages/DocumentsUI/tests/Android.mk deleted file mode 100644 index febc542096a0..000000000000 --- a/packages/DocumentsUI/tests/Android.mk +++ /dev/null @@ -1,20 +0,0 @@ - -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests -#LOCAL_SDK_VERSION := current - -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_JAVA_LIBRARIES := android.test.runner -LOCAL_STATIC_JAVA_LIBRARIES := mockito-target ub-uiautomator espresso-core guava -LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt - -LOCAL_PACKAGE_NAME := DocumentsUITests -LOCAL_INSTRUMENTATION_FOR := DocumentsUI - -LOCAL_CERTIFICATE := platform - -include $(BUILD_PACKAGE) - diff --git a/packages/DocumentsUI/tests/AndroidManifest.xml b/packages/DocumentsUI/tests/AndroidManifest.xml deleted file mode 100644 index 0b767662f2ea..000000000000 --- a/packages/DocumentsUI/tests/AndroidManifest.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.documentsui.tests"> - - <uses-permission android:name="android.permission.INTERNET" /> - - <application> - <uses-library android:name="android.test.runner" /> - <provider - android:name="com.android.documentsui.StubProvider" - android:authorities="com.android.documentsui.stubprovider" - android:exported="true" - android:grantUriPermissions="true" - android:permission="android.permission.MANAGE_DOCUMENTS" - android:enabled="true"> - <intent-filter> - <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> - </intent-filter> - </provider> - </application> - - <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner" - android:targetPackage="com.android.documentsui" - android:label="Tests for DocumentsUI" /> - -</manifest> diff --git a/packages/DocumentsUI/tests/jarjar-rules.txt b/packages/DocumentsUI/tests/jarjar-rules.txt deleted file mode 100644 index 360b69b0c992..000000000000 --- a/packages/DocumentsUI/tests/jarjar-rules.txt +++ /dev/null @@ -1,2 +0,0 @@ -rule com.google.common.** docsui.@0 -rule android.support.annotation.** docsui.@0 diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java deleted file mode 100644 index 1400fe6ac7d4..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/ActivityTest.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.StubProvider.DEFAULT_AUTHORITY; -import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.StubProvider.ROOT_1_ID; - -import android.app.Activity; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.os.RemoteException; -import android.provider.DocumentsContract.Document; -import android.support.test.uiautomator.Configurator; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.test.ActivityInstrumentationTestCase2; -import android.view.MotionEvent; - -import com.android.documentsui.bots.Bots; -import com.android.documentsui.bots.UiBot; -import com.android.documentsui.model.RootInfo; - -import javax.annotation.Nullable; - -/** - * Provides basic test environment for UI tests: - * - Launches activity - * - Creates and gives access to test root directories and test files - * - Cleans up the test environment - */ -public abstract class ActivityTest<T extends Activity> extends ActivityInstrumentationTestCase2<T> { - - static final int TIMEOUT = 5000; - - // Testing files. For custom ones, override initTestFiles(). - public static final String dirName1 = "Dir1"; - public static final String childDir1 = "ChildDir1"; - public static final String fileName1 = "file1.log"; - public static final String fileName2 = "file12.png"; - public static final String fileName3 = "anotherFile0.log"; - public static final String fileName4 = "poodles.text"; - public static final String fileNameNoRename = "NO_RENAMEfile.txt"; - - public Bots bots; - public UiDevice device; - public Context context; - - public RootInfo rootDir0; - public RootInfo rootDir1; - ContentResolver mResolver; - DocumentsProviderHelper mDocsHelper; - ContentProviderClient mClient; - - public ActivityTest(Class<T> activityClass) { - super(activityClass); - } - - /* - * Returns the root that will be opened within the activity. - * By default tests are started with one of the test roots. - * Override the method if you want to open different root on start. - * @return Root that will be opened. Return null if you want to open activity's default root. - */ - protected @Nullable RootInfo getInitialRoot() { - return rootDir0; - } - - /** - * Returns the authority of the testing provider begin used. - * By default it's StubProvider's authority. - * @return Authority of the provider. - */ - protected String getTestingProviderAuthority() { - return DEFAULT_AUTHORITY; - } - - /** - * Resolves testing roots. - */ - protected void setupTestingRoots() throws RemoteException { - rootDir0 = mDocsHelper.getRoot(ROOT_0_ID); - rootDir1 = mDocsHelper.getRoot(ROOT_1_ID); - } - - @Override - public void setUp() throws Exception { - device = UiDevice.getInstance(getInstrumentation()); - // NOTE: Must be the "target" context, else security checks in content provider will fail. - context = getInstrumentation().getTargetContext(); - - bots = new Bots(device, context, TIMEOUT); - - Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_MOUSE); - - mResolver = context.getContentResolver(); - mClient = mResolver.acquireUnstableContentProviderClient(getTestingProviderAuthority()); - mDocsHelper = new DocumentsProviderHelper(getTestingProviderAuthority(), mClient); - - device.setOrientationNatural(); - setupTestingRoots(); - - launchActivity(); - resetStorage(); - - // Since at the launch of activity, ROOT_0 and ROOT_1 have no files, drawer will - // automatically open for phone devices. Espresso register click() as (x, y) MotionEvents, - // so if a drawer is on top of a file we want to select, it will actually click the drawer. - // Thus to start a clean state, we always try to close first. - bots.roots.closeDrawer(); - } - - @Override - public void tearDown() throws Exception { - device.unfreezeRotation(); - mClient.release(); - super.tearDown(); - } - - void launchActivity() { - final Intent intent = context.getPackageManager().getLaunchIntentForPackage( - UiBot.TARGET_PKG); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); - if (getInitialRoot() != null) { - intent.setData(getInitialRoot().getUri()); - } - setActivityIntent(intent); - getActivity(); // Launch the activity. - } - - void resetStorage() throws RemoteException { - mClient.call("clear", null, null); - device.waitForIdle(); - } - - void initTestFiles() throws RemoteException { - mDocsHelper.createFolder(rootDir0, dirName1); - mDocsHelper.createDocument(rootDir0, "text/plain", fileName1); - mDocsHelper.createDocument(rootDir0, "image/png", fileName2); - mDocsHelper.createDocumentWithFlags(rootDir0.documentId, "text/plain", fileNameNoRename, - Document.FLAG_SUPPORTS_WRITE); - - mDocsHelper.createDocument(rootDir1, "text/plain", fileName3); - mDocsHelper.createDocument(rootDir1, "text/plain", fileName4); - } - - void assertDefaultContentOfTestDir0() throws UiObjectNotFoundException { - bots.directory.waitForDocument(fileName1); - bots.directory.waitForDocument(fileName2); - bots.directory.waitForDocument(dirName1); - bots.directory.waitForDocument(fileNameNoRename); - bots.directory.assertDocumentsCount(4); - } - - void assertDefaultContentOfTestDir1() throws UiObjectNotFoundException { - bots.directory.waitForDocument(fileName3); - bots.directory.waitForDocument(fileName4); - bots.directory.assertDocumentsCount(2); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsMenuManagerTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsMenuManagerTest.java deleted file mode 100644 index ec0317360660..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsMenuManagerTest.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.State.ACTION_CREATE; -import static com.android.documentsui.State.ACTION_OPEN; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import android.provider.DocumentsContract.Root; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; - -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.testing.TestDirectoryDetails; -import com.android.documentsui.testing.TestMenu; -import com.android.documentsui.testing.TestMenuItem; -import com.android.documentsui.testing.TestSearchViewManager; -import com.android.documentsui.testing.TestSelectionDetails; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class DocumentsMenuManagerTest { - - private TestMenu testMenu; - private TestMenuItem open; - private TestMenuItem share; - private TestMenuItem delete; - private TestMenuItem rename; - private TestMenuItem selectAll; - private TestMenuItem createDir; - private TestMenuItem fileSize; - private TestMenuItem grid; - private TestMenuItem list; - private TestMenuItem cut; - private TestMenuItem copy; - private TestMenuItem paste; - private TestMenuItem sort; - private TestMenuItem sortSize; - private TestMenuItem advanced; - private TestMenuItem settings; - private TestMenuItem eject; - - private TestSelectionDetails selectionDetails; - private TestDirectoryDetails directoryDetails; - private TestSearchViewManager testSearchManager; - private State state = new State(); - private RootInfo testRootInfo; - - @Before - public void setUp() { - testMenu = TestMenu.create(); - open = testMenu.findItem(R.id.menu_open); - share = testMenu.findItem(R.id.menu_share); - delete = testMenu.findItem(R.id.menu_delete); - rename = testMenu.findItem(R.id.menu_rename); - selectAll = testMenu.findItem(R.id.menu_select_all); - createDir = testMenu.findItem(R.id.menu_create_dir); - fileSize = testMenu.findItem(R.id.menu_file_size); - grid = testMenu.findItem(R.id.menu_grid); - list = testMenu.findItem(R.id.menu_list); - cut = testMenu.findItem(R.id.menu_cut_to_clipboard); - copy = testMenu.findItem(R.id.menu_copy_to_clipboard); - paste = testMenu.findItem(R.id.menu_paste_from_clipboard); - sort = testMenu.findItem(R.id.menu_sort); - sortSize = testMenu.findItem(R.id.menu_sort_size); - advanced = testMenu.findItem(R.id.menu_advanced); - settings = testMenu.findItem(R.id.menu_settings); - eject = testMenu.findItem(R.id.menu_eject_root); - - selectionDetails = new TestSelectionDetails(); - directoryDetails = new TestDirectoryDetails(); - testSearchManager = new TestSearchViewManager(); - testRootInfo = new RootInfo(); - state.action = ACTION_CREATE; - state.allowMultiple = true; - } - - @Test - public void testActionMenu() { - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateActionMenu(testMenu, selectionDetails); - - open.assertInvisible(); - delete.assertInvisible(); - share.assertInvisible(); - rename.assertInvisible(); - selectAll.assertVisible(); - } - - @Test - public void testActionMenu_openAction() { - state.action = ACTION_OPEN; - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateActionMenu(testMenu, selectionDetails); - - open.assertVisible(); - } - - - @Test - public void testActionMenu_notAllowMultiple() { - state.allowMultiple = false; - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateActionMenu(testMenu, selectionDetails); - - selectAll.assertInvisible(); - } - - @Test - public void testOptionMenu() { - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - sort.assertEnabled(); - sortSize.assertInvisible(); - advanced.assertInvisible(); - advanced.assertTitle(R.string.menu_advanced_show); - createDir.assertDisabled(); - fileSize.assertInvisible(); - assertTrue(testSearchManager.showMenuCalled()); - } - - @Test - public void testOptionMenu_hideSize() { - state.showSize = true; - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - sortSize.assertVisible(); - } - - @Test - public void testOptionMenu_notPicking() { - state.action = ACTION_OPEN; - state.derivedMode = State.MODE_LIST; - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - createDir.assertInvisible(); - grid.assertVisible(); - list.assertInvisible(); - assertFalse(testSearchManager.showMenuCalled()); - } - - @Test - public void testOptionMenu_canCreateDirectory() { - directoryDetails.canCreateDirectory = true; - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - createDir.assertEnabled(); - } - - @Test - public void testOptionMenu_showAdvanced() { - state.showAdvanced = true; - state.showAdvancedOption = true; - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - advanced.assertVisible(); - advanced.assertTitle(R.string.menu_advanced_hide); - } - - @Test - public void testOptionMenu_inRecents() { - directoryDetails.isInRecents = true; - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - sort.assertDisabled(); - grid.assertInvisible(); - list.assertInvisible(); - } - - @Test - public void testContextMenu_NoSelection() { - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateContextMenu(testMenu, null, directoryDetails); - cut.assertVisible(); - copy.assertVisible(); - cut.assertDisabled(); - copy.assertDisabled(); - paste.assertVisible(); - createDir.assertVisible(); - delete.assertVisible(); - } - - @Test - public void testContextMenu_Selection() { - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateContextMenu(testMenu, selectionDetails, directoryDetails); - cut.assertVisible(); - copy.assertVisible(); - paste.assertVisible(); - rename.assertInvisible(); - createDir.assertVisible(); - delete.assertVisible(); - } - - @Test - public void testRootContextMenu() { - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateRootContextMenu(testMenu, testRootInfo); - - eject.assertInvisible(); - settings.assertInvisible(); - } - - @Test - public void testRootContextMenu_hasRootSettings() { - testRootInfo.flags = Root.FLAG_HAS_SETTINGS; - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateRootContextMenu(testMenu, testRootInfo); - - settings.assertInvisible(); - } - - @Test - public void testRootContextMenu_canEject() { - testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; - DocumentsMenuManager mgr = new DocumentsMenuManager(testSearchManager, state); - mgr.updateRootContextMenu(testMenu, testRootInfo); - - eject.assertInvisible(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java b/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java deleted file mode 100644 index 16ed2d9dee3c..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/DocumentsProviderHelper.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static android.provider.DocumentsContract.buildChildDocumentsUri; -import static android.provider.DocumentsContract.buildDocumentUri; -import static android.provider.DocumentsContract.buildRootsUri; -import static com.android.documentsui.model.DocumentInfo.getCursorString; -import static com.android.internal.util.Preconditions.checkArgument; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.fail; - -import android.content.ContentProviderClient; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.os.ParcelFileDescriptor; -import android.os.ParcelFileDescriptor.AutoCloseInputStream; -import android.os.ParcelFileDescriptor.AutoCloseOutputStream; -import android.os.RemoteException; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Root; -import android.support.annotation.Nullable; -import android.test.MoreAsserts; -import android.text.TextUtils; - -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.RootInfo; - -import com.google.android.collect.Lists; - -import libcore.io.IoUtils; -import libcore.io.Streams; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -/** - * Provides support for creation of documents in a test settings. - */ -public class DocumentsProviderHelper { - - private final String mAuthority; - private final ContentProviderClient mClient; - - public DocumentsProviderHelper(String authority, ContentProviderClient client) { - checkArgument(!TextUtils.isEmpty(authority)); - mAuthority = authority; - mClient = client; - } - - public RootInfo getRoot(String documentId) throws RemoteException { - final Uri rootsUri = buildRootsUri(mAuthority); - Cursor cursor = null; - try { - cursor = mClient.query(rootsUri, null, null, null, null); - while (cursor.moveToNext()) { - if (documentId.equals(getCursorString(cursor, Root.COLUMN_ROOT_ID))) { - return RootInfo.fromRootsCursor(mAuthority, cursor); - } - } - throw new IllegalArgumentException("Can't find matching root for id=" + documentId); - } catch (Exception e) { - throw new RuntimeException("Can't load root for id=" + documentId , e); - } finally { - IoUtils.closeQuietly(cursor); - } - } - - public Uri createDocument(Uri parentUri, String mimeType, String name) { - if (name.contains("/")) { - throw new IllegalArgumentException("Name and mimetype probably interposed."); - } - try { - Uri uri = DocumentsContract.createDocument(mClient, parentUri, mimeType, name); - return uri; - } catch (RemoteException e) { - throw new RuntimeException("Couldn't create document: " + name + " with mimetype " - + mimeType, e); - } - } - - public Uri createDocument(String parentId, String mimeType, String name) { - Uri parentUri = buildDocumentUri(mAuthority, parentId); - return createDocument(parentUri, mimeType, name); - } - - public Uri createDocument(RootInfo root, String mimeType, String name) { - return createDocument(root.documentId, mimeType, name); - } - - public Uri createDocumentWithFlags(String documentId, String mimeType, String name, int flags, - String... streamTypes) - throws RemoteException { - Bundle in = new Bundle(); - in.putInt(StubProvider.EXTRA_FLAGS, flags); - in.putString(StubProvider.EXTRA_PARENT_ID, documentId); - in.putString(Document.COLUMN_MIME_TYPE, mimeType); - in.putString(Document.COLUMN_DISPLAY_NAME, name); - in.putStringArrayList(StubProvider.EXTRA_STREAM_TYPES, Lists.newArrayList(streamTypes)); - - Bundle out = mClient.call("createDocumentWithFlags", null, in); - Uri uri = out.getParcelable(DocumentsContract.EXTRA_URI); - return uri; - } - - public Uri createFolder(Uri parentUri, String name) { - return createDocument(parentUri, Document.MIME_TYPE_DIR, name); - } - - public Uri createFolder(String parentId, String name) { - Uri parentUri = buildDocumentUri(mAuthority, parentId); - return createDocument(parentUri, Document.MIME_TYPE_DIR, name); - } - - public Uri createFolder(RootInfo root, String name) { - return createDocument(root, Document.MIME_TYPE_DIR, name); - } - - public void writeDocument(Uri documentUri, byte[] contents) - throws RemoteException, IOException { - ParcelFileDescriptor file = mClient.openFile(documentUri, "w", null); - try (AutoCloseOutputStream out = new AutoCloseOutputStream(file)) { - out.write(contents, 0, contents.length); - } - } - - public byte[] readDocument(Uri documentUri) throws RemoteException, IOException { - ParcelFileDescriptor file = mClient.openFile(documentUri, "r", null); - byte[] buf = null; - try (AutoCloseInputStream in = new AutoCloseInputStream(file)) { - buf = Streams.readFully(in); - } - return buf; - } - - public void assertChildCount(Uri parentUri, int expected) throws Exception { - List<DocumentInfo> children = listChildren(parentUri); - assertEquals("Incorrect file count after copy", expected, children.size()); - } - - public void assertChildCount(String parentId, int expected) throws Exception { - List<DocumentInfo> children = listChildren(parentId); - assertEquals("Incorrect file count after copy", expected, children.size()); - } - - public void assertChildCount(RootInfo root, int expected) throws Exception { - assertChildCount(root.documentId, expected); - } - - public void assertHasFile(Uri parentUri, String name) throws Exception { - List<DocumentInfo> children = listChildren(parentUri); - for (DocumentInfo child : children) { - if (name.equals(child.displayName) && !child.isDirectory()) { - return; - } - } - fail("Could not find file named=" + name + " in children " + children); - } - - public void assertHasFile(String parentId, String name) throws Exception { - Uri parentUri = buildDocumentUri(mAuthority, parentId); - assertHasFile(parentUri, name); - } - - public void assertHasFile(RootInfo root, String name) throws Exception { - assertHasFile(root.documentId, name); - } - - public void assertHasDirectory(Uri parentUri, String name) throws Exception { - List<DocumentInfo> children = listChildren(parentUri); - for (DocumentInfo child : children) { - if (name.equals(child.displayName) && child.isDirectory()) { - return; - } - } - fail("Could not find name=" + name + " in children " + children); - } - - public void assertHasDirectory(String parentId, String name) throws Exception { - Uri parentUri = buildDocumentUri(mAuthority, parentId); - assertHasDirectory(parentUri, name); - } - - public void assertHasDirectory(RootInfo root, String name) throws Exception { - assertHasDirectory(root.documentId, name); - } - - public void assertDoesNotExist(Uri parentUri, String name) throws Exception { - List<DocumentInfo> children = listChildren(parentUri); - for (DocumentInfo child : children) { - if (name.equals(child.displayName)) { - fail("Found name=" + name + " in children " + children); - } - } - } - - public void assertDoesNotExist(String parentId, String name) throws Exception { - Uri parentUri = buildDocumentUri(mAuthority, parentId); - assertDoesNotExist(parentUri, name); - } - - public void assertDoesNotExist(RootInfo root, String name) throws Exception { - assertDoesNotExist(root.getUri(), name); - } - - public @Nullable DocumentInfo findFile(String parentId, String name) - throws Exception { - List<DocumentInfo> children = listChildren(parentId); - for (DocumentInfo child : children) { - if (name.equals(child.displayName)) { - return child; - } - } - return null; - } - - public DocumentInfo findDocument(String parentId, String name) throws Exception { - List<DocumentInfo> children = listChildren(parentId); - for (DocumentInfo child : children) { - if (name.equals(child.displayName)) { - return child; - } - } - return null; - } - - public DocumentInfo findDocument(Uri parentUri, String name) throws Exception { - List<DocumentInfo> children = listChildren(parentUri); - for (DocumentInfo child : children) { - if (name.equals(child.displayName)) { - return child; - } - } - return null; - } - - public List<DocumentInfo> listChildren(Uri parentUri) throws Exception { - String id = DocumentsContract.getDocumentId(parentUri); - return listChildren(id); - } - - public List<DocumentInfo> listChildren(String documentId) throws Exception { - Uri uri = buildChildDocumentsUri(mAuthority, documentId); - List<DocumentInfo> children = new ArrayList<>(); - try (Cursor cursor = mClient.query(uri, null, null, null, null, null)) { - Cursor wrapper = new RootCursorWrapper(mAuthority, "totally-fake", cursor, 100); - while (wrapper.moveToNext()) { - children.add(DocumentInfo.fromDirectoryCursor(wrapper)); - } - } - return children; - } - - public void assertFileContents(Uri documentUri, byte[] expected) throws Exception { - MoreAsserts.assertEquals( - "Copied file contents differ", - expected, readDocument(documentUri)); - } - - public void assertFileContents(String parentId, String fileName, byte[] expected) - throws Exception { - DocumentInfo file = findFile(parentId, fileName); - assertNotNull(file); - assertFileContents(file.derivedUri, expected); - } - - /** - * A helper method for StubProvider only. Won't work with other providers. - * @throws RemoteException - */ - public Uri createVirtualFile( - RootInfo root, String path, String mimeType, byte[] content, String... streamTypes) - throws RemoteException { - - Bundle args = new Bundle(); - args.putString(StubProvider.EXTRA_ROOT, root.rootId); - args.putString(StubProvider.EXTRA_PATH, path); - args.putString(Document.COLUMN_MIME_TYPE, mimeType); - args.putStringArrayList(StubProvider.EXTRA_STREAM_TYPES, Lists.newArrayList(streamTypes)); - args.putByteArray(StubProvider.EXTRA_CONTENT, content); - - Bundle result = mClient.call("createVirtualFile", null, args); - String documentId = result.getString(Document.COLUMN_DOCUMENT_ID); - - return DocumentsContract.buildDocumentUri(mAuthority, documentId); - } - -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/FileManagementUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/FileManagementUiTest.java deleted file mode 100644 index 44f417dbdcbd..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/FileManagementUiTest.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.StubProvider.ROOT_1_ID; - -import android.net.Uri; -import android.os.RemoteException; -import android.support.test.filters.Suppress; -import android.test.suitebuilder.annotation.LargeTest; -import android.view.KeyEvent; - -@LargeTest -public class FileManagementUiTest extends ActivityTest<FilesActivity> { - - public FileManagementUiTest() { - super(FilesActivity.class); - } - - @Override - public void setUp() throws Exception { - super.setUp(); - initTestFiles(); - } - - @Override - public void initTestFiles() throws RemoteException { - Uri uri = mDocsHelper.createFolder(rootDir0, dirName1); - mDocsHelper.createFolder(uri, childDir1); - - mDocsHelper.createDocument(rootDir0, "text/plain", "file0.log"); - mDocsHelper.createDocument(rootDir0, "image/png", "file1.png"); - mDocsHelper.createDocument(rootDir0, "text/csv", "file2.csv"); - - mDocsHelper.createDocument(rootDir1, "text/plain", "anotherFile0.log"); - mDocsHelper.createDocument(rootDir1, "text/plain", "poodles.text"); - } - - @Suppress - public void testCreateDirectory() throws Exception { - bots.main.openOverflowMenu(); - device.waitForIdle(); - - bots.main.clickToolbarOverflowItem("New folder"); - device.waitForIdle(); - - bots.main.setDialogText("Kung Fu Panda"); - device.waitForIdle(); - - bots.keyboard.pressEnter(); - - bots.directory.waitForDocument("Kung Fu Panda"); - } - - public void testKeyboard_CutDocument() throws Exception { - bots.directory.clickDocument("file1.png"); - device.waitForIdle(); - bots.keyboard.pressKey(KeyEvent.KEYCODE_X, KeyEvent.META_CTRL_ON); - - device.waitForIdle(); - - bots.roots.openRoot(ROOT_1_ID); - bots.keyboard.pressKey(KeyEvent.KEYCODE_V, KeyEvent.META_CTRL_ON); - - bots.directory.waitForDocument("file1.png"); - bots.directory.assertDocumentsPresent("file1.png"); - - bots.roots.openRoot(ROOT_0_ID); - bots.directory.assertDocumentsAbsent("file1.png"); - } - - public void testKeyboard_CopyDocument() throws Exception { - bots.directory.clickDocument("file1.png"); - device.waitForIdle(); - bots.keyboard.pressKey(KeyEvent.KEYCODE_C, KeyEvent.META_CTRL_ON); - - device.waitForIdle(); - - bots.roots.openRoot(ROOT_1_ID); - bots.keyboard.pressKey(KeyEvent.KEYCODE_V, KeyEvent.META_CTRL_ON); - - bots.directory.waitForDocument("file1.png"); - - bots.roots.openRoot(ROOT_0_ID); - bots.directory.waitForDocument("file1.png"); - } - - public void testDeleteDocument_Cancel_ThenOK() throws Exception { - bots.directory.clickDocument("file1.png"); - device.waitForIdle(); - bots.main.clickToolbarItem(R.id.menu_delete); - - bots.main.clickDialogCancelButton(); - - bots.directory.waitForDocument("file1.png"); - - device.waitForIdle(); - bots.main.clickToolbarItem(R.id.menu_delete); - - bots.main.clickDialogOkButton(); - device.waitForIdle(); - - bots.directory.assertDocumentsAbsent("file1.png"); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityDefaultsUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityDefaultsUiTest.java deleted file mode 100644 index d0ec9d7164dc..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityDefaultsUiTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.StubProvider.ROOT_1_ID; - -import android.content.Intent; -import android.provider.DocumentsContract; -import android.test.suitebuilder.annotation.LargeTest; - -import com.android.documentsui.model.RootInfo; - -@LargeTest -public class FilesActivityDefaultsUiTest extends ActivityTest<FilesActivity> { - - public FilesActivityDefaultsUiTest() { - super(FilesActivity.class); - } - - @Override - protected RootInfo getInitialRoot() { - return null; // test the default, unaffected state of the app. - } - - public void testDefaultDirectory() throws Exception { - device.waitForIdle(); - - // Separate logic for "Documents" root, which presence depends on the config setting - if (docsRootEnabled()) { - bots.main.assertWindowTitle("Documents"); - } else { - bots.main.assertWindowTitle("Downloads"); - } - } - - public void testDefaultRoots() throws Exception { - device.waitForIdle(); - - // Should also have Drive, but that requires pre-configuration of devices - // We omit for now. - bots.roots.assertRootsPresent( - "Images", - "Videos", - "Audio", - "Downloads", - ROOT_0_ID, - ROOT_1_ID); - - // Separate logic for "Documents" root, which presence depends on the config setting - if (docsRootEnabled()) { - bots.roots.assertRootsPresent("Documents"); - } else { - bots.roots.assertRootsAbsent("Documents"); - } - } - - private boolean docsRootEnabled() { - return Shared.shouldShowDocumentsRoot(context, new Intent(DocumentsContract.ACTION_BROWSE)); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java deleted file mode 100644 index 1b47705f48dc..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.net.Uri; -import android.os.RemoteException; -import android.test.suitebuilder.annotation.LargeTest; - -@LargeTest -public class FilesActivityUiTest extends ActivityTest<FilesActivity> { - - public FilesActivityUiTest() { - super(FilesActivity.class); - } - - @Override - public void setUp() throws Exception { - super.setUp(); - initTestFiles(); - } - - @Override - public void initTestFiles() throws RemoteException { - Uri uri = mDocsHelper.createFolder(rootDir0, dirName1); - mDocsHelper.createFolder(uri, childDir1); - - mDocsHelper.createDocument(rootDir0, "text/plain", "file0.log"); - mDocsHelper.createDocument(rootDir0, "image/png", "file1.png"); - mDocsHelper.createDocument(rootDir0, "text/csv", "file2.csv"); - - mDocsHelper.createDocument(rootDir1, "text/plain", "anotherFile0.log"); - mDocsHelper.createDocument(rootDir1, "text/plain", "poodles.text"); - } - - public void testFilesListed() throws Exception { - bots.directory.assertDocumentsPresent("file0.log", "file1.png", "file2.csv"); - } - - public void testRootClick_SetsWindowTitle() throws Exception { - bots.roots.openRoot("Images"); - bots.main.assertWindowTitle("Images"); - } - - public void testFilesList_LiveUpdate() throws Exception { - mDocsHelper.createDocument(rootDir0, "yummers/sandwich", "Ham & Cheese.sandwich"); - - bots.directory.waitForDocument("Ham & Cheese.sandwich"); - bots.directory.assertDocumentsPresent( - "file0.log", "file1.png", "file2.csv", "Ham & Cheese.sandwich"); - } - - public void testNavigateByBreadcrumb() throws Exception { - bots.directory.openDocument(dirName1); - bots.directory.waitForDocument(childDir1); // wait for known content - bots.directory.assertDocumentsPresent(childDir1); - - bots.breadcrumb.revealAsNeeded(); - device.waitForIdle(); - bots.breadcrumb.assertItemsPresent(dirName1, "TEST_ROOT_0"); - - bots.breadcrumb.clickItem("TEST_ROOT_0"); - bots.directory.waitForDocument(dirName1); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesMenuManagerTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesMenuManagerTest.java deleted file mode 100644 index 3644abcda144..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesMenuManagerTest.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static org.junit.Assert.assertTrue; - -import android.provider.DocumentsContract.Root; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; - -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.testing.TestDirectoryDetails; -import com.android.documentsui.testing.TestMenu; -import com.android.documentsui.testing.TestMenuItem; -import com.android.documentsui.testing.TestSearchViewManager; -import com.android.documentsui.testing.TestSelectionDetails; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class FilesMenuManagerTest { - - private TestMenu testMenu; - private TestMenuItem rename; - private TestMenuItem moveTo; - private TestMenuItem copyTo; - private TestMenuItem share; - private TestMenuItem delete; - private TestMenuItem createDir; - private TestMenuItem fileSize; - private TestMenuItem settings; - private TestMenuItem newWindow; - private TestMenuItem cut; - private TestMenuItem copy; - private TestMenuItem paste; - private TestMenuItem sort; - private TestMenuItem sortSize; - private TestMenuItem advanced; - private TestMenuItem eject; - private TestSelectionDetails selectionDetails; - private TestDirectoryDetails directoryDetails; - private TestSearchViewManager testSearchManager; - private RootInfo testRootInfo; - private State state = new State(); - - @Before - public void setUp() { - testMenu = TestMenu.create(); - rename = testMenu.findItem(R.id.menu_rename); - moveTo = testMenu.findItem(R.id.menu_move_to); - copyTo = testMenu.findItem(R.id.menu_copy_to); - share = testMenu.findItem(R.id.menu_share); - delete = testMenu.findItem(R.id.menu_delete); - createDir = testMenu.findItem(R.id.menu_create_dir); - fileSize = testMenu.findItem(R.id.menu_file_size); - settings = testMenu.findItem(R.id.menu_settings); - newWindow = testMenu.findItem(R.id.menu_new_window); - cut = testMenu.findItem(R.id.menu_cut_to_clipboard); - copy = testMenu.findItem(R.id.menu_copy_to_clipboard); - paste = testMenu.findItem(R.id.menu_paste_from_clipboard); - sort = testMenu.findItem(R.id.menu_sort); - sortSize = testMenu.findItem(R.id.menu_sort_size); - advanced = testMenu.findItem(R.id.menu_advanced); - eject = testMenu.findItem(R.id.menu_eject_root); - - // These items by default are visible - testMenu.findItem(R.id.menu_select_all).setVisible(true); - testMenu.findItem(R.id.menu_list).setVisible(true); - testMenu.findItem(R.id.menu_file_size).setVisible(true); - - selectionDetails = new TestSelectionDetails(); - directoryDetails = new TestDirectoryDetails(); - testSearchManager = new TestSearchViewManager(); - testRootInfo = new RootInfo(); - } - - @Test - public void testActionMenu() { - selectionDetails.canDelete = true; - selectionDetails.canRename = true; - - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateActionMenu(testMenu, selectionDetails); - - rename.assertEnabled(); - delete.assertVisible(); - share.assertVisible(); - copyTo.assertEnabled(); - moveTo.assertEnabled(); - } - - @Test - public void testActionMenu_containsPartial() { - selectionDetails.containPartial = true; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateActionMenu(testMenu, selectionDetails); - - rename.assertDisabled(); - share.assertInvisible(); - copyTo.assertDisabled(); - moveTo.assertDisabled(); - } - - @Test - public void testActionMenu_cantRename() { - selectionDetails.canRename = false; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateActionMenu(testMenu, selectionDetails); - - rename.assertDisabled(); - } - - @Test - public void testActionMenu_cantDelete() { - selectionDetails.canDelete = false; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateActionMenu(testMenu, selectionDetails); - - delete.assertInvisible(); - // We shouldn't be able to move files if we can't delete them - moveTo.assertDisabled(); - } - - @Test - public void testActionMenu_containsDirectory() { - selectionDetails.containDirectories = true; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateActionMenu(testMenu, selectionDetails); - - // We can't share directories - share.assertInvisible(); - } - - @Test - public void testOptionMenu() { - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - sort.assertEnabled(); - sortSize.assertInvisible(); - advanced.assertInvisible(); - advanced.assertTitle(R.string.menu_advanced_show); - createDir.assertDisabled(); - fileSize.assertVisible(); - assertTrue(testSearchManager.updateMenuCalled()); - } - - @Test - public void testOptionMenu_hideSize() { - state.showSize = true; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - sortSize.assertVisible(); - } - - @Test - public void testOptionMenu_showAdvanced() { - state.showAdvanced = true; - state.showAdvancedOption = true; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - advanced.assertVisible(); - advanced.assertTitle(R.string.menu_advanced_hide); - } - - @Test - public void testOptionMenu_inRecents() { - directoryDetails.isInRecents = true; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - sort.assertDisabled(); - } - - @Test - public void testOptionMenu_canCreateDirectory() { - directoryDetails.canCreateDirectory = true; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - createDir.assertEnabled(); - } - - @Test - public void testOptionMenu_hasRootSettings() { - directoryDetails.hasRootSettings = true; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - settings.assertVisible(); - } - - @Test - public void testOptionMenu_shouldShowFancyFeatures() { - directoryDetails.shouldShowFancyFeatures = true; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateOptionMenu(testMenu, directoryDetails); - - newWindow.assertVisible(); - } - - @Test - public void testContextMenu_NoSelection() { - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateContextMenu(testMenu, null, directoryDetails); - cut.assertVisible(); - copy.assertVisible(); - cut.assertDisabled(); - copy.assertDisabled(); - paste.assertVisible(); - createDir.assertVisible(); - delete.assertVisible(); - } - - @Test - public void testContextMenu_Selection() { - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateContextMenu(testMenu, selectionDetails, directoryDetails); - cut.assertVisible(); - copy.assertVisible(); - paste.assertVisible(); - rename.assertVisible(); - createDir.assertVisible(); - delete.assertVisible(); - } - - @Test - public void testRootContextMenu() { - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateRootContextMenu(testMenu, testRootInfo); - - eject.assertVisible(); - eject.assertDisabled(); - - settings.assertVisible(); - settings.assertDisabled(); - } - - @Test - public void testRootContextMenu_hasRootSettings() { - testRootInfo.flags = Root.FLAG_HAS_SETTINGS; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateRootContextMenu(testMenu, testRootInfo); - - settings.assertEnabled(); - } - - @Test - public void testRootContextMenu_eject() { - testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateRootContextMenu(testMenu, testRootInfo); - - eject.assertEnabled(); - } - - @Test - public void testRootContextMenu_ejectInProcess() { - testRootInfo.flags = Root.FLAG_SUPPORTS_EJECT; - testRootInfo.ejecting = true; - FilesMenuManager mgr = new FilesMenuManager(testSearchManager, state); - mgr.updateRootContextMenu(testMenu, testRootInfo); - - eject.assertDisabled(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/IntegratedDownloadsUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/IntegratedDownloadsUiTest.java deleted file mode 100644 index ef4a68ddb6a6..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/IntegratedDownloadsUiTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.app.DownloadManager; -import android.app.DownloadManager.Request; -import android.content.Context; -import android.net.Uri; -import android.support.test.uiautomator.Configurator; -import android.support.test.uiautomator.UiObject; -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.Suppress; -import android.view.MotionEvent; - -// TODO: As of this writing all tests in this class are disabled. Please fix. -@LargeTest -public class IntegratedDownloadsUiTest extends ActivityTest<FilesActivity> { - - public IntegratedDownloadsUiTest() { - super(FilesActivity.class); - } - - // We don't really need to test the entirety of download support - // since downloads is (almost) just another provider. - @Suppress - public void testDownload_Queued() throws Exception { - DownloadManager dm = (DownloadManager) context.getSystemService( - Context.DOWNLOAD_SERVICE); - // This downloads ends up being queued (because DNS can't be resolved). - // We'll still see an entry in the downloads UI with a "Queued" label. - dm.enqueue(new Request(Uri.parse("http://hammychamp.toodles"))); - - bots.roots.openRoot("Downloads"); - bots.directory.assertDocumentsPresent("Queued"); - } - - @Suppress - public void testDownload_RetryUnsuccessful() throws Exception { - DownloadManager dm = (DownloadManager) context.getSystemService( - Context.DOWNLOAD_SERVICE); - // This downloads fails! But it'll still show up. - dm.enqueue(new Request(Uri.parse("http://www.google.com/hamfancy"))); - - bots.roots.openRoot("Downloads"); - UiObject doc = bots.directory.findDocument("Unsuccessful"); - doc.waitForExists(TIMEOUT); - - int toolType = Configurator.getInstance().getToolType(); - Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_FINGER); - doc.click(); - Configurator.getInstance().setToolType(toolType); - - assertTrue(bots.main.findDownloadRetryDialog().exists()); - - device.pressBack(); // to clear the dialog. - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/ItemDragListenerTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/ItemDragListenerTest.java deleted file mode 100644 index 37f6532c1a9c..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/ItemDragListenerTest.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; - -import android.content.ClipData; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import android.view.DragEvent; -import android.view.View; - -import com.android.documentsui.testing.ClipDatas; -import com.android.documentsui.testing.DragEvents; -import com.android.documentsui.testing.TestDrawable; -import com.android.documentsui.testing.TestTimer; -import com.android.documentsui.testing.Views; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.Timer; -import java.util.TimerTask; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class ItemDragListenerTest { - - private static final long DELAY_AFTER_HOVERING = ItemDragListener.SPRING_TIMEOUT + 1; - - private View mTestView; - private TestDrawable mTestBackground; - private TestDragHost mTestDragHost; - private TestTimer mTestTimer; - - private TestDragListener mListener; - - @Before - public void setUp() { - mTestView = Views.createTestView(); - mTestBackground = new TestDrawable(); - mTestTimer = new TestTimer(); - mTestDragHost = new TestDragHost(); - - mListener = new TestDragListener(mTestDragHost, mTestTimer); - } - - @Test - public void testDragStarted_ReturnsTrue() { - assertTrue(triggerDragEvent(DragEvent.ACTION_DRAG_STARTED)); - } - - @Test - public void testDragEntered_HighlightsView() { - triggerDragEvent(DragEvent.ACTION_DRAG_ENTERED); - assertSame(mTestView, mTestDragHost.mHighlightedView); - } - - @Test - public void testDragExited_UnhighlightsView() { - triggerDragEvent(DragEvent.ACTION_DRAG_ENTERED); - - triggerDragEvent(DragEvent.ACTION_DRAG_EXITED); - assertNull(mTestDragHost.mHighlightedView); - } - - @Test - public void testDragEnded_UnhighlightsView() { - triggerDragEvent(DragEvent.ACTION_DRAG_ENTERED); - - triggerDragEvent(DragEvent.ACTION_DRAG_ENDED); - assertNull(mTestDragHost.mHighlightedView); - } - - @Test - public void testDragLocation_notCrashWithoutBackground() { - DragEvent locationEvent = DragEvents.createTestLocationEvent(3, 4); - mListener.onDrag(mTestView, locationEvent); - } - - @Test - public void testDragLocation_setHotSpotOnBackground() { - Views.setBackground(mTestView, mTestBackground); - - final float x = 2; - final float y = 4; - DragEvent locationEvent = DragEvents.createTestLocationEvent(x, y); - mListener.onDrag(mTestView, locationEvent); - - assertEquals(x, mTestBackground.hotspotX, 0); - assertEquals(y, mTestBackground.hotspotY, 0); - } - - @Test - public void testHover_OpensView() { - triggerDragEvent(DragEvent.ACTION_DRAG_ENTERED); - - mTestTimer.fastForwardTo(DELAY_AFTER_HOVERING); - - assertSame(mTestView, mTestDragHost.mLastOpenedView); - } - - @Test - public void testDragExited_CancelsHoverTask() { - triggerDragEvent(DragEvent.ACTION_DRAG_ENTERED); - - triggerDragEvent(DragEvent.ACTION_DRAG_EXITED); - - mTestTimer.fastForwardTo(DELAY_AFTER_HOVERING); - - assertNull(mTestDragHost.mLastOpenedView); - } - - @Test - public void testDragEnded_CancelsHoverTask() { - triggerDragEvent(DragEvent.ACTION_DRAG_ENTERED); - - triggerDragEvent(DragEvent.ACTION_DRAG_ENDED); - - mTestTimer.fastForwardTo(DELAY_AFTER_HOVERING); - - assertNull(mTestDragHost.mLastOpenedView); - } - - @Test - public void testNoDropWithoutClipData() { - triggerDragEvent(DragEvent.ACTION_DRAG_ENTERED); - - final DragEvent dropEvent = DragEvents.createTestDropEvent(null); - assertFalse(mListener.onDrag(mTestView, dropEvent)); - } - - @Test - public void testDoDropWithClipData() { - triggerDragEvent(DragEvent.ACTION_DRAG_ENTERED); - - final ClipData data = ClipDatas.createTestClipData(); - final DragEvent dropEvent = DragEvents.createTestDropEvent(data); - mListener.onDrag(mTestView, dropEvent); - - assertSame(mTestView, mListener.mLastDropOnView); - assertSame(dropEvent, mListener.mLastDropEvent); - } - - protected boolean triggerDragEvent(int actionId) { - final DragEvent testEvent = DragEvents.createTestDragEvent(actionId); - - return mListener.onDrag(mTestView, testEvent); - } - - private static class TestDragListener extends ItemDragListener<TestDragHost> { - - private View mLastDropOnView; - private DragEvent mLastDropEvent; - - protected TestDragListener(TestDragHost dragHost, Timer timer) { - super(dragHost, timer); - } - - @Override - public TimerTask createOpenTask(View v) { - TimerTask task = super.createOpenTask(v); - TestTimer.Task testTask = new TestTimer.Task(task); - - return testTask; - } - - @Override - public boolean handleDropEventChecked(View v, DragEvent event) { - mLastDropOnView = v; - mLastDropEvent = event; - return true; - } - - } - - private static class TestDragHost implements ItemDragListener.DragHost { - private View mHighlightedView; - private View mLastOpenedView; - - @Override - public void setDropTargetHighlight(View v, boolean highlight) { - mHighlightedView = highlight ? v : null; - } - - @Override - public void runOnUiThread(Runnable runnable) { - runnable.run(); - } - - @Override - public void onViewHovered(View v) { - mLastOpenedView = v; - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/KeyboardNavigationUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/KeyboardNavigationUiTest.java deleted file mode 100644 index 1657a87a74d8..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/KeyboardNavigationUiTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.Suppress; -import android.view.KeyEvent; - -@LargeTest -public class KeyboardNavigationUiTest extends ActivityTest<FilesActivity> { - - public KeyboardNavigationUiTest() { - super(FilesActivity.class); - } - - // Tests that pressing tab switches focus between the roots and directory listings. - @Suppress - public void testKeyboard_tab() throws Exception { - bots.keyboard.pressKey(KeyEvent.KEYCODE_TAB); - bots.roots.assertHasFocus(); - bots.keyboard.pressKey(KeyEvent.KEYCODE_TAB); - bots.directory.assertHasFocus(); - } - - // Tests that arrow keys do not switch focus away from the dir list. - @Suppress - public void testKeyboard_arrowsDirList() throws Exception { - for (int i = 0; i < 10; i++) { - bots.keyboard.pressKey(KeyEvent.KEYCODE_DPAD_LEFT); - bots.directory.assertHasFocus(); - } - for (int i = 0; i < 10; i++) { - bots.keyboard.pressKey(KeyEvent.KEYCODE_DPAD_RIGHT); - bots.directory.assertHasFocus(); - } - } - - // Tests that arrow keys do not switch focus away from the roots list. - public void testKeyboard_arrowsRootsList() throws Exception { - bots.keyboard.pressKey(KeyEvent.KEYCODE_TAB); - for (int i = 0; i < 10; i++) { - bots.keyboard.pressKey(KeyEvent.KEYCODE_DPAD_RIGHT); - bots.roots.assertHasFocus(); - } - for (int i = 0; i < 10; i++) { - bots.keyboard.pressKey(KeyEvent.KEYCODE_DPAD_LEFT); - bots.roots.assertHasFocus(); - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java deleted file mode 100644 index e7ac2934ced4..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/RenameDocumentUiTest.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.test.suitebuilder.annotation.LargeTest; - -@LargeTest -public class RenameDocumentUiTest extends ActivityTest<FilesActivity> { - - private final String newName = "kitties.log"; - - public RenameDocumentUiTest() { - super(FilesActivity.class); - } - - @Override - public void setUp() throws Exception { - super.setUp(); - initTestFiles(); - bots.roots.closeDrawer(); - } - - // TODO: Move this over to the FilesMenuManagerTest. - public void testRenameEnabled_SingleSelection() throws Exception { - bots.directory.selectDocument(fileName1); - bots.main.openOverflowMenu(); - bots.main.assertMenuEnabled(R.string.menu_rename, true); - - // Dismiss more options window - device.pressBack(); - } - - // TODO: Move this over to the FilesMenuManagerTest. - public void testNoRenameSupport_SingleSelection() throws Exception { - bots.directory.selectDocument(fileNameNoRename); - bots.main.openOverflowMenu(); - bots.main.assertMenuEnabled(R.string.menu_rename, false); - - // Dismiss more options window - device.pressBack(); - } - - // TODO: Move this over to the FilesMenuManagerTest. - public void testOneHasRenameSupport_MultipleSelection() throws Exception { - bots.directory.selectDocument(fileName1); - bots.directory.selectDocument(fileNameNoRename); - bots.main.openOverflowMenu(); - bots.main.assertMenuEnabled(R.string.menu_rename, false); - - // Dismiss more options window - device.pressBack(); - } - - // TODO: Move this over to the FilesMenuManagerTest. - public void testRenameDisabled_MultipleSelection() throws Exception { - bots.directory.selectDocument(fileName1); - bots.directory.selectDocument(fileName2); - bots.main.openOverflowMenu(); - bots.main.assertMenuEnabled(R.string.menu_rename, false); - - // Dismiss more options window - device.pressBack(); - } - - public void testRenameFile_OkButton() throws Exception { - bots.directory.selectDocument(fileName1); - - clickRename(); - - device.waitForIdle(); - bots.main.setDialogText(newName); - - device.waitForIdle(); - bots.main.clickDialogOkButton(); - - bots.directory.waitForDocument(newName); - bots.directory.assertDocumentsAbsent(fileName1); - bots.directory.assertDocumentsCount(4); - } - - public void testRenameFile_Enter() throws Exception { - bots.directory.selectDocument(fileName1); - - clickRename(); - - device.waitForIdle(); - bots.main.setDialogText(newName); - - device.waitForIdle(); - bots.keyboard.pressEnter(); - - bots.directory.waitForDocument(newName); - bots.directory.assertDocumentsAbsent(fileName1); - bots.directory.assertDocumentsCount(4); - } - - public void testRenameFile_Cancel() throws Exception { - bots.directory.selectDocument(fileName1); - - clickRename(); - - bots.main.setDialogText(newName); - - bots.main.clickDialogCancelButton(); - - bots.directory.assertDocumentsPresent(fileName1); - bots.directory.assertDocumentsAbsent(newName); - bots.directory.assertDocumentsCount(4); - } - - public void testRenameDir() throws Exception { - String oldName = "Dir1"; - String newName = "Dir123"; - bots.directory.selectDocument(oldName); - - clickRename(); - - bots.main.setDialogText(newName); - - bots.keyboard.pressEnter(); - - bots.directory.assertDocumentsAbsent(oldName); - bots.directory.assertDocumentsPresent(newName); - bots.directory.assertDocumentsCount(4); - } - - public void testRename_NameExists() throws Exception { - // Check that document with the new name exists - bots.directory.assertDocumentsPresent(fileName2); - bots.directory.selectDocument(fileName1); - - clickRename(); - - bots.main.setDialogText(fileName2); - - bots.keyboard.pressEnter(); - - bots.directory.assertSnackbar(R.string.rename_error); - bots.directory.assertDocumentsPresent(fileName1); - bots.directory.assertDocumentsPresent(fileName2); - bots.directory.assertDocumentsCount(4); - } - - private void clickRename() throws UiObjectNotFoundException { - bots.main.clickActionbarOverflowItem("Rename"); - device.waitForIdle(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java deleted file mode 100644 index 2e81545e8e54..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.RootsCache.getMatchingRoots; -import static com.google.common.collect.Lists.newArrayList; - -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -import com.android.documentsui.model.RootInfo; - -import com.google.common.collect.Lists; - -import java.util.List; - -@SmallTest -public class RootsCacheTest extends AndroidTestCase { - - private static RootInfo mNull = new RootInfo(); - private static RootInfo mEmpty = buildForMimeTypes(); - private static RootInfo mWild = buildForMimeTypes("*/*"); - private static RootInfo mImages = buildForMimeTypes("image/*"); - private static RootInfo mAudio = buildForMimeTypes( - "audio/*", "application/ogg", "application/x-flac"); - private static RootInfo mDocs = buildForMimeTypes( - "application/msword", "application/vnd.ms-excel"); - private static RootInfo mMalformed1 = buildForMimeTypes("meow"); - private static RootInfo mMalformed2 = buildForMimeTypes("*/meow"); - - private List<RootInfo> mRoots; - - private State mState; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - mRoots = Lists.newArrayList( - mNull, mWild, mEmpty, mImages, mAudio, mDocs, mMalformed1, mMalformed2); - - mState = new State(); - mState.action = State.ACTION_OPEN; - mState.showAdvanced = true; - mState.localOnly = false; - } - - public void testMatchingRoots_Everything() throws Exception { - mState.acceptMimes = new String[] { "*/*" }; - assertContainsExactly( - newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), - getMatchingRoots(mRoots, mState)); - } - - public void testMatchingRoots_DirectoryCopy() throws Exception { - RootInfo downloads = buildForMimeTypes("*/*"); - downloads.authority = "com.android.providers.downloads.documents"; - mRoots.add(downloads); - - mState.acceptMimes = new String[] { "*/*" }; - mState.directoryCopy = true; - - // basically we're asserting that the results don't contain downloads - assertContainsExactly( - newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), - getMatchingRoots(mRoots, mState)); - } - - public void testMatchingRoots_PngOrWild() throws Exception { - mState.acceptMimes = new String[] { "image/png", "*/*" }; - assertContainsExactly( - newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), - getMatchingRoots(mRoots, mState)); - } - - public void testMatchingRoots_AudioWild() throws Exception { - mState.acceptMimes = new String[] { "audio/*" }; - assertContainsExactly( - newArrayList(mNull, mWild, mAudio), - getMatchingRoots(mRoots, mState)); - } - - public void testMatchingRoots_AudioWildOrImageWild() throws Exception { - mState.acceptMimes = new String[] { "audio/*", "image/*" }; - assertContainsExactly( - newArrayList(mNull, mWild, mAudio, mImages), - getMatchingRoots(mRoots, mState)); - } - - public void testMatchingRoots_AudioSpecific() throws Exception { - mState.acceptMimes = new String[] { "audio/mpeg" }; - assertContainsExactly( - newArrayList(mNull, mWild, mAudio), - getMatchingRoots(mRoots, mState)); - } - - public void testMatchingRoots_Document() throws Exception { - mState.acceptMimes = new String[] { "application/msword" }; - assertContainsExactly( - newArrayList(mNull, mWild, mDocs), - getMatchingRoots(mRoots, mState)); - } - - public void testMatchingRoots_Application() throws Exception { - mState.acceptMimes = new String[] { "application/*" }; - assertContainsExactly( - newArrayList(mNull, mWild, mAudio, mDocs), - getMatchingRoots(mRoots, mState)); - } - - public void testMatchingRoots_FlacOrPng() throws Exception { - mState.acceptMimes = new String[] { "application/x-flac", "image/png" }; - assertContainsExactly( - newArrayList(mNull, mWild, mAudio, mImages), - getMatchingRoots(mRoots, mState)); - } - - public void testExcludedAuthorities() throws Exception { - final List<RootInfo> roots = newArrayList(); - - // Set up some roots - for (int i = 0; i < 5; ++i) { - RootInfo root = new RootInfo(); - root.authority = "authority" + i; - roots.add(root); - } - // Make some allowed authorities - List<RootInfo> allowedRoots = newArrayList( - roots.get(0), roots.get(2), roots.get(4)); - // Set up the excluded authority list - for (RootInfo root: roots) { - if (!allowedRoots.contains(root)) { - mState.excludedAuthorities.add(root.authority); - } - } - mState.acceptMimes = new String[] { "*/*" }; - - assertContainsExactly( - allowedRoots, - getMatchingRoots(roots, mState)); - } - - private static void assertContainsExactly(List<?> expected, List<?> actual) { - assertEquals(expected.size(), actual.size()); - for (Object o : expected) { - assertTrue(actual.contains(o)); - } - } - - private static RootInfo buildForMimeTypes(String... mimeTypes) { - final RootInfo root = new RootInfo(); - root.derivedMimeTypes = mimeTypes; - return root; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsUiTest.java deleted file mode 100644 index 4edfd8a5fe22..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsUiTest.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.StubProvider.ROOT_1_ID; - -import android.test.suitebuilder.annotation.LargeTest; -import android.test.suitebuilder.annotation.Suppress; - -@LargeTest -public class RootsUiTest extends ActivityTest<FilesActivity> { - - private static final String TAG = "RootUiTest"; - - public RootsUiTest() { - super(FilesActivity.class); - } - - @Override - public void setUp() throws Exception { - super.setUp(); - initTestFiles(); - } - - public void testRootTapped_GoToRootFromChildDir() throws Exception { - bots.directory.openDocument(dirName1); - bots.breadcrumb.assertTitle(dirName1); - bots.roots.openRoot(ROOT_0_ID); - bots.main.assertWindowTitle(ROOT_0_ID); - assertDefaultContentOfTestDir0(); - } - - @Suppress - public void testRootChanged_ClearSelection() throws Exception { - bots.directory.selectDocument(fileName1); - bots.main.assertInActionMode(true); - - bots.roots.openRoot(ROOT_1_ID); - bots.main.assertInActionMode(false); - } - -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java deleted file mode 100644 index 01c6e1e53111..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/SearchViewUiTest.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.StubProvider.ROOT_1_ID; - -import android.support.test.filters.Suppress; -import android.support.v7.recyclerview.R; -import android.test.suitebuilder.annotation.LargeTest; - -@LargeTest -public class SearchViewUiTest extends ActivityTest<FilesActivity> { - - public SearchViewUiTest() { - super(FilesActivity.class); - } - - @Override - public void setUp() throws Exception { - super.setUp(); - initTestFiles(); - // Drawer interferes with a lot of search action; going to try to close any opened ones - bots.roots.closeDrawer(); - - // wait for a file to be present in default dir. - bots.directory.waitForDocument(fileName1); - } - - public void testSearchIconVisible() throws Exception { - // The default root (root 0) supports search - bots.search.assertInputExists(false); - bots.search.assertIconVisible(true); - } - - public void testSearchIconHidden() throws Exception { - bots.roots.openRoot(ROOT_1_ID); // root 1 doesn't support search - - bots.search.assertIconVisible(false); - bots.search.assertInputExists(false); - } - - public void testSearchView_ExpandsOnClick() throws Exception { - bots.search.clickIcon(); - device.waitForIdle(); - - bots.search.assertInputExists(true); - bots.search.assertInputFocused(true); - - // FIXME: Matchers fail the not-present check if we've ever clicked this. - // bots.search.assertIconVisible(false); - } - - public void testSearchView_CollapsesOnBack() throws Exception { - bots.search.clickIcon(); - device.pressBack(); - - bots.search.assertIconVisible(true); - bots.search.assertInputExists(false); - } - - public void testSearchView_ClearsTextOnBack() throws Exception { - bots.search.clickIcon(); - bots.search.setInputText("file2"); - - device.pressBack(); - - // Wait for a file in the default directory to be listed. - bots.directory.waitForDocument(dirName1); - - bots.search.assertIconVisible(true); - bots.search.assertInputExists(false); - } - - public void testSearchView_StateAfterSearch() throws Exception { - bots.search.clickIcon(); - bots.search.setInputText("file1"); - bots.keyboard.pressEnter(); - device.waitForIdle(); - - bots.search.assertInputEquals("file1"); - bots.search.assertInputFocused(false); - } - - public void testSearch_ResultsFound() throws Exception { - bots.search.clickIcon(); - bots.search.setInputText("file1"); - bots.keyboard.pressEnter(); - - bots.directory.assertDocumentsCountOnList(true, 2); - bots.directory.assertDocumentsPresent(fileName1, fileName2); - } - - public void testSearch_NoResults() throws Exception { - bots.search.clickIcon(); - bots.search.setInputText("chocolate"); - - bots.keyboard.pressEnter(); - - String msg = String.valueOf(context.getString(R.string.no_results)); - bots.directory.assertMessageTextView(String.format(msg, "TEST_ROOT_0")); - } - - @Suppress - public void testSearchResultsFound_ClearsOnBack() throws Exception { - bots.search.clickIcon(); - bots.search.setInputText(fileName1); - - bots.keyboard.pressEnter(); - device.pressBack(); - device.waitForIdle(); - - assertDefaultContentOfTestDir0(); - } - - @Suppress - public void testSearchNoResults_ClearsOnBack() throws Exception { - bots.search.clickIcon(); - bots.search.setInputText("chocolate bunny"); - - bots.keyboard.pressEnter(); - device.pressBack(); - device.waitForIdle(); - - assertDefaultContentOfTestDir0(); - } - - @Suppress - public void testSearchResultsFound_ClearsOnDirectoryChange() throws Exception { - // Skipping this test for phones since currently there's no way to open the drawer on - // phones after doing a search (it's a back button instead of a hamburger button) - if (!bots.main.inFixedLayout()) { - return; - } - - bots.search.clickIcon(); - - bots.search.setInputText(fileName1); - - bots.keyboard.pressEnter(); - - bots.roots.openRoot(ROOT_1_ID); - device.waitForIdle(); - assertDefaultContentOfTestDir1(); - - bots.roots.openRoot(ROOT_0_ID); - device.waitForIdle(); - - assertDefaultContentOfTestDir0(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/StateTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/StateTest.java deleted file mode 100644 index f057850ad655..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/StateTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -import com.android.documentsui.model.DocumentInfo; - -@SmallTest -public class StateTest extends AndroidTestCase { - - private static final DocumentInfo DIR_1; - private static final DocumentInfo DIR_2; - - private State mState; - - static { - DIR_1 = new DocumentInfo(); - DIR_1.displayName = "firstDirectory"; - DIR_2 = new DocumentInfo(); - DIR_2.displayName = "secondDirectory"; - } - - @Override - protected void setUp() throws Exception { - mState = new State(); - } - - public void testInitialStateEmpty() { - assertFalse(mState.hasLocationChanged()); - } - - public void testPushDocument_ChangesLocation() { - mState.pushDocument(DIR_1); - mState.pushDocument(DIR_2); - assertTrue(mState.hasLocationChanged()); - } - - public void testPushDocument_ModifiesStack() { - mState.pushDocument(DIR_1); - mState.pushDocument(DIR_2); - assertEquals(DIR_2, mState.stack.getFirst()); - } - - public void testPopDocument_ModifiesStack() { - mState.pushDocument(DIR_1); - mState.pushDocument(DIR_2); - mState.popDocument(); - assertEquals(DIR_1, mState.stack.getFirst()); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java b/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java deleted file mode 100644 index f71ce5d1b930..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/StubProvider.java +++ /dev/null @@ -1,820 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.pm.ProviderInfo; -import android.content.res.AssetFileDescriptor; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.database.MatrixCursor.RowBuilder; -import android.graphics.Point; -import android.net.Uri; -import android.os.Bundle; -import android.os.CancellationSignal; -import android.os.FileUtils; -import android.os.ParcelFileDescriptor; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Root; -import android.provider.DocumentsProvider; -import android.support.annotation.VisibleForTesting; -import android.text.TextUtils; -import android.util.Log; - -import libcore.io.IoUtils; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class StubProvider extends DocumentsProvider { - - public static final String DEFAULT_AUTHORITY = "com.android.documentsui.stubprovider"; - public static final String ROOT_0_ID = "TEST_ROOT_0"; - public static final String ROOT_1_ID = "TEST_ROOT_1"; - - public static final String EXTRA_SIZE = "com.android.documentsui.stubprovider.SIZE"; - public static final String EXTRA_ROOT = "com.android.documentsui.stubprovider.ROOT"; - public static final String EXTRA_PATH = "com.android.documentsui.stubprovider.PATH"; - public static final String EXTRA_STREAM_TYPES - = "com.android.documentsui.stubprovider.STREAM_TYPES"; - public static final String EXTRA_CONTENT = "com.android.documentsui.stubprovider.CONTENT"; - - public static final String EXTRA_FLAGS = "com.android.documentsui.stubprovider.FLAGS"; - public static final String EXTRA_PARENT_ID = "com.android.documentsui.stubprovider.PARENT"; - - private static final String TAG = "StubProvider"; - - private static final String STORAGE_SIZE_KEY = "documentsui.stubprovider.size"; - private static int DEFAULT_ROOT_SIZE = 1024 * 1024 * 100; // 100 MB. - - private static final String[] DEFAULT_ROOT_PROJECTION = new String[] { - Root.COLUMN_ROOT_ID, Root.COLUMN_FLAGS, Root.COLUMN_TITLE, Root.COLUMN_DOCUMENT_ID, - Root.COLUMN_AVAILABLE_BYTES - }; - private static final String[] DEFAULT_DOCUMENT_PROJECTION = new String[] { - Document.COLUMN_DOCUMENT_ID, Document.COLUMN_MIME_TYPE, Document.COLUMN_DISPLAY_NAME, - Document.COLUMN_LAST_MODIFIED, Document.COLUMN_FLAGS, Document.COLUMN_SIZE, - }; - - private final Map<String, StubDocument> mStorage = new HashMap<>(); - private final Map<String, RootInfo> mRoots = new HashMap<>(); - private final Object mWriteLock = new Object(); - - private String mAuthority = DEFAULT_AUTHORITY; - private SharedPreferences mPrefs; - private Set<String> mSimulateReadErrorIds = new HashSet<>(); - - @Override - public void attachInfo(Context context, ProviderInfo info) { - mAuthority = info.authority; - super.attachInfo(context, info); - } - - @Override - public boolean onCreate() { - clearCacheAndBuildRoots(); - return true; - } - - @VisibleForTesting - public void clearCacheAndBuildRoots() { - Log.d(TAG, "Resetting storage."); - removeChildrenRecursively(getContext().getCacheDir()); - mStorage.clear(); - mSimulateReadErrorIds.clear(); - - mPrefs = getContext().getSharedPreferences( - "com.android.documentsui.stubprovider.preferences", Context.MODE_PRIVATE); - Collection<String> rootIds = mPrefs.getStringSet("roots", null); - if (rootIds == null) { - rootIds = Arrays.asList(new String[] { ROOT_0_ID, ROOT_1_ID }); - } - - mRoots.clear(); - for (String rootId : rootIds) { - // Make a subdir in the cache dir for each root. - final File file = new File(getContext().getCacheDir(), rootId); - if (file.mkdir()) { - Log.i(TAG, "Created new root directory @ " + file.getPath()); - } - final RootInfo rootInfo = new RootInfo(file, getSize(rootId)); - - if(rootId.equals(ROOT_1_ID)) { - rootInfo.setSearchEnabled(false); - } - - mStorage.put(rootInfo.document.documentId, rootInfo.document); - mRoots.put(rootId, rootInfo); - } - } - - /** - * @return Storage size, in bytes. - */ - private long getSize(String rootId) { - final String key = STORAGE_SIZE_KEY + "." + rootId; - return mPrefs.getLong(key, DEFAULT_ROOT_SIZE); - } - - @Override - public Cursor queryRoots(String[] projection) throws FileNotFoundException { - final MatrixCursor result = new MatrixCursor(projection != null ? projection - : DEFAULT_ROOT_PROJECTION); - for (Map.Entry<String, RootInfo> entry : mRoots.entrySet()) { - final String id = entry.getKey(); - final RootInfo info = entry.getValue(); - final RowBuilder row = result.newRow(); - row.add(Root.COLUMN_ROOT_ID, id); - row.add(Root.COLUMN_FLAGS, info.flags); - row.add(Root.COLUMN_TITLE, id); - row.add(Root.COLUMN_DOCUMENT_ID, info.document.documentId); - row.add(Root.COLUMN_AVAILABLE_BYTES, info.getRemainingCapacity()); - } - return result; - } - - @Override - public Cursor queryDocument(String documentId, String[] projection) - throws FileNotFoundException { - final MatrixCursor result = new MatrixCursor(projection != null ? projection - : DEFAULT_DOCUMENT_PROJECTION); - final StubDocument file = mStorage.get(documentId); - if (file == null) { - throw new FileNotFoundException(); - } - includeDocument(result, file); - return result; - } - - @Override - public boolean isChildDocument(String parentDocId, String docId) { - final StubDocument parentDocument = mStorage.get(parentDocId); - final StubDocument childDocument = mStorage.get(docId); - return FileUtils.contains(parentDocument.file, childDocument.file); - } - - @Override - public String createDocument(String parentId, String mimeType, String displayName) - throws FileNotFoundException { - StubDocument parent = mStorage.get(parentId); - File file = createFile(parent, mimeType, displayName); - - final StubDocument document = StubDocument.createRegularDocument(file, mimeType, parent); - mStorage.put(document.documentId, document); - Log.d(TAG, "Created document " + document.documentId); - notifyParentChanged(document.parentId); - getContext().getContentResolver().notifyChange( - DocumentsContract.buildDocumentUri(mAuthority, document.documentId), - null, false); - - return document.documentId; - } - - @Override - public void deleteDocument(String documentId) - throws FileNotFoundException { - final StubDocument document = mStorage.get(documentId); - final long fileSize = document.file.length(); - if (document == null || !document.file.delete()) - throw new FileNotFoundException(); - synchronized (mWriteLock) { - document.rootInfo.size -= fileSize; - mStorage.remove(documentId); - } - Log.d(TAG, "Document deleted: " + documentId); - notifyParentChanged(document.parentId); - getContext().getContentResolver().notifyChange( - DocumentsContract.buildDocumentUri(mAuthority, document.documentId), - null, false); - } - - @Override - public Cursor queryChildDocumentsForManage(String parentDocumentId, String[] projection, - String sortOrder) throws FileNotFoundException { - return queryChildDocuments(parentDocumentId, projection, sortOrder); - } - - @Override - public Cursor queryChildDocuments(String parentDocumentId, String[] projection, String sortOrder) - throws FileNotFoundException { - final StubDocument parentDocument = mStorage.get(parentDocumentId); - if (parentDocument == null || parentDocument.file.isFile()) { - throw new FileNotFoundException(); - } - final MatrixCursor result = new MatrixCursor(projection != null ? projection - : DEFAULT_DOCUMENT_PROJECTION); - result.setNotificationUri(getContext().getContentResolver(), - DocumentsContract.buildChildDocumentsUri(mAuthority, parentDocumentId)); - StubDocument document; - for (File file : parentDocument.file.listFiles()) { - document = mStorage.get(getDocumentIdForFile(file)); - if (document != null) { - includeDocument(result, document); - } - } - return result; - } - - @Override - public Cursor queryRecentDocuments(String rootId, String[] projection) - throws FileNotFoundException { - final MatrixCursor result = new MatrixCursor(projection != null ? projection - : DEFAULT_DOCUMENT_PROJECTION); - return result; - } - - @Override - public Cursor querySearchDocuments(String rootId, String query, String[] projection) - throws FileNotFoundException { - - StubDocument parentDocument = mRoots.get(rootId).document; - if (parentDocument == null || parentDocument.file.isFile()) { - throw new FileNotFoundException(); - } - - final MatrixCursor result = new MatrixCursor( - projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION); - - for (File file : parentDocument.file.listFiles()) { - if (file.getName().toLowerCase().contains(query)) { - StubDocument document = mStorage.get(getDocumentIdForFile(file)); - if (document != null) { - includeDocument(result, document); - } - } - } - return result; - } - - @Override - public String renameDocument(String documentId, String displayName) - throws FileNotFoundException { - - StubDocument oldDoc = mStorage.get(documentId); - - File before = oldDoc.file; - File after = new File(before.getParentFile(), displayName); - - if (after.exists()) { - throw new IllegalStateException("Already exists " + after); - } - - boolean result = before.renameTo(after); - - if (!result) { - throw new IllegalStateException("Failed to rename to " + after); - } - - StubDocument newDoc = StubDocument.createRegularDocument(after, oldDoc.mimeType, - mStorage.get(oldDoc.parentId)); - - mStorage.remove(documentId); - notifyParentChanged(oldDoc.parentId); - getContext().getContentResolver().notifyChange( - DocumentsContract.buildDocumentUri(mAuthority, oldDoc.documentId), null, false); - - mStorage.put(newDoc.documentId, newDoc); - notifyParentChanged(newDoc.parentId); - getContext().getContentResolver().notifyChange( - DocumentsContract.buildDocumentUri(mAuthority, newDoc.documentId), null, false); - - if (!TextUtils.equals(documentId, newDoc.documentId)) { - return newDoc.documentId; - } else { - return null; - } - } - - @Override - public ParcelFileDescriptor openDocument(String docId, String mode, CancellationSignal signal) - throws FileNotFoundException { - - final StubDocument document = mStorage.get(docId); - if (document == null || !document.file.isFile()) { - throw new FileNotFoundException(); - } - if ((document.flags & Document.FLAG_VIRTUAL_DOCUMENT) != 0) { - throw new IllegalStateException("Tried to open a virtual file."); - } - - if ("r".equals(mode)) { - if (mSimulateReadErrorIds.contains(docId)) { - Log.d(TAG, "Simulated errs enabled. Open in the wrong mode."); - return ParcelFileDescriptor.open( - document.file, ParcelFileDescriptor.MODE_WRITE_ONLY); - } - return ParcelFileDescriptor.open(document.file, ParcelFileDescriptor.MODE_READ_ONLY); - } - if ("w".equals(mode)) { - return startWrite(document); - } - - throw new FileNotFoundException(); - } - - @VisibleForTesting - public void simulateReadErrorsForFile(Uri uri) { - simulateReadErrorsForFile(DocumentsContract.getDocumentId(uri)); - } - - public void simulateReadErrorsForFile(String id) { - mSimulateReadErrorIds.add(id); - } - - @Override - public AssetFileDescriptor openDocumentThumbnail( - String docId, Point sizeHint, CancellationSignal signal) throws FileNotFoundException { - throw new FileNotFoundException(); - } - - @Override - public AssetFileDescriptor openTypedDocument( - String docId, String mimeTypeFilter, Bundle opts, CancellationSignal signal) - throws FileNotFoundException { - final StubDocument document = mStorage.get(docId); - if (document == null || !document.file.isFile() || document.streamTypes == null) { - throw new FileNotFoundException(); - } - for (final String mimeType : document.streamTypes) { - // Strict compare won't accept wildcards, but that's OK for tests, as DocumentsUI - // doesn't use them for getStreamTypes nor openTypedDocument. - if (mimeType.equals(mimeTypeFilter)) { - ParcelFileDescriptor pfd = ParcelFileDescriptor.open( - document.file, ParcelFileDescriptor.MODE_READ_ONLY); - if (mSimulateReadErrorIds.contains(docId)) { - pfd = new ParcelFileDescriptor(pfd) { - @Override - public void checkError() throws IOException { - throw new IOException("Test error"); - } - }; - } - return new AssetFileDescriptor(pfd, 0, document.file.length()); - } - } - throw new IllegalArgumentException("Invalid MIME type filter for openTypedDocument()."); - } - - @Override - public String[] getStreamTypes(Uri uri, String mimeTypeFilter) { - final StubDocument document = mStorage.get(DocumentsContract.getDocumentId(uri)); - if (document == null) { - throw new IllegalArgumentException( - "The provided Uri is incorrect, or the file is gone."); - } - if (!"*/*".equals(mimeTypeFilter)) { - // Not used by DocumentsUI, so don't bother implementing it. - throw new UnsupportedOperationException(); - } - if (document.streamTypes == null) { - return null; - } - return document.streamTypes.toArray(new String[document.streamTypes.size()]); - } - - private ParcelFileDescriptor startWrite(final StubDocument document) - throws FileNotFoundException { - ParcelFileDescriptor[] pipe; - try { - pipe = ParcelFileDescriptor.createReliablePipe(); - } catch (IOException exception) { - throw new FileNotFoundException(); - } - final ParcelFileDescriptor readPipe = pipe[0]; - final ParcelFileDescriptor writePipe = pipe[1]; - - new Thread() { - @Override - public void run() { - InputStream inputStream = null; - OutputStream outputStream = null; - try { - Log.d(TAG, "Opening write stream on file " + document.documentId); - inputStream = new ParcelFileDescriptor.AutoCloseInputStream(readPipe); - outputStream = new FileOutputStream(document.file); - byte[] buffer = new byte[32 * 1024]; - int bytesToRead; - int bytesRead = 0; - while (bytesRead != -1) { - synchronized (mWriteLock) { - // This cast is safe because the max possible value is buffer.length. - bytesToRead = (int) Math.min(document.rootInfo.getRemainingCapacity(), - buffer.length); - if (bytesToRead == 0) { - closePipeWithErrorSilently(readPipe, "Not enough space."); - break; - } - bytesRead = inputStream.read(buffer, 0, bytesToRead); - if (bytesRead == -1) { - break; - } - outputStream.write(buffer, 0, bytesRead); - document.rootInfo.size += bytesRead; - } - } - } catch (IOException e) { - Log.e(TAG, "Error on close", e); - closePipeWithErrorSilently(readPipe, e.getMessage()); - } finally { - IoUtils.closeQuietly(inputStream); - IoUtils.closeQuietly(outputStream); - Log.d(TAG, "Closing write stream on file " + document.documentId); - notifyParentChanged(document.parentId); - getContext().getContentResolver().notifyChange( - DocumentsContract.buildDocumentUri(mAuthority, document.documentId), - null, false); - } - } - }.start(); - - return writePipe; - } - - private void closePipeWithErrorSilently(ParcelFileDescriptor pipe, String error) { - try { - pipe.closeWithError(error); - } catch (IOException ignore) { - } - } - - @Override - public Bundle call(String method, String arg, Bundle extras) { - // We're not supposed to override any of the default DocumentsProvider - // methods that are supported by "call", so javadoc asks that we - // always call super.call first and return if response is not null. - Bundle result = super.call(method, arg, extras); - if (result != null) { - return result; - } - - switch (method) { - case "clear": - clearCacheAndBuildRoots(); - return null; - case "configure": - configure(arg, extras); - return null; - case "createVirtualFile": - return createVirtualFileFromBundle(extras); - case "simulateReadErrorsForFile": - simulateReadErrorsForFile(arg); - return null; - case "createDocumentWithFlags": - return dispatchCreateDocumentWithFlags(extras); - } - - return null; - } - - private Bundle createVirtualFileFromBundle(Bundle extras) { - try { - Uri uri = createVirtualFile( - extras.getString(EXTRA_ROOT), - extras.getString(EXTRA_PATH), - extras.getString(Document.COLUMN_MIME_TYPE), - extras.getStringArrayList(EXTRA_STREAM_TYPES), - extras.getByteArray(EXTRA_CONTENT)); - - String documentId = DocumentsContract.getDocumentId(uri); - Bundle result = new Bundle(); - result.putString(Document.COLUMN_DOCUMENT_ID, documentId); - return result; - } catch (IOException e) { - Log.e(TAG, "Couldn't create virtual file."); - } - - return null; - } - - private Bundle dispatchCreateDocumentWithFlags(Bundle extras) { - String rootId = extras.getString(EXTRA_PARENT_ID); - String mimeType = extras.getString(Document.COLUMN_MIME_TYPE); - String name = extras.getString(Document.COLUMN_DISPLAY_NAME); - List<String> streamTypes = extras.getStringArrayList(EXTRA_STREAM_TYPES); - int flags = extras.getInt(EXTRA_FLAGS); - - Bundle out = new Bundle(); - String documentId = null; - try { - documentId = createDocument(rootId, mimeType, name, flags, streamTypes); - Uri uri = DocumentsContract.buildDocumentUri(mAuthority, documentId); - out.putParcelable(DocumentsContract.EXTRA_URI, uri); - } catch (FileNotFoundException e) { - Log.d(TAG, "Creating document with flags failed" + name); - } - return out; - } - - public String createDocument(String parentId, String mimeType, String displayName, int flags, - List<String> streamTypes) throws FileNotFoundException { - - StubDocument parent = mStorage.get(parentId); - File file = createFile(parent, mimeType, displayName); - - final StubDocument document = StubDocument.createDocumentWithFlags(file, mimeType, parent, - flags, streamTypes); - mStorage.put(document.documentId, document); - Log.d(TAG, "Created document " + document.documentId); - notifyParentChanged(document.parentId); - getContext().getContentResolver().notifyChange( - DocumentsContract.buildDocumentUri(mAuthority, document.documentId), - null, false); - - return document.documentId; - } - - private File createFile(StubDocument parent, String mimeType, String displayName) - throws FileNotFoundException { - if (parent == null) { - throw new IllegalArgumentException( - "Can't create file " + displayName + " in null parent."); - } - if (!parent.file.isDirectory()) { - throw new IllegalArgumentException( - "Can't create file " + displayName + " inside non-directory parent " - + parent.file.getName()); - } - - final File file = new File(parent.file, displayName); - if (file.exists()) { - throw new FileNotFoundException( - "Duplicate file names not supported for " + file); - } - - if (mimeType.equals(Document.MIME_TYPE_DIR)) { - if (!file.mkdirs()) { - throw new FileNotFoundException("Failed to create directory(s): " + file); - } - Log.i(TAG, "Created new directory: " + file); - } else { - boolean created = false; - try { - created = file.createNewFile(); - } catch (IOException e) { - // We'll throw an FNF exception later :) - Log.e(TAG, "createNewFile operation failed for file: " + file, e); - } - if (!created) { - throw new FileNotFoundException("createNewFile operation failed for: " + file); - } - Log.i(TAG, "Created new file: " + file); - } - return file; - } - - private void configure(String arg, Bundle extras) { - Log.d(TAG, "Configure " + arg); - String rootName = extras.getString(EXTRA_ROOT, ROOT_0_ID); - long rootSize = extras.getLong(EXTRA_SIZE, 1) * 1024 * 1024; - setSize(rootName, rootSize); - } - - private void notifyParentChanged(String parentId) { - getContext().getContentResolver().notifyChange( - DocumentsContract.buildChildDocumentsUri(mAuthority, parentId), null, false); - // Notify also about possible change in remaining space on the root. - getContext().getContentResolver().notifyChange(DocumentsContract.buildRootsUri(mAuthority), - null, false); - } - - private void includeDocument(MatrixCursor result, StubDocument document) { - final RowBuilder row = result.newRow(); - row.add(Document.COLUMN_DOCUMENT_ID, document.documentId); - row.add(Document.COLUMN_DISPLAY_NAME, document.file.getName()); - row.add(Document.COLUMN_SIZE, document.file.length()); - row.add(Document.COLUMN_MIME_TYPE, document.mimeType); - row.add(Document.COLUMN_FLAGS, document.flags); - row.add(Document.COLUMN_LAST_MODIFIED, document.file.lastModified()); - } - - private void removeChildrenRecursively(File file) { - for (File childFile : file.listFiles()) { - if (childFile.isDirectory()) { - removeChildrenRecursively(childFile); - } - childFile.delete(); - } - } - - public void setSize(String rootId, long rootSize) { - RootInfo root = mRoots.get(rootId); - if (root != null) { - final String key = STORAGE_SIZE_KEY + "." + rootId; - Log.d(TAG, "Set size of " + key + " : " + rootSize); - - // Persist the size. - SharedPreferences.Editor editor = mPrefs.edit(); - editor.putLong(key, rootSize); - editor.apply(); - // Apply the size in the current instance of this provider. - root.capacity = rootSize; - getContext().getContentResolver().notifyChange( - DocumentsContract.buildRootsUri(mAuthority), - null, false); - } else { - Log.e(TAG, "Attempt to configure non-existent root: " + rootId); - } - } - - @VisibleForTesting - public Uri createRegularFile(String rootId, String path, String mimeType, byte[] content) - throws FileNotFoundException, IOException { - final File file = createFile(rootId, path, mimeType, content); - final StubDocument parent = mStorage.get(getDocumentIdForFile(file.getParentFile())); - if (parent == null) { - throw new FileNotFoundException("Parent not found."); - } - final StubDocument document = StubDocument.createRegularDocument(file, mimeType, parent); - mStorage.put(document.documentId, document); - return DocumentsContract.buildDocumentUri(mAuthority, document.documentId); - } - - @VisibleForTesting - public Uri createVirtualFile( - String rootId, String path, String mimeType, List<String> streamTypes, byte[] content) - throws FileNotFoundException, IOException { - - final File file = createFile(rootId, path, mimeType, content); - final StubDocument parent = mStorage.get(getDocumentIdForFile(file.getParentFile())); - if (parent == null) { - throw new FileNotFoundException("Parent not found."); - } - final StubDocument document = StubDocument.createVirtualDocument( - file, mimeType, streamTypes, parent); - mStorage.put(document.documentId, document); - return DocumentsContract.buildDocumentUri(mAuthority, document.documentId); - } - - @VisibleForTesting - public File getFile(String rootId, String path) throws FileNotFoundException { - StubDocument root = mRoots.get(rootId).document; - if (root == null) { - throw new FileNotFoundException("No roots with the ID " + rootId + " were found"); - } - // Convert the path string into a path that's relative to the root. - File needle = new File(root.file, path.substring(1)); - - StubDocument found = mStorage.get(getDocumentIdForFile(needle)); - if (found == null) { - return null; - } - return found.file; - } - - private File createFile(String rootId, String path, String mimeType, byte[] content) - throws FileNotFoundException, IOException { - Log.d(TAG, "Creating test file " + rootId + " : " + path); - StubDocument root = mRoots.get(rootId).document; - if (root == null) { - throw new FileNotFoundException("No roots with the ID " + rootId + " were found"); - } - final File file = new File(root.file, path.substring(1)); - if (DocumentsContract.Document.MIME_TYPE_DIR.equals(mimeType)) { - if (!file.mkdirs()) { - throw new FileNotFoundException("Couldn't create directory " + file.getPath()); - } - } else { - if (!file.createNewFile()) { - throw new FileNotFoundException("Couldn't create file " + file.getPath()); - } - try (final FileOutputStream fout = new FileOutputStream(file)) { - fout.write(content); - } - } - return file; - } - - final static class RootInfo { - private static final int DEFAULT_ROOTS_FLAGS = Root.FLAG_SUPPORTS_SEARCH - | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_IS_CHILD; - - public final String name; - public final StubDocument document; - public long capacity; - public long size; - public int flags; - - RootInfo(File file, long capacity) { - this.name = file.getName(); - this.capacity = 1024 * 1024; - this.flags = DEFAULT_ROOTS_FLAGS; - this.capacity = capacity; - this.size = 0; - this.document = StubDocument.createRootDocument(file, this); - } - - public long getRemainingCapacity() { - return capacity - size; - } - - public void setSearchEnabled(boolean enabled) { - flags = enabled ? (flags | Root.FLAG_SUPPORTS_SEARCH) - : (flags & ~Root.FLAG_SUPPORTS_SEARCH); - } - - } - - final static class StubDocument { - public final File file; - public final String documentId; - public final String mimeType; - public final List<String> streamTypes; - public final int flags; - public final String parentId; - public final RootInfo rootInfo; - - private StubDocument(File file, String mimeType, List<String> streamTypes, int flags, - StubDocument parent) { - this.file = file; - this.documentId = getDocumentIdForFile(file); - this.mimeType = mimeType; - this.streamTypes = streamTypes; - this.flags = flags; - this.parentId = parent.documentId; - this.rootInfo = parent.rootInfo; - } - - private StubDocument(File file, RootInfo rootInfo) { - this.file = file; - this.documentId = getDocumentIdForFile(file); - this.mimeType = Document.MIME_TYPE_DIR; - this.streamTypes = new ArrayList<String>(); - this.flags = Document.FLAG_DIR_SUPPORTS_CREATE | Document.FLAG_SUPPORTS_RENAME; - this.parentId = null; - this.rootInfo = rootInfo; - } - - public static StubDocument createRootDocument(File file, RootInfo rootInfo) { - return new StubDocument(file, rootInfo); - } - - public static StubDocument createRegularDocument( - File file, String mimeType, StubDocument parent) { - int flags = Document.FLAG_SUPPORTS_DELETE | Document.FLAG_SUPPORTS_RENAME; - if (file.isDirectory()) { - flags |= Document.FLAG_DIR_SUPPORTS_CREATE; - } else { - flags |= Document.FLAG_SUPPORTS_WRITE; - } - return new StubDocument(file, mimeType, new ArrayList<String>(), flags, parent); - } - - public static StubDocument createDocumentWithFlags( - File file, String mimeType, StubDocument parent, int flags, - List<String> streamTypes) { - return new StubDocument(file, mimeType, streamTypes, flags, parent); - } - - public static StubDocument createVirtualDocument( - File file, String mimeType, List<String> streamTypes, StubDocument parent) { - int flags = Document.FLAG_SUPPORTS_DELETE | Document.FLAG_SUPPORTS_WRITE - | Document.FLAG_VIRTUAL_DOCUMENT; - return new StubDocument(file, mimeType, streamTypes, flags, parent); - } - - @Override - public String toString() { - return "StubDocument{" - + "path:" + file.getPath() - + ", documentId:" + documentId - + ", mimeType:" + mimeType - + ", streamTypes:" + streamTypes.toString() - + ", flags:" + flags - + ", parentId:" + parentId - + ", rootInfo:" + rootInfo - + "}"; - } - } - - private static String getDocumentIdForFile(File file) { - return file.getAbsolutePath(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/TestInputEvent.java b/packages/DocumentsUI/tests/src/com/android/documentsui/TestInputEvent.java deleted file mode 100644 index e6936d68ebd6..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/TestInputEvent.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.android.documentsui; - -import android.graphics.Point; -import android.support.v7.widget.RecyclerView; - -public class TestInputEvent implements Events.InputEvent { - - public boolean mouseEvent; - public boolean primaryButtonPressed; - public boolean secondaryButtonPressed; - public boolean shiftKeyDow; - public boolean actionDown; - public boolean actionUp; - public Point location; - public Point rawLocation; - public int position = Integer.MIN_VALUE; - - public TestInputEvent() {} - - public TestInputEvent(int position) { - this.position = position; - } - - @Override - public boolean isMouseEvent() { - return mouseEvent; - } - - @Override - public boolean isPrimaryButtonPressed() { - return primaryButtonPressed; - } - - @Override - public boolean isSecondaryButtonPressed() { - return secondaryButtonPressed; - } - - @Override - public boolean isShiftKeyDown() { - return shiftKeyDow; - } - - @Override - public boolean isActionDown() { - return actionDown; - } - - @Override - public boolean isActionUp() { - return actionUp; - } - - @Override - public Point getOrigin() { - return location; - } - - @Override - public float getX() { - return location.x; - } - - @Override - public float getY() { - return location.y; - } - - @Override - public float getRawX() { - return rawLocation.x; - } - - @Override - public float getRawY() { - return rawLocation.y; - } - - @Override - public boolean isOverItem() { - return position != Integer.MIN_VALUE && position != RecyclerView.NO_POSITION; - } - - @Override - public int getItemPosition() { - return position; - } - - @Override - public void close() {} - - public static TestInputEvent tap(int position) { - return new TestInputEvent(position); - } - - public static TestInputEvent shiftTap(int position) { - TestInputEvent e = new TestInputEvent(position); - e.shiftKeyDow = true; - return e; - } - - public static TestInputEvent click(int position) { - TestInputEvent e = new TestInputEvent(position); - e.mouseEvent = true; - return e; - } - - public static TestInputEvent shiftClick(int position) { - TestInputEvent e = new TestInputEvent(position); - e.mouseEvent = true; - e.shiftKeyDow = true; - return e; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/ThumbnailCacheTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/ThumbnailCacheTest.java deleted file mode 100644 index ee6ab01c26a9..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/ThumbnailCacheTest.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; - -import android.content.ComponentCallbacks2; -import android.graphics.Bitmap; -import android.graphics.Point; -import android.net.Uri; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; - -import com.android.documentsui.ThumbnailCache.Result; -import com.android.documentsui.testing.Bitmaps; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class ThumbnailCacheTest { - - private static final Uri URI_0 = Uri.parse("content://authority/document/0"); - private static final Uri URI_1 = Uri.parse("content://authority/document/1"); - - private static final Point SMALL_SIZE = new Point(1, 1); - private static final Point MID_SIZE = new Point(2, 2); - private static final Point LARGE_SIZE = new Point(3, 3); - - private static final Bitmap SMALL_BITMAP = Bitmaps.createTestBitmap(1, 1); - private static final Bitmap MIDSIZE_BITMAP = Bitmaps.createTestBitmap(2, 2); - private static final Bitmap LARGE_BITMAP = Bitmaps.createTestBitmap(3, 3); - - private static final long LAST_MODIFIED = 100; - - private static final int CACHE_SIZE_LIMIT = - MIDSIZE_BITMAP.getByteCount() + LARGE_BITMAP.getByteCount(); - - private ThumbnailCache mCache; - - @Before - public void setUp() { - mCache = new ThumbnailCache(CACHE_SIZE_LIMIT); - } - - @Test - public void testMiss() { - mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - - Result result = mCache.getThumbnail(URI_1, MID_SIZE); - - assertMiss(result); - } - - @Test - public void testHit_Exact() { - mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - - Result result = mCache.getThumbnail(URI_0, MID_SIZE); - - assertHitExact(result); - assertSame(MIDSIZE_BITMAP, result.getThumbnail()); - } - - @Test - public void testHit_Smaller() { - mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - - Result result = mCache.getThumbnail(URI_0, LARGE_SIZE); - - assertHitSmaller(result); - assertSame(MIDSIZE_BITMAP, result.getThumbnail()); - } - - @Test - public void testHit_Larger() { - mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - - Result result = mCache.getThumbnail(URI_0, SMALL_SIZE); - - assertHitLarger(result); - assertSame(MIDSIZE_BITMAP, result.getThumbnail()); - } - - @Test - public void testHit_Larger_HasBothSize() { - mCache.putThumbnail(URI_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED); - mCache.putThumbnail(URI_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED); - - Result result = mCache.getThumbnail(URI_0, MID_SIZE); - - assertHitLarger(result); - assertSame(LARGE_BITMAP, result.getThumbnail()); - } - - @Test - public void testHit_Exact_MultiplePut() { - mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - - Bitmap localBitmap = Bitmaps.createTestBitmap(MID_SIZE.x, MID_SIZE.y); - long localLastModified = LAST_MODIFIED + 100; - mCache.putThumbnail(URI_0, MID_SIZE, localBitmap, localLastModified); - - Result result = mCache.getThumbnail(URI_0, MID_SIZE); - - assertHitExact(result); - assertSame(localBitmap, result.getThumbnail()); - } - - @Test - public void testHit_EqualLastModified() { - mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - - Result result = mCache.getThumbnail(URI_0, MID_SIZE); - - assertEquals(LAST_MODIFIED, result.getLastModified()); - } - - @Test - public void testEvictOldest_SizeExceeded() { - mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - mCache.putThumbnail(URI_1, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED); - mCache.putThumbnail(URI_1, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED); - - Result result = mCache.getThumbnail(URI_0, MID_SIZE); - - assertMiss(result); - } - - @Test - public void testCacheShrink_OnTrimMemory_Moderate() { - mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - mCache.putThumbnail(URI_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED); - mCache.putThumbnail(URI_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED); - - mCache.onTrimMemory(ComponentCallbacks2.TRIM_MEMORY_MODERATE); - - Result result = mCache.getThumbnail(URI_0, MID_SIZE); - assertMiss(result); - } - - @Test - public void testCacheShrink_OnTrimMemory_Background() { - mCache.putThumbnail(URI_0, LARGE_SIZE, LARGE_BITMAP, LAST_MODIFIED); - mCache.putThumbnail(URI_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED); - - mCache.onTrimMemory(ComponentCallbacks2.TRIM_MEMORY_BACKGROUND); - - // Math here (size of each pixel omitted): - // Limit = midSize + largeSize = 2 * 2 + 3 * 3 = 13, so after all putThumbnail the cache is - // full. - // - // HalfLimit = Limit / 2 = 5. After evicting largeSize bitmap, cache size decreases to 4, - // which is smaller than 5. Then smallSize bitmap remains. - Result result = mCache.getThumbnail(URI_0, MID_SIZE); - assertHitSmaller(result); - assertSame(SMALL_BITMAP, result.getThumbnail()); - } - - @Test - public void testRemoveUri() { - mCache.putThumbnail(URI_0, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - mCache.putThumbnail(URI_0, SMALL_SIZE, SMALL_BITMAP, LAST_MODIFIED); - mCache.putThumbnail(URI_1, MID_SIZE, MIDSIZE_BITMAP, LAST_MODIFIED); - - mCache.removeUri(URI_0); - - assertMiss(mCache.getThumbnail(URI_0, MID_SIZE)); - assertHitExact(mCache.getThumbnail(URI_1, MID_SIZE)); - } - - private static void assertMiss(Result result) { - assertEquals(Result.CACHE_MISS, result.getStatus()); - assertFalse(result.isExactHit()); - assertFalse(result.isHit()); - } - - private static void assertHitExact(Result result) { - assertEquals(Result.CACHE_HIT_EXACT, result.getStatus()); - assertTrue(result.isExactHit()); - assertTrue(result.isHit()); - } - - private static void assertHitSmaller(Result result) { - assertEquals(Result.CACHE_HIT_SMALLER, result.getStatus()); - assertFalse(result.isExactHit()); - assertTrue(result.isHit()); - } - - private static void assertHitLarger(Result result) { - assertEquals(Result.CACHE_HIT_LARGER, result.getStatus()); - assertFalse(result.isExactHit()); - assertTrue(result.isHit()); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/Bots.java b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/Bots.java deleted file mode 100644 index 4bda5319f82e..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/Bots.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.bots; - -import static junit.framework.Assert.assertNotNull; - -import android.content.Context; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.BySelector; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObject; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.UiSelector; -import android.support.test.uiautomator.Until; - -/** - * Handy collection of bots for working with Files app. - */ -public final class Bots { - - private static final int TIMEOUT = 5000; - - public final BreadBot breadcrumb; - public final DirectoryListBot directory; - public final KeyboardBot keyboard; - public final RootsListBot roots; - public final SearchBot search; - public final UiBot main; - - public Bots(UiDevice device, Context context, int timeout) { - main = new UiBot(device, context, TIMEOUT); - breadcrumb = new BreadBot(device, context, TIMEOUT, main); - roots = new RootsListBot(device, context, TIMEOUT); - directory = new DirectoryListBot(device, context, TIMEOUT); - keyboard = new KeyboardBot(device, context, TIMEOUT); - search = new SearchBot(device, context, TIMEOUT); - } - - /** - * A test helper class that provides support for controlling directory list - * and making assertions against the state of it. - */ - static abstract class BaseBot { - final UiDevice mDevice; - final Context mContext; - final int mTimeout; - - BaseBot(UiDevice device, Context context, int timeout) { - mDevice = device; - mContext = context; - mTimeout = timeout; - } - - /** - * Asserts that the specified view or one of its descendents has focus. - */ - protected void assertHasFocus(String resourceName) { - UiObject2 candidate = mDevice.findObject(By.res(resourceName)); - assertNotNull("Expected " + resourceName + " to have focus, but it didn't.", - candidate.findObject(By.focused(true))); - } - - protected UiObject2 find(BySelector selector) { - mDevice.wait(Until.findObject(selector), mTimeout); - return mDevice.findObject(selector); - } - - protected UiObject findObject(String resourceId) { - final UiSelector object = new UiSelector().resourceId(resourceId); - return mDevice.findObject(object); - } - - protected UiObject findObject(String parentResourceId, String childResourceId) { - final UiSelector selector = new UiSelector() - .resourceId(parentResourceId) - .childSelector(new UiSelector().resourceId(childResourceId)); - return mDevice.findObject(selector); - } - - protected void waitForIdle() { - mDevice.waitForIdle(mTimeout); - } - } - -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/BreadBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/BreadBot.java deleted file mode 100644 index 2683e6c3f69e..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/BreadBot.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.bots; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.CoreMatchers.allOf; -import static org.hamcrest.CoreMatchers.anyOf; -import static org.hamcrest.CoreMatchers.is; - -import android.content.Context; -import android.support.test.espresso.ViewInteraction; -import android.support.test.espresso.matcher.BoundedMatcher; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.view.View; - -import com.android.documentsui.DragOverTextView; -import com.android.documentsui.DropdownBreadcrumb; -import com.android.documentsui.R; -import com.android.documentsui.model.DocumentInfo; - -import org.hamcrest.Description; -import org.hamcrest.Matcher; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.Predicate; - -import junit.framework.Assert; - -/** - * A test helper class that provides support for controlling the UI Breadcrumb - * programmatically, and making assertions against the state of the UI. - * <p> - * Support for working directly with Roots and Directory view can be found in the respective bots. - */ -public class BreadBot extends Bots.BaseBot { - - public static final String TARGET_PKG = "com.android.documentsui"; - - private static final Matcher<View> DROPDOWN_BREADCRUMB = withId( - R.id.dropdown_breadcrumb); - - private static final Matcher<View> HORIZONTAL_BREADCRUMB = withId( - R.id.horizontal_breadcrumb); - - // When any 'ol breadcrumb will do. Could be dropdown or horizontal. - @SuppressWarnings("unchecked") - private static final Matcher<View> BREADCRUMB = anyOf( - DROPDOWN_BREADCRUMB, HORIZONTAL_BREADCRUMB); - - private UiBot mMain; - - public BreadBot(UiDevice device, Context context, int timeout, UiBot main) { - super(device, context, timeout); - mMain = main; - } - - public void assertTitle(String expected) { - // There is no discrete title part on the horizontal breadcrumb... - // so we only test on dropdown. - if (mMain.inDrawerLayout()) { - Matcher<Object> titleMatcher = dropdownTitleMatcher(expected); - onView(BREADCRUMB) - .check(matches(titleMatcher)); - } - } - - /** - * Reveals the bread crumb if it was hidden. This will likely be the case - * when the app is in drawer mode. - */ - public void revealAsNeeded() throws Exception { - if (mMain.inDrawerLayout()) { - onView(DROPDOWN_BREADCRUMB).perform(click()); - } - } - - public void clickItem(String label) throws UiObjectNotFoundException { - if (mMain.inFixedLayout()) { - findHorizontalEntry(label).perform(click()); - } else { - mMain.findMenuWithName(label).click(); - } - } - - public void assertItemsPresent(String... items) { - Predicate<String> checker = mMain.inFixedLayout() - ? this::hasHorizontalEntry - : mMain::hasMenuWithName; - - assertItemsPresent(items, checker); - } - - public void assertItemsPresent(String[] items, Predicate<String> predicate) { - List<String> absent = new ArrayList<>(); - for (String item : items) { - if (!predicate.test(item)) { - absent.add(item); - } - } - if (!absent.isEmpty()) { - Assert.fail("Expected iteams " + Arrays.asList(items) - + ", but missing " + absent); - } - } - - public boolean hasHorizontalEntry(String label) { - return Matchers.present(findHorizontalEntry(label), withText(label)); - } - - @SuppressWarnings("unchecked") - public ViewInteraction findHorizontalEntry(String label) { - return onView(allOf(isAssignableFrom(DragOverTextView.class), withText(label))); - } - - private static Matcher<Object> dropdownTitleMatcher(String expected) { - final Matcher<String> textMatcher = is(expected); - return new BoundedMatcher<Object, DropdownBreadcrumb>(DropdownBreadcrumb.class) { - @Override - public boolean matchesSafely(DropdownBreadcrumb breadcrumb) { - DocumentInfo selectedDoc = (DocumentInfo) breadcrumb.getSelectedItem(); - return textMatcher.matches(selectedDoc.displayName); - } - - @Override - public void describeTo(Description description) { - description.appendText("with breadcrumb title: "); - textMatcher.describeTo(description); - } - }; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/DirectoryListBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/DirectoryListBot.java deleted file mode 100644 index fa1e09c36f17..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/DirectoryListBot.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.bots; - -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; -import static junit.framework.Assert.assertTrue; - -import android.content.Context; -import android.support.test.espresso.Espresso; -import android.support.test.espresso.matcher.ViewMatchers; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.BySelector; -import android.support.test.uiautomator.Configurator; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObject; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.support.test.uiautomator.UiSelector; -import android.support.test.uiautomator.Until; -import android.support.v7.widget.RecyclerView; -import android.view.KeyEvent; -import android.view.MotionEvent; - -import com.android.documentsui.R; - -import junit.framework.Assert; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Pattern; - -/** - * A test helper class that provides support for controlling directory list - * and making assertions against the state of it. - */ -public class DirectoryListBot extends Bots.BaseBot { - private static final String DIR_LIST_ID = "com.android.documentsui:id/dir_list"; - - private static final BySelector SNACK_DELETE = - By.desc(Pattern.compile("^Deleting [0-9]+ file.+")); - - public DirectoryListBot(UiDevice device, Context context, int timeout) { - super(device, context, timeout); - } - - public void assertDocumentsCount(int count) throws UiObjectNotFoundException { - UiObject docsList = findDocumentsList(); - assertEquals(count, docsList.getChildCount()); - } - - public void assertDocumentsPresent(String... labels) throws UiObjectNotFoundException { - List<String> absent = new ArrayList<>(); - for (String label : labels) { - if (!findDocument(label).exists()) { - absent.add(label); - } - } - if (!absent.isEmpty()) { - Assert.fail("Expected documents " + Arrays.asList(labels) - + ", but missing " + absent); - } - } - - public void assertDocumentsAbsent(String... labels) throws UiObjectNotFoundException { - List<String> found = new ArrayList<>(); - for (String label : labels) { - if (findDocument(label).exists()) { - found.add(label); - } - } - if (!found.isEmpty()) { - Assert.fail("Expected documents not present" + Arrays.asList(labels) - + ", but present " + found); - } - } - - public void assertDocumentsCountOnList(boolean exists, int count) throws UiObjectNotFoundException { - UiObject docsList = findDocumentsList(); - assertEquals(exists, docsList.exists()); - if(docsList.exists()) { - assertEquals(count, docsList.getChildCount()); - } - } - - public void assertMessageTextView(String message) throws UiObjectNotFoundException { - UiObject messageTextView = findMessageTextView(); - assertTrue(messageTextView.exists()); - - String msg = String.valueOf(message); - assertEquals(String.format(msg, "TEST_ROOT_0"), messageTextView.getText()); - - } - - private UiObject findMessageTextView() { - return findObject( - "com.android.documentsui:id/container_directory", - "com.android.documentsui:id/message"); - } - - public void assertSnackbar(int id) { - assertNotNull(getSnackbar(mContext.getString(id))); - } - - public void openDocument(String label) throws UiObjectNotFoundException { - int toolType = Configurator.getInstance().getToolType(); - Configurator.getInstance().setToolType(MotionEvent.TOOL_TYPE_FINGER); - UiObject doc = findDocument(label); - doc.click(); - Configurator.getInstance().setToolType(toolType); - } - - public void clickDocument(String label) throws UiObjectNotFoundException { - findDocument(label).click(); - } - - public UiObject selectDocument(String label) throws UiObjectNotFoundException { - waitForDocument(label); - UiObject doc = findDocument(label); - doc.longClick(); - return doc; - } - - public void copyFilesToClipboard(String...labels) throws UiObjectNotFoundException { - for (String label: labels) { - clickDocument(label); - } - mDevice.pressKeyCode(KeyEvent.KEYCODE_C, KeyEvent.META_CTRL_ON); - } - - public void pasteFilesFromClipboard() { - mDevice.pressKeyCode(KeyEvent.KEYCODE_V, KeyEvent.META_CTRL_ON); - } - - public UiObject2 getSnackbar(String message) { - return mDevice.wait(Until.findObject(By.text(message)), mTimeout); - } - - public void waitForDeleteSnackbar() { - mDevice.wait(Until.findObject(SNACK_DELETE), mTimeout); - } - - public void waitForDeleteSnackbarGone() { - // wait a little longer for snackbar to go away, as it disappears after a timeout. - mDevice.wait(Until.gone(SNACK_DELETE), mTimeout * 2); - } - - public void waitForDocument(String label) throws UiObjectNotFoundException { - findDocument(label).waitForExists(mTimeout); - } - - public UiObject findDocument(String label) throws UiObjectNotFoundException { - final UiSelector docList = new UiSelector().resourceId( - "com.android.documentsui:id/container_directory").childSelector( - new UiSelector().resourceId(DIR_LIST_ID)); - - // Wait for the first list item to appear - new UiObject(docList.childSelector(new UiSelector())).waitForExists(mTimeout); - - // new UiScrollable(docList).scrollIntoView(new UiSelector().text(label)); - return mDevice.findObject(docList.childSelector(new UiSelector().text(label))); - } - - public boolean hasDocuments(String... labels) throws UiObjectNotFoundException { - for (String label : labels) { - if (!findDocument(label).exists()) { - return false; - } - } - return true; - } - - public UiObject findDocumentsList() { - return findObject( - "com.android.documentsui:id/container_directory", - DIR_LIST_ID); - } - - public void assertHasFocus() { - assertHasFocus(DIR_LIST_ID); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/KeyboardBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/KeyboardBot.java deleted file mode 100644 index 2e715777c19f..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/KeyboardBot.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.bots; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.pressImeActionButton; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; - -import android.content.Context; -import android.support.test.uiautomator.UiDevice; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; - -/** - * A test helper class that provides support for keyboard manipulation. - */ -public class KeyboardBot extends Bots.BaseBot { - - public KeyboardBot(UiDevice device, Context context, int timeout) { - super(device, context, timeout); - } - - public void dismissKeyboardIfPresent() { - if(isKeyboardPresent()) { - mDevice.pressBack(); - } - } - - // Indirect way to detect the keyboard. - private boolean isKeyboardPresent() { - InputMethodManager inputManager = (InputMethodManager) mContext - .getSystemService(Context.INPUT_METHOD_SERVICE); - return inputManager.isAcceptingText(); - } - - public void pressEnter() { - //TODO: There seems to be a bug on N/Espresso that makes pressing Enter not work - // This is a temporary workaround that somehow works - // See b/28399576 - onView(isAssignableFrom(EditText.class)).perform(pressImeActionButton()); - } - - public void pressKey(int keyCode) { - mDevice.pressKeyCode(keyCode); - } - - public void pressKey(int keyCode, int metaState) { - mDevice.pressKeyCode(keyCode, metaState); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/Matchers.java b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/Matchers.java deleted file mode 100644 index fb3cd0c7216c..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/Matchers.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.bots; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; - -import android.support.test.espresso.ViewInteraction; -import android.view.View; - -import org.hamcrest.Matcher; - -/** - * Support methods for working with Espresso related matchers 'n stuff. - */ -public final class Matchers { - - private Matchers() {} - - public static boolean present(Matcher<View> matcher) { - return present(onView(matcher), isDisplayed()); - } - - public static boolean present(ViewInteraction vi, Matcher<View> matcher) { - try { - vi.check(matches(matcher)); - vi.check(matches(isDisplayed())); - return true; - } catch (Exception e) { - return false; - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/RootsListBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/RootsListBot.java deleted file mode 100644 index c73cec2a0433..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/RootsListBot.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.bots; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.swipeLeft; -import static android.support.test.espresso.action.ViewActions.swipeRight; -import static android.support.test.espresso.matcher.ViewMatchers.withId; - -import android.content.Context; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObject; -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.support.test.uiautomator.UiScrollable; -import android.support.test.uiautomator.UiSelector; -import android.util.Log; -import android.view.View; - -import com.android.documentsui.R; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import junit.framework.Assert; - -/** - * A test helper class that provides support for controlling and asserting against - * the roots list drawer. - */ -public class RootsListBot extends Bots.BaseBot { - private static final String ROOTS_LIST_ID = "com.android.documentsui:id/roots_list"; - private static final String TAG = "RootsListBot"; - - public RootsListBot(UiDevice device, Context context, int timeout) { - super(device, context, timeout); - } - - private UiObject findRoot(String label) throws UiObjectNotFoundException { - final UiSelector rootsList = new UiSelector().resourceId( - "com.android.documentsui:id/container_roots").childSelector( - new UiSelector().resourceId(ROOTS_LIST_ID)); - - // We might need to expand drawer if not visible - if (!new UiObject(rootsList).waitForExists(mTimeout)) { - Log.d(TAG, "Failed to find roots list; trying to expand"); - final UiSelector hamburger = new UiSelector().resourceId( - "com.android.documentsui:id/toolbar").childSelector( - new UiSelector().className("android.widget.ImageButton").clickable(true)); - new UiObject(hamburger).click(); - } - - // Wait for the first list item to appear - new UiObject(rootsList.childSelector(new UiSelector())).waitForExists(mTimeout); - - // Now scroll around to find our item - new UiScrollable(rootsList).scrollIntoView(new UiSelector().text(label)); - return new UiObject(rootsList.childSelector(new UiSelector().text(label))); - } - - public void openRoot(String label) throws UiObjectNotFoundException { - findRoot(label).click(); - // Close the drawer in case we select a pre-selected root already - closeDrawer(); - } - - public void closeDrawer() { - // Espresso will try to close the drawer if it's opened - // But if no drawer exists (Tablet devices), we will have to catch the exception - // and continue on the test - // Why can't we do something like .exist() first? - // http://stackoverflow.com/questions/20807131/espresso-return-boolean-if-view-exists - try { - if (mContext.getResources().getConfiguration() - .getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { - onView(withId(R.id.drawer_layout)).perform(swipeRight()); - } else { - onView(withId(R.id.drawer_layout)).perform(swipeLeft()); - } - } catch (Exception e) { - } - } - - public void assertRootsPresent(String... labels) throws UiObjectNotFoundException { - List<String> missing = new ArrayList<>(); - for (String label : labels) { - if (!findRoot(label).exists()) { - missing.add(label); - } - } - if (!missing.isEmpty()) { - Assert.fail( - "Expected roots " + Arrays.asList(labels) + ", but missing " + missing); - } - } - - public void assertRootsAbsent(String... labels) throws UiObjectNotFoundException { - List<String> unexpected = new ArrayList<>(); - for (String label : labels) { - if (findRoot(label).exists()) { - unexpected.add(label); - } - } - if (!unexpected.isEmpty()) { - Assert.fail("Unexpected roots " + unexpected); - } - } - - public void assertHasFocus() { - assertHasFocus(ROOTS_LIST_ID); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/SearchBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/SearchBot.java deleted file mode 100644 index 66be677cef89..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/SearchBot.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.bots; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; -import static android.support.test.espresso.matcher.ViewMatchers.isClickable; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; -import static org.hamcrest.CoreMatchers.allOf; -import static org.hamcrest.CoreMatchers.anyOf; - -import android.content.Context; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObject; -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.support.v7.recyclerview.R; -import android.view.View; - -import org.hamcrest.Matcher; - -/** - * A test helper class that provides support for controlling the search UI - * programmatically, and making assertions against the state of the UI. - * <p> - * Support for working directly with Roots and Directory view can be found in the respective bots. - */ -public class SearchBot extends Bots.BaseBot { - - public static final String TARGET_PKG = "com.android.documentsui"; - - // Dumb search layout changes substantially between Ryu and Angler. - @SuppressWarnings("unchecked") - private static final Matcher<View> SEARCH_WIDGET = allOf( - withId(R.id.menu_search), - anyOf(isClickable(), hasDescendant(isClickable()))); - - // Note that input is visible when the clicky button is not - // present. So to clearly qualify the two...we explicitly - // require this input be not clickable. - @SuppressWarnings("unchecked") - private static final Matcher<View> SEARCH_INPUT = allOf( - withId(R.id.menu_search), - isDisplayed()); - - public SearchBot(UiDevice device, Context context, int timeout) { - super(device, context, timeout); - } - - public void clickIcon() throws UiObjectNotFoundException { - UiObject searchView = findSearchView(); - searchView.click(); - assertTrue(searchView.exists()); - } - - public void setInputText(String query) throws UiObjectNotFoundException { - onView(SEARCH_INPUT).perform(typeText(query)); - } - - public void assertIconVisible(boolean visible) { - if (visible) { - assertTrue( - "Search icon should be visible.", - Matchers.present(SEARCH_WIDGET)); - } else { - assertFalse( - "Search icon should not be visible.", - Matchers.present(SEARCH_WIDGET)); - } - } - - public void assertInputEquals(String query) - throws UiObjectNotFoundException { - UiObject textField = findSearchViewTextField(); - - assertTrue(textField.exists()); - assertEquals(query, textField.getText()); - } - - public void assertInputFocused(boolean focused) - throws UiObjectNotFoundException { - UiObject textField = findSearchViewTextField(); - - assertTrue(textField.exists()); - assertEquals(focused, textField.isFocused()); - } - - public void assertInputExists(boolean exists) - throws UiObjectNotFoundException { - assertEquals(exists, findSearchViewTextField().exists()); - } - - private UiObject findSearchView() { - return findObject("com.android.documentsui:id/menu_search"); - } - - private UiObject findSearchViewTextField() { - return findObject("com.android.documentsui:id/menu_search", "android:id/search_src_text"); - } - - private UiObject findSearchViewIcon() { - return mContext.getResources().getBoolean(R.bool.full_bar_search_view) - ? findObject("com.android.documentsui:id/menu_search") - : findObject("com.android.documentsui:id/menu_search", "android:id/search_button"); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/UiBot.java b/packages/DocumentsUI/tests/src/com/android/documentsui/bots/UiBot.java deleted file mode 100644 index d1b73e2f6bf5..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/bots/UiBot.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.bots; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; -import static android.support.test.espresso.matcher.ViewMatchers.withClassName; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; -import static org.hamcrest.CoreMatchers.allOf; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.endsWith; - -import android.content.Context; -import android.support.test.espresso.Espresso; -import android.support.test.espresso.action.ViewActions; -import android.support.test.espresso.matcher.BoundedMatcher; -import android.support.test.espresso.matcher.ViewMatchers; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObject; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.UiObjectNotFoundException; -import android.support.test.uiautomator.UiSelector; -import android.util.TypedValue; -import android.view.View; -import android.widget.Toolbar; - -import com.android.documentsui.R; - -import org.hamcrest.Description; -import org.hamcrest.Matcher; - -import java.util.Iterator; -import java.util.List; - -/** - * A test helper class that provides support for controlling DocumentsUI activities - * programmatically, and making assertions against the state of the UI. - * <p> - * Support for working directly with Roots and Directory view can be found in the respective bots. - */ -public class UiBot extends Bots.BaseBot { - - public static final String TARGET_PKG = "com.android.documentsui"; - - @SuppressWarnings("unchecked") - private static final Matcher<View> TOOLBAR = allOf( - isAssignableFrom(Toolbar.class), - withId(R.id.toolbar)); - - @SuppressWarnings("unchecked") - private static final Matcher<View> ACTIONBAR = allOf( - withClassName(endsWith("ActionBarContextView"))); - - @SuppressWarnings("unchecked") - private static final Matcher<View> TEXT_ENTRY = allOf( - withClassName(endsWith("EditText"))); - - @SuppressWarnings("unchecked") - private static final Matcher<View> TOOLBAR_OVERFLOW = allOf( - withClassName(endsWith("OverflowMenuButton")), - ViewMatchers.isDescendantOfA(TOOLBAR)); - - @SuppressWarnings("unchecked") - private static final Matcher<View> ACTIONBAR_OVERFLOW = allOf( - withClassName(endsWith("OverflowMenuButton")), - ViewMatchers.isDescendantOfA(ACTIONBAR)); - - public UiBot(UiDevice device, Context context, int timeout) { - super(device, context, timeout); - } - - public void assertWindowTitle(String expected) { - onView(TOOLBAR) - .check(matches(withToolbarTitle(is(expected)))); - } - - public void assertMenuEnabled(int id, boolean enabled) { - UiObject2 menu = findMenuWithName(mContext.getString(id)); - assertNotNull(menu); - assertEquals(enabled, menu.isEnabled()); - } - - public void assertInActionMode(boolean inActionMode) { - UiObject actionModeBar = findActionModeBar(); - assertEquals(inActionMode, actionModeBar.exists()); - } - - public UiObject openOverflowMenu() throws UiObjectNotFoundException { - UiObject obj = findMenuMoreOptions(); - obj.click(); - mDevice.waitForIdle(mTimeout); - return obj; - } - - public void setDialogText(String text) throws UiObjectNotFoundException { - onView(TEXT_ENTRY) - .perform(ViewActions.replaceText(text)); - } - - public boolean inFixedLayout() { - TypedValue val = new TypedValue(); - // We alias files_activity to either fixed or drawer layouts based - // on screen dimensions. In order to determine which layout - // has been selected, we check the resolved value. - mContext.getResources().getValue(R.layout.files_activity, val, true); - return val.resourceId == R.layout.fixed_layout; - } - - public boolean inDrawerLayout() { - return !inFixedLayout(); - } - - void switchViewMode() { - UiObject2 mode = menuGridMode(); - if (mode != null) { - mode.click(); - } else { - menuListMode().click(); - } - } - - UiObject2 menuGridMode() { - // Note that we're using By.desc rather than By.res, because of b/25285770 - return find(By.desc("Grid view")); - } - - UiObject2 menuListMode() { - // Note that we're using By.desc rather than By.res, because of b/25285770 - return find(By.desc("List view")); - } - - public void clickToolbarItem(int id) { - onView(withId(id)).perform(click()); - } - - public void clickNewFolder() { - onView(ACTIONBAR_OVERFLOW).perform(click()); - - // Click the item by label, since Espresso doesn't support lookup by id on overflow. - onView(withText("New folder")).perform(click()); - } - - public void clickActionbarOverflowItem(String label) { - onView(ACTIONBAR_OVERFLOW).perform(click()); - // Click the item by label, since Espresso doesn't support lookup by id on overflow. - onView(withText(label)).perform(click()); - } - - public void clickToolbarOverflowItem(String label) { - onView(TOOLBAR_OVERFLOW).perform(click()); - // Click the item by label, since Espresso doesn't support lookup by id on overflow. - onView(withText(label)).perform(click()); - } - - UiObject findActionModeBar() { - UiObject bar = findObject("android:id/action_mode_bar"); - bar.waitForExists(mTimeout); - return bar; - } - - public UiObject findDownloadRetryDialog() { - UiSelector selector = new UiSelector().text("Couldn't download"); - UiObject title = mDevice.findObject(selector); - title.waitForExists(mTimeout); - return title; - } - - public void clickDialogOkButton() { - // Espresso has flaky results when keyboard shows up, so hiding it for now - // before trying to click on any dialog button - Espresso.closeSoftKeyboard(); - onView(withId(android.R.id.button1)).perform(click()); - } - - public void clickDialogCancelButton() throws UiObjectNotFoundException { - // Espresso has flaky results when keyboard shows up, so hiding it for now - // before trying to click on any dialog button - Espresso.closeSoftKeyboard(); - onView(withId(android.R.id.button2)).perform(click()); - } - - UiObject findMenuLabelWithName(String label) { - UiSelector selector = new UiSelector().text(label); - return mDevice.findObject(selector); - } - - UiObject2 findMenuWithName(String label) { - List<UiObject2> menuItems = mDevice.findObjects(By.clazz("android.widget.LinearLayout")); - Iterator<UiObject2> it = menuItems.iterator(); - - UiObject2 menuItem = null; - while (it.hasNext()) { - menuItem = it.next(); - UiObject2 text = menuItem.findObject(By.text(label)); - if (text != null) { - break; - } - } - return menuItem; - } - - boolean hasMenuWithName(String label) { - return findMenuWithName(label) != null; - } - - UiObject findMenuMoreOptions() { - UiSelector selector = new UiSelector().className("android.widget.ImageButton") - .descriptionContains("More options"); - // TODO: use the system string ? android.R.string.action_menu_overflow_description - return mDevice.findObject(selector); - } - - private static Matcher<Object> withToolbarTitle( - final Matcher<CharSequence> textMatcher) { - return new BoundedMatcher<Object, Toolbar>(Toolbar.class) { - @Override - public boolean matchesSafely(Toolbar toolbar) { - return textMatcher.matches(toolbar.getTitle()); - } - - @Override - public void describeTo(Description description) { - description.appendText("with toolbar title: "); - textMatcher.describeTo(description); - } - }; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/clipping/ClipStorageTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/clipping/ClipStorageTest.java deleted file mode 100644 index 73366f871d2c..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/clipping/ClipStorageTest.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.clipping; - -import static com.android.documentsui.clipping.ClipStorage.NUM_OF_SLOTS; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.AsyncTask; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; - -import com.android.documentsui.testing.TestScheduledExecutorService; - -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; - -import java.io.File; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class ClipStorageTest { - private static final String PREF_NAME = "pref"; - private static final List<Uri> TEST_URIS = createList( - "content://ham/fancy", - "content://poodle/monkey/giraffe"); - - @Rule - public TemporaryFolder folder = new TemporaryFolder(); - - private SharedPreferences mPref; - private TestScheduledExecutorService mExecutor; - private ClipStorage mStorage; - - private int mTag; - - @Before - public void setUp() { - mPref = InstrumentationRegistry.getContext().getSharedPreferences(PREF_NAME, 0); - File clipDir = ClipStorage.prepareStorage(folder.getRoot()); - mStorage = new ClipStorage(clipDir, mPref); - - mExecutor = new TestScheduledExecutorService(); - AsyncTask.setDefaultExecutor(mExecutor); - - mTag = mStorage.claimStorageSlot(); - } - - @AfterClass - public static void tearDownOnce() { - AsyncTask.setDefaultExecutor(AsyncTask.SERIAL_EXECUTOR); - } - - @Test - public void testWrite() throws Exception { - writeAll(mTag, TEST_URIS); - } - - @Test - public void testRead() throws Exception { - writeAll(mTag, TEST_URIS); - List<Uri> uris = new ArrayList<>(); - - File copy = mStorage.getFile(mTag); - try(ClipStorageReader provider = mStorage.createReader(copy)) { - for (Uri uri : provider) { - uris.add(uri); - } - } - assertEquals(TEST_URIS, uris); - } - - @Test - public void testClaimStorageSlot_NoAvailableSlot() throws Exception { - int firstTag = mStorage.claimStorageSlot(); - writeAll(firstTag, TEST_URIS); - mStorage.getFile(firstTag); - for (int i = 0; i < NUM_OF_SLOTS - 1; ++i) { - int tag = mStorage.claimStorageSlot(); - writeAll(tag, TEST_URIS); - mStorage.getFile(tag); - } - - assertEquals(firstTag, mStorage.claimStorageSlot()); - } - - @Test - public void testReadConcurrently() throws Exception { - writeAll(mTag, TEST_URIS); - List<Uri> uris = new ArrayList<>(); - List<Uri> uris2 = new ArrayList<>(); - - File copy = mStorage.getFile(mTag); - File copy2 = mStorage.getFile(mTag); - try(ClipStorageReader reader = mStorage.createReader(copy)) { - try(ClipStorageReader reader2 = mStorage.createReader(copy2)){ - Iterator<Uri> iter = reader.iterator(); - Iterator<Uri> iter2 = reader2.iterator(); - - while (iter.hasNext() && iter2.hasNext()) { - uris.add(iter.next()); - uris2.add(iter2.next()); - } - - assertFalse(iter.hasNext()); - assertFalse(iter2.hasNext()); - } - } - assertEquals(TEST_URIS, uris); - assertEquals(TEST_URIS, uris2); - } - - @Test - public void testPrepareStorage_CreatesDir() throws Exception { - File clipDir = ClipStorage.prepareStorage(folder.getRoot()); - assertTrue(clipDir.exists()); - assertTrue(clipDir.isDirectory()); - assertFalse(clipDir.equals(folder.getRoot())); - } - - private void writeAll(int tag, List<Uri> uris) { - new ClipStorage.PersistTask(mStorage, uris, tag).execute(); - mExecutor.runAll(); - } - - private static List<Uri> createList(String... values) { - List<Uri> uris = new ArrayList<>(values.length); - for (int i = 0; i < values.length; i++) { - uris.add(i, Uri.parse(values[i])); - } - return uris; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/clipping/UrisSupplierTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/clipping/UrisSupplierTest.java deleted file mode 100644 index 9815d0e90490..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/clipping/UrisSupplierTest.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.clipping; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; - -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.AsyncTask; -import android.provider.DocumentsContract; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.MediumTest; -import android.support.test.runner.AndroidJUnit4; - -import com.android.documentsui.Shared; -import com.android.documentsui.testing.TestScheduledExecutorService; - -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@MediumTest -public class UrisSupplierTest { - - private static final String PREF_NAME = "pref"; - private static final String AUTHORITY = "foo"; - private static final List<Uri> SHORT_URI_LIST = createList(3); - private static final List<Uri> LONG_URI_LIST = createList(Shared.MAX_DOCS_IN_INTENT + 5); - - @Rule - public TemporaryFolder folder = new TemporaryFolder(); - - private SharedPreferences mPref; - private TestScheduledExecutorService mExecutor; - private ClipStorage mStorage; - - @Before - public void setUp() { - mExecutor = new TestScheduledExecutorService(); - AsyncTask.setDefaultExecutor(mExecutor); - - mPref = InstrumentationRegistry.getContext().getSharedPreferences(PREF_NAME, 0); - mStorage = new ClipStorage(folder.getRoot(), mPref); - } - - @AfterClass - public static void tearDownOnce() { - AsyncTask.setDefaultExecutor(AsyncTask.SERIAL_EXECUTOR); - } - - @Test - public void testItemCountEquals_shortList() throws Exception { - UrisSupplier uris = createWithShortList(); - - assertEquals(SHORT_URI_LIST.size(), uris.getItemCount()); - } - - @Test - public void testItemCountEquals_longList() throws Exception { - UrisSupplier uris = createWithLongList(); - - assertEquals(LONG_URI_LIST.size(), uris.getItemCount()); - } - - @Test - public void testGetDocsEquals_shortList() throws Exception { - UrisSupplier uris = createWithShortList(); - - assertIterableEquals(SHORT_URI_LIST, uris.getUris(mStorage)); - } - - @Test - public void testGetDocsEquals_longList() throws Exception { - UrisSupplier uris = createWithLongList(); - - assertIterableEquals(LONG_URI_LIST, uris.getUris(mStorage)); - } - - @Test - public void testDispose_shortList() throws Exception { - UrisSupplier uris = createWithShortList(); - - uris.dispose(); - } - - @Test - public void testDispose_longList() throws Exception { - UrisSupplier uris = createWithLongList(); - - uris.dispose(); - } - - private UrisSupplier createWithShortList() throws Exception { - return UrisSupplier.create(SHORT_URI_LIST, mStorage); - } - - private UrisSupplier createWithLongList() throws Exception { - UrisSupplier uris = - UrisSupplier.create(LONG_URI_LIST, mStorage); - - mExecutor.runAll(); - - return uris; - } - - private void assertIterableEquals(Iterable<Uri> expected, Iterable<Uri> value) { - Iterator<Uri> expectedIter = expected.iterator(); - Iterator<Uri> valueIter = value.iterator(); - - while (expectedIter.hasNext() && valueIter.hasNext()) { - assertEquals(expectedIter.next(), valueIter.next()); - } - - assertFalse(expectedIter.hasNext()); - assertFalse(expectedIter.hasNext()); - } - - private static List<Uri> createList(int count) { - List<Uri> uris = new ArrayList<>(count); - - for (int i = 0; i < count; ++i) { - uris.add(DocumentsContract.buildDocumentUri(AUTHORITY, Integer.toString(i))); - } - - return uris; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/BandController_GridModelTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/BandController_GridModelTest.java deleted file mode 100644 index 59547adc08e0..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/BandController_GridModelTest.java +++ /dev/null @@ -1,470 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static com.android.documentsui.dirlist.BandController.GridModel.NOT_SET; - -import android.graphics.Point; -import android.graphics.Rect; -import android.support.v7.widget.RecyclerView.OnScrollListener; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -import com.android.documentsui.dirlist.BandController.GridModel; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -@SmallTest -public class BandController_GridModelTest extends AndroidTestCase { - - private static final int VIEW_PADDING_PX = 5; - private static final int CHILD_VIEW_EDGE_PX = 100; - private static final int VIEWPORT_HEIGHT = 500; - - private GridModel model; - private TestEnvironment env; - private TestDocumentsAdapter adapter; - private Set<String> lastSelection; - private int viewWidth; - - // TLDR: Don't call model.{start|resize}Selection; use the local #startSelection and - // #resizeSelection methods instead. - // - // The reason for this is that selection is stateful and involves operations that take the - // current UI state (e.g scrolling) into account. This test maintains its own copy of the - // selection bounds as control data for verifying selections. Keep this data in sync by calling - // #startSelection and - // #resizeSelection. - private Point mSelectionOrigin; - private Point mSelectionPoint; - - private void initData(final int numChildren, int numColumns) { - env = new TestEnvironment(numChildren, numColumns); - adapter = new TestDocumentsAdapter(new ArrayList<String>()) { - @Override - public String getModelId(int position) { - return Integer.toString(position); - } - - @Override - public int getItemCount() { - return numChildren; - } - }; - - viewWidth = VIEW_PADDING_PX + numColumns * (VIEW_PADDING_PX + CHILD_VIEW_EDGE_PX); - model = new GridModel(env, adapter); - model.addOnSelectionChangedListener( - new GridModel.OnSelectionChangedListener() { - @Override - public void onSelectionChanged(Set<String> updatedSelection) { - lastSelection = updatedSelection; - } - - @Override - public boolean onBeforeItemStateChange(String id, boolean nextState) { - return true; - } - }); - } - - @Override - public void tearDown() { - model = null; - env = null; - lastSelection = null; - } - - public void testSelectionLeftOfItems() { - initData(20, 5); - startSelection(new Point(0, 10)); - resizeSelection(new Point(1, 11)); - assertNoSelection(); - assertEquals(NOT_SET, model.getPositionNearestOrigin()); - } - - public void testSelectionRightOfItems() { - initData(20, 4); - startSelection(new Point(viewWidth - 1, 10)); - resizeSelection(new Point(viewWidth - 2, 11)); - assertNoSelection(); - assertEquals(NOT_SET, model.getPositionNearestOrigin()); - } - - public void testSelectionAboveItems() { - initData(20, 4); - startSelection(new Point(10, 0)); - resizeSelection(new Point(11, 1)); - assertNoSelection(); - assertEquals(NOT_SET, model.getPositionNearestOrigin()); - } - - public void testSelectionBelowItems() { - initData(5, 4); - startSelection(new Point(10, VIEWPORT_HEIGHT - 1)); - resizeSelection(new Point(11, VIEWPORT_HEIGHT - 2)); - assertNoSelection(); - assertEquals(NOT_SET, model.getPositionNearestOrigin()); - } - - public void testVerticalSelectionBetweenItems() { - initData(20, 4); - startSelection(new Point(106, 0)); - resizeSelection(new Point(107, 200)); - assertNoSelection(); - assertEquals(NOT_SET, model.getPositionNearestOrigin()); - } - - public void testHorizontalSelectionBetweenItems() { - initData(20, 4); - startSelection(new Point(0, 105)); - resizeSelection(new Point(200, 106)); - assertNoSelection(); - assertEquals(NOT_SET, model.getPositionNearestOrigin()); - } - - public void testGrowingAndShrinkingSelection() { - initData(20, 4); - startSelection(new Point(0, 0)); - - resizeSelection(new Point(5, 5)); - verifySelection(); - - resizeSelection(new Point(109, 109)); - verifySelection(); - - resizeSelection(new Point(110, 109)); - verifySelection(); - - resizeSelection(new Point(110, 110)); - verifySelection(); - - resizeSelection(new Point(214, 214)); - verifySelection(); - - resizeSelection(new Point(215, 214)); - verifySelection(); - - resizeSelection(new Point(214, 214)); - verifySelection(); - - resizeSelection(new Point(110, 110)); - verifySelection(); - - resizeSelection(new Point(110, 109)); - verifySelection(); - - resizeSelection(new Point(109, 109)); - verifySelection(); - - resizeSelection(new Point(5, 5)); - verifySelection(); - - resizeSelection(new Point(0, 0)); - verifySelection(); - - assertEquals(NOT_SET, model.getPositionNearestOrigin()); - } - - public void testSelectionMovingAroundOrigin() { - initData(16, 4); - - startSelection(new Point(210, 210)); - resizeSelection(new Point(viewWidth - 1, 0)); - verifySelection(); - - resizeSelection(new Point(0, 0)); - verifySelection(); - - resizeSelection(new Point(0, 420)); - verifySelection(); - - resizeSelection(new Point(viewWidth - 1, 420)); - verifySelection(); - - // This is manually figured and will need to be adjusted if the separator position is - // changed. - assertEquals(7, model.getPositionNearestOrigin()); - } - - public void testScrollingBandSelect() { - initData(40, 4); - - startSelection(new Point(0, 0)); - resizeSelection(new Point(100, VIEWPORT_HEIGHT - 1)); - verifySelection(); - - scroll(CHILD_VIEW_EDGE_PX); - verifySelection(); - - resizeSelection(new Point(200, VIEWPORT_HEIGHT - 1)); - verifySelection(); - - scroll(CHILD_VIEW_EDGE_PX); - verifySelection(); - - scroll(-2 * CHILD_VIEW_EDGE_PX); - verifySelection(); - - resizeSelection(new Point(100, VIEWPORT_HEIGHT - 1)); - verifySelection(); - - assertEquals(0, model.getPositionNearestOrigin()); - } - - /** Returns the current selection area as a Rect. */ - private Rect getSelectionArea() { - // Construct a rect from the two selection points. - Rect selectionArea = new Rect( - mSelectionOrigin.x, mSelectionOrigin.y, mSelectionOrigin.x, mSelectionOrigin.y); - selectionArea.union(mSelectionPoint.x, mSelectionPoint.y); - // Rect intersection tests are exclusive of bounds, while the MSM's selection code is - // inclusive. Expand the rect by 1 pixel in all directions to account for this. - selectionArea.inset(-1, -1); - - return selectionArea; - } - - /** Asserts that the selection is currently empty. */ - private void assertNoSelection() { - assertEquals("Unexpected items " + lastSelection + " in selection " + getSelectionArea(), - 0, lastSelection.size()); - } - - /** Verifies the selection using actual bbox checks. */ - private void verifySelection() { - Rect selectionArea = getSelectionArea(); - for (TestEnvironment.Item item: env.items) { - if (Rect.intersects(selectionArea, item.rect)) { - assertTrue("Expected item " + item + " was not in selection " + selectionArea, - lastSelection.contains(item.name)); - } else { - assertFalse("Unexpected item " + item + " in selection" + selectionArea, - lastSelection.contains(item.name)); - } - } - } - - private void startSelection(Point p) { - model.startSelection(p); - mSelectionOrigin = env.createAbsolutePoint(p); - } - - private void resizeSelection(Point p) { - model.resizeSelection(p); - mSelectionPoint = env.createAbsolutePoint(p); - } - - private void scroll(int dy) { - assertTrue(env.verticalOffset + VIEWPORT_HEIGHT + dy <= env.getTotalHeight()); - env.verticalOffset += dy; - // Correct the cached selection point as well. - mSelectionPoint.y += dy; - model.onScrolled(null, 0, dy); - } - - private static final class TestEnvironment implements BandController.SelectionEnvironment { - - private final int mNumColumns; - private final int mNumRows; - private final int mNumChildren; - private final int mSeparatorPosition; - - public int horizontalOffset = 0; - public int verticalOffset = 0; - private List<Item> items = new ArrayList<>(); - - public TestEnvironment(int numChildren, int numColumns) { - mNumChildren = numChildren; - mNumColumns = numColumns; - mSeparatorPosition = mNumColumns + 1; - mNumRows = setupGrid(); - } - - private int setupGrid() { - // Split the input set into folders and documents. Do this such that there is a - // partially-populated row in the middle of the grid, to test corner cases in layout - // code. - int y = VIEW_PADDING_PX; - int i = 0; - int numRows = 0; - while (i < mNumChildren) { - int top = y; - int height = CHILD_VIEW_EDGE_PX; - int width = CHILD_VIEW_EDGE_PX; - for (int j = 0; j < mNumColumns && i < mNumChildren; j++) { - int left = VIEW_PADDING_PX + (j * (width + VIEW_PADDING_PX)); - items.add(new Item( - Integer.toString(i), - new Rect( - left, - top, - left + width - 1, - top + height - 1))); - - // Create a partially populated row at the separator position. - if (++i == mSeparatorPosition) { - break; - } - } - y += height + VIEW_PADDING_PX; - numRows++; - } - - return numRows; - } - - private int getTotalHeight() { - return CHILD_VIEW_EDGE_PX * mNumRows + VIEW_PADDING_PX * (mNumRows + 1); - } - - private int getFirstVisibleRowIndex() { - return verticalOffset / (CHILD_VIEW_EDGE_PX + VIEW_PADDING_PX); - } - - private int getLastVisibleRowIndex() { - int lastVisibleRowUncapped = - (VIEWPORT_HEIGHT + verticalOffset - 1) / (CHILD_VIEW_EDGE_PX + VIEW_PADDING_PX); - return Math.min(lastVisibleRowUncapped, mNumRows - 1); - } - - private int getNumItemsInRow(int index) { - assertTrue(index >= 0 && index < mNumRows); - int mod = mSeparatorPosition % mNumColumns; - if (index == (mSeparatorPosition / mNumColumns)) { - // The row containing the separator may be incomplete - return mod > 0 ? mod : mNumColumns; - } - // Account for the partial separator row in the final row tally. - if (index == mNumRows - 1) { - // The last row may be incomplete - int finalRowCount = (mNumChildren - mod) % mNumColumns; - return finalRowCount > 0 ? finalRowCount : mNumColumns; - } - - return mNumColumns; - } - - @Override - public void addOnScrollListener(OnScrollListener listener) {} - - @Override - public void removeOnScrollListener(OnScrollListener listener) {} - - @Override - public Point createAbsolutePoint(Point relativePoint) { - return new Point( - relativePoint.x + horizontalOffset, relativePoint.y + verticalOffset); - } - - @Override - public int getVisibleChildCount() { - int childCount = 0; - for (int i = getFirstVisibleRowIndex(); i <= getLastVisibleRowIndex(); i++) { - childCount += getNumItemsInRow(i); - } - return childCount; - } - - @Override - public int getAdapterPositionAt(int index) { - // Account for partial rows by actually tallying up the items in hidden rows. - int hiddenCount = 0; - for (int i = 0; i < getFirstVisibleRowIndex(); i++) { - hiddenCount += getNumItemsInRow(i); - } - return index + hiddenCount; - } - - @Override - public Rect getAbsoluteRectForChildViewAt(int index) { - int adapterPosition = getAdapterPositionAt(index); - return items.get(adapterPosition).rect; - } - - @Override - public int getChildCount() { - return mNumChildren; - } - - @Override - public int getColumnCount() { - return mNumColumns; - } - - @Override - public void showBand(Rect rect) { - throw new UnsupportedOperationException(); - } - - @Override - public void hideBand() { - throw new UnsupportedOperationException(); - } - - @Override - public void scrollBy(int dy) { - throw new UnsupportedOperationException(); - } - - @Override - public int getHeight() { - throw new UnsupportedOperationException(); - } - - @Override - public void invalidateView() { - throw new UnsupportedOperationException(); - } - - @Override - public void runAtNextFrame(Runnable r) { - throw new UnsupportedOperationException(); - } - - @Override - public void removeCallback(Runnable r) { - throw new UnsupportedOperationException(); - } - - @Override - public boolean isLayoutItem(int adapterPosition) { - return false; - } - - @Override - public boolean hasView(int adapterPosition) { - return true; - } - - public static final class Item { - public String name; - public Rect rect; - - public Item(String n, Rect r) { - name = n; - rect = r; - } - - public String toString() { - return name + ": " + rect; - } - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/DocumentHolderTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/DocumentHolderTest.java deleted file mode 100644 index 949f6b746f47..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/DocumentHolderTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.Context; -import android.database.Cursor; -import android.graphics.Rect; -import android.os.SystemClock; -import android.support.test.filters.Suppress; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.MotionEvent.PointerCoords; -import android.view.MotionEvent.PointerProperties; - -import com.android.documentsui.R; -import com.android.documentsui.State; - -@SmallTest -public class DocumentHolderTest extends AndroidTestCase { - - DocumentHolder mHolder; - TestListener mListener; - - @Override - public void setUp() throws Exception { - Context context = getContext(); - LayoutInflater inflater = LayoutInflater.from(context); - mHolder = new DocumentHolder(getContext(), inflater.inflate(R.layout.item_doc_list, null)) { - @Override - public void bind(Cursor cursor, String modelId, State state) {} - }; - - mListener = new TestListener(); - mHolder.addKeyEventListener(mListener); - - mHolder.itemView.requestLayout(); - mHolder.itemView.invalidate(); - } - - @Suppress - public void testIsInSelectionHotspot() { - fail(); - } - - @Suppress - public void testDelegatesKeyEvents() { - fail(); - } - - public MotionEvent createEvent(int tooltype) { - long time = SystemClock.uptimeMillis(); - - PointerProperties properties[] = new PointerProperties[] { - new PointerProperties() - }; - properties[0].toolType = tooltype; - - PointerCoords coords[] = new PointerCoords[] { - new PointerCoords() - }; - - Rect rect = new Rect(); - mHolder.itemView.getHitRect(rect); - coords[0].x = rect.left; - coords[0].y = rect.top; - - return MotionEvent.obtain( - time, // down time - time, // event time - MotionEvent.ACTION_UP, // action - 1, // pointer count - properties, // pointer properties - coords, // pointer coords - 0, // metastate - 0, // button state - 0, // xprecision - 0, // yprecision - 0, // deviceid - 0, // edgeflags - 0, // source - 0 // flags - ); - } - - private class TestListener implements DocumentHolder.KeyboardEventListener { - @Override - public boolean onKey(DocumentHolder doc, int keyCode, KeyEvent event) { - return false; - } - - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java deleted file mode 100644 index 236621fcee19..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelBackedDocumentsAdapterTest.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.Context; -import android.database.Cursor; -import android.support.v7.widget.RecyclerView; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; -import android.view.ViewGroup; - -import com.android.documentsui.State; - -@SmallTest -public class ModelBackedDocumentsAdapterTest extends AndroidTestCase { - - private static final String AUTHORITY = "test_authority"; - private static final String[] NAMES = new String[] { - "4", - "foo", - "1", - "bar", - "*(Ljifl;a", - "0", - "baz", - "2", - "3", - "%$%VD" - }; - - private TestModel mModel; - private ModelBackedDocumentsAdapter mAdapter; - - public void setUp() { - - final Context testContext = TestContext.createStorageTestContext(getContext(), AUTHORITY); - mModel = new TestModel(AUTHORITY); - mModel.update(NAMES); - - DocumentsAdapter.Environment env = new TestEnvironment(testContext); - - mAdapter = new ModelBackedDocumentsAdapter( - env, new IconHelper(testContext, State.MODE_GRID)); - mAdapter.onModelUpdate(mModel); - } - - // Tests that the item count is correct. - public void testItemCount() { - assertEquals(mModel.getItemCount(), mAdapter.getItemCount()); - } - - private final class TestEnvironment implements DocumentsAdapter.Environment { - private final Context testContext; - - private TestEnvironment(Context testContext) { - this.testContext = testContext; - } - - @Override - public boolean isSelected(String id) { - return false; - } - - @Override - public boolean isDocumentEnabled(String mimeType, int flags) { - return true; - } - - @Override - public void initDocumentHolder(DocumentHolder holder) {} - - @Override - public Model getModel() { - return mModel; - } - - @Override - public State getDisplayState() { - return null; - } - - @Override - public Context getContext() { - return testContext; - } - - @Override - public int getColumnCount() { - return 4; - } - - @Override - public void onBindDocumentHolder(DocumentHolder holder, Cursor cursor) {} - } - - private static class DummyListener implements Model.UpdateListener { - public void onModelUpdate(Model model) {} - public void onModelUpdateFailed(Exception e) {} - } - - private static class DummyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { - public int getItemCount() { return 0; } - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {} - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return null; - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelTest.java deleted file mode 100644 index b816287fcc47..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ModelTest.java +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.ContentResolver; -import android.content.Context; -import android.content.ContextWrapper; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.database.MergeCursor; -import android.provider.DocumentsContract.Document; -import android.test.AndroidTestCase; -import android.test.mock.MockContentResolver; -import android.test.suitebuilder.annotation.SmallTest; - -import com.android.documentsui.DirectoryResult; -import com.android.documentsui.RootCursorWrapper; -import com.android.documentsui.Shared; -import com.android.documentsui.State; -import com.android.documentsui.dirlist.MultiSelectManager.Selection; -import com.android.documentsui.model.DocumentInfo; - -import java.util.ArrayList; -import java.util.BitSet; -import java.util.HashSet; -import java.util.List; -import java.util.Random; -import java.util.Set; - -@SmallTest -public class ModelTest extends AndroidTestCase { - - private static final int ITEM_COUNT = 10; - private static final String AUTHORITY = "test_authority"; - - private static final String[] COLUMNS = new String[]{ - RootCursorWrapper.COLUMN_AUTHORITY, - Document.COLUMN_DOCUMENT_ID, - Document.COLUMN_FLAGS, - Document.COLUMN_DISPLAY_NAME, - Document.COLUMN_SIZE, - Document.COLUMN_LAST_MODIFIED, - Document.COLUMN_MIME_TYPE - }; - - private static final String[] NAMES = new String[] { - "4", - "foo", - "1", - "bar", - "*(Ljifl;a", - "0", - "baz", - "2", - "3", - "%$%VD" - }; - - private Cursor cursor; - private Context context; - private Model model; - private TestContentProvider provider; - - public void setUp() { - setupTestContext(); - - Random rand = new Random(); - - MatrixCursor c = new MatrixCursor(COLUMNS); - for (int i = 0; i < ITEM_COUNT; ++i) { - MatrixCursor.RowBuilder row = c.newRow(); - row.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY); - row.add(Document.COLUMN_DOCUMENT_ID, Integer.toString(i)); - row.add(Document.COLUMN_FLAGS, Document.FLAG_SUPPORTS_DELETE); - // Generate random document names and sizes. This forces the model's internal sort code - // to actually do something. - row.add(Document.COLUMN_DISPLAY_NAME, NAMES[i]); - row.add(Document.COLUMN_SIZE, rand.nextInt()); - } - cursor = c; - - DirectoryResult r = new DirectoryResult(); - r.cursor = cursor; - - // Instantiate the model with a dummy view adapter and listener that (for now) do nothing. - model = new Model(); - model.addUpdateListener(new DummyListener()); - model.update(r); - } - - // Tests that the model is properly emptied out after a null update. - public void testNullUpdate() { - model.update(null); - - assertTrue(model.isEmpty()); - assertEquals(0, model.getItemCount()); - assertEquals(0, model.getModelIds().length); - } - - // Tests that the item count is correct. - public void testItemCount() { - assertEquals(ITEM_COUNT, model.getItemCount()); - } - - // Tests multiple authorities with clashing document IDs. - public void testModelIdIsUnique() { - MatrixCursor cIn1 = new MatrixCursor(COLUMNS); - MatrixCursor cIn2 = new MatrixCursor(COLUMNS); - - // Make two sets of items with the same IDs, under different authorities. - final String AUTHORITY0 = "auth0"; - final String AUTHORITY1 = "auth1"; - - for (int i = 0; i < ITEM_COUNT; ++i) { - MatrixCursor.RowBuilder row0 = cIn1.newRow(); - row0.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY0); - row0.add(Document.COLUMN_DOCUMENT_ID, Integer.toString(i)); - - MatrixCursor.RowBuilder row1 = cIn2.newRow(); - row1.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY1); - row1.add(Document.COLUMN_DOCUMENT_ID, Integer.toString(i)); - } - - Cursor cIn = new MergeCursor(new Cursor[] { cIn1, cIn2 }); - - // Update the model, then make sure it contains all the expected items. - DirectoryResult r = new DirectoryResult(); - r.cursor = cIn; - model.update(r); - - assertEquals(ITEM_COUNT * 2, model.getItemCount()); - BitSet b0 = new BitSet(ITEM_COUNT); - BitSet b1 = new BitSet(ITEM_COUNT); - - for (String id: model.getModelIds()) { - Cursor cOut = model.getItem(id); - String authority = - DocumentInfo.getCursorString(cOut, RootCursorWrapper.COLUMN_AUTHORITY); - String docId = DocumentInfo.getCursorString(cOut, Document.COLUMN_DOCUMENT_ID); - - switch (authority) { - case AUTHORITY0: - b0.set(Integer.parseInt(docId)); - break; - case AUTHORITY1: - b1.set(Integer.parseInt(docId)); - break; - default: - fail("Unrecognized authority string"); - } - } - - assertEquals(ITEM_COUNT, b0.cardinality()); - assertEquals(ITEM_COUNT, b1.cardinality()); - } - - // Tests the base case for Model.getItem. - public void testGetItem() { - String[] ids = model.getModelIds(); - assertEquals(ITEM_COUNT, ids.length); - for (int i = 0; i < ITEM_COUNT; ++i) { - Cursor c = model.getItem(ids[i]); - assertEquals(i, c.getPosition()); - } - } - - // Tests sorting by item name. - public void testSort_names() { - BitSet seen = new BitSet(ITEM_COUNT); - List<String> names = new ArrayList<>(); - - DirectoryResult r = new DirectoryResult(); - r.cursor = cursor; - r.sortOrder = State.SORT_ORDER_DISPLAY_NAME; - model.update(r); - - for (String id: model.getModelIds()) { - Cursor c = model.getItem(id); - seen.set(c.getPosition()); - names.add(DocumentInfo.getCursorString(c, Document.COLUMN_DISPLAY_NAME)); - } - - assertEquals(ITEM_COUNT, seen.cardinality()); - for (int i = 0; i < names.size()-1; ++i) { - assertTrue(Shared.compareToIgnoreCaseNullable(names.get(i), names.get(i+1)) <= 0); - } - } - - // Tests sorting by item size. - public void testSort_sizes() { - DirectoryResult r = new DirectoryResult(); - r.cursor = cursor; - r.sortOrder = State.SORT_ORDER_SIZE; - model.update(r); - - BitSet seen = new BitSet(ITEM_COUNT); - int previousSize = Integer.MAX_VALUE; - for (String id: model.getModelIds()) { - Cursor c = model.getItem(id); - seen.set(c.getPosition()); - // Check sort order - descending numerical - int size = DocumentInfo.getCursorInt(c, Document.COLUMN_SIZE); - assertTrue(previousSize >= size); - previousSize = size; - } - // Check that all items were accounted for. - assertEquals(ITEM_COUNT, seen.cardinality()); - } - - // Tests that directories and files are properly bucketed when sorting by size - public void testSort_sizesWithBucketing() { - MatrixCursor c = new MatrixCursor(COLUMNS); - - for (int i = 0; i < ITEM_COUNT; ++i) { - MatrixCursor.RowBuilder row = c.newRow(); - row.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY); - row.add(Document.COLUMN_DOCUMENT_ID, Integer.toString(i)); - row.add(Document.COLUMN_SIZE, i); - // Interleave directories and text files. - String mimeType =(i % 2 == 0) ? Document.MIME_TYPE_DIR : "text/*"; - row.add(Document.COLUMN_MIME_TYPE, mimeType); - } - - DirectoryResult r = new DirectoryResult(); - r.cursor = c; - r.sortOrder = State.SORT_ORDER_SIZE; - model.update(r); - - boolean seenAllDirs = false; - int previousSize = Integer.MAX_VALUE; - BitSet seen = new BitSet(ITEM_COUNT); - // Iterate over items in sort order. Once we've encountered a document (i.e. not a - // directory), all subsequent items must also be documents. That is, all directories are - // bucketed at the front of the list, sorted by size, followed by documents, sorted by size. - for (String id: model.getModelIds()) { - Cursor cOut = model.getItem(id); - seen.set(cOut.getPosition()); - - String mimeType = DocumentInfo.getCursorString(cOut, Document.COLUMN_MIME_TYPE); - if (seenAllDirs) { - assertFalse(Document.MIME_TYPE_DIR.equals(mimeType)); - } else { - if (!Document.MIME_TYPE_DIR.equals(mimeType)) { - seenAllDirs = true; - // Reset the previous size seen, because documents are bucketed separately by - // the sort. - previousSize = Integer.MAX_VALUE; - } - } - // Check sort order - descending numerical - int size = DocumentInfo.getCursorInt(c, Document.COLUMN_SIZE); - assertTrue(previousSize >= size); - previousSize = size; - } - - // Check that all items were accounted for. - assertEquals(ITEM_COUNT, seen.cardinality()); - } - - public void testSort_time() { - final int DL_COUNT = 3; - MatrixCursor c = new MatrixCursor(COLUMNS); - Set<String> currentDownloads = new HashSet<>(); - - // Add some files - for (int i = 0; i < ITEM_COUNT; i++) { - MatrixCursor.RowBuilder row = c.newRow(); - row.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY); - row.add(Document.COLUMN_DOCUMENT_ID, Integer.toString(i)); - row.add(Document.COLUMN_LAST_MODIFIED, System.currentTimeMillis()); - } - // Add some current downloads (no timestamp) - for (int i = ITEM_COUNT; i < ITEM_COUNT + DL_COUNT; i++) { - MatrixCursor.RowBuilder row = c.newRow(); - String id = Integer.toString(i); - row.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY); - row.add(Document.COLUMN_DOCUMENT_ID, id); - currentDownloads.add(id); - } - - DirectoryResult r = new DirectoryResult(); - r.cursor = c; - r.sortOrder = State.SORT_ORDER_LAST_MODIFIED; - model.update(r); - - String[] ids = model.getModelIds(); - - // Check that all items were accounted for - assertEquals(ITEM_COUNT + DL_COUNT, ids.length); - - // Check that active downloads are sorted to the top. - for (int i = 0; i < DL_COUNT; i++) { - assertTrue(currentDownloads.contains(ids[i])); - } - } - - private void setupTestContext() { - final MockContentResolver resolver = new MockContentResolver(); - context = new ContextWrapper(getContext()) { - @Override - public ContentResolver getContentResolver() { - return resolver; - } - }; - provider = new TestContentProvider(); - resolver.addProvider(AUTHORITY, provider); - } - - private Selection positionToSelection(int... positions) { - String[] ids = model.getModelIds(); - Selection s = new Selection(); - // Construct a selection of the given positions. - for (int p: positions) { - s.add(ids[p]); - } - return s; - } - - private static class DummyListener implements Model.UpdateListener { - public void onModelUpdate(Model model) {} - public void onModelUpdateFailed(Exception e) {} - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java deleted file mode 100644 index 57b9f926af47..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManagerTest.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; -import android.util.SparseBooleanArray; - -import com.android.documentsui.dirlist.MultiSelectManager.Selection; -import com.android.documentsui.testing.dirlist.SelectionProbe; -import com.android.documentsui.testing.dirlist.TestSelectionListener; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -@SmallTest -public class MultiSelectManagerTest extends AndroidTestCase { - - private static final List<String> ITEMS = TestData.create(100); - - private MultiSelectManager mManager; - private TestSelectionListener mCallback; - private TestDocumentsAdapter mAdapter; - private SelectionProbe mSelection; - - @Override - public void setUp() throws Exception { - mCallback = new TestSelectionListener(); - mAdapter = new TestDocumentsAdapter(ITEMS); - mManager = new MultiSelectManager(mAdapter, MultiSelectManager.MODE_MULTIPLE); - mManager.addCallback(mCallback); - - mSelection = new SelectionProbe(mManager); - } - - public void testSelection() { - // Check selection. - mManager.toggleSelection(ITEMS.get(7)); - mSelection.assertSelection(7); - // Check deselection. - mManager.toggleSelection(ITEMS.get(7)); - mSelection.assertNoSelection(); - } - - public void testSelection_NotifiesSelectionChanged() { - // Selection should notify. - mManager.toggleSelection(ITEMS.get(7)); - mCallback.assertSelectionChanged(); - // Deselection should notify. - mManager.toggleSelection(ITEMS.get(7)); - mCallback.assertSelectionChanged(); - } - - public void testRangeSelection() { - mManager.startRangeSelection(15); - mManager.snapRangeSelection(19); - mSelection.assertRangeSelection(15, 19); - } - - public void testRangeSelection_snapExpand() { - mManager.startRangeSelection(15); - mManager.snapRangeSelection(19); - mManager.snapRangeSelection(27); - mSelection.assertRangeSelection(15, 27); - } - - public void testRangeSelection_snapContract() { - mManager.startRangeSelection(15); - mManager.snapRangeSelection(27); - mManager.snapRangeSelection(19); - mSelection.assertRangeSelection(15, 19); - } - - public void testRangeSelection_snapInvert() { - mManager.startRangeSelection(15); - mManager.snapRangeSelection(27); - mManager.snapRangeSelection(3); - mSelection.assertRangeSelection(3, 15); - } - - public void testRangeSelection_multiple() { - mManager.startRangeSelection(15); - mManager.snapRangeSelection(27); - mManager.endRangeSelection(); - mManager.startRangeSelection(42); - mManager.snapRangeSelection(57); - mSelection.assertSelectionSize(29); - mSelection.assertRangeSelected(15, 27); - mSelection.assertRangeSelected(42, 57); - - } - - public void testProvisionalSelection() { - Selection s = mManager.getSelection(); - mSelection.assertNoSelection(); - - SparseBooleanArray provisional = new SparseBooleanArray(); - provisional.append(1, true); - provisional.append(2, true); - s.setProvisionalSelection(getItemIds(provisional)); - mSelection.assertSelection(1, 2); - } - - public void testProvisionalSelection_Replace() { - Selection s = mManager.getSelection(); - - SparseBooleanArray provisional = new SparseBooleanArray(); - provisional.append(1, true); - provisional.append(2, true); - s.setProvisionalSelection(getItemIds(provisional)); - - provisional.clear(); - provisional.append(3, true); - provisional.append(4, true); - s.setProvisionalSelection(getItemIds(provisional)); - mSelection.assertSelection(3, 4); - } - - public void testProvisionalSelection_IntersectsExistingProvisionalSelection() { - Selection s = mManager.getSelection(); - - SparseBooleanArray provisional = new SparseBooleanArray(); - provisional.append(1, true); - provisional.append(2, true); - s.setProvisionalSelection(getItemIds(provisional)); - - provisional.clear(); - provisional.append(1, true); - s.setProvisionalSelection(getItemIds(provisional)); - mSelection.assertSelection(1); - } - - public void testProvisionalSelection_Apply() { - Selection s = mManager.getSelection(); - - SparseBooleanArray provisional = new SparseBooleanArray(); - provisional.append(1, true); - provisional.append(2, true); - s.setProvisionalSelection(getItemIds(provisional)); - s.applyProvisionalSelection(); - mSelection.assertSelection(1, 2); - } - - public void testProvisionalSelection_Cancel() { - mManager.toggleSelection(ITEMS.get(1)); - mManager.toggleSelection(ITEMS.get(2)); - Selection s = mManager.getSelection(); - - SparseBooleanArray provisional = new SparseBooleanArray(); - provisional.append(3, true); - provisional.append(4, true); - s.setProvisionalSelection(getItemIds(provisional)); - s.cancelProvisionalSelection(); - - // Original selection should remain. - mSelection.assertSelection(1, 2); - } - - public void testProvisionalSelection_IntersectsAppliedSelection() { - mManager.toggleSelection(ITEMS.get(1)); - mManager.toggleSelection(ITEMS.get(2)); - Selection s = mManager.getSelection(); - - SparseBooleanArray provisional = new SparseBooleanArray(); - provisional.append(2, true); - provisional.append(3, true); - s.setProvisionalSelection(getItemIds(provisional)); - mSelection.assertSelection(1, 2, 3); - } - - private static Set<String> getItemIds(SparseBooleanArray selection) { - Set<String> ids = new HashSet<>(); - - int count = selection.size(); - for (int i = 0; i < count; ++i) { - ids.add(ITEMS.get(selection.keyAt(i))); - } - - return ids; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SelectionTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SelectionTest.java deleted file mode 100644 index 444b2dc8e383..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SelectionTest.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -import com.android.documentsui.dirlist.MultiSelectManager.Selection; -import com.google.common.collect.Sets; - -import java.util.HashSet; -import java.util.Set; - -@SmallTest -public class MultiSelectManager_SelectionTest extends AndroidTestCase { - - private Selection selection; - - private String[] ids = new String[]{ - "foo", - "43", - "auth|id=@53di*/f3#d" - }; - - @Override - public void setUp() throws Exception { - selection = new Selection(); - selection.add(ids[0]); - selection.add(ids[1]); - selection.add(ids[2]); - } - - public void testAdd() { - // We added in setUp. - assertEquals(3, selection.size()); - assertContains(ids[0]); - assertContains(ids[1]); - assertContains(ids[2]); - } - - public void testRemove() { - selection.remove(ids[0]); - selection.remove(ids[2]); - assertEquals(1, selection.size()); - assertContains(ids[1]); - } - - public void testClear() { - selection.clear(); - assertEquals(0, selection.size()); - } - - public void testIsEmpty() { - assertTrue(new Selection().isEmpty()); - selection.clear(); - assertTrue(selection.isEmpty()); - } - - public void testSize() { - Selection other = new Selection(); - for (int i = 0; i < selection.size(); i++) { - other.add(ids[i]); - } - assertEquals(selection.size(), other.size()); - } - - public void testEqualsSelf() { - assertEquals(selection, selection); - } - - public void testEqualsOther() { - Selection other = new Selection(); - other.add(ids[0]); - other.add(ids[1]); - other.add(ids[2]); - assertEquals(selection, other); - assertEquals(selection.hashCode(), other.hashCode()); - } - - public void testEqualsCopy() { - Selection other = new Selection(); - other.copyFrom(selection); - assertEquals(selection, other); - assertEquals(selection.hashCode(), other.hashCode()); - } - - public void testNotEquals() { - Selection other = new Selection(); - other.add("foobar"); - assertFalse(selection.equals(other)); - } - - public void testIntersection_empty0() { - Selection testSelection = new Selection(); - testSelection.intersect(new HashSet<String>()); - assertTrue(testSelection.isEmpty()); - } - - public void testIntersection_empty1() { - Selection testSelection = new Selection(); - testSelection.intersect(Sets.newHashSet("foo")); - assertTrue(testSelection.isEmpty()); - } - - public void testIntersection_empty2() { - assertFalse(selection.isEmpty()); - selection.intersect(new HashSet<String>()); - assertTrue(selection.isEmpty()); - } - - public void testIntersection_exclusive() { - String[] ids0 = new String[]{"foo", "bar", "baz"}; - String[] ids1 = new String[]{"0", "1", "2"}; - - Selection testSelection = new Selection(); - testSelection.add(ids0[0]); - testSelection.add(ids0[1]); - testSelection.add(ids0[2]); - - Set<String> set = Sets.newHashSet(ids1); - testSelection.intersect(set); - - assertTrue(testSelection.isEmpty()); - } - - public void testIntersection_subset() { - String[] ids0 = new String[]{"foo", "bar", "baz"}; - String[] ids1 = new String[]{"0", "baz", "1", "foo", "2"}; - - Selection testSelection = new Selection(); - testSelection.add(ids0[0]); - testSelection.add(ids0[1]); - testSelection.add(ids0[2]); - - testSelection.intersect(Sets.newHashSet(ids1)); - - assertTrue(testSelection.contains("foo")); - assertFalse(testSelection.contains("bar")); - assertTrue(testSelection.contains("baz")); - } - - public void testIntersection_all() { - String[] ids0 = new String[]{"foo", "bar", "baz"}; - String[] ids1 = new String[]{"0", "baz", "1", "foo", "2", "bar"}; - - Selection testSelection = new Selection(); - testSelection.add(ids0[0]); - testSelection.add(ids0[1]); - testSelection.add(ids0[2]); - - Selection control = new Selection(); - control.copyFrom(testSelection); - - testSelection.intersect(Sets.newHashSet(ids1)); - - assertTrue(testSelection.equals(control)); - } - - private void assertContains(String id) { - String err = String.format("Selection %s does not contain %s", selection, id); - assertTrue(err, selection.contains(id)); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SingleSelectTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SingleSelectTest.java deleted file mode 100644 index 62cb1b05fa55..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/MultiSelectManager_SingleSelectTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -import com.android.documentsui.testing.dirlist.SelectionProbe; -import com.android.documentsui.testing.dirlist.TestSelectionListener; - -import java.util.List; - -@SmallTest -public class MultiSelectManager_SingleSelectTest extends AndroidTestCase { - - private static final List<String> ITEMS = TestData.create(100); - - private MultiSelectManager mManager; - private TestSelectionListener mCallback; - private TestDocumentsAdapter mAdapter; - private SelectionProbe mSelection; - - @Override - public void setUp() throws Exception { - mCallback = new TestSelectionListener(); - mAdapter = new TestDocumentsAdapter(ITEMS); - mManager = new MultiSelectManager(mAdapter, MultiSelectManager.MODE_SINGLE); - mManager.addCallback(mCallback); - - mSelection = new SelectionProbe(mManager); - } - - public void testSimpleSelect() { - mManager.toggleSelection(ITEMS.get(3)); - mManager.toggleSelection(ITEMS.get(4)); - mCallback.assertSelectionChanged(); - mSelection.assertSelection(4); - } - - public void testRangeSelectionNotEstablished() { - mManager.toggleSelection(ITEMS.get(3)); - mCallback.reset(); - - try { - mManager.snapRangeSelection(10); - fail("Should have thrown."); - } catch (Exception expected) {} - - mCallback.assertSelectionUnchanged(); - mSelection.assertSelection(3); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapperTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapperTest.java deleted file mode 100644 index 7c324e77242c..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/SectionBreakDocumentsAdapterWrapperTest.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.Context; -import android.database.Cursor; -import android.database.MatrixCursor; -import android.provider.DocumentsContract.Document; -import android.support.v7.widget.RecyclerView; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; -import android.view.ViewGroup; - -import com.android.documentsui.DirectoryResult; -import com.android.documentsui.RootCursorWrapper; -import com.android.documentsui.State; - -@SmallTest -public class SectionBreakDocumentsAdapterWrapperTest extends AndroidTestCase { - - private static final String AUTHORITY = "test_authority"; - private static final String[] NAMES = new String[] { - "4", - "foo", - "1", - "bar", - "*(Ljifl;a", - "0", - "baz", - "2", - "3", - "%$%VD" - }; - - private TestModel mModel; - private SectionBreakDocumentsAdapterWrapper mAdapter; - - public void setUp() { - - final Context testContext = TestContext.createStorageTestContext(getContext(), AUTHORITY); - DocumentsAdapter.Environment env = new TestEnvironment(testContext); - - mModel = new TestModel(AUTHORITY); - mAdapter = new SectionBreakDocumentsAdapterWrapper( - env, - new ModelBackedDocumentsAdapter( - env, new IconHelper(testContext, State.MODE_GRID))); - - mModel.addUpdateListener(mAdapter); - } - - // Tests that the item count is correct for a directory containing only subdirs. - public void testItemCount_allDirs() { - MatrixCursor c = new MatrixCursor(TestModel.COLUMNS); - - for (int i = 0; i < 5; ++i) { - MatrixCursor.RowBuilder row = c.newRow(); - row.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY); - row.add(Document.COLUMN_DOCUMENT_ID, Integer.toString(i)); - row.add(Document.COLUMN_SIZE, i); - row.add(Document.COLUMN_MIME_TYPE, Document.MIME_TYPE_DIR); - } - DirectoryResult r = new DirectoryResult(); - r.cursor = c; - r.sortOrder = State.SORT_ORDER_SIZE; - mModel.update(r); - - assertEquals(mModel.getItemCount(), mAdapter.getItemCount()); - } - - // Tests that the item count is correct for a directory containing only files. - public void testItemCount_allFiles() { - mModel.update(NAMES); - assertEquals(mModel.getItemCount(), mAdapter.getItemCount()); - } - - // Tests that the item count is correct for a directory containing files and subdirs. - public void testItemCount_mixed() { - MatrixCursor c = new MatrixCursor(TestModel.COLUMNS); - - for (int i = 0; i < 5; ++i) { - MatrixCursor.RowBuilder row = c.newRow(); - row.add(RootCursorWrapper.COLUMN_AUTHORITY, AUTHORITY); - row.add(Document.COLUMN_DOCUMENT_ID, Integer.toString(i)); - row.add(Document.COLUMN_SIZE, i); - String mimeType =(i < 2) ? Document.MIME_TYPE_DIR : "text/*"; - row.add(Document.COLUMN_MIME_TYPE, mimeType); - } - DirectoryResult r = new DirectoryResult(); - r.cursor = c; - r.sortOrder = State.SORT_ORDER_SIZE; - mModel.update(r); - - assertEquals(mModel.getItemCount() + 1, mAdapter.getItemCount()); - } - - private final class TestEnvironment implements DocumentsAdapter.Environment { - private final Context testContext; - - private TestEnvironment(Context testContext) { - this.testContext = testContext; - } - - @Override - public boolean isSelected(String id) { - return false; - } - - @Override - public boolean isDocumentEnabled(String mimeType, int flags) { - return true; - } - - @Override - public void initDocumentHolder(DocumentHolder holder) {} - - @Override - public Model getModel() { - return mModel; - } - - @Override - public State getDisplayState() { - return null; - } - - @Override - public Context getContext() { - return testContext; - } - - @Override - public int getColumnCount() { - return 4; - } - - @Override - public void onBindDocumentHolder(DocumentHolder holder, Cursor cursor) {} - } - - private static class DummyListener implements Model.UpdateListener { - public void onModelUpdate(Model model) {} - public void onModelUpdateFailed(Exception e) {} - } - - private static class DummyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { - public int getItemCount() { return 0; } - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {} - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return null; - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestContentProvider.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestContentProvider.java deleted file mode 100644 index c8d424f10eae..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestContentProvider.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.net.Uri; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.test.mock.MockContentProvider; - -import com.android.documentsui.model.DocumentInfo; - -import java.util.ArrayList; -import java.util.List; - -/** - * A very simple test double for ContentProvider. Useful in this package only. - */ -class TestContentProvider extends MockContentProvider { - List<Uri> mDeleted = new ArrayList<>(); - - @Override - public Bundle call(String method, String arg, Bundle extras) { - // Intercept and log delete method calls. - if (DocumentsContract.METHOD_DELETE_DOCUMENT.equals(method)) { - final Uri documentUri = extras.getParcelable(DocumentsContract.EXTRA_URI); - mDeleted.add(documentUri); - return new Bundle(); - } else { - return super.call(method, arg, extras); - } - } - - public void assertWasDeleted(DocumentInfo doc) { - ModelTest.assertTrue(mDeleted.contains(doc.derivedUri)); - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestContext.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestContext.java deleted file mode 100644 index 714062d5007c..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestContext.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.content.ContentResolver; -import android.content.Context; -import android.content.ContextWrapper; -import android.test.mock.MockContentResolver; - -public final class TestContext { - - /** - * Returns a Context configured with test provider for authority. - */ - static Context createStorageTestContext(Context context, String authority) { - final MockContentResolver testResolver = new MockContentResolver(); - TestContentProvider provider = new TestContentProvider(); - testResolver.addProvider(authority, provider); - - return new ContextWrapper(context) { - @Override - public ContentResolver getContentResolver() { - return testResolver; - } - }; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestData.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestData.java deleted file mode 100644 index 5c1d987d45f0..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestData.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import java.util.ArrayList; -import java.util.List; - -public class TestData { - public static List<String> create(int num) { - List<String> items = new ArrayList<String>(num); - for (int i = 0; i < num; ++i) { - items.add(Integer.toString(i)); - } - return items; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestDocumentsAdapter.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestDocumentsAdapter.java deleted file mode 100644 index 4df0fa113cd1..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestDocumentsAdapter.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.view.ViewGroup; - -import java.util.ArrayList; -import java.util.List; - -/** - * A skeletal {@link DocumentsAdapter} test double. - */ -public class TestDocumentsAdapter extends DocumentsAdapter { - - List<String> mModelIds = new ArrayList<>(); - - public TestDocumentsAdapter(List<String> modelIds) { - mModelIds = modelIds; - } - - @Override - public void onModelUpdate(Model model) { - } - - @Override - public void onModelUpdateFailed(Exception e) { - } - - @Override - List<String> getModelIds() { - return mModelIds; - } - - @Override - void onItemSelectionChanged(String id) { - } - - @Override - String getModelId(int position) { - return mModelIds.get(position); - } - - @Override - public DocumentHolder onCreateViewHolder(ViewGroup parent, int viewType) { - throw new UnsupportedOperationException(); - } - - @Override - public void onBindViewHolder(DocumentHolder holder, int position) { - throw new UnsupportedOperationException(); - } - - @Override - public int getItemCount() { - return mModelIds.size(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestFocusHandler.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestFocusHandler.java deleted file mode 100644 index 0585b9fd7afb..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestFocusHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.view.KeyEvent; -import android.view.View; - -/** - * A purely dummy instance of FocusHandler. - */ -public final class TestFocusHandler implements FocusHandler { - - @Override - public boolean handleKey(DocumentHolder doc, int keyCode, KeyEvent event) { - return false; - } - - @Override - public void onFocusChange(View v, boolean hasFocus) { - } - - @Override - public void restoreLastFocus() { - } - - @Override - public int getFocusPosition() { - return 0; - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestModel.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestModel.java deleted file mode 100644 index 2d819ffcdf07..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestModel.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.database.MatrixCursor; -import android.provider.DocumentsContract.Document; - -import com.android.documentsui.DirectoryResult; -import com.android.documentsui.RootCursorWrapper; - -import java.util.Random; - -public class TestModel extends Model { - - static final String[] COLUMNS = new String[]{ - RootCursorWrapper.COLUMN_AUTHORITY, - Document.COLUMN_DOCUMENT_ID, - Document.COLUMN_FLAGS, - Document.COLUMN_DISPLAY_NAME, - Document.COLUMN_SIZE, - Document.COLUMN_MIME_TYPE - }; - - private final String mAuthority; - - public TestModel(String authority) { - super(); - mAuthority = authority; - } - - void update(String... names) { - Random rand = new Random(); - - MatrixCursor c = new MatrixCursor(COLUMNS); - for (int i = 0; i < names.length; i++) { - MatrixCursor.RowBuilder row = c.newRow(); - row.add(RootCursorWrapper.COLUMN_AUTHORITY, mAuthority); - row.add(Document.COLUMN_DOCUMENT_ID, Integer.toString(i)); - row.add(Document.COLUMN_FLAGS, Document.FLAG_SUPPORTS_DELETE); - // Generate random document names and sizes. This forces the model's internal sort code - // to actually do something. - row.add(Document.COLUMN_DISPLAY_NAME, names[i]); - row.add(Document.COLUMN_SIZE, rand.nextInt()); - } - - DirectoryResult r = new DirectoryResult(); - r.cursor = c; - update(r); - } - - String idForPosition(int p) { - return Integer.toString(p); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestSelectionEnvironment.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestSelectionEnvironment.java deleted file mode 100644 index b69787c697ce..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/TestSelectionEnvironment.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.graphics.Point; -import android.graphics.Rect; -import android.support.v7.widget.RecyclerView.OnScrollListener; - -import com.android.documentsui.dirlist.BandController.SelectionEnvironment; - -import java.util.List; - -public class TestSelectionEnvironment implements SelectionEnvironment { - - public TestSelectionEnvironment(List<String> items) { - } - - @Override - public void showBand(Rect rect) { - } - - @Override - public void hideBand() { - } - - @Override - public void addOnScrollListener(OnScrollListener listener) { - } - - @Override - public void removeOnScrollListener(OnScrollListener listener) { - } - - @Override - public void scrollBy(int dy) { - } - - @Override - public int getHeight() { - return 0; - } - - @Override - public void invalidateView() { - } - - @Override - public void runAtNextFrame(Runnable r) { - } - - @Override - public void removeCallback(Runnable r) { - } - - @Override - public Point createAbsolutePoint(Point relativePoint) { - return null; - } - - @Override - public Rect getAbsoluteRectForChildViewAt(int index) { - return null; - } - - @Override - public int getAdapterPositionAt(int index) { - return 0; - } - - @Override - public int getColumnCount() { - return 0; - } - - @Override - public int getChildCount() { - return 0; - } - - @Override - public int getVisibleChildCount() { - return 0; - } - - @Override - public boolean isLayoutItem(int adapterPosition) { - return false; - } - - @Override - public boolean hasView(int adapterPosition) { - return true; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/UserInputHandler_MouseTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/UserInputHandler_MouseTest.java deleted file mode 100644 index 4c34546a82b6..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/UserInputHandler_MouseTest.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.v7.widget.RecyclerView; -import android.view.MotionEvent; - -import com.android.documentsui.Events.InputEvent; -import com.android.documentsui.dirlist.UserInputHandler.DocumentDetails; -import com.android.documentsui.testing.TestEvent; -import com.android.documentsui.testing.TestEvent.Builder; -import com.android.documentsui.testing.TestPredicate; -import com.android.documentsui.testing.dirlist.SelectionProbe; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class UserInputHandler_MouseTest { - - private static final List<String> ITEMS = TestData.create(100); - - private UserInputHandler<TestEvent> mInputHandler; - - private TestDocumentsAdapter mAdapter; - private SelectionProbe mSelection; - private TestPredicate<DocumentDetails> mCanSelect; - private TestPredicate<InputEvent> mRightClickHandler; - private TestPredicate<DocumentDetails> mActivateHandler; - private TestPredicate<DocumentDetails> mDeleteHandler; - - private Builder mEvent; - - @Before - public void setUp() { - - mAdapter = new TestDocumentsAdapter(ITEMS); - MultiSelectManager selectionMgr = - new MultiSelectManager(mAdapter, MultiSelectManager.MODE_MULTIPLE); - - mSelection = new SelectionProbe(selectionMgr); - mCanSelect = new TestPredicate<>(); - mRightClickHandler = new TestPredicate<>(); - mActivateHandler = new TestPredicate<>(); - mDeleteHandler = new TestPredicate<>(); - - mInputHandler = new UserInputHandler<>( - selectionMgr, - new TestFocusHandler(), - (MotionEvent event) -> { - throw new UnsupportedOperationException("Not exercised in tests."); - }, - (TestEvent event) -> { - return event.getDocument(); - }, - mCanSelect, - mRightClickHandler::test, - mActivateHandler::test, - mDeleteHandler::test); - - mEvent = TestEvent.builder().mouse(); - } - - @Test - public void testConfirmedClick_StartsSelection() { - mInputHandler.onSingleTapConfirmed(mEvent.at(11).build()); - mSelection.assertSelection(11); - } - - @Test - public void testUnconfirmedClick_AddsToExistingSelection() { - mInputHandler.onSingleTapConfirmed(mEvent.at(7).build()); - - mInputHandler.onSingleTapUp(mEvent.at(11).build()); - mSelection.assertSelection(7, 11); - } - - @Test - public void testDoubleClick_Activates() { - mInputHandler.onDoubleTap(mEvent.at(11).build()); - mActivateHandler.assertLastArgument(mEvent.build()); - } - - @Test - public void testClickOff_ClearsSelection() { - mInputHandler.onSingleTapConfirmed(mEvent.at(11).build()); - mInputHandler.onSingleTapUp(mEvent.at(RecyclerView.NO_POSITION).build()); - mSelection.assertNoSelection(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/UserInputHandler_RangeTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/UserInputHandler_RangeTest.java deleted file mode 100644 index 1d763f9d9632..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/UserInputHandler_RangeTest.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import android.view.MotionEvent; - -import com.android.documentsui.Events.InputEvent; -import com.android.documentsui.dirlist.UserInputHandler.DocumentDetails; -import com.android.documentsui.testing.TestEvent; -import com.android.documentsui.testing.TestEvent.Builder; -import com.android.documentsui.testing.TestPredicate; -import com.android.documentsui.testing.dirlist.SelectionProbe; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.List; - -/** - * UserInputHandler / MultiSelectManager integration test covering the shared - * responsibility of range selection. - */ -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class UserInputHandler_RangeTest { - - private static final List<String> ITEMS = TestData.create(100); - - private UserInputHandler<TestEvent> mInputHandler; - - private TestDocumentsAdapter mAdapter; - private SelectionProbe mSelection; - private TestPredicate<DocumentDetails> mCanSelect; - private TestPredicate<InputEvent> mRightClickHandler; - private TestPredicate<DocumentDetails> mActivateHandler; - private TestPredicate<DocumentDetails> mDeleteHandler; - private Builder mEvent; - - @Before - public void setUp() { - - mAdapter = new TestDocumentsAdapter(ITEMS); - MultiSelectManager selectionMgr = - new MultiSelectManager(mAdapter, MultiSelectManager.MODE_MULTIPLE); - - mSelection = new SelectionProbe(selectionMgr); - mCanSelect = new TestPredicate<>(); - mRightClickHandler = new TestPredicate<>(); - mActivateHandler = new TestPredicate<>(); - mDeleteHandler = new TestPredicate<>(); - - mInputHandler = new UserInputHandler<>( - selectionMgr, - new TestFocusHandler(), - (MotionEvent event) -> { - throw new UnsupportedOperationException("Not exercised in tests."); - }, - (TestEvent event) -> { - return event.getDocument(); - }, - mCanSelect, - mRightClickHandler::test, - mActivateHandler::test, - mDeleteHandler::test); - - mEvent = TestEvent.builder().mouse(); - } - - @Test - public void testExtendRange() { - mInputHandler.onSingleTapConfirmed(mEvent.at(7).build()); - mInputHandler.onSingleTapUp(mEvent.at(11).shift().build()); - mSelection.assertRangeSelection(7, 11); - } - - @Test - public void testExtendRangeContinues() { - mInputHandler.onSingleTapConfirmed(mEvent.at(7).build()); - mInputHandler.onSingleTapUp(mEvent.at(11).shift().build()); - mInputHandler.onSingleTapUp(mEvent.at(21).shift().build()); - mSelection.assertRangeSelection(7, 21); - } - - @Test - public void testMultipleContiguousRanges() { - mInputHandler.onSingleTapConfirmed(mEvent.at(7).build()); - mInputHandler.onSingleTapUp(mEvent.at(11).shift().build()); - - // click without shift sets a new range start point. - mInputHandler.onSingleTapUp(mEvent.at(20).unshift().build()); - mInputHandler.onSingleTapUp(mEvent.at(25).shift().build()); - - mSelection.assertRangeSelected(7, 11); - mSelection.assertRangeSelected(20, 25); - - mSelection.assertRangeNotSelected(12, 19); - mSelection.assertSelectionSize(11); - } - - @Test - public void testReducesSelectionRange() { - mInputHandler.onSingleTapConfirmed(mEvent.at(7).build()); - mInputHandler.onSingleTapUp(mEvent.at(17).shift().build()); - mInputHandler.onSingleTapUp(mEvent.at(10).shift().build()); - mSelection.assertRangeSelection(7, 10); - } - - @Test - public void testReducesSelectionRange_Reverse() { - mInputHandler.onSingleTapConfirmed(mEvent.at(17).build()); - mInputHandler.onSingleTapUp(mEvent.at(7).shift().build()); - mInputHandler.onSingleTapUp(mEvent.at(14).shift().build()); - mSelection.assertRangeSelection(14, 17); - } - - @Test - public void testExtendsRange_Reverse() { - mInputHandler.onSingleTapConfirmed(mEvent.at(12).build()); - mInputHandler.onSingleTapUp(mEvent.at(5).shift().build()); - mSelection.assertRangeSelection(5, 12); - } - - @Test - public void testExtendsRange_ReversesAfterForwardClick() { - mInputHandler.onSingleTapConfirmed(mEvent.at(7).build()); - mInputHandler.onSingleTapUp(mEvent.at(11).shift().build()); - mInputHandler.onSingleTapUp(mEvent.at(0).shift().build()); - mSelection.assertRangeSelection(0, 7); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/UserInputHandler_TouchTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/UserInputHandler_TouchTest.java deleted file mode 100644 index 2d1453eaf0dc..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/UserInputHandler_TouchTest.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.v7.widget.RecyclerView; -import android.view.MotionEvent; - -import com.android.documentsui.Events.InputEvent; -import com.android.documentsui.dirlist.UserInputHandler.DocumentDetails; -import com.android.documentsui.testing.TestEvent; -import com.android.documentsui.testing.TestEvent.Builder; -import com.android.documentsui.testing.TestPredicate; -import com.android.documentsui.testing.dirlist.SelectionProbe; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class UserInputHandler_TouchTest { - - private static final List<String> ITEMS = TestData.create(100); - - private UserInputHandler<TestEvent> mInputHandler; - - private TestDocumentsAdapter mAdapter; - private SelectionProbe mSelection; - private TestPredicate<DocumentDetails> mCanSelect; - private TestPredicate<InputEvent> mRightClickHandler; - private TestPredicate<DocumentDetails> mActivateHandler; - private TestPredicate<DocumentDetails> mDeleteHandler; - - private Builder mEvent; - - @Before - public void setUp() { - - mAdapter = new TestDocumentsAdapter(ITEMS); - MultiSelectManager selectionMgr = - new MultiSelectManager(mAdapter, MultiSelectManager.MODE_MULTIPLE); - - mSelection = new SelectionProbe(selectionMgr); - mCanSelect = new TestPredicate<>(); - mRightClickHandler = new TestPredicate<>(); - mActivateHandler = new TestPredicate<>(); - mDeleteHandler = new TestPredicate<>(); - - mInputHandler = new UserInputHandler<>( - selectionMgr, - new TestFocusHandler(), - (MotionEvent event) -> { - throw new UnsupportedOperationException("Not exercised in tests."); - }, - (TestEvent event) -> { - return event.getDocument(); - }, - mCanSelect, - mRightClickHandler::test, - mActivateHandler::test, - mDeleteHandler::test); - - mEvent = TestEvent.builder(); - } - - @Test - public void testTap_ActivatesWhenNoExistingSelection() { - mInputHandler.onSingleTapUp(mEvent.at(11).build()); - mActivateHandler.assertLastArgument(mEvent.build()); - } - - @Test - public void testLongPress_StartsSelectionMode() { - mInputHandler.onLongPress(mEvent.at(7).build()); - mSelection.assertSelection(7); - } - - @Test - public void testLongPress_SecondPressExtendsSelection() { - mInputHandler.onLongPress(mEvent.at(7).build()); - mInputHandler.onLongPress(mEvent.at(99).build()); - mInputHandler.onLongPress(mEvent.at(13).build()); - mSelection.assertSelection(7, 13, 99); - } - - @Test - public void testTap_UnselectsSelectedItem() { - mInputHandler.onLongPress(mEvent.at(7).build()); - mInputHandler.onSingleTapUp(mEvent.at(7).build()); - mSelection.assertNoSelection(); - } - - @Test - public void testTapOff_ClearsSelection() { - mInputHandler.onLongPress(mEvent.at(7).build()); - mInputHandler.onSingleTapUp(mEvent.at(11).build()); - mInputHandler.onSingleTapUp(mEvent.at(RecyclerView.NO_POSITION).build()); - mSelection.assertNoSelection(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ViewAutoScrollerTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ViewAutoScrollerTest.java deleted file mode 100644 index e2aaa843ef53..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/dirlist/ViewAutoScrollerTest.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.dirlist; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import android.graphics.Point; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.function.IntConsumer; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class ViewAutoScrollerTest { - - private static final int VIEW_HEIGHT = 100; - private static final int EDGE_HEIGHT = 10; - - private ViewAutoScroller mAutoScroller; - private Point mPoint; - private boolean mActive; - private ViewAutoScroller.ScrollDistanceDelegate mDistanceDelegate; - private ViewAutoScroller.ScrollActionDelegate mActionDelegate; - private IntConsumer mScrollAssert; - - @Before - public void setUp() { - mActive = false; - mPoint = new Point(); - mDistanceDelegate = new ViewAutoScroller.ScrollDistanceDelegate() { - @Override - public boolean isActive() { - return mActive; - } - - @Override - public int getViewHeight() { - return VIEW_HEIGHT; - } - - @Override - public Point getCurrentPosition() { - return mPoint; - } - }; - mActionDelegate = new ViewAutoScroller.ScrollActionDelegate() { - @Override - public void scrollBy(int dy) { - mScrollAssert.accept(dy); - } - - @Override - public void runAtNextFrame(Runnable r) { - } - - @Override - public void removeCallback(Runnable r) { - } - }; - mAutoScroller = new ViewAutoScroller( - EDGE_HEIGHT, mDistanceDelegate, mActionDelegate, new TestClock()::getCurrentTime); - } - - @Test - public void testCursorNotInScrollZone() { - mPoint = new Point(0, VIEW_HEIGHT/2); - mScrollAssert = (int dy) -> { - // Should not have called this method - fail("Received unexpected scroll event"); - assertTrue(false); - }; - mAutoScroller.run(); - } - - @Test - public void testCursorInScrollZone_notActive() { - mActive = false; - mPoint = new Point(0, EDGE_HEIGHT - 1); - mScrollAssert = (int dy) -> { - // Should not have called this method - fail("Received unexpected scroll event"); - assertTrue(false); - }; - mAutoScroller.run(); - } - - @Test - public void testCursorInScrollZone_top() { - mActive = true; - mPoint = new Point(0, EDGE_HEIGHT - 1); - int expectedScrollDistance = mAutoScroller.computeScrollDistance(-1, 1); - mScrollAssert = (int dy) -> { - assertTrue(dy == expectedScrollDistance); - }; - mAutoScroller.run(); - } - - @Test - public void testCursorInScrollZone_bottom() { - mActive = true; - mPoint = new Point(0, VIEW_HEIGHT - EDGE_HEIGHT + 1); - int expectedScrollDistance = mAutoScroller.computeScrollDistance(1, 1); - mScrollAssert = (int dy) -> { - assertTrue(dy == expectedScrollDistance); - }; - mAutoScroller.run(); - } - - class TestClock { - private int timesCalled = 0; - - public long getCurrentTime() { - return ++timesCalled; - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/model/DocumentInfoTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/model/DocumentInfoTest.java deleted file mode 100644 index 2481dc39ed7f..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/model/DocumentInfoTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.model; - -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -@SmallTest -public class DocumentInfoTest extends AndroidTestCase { - - private static final DocumentInfo TEST_DOC - = createDocInfo("authority.a", "doc.1", "text/plain"); - - public void testEquals() throws Exception { - assertEquals(TEST_DOC, TEST_DOC); - assertEquals(TEST_DOC, createDocInfo("authority.a", "doc.1", "text/plain")); - } - - public void testEquals_HandlesNulls() throws Exception { - assertFalse(TEST_DOC.equals(null)); - } - - public void testEquals_HandlesNullFields() throws Exception { - assertFalse(TEST_DOC.equals(new DocumentInfo())); - assertFalse(new DocumentInfo().equals(TEST_DOC)); - } - - public void testNotEquals_differentAuthority() throws Exception { - assertFalse(TEST_DOC.equals(createDocInfo("authority.b", "doc.1", "text/plain"))); - } - - public void testNotEquals_differentDocId() throws Exception { - assertFalse(TEST_DOC.equals(createDocInfo("authority.a", "doc.2", "text/plain"))); - } - - public void testNotEquals_differentMimetype() throws Exception { - assertFalse(TEST_DOC.equals(createDocInfo("authority.a", "doc.1", "image/png"))); - } - - private static DocumentInfo createDocInfo(String authority, String docId, String mimeType) { - DocumentInfo doc = new DocumentInfo(); - doc.authority = authority; - doc.documentId = docId; - doc.mimeType = mimeType; - doc.deriveFields(); - return doc; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/services/AbstractCopyJobTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/services/AbstractCopyJobTest.java deleted file mode 100644 index 2560f2c9477f..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/services/AbstractCopyJobTest.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.google.common.collect.Lists.newArrayList; - -import android.net.Uri; -import android.provider.DocumentsContract; -import android.test.suitebuilder.annotation.MediumTest; - -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.services.FileOperationService.OpType; - -import java.util.List; - -@MediumTest -public abstract class AbstractCopyJobTest<T extends CopyJob> extends AbstractJobTest<T> { - - private final @OpType int mOpType; - - AbstractCopyJobTest(@OpType int opType) { - mOpType = opType; - } - - public void runCopyFilesTest() throws Exception { - Uri testFile1 = mDocs.createDocument(mSrcRoot, "text/plain", "test1.txt"); - mDocs.writeDocument(testFile1, HAM_BYTES); - - Uri testFile2 = mDocs.createDocument(mSrcRoot, "text/plain", "test2.txt"); - mDocs.writeDocument(testFile2, FRUITY_BYTES); - - createJob(newArrayList(testFile1, testFile2)).run(); - mJobListener.waitForFinished(); - - mDocs.assertChildCount(mDestRoot, 2); - mDocs.assertHasFile(mDestRoot, "test1.txt"); - mDocs.assertHasFile(mDestRoot, "test2.txt"); - mDocs.assertFileContents(mDestRoot.documentId, "test1.txt", HAM_BYTES); - mDocs.assertFileContents(mDestRoot.documentId, "test2.txt", FRUITY_BYTES); - } - - public void runCopyVirtualTypedFileTest() throws Exception { - Uri testFile = mDocs.createVirtualFile( - mSrcRoot, "/virtual.sth", "virtual/mime-type", - FRUITY_BYTES, "application/pdf", "text/html"); - - createJob(newArrayList(testFile)).run(); - - mJobListener.waitForFinished(); - - mDocs.assertChildCount(mDestRoot, 1); - mDocs.assertHasFile(mDestRoot, "virtual.sth.pdf"); // copy should convert file to PDF. - mDocs.assertFileContents(mDestRoot.documentId, "virtual.sth.pdf", FRUITY_BYTES); - } - - public void runCopyVirtualNonTypedFileTest() throws Exception { - Uri testFile = mDocs.createVirtualFile( - mSrcRoot, "/virtual.sth", "virtual/mime-type", - FRUITY_BYTES); - - createJob(newArrayList(testFile)).run(); - - mJobListener.waitForFinished(); - mJobListener.assertFailed(); - mJobListener.assertFilesFailed(newArrayList("virtual.sth")); - - mDocs.assertChildCount(mDestRoot, 0); - } - - public void runCopyEmptyDirTest() throws Exception { - Uri testDir = mDocs.createFolder(mSrcRoot, "emptyDir"); - - createJob(newArrayList(testDir)).run(); - mJobListener.waitForFinished(); - - mDocs.assertChildCount(mDestRoot, 1); - mDocs.assertHasDirectory(mDestRoot, "emptyDir"); - } - - public void runCopyDirRecursivelyTest() throws Exception { - - Uri testDir1 = mDocs.createFolder(mSrcRoot, "dir1"); - mDocs.createDocument(testDir1, "text/plain", "test1.txt"); - - Uri testDir2 = mDocs.createFolder(testDir1, "dir2"); - mDocs.createDocument(testDir2, "text/plain", "test2.txt"); - - createJob(newArrayList(testDir1)).run(); - mJobListener.waitForFinished(); - - DocumentInfo dir1Copy = mDocs.findDocument(mDestRoot.documentId, "dir1"); - - mDocs.assertChildCount(dir1Copy.derivedUri, 2); - mDocs.assertHasDirectory(dir1Copy.derivedUri, "dir2"); - mDocs.assertHasFile(dir1Copy.derivedUri, "test1.txt"); - - DocumentInfo dir2Copy = mDocs.findDocument(dir1Copy.documentId, "dir2"); - mDocs.assertChildCount(dir2Copy.derivedUri, 1); - mDocs.assertHasFile(dir2Copy.derivedUri, "test2.txt"); - } - - public void runNoCopyDirToSelfTest() throws Exception { - Uri testDir = mDocs.createFolder(mSrcRoot, "someDir"); - - createJob(mOpType, - newArrayList(testDir), - DocumentsContract.buildDocumentUri(AUTHORITY, mSrcRoot.documentId), - testDir).run(); - - mJobListener.waitForFinished(); - mJobListener.assertFailed(); - mJobListener.assertFilesFailed(newArrayList("someDir")); - - mDocs.assertChildCount(mDestRoot, 0); - } - - public void runNoCopyDirToDescendentTest() throws Exception { - Uri testDir = mDocs.createFolder(mSrcRoot, "someDir"); - Uri destDir = mDocs.createFolder(testDir, "theDescendent"); - - createJob(mOpType, - newArrayList(testDir), - DocumentsContract.buildDocumentUri(AUTHORITY, mSrcRoot.documentId), - destDir).run(); - - mJobListener.waitForFinished(); - mJobListener.assertFailed(); - mJobListener.assertFilesFailed(newArrayList("someDir")); - - mDocs.assertChildCount(mDestRoot, 0); - } - - public void runCopyFileWithReadErrorsTest() throws Exception { - Uri testFile = mDocs.createDocument(mSrcRoot, "text/plain", "test1.txt"); - mDocs.writeDocument(testFile, HAM_BYTES); - - String testId = DocumentsContract.getDocumentId(testFile); - mClient.call("simulateReadErrorsForFile", testId, null); - - createJob(newArrayList(testFile)).run(); - - mJobListener.waitForFinished(); - mJobListener.assertFailed(); - mJobListener.assertFilesFailed(newArrayList("test1.txt")); - - mDocs.assertChildCount(mDestRoot, 0); - } - - /** - * Creates a job with a stack consisting to the default source and destination. - * TODO: Clean up, as mDestRoot.documentInfo may not really be the parent of - * srcs. - */ - final T createJob(List<Uri> srcs) throws Exception { - Uri srcParent = DocumentsContract.buildDocumentUri(AUTHORITY, mSrcRoot.documentId); - Uri destination = DocumentsContract.buildDocumentUri(AUTHORITY, mDestRoot.documentId); - return createJob(mOpType, srcs, srcParent, destination); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/services/AbstractJobTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/services/AbstractJobTest.java deleted file mode 100644 index 6e4e534e0047..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/services/AbstractJobTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.StubProvider.ROOT_0_ID; -import static com.android.documentsui.StubProvider.ROOT_1_ID; - -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.Context; -import android.net.Uri; -import android.os.RemoteException; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; - -import com.android.documentsui.clipping.UrisSupplier; -import com.android.documentsui.DocumentsProviderHelper; -import com.android.documentsui.StubProvider; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.RootInfo; -import com.android.documentsui.services.FileOperationService.OpType; -import com.android.documentsui.testing.DocsProviders; - -import java.util.List; - -@MediumTest -public abstract class AbstractJobTest<T extends Job> extends AndroidTestCase { - - static String AUTHORITY = StubProvider.DEFAULT_AUTHORITY; - static final byte[] HAM_BYTES = "ham and cheese".getBytes(); - static final byte[] FRUITY_BYTES = "I love fruit cakes!".getBytes(); - - Context mContext; - ContentResolver mResolver; - ContentProviderClient mClient; - DocumentsProviderHelper mDocs; - TestJobListener mJobListener; - RootInfo mSrcRoot; - RootInfo mDestRoot; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - mJobListener = new TestJobListener(); - - // NOTE: Must be the "target" context, else security checks in content provider will fail. - mContext = getContext(); - mResolver = mContext.getContentResolver(); - - mClient = mResolver.acquireContentProviderClient(AUTHORITY); - mDocs = new DocumentsProviderHelper(AUTHORITY, mClient); - - initTestFiles(); - } - - @Override - protected void tearDown() throws Exception { - resetStorage(); - mClient.release(); - super.tearDown(); - } - - private void resetStorage() throws RemoteException { - mClient.call("clear", null, null); - } - - private void initTestFiles() throws RemoteException { - mSrcRoot = mDocs.getRoot(ROOT_0_ID); - mDestRoot = mDocs.getRoot(ROOT_1_ID); - } - - final T createJob(@OpType int opType, List<Uri> srcs, Uri srcParent, Uri destination) - throws Exception { - DocumentStack stack = new DocumentStack(); - stack.push(DocumentInfo.fromUri(mResolver, destination)); - stack.root = mSrcRoot; - - UrisSupplier urisSupplier = DocsProviders.createDocsProvider(srcs); - FileOperation operation = new FileOperation.Builder() - .withOpType(opType) - .withSrcs(urisSupplier) - .withDestination(stack) - .withSrcParent(srcParent) - .build(); - return (T) operation.createJob(mContext, mJobListener, FileOperations.createJobId()); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/services/CopyJobTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/services/CopyJobTest.java deleted file mode 100644 index 64211c20e7ca..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/services/CopyJobTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.services.FileOperationService.OPERATION_COPY; - -import static com.google.common.collect.Lists.newArrayList; - -import android.net.Uri; -import android.provider.DocumentsContract.Document; -import android.test.suitebuilder.annotation.MediumTest; - -@MediumTest -public class CopyJobTest extends AbstractCopyJobTest<CopyJob> { - - public CopyJobTest() { - super(OPERATION_COPY); - } - - public void testCopyFiles() throws Exception { - runCopyFilesTest(); - } - - public void testCopyVirtualTypedFile() throws Exception { - runCopyVirtualTypedFileTest(); - } - - public void testCopyVirtualNonTypedFile() throws Exception { - runCopyVirtualNonTypedFileTest(); - } - - public void testCopy_BackendSideVirtualTypedFile_Fallback() throws Exception { - mDocs.assertChildCount(mDestRoot, 0); - - Uri testFile = mDocs.createDocumentWithFlags( - mSrcRoot.documentId, "virtual/mime-type", "tokyo.sth", - Document.FLAG_VIRTUAL_DOCUMENT | Document.FLAG_SUPPORTS_COPY - | Document.FLAG_SUPPORTS_MOVE, "application/pdf"); - - createJob(newArrayList(testFile)).run(); - - mJobListener.waitForFinished(); - mDocs.assertChildCount(mDestRoot, 1); - mDocs.assertHasFile(mDestRoot, "tokyo.sth.pdf"); // Copy should convert file to PDF. - } - - public void testCopyEmptyDir() throws Exception { - runCopyEmptyDirTest(); - } - - public void testCopyDirRecursively() throws Exception { - runCopyDirRecursivelyTest(); - } - - public void testNoCopyDirToSelf() throws Exception { - runNoCopyDirToSelfTest(); - } - - public void testNoCopyDirToDescendent() throws Exception { - runNoCopyDirToDescendentTest(); - } - - public void testCopyFileWithReadErrors() throws Exception { - runCopyFileWithReadErrorsTest(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/services/DeleteJobTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/services/DeleteJobTest.java deleted file mode 100644 index 9dbe7cee5799..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/services/DeleteJobTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.services.FileOperationService.OPERATION_DELETE; - -import static com.google.common.collect.Lists.newArrayList; - -import android.net.Uri; -import android.provider.DocumentsContract; -import android.test.suitebuilder.annotation.MediumTest; - -import java.util.List; - -@MediumTest -public class DeleteJobTest extends AbstractJobTest<DeleteJob> { - - public void testDeleteFiles() throws Exception { - Uri testFile1 = mDocs.createDocument(mSrcRoot, "text/plain", "test1.txt"); - mDocs.writeDocument(testFile1, HAM_BYTES); - - Uri testFile2 = mDocs.createDocument(mSrcRoot, "text/plain", "test2.txt"); - mDocs.writeDocument(testFile2, FRUITY_BYTES); - - createJob(newArrayList(testFile1, testFile2), - DocumentsContract.buildDocumentUri(AUTHORITY, mSrcRoot.documentId)).run(); - mJobListener.waitForFinished(); - - mDocs.assertChildCount(mSrcRoot, 0); - } - - /** - * Creates a job with a stack consisting to the default src directory. - */ - private final DeleteJob createJob(List<Uri> srcs, Uri srcParent) throws Exception { - Uri stack = DocumentsContract.buildDocumentUri(AUTHORITY, mSrcRoot.documentId); - return createJob(OPERATION_DELETE, srcs, srcParent, stack); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/services/FileOperationServiceTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/services/FileOperationServiceTest.java deleted file mode 100644 index d6bbe5abfcbd..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/services/FileOperationServiceTest.java +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.services.FileOperationService.OPERATION_COPY; -import static com.android.documentsui.services.FileOperationService.OPERATION_DELETE; -import static com.android.documentsui.services.FileOperationService.OpType; -import static com.android.documentsui.services.FileOperations.createBaseIntent; -import static com.android.documentsui.services.FileOperations.createJobId; - -import static com.google.android.collect.Lists.newArrayList; - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Parcel; -import android.os.Parcelable; -import android.test.ServiceTestCase; -import android.test.suitebuilder.annotation.MediumTest; - -import com.android.documentsui.clipping.UrisSupplier; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.testing.DocsProviders; -import com.android.documentsui.testing.TestHandler; -import com.android.documentsui.testing.TestScheduledExecutorService; - -import java.util.ArrayList; -import java.util.List; - -@MediumTest -public class FileOperationServiceTest extends ServiceTestCase<FileOperationService> { - - private static final Uri SRC_PARENT = - Uri.parse("content://com.android.documentsui.testing/parent"); - private static final DocumentInfo ALPHA_DOC = createDoc("alpha"); - private static final DocumentInfo BETA_DOC = createDoc("alpha"); - private static final DocumentInfo GAMMA_DOC = createDoc("gamma"); - private static final DocumentInfo DELTA_DOC = createDoc("delta"); - - private final List<TestJob> mCopyJobs = new ArrayList<>(); - private final List<TestJob> mDeleteJobs = new ArrayList<>(); - - private FileOperationService mService; - private TestScheduledExecutorService mExecutor; - private TestScheduledExecutorService mDeletionExecutor; - private TestHandler mHandler; - - public FileOperationServiceTest() { - super(FileOperationService.class); - } - - @Override - protected void setUp() throws Exception { - super.setUp(); - setupService(); // must be called first for our test setup to work correctly. - - mExecutor = new TestScheduledExecutorService(); - mDeletionExecutor = new TestScheduledExecutorService(); - mHandler = new TestHandler(); - - mCopyJobs.clear(); - mDeleteJobs.clear(); - - // Install test doubles. - mService = getService(); - - assertNull(mService.executor); - mService.executor = mExecutor; - - assertNull(mService.deletionExecutor); - mService.deletionExecutor = mDeletionExecutor; - - assertNull(mService.handler); - mService.handler = mHandler; - } - - @Override - protected void tearDown() { - // There are lots of progress notifications generated in this test case. - // Dismiss all of them here. - mHandler.dispatchAllMessages(); - } - - public void testRunsCopyJobs() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - startService(createCopyIntent(newArrayList(GAMMA_DOC), DELTA_DOC)); - - mExecutor.runAll(); - assertAllCopyJobsStarted(); - } - - public void testRunsCopyJobs_AfterExceptionInJobCreation() throws Exception { - try { - startService(createCopyIntent(new ArrayList<>(), BETA_DOC)); - } catch(AssertionError e) { - // Expected AssertionError - } - startService(createCopyIntent(newArrayList(GAMMA_DOC), DELTA_DOC)); - - assertJobsCreated(1); - - mExecutor.runAll(); - assertAllCopyJobsStarted(); - } - - public void testRunsCopyJobs_AfterFailure() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - startService(createCopyIntent(newArrayList(GAMMA_DOC), DELTA_DOC)); - - mCopyJobs.get(0).fail(ALPHA_DOC); - - mExecutor.runAll(); - assertAllCopyJobsStarted(); - } - - public void testRunsCopyJobs_notRunsDeleteJobs() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - startService(createDeleteIntent(newArrayList(GAMMA_DOC))); - - mExecutor.runAll(); - assertNoDeleteJobsStarted(); - } - - public void testRunsDeleteJobs() throws Exception { - startService(createDeleteIntent(newArrayList(ALPHA_DOC))); - - mDeletionExecutor.runAll(); - assertAllDeleteJobsStarted(); - } - - public void testRunsDeleteJobs_NotRunsCopyJobs() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - startService(createDeleteIntent(newArrayList(GAMMA_DOC))); - - mDeletionExecutor.runAll(); - assertNoCopyJobsStarted(); - } - - public void testUpdatesNotification() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - mExecutor.runAll(); - - // Assert monitoring continues until job is done - assertTrue(mHandler.hasScheduledMessage()); - // Two notifications -- one for setup; one for progress - assertEquals(2, mCopyJobs.get(0).getNumOfNotifications()); - } - - public void testStopsUpdatingNotificationAfterFinished() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - mExecutor.runAll(); - - mHandler.dispatchNextMessage(); - // Assert monitoring stops once job is completed. - assertFalse(mHandler.hasScheduledMessage()); - - // Assert no more notification is generated after finish. - assertEquals(2, mCopyJobs.get(0).getNumOfNotifications()); - - } - - public void testHoldsWakeLockWhileWorking() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - - assertTrue(mService.holdsWakeLock()); - } - - public void testReleasesWakeLock_AfterSuccess() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - - assertTrue(mService.holdsWakeLock()); - mExecutor.runAll(); - assertFalse(mService.holdsWakeLock()); - } - - public void testReleasesWakeLock_AfterFailure() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - - assertTrue(mService.holdsWakeLock()); - mExecutor.runAll(); - assertFalse(mService.holdsWakeLock()); - } - - public void testShutdownStopsExecutor_AfterSuccess() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - - mExecutor.assertAlive(); - mDeletionExecutor.assertAlive(); - - mExecutor.runAll(); - shutdownService(); - - assertExecutorsShutdown(); - } - - public void testShutdownStopsExecutor_AfterMixedFailures() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - startService(createCopyIntent(newArrayList(GAMMA_DOC), DELTA_DOC)); - - mCopyJobs.get(0).fail(ALPHA_DOC); - - mExecutor.runAll(); - shutdownService(); - - assertExecutorsShutdown(); - } - - public void testShutdownStopsExecutor_AfterTotalFailure() throws Exception { - startService(createCopyIntent(newArrayList(ALPHA_DOC), BETA_DOC)); - startService(createCopyIntent(newArrayList(GAMMA_DOC), DELTA_DOC)); - - mCopyJobs.get(0).fail(ALPHA_DOC); - mCopyJobs.get(1).fail(GAMMA_DOC); - - mExecutor.runAll(); - shutdownService(); - - assertExecutorsShutdown(); - } - - private Intent createCopyIntent(ArrayList<DocumentInfo> files, DocumentInfo dest) - throws Exception { - DocumentStack stack = new DocumentStack(); - stack.push(dest); - - List<Uri> uris = new ArrayList<>(files.size()); - for (DocumentInfo file: files) { - uris.add(file.derivedUri); - } - - UrisSupplier urisSupplier = DocsProviders.createDocsProvider(uris); - TestFileOperation operation = new TestFileOperation(OPERATION_COPY, urisSupplier, stack); - - return createBaseIntent(getContext(), createJobId(), operation); - } - - private Intent createDeleteIntent(ArrayList<DocumentInfo> files) { - DocumentStack stack = new DocumentStack(); - - List<Uri> uris = new ArrayList<>(files.size()); - for (DocumentInfo file: files) { - uris.add(file.derivedUri); - } - - UrisSupplier urisSupplier = DocsProviders.createDocsProvider(uris); - TestFileOperation operation = new TestFileOperation(OPERATION_DELETE, urisSupplier, stack); - - return createBaseIntent(getContext(), createJobId(), operation); - } - - private static DocumentInfo createDoc(String name) { - // Doesn't need to be valid content Uri, just some urly looking thing. - Uri uri = new Uri.Builder() - .scheme("content") - .authority("com.android.documentsui.testing") - .path(name) - .build(); - - return createDoc(uri); - } - - void assertAllCopyJobsStarted() { - for (TestJob job : mCopyJobs) { - job.assertStarted(); - } - } - - void assertAllDeleteJobsStarted() { - for (TestJob job : mDeleteJobs) { - job.assertStarted(); - } - } - - void assertNoCopyJobsStarted() { - for (TestJob job : mCopyJobs) { - job.assertNotStarted(); - } - } - - void assertNoDeleteJobsStarted() { - for (TestJob job : mDeleteJobs) { - job.assertNotStarted(); - } - } - - void assertJobsCreated(int expected) { - assertEquals(expected, mCopyJobs.size() + mDeleteJobs.size()); - } - private static DocumentInfo createDoc(Uri destination) { - DocumentInfo destDoc = new DocumentInfo(); - destDoc.derivedUri = destination; - return destDoc; - } - - private void assertExecutorsShutdown() { - mExecutor.assertShutdown(); - mDeletionExecutor.assertShutdown(); - } - - private final class TestFileOperation extends FileOperation { - - private final Runnable mJobRunnable = () -> { - // The following statement is executed concurrently to Job.start() in real situation. - // Call it in TestJob.start() to mimic this behavior. - mHandler.dispatchNextMessage(); - }; - private final @OpType int mOpType; - private final UrisSupplier mSrcs; - private final DocumentStack mDestination; - - private TestFileOperation( - @OpType int opType, UrisSupplier srcs, DocumentStack destination) { - super(opType, srcs, destination); - mOpType = opType; - mSrcs = srcs; - mDestination = destination; - } - - @Override - public Job createJob(Context service, Job.Listener listener, String id) { - TestJob job = - new TestJob(service, listener, id, mOpType, mDestination, mSrcs, mJobRunnable); - - if (mOpType == OPERATION_COPY) { - mCopyJobs.add(job); - } - - if (mOpType == OPERATION_DELETE) { - mDeleteJobs.add(job); - } - - return job; - } - - /** - * CREATOR is required for Parcelables, but we never pass this class via parcel. - */ - public Parcelable.Creator<TestFileOperation> CREATOR = - new Parcelable.Creator<TestFileOperation>() { - - @Override - public TestFileOperation createFromParcel(Parcel source) { - throw new UnsupportedOperationException("Can't create from a parcel."); - } - - @Override - public TestFileOperation[] newArray(int size) { - throw new UnsupportedOperationException("Can't create a new array."); - } - }; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/services/MoveJobTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/services/MoveJobTest.java deleted file mode 100644 index 56d96ccaee1d..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/services/MoveJobTest.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static com.android.documentsui.services.FileOperationService.OPERATION_MOVE; - -import static com.google.common.collect.Lists.newArrayList; - -import android.net.Uri; -import android.provider.DocumentsContract.Document; -import android.test.suitebuilder.annotation.MediumTest; - -@MediumTest -public class MoveJobTest extends AbstractCopyJobTest<MoveJob> { - - public MoveJobTest() { - super(OPERATION_MOVE); - } - - public void testMoveFiles() throws Exception { - runCopyFilesTest(); - - mDocs.assertChildCount(mSrcRoot, 0); - } - - public void testMoveVirtualTypedFile() throws Exception { - mDocs.createFolder(mSrcRoot, "hello"); - Uri testFile = mDocs.createVirtualFile( - mSrcRoot, "/hello/virtual.sth", "virtual/mime-type", - FRUITY_BYTES, "application/pdf", "text/html"); - createJob(newArrayList(testFile)).run(); - - mJobListener.waitForFinished(); - - // Should have failed, source not deleted. Moving by bytes for virtual files - // is not supported. - mDocs.assertChildCount(mDestRoot, 0); - mDocs.assertChildCount(mSrcRoot, 1); - } - - public void testMoveVirtualNonTypedFile() throws Exception { - runCopyVirtualNonTypedFileTest(); - - // Should have failed, source not deleted. - mDocs.assertChildCount(mSrcRoot, 1); - } - - public void testMove_BackendSideVirtualTypedFile_Fallback() throws Exception { - Uri testFile = mDocs.createDocumentWithFlags( - mSrcRoot.documentId, "virtual/mime-type", "tokyo.sth", - Document.FLAG_VIRTUAL_DOCUMENT | Document.FLAG_SUPPORTS_COPY - | Document.FLAG_SUPPORTS_MOVE, "application/pdf"); - - createJob(newArrayList(testFile)).run(); - mJobListener.waitForFinished(); - - // Should have failed, source not deleted. Moving by bytes for virtual files - // is not supported. - mDocs.assertChildCount(mDestRoot, 0); - mDocs.assertChildCount(mSrcRoot, 1); - } - - public void testMoveEmptyDir() throws Exception { - runCopyEmptyDirTest(); - - mDocs.assertChildCount(mSrcRoot, 0); - } - - public void testMoveDirRecursively() throws Exception { - runCopyDirRecursivelyTest(); - - mDocs.assertChildCount(mSrcRoot, 0); - } - - public void testNoMoveDirToSelf() throws Exception { - runNoCopyDirToSelfTest(); - - // should have failed, source not deleted - mDocs.assertChildCount(mSrcRoot, 1); - } - - public void testNoMoveDirToDescendent() throws Exception { - runNoCopyDirToDescendentTest(); - - // should have failed, source not deleted - mDocs.assertChildCount(mSrcRoot, 1); - } - - public void testMoveFileWithReadErrors() throws Exception { - runCopyFileWithReadErrorsTest(); - - // should have failed, source not deleted - mDocs.assertChildCount(mSrcRoot, 1); - } - - // TODO: Add test cases for moving when multi-parented. -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/services/TestContentResolver.java b/packages/DocumentsUI/tests/src/com/android/documentsui/services/TestContentResolver.java deleted file mode 100644 index 8f39b1403074..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/services/TestContentResolver.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import android.content.Context; -import android.database.ContentObserver; -import android.net.Uri; -import android.provider.DocumentsContract; -import android.test.mock.MockContentResolver; -import android.util.Log; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -/** - * A test resolver that enables this test suite to listen for notifications that mark when copy - * operations are done. - */ -class TestContentResolver extends MockContentResolver { - - private static final String TAG = "TestContextResolver"; - - private CountDownLatch mReadySignal; - private CountDownLatch mNotificationSignal; - private Context mContext; - - public TestContentResolver(Context context) { - mContext = context; - mReadySignal = new CountDownLatch(1); - } - - /** - * Wait for the given number of files to be copied to destination. Times out after 1 sec. - */ - public void waitForChanges(int count) throws Exception { - // Wait for no more than 1 second by default. - waitForChanges(count, 1000); - } - - /** - * Wait for files to be copied to destination. - * - * @param count Number of files to wait for. - * @param timeOut Timeout in ms. TimeoutException will be thrown if this function times out. - */ - public void waitForChanges(int count, int timeOut) throws Exception { - mNotificationSignal = new CountDownLatch(count); - // Signal that the test is now waiting for files. - mReadySignal.countDown(); - if (!mNotificationSignal.await(timeOut, TimeUnit.MILLISECONDS)) { - throw new TimeoutException("Timed out waiting for file operations to complete."); - } - } - - @Override - public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) { - // Wait until the test is ready to receive file notifications. - try { - mReadySignal.await(); - } catch (InterruptedException e) { - Log.d(TAG, "Interrupted while waiting for file copy readiness"); - Thread.currentThread().interrupt(); - } - if (DocumentsContract.isDocumentUri(mContext, uri)) { - Log.d(TAG, "Notification: " + uri); - // Watch for document URI change notifications - this signifies the end of a copy. - mNotificationSignal.countDown(); - } - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/services/TestJob.java b/packages/DocumentsUI/tests/src/com/android/documentsui/services/TestJob.java deleted file mode 100644 index 1fbcf377fa69..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/services/TestJob.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - -import android.app.Notification; -import android.app.Notification.Builder; -import android.content.Context; - -import com.android.documentsui.clipping.UrisSupplier; -import com.android.documentsui.R; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.services.FileOperationService.OpType; - -import java.text.NumberFormat; - -public class TestJob extends Job { - - private boolean mStarted; - private Runnable mStartRunnable; - - private int mNumOfNotifications = 0; - - TestJob( - Context service, Listener listener, String id, - @OpType int opType, DocumentStack stack, UrisSupplier srcs, Runnable startRunnable) { - super(service, listener, id, opType, stack, srcs); - - mStartRunnable = startRunnable; - } - - @Override - void start() { - mStarted = true; - - mStartRunnable.run(); - } - - void assertStarted() { - assertTrue(mStarted); - } - - void assertNotStarted() { - assertFalse(mStarted); - } - - void fail(DocumentInfo doc) { - onFileFailed(doc); - } - - int getNumOfNotifications() { - return mNumOfNotifications; - } - - @Override - Notification getSetupNotification() { - ++mNumOfNotifications; - return getSetupNotification(service.getString(R.string.copy_preparing)); - } - - @Override - Notification getProgressNotification() { - ++mNumOfNotifications; - double completed = mStarted ? 1F : 0F; - return mProgressBuilder - .setProgress(1, (int) completed, true) - .setSubText(NumberFormat.getPercentInstance().format(completed)) - .build(); - } - - @Override - Notification getFailureNotification() { - // the "copy" stuff was just convenient and available :) - return getFailureNotification( - R.plurals.copy_error_notification_title, R.drawable.ic_menu_copy); - } - - @Override - Notification getWarningNotification() { - throw new UnsupportedOperationException(); - } - - @Override - Builder createProgressBuilder() { - ++mNumOfNotifications; - // the "copy" stuff was just convenient and available :) - return super.createProgressBuilder( - service.getString(R.string.copy_notification_title), - R.drawable.ic_menu_copy, - service.getString(android.R.string.cancel), - R.drawable.ic_cab_cancel); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/services/TestJobListener.java b/packages/DocumentsUI/tests/src/com/android/documentsui/services/TestJobListener.java deleted file mode 100644 index e9c68c6abe71..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/services/TestJobListener.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.services; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -import android.support.annotation.Nullable; - -import com.android.documentsui.model.DocumentInfo; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -public class TestJobListener implements Job.Listener { - - private final CountDownLatch latch = new CountDownLatch(1); - private final List<Job> progress = new ArrayList<>(); - @Nullable private Job started; - @Nullable private Job finished; - - @Override - public void onStart(Job job) { - started = job; - } - - @Override - public void onFinished(Job job) { - this.finished = job; - latch.countDown(); - } - - public void assertStarted() { - if (started == null) { - fail("Job didn't start. onStart never called."); - } - } - - public void assertFinished() { - if (finished == null) { - fail("Job didn't finish. onFinish never called."); - } - } - - public void assertFailed() { - if (finished == null || !finished.hasFailures()) { - fail("Job didn't fail. onFailed never called."); - } - } - - public void assertFilesFailed(ArrayList<String> names) { - if (finished == null || !finished.hasFailures()) { - fail("Can't test failed documetns. Job didn't fail."); - } - - assertEquals(finished.failedFiles.size(), names.size()); - for (String name : names) { - assertFileFailed(name); - } - } - - public void assertFileFailed(String name) { - if (finished == null || !finished.hasFailures()) { - fail("Can't test failed documetns. Job didn't fail."); - } - - for (DocumentInfo failed : finished.failedFiles) { - if (name.equals(failed.displayName)) { - return; - } - } - fail("Couldn't find failed file: " + name); - } - - public void assertCanceled() { - if (finished == null) { - fail("Can't determine if job was canceled. Job didn't finish."); - } - if (!finished.isCanceled()) { - fail("Job wasn't canceled. Job#isCanceled returned false."); - } - } - - public void assertMadeProgress() { - if (progress.isEmpty()) { - fail("Job made no progress. onProgress never called."); - } - } - - public void waitForFinished() throws InterruptedException { - latch.await(500, TimeUnit.MILLISECONDS); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/Bitmaps.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/Bitmaps.java deleted file mode 100644 index 1b94b15eb3bf..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/Bitmaps.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import android.graphics.Bitmap; - -public final class Bitmaps { - - private Bitmaps() {} - - public static Bitmap createTestBitmap(int width, int height) { - final Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - - return bitmap; - } - -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/ClipDatas.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/ClipDatas.java deleted file mode 100644 index 525a02e4f496..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/ClipDatas.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import android.content.ClipData; - -import org.mockito.Mockito; - -public final class ClipDatas { - - private ClipDatas() {} - - public static ClipData createTestClipData() { - final ClipData data = Mockito.mock(ClipData.class); - - return data; - } - -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/DocsProviders.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/DocsProviders.java deleted file mode 100644 index c08157fb371b..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/DocsProviders.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import android.net.Uri; - -import com.android.documentsui.clipping.UrisSupplier; - -import java.util.List; - -public final class DocsProviders { - private DocsProviders() {} - - public static UrisSupplier createDocsProvider(List<Uri> docs) { - return new UrisSupplier.StandardUrisSupplier(docs); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/DragEvents.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/DragEvents.java deleted file mode 100644 index 4ad9ec0701c2..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/DragEvents.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import android.content.ClipData; -import android.view.DragEvent; - -import org.mockito.Mockito; - -public final class DragEvents { - - private DragEvents() {} - - public static DragEvent createTestDragEvent(int actionId) { - final DragEvent mockEvent = Mockito.mock(DragEvent.class); - Mockito.when(mockEvent.getAction()).thenReturn(actionId); - - return mockEvent; - } - - public static DragEvent createTestLocationEvent(float x, float y) { - final DragEvent locationEvent = createTestDragEvent(DragEvent.ACTION_DRAG_LOCATION); - Mockito.when(locationEvent.getX()).thenReturn(x); - Mockito.when(locationEvent.getY()).thenReturn(y); - - return locationEvent; - } - - public static DragEvent createTestDropEvent(ClipData clipData) { - final DragEvent dropEvent = createTestDragEvent(DragEvent.ACTION_DROP); - Mockito.when(dropEvent.getClipData()).thenReturn(clipData); - - return dropEvent; - } - -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestDirectoryDetails.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestDirectoryDetails.java deleted file mode 100644 index e2891bfc5bd6..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestDirectoryDetails.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import com.android.documentsui.MenuManager.DirectoryDetails; - -/** - * Test copy of DirectoryDetails, everything default to false - */ -public class TestDirectoryDetails extends DirectoryDetails { - - public boolean shouldShowFancyFeatures; - public boolean isInRecents; - public boolean hasRootSettings; - public boolean hasItemsToPaste; - public boolean canCreateDirectory; - public boolean getDisplayFileSize; - - public TestDirectoryDetails() { - super(null); - } - - @Override - public boolean shouldShowFancyFeatures() { - return shouldShowFancyFeatures; - } - - @Override - public boolean hasRootSettings() { - return hasRootSettings; - } - - @Override - public boolean hasItemsToPaste() { - return hasItemsToPaste; - } - - @Override - public boolean isInRecents() { - return isInRecents; - } - - @Override - public boolean canCreateDirectory() { - return canCreateDirectory; - } - - @Override - public boolean getDisplayFileSize() { - return getDisplayFileSize; - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestDrawable.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestDrawable.java deleted file mode 100644 index bc3831ec5089..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestDrawable.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import android.graphics.Canvas; -import android.graphics.ColorFilter; -import android.graphics.drawable.Drawable; - -public class TestDrawable extends Drawable { - - public float hotspotX; - public float hotspotY; - - @Override - public void setHotspot(float x, float y) { - hotspotX = x; - hotspotY = y; - } - - @Override - public void draw(Canvas canvas) { - throw new UnsupportedOperationException(); - } - - @Override - public void setAlpha(int alpha) { - throw new UnsupportedOperationException(); - } - - @Override - public void setColorFilter(ColorFilter colorFilter) { - throw new UnsupportedOperationException(); - } - - @Override - public int getOpacity() { - throw new UnsupportedOperationException(); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestEvent.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestEvent.java deleted file mode 100644 index 98fa2de9a508..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestEvent.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import com.android.documentsui.Events.InputEvent; -import com.android.documentsui.TestInputEvent; -import com.android.documentsui.dirlist.UserInputHandler.DocumentDetails; - -/** - * Events and DocDetails are closely related. For the pursposes of this test - * we coalesce the two in a single, handy-dandy test class. - */ -public class TestEvent extends TestInputEvent implements DocumentDetails { - - private String modelId; - private boolean inHotspot; - - @Override - public String getModelId() { - return modelId; - } - - @Override - public int getAdapterPosition() { - return getItemPosition(); - } - - @Override - public boolean isInSelectionHotspot(InputEvent event) { - return inHotspot; - } - - public TestEvent at(int position) { - this.position = position; // this is both "adapter position" and "item position". - modelId = String.valueOf(position); - return this; - } - - public TestEvent shift() { - this.shiftKeyDow = true; - return this; - } - - public TestEvent inHotspot() { - this.inHotspot = true; - return this; - } - - public DocumentDetails getDocument() { - return this; - } - - @Override - public int hashCode() { - return modelId != null ? modelId.hashCode() : -1; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (!(o instanceof TestEvent)) { - return false; - } - - TestEvent other = (TestEvent) o; - return position == other.position - && modelId == other.modelId - && shiftKeyDow == other.shiftKeyDow - && mouseEvent == other.mouseEvent; - } - - public static final Builder builder() { - return new Builder(); - } - - public static final class Builder { - - private TestEvent mState = new TestEvent(); - - public Builder reset() { - mState = new TestEvent(); - return this; - } - - public Builder at(int position) { - mState.position = position; // this is both "adapter position" and "item position". - mState.modelId = String.valueOf(position); - return this; - } - - public Builder shift() { - mState.shiftKeyDow = true; - return this; - } - - public Builder unshift() { - mState.shiftKeyDow = false; - return this; - } - - public Builder inHotspot() { - mState.inHotspot = true; - return this; - } - - public Builder mouse() { - mState.mouseEvent = true; - return this; - } - - public TestEvent build() { - // Return a copy, so nobody can mess w/ our internal state. - TestEvent e = new TestEvent(); - e.position = mState.position; - e.modelId = mState.modelId; - e.shiftKeyDow = mState.shiftKeyDow; - e.mouseEvent = mState.mouseEvent; - return e; - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestHandler.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestHandler.java deleted file mode 100644 index 143ec71b3e3e..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestHandler.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import android.os.Handler; -import android.os.Looper; -import android.os.Message; - -import java.util.TimerTask; - -/** - * A test double of {@link Handler}, backed by {@link TestTimer}. - */ -public class TestHandler extends Handler { - private TestTimer mTimer = new TestTimer(); - - public TestHandler() { - // Use main looper to trick underlying handler, we're not using it at all. - super(Looper.getMainLooper()); - } - - public boolean hasScheduledMessage() { - return mTimer.hasScheduledTask(); - } - - public void dispatchNextMessage() { - mTimer.fastForwardToNextTask(); - } - - public void dispatchAllMessages() { - while (hasScheduledMessage()) { - dispatchNextMessage(); - } - } - - @Override - public boolean sendMessageAtTime(Message msg, long uptimeMillis) { - msg.setTarget(this); - TimerTask task = new MessageTimerTask(msg); - mTimer.scheduleAtTime(new TestTimer.Task(task), uptimeMillis); - return true; - } - - private static class MessageTimerTask extends TimerTask { - private Message mMessage; - - private MessageTimerTask(Message message) { - mMessage = message; - } - - @Override - public void run() { - mMessage.getTarget().dispatchMessage(mMessage); - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestMenu.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestMenu.java deleted file mode 100644 index a8699b9040b4..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestMenu.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import android.util.SparseArray; -import android.view.Menu; - -import com.android.documentsui.R; - -import org.mockito.Mockito; - -/** - * - * Test copy of {@link android.view.Menu}. - * - * We use abstract so we don't have to implement all the necessary methods from the interface, - * and we use Mockito to just mock out the methods we need. - * To get an instance, use {@link #create(int...)}. - */ -public abstract class TestMenu implements Menu { - - private SparseArray<TestMenuItem> items = new SparseArray<>(); - - public static TestMenu create() { - return create(R.id.menu_open, - R.id.menu_rename, - R.id.menu_move_to, - R.id.menu_copy_to, - R.id.menu_cut_to_clipboard, - R.id.menu_copy_to_clipboard, - R.id.menu_paste_from_clipboard, - R.id.menu_share, - R.id.menu_delete, - R.id.menu_create_dir, - R.id.menu_settings, - R.id.menu_new_window, - R.id.menu_select_all, - R.id.menu_file_size, - R.id.menu_grid, - R.id.menu_list, - R.id.menu_sort, - R.id.menu_sort_size, - R.id.menu_advanced, - R.id.menu_eject_root); - } - - public static TestMenu create(int... ids) { - final TestMenu menu = Mockito.mock(TestMenu.class, - Mockito.withSettings().defaultAnswer(Mockito.CALLS_REAL_METHODS)); - menu.items = new SparseArray<>(); - for (int id : ids) { - TestMenuItem item = TestMenuItem.create(id); - menu.addMenuItem(id, item); - } - return menu; - } - - public void addMenuItem(int id, TestMenuItem item) { - items.put(id, item); - } - - @Override - public TestMenuItem findItem(int id) { - return items.get(id); - } - - @Override - public int size() { - return items.size(); - } - - @Override - public TestMenuItem getItem(int index) { - return items.valueAt(index); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestMenuItem.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestMenuItem.java deleted file mode 100644 index 6314b7bb102b..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestMenuItem.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import android.annotation.StringRes; -import android.view.MenuItem; - -import org.mockito.Mockito; - -/** -* -* Test copy of {@link android.view.MenuItem}. -* -* We use abstract so we don't have to implement all the necessary methods from the interface, -* and we use Mockito to just mock out the methods we need. -* To get an instance, use {@link #create(int)}. -*/ - -public abstract class TestMenuItem implements MenuItem { - - boolean enabled; - boolean visible; - @StringRes int title; - - public static TestMenuItem create(int id) { - final TestMenuItem mockMenuItem = Mockito.mock(TestMenuItem.class, - Mockito.withSettings().defaultAnswer(Mockito.CALLS_REAL_METHODS)); - - return mockMenuItem; - } - - @Override - public TestMenuItem setTitle(@StringRes int title) { - this.title = title; - return this; - } - - @Override - public MenuItem setEnabled(boolean enabled) { - this.enabled = enabled; - return this; - } - - @Override - public MenuItem setVisible(boolean visible) { - this.visible = visible; - return this; - } - - @Override - public boolean isVisible() { - return this.visible; - } - - @Override - public boolean isEnabled() { - return this.enabled; - } - - public void assertEnabled() { - assertTrue(this.enabled); - } - - public void assertDisabled() { - assertFalse(this.enabled); - } - - public void assertVisible() { - assertTrue(this.visible); - } - - public void assertInvisible() { - assertFalse(this.visible); - } - - public void assertTitle(@StringRes int title) { - assertTrue(this.title == title); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestPredicate.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestPredicate.java deleted file mode 100644 index f8ee21e30413..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestPredicate.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import static org.junit.Assert.assertEquals; - -import java.util.function.Predicate; - -import javax.annotation.Nullable; - -/** - * Test predicate that can be used to spy control responses and make - * assertions against values tested. - */ -public class TestPredicate<T> implements Predicate<T> { - - private @Nullable T lastValue; - private boolean nextReturnValue; - - @Override - public boolean test(T t) { - lastValue = t; - return nextReturnValue; - } - - public void assertLastArgument(@Nullable T expected) { - assertEquals(expected, lastValue); - } - - public void nextReturn(boolean value) { - nextReturnValue = value; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestScheduledExecutorService.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestScheduledExecutorService.java deleted file mode 100644 index f5001ee41d64..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestScheduledExecutorService.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.fail; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.Delayed; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -public class TestScheduledExecutorService implements ScheduledExecutorService { - - private List<TestFuture> scheduled = new ArrayList<>(); - private boolean shutdown; - - @Override - public void shutdown() { - this.shutdown = true; - } - - @Override - public List<Runnable> shutdownNow() { - this.shutdown = true; - return new ArrayList<>(); - } - - public void assertShutdown() { - if (!shutdown) { - fail("Executor wasn't shut down."); - } - } - - @Override - public boolean isShutdown() { - return shutdown; - } - - @Override - public boolean isTerminated() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { - throw new UnsupportedOperationException(); - } - - @Override - public <T> Future<T> submit(Callable<T> task) { - throw new UnsupportedOperationException(); - } - - @Override - public <T> Future<T> submit(Runnable task, T result) { - throw new UnsupportedOperationException(); - } - - @Override - public Future<?> submit(Runnable task) { - return schedule(task, 0, TimeUnit.MILLISECONDS); - } - - @Override - public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) - throws InterruptedException { - throw new UnsupportedOperationException(); - } - - @Override - public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, - TimeUnit unit) throws InterruptedException { - throw new UnsupportedOperationException(); - } - - @Override - public <T> T invokeAny(Collection<? extends Callable<T>> tasks) - throws InterruptedException, ExecutionException { - throw new UnsupportedOperationException(); - } - - @Override - public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - throw new UnsupportedOperationException(); - } - - @Override - public void execute(Runnable command) { - schedule(command, 0, TimeUnit.MILLISECONDS); - } - - @Override - public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) { - TestFuture future = new TestFuture(command, delay, unit); - scheduled.add(future); - return future; - } - - @Override - public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) { - throw new UnsupportedOperationException(); - } - - @Override - public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, - TimeUnit unit) { - throw new UnsupportedOperationException(); - } - - @Override - public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, - long delay, TimeUnit unit) { - throw new UnsupportedOperationException(); - } - - public void runAll() { - for (TestFuture future : scheduled) { - future.runnable.run(); - } - } - - public void run(int taskIndex) { - scheduled.get(taskIndex).runnable.run(); - } - - public void assertAlive() { - assertFalse(isShutdown()); - } - - static class TestFuture implements ScheduledFuture<Void> { - - final Runnable runnable; - final long delay; - final TimeUnit unit; - - public TestFuture(Runnable runnable, long delay, TimeUnit unit) { - this.runnable = runnable; - this.delay = delay; - this.unit = unit; - } - - @Override - public long getDelay(TimeUnit unit) { - return 0; - } - - @Override - public int compareTo(Delayed arg0) { - return 0; - } - - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return false; - } - - @Override - public boolean isCancelled() { - return false; - } - - @Override - public boolean isDone() { - return false; - } - - @Override - public Void get() throws InterruptedException, ExecutionException { - return null; - } - - @Override - public Void get(long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - return null; - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestSearchViewManager.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestSearchViewManager.java deleted file mode 100644 index 29ae3bd39e0b..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestSearchViewManager.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import android.os.Bundle; - -import com.android.documentsui.SearchViewManager; - -/** - * Test copy of {@link com.android.documentsui.SearchViewManager} - * - * Specficially used to test whether {@link #showMenu(boolean)} - * and {@link #updateMenu()} are called. - */ -public class TestSearchViewManager extends SearchViewManager { - - boolean updateMenuCalled; - boolean showMenuCalled; - - public TestSearchViewManager(SearchManagerListener listener, Bundle savedState) { - super(listener, savedState); - } - - public TestSearchViewManager() { - super(null, null); - } - - @Override - protected void showMenu(boolean visible) { - showMenuCalled = true; - } - - @Override - public void updateMenu() { - updateMenuCalled = true; - } - - public boolean showMenuCalled() { - return showMenuCalled; - } - - public boolean updateMenuCalled() { - return updateMenuCalled; - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestSelectionDetails.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestSelectionDetails.java deleted file mode 100644 index 20796ca0060b..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestSelectionDetails.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import com.android.documentsui.MenuManager.SelectionDetails; - -/** - * Test copy of SelectionDetails, everything default to false - */ -public class TestSelectionDetails implements SelectionDetails { - - public boolean canRename; - public boolean canDelete; - public boolean containPartial; - public boolean containDirectories; - - @Override - public boolean containsPartialFiles() { - return containPartial; - } - - @Override - public boolean containsDirectories() { - return containDirectories; - } - - @Override - public boolean canRename() { - return canRename; - } - - @Override - public boolean canDelete() { - return canDelete; - } - }
\ No newline at end of file diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestTimer.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestTimer.java deleted file mode 100644 index 04af28366f04..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/TestTimer.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import java.util.Date; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.ListIterator; -import java.util.Timer; -import java.util.TimerTask; - -/** - * A {@link Timer} for testing that can dial its clock hands to any future time. - */ -public class TestTimer extends Timer { - - private long mNow = 0; - - private final LinkedList<Task> mTaskList = new LinkedList<>(); - - public void fastForwardTo(long time) { - if (time < mNow) { - throw new IllegalArgumentException("Can't fast forward to past."); - } - - mNow = time; - while (!mTaskList.isEmpty() && mTaskList.getFirst().mExecuteTime <= mNow) { - Task task = mTaskList.getFirst(); - if (!task.isCancelled()) { - task.run(); - } - mTaskList.removeFirst(); - } - } - - public boolean hasScheduledTask() { - return !mTaskList.isEmpty(); - } - - public void fastForwardToNextTask() { - if (!hasScheduledTask()) { - throw new IllegalStateException("There is no scheduled task!"); - } - fastForwardTo(mTaskList.getFirst().mExecuteTime); - } - - @Override - public void cancel() { - mTaskList.clear(); - } - - @Override - public int purge() { - int count = 0; - Iterator<Task> iter = mTaskList.iterator(); - while (iter.hasNext()) { - Task task = iter.next(); - if (task.isCancelled()) { - iter.remove(); - ++count; - } - } - return count; - } - - @Override - public void schedule(TimerTask task, Date time) { - long executeTime = time.getTime(); - scheduleAtTime(task, executeTime); - } - - @Override - public void schedule(TimerTask task, Date firstTime, long period) { - throw new UnsupportedOperationException(); - } - - @Override - public void schedule(TimerTask task, long delay) { - long executeTime = mNow + delay; - scheduleAtTime(task, executeTime); - } - - @Override - public void schedule(TimerTask task, long delay, long period) { - throw new UnsupportedOperationException(); - } - - @Override - public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) { - throw new UnsupportedOperationException(); - } - - @Override - public void scheduleAtFixedRate(TimerTask task, long delay, long period) { - throw new UnsupportedOperationException(); - } - - public void scheduleAtTime(TimerTask task, long executeTime) { - Task testTimerTask = (Task) task; - testTimerTask.mExecuteTime = executeTime; - - ListIterator<Task> iter = mTaskList.listIterator(0); - while (iter.hasNext()) { - if (iter.next().mExecuteTime >= executeTime) { - break; - } - } - iter.add(testTimerTask); - } - - public static class Task extends TimerTask { - private boolean mIsCancelled; - private long mExecuteTime; - - private TimerTask mDelegate; - - public Task(TimerTask delegate) { - mDelegate = delegate; - } - - @Override - public boolean cancel() { - mIsCancelled = true; - return mDelegate.cancel(); - } - - @Override - public void run() { - mDelegate.run(); - } - - boolean isCancelled() { - return mIsCancelled; - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/Views.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/Views.java deleted file mode 100644 index 52a9cbc19d13..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/Views.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing; - -import android.graphics.drawable.Drawable; -import android.view.View; - -import org.mockito.Mockito; - -public final class Views { - - private Views() {} - - public static View createTestView() { - final View view = Mockito.mock(View.class); - Mockito.doCallRealMethod().when(view).setTag(Mockito.anyInt(), Mockito.any()); - Mockito.doCallRealMethod().when(view).getTag(Mockito.anyInt()); - - return view; - } - - public static void setBackground(View testView, Drawable background) { - Mockito.when(testView.getBackground()).thenReturn(background); - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/dirlist/SelectionProbe.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/dirlist/SelectionProbe.java deleted file mode 100644 index 12f4642110e2..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/dirlist/SelectionProbe.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing.dirlist; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import com.android.documentsui.dirlist.MultiSelectManager; -import com.android.documentsui.dirlist.MultiSelectManager.Selection; - -/** - * Helper class for making assertions against the state of a MultiSelectManager instance. - */ -public final class SelectionProbe { - - private final MultiSelectManager mMgr; - - public SelectionProbe(MultiSelectManager mgr) { - mMgr = mgr; - } - - public void assertRangeSelected(int begin, int end) { - for (int i = begin; i <= end; i++) { - assertSelected(i); - } - } - - public void assertRangeNotSelected(int begin, int end) { - for (int i = begin; i <= end; i++) { - assertNotSelected(i); - } - } - - public void assertRangeSelection(int begin, int end) { - assertSelectionSize(end - begin + 1); - assertRangeSelected(begin, end); - } - - public void assertSelectionSize(int expected) { - Selection selection = mMgr.getSelection(); - assertEquals(selection.toString(), expected, selection.size()); - } - - public void assertNoSelection() { - assertSelectionSize(0); - } - - public void assertSelection(int... ids) { - assertSelected(ids); - assertEquals(ids.length, mMgr.getSelection().size()); - } - - public void assertSelected(int... ids) { - Selection sel = mMgr.getSelection(); - for (int id : ids) { - String sid = String.valueOf(id); - assertTrue(sid + " is not in selection " + sel, sel.contains(sid)); - } - } - - public void assertNotSelected(int... ids) { - Selection sel = mMgr.getSelection(); - for (int id : ids) { - String sid = String.valueOf(id); - assertFalse(sid + " is in selection " + sel, sel.contains(sid)); - } - } - - public void select(int...positions) { - for (int position : positions) { - mMgr.toggleSelection(String.valueOf(position)); - } - } -} diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/dirlist/TestSelectionListener.java b/packages/DocumentsUI/tests/src/com/android/documentsui/testing/dirlist/TestSelectionListener.java deleted file mode 100644 index 08f29f0132af..000000000000 --- a/packages/DocumentsUI/tests/src/com/android/documentsui/testing/dirlist/TestSelectionListener.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.documentsui.testing.dirlist; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import com.android.documentsui.dirlist.MultiSelectManager; - -import java.util.HashSet; -import java.util.Set; - -public final class TestSelectionListener implements MultiSelectManager.Callback { - - Set<String> ignored = new HashSet<>(); - private boolean mSelectionChanged = false; - - @Override - public void onItemStateChanged(String modelId, boolean selected) {} - - @Override - public boolean onBeforeItemStateChange(String modelId, boolean selected) { - return !ignored.contains(modelId); - } - - @Override - public void onSelectionChanged() { - mSelectionChanged = true; - } - - public void reset() { - mSelectionChanged = false; - } - - public void assertSelectionChanged() { - assertTrue(mSelectionChanged); - } - - public void assertSelectionUnchanged() { - assertFalse(mSelectionChanged); - } -}
\ No newline at end of file diff --git a/packages/DocumentsUI/wrap_alpha.py b/packages/DocumentsUI/wrap_alpha.py deleted file mode 100644 index 92a3d59af2d5..000000000000 --- a/packages/DocumentsUI/wrap_alpha.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/python - -import os - -""" -# assume everything needs alpha suffixes -for root, dirs, files in os.walk('.'): - if "res/drawable-" not in root: continue - - for before in files: - if "_alpha.png" in before: continue - - after = before.replace(".png", "_alpha.png") - os.rename(os.path.join(root, before), os.path.join(root, after)) -""" - -# build xml redirection -for root, dirs, files in os.walk('.'): - if "res/drawable-" not in root: continue - - for src in files: - if not src.endswith(".png"): continue - src = src[0:-4] - - src_clause = '\n android:src="@drawable/%s"' % (src) - - alpha = src.endswith("_alpha") - if alpha: - src = src[0:-6] - if "ic_doc" in src or "ic_root" in src or "ic_grid_folder" in src: - alpha_clause = '\n android:tint="@*android:color/secondary_text_material_light"' - else: - alpha_clause = '\n android:tint="?android:attr/colorControlNormal"' - else: - alpha_clause = '' - - am = src.endswith("_am") - if am: - src = src[0:-3] - am_clause = '\n android:autoMirrored="true"' - else: - am_clause = '' - - with open("res/drawable/%s.xml" % (src), 'w') as xml: - xml.write("""<?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android"%s%s%s /> -""" % (src_clause, alpha_clause, am_clause)) |