diff options
author | Jeff Sharkey <jsharkey@android.com> | 2019-08-09 10:57:32 -0600 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2019-08-09 10:57:34 -0600 |
commit | 880d3be385b90d95b92f1774be8cd0c180b167e4 (patch) | |
tree | 0602e4095f325c7cb53130b8915eef51f05d26db | |
parent | 7c2a8686c6499b49353afdcaa259d622690ba80a (diff) |
Migrate MTP components into new project.
Bug: 138999976
Test: manual
Change-Id: I440fc37ff7b2be48b415989eb64b528a0c89b833
140 files changed, 1 insertions, 10066 deletions
diff --git a/packages/MtpDocumentsProvider/Android.bp b/packages/MtpDocumentsProvider/Android.bp deleted file mode 100644 index 3dafa2649af6..000000000000 --- a/packages/MtpDocumentsProvider/Android.bp +++ /dev/null @@ -1,11 +0,0 @@ -android_app { - name: "MtpDocumentsProvider", - - srcs: ["src/**/*.java"], - platform_apis: true, - certificate: "media", - privileged: true, - optimize: { - proguard_flags_files: ["proguard.flags"], - }, -} diff --git a/packages/MtpDocumentsProvider/AndroidManifest.xml b/packages/MtpDocumentsProvider/AndroidManifest.xml deleted file mode 100644 index c0a59b3badbf..000000000000 --- a/packages/MtpDocumentsProvider/AndroidManifest.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.mtp" - android:sharedUserId="android.media"> - <uses-feature android:name="android.hardware.usb.host" /> - <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> - <uses-permission android:name="android.permission.MANAGE_USB" /> - <application android:label="@string/app_label"> - <provider - android:name=".MtpDocumentsProvider" - android:authorities="com.android.mtp.documents" - android:grantUriPermissions="true" - android:exported="true" - android:permission="android.permission.MANAGE_DOCUMENTS"> - <intent-filter> - <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> - </intent-filter> - </provider> - - <service android:name=".MtpDocumentsService" /> - - <activity android:name=".ReceiverActivity" - android:label="@string/downloads_app_label" - android:icon="@mipmap/ic_launcher_download" - android:theme="@android:style/Theme.NoDisplay" - android:excludeFromRecents="true"> - <intent-filter> - <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> - </intent-filter> - <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" - android:resource="@xml/device_filter" /> - </activity> - - <receiver android:name=".UsbIntentReceiver" android:exported="true"> - <intent-filter> - <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> - <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" /> - </intent-filter> - <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" - android:resource="@xml/device_filter" /> - </receiver> - </application> -</manifest> diff --git a/packages/MtpDocumentsProvider/MOVED b/packages/MtpDocumentsProvider/MOVED new file mode 100644 index 000000000000..6c8a519341f6 --- /dev/null +++ b/packages/MtpDocumentsProvider/MOVED @@ -0,0 +1 @@ +../../../../packages/services/Mtp diff --git a/packages/MtpDocumentsProvider/perf_tests/Android.mk b/packages/MtpDocumentsProvider/perf_tests/Android.mk deleted file mode 100644 index d2f1c7ab8060..000000000000 --- a/packages/MtpDocumentsProvider/perf_tests/Android.mk +++ /dev/null @@ -1,13 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests -LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_STATIC_JAVA_LIBRARIES := androidx.test.rules -LOCAL_PACKAGE_NAME := MtpDocumentsProviderPerfTests -LOCAL_PRIVATE_PLATFORM_APIS := true -LOCAL_INSTRUMENTATION_FOR := MtpDocumentsProvider -LOCAL_CERTIFICATE := media -LOCAL_COMPATIBILITY_SUITE += device-tests - -include $(BUILD_PACKAGE) diff --git a/packages/MtpDocumentsProvider/perf_tests/AndroidManifest.xml b/packages/MtpDocumentsProvider/perf_tests/AndroidManifest.xml deleted file mode 100644 index 4367652230d5..000000000000 --- a/packages/MtpDocumentsProvider/perf_tests/AndroidManifest.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.mtp.perftests" - android:sharedUserId="android.media"> - - <application> - <uses-library android:name="android.test.runner" /> - </application> - - <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" - android:targetPackage="com.android.mtp" - android:label="Performance tests for MtpDocumentsProvider." /> -</manifest> diff --git a/packages/MtpDocumentsProvider/perf_tests/AndroidTest.xml b/packages/MtpDocumentsProvider/perf_tests/AndroidTest.xml deleted file mode 100644 index 8b7292b625e1..000000000000 --- a/packages/MtpDocumentsProvider/perf_tests/AndroidTest.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2018 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<configuration description="Runs MtpDocumentsProviderPerfTests metric instrumentation."> - <option name="test-suite-tag" value="apct" /> - <option name="test-suite-tag" value="apct-metric-instrumentation" /> - <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> - <option name="cleanup-apks" value="true" /> - <option name="test-file-name" value="MtpDocumentsProviderPerfTests.apk" /> - </target_preparer> - - <test class="com.android.tradefed.testtype.AndroidJUnitTest" > - <option name="package" value="com.android.mtp.perftests" /> - </test> -</configuration> diff --git a/packages/MtpDocumentsProvider/perf_tests/src/com/android/mtp/AppFusePerfTest.java b/packages/MtpDocumentsProvider/perf_tests/src/com/android/mtp/AppFusePerfTest.java deleted file mode 100644 index 58b9c6728e0d..000000000000 --- a/packages/MtpDocumentsProvider/perf_tests/src/com/android/mtp/AppFusePerfTest.java +++ /dev/null @@ -1,122 +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.mtp; - -import android.app.Activity; -import android.content.Context; -import android.os.Bundle; -import android.os.ParcelFileDescriptor; -import android.os.ProxyFileDescriptorCallback; -import android.os.storage.StorageManager; -import android.system.ErrnoException; - -import androidx.test.InstrumentationRegistry; -import androidx.test.filters.LargeTest; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import java.io.IOException; - -@RunWith(JUnit4.class) -public class AppFusePerfTest { - final static int SIZE = 10 * 1024 * 1024; // 10MB - - @Test - @LargeTest - public void testReadWriteFile() throws IOException { - final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - final StorageManager storageManager = context.getSystemService(StorageManager.class); - - final byte[] bytes = new byte[SIZE]; - final int SAMPLES = 100; - final double[] readTime = new double[SAMPLES]; - final double[] writeTime = new double[SAMPLES]; - - for (int i = 0; i < SAMPLES; i++) { - final ParcelFileDescriptor fd = storageManager.openProxyFileDescriptor( - ParcelFileDescriptor.MODE_READ_ONLY, new TestCallback()); - try (final ParcelFileDescriptor.AutoCloseInputStream stream = - new ParcelFileDescriptor.AutoCloseInputStream(fd)) { - final long startTime = System.nanoTime(); - stream.read(bytes); - readTime[i] = (System.nanoTime() - startTime) / 1000.0 / 1000.0; - } - } - - for (int i = 0; i < SAMPLES; i++) { - final ParcelFileDescriptor fd = storageManager.openProxyFileDescriptor( - ParcelFileDescriptor.MODE_WRITE_ONLY | ParcelFileDescriptor.MODE_TRUNCATE, - new TestCallback()); - try (final ParcelFileDescriptor.AutoCloseOutputStream stream = - new ParcelFileDescriptor.AutoCloseOutputStream(fd)) { - final long startTime = System.nanoTime(); - stream.write(bytes); - writeTime[i] = (System.nanoTime() - startTime) / 1000.0 / 1000.0; - } - } - - double readAverage = 0; - double writeAverage = 0; - double readSquaredAverage = 0; - double writeSquaredAverage = 0; - for (int i = 0; i < SAMPLES; i++) { - readAverage += readTime[i]; - writeAverage += writeTime[i]; - readSquaredAverage += readTime[i] * readTime[i]; - writeSquaredAverage += writeTime[i] * writeTime[i]; - } - - readAverage /= SAMPLES; - writeAverage /= SAMPLES; - readSquaredAverage /= SAMPLES; - writeSquaredAverage /= SAMPLES; - - final Bundle results = new Bundle(); - results.putDouble("readAverage", readAverage); - results.putDouble("readStandardDeviation", - Math.sqrt(readSquaredAverage - readAverage * readAverage)); - results.putDouble("writeAverage", writeAverage); - results.putDouble("writeStandardDeviation", - Math.sqrt(writeSquaredAverage - writeAverage * writeAverage)); - InstrumentationRegistry.getInstrumentation().sendStatus(Activity.RESULT_OK, results); - } - - private static class TestCallback extends ProxyFileDescriptorCallback { - @Override - public long onGetSize() throws ErrnoException { - return SIZE; - } - - @Override - public int onRead(long offset, int size, byte[] data) throws ErrnoException { - return size; - } - - @Override - public int onWrite(long offset, int size, byte[] data) throws ErrnoException { - return size; - } - - @Override - public void onFsync() throws ErrnoException {} - - @Override - public void onRelease() {} - } -} diff --git a/packages/MtpDocumentsProvider/proguard.flags b/packages/MtpDocumentsProvider/proguard.flags deleted file mode 100644 index e6601212858e..000000000000 --- a/packages/MtpDocumentsProvider/proguard.flags +++ /dev/null @@ -1,4 +0,0 @@ -# Keeps methods that are invoked by JNI. --keepclassmembers class * { - @com.android.mtp.annotations.UsedByNative *; -} diff --git a/packages/MtpDocumentsProvider/res/drawable-hdpi/ic_root_mtp.png b/packages/MtpDocumentsProvider/res/drawable-hdpi/ic_root_mtp.png Binary files differdeleted file mode 100644 index 7691433a58eb..000000000000 --- a/packages/MtpDocumentsProvider/res/drawable-hdpi/ic_root_mtp.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/drawable-mdpi/ic_root_mtp.png b/packages/MtpDocumentsProvider/res/drawable-mdpi/ic_root_mtp.png Binary files differdeleted file mode 100644 index 1cf7b3ac0480..000000000000 --- a/packages/MtpDocumentsProvider/res/drawable-mdpi/ic_root_mtp.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/drawable-xhdpi/ic_root_mtp.png b/packages/MtpDocumentsProvider/res/drawable-xhdpi/ic_root_mtp.png Binary files differdeleted file mode 100644 index 27e35421a957..000000000000 --- a/packages/MtpDocumentsProvider/res/drawable-xhdpi/ic_root_mtp.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/drawable-xxhdpi/ic_root_mtp.png b/packages/MtpDocumentsProvider/res/drawable-xxhdpi/ic_root_mtp.png Binary files differdeleted file mode 100644 index 3df2578b263f..000000000000 --- a/packages/MtpDocumentsProvider/res/drawable-xxhdpi/ic_root_mtp.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/drawable-xxxhdpi/ic_root_mtp.png b/packages/MtpDocumentsProvider/res/drawable-xxxhdpi/ic_root_mtp.png Binary files differdeleted file mode 100644 index fd2b79566983..000000000000 --- a/packages/MtpDocumentsProvider/res/drawable-xxxhdpi/ic_root_mtp.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/mipmap-hdpi/ic_launcher_download.png b/packages/MtpDocumentsProvider/res/mipmap-hdpi/ic_launcher_download.png Binary files differdeleted file mode 100644 index f958bbd3c255..000000000000 --- a/packages/MtpDocumentsProvider/res/mipmap-hdpi/ic_launcher_download.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/mipmap-mdpi/ic_launcher_download.png b/packages/MtpDocumentsProvider/res/mipmap-mdpi/ic_launcher_download.png Binary files differdeleted file mode 100644 index f2e937663c2c..000000000000 --- a/packages/MtpDocumentsProvider/res/mipmap-mdpi/ic_launcher_download.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/mipmap-xhdpi/ic_launcher_download.png b/packages/MtpDocumentsProvider/res/mipmap-xhdpi/ic_launcher_download.png Binary files differdeleted file mode 100644 index 4dc533638757..000000000000 --- a/packages/MtpDocumentsProvider/res/mipmap-xhdpi/ic_launcher_download.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/mipmap-xxhdpi/ic_launcher_download.png b/packages/MtpDocumentsProvider/res/mipmap-xxhdpi/ic_launcher_download.png Binary files differdeleted file mode 100644 index 8716290969da..000000000000 --- a/packages/MtpDocumentsProvider/res/mipmap-xxhdpi/ic_launcher_download.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/mipmap-xxxhdpi/ic_launcher_download.png b/packages/MtpDocumentsProvider/res/mipmap-xxxhdpi/ic_launcher_download.png Binary files differdeleted file mode 100644 index f5be21991761..000000000000 --- a/packages/MtpDocumentsProvider/res/mipmap-xxxhdpi/ic_launcher_download.png +++ /dev/null diff --git a/packages/MtpDocumentsProvider/res/values-af/strings.xml b/packages/MtpDocumentsProvider/res/values-af/strings.xml deleted file mode 100644 index c2c8761146f3..000000000000 --- a/packages/MtpDocumentsProvider/res/values-af/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-gasheer"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Aflaaie"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Toegang tot lêers word tans van <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> af verkry"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Die ander toestel is besig. Jy kan nie lêers oordra voordat dit beskikbaar is nie."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Geen lêers is gevind nie. Die ander toestel is dalk gesluit. Indien wel, ontsluit dit en probeer weer."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-am/strings.xml b/packages/MtpDocumentsProvider/res/values-am/strings.xml deleted file mode 100644 index 7b721c86cec0..000000000000 --- a/packages/MtpDocumentsProvider/res/values-am/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"የMTP አስተናጋጅ"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"የወረዱ"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"ፋይሎችን ከ<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> በመድረስ ላይ"</string> - <string name="error_busy_device" msgid="3997316850357386589">"ሌላኛው መሣሪያ ሥራ በዝቶበታል። እስከሚገኝ ድረስ ፋይሎችን ማስተላለፍ አይችሉም።"</string> - <string name="error_locked_device" msgid="7557872102188356147">"ምንም ፋይሎች አልተገኙም። ሌላኛው መሣሪያ ተቆልፎ ሊሆን ይችላል። ተቆልፎ ከሆነ ይክፈቱት እና እንደገና ይሞክሩ።"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ar/strings.xml b/packages/MtpDocumentsProvider/res/values-ar/strings.xml deleted file mode 100644 index 284a8602ce6a..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ar/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"مضيف بروتوكول نقل الوسائط (MTP)"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"التنزيلات"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"جارٍ الوصول إلى الملفات من <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"الجهاز الآخر مشغول، ولا يمكنك نقل الملفات إلا بعد أن يصبح متاحًا."</string> - <string name="error_locked_device" msgid="7557872102188356147">"لم يتم العثور على ملفات، وربما يكون الجهاز الآخر في وضع القفل. إذا كان الأمر كذلك، فعليك إلغاء قفله وإعادة المحاولة."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-as/strings.xml b/packages/MtpDocumentsProvider/res/values-as/strings.xml deleted file mode 100644 index c8bdbd6ce4bf..000000000000 --- a/packages/MtpDocumentsProvider/res/values-as/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"এমটিপি হ\'ষ্ট"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ডাউনল\'ডসমূহ"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>ৰ পৰা ফাইলসমূহ চোৱা হৈছে"</string> - <string name="error_busy_device" msgid="3997316850357386589">"আনটো ডিভাইচ ব্যস্ত হৈ আছে। সেইটো উপলব্ধ নোহোৱালৈকে আপুনি ফাইলসমূহ স্থানান্তৰ কৰিব নোৱাৰে।"</string> - <string name="error_locked_device" msgid="7557872102188356147">"কোনো ফাইল পোৱা নগ\'ল। আনটো ডিভাইচ লক হৈ থাকিব পাৰে। যদি লক হৈ আছে, তেন্তে আনলক কৰি আকৌ চেষ্টা কৰক।"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-az/strings.xml b/packages/MtpDocumentsProvider/res/values-az/strings.xml deleted file mode 100644 index e8ed1242f13c..000000000000 --- a/packages/MtpDocumentsProvider/res/values-az/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Endirmələr"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Fayllara <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> cihazından daxil olunur"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Digər cihaz məşğuldur. Əlçatan olmayana kimi fayl köçürə bilməzsiniz."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Fayl tapılmadı. Digər cihaz kilidlənmiş ola bilər. Elədirsə, kiliddən çıxarın və yenidən cəhd edin."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-b+sr+Latn/strings.xml b/packages/MtpDocumentsProvider/res/values-b+sr+Latn/strings.xml deleted file mode 100644 index bc9009969a16..000000000000 --- a/packages/MtpDocumentsProvider/res/values-b+sr+Latn/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Preuzimanja"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Pristup datotekama sa uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Drugi uređaj je zauzet. Datoteke možete da prenesete tek kad on postane dostupan."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nije pronađena nijedna datoteka. Drugi uređaj je možda zaključan. Ako jeste, otključajte ga i pokušajte ponovo."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-be/strings.xml b/packages/MtpDocumentsProvider/res/values-be/strings.xml deleted file mode 100644 index f6263acb0150..000000000000 --- a/packages/MtpDocumentsProvider/res/values-be/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Вузел MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Спампоўкі"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Доступ да файлаў з <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Іншая прылада занята. Вы не можаце перадаць файлы, пакуль яна не стане даступнай."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Файлы не знойдзены. Іншая прылада можа быць заблакіравана. Калі гэта так, разблакіруйце яе і паўтарыце спробу."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-bg/strings.xml b/packages/MtpDocumentsProvider/res/values-bg/strings.xml deleted file mode 100644 index 52d311971fc1..000000000000 --- a/packages/MtpDocumentsProvider/res/values-bg/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP хост"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Изтегляния"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> на <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"От <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> се осъществява достъп до файловете"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Другото устройство е заето. Не можете да прехвърляте файлове, докато то не се освободи."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Няма намерени файлове. Другото устройство може да е заключено. Ако е така, отключете го и опитайте отново."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-bn/strings.xml b/packages/MtpDocumentsProvider/res/values-bn/strings.xml deleted file mode 100644 index 7fad89e89d60..000000000000 --- a/packages/MtpDocumentsProvider/res/values-bn/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP হোস্ট"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ডাউনলোডগুলি"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> থেকে ফাইলগুলিকে অ্যাক্সেস করা হচ্ছে"</string> - <string name="error_busy_device" msgid="3997316850357386589">"অন্য ডিভাইসটি ব্যস্ত আছে৷ এটি উপলব্ধ না হওয়া পর্যন্ত আপনি ফাইলগুলিকে স্থানান্তর করতে পারবেন না৷"</string> - <string name="error_locked_device" msgid="7557872102188356147">"কোনো ফাইল পাওয়া যায়নি৷ অন্য ডিভাইসটি লক থাকতে পারে৷ যদি তাই হয়, তাহলে এটিকে আনলক করে আবার চেষ্টা করুন৷"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-bs/strings.xml b/packages/MtpDocumentsProvider/res/values-bs/strings.xml deleted file mode 100644 index 18c2363356fc..000000000000 --- a/packages/MtpDocumentsProvider/res/values-bs/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Preuzimanja"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Pristupanje fajlovima iz uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Drugi uređaj je zauzet. Nećete moći prenositi fajlove dok ne bude dostupan."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Fajlovi nisu pronađeni. Moguće je da je drugi uređaj zaključan. Ako jeste, otključajte ga i pokušajte ponovo."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ca/strings.xml b/packages/MtpDocumentsProvider/res/values-ca/strings.xml deleted file mode 100644 index b2aa59966ac4..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ca/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Amfitrió MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Baixades"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"S\'està accedint als fitxers del dispositiu <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"L\'altre dispositiu està ocupat. No pots transferir fitxers fins que estigui disponible."</string> - <string name="error_locked_device" msgid="7557872102188356147">"No s\'han trobat fitxers. És possible que l\'altre dispositiu estigui bloquejat. Si és així, desbloqueja\'l i torna-ho a provar."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-cs/strings.xml b/packages/MtpDocumentsProvider/res/values-cs/strings.xml deleted file mode 100644 index 2156e8c52f7e..000000000000 --- a/packages/MtpDocumentsProvider/res/values-cs/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Hostitel MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Stahování"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> – <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Používání souborů ze zařízení <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Druhé zařízení je zaneprázdněné. Dokud nebude dostupné, soubory nelze přenést."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nebyly nalezeny žádné soubory. Druhé zařízení je možná uzamčené. Pokud ano, odemkněte jej a zkuste to znovu."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-da/strings.xml b/packages/MtpDocumentsProvider/res/values-da/strings.xml deleted file mode 100644 index b82c5e8b0af8..000000000000 --- a/packages/MtpDocumentsProvider/res/values-da/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Adgang til filer fra <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Den anden enhed er optaget. Du kan ikke overføre filer, før den er tilgængelig."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Der blev ikke fundet nogen filer. Den anden enhed er muligvis låst. Hvis dette er tilfældet, skal du låse den op og prøve igen."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-de/strings.xml b/packages/MtpDocumentsProvider/res/values-de/strings.xml deleted file mode 100644 index 9a71c769aaed..000000000000 --- a/packages/MtpDocumentsProvider/res/values-de/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> von <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Zugriff auf Dateien von <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Das andere Gerät ist nicht verfügbar. Du kannst die Dateien übertragen, sobald das Gerät wieder verfügbar ist."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Keine Dateien gefunden. Das andere Gerät ist möglicherweise gesperrt. Entsperre es in diesem Fall und versuche es noch einmal."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-el/strings.xml b/packages/MtpDocumentsProvider/res/values-el/strings.xml deleted file mode 100644 index 562d2952988a..000000000000 --- a/packages/MtpDocumentsProvider/res/values-el/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Κεντρικός υπολογιστής MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Λήψεις"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Πρόσβαση στα αρχεία από τη συσκευή <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Η άλλη συσκευή είναι απασχολημένη. Δεν μπορείτε να μεταφέρετε αρχεία μέχρι να γίνει διαθέσιμη."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Δεν βρέθηκαν αρχεία. Η άλλη συσκευή ενδέχεται να είναι κλειδωμένη. Εάν ισχύει αυτό, ξεκλειδώστε την και δοκιμάστε ξανά."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-en-rAU/strings.xml b/packages/MtpDocumentsProvider/res/values-en-rAU/strings.xml deleted file mode 100644 index 5f2167e8273a..000000000000 --- a/packages/MtpDocumentsProvider/res/values-en-rAU/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accessing files from <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"The other device is busy. You can\'t transfer files until it\'s available."</string> - <string name="error_locked_device" msgid="7557872102188356147">"No files found. The other device may be locked. If so, unlock it and try again."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-en-rCA/strings.xml b/packages/MtpDocumentsProvider/res/values-en-rCA/strings.xml deleted file mode 100644 index 5f2167e8273a..000000000000 --- a/packages/MtpDocumentsProvider/res/values-en-rCA/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accessing files from <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"The other device is busy. You can\'t transfer files until it\'s available."</string> - <string name="error_locked_device" msgid="7557872102188356147">"No files found. The other device may be locked. If so, unlock it and try again."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-en-rGB/strings.xml b/packages/MtpDocumentsProvider/res/values-en-rGB/strings.xml deleted file mode 100644 index 5f2167e8273a..000000000000 --- a/packages/MtpDocumentsProvider/res/values-en-rGB/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accessing files from <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"The other device is busy. You can\'t transfer files until it\'s available."</string> - <string name="error_locked_device" msgid="7557872102188356147">"No files found. The other device may be locked. If so, unlock it and try again."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-en-rIN/strings.xml b/packages/MtpDocumentsProvider/res/values-en-rIN/strings.xml deleted file mode 100644 index 5f2167e8273a..000000000000 --- a/packages/MtpDocumentsProvider/res/values-en-rIN/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accessing files from <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"The other device is busy. You can\'t transfer files until it\'s available."</string> - <string name="error_locked_device" msgid="7557872102188356147">"No files found. The other device may be locked. If so, unlock it and try again."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-en-rXC/strings.xml b/packages/MtpDocumentsProvider/res/values-en-rXC/strings.xml deleted file mode 100644 index e968a5513f0f..000000000000 --- a/packages/MtpDocumentsProvider/res/values-en-rXC/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accessing files from <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"The other device is busy. You can\'t transfer files until it\'s available."</string> - <string name="error_locked_device" msgid="7557872102188356147">"No files found. The other device may be locked. If so, unlock it and try again."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-es-rUS/strings.xml b/packages/MtpDocumentsProvider/res/values-es-rUS/strings.xml deleted file mode 100644 index 740d224d7136..000000000000 --- a/packages/MtpDocumentsProvider/res/values-es-rUS/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Host MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Descargas"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accediendo a los archivos de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"El otro dispositivo está ocupado. No podrás transferir archivos hasta que esté disponible."</string> - <string name="error_locked_device" msgid="7557872102188356147">"No se encontraron archivos. Es posible que el otro dispositivo esté bloqueado. Si es así, desbloquéalo y vuelve a intentarlo."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-es/strings.xml b/packages/MtpDocumentsProvider/res/values-es/strings.xml deleted file mode 100644 index d80a75ac07f7..000000000000 --- a/packages/MtpDocumentsProvider/res/values-es/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Host de MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Descargas"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accediendo a los archivos desde <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"El otro dispositivo está ocupado. No se pueden transferir archivos hasta que esté disponible."</string> - <string name="error_locked_device" msgid="7557872102188356147">"No se ha encontrado ningún archivo. Es posible que el otro dispositivo esté bloqueado. Si es así, desbloquéalo y vuelve a intentarlo."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-et/strings.xml b/packages/MtpDocumentsProvider/res/values-et/strings.xml deleted file mode 100644 index 7568777e15f7..000000000000 --- a/packages/MtpDocumentsProvider/res/values-et/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Allalaadimised"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>, <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Juurdepääsemine failidele seadmest <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Teine seade on hõivatud. Te ei saa faile üle viia enne, kui see seade on saadaval."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Faile ei leitud. Teine seade võib olla lukustatud. Kui see on nii, avage see ja proovige uuesti."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-eu/strings.xml b/packages/MtpDocumentsProvider/res/values-eu/strings.xml deleted file mode 100644 index dc9d463b98eb..000000000000 --- a/packages/MtpDocumentsProvider/res/values-eu/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP ostalaria"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Deskargak"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> gailuko fitxategiak atzitzen"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Beste gailua lanpetuta dago. Erabilgarri egon arte ezingo duzu transferitu fitxategirik."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Ez da aurkitu fitxategirik. Baliteke beste gailua blokeatuta egotea. Hala bada, desblokea ezazu eta saiatu berriro."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-fa/strings.xml b/packages/MtpDocumentsProvider/res/values-fa/strings.xml deleted file mode 100644 index 9ac58c7ad3f1..000000000000 --- a/packages/MtpDocumentsProvider/res/values-fa/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"میزبان MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"بارگیریها"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"دسترسی به فایلها از <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"دستگاه دیگر مشغول است. تا زمانی که این دستگاه دردسترس قرار نگیرد نمیتوانید فایلها را منتقل کنید."</string> - <string name="error_locked_device" msgid="7557872102188356147">"فایلی پیدا نشد. دستگاه دیگر ممکن است قفل باشد. اگر اینطور است، قفل آن را باز کنید و دوباره تلاش کنید."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-fi/strings.xml b/packages/MtpDocumentsProvider/res/values-fi/strings.xml deleted file mode 100644 index 0a61d08a566e..000000000000 --- a/packages/MtpDocumentsProvider/res/values-fi/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-isäntä"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Lataukset"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Käytetään laitteen <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> tiedostoja"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Toinen laite on varattu. Et voi siirtää tiedostoja, ennen kuin se on käytettävissä."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Tiedostoja ei löytynyt. Toinen laite voi olla lukittu. Jos näin on, avaa se ja yritä uudelleen."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-fr-rCA/strings.xml b/packages/MtpDocumentsProvider/res/values-fr-rCA/strings.xml deleted file mode 100644 index 281760ecb620..000000000000 --- a/packages/MtpDocumentsProvider/res/values-fr-rCA/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Hôte MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Téléchargements"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accès aux fichiers à partir de l\'appareil <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"L\'autre appareil est occupé. Vous devez attendre qu\'il soit disponible pour transférer des fichiers."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Aucun fichier trouvé. L\'autre appareil est peut-être verrouillé. Si c\'est le cas, déverrouillez-le, puis réessayez."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-fr/strings.xml b/packages/MtpDocumentsProvider/res/values-fr/strings.xml deleted file mode 100644 index 96c713b61af4..000000000000 --- a/packages/MtpDocumentsProvider/res/values-fr/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Hôte MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Téléchargements"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> – <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accès aux fichiers depuis le <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>…"</string> - <string name="error_busy_device" msgid="3997316850357386589">"L\'autre appareil est occupé. Vous devez attendre qu\'il soit disponible pour transférer des fichiers."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Aucun fichier trouvé. L\'autre appareil est peut-être verrouillé. Si tel est le cas, déverrouillez-le, puis réessayez."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-gl/strings.xml b/packages/MtpDocumentsProvider/res/values-gl/strings.xml deleted file mode 100644 index 7e61c7cedff9..000000000000 --- a/packages/MtpDocumentsProvider/res/values-gl/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Host MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Descargas"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> de <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accedendo aos ficheiros do dispositivo <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"O outro dispositivo está ocupado. Non podes transferir ficheiros ata que estea dispoñible."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Non se atopou ningún ficheiro. Se o outro dispositivo está bloqueado, desbloquéao e téntao de novo."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-gu/strings.xml b/packages/MtpDocumentsProvider/res/values-gu/strings.xml deleted file mode 100644 index 468bd9df397d..000000000000 --- a/packages/MtpDocumentsProvider/res/values-gu/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP હોસ્ટ"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ડાઉનલોડ્સ"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> ની ફાઇલોને ઍક્સેસ કરી રહ્યાં છે"</string> - <string name="error_busy_device" msgid="3997316850357386589">"અન્ય ઉપકરણ વ્યસ્ત છે. તે ઉપલબ્ધ ન થાય ત્યાં સુધી તમે ફાઇલોને ટ્રાન્સફર કરી શકતાં નથી."</string> - <string name="error_locked_device" msgid="7557872102188356147">"કોઈ ફાઇલો મળી નહીં. અન્ય ઉપકરણ લૉક કરેલ હોઈ શકે છે. જો આમ હોય, તો તેને અનલૉક કરો અને ફરી પ્રયાસ કરો."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-hi/strings.xml b/packages/MtpDocumentsProvider/res/values-hi/strings.xml deleted file mode 100644 index e469fc0ee1a6..000000000000 --- a/packages/MtpDocumentsProvider/res/values-hi/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP होस्ट"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"डाउनलोड"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> से फ़ाइलें ऐक्सेस कर रहा है"</string> - <string name="error_busy_device" msgid="3997316850357386589">"दूसरा डिवाइस व्यस्त है. आप उसके उपलब्ध हो जाने तक फ़ाइलें ट्रांसफ़र नहीं कर सकते."</string> - <string name="error_locked_device" msgid="7557872102188356147">"कोई फ़ाइल नहीं मिली. हो सकता है कि दूसरा डिवाइस लॉक हो. अगर ऐसा है, तो उसे अनलॉक करें और दोबारा कोशिश करें."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-hr/strings.xml b/packages/MtpDocumentsProvider/res/values-hr/strings.xml deleted file mode 100644 index 63fc5c768113..000000000000 --- a/packages/MtpDocumentsProvider/res/values-hr/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Preuzimanja"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g><xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Pristupanje datotekama s uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Drugi je uređaj zauzet. Datoteke ćete moći prenijeti kada postane dostupan."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Datoteke nisu pronađene. Drugi je uređaj možda zaključan. U tom ga slučaju otključajte i pokušajte ponovo."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-hu/strings.xml b/packages/MtpDocumentsProvider/res/values-hu/strings.xml deleted file mode 100644 index e5b822c14271..000000000000 --- a/packages/MtpDocumentsProvider/res/values-hu/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Letöltések"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Hozzáférés a fájlokhoz a következő eszközről: <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"A másik eszköz elfoglalt. Nem vihetők át fájlok addig, amíg rendelkezésre nem áll."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nem található fájl. Lehet, hogy a másik eszköz zárolva van. Ha igen, oldja fel, és próbálkozzon újra."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-hy/strings.xml b/packages/MtpDocumentsProvider/res/values-hy/strings.xml deleted file mode 100644 index 3a6bfb50de44..000000000000 --- a/packages/MtpDocumentsProvider/res/values-hy/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP խնամորդ"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Ներբեռնումներ"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Մուտք է գործում ֆայլեր <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> սարքից"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Մյուս սարքը զբաղված է: Ֆայլերը կարող եք փոխանցել միայն երբ այն հասանելի է:"</string> - <string name="error_locked_device" msgid="7557872102188356147">"Ֆայլեր չեն գտնվել: Հնարավոր է, որ մյուս սարքը կողպված է: Եթե դա այդպես է, ապակողպեք այն և փորձեք նորից:"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-in/strings.xml b/packages/MtpDocumentsProvider/res/values-in/strings.xml deleted file mode 100644 index 6f65337a1d61..000000000000 --- a/packages/MtpDocumentsProvider/res/values-in/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Host MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Download"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Mengakses file dari <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Perangkat lainnya sedang sibuk. Anda dapat mentransfer file jika telah tersedia."</string> - <string name="error_locked_device" msgid="7557872102188356147">"File tidak ditemukan. Perangkat lainnya mungkin terkunci. Jika begitu, buka kuncinya dan coba lagi."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-is/strings.xml b/packages/MtpDocumentsProvider/res/values-is/strings.xml deleted file mode 100644 index 9388f7e76efa..000000000000 --- a/packages/MtpDocumentsProvider/res/values-is/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-hýsill"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Niðurhal"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Fær aðgang að skrám frá <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Hitt tækið er upptekið. Þú getur ekki fært skrár fyrr en það er tiltækt."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Engar skrár fundust. Hitt tækið gæti verið læst. Ef svo er skaltu opna það og reyna aftur."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-it/strings.xml b/packages/MtpDocumentsProvider/res/values-it/strings.xml deleted file mode 100644 index a41699f55282..000000000000 --- a/packages/MtpDocumentsProvider/res/values-it/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Host MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Download"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> di <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Accesso ai file da <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"L\'altro dispositivo è occupato. I file non possono essere trasferiti fino a quando non sarà disponibile."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nessun file trovato. L\'altro dispositivo potrebbe essere bloccato. In questo caso, sbloccalo e riprova."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-iw/strings.xml b/packages/MtpDocumentsProvider/res/values-iw/strings.xml deleted file mode 100644 index 62dfe7dd4ebb..000000000000 --- a/packages/MtpDocumentsProvider/res/values-iw/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"מארח פרוטוקול העברת מדיה (MTP)"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"הורדות"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"גישה לקבצים מ-<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"המכשיר השני לא פנוי. ניתן יהיה להעביר קבצים רק לאחר שהוא יהיה זמין."</string> - <string name="error_locked_device" msgid="7557872102188356147">"לא נמצאו קבצים. ייתכן שהמכשיר השני נעול. אם כן, פתח אותו ונסה שוב."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ja/strings.xml b/packages/MtpDocumentsProvider/res/values-ja/strings.xml deleted file mode 100644 index 72ab33da2880..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ja/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP ホスト"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ダウンロード"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> からファイルにアクセスしています"</string> - <string name="error_busy_device" msgid="3997316850357386589">"接続先のデバイスは使用中のため、利用できるようになるまでファイルを転送できません。"</string> - <string name="error_locked_device" msgid="7557872102188356147">"ファイルが見つかりません。接続先のデバイスがロックされている可能性があります。その場合は、ロックを解除してからもう一度お試しください。"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ka/strings.xml b/packages/MtpDocumentsProvider/res/values-ka/strings.xml deleted file mode 100644 index 33812dfbf3df..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ka/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP ჰოსტი"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ჩამოტვირთვები"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"მიმდინარეობს <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>-ზე არსებულ ფაილებზე წვდომა"</string> - <string name="error_busy_device" msgid="3997316850357386589">"სხვა მოწყობილობა დაკავებულია. ფაილების გადატანა ვერ მოხერხდება, სანამ ის ხელმისაწვდომი არ გახდება."</string> - <string name="error_locked_device" msgid="7557872102188356147">"ფაილები ვერ მოიძებნა. მეორე მოწყობილობა შეიძლება დაბლოკილი იყოს. ამ შემთხვევაში, განბლოკეთ ის და ცადეთ ხელახლა."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-kk/strings.xml b/packages/MtpDocumentsProvider/res/values-kk/strings.xml deleted file mode 100644 index a6dea5b97b03..000000000000 --- a/packages/MtpDocumentsProvider/res/values-kk/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP хосты"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Жүктеп алынғандар"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Файлдарға <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> құрылғысынан кіру"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Екінші құрылғы бос емес. Ол босамайынша, файлдар тасымалданбайды."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Ешқандай файл табылмады. Екінші құрылғы құлыптаулы болуы мүмкін. Құлыптаулы болса, құлпын ашып, қайталап көріңіз."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-km/strings.xml b/packages/MtpDocumentsProvider/res/values-km/strings.xml deleted file mode 100644 index baffa95c426b..000000000000 --- a/packages/MtpDocumentsProvider/res/values-km/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"ម៉ាស៊ីន MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ដោយឡូត"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"កំពុងចូលដំណើរការពី <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"ឧបករណ៍ផ្សេងទៀតកំពុងជាប់រវល់។ អ្នកមិនផ្ទេរឯកសារបានទេ រហូតទាល់តែវាអាចប្រើបាន។"</string> - <string name="error_locked_device" msgid="7557872102188356147">"រកមិនឃើញឯកសារទេ។ ឧបករណ៍ផ្សេងទៀតប្រហែលជាត្រូវបានចាក់សោ។ ប្រសិនបើវាត្រូវបានចាក់សោមែន សូមដោះសោ ហើយព្យាយាមម្តងទៀត។"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-kn/strings.xml b/packages/MtpDocumentsProvider/res/values-kn/strings.xml deleted file mode 100644 index 3f16c142aba1..000000000000 --- a/packages/MtpDocumentsProvider/res/values-kn/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP ಹೋಸ್ಟ್"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ಡೌನ್ಲೋಡ್ಗಳು"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> ನಿಂದ ಫೈಲ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲಾಗುತ್ತಿದೆ"</string> - <string name="error_busy_device" msgid="3997316850357386589">"ಬೇರೆಯ ಸಾಧನವು ಕಾರ್ಯನಿರತವಾಗಿದೆ. ಇದು ಲಭ್ಯವಾಗುವವರೆಗೆ ಫೈಲ್ಗಳನ್ನು ನಿಮಗೆ ವರ್ಗಾಯಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ."</string> - <string name="error_locked_device" msgid="7557872102188356147">"ಯಾವುದೇ ಫೈಲ್ಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ಬೇರೆಯ ಸಾಧನವು ಲಾಕ್ ಆಗಿರಬಹುದು. ಹಾಗಾದಲ್ಲಿ, ಇದನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ko/strings.xml b/packages/MtpDocumentsProvider/res/values-ko/strings.xml deleted file mode 100644 index bbe2fe6d78a4..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ko/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP 호스트"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"다운로드"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>에서 파일에 액세스 중"</string> - <string name="error_busy_device" msgid="3997316850357386589">"다른 기기가 사용 중입니다. 다른 기기를 사용할 수 있을 때까지 파일을 전송할 수 없습니다."</string> - <string name="error_locked_device" msgid="7557872102188356147">"파일이 없습니다. 다른 기기가 잠겨 있을 수 있습니다. 기기의 잠금을 해제하고 다시 시도하세요."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ky/strings.xml b/packages/MtpDocumentsProvider/res/values-ky/strings.xml deleted file mode 100644 index e60a494a9919..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ky/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP хосту"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Жүктөлүп алынган нерселер"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> түзмөгүндөгү файлдар колдонулууда"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Берки түзмөк бош эмес. Ал бошомоюнча файлдарды өткөрө албайсыз."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Бир дагы файл табылган жок. Берки түзмөк кулпуланып турат окшойт. Кулпусун ачып, кайра аракет кылып көрүңүз."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-lo/strings.xml b/packages/MtpDocumentsProvider/res/values-lo/strings.xml deleted file mode 100644 index bcc0ee6b7ff3..000000000000 --- a/packages/MtpDocumentsProvider/res/values-lo/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"ໂຮສ MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ການດາວໂຫລດ"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"ກຳລັງເຂົ້າເຖິງໄຟລ໌ຈາກ <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"ອຸປະກອນອື່ນບໍ່ຫວ່າງເທື່ອ. ທ່ານບໍ່ສາມາດໂອນຍ້າຍໄຟລ໌ໄດ້ຈົນກວ່າມັນຈະຫວ່າງ."</string> - <string name="error_locked_device" msgid="7557872102188356147">"ບໍ່ພົບໄຟລ໌. ອຸປະກອນອີກເຄື່ອງອາດຖືກລັອກໄວ້ຢູ່. ຫາກມັນຖືກລັອກໄວ້, ໃຫ້ປົດລັອກມັນກ່ອນແລ້ວລອງໃໝ່ອີກຄັ້ງ."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-lt/strings.xml b/packages/MtpDocumentsProvider/res/values-lt/strings.xml deleted file mode 100644 index 8bff3a8fe78a..000000000000 --- a/packages/MtpDocumentsProvider/res/values-lt/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MPP priegloba"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Atsisiuntimai"</string> - <string name="root_name" msgid="5819495383921089536">"„<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>“ <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Pasiekiami failai iš „<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>“"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Kitas įrenginys yra užsiėmęs. Failus galėsite perkelti tik tada, kai jis bus pasiekiamas."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nerasta failų. Gali būti, kad kitas įrenginys yra užrakintas. Jei taip yra, atrakinkite jį ir bandykite dar kartą."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-lv/strings.xml b/packages/MtpDocumentsProvider/res/values-lv/strings.xml deleted file mode 100644 index 5e96338afaa0..000000000000 --- a/packages/MtpDocumentsProvider/res/values-lv/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP saimniekdators"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Lejupielādes"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Piekļuve failiem no: <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Otra ierīce ir aizņemta. Varēsiet pārsūtīt failus tikai tad, kad tā būs pieejama."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Neviens fails netika atrasts. Iespējams, otra ierīce ir bloķēta. Ja tā ir, atbloķējiet ierīci un mēģiniet vēlreiz."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-mk/strings.xml b/packages/MtpDocumentsProvider/res/values-mk/strings.xml deleted file mode 100644 index 6028b716ec9e..000000000000 --- a/packages/MtpDocumentsProvider/res/values-mk/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-хост"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Преземања"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Се пристапува до датотеки од <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Другиот уред е зафатен. Не може да се пренесуваат датотеки сѐ додека не стане достапен."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Не се најдени датотеки. Другиот уред можеби е заклучен. Ако е така, отклучете го и обидете се повторно."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ml/strings.xml b/packages/MtpDocumentsProvider/res/values-ml/strings.xml deleted file mode 100644 index 49eb847b1173..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ml/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP ഹോസ്റ്റ്"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ഡൗണ്ലോഡുകൾ"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> ഉപകരണത്തിൽ നിന്ന് ഫയലുകൾ ആക്സസ്സ് ചെയ്യുന്നു"</string> - <string name="error_busy_device" msgid="3997316850357386589">"രണ്ടാമത്തെ ഉപകരണം തിരക്കിലാണ്. അത് ലഭ്യമാകുന്നത് വരെ നിങ്ങൾക്ക് ഫയലുകൾ കൈമാറാൻ കഴിയില്ല."</string> - <string name="error_locked_device" msgid="7557872102188356147">"ഫയലുകളൊന്നും കണ്ടെത്തിയില്ല. രണ്ടാമത്തെ ഉപകരണം ലോക്കുചെയ്ത നിലയിലായിരിക്കാം. ആണെങ്കിൽ, അൺലോക്കുചെയ്ത് വീണ്ടും ശ്രമിക്കുക."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-mn/strings.xml b/packages/MtpDocumentsProvider/res/values-mn/strings.xml deleted file mode 100644 index 43b8204e7599..000000000000 --- a/packages/MtpDocumentsProvider/res/values-mn/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Хост"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Таталт"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>-с файлд хандаж байна"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Нөгөө төхөөрөмж завгүй байна. Үүнийг боломжтой болох хүртэл файл шилжүүлэх боломжгүй."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Файл олдсонгүй. Нөгөө төхөөрөмж түгжигдсэн байж болзошгүй. Ингэсэн тохиолдолд түгжээг нь тайлаад, дахин оролдоно уу."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-mr/strings.xml b/packages/MtpDocumentsProvider/res/values-mr/strings.xml deleted file mode 100644 index 983112c25390..000000000000 --- a/packages/MtpDocumentsProvider/res/values-mr/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP होस्ट"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"डाउनलोड"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> मधून फायलींंमध्ये प्रवेश करत आहे"</string> - <string name="error_busy_device" msgid="3997316850357386589">"दुसरे डिव्हाइस व्यस्त आहे. ते उपलब्ध होईपर्यंत तुम्ही फायली ट्रान्सफर करू शकत नाही."</string> - <string name="error_locked_device" msgid="7557872102188356147">"कोणत्याही फायली आढळल्या नाहीत. दुसरे डिव्हाइस कदाचित बंद असू शकते. तसे असल्यास, ते अनलॉक करा आणि पुन्हा प्रयत्न करा."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ms/strings.xml b/packages/MtpDocumentsProvider/res/values-ms/strings.xml deleted file mode 100644 index febec1d349af..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ms/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Hos MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Muat turun"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Mengakses fail daripada <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Peranti lain sedang sibuk. Anda tidak boleh memindahkan fail sehingga peranti itu tersedia."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Tiada fail ditemui. Peranti lain itu mungkin dikunci. Jika benar, sila buka kuncinya dan cuba lagi."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-my/strings.xml b/packages/MtpDocumentsProvider/res/values-my/strings.xml deleted file mode 100644 index 8b509fbf0167..000000000000 --- a/packages/MtpDocumentsProvider/res/values-my/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP လက်ခံစက်"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ဒေါင်းလုဒ်များ"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> မှ ဖိုင်များကို အသုံးပြုနေသည်"</string> - <string name="error_busy_device" msgid="3997316850357386589">"တခြားစက်ပစ္စည်းသည် မအားသေးပါ။ ၎င်းအဆင်သင့် မဖြစ်သေးသ၍ ဖိုင်များကို လွှဲပြောင်း၍ရမည် မဟုတ်ပါ။"</string> - <string name="error_locked_device" msgid="7557872102188356147">"မည်သည့်ဖိုင်မျှ မတွေ့ပါ။ ၎င်းစက်ပစ္စည်းကို လော့ခ်ချထားပုံရပါသည်။ သို့ဖြစ်လျှင် ၎င်းကိုလော့ခ်ဖြုတ်ပြီး ထပ်လုပ်ကြည့်ပါ။"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-nb/strings.xml b/packages/MtpDocumentsProvider/res/values-nb/strings.xml deleted file mode 100644 index 40fabed73f40..000000000000 --- a/packages/MtpDocumentsProvider/res/values-nb/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-vert"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Nedlastinger"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> på <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Bruker filer på <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Den andre enheten er opptatt. Du kan ikke overføre filer før den er tilgjengelig."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Ingen filer ble funnet. Den andre enheten kan være låst. I så fall må du låse den opp og prøve igjen."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ne/strings.xml b/packages/MtpDocumentsProvider/res/values-ne/strings.xml deleted file mode 100644 index 53c0954d296e..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ne/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP होस्ट"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"डाउनलोडहरू"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> बाट फाइलहरूमाथि पहुँच राख्दै"</string> - <string name="error_busy_device" msgid="3997316850357386589">"अर्को यन्त्र व्यस्त छ। त्यो यन्त्र उपलब्ध नभएसम्म तपाईं फाइल स्थानान्तरण गर्न सक्नुहुन्न।"</string> - <string name="error_locked_device" msgid="7557872102188356147">"कुनै फाइल भेट्टिएन। अर्को यन्त्र लक गरिएको हुन सक्छ। यदि त्यसो हो भने त्यसलाई अनलक गरेर फेरि प्रयास गर्नुहोस्।"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-nl/strings.xml b/packages/MtpDocumentsProvider/res/values-nl/strings.xml deleted file mode 100644 index b1a01b2cd8a9..000000000000 --- a/packages/MtpDocumentsProvider/res/values-nl/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Bestanden openen op <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Het andere apparaat wordt gebruikt. Je moet wachten tot het beschikbaar is om bestanden te kunnen overzetten."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Geen bestanden gevonden. Het kan zijn dat het andere apparaat is vergrendeld. Als dat het geval is, ontgrendel je het en probeer je het opnieuw."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-or/strings.xml b/packages/MtpDocumentsProvider/res/values-or/strings.xml deleted file mode 100644 index 79de689eacf4..000000000000 --- a/packages/MtpDocumentsProvider/res/values-or/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP ହୋଷ୍ଟ"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ଡାଉନଲୋଡ୍"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>ରୁ ଫାଇଲ୍ ଆକ୍ସେସ୍ କରାଯାଉଛି"</string> - <string name="error_busy_device" msgid="3997316850357386589">"ଅନ୍ୟ ଡିଭାଇସଟି ବ୍ୟସ୍ତ ଅଛି। ଏହା ଉପଲବ୍ଧ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଆପଣ ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ କରିପାରିବେ ନାହିଁ।"</string> - <string name="error_locked_device" msgid="7557872102188356147">"କୌଣସି ଫାଇଲ୍ ମିଳିଲା ନାହିଁ। ଅନ୍ୟ ଡିଭାଇସଟି ଲକ୍ ହୋଇଯାଇଥାଇପାରେ। ଯଦି ଏପରି ହୋଇଥାଏ, ଏହାକୁ ଅନଲକ୍ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-pa/strings.xml b/packages/MtpDocumentsProvider/res/values-pa/strings.xml deleted file mode 100644 index 7e3b8925596c..000000000000 --- a/packages/MtpDocumentsProvider/res/values-pa/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP ਹੋਸਟ"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ਡਾਊਨਲੋਡ"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> ਦੀਆਂ ਫ਼ਾਈਲਾਂ \'ਤੇ ਪਹੁੰਚ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string> - <string name="error_busy_device" msgid="3997316850357386589">"ਦੂਜਾ ਡੀਵਾਈਸ ਰੁਝੇਵੇਂ ਵਿੱਚ ਹੈ। ਉਸਦੇ ਉਪਲਬਧ ਹੋਣ ਤੱਕ ਤੁਸੀਂ ਫ਼ਾਈਲਾਂ ਦਾ ਤਬਾਦਲਾ ਨਹੀਂ ਕਰ ਸਕਦੇ।"</string> - <string name="error_locked_device" msgid="7557872102188356147">"ਕੋਈ ਫ਼ਾਈਲਾਂ ਨਹੀਂ ਮਿਲੀਆਂ। ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਦੂਜਾ ਡੀਵਾਈਸ ਲਾਕ ਹੋਵੇ। ਜੇਕਰ ਇੰਝ ਹੈ, ਤਾਂ ਉਸਨੂੰ ਅਣਲਾਕ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-pl/strings.xml b/packages/MtpDocumentsProvider/res/values-pl/strings.xml deleted file mode 100644 index 69fa0f4473ca..000000000000 --- a/packages/MtpDocumentsProvider/res/values-pl/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Host MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Pobrane"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> – <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Uzyskuję dostęp do plików na urządzeniu <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Drugie urządzenie jest zajęte. Dopóki nie będzie dostępne, nie możesz przesłać plików."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nie znaleziono plików. Drugie urządzenie może być zablokowane. Jeśli tak jest, odblokuj je i spróbuj ponownie."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-pt-rBR/strings.xml b/packages/MtpDocumentsProvider/res/values-pt-rBR/strings.xml deleted file mode 100644 index 03a14263f9c3..000000000000 --- a/packages/MtpDocumentsProvider/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Host do MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Acessando arquivos do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"O outro dispositivo está ocupado. Não é possível transferir arquivos até que ele esteja disponível."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nenhum arquivo encontrado. É possível que o outro dispositivo esteja bloqueado. Se for o caso, desbloqueie-o e tente novamente."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-pt-rPT/strings.xml b/packages/MtpDocumentsProvider/res/values-pt-rPT/strings.xml deleted file mode 100644 index 05d32d40fa27..000000000000 --- a/packages/MtpDocumentsProvider/res/values-pt-rPT/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Anfitrião MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Transferências"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Aceder a ficheiros do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"O outro dispositivo está ocupado. Não pode transferir os ficheiros enquanto não estiver disponível."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nenhum ficheiro encontrado. O outro dispositivo pode estar bloqueado. Se assim for, desbloqueie e tente novamente."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-pt/strings.xml b/packages/MtpDocumentsProvider/res/values-pt/strings.xml deleted file mode 100644 index 03a14263f9c3..000000000000 --- a/packages/MtpDocumentsProvider/res/values-pt/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Host do MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Downloads"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Acessando arquivos do <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"O outro dispositivo está ocupado. Não é possível transferir arquivos até que ele esteja disponível."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nenhum arquivo encontrado. É possível que o outro dispositivo esteja bloqueado. Se for o caso, desbloqueie-o e tente novamente."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ro/strings.xml b/packages/MtpDocumentsProvider/res/values-ro/strings.xml deleted file mode 100644 index 21ebc57836b4..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ro/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Gazdă MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Descărcări"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Se accesează fișierele de pe <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Celălalt dispozitiv este ocupat. Nu puteți să transferați fișiere înainte să fie disponibil."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nu s-au găsit fișiere. Este posibil ca celălalt dispozitiv să fie blocat. În acest caz, deblocați-l și încercați din nou."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ru/strings.xml b/packages/MtpDocumentsProvider/res/values-ru/strings.xml deleted file mode 100644 index 717f12f5403f..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ru/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-хост"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Загрузки"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="STORAGE_NAME">%2$s</xliff:g> <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Доступ к файлам на устройстве <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>…"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Другое устройство занято. Вы сможете передать файлы, когда оно будет доступно."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Файлы не найдены. Если другое устройство заблокировано, разблокируйте его и повторите попытку."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-si/strings.xml b/packages/MtpDocumentsProvider/res/values-si/strings.xml deleted file mode 100644 index 7a096b0a356a..000000000000 --- a/packages/MtpDocumentsProvider/res/values-si/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP සංග්රාහක"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"බාගැනීම්"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> වෙතින් ගොනු වෙත පිවිසීම"</string> - <string name="error_busy_device" msgid="3997316850357386589">"අනෙක් උපාංගය කාර්ය බහුලය. එය ලබා ගත හැකි වන තෙක් ඔබට ගොනු මාරු කළ නොහැකිය."</string> - <string name="error_locked_device" msgid="7557872102188356147">"ගොනු හමු නොවීය. අනෙක් උපාංගය අගුලු දමා තිබිය හැකිය. එසේ නම්, එය අගුලු හැර නැවත උත්සාහ කරන්න."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-sk/strings.xml b/packages/MtpDocumentsProvider/res/values-sk/strings.xml deleted file mode 100644 index 365e1b7ba0ae..000000000000 --- a/packages/MtpDocumentsProvider/res/values-sk/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Hostiteľ MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Stiahnuté súbory"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Prístup k súborom zo zariadenia <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Druhé zariadenie je zaneprázdnené. Súbory bude možné preniesť, keď bude k dispozícii."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nenašli sa žiadne súbory. Druhé zariadenie môže byť uzamknuté. Ak je to tak, odomknite ho a skúste to znova."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-sl/strings.xml b/packages/MtpDocumentsProvider/res/values-sl/strings.xml deleted file mode 100644 index 60945d64fe8f..000000000000 --- a/packages/MtpDocumentsProvider/res/values-sl/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Gostitelj MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Prenosi"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Dostopanje do datotek iz naprave <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Druga naprava ni na voljo. Dokler ne bo na voljo, ne bo mogoče prenašati datotek."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Ni datotek. Druga naprava je morda zaklenjena. Če je zaklenjena, jo odklenite in poskusite znova."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-sq/strings.xml b/packages/MtpDocumentsProvider/res/values-sq/strings.xml deleted file mode 100644 index d92f29f6db60..000000000000 --- a/packages/MtpDocumentsProvider/res/values-sq/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Pritësi i protokollit MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Shkarkimet"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Po qaset te skedarët nga <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Pajisja tjetër është e zënë. Nuk mund të transferosh skedarë deri sa të jetë në dispozicion."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Nuk u gjet asnjë skedar. Pajisja tjetër mund të jetë e kyçur. Nëse po, shkyçe dhe provo përsëri."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-sr/strings.xml b/packages/MtpDocumentsProvider/res/values-sr/strings.xml deleted file mode 100644 index d91c5c4354ce..000000000000 --- a/packages/MtpDocumentsProvider/res/values-sr/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP хост"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Преузимања"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Приступ датотекама са уређаја <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Други уређај је заузет. Датотеке можете да пренесете тек кад он постане доступан."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Није пронађена ниједна датотека. Други уређај је можда закључан. Ако јесте, откључајте га и покушајте поново."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-sv/strings.xml b/packages/MtpDocumentsProvider/res/values-sv/strings.xml deleted file mode 100644 index 26818eb220ce..000000000000 --- a/packages/MtpDocumentsProvider/res/values-sv/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP-värd"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Nedladdningar"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Åtkomst till filer från <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Den andra enheten är upptagen. Du kan inte överföra filer förrän den är tillgänglig."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Inga filer hittades. Den andra enheten kan vara låst. Om den är det låser du upp den och försöker igen."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-sw/strings.xml b/packages/MtpDocumentsProvider/res/values-sw/strings.xml deleted file mode 100644 index de3ed54b367f..000000000000 --- a/packages/MtpDocumentsProvider/res/values-sw/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Seva pangishi ya MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Vipakuliwa"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Inafikia faili kwenye <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Kifaa hicho kingine kinatumika. Huwezi kuhamisha faili hadi kipatikane."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Hakuna faili zilizopatikana. Huenda kifaa hicho kingine kimefungwa. Ikiwa kimefungwa, kifungue na ujaribu tena."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ta/strings.xml b/packages/MtpDocumentsProvider/res/values-ta/strings.xml deleted file mode 100644 index c6e6e6204e2f..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ta/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP ஹோஸ்ட்"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"இறக்கங்கள்"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> இலிருந்து கோப்புகளை அணுகுகிறது"</string> - <string name="error_busy_device" msgid="3997316850357386589">"பிற சாதனம் பணிமிகுதியில் உள்ளதால், அந்தப் பணி முடியும் வரை கோப்புகளை இடமாற்ற முடியாது."</string> - <string name="error_locked_device" msgid="7557872102188356147">"கோப்புகள் இல்லை. பிற சாதனம் பூட்டப்பட்டிருக்கக்கூடும் என்பதால் முதலில் அதைத் திறந்து, மீண்டும் முயலவும்."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-te/strings.xml b/packages/MtpDocumentsProvider/res/values-te/strings.xml deleted file mode 100644 index b3436bf7ebb0..000000000000 --- a/packages/MtpDocumentsProvider/res/values-te/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP హోస్ట్"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"డౌన్లోడ్లు"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> నుండి ఫైల్లను యాక్సెస్ చేస్తోంది"</string> - <string name="error_busy_device" msgid="3997316850357386589">"ఇతర పరికరం బిజీగా ఉంది. అది అందుబాటులోకి వచ్చే వరకు మీరు ఫైల్లను బదిలీ చేయలేరు."</string> - <string name="error_locked_device" msgid="7557872102188356147">"ఫైల్లు ఏవీ కనుగొనబడలేదు. ఇతర పరికరం లాక్ చేయబడి ఉండవచ్చు. అలా జరిగి ఉంటే, దాన్ని అన్లాక్ చేసి, ఆపై మళ్లీ ప్రయత్నించండి."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-th/strings.xml b/packages/MtpDocumentsProvider/res/values-th/strings.xml deleted file mode 100644 index d2b62fe516e1..000000000000 --- a/packages/MtpDocumentsProvider/res/values-th/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"โฮสต์ MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ดาวน์โหลด"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"กำลังเข้าถึงไฟล์จาก <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"อุปกรณ์อีกเครื่องหนึ่งไม่ว่าง คุณไม่สามารถโอนไฟล์จนกว่าอุปกรณ์จะสามารถใช้ได้"</string> - <string name="error_locked_device" msgid="7557872102188356147">"ไม่พบไฟล์ อุปกรณ์อีกเครื่องหนึ่งอาจล็อกอยู่ หากเป็นเช่นนั้น ให้ปลดล็อกและลองอีกครั้ง"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-tl/strings.xml b/packages/MtpDocumentsProvider/res/values-tl/strings.xml deleted file mode 100644 index 68b2eba38ea3..000000000000 --- a/packages/MtpDocumentsProvider/res/values-tl/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Host ng MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Mga Download"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Nag-a-access ng mga file mula sa <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Abala ang kabilang device. Hindi ka makakapaglipat ng mga file hanggang sa maging available ito."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Walang natagpuang mga file. Maaaring naka-lock ang kabilang device. Kung gayon, i-unlock ito at subukang muli."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-tr/strings.xml b/packages/MtpDocumentsProvider/res/values-tr/strings.xml deleted file mode 100644 index 14250ef527c7..000000000000 --- a/packages/MtpDocumentsProvider/res/values-tr/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Ana Makinesi"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"İndirilenler"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> cihazdaki dosyalara erişiliyor"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Diğer cihaz meşgul. Cihaz kullanılabilir duruma gelene kadar dosyaları aktaramazsınız."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Hiçbir dosya bulunamadı. Diğer cihaz kilitli olabilir. Kilitliyse, kilidini açıp tekrar deneyin."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-uk/strings.xml b/packages/MtpDocumentsProvider/res/values-uk/strings.xml deleted file mode 100644 index 8589f8c594b6..000000000000 --- a/packages/MtpDocumentsProvider/res/values-uk/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Хост MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Завантаження"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Відкриваються файли з пристрою <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Інший пристрій зайнятий. Щоб передавати файли, він має бути доступним."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Не вдалося знайти файли. Можливо, інший пристрій заблоковано. У такому разі розблокуйте його та повторіть спробу."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-ur/strings.xml b/packages/MtpDocumentsProvider/res/values-ur/strings.xml deleted file mode 100644 index 17578ae51b9f..000000000000 --- a/packages/MtpDocumentsProvider/res/values-ur/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP میزبان"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"ڈاؤن لوڈز"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> سے فائلوں کی رسائی ہو رہی ہے"</string> - <string name="error_busy_device" msgid="3997316850357386589">"دوسرا آلہ مصروف ہے۔ اس کے دستیاب ہونے تک آپ فائلیں منتقل نہیں کر سکتے۔"</string> - <string name="error_locked_device" msgid="7557872102188356147">"کوئی فائلیں نہیں ملیں۔ ہو سکتا ہے دوسرا آلہ مقفل ہو۔ اگر ایسا ہے تو اسے غیر مقفل کریں اور دوبارہ کوشش کریں۔"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-uz/strings.xml b/packages/MtpDocumentsProvider/res/values-uz/strings.xml deleted file mode 100644 index c511172076c0..000000000000 --- a/packages/MtpDocumentsProvider/res/values-uz/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Yuklanmalar"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g><xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> qurilmasidan fayllar o‘qilmoqda"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Ulangan qurilma band. U bo‘shamaguncha fayllarni o‘tkazib bo‘lmaydi."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Hech qanday fayl topilmadi. Ulangan qurilma qulflangan bo‘lishi mumkin. Agar shunday bo‘lsa, uni qulfdan chiqaring va qayta urinib ko‘ring."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-vi/strings.xml b/packages/MtpDocumentsProvider/res/values-vi/strings.xml deleted file mode 100644 index 0eb63106d85e..000000000000 --- a/packages/MtpDocumentsProvider/res/values-vi/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Máy chủ MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Tải xuống"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Đang truy cập tệp từ <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Thiết bị khác đang bận. Bạn không thể chuyển tệp cho đến khi thiết bị rảnh."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Không tìm thấy tệp. Thiết bị khác có thể đã bị khóa. Nếu như vậy, hãy mở khóa thiết bị rồi thử lại."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-zh-rCN/strings.xml b/packages/MtpDocumentsProvider/res/values-zh-rCN/strings.xml deleted file mode 100644 index 7f1f3942c911..000000000000 --- a/packages/MtpDocumentsProvider/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"MTP 主机"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"下载"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"正在访问 <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> 的文件"</string> - <string name="error_busy_device" msgid="3997316850357386589">"另一台设备正忙。您必须等到该设备可用时才能传输文件。"</string> - <string name="error_locked_device" msgid="7557872102188356147">"未找到任何文件。另一台设备可能处于锁定状态;如果是这样,请解锁该设备并重试。"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-zh-rHK/strings.xml b/packages/MtpDocumentsProvider/res/values-zh-rHK/strings.xml deleted file mode 100644 index be8c5482c13c..000000000000 --- a/packages/MtpDocumentsProvider/res/values-zh-rHK/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"媒體傳輸協定主機"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"下載"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> 的「<xliff:g id="STORAGE_NAME">%2$s</xliff:g>」"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"正在從 <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> 存取檔案"</string> - <string name="error_busy_device" msgid="3997316850357386589">"另一部裝置目前處於忙碌狀態,要等到該裝置可用時才能轉移檔案。"</string> - <string name="error_locked_device" msgid="7557872102188356147">"找不到檔案。如果另一部裝置處於鎖定狀態,請解鎖該裝置,然後再試一次。"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-zh-rTW/strings.xml b/packages/MtpDocumentsProvider/res/values-zh-rTW/strings.xml deleted file mode 100644 index 2fe3c06898e0..000000000000 --- a/packages/MtpDocumentsProvider/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"媒體傳輸通訊協定主機"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"下載"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"正在從 <xliff:g id="DEVICE_MODEL">%1$s</xliff:g> 存取檔案"</string> - <string name="error_busy_device" msgid="3997316850357386589">"另一個裝置忙碌中。必須等到該裝置可用時才能轉移檔案。"</string> - <string name="error_locked_device" msgid="7557872102188356147">"找不到任何檔案。如果另一個裝置處於鎖定狀態,請將該裝置解鎖後再試一次。"</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values-zu/strings.xml b/packages/MtpDocumentsProvider/res/values-zu/strings.xml deleted file mode 100644 index f3f720676b22..000000000000 --- a/packages/MtpDocumentsProvider/res/values-zu/strings.xml +++ /dev/null @@ -1,25 +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 xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="6271216747302322594">"Ukusingatha kwe-MTP"</string> - <string name="downloads_app_label" msgid="7120690641874849726">"Okulandiwe"</string> - <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Ifinyelela kumafayela kusukela ku-<xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> - <string name="error_busy_device" msgid="3997316850357386589">"Enye idivayisi imatasatasa. Awukwazi ukudlulisela amafayela ize itholakale."</string> - <string name="error_locked_device" msgid="7557872102188356147">"Awekho amafayela atholiwe. Enye idivayisi kungenzeka ikhiyiwe. Uma kunjalo, yivule uphinde uzame futhi."</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/values/strings.xml b/packages/MtpDocumentsProvider/res/values/strings.xml deleted file mode 100644 index b94aba0e19d7..000000000000 --- a/packages/MtpDocumentsProvider/res/values/strings.xml +++ /dev/null @@ -1,32 +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 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- App title of MtpDocumentsProvider [CHAR LIMIT=32] --> - <string name="app_label">MTP Host</string> - <!-- App title of DocumentsUI [CHAR LIMIT=32] --> - <string name="downloads_app_label">Downloads</string> - <!-- Name of MTP root shown in UI. Please align the two strings (device - model and storage name) in proper order in the language. - [CHAR LIMIT=32] --> - <string name="root_name"><xliff:g id="device_model" example="Nexus 9">%1$s</xliff:g> <xliff:g id="storage_name" example="Internal Storage">%2$s</xliff:g></string> - <!-- Title of notification showing Files app is accessing files in a MTP device. [CHAR LIMIT=60]--> - <string name="accessing_notification_title">Accessing files from <xliff:g id="device_model" example="Nexus 9">%1$s</xliff:g></string> - <!-- Error message shown in Files app when the connected MTP device is busy. [CHAR LIMIT=150]--> - <string name="error_busy_device">The other device is busy. You can\'t transfer files until it\'s available.</string> - <!-- Error message shown in Files app when the connected MTP device may be locked. [CHAR LIMIT=150]--> - <string name="error_locked_device">No files found. The other device may be locked. If so, unlock it and try again.</string> -</resources> diff --git a/packages/MtpDocumentsProvider/res/xml/device_filter.xml b/packages/MtpDocumentsProvider/res/xml/device_filter.xml deleted file mode 100644 index 7afa2b15d68f..000000000000 --- a/packages/MtpDocumentsProvider/res/xml/device_filter.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> - <!-- filter for MTP/PTP devices --> - <usb-device class="255" subclass="255" protocol="0" /> - <usb-device class="6" subclass="1" protocol="1" /> -</resources> diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/BusyDeviceException.java b/packages/MtpDocumentsProvider/src/com/android/mtp/BusyDeviceException.java deleted file mode 100644 index 83488cd5b490..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/BusyDeviceException.java +++ /dev/null @@ -1,28 +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.mtp; - -import java.io.IOException; - -/** - * Exception thrown when the device is busy and the requested operation cannon be completed. - */ -class BusyDeviceException extends IOException { - BusyDeviceException() { - super("The MTP device is busy."); - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java deleted file mode 100644 index 6ed4ea1db499..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java +++ /dev/null @@ -1,432 +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.mtp; - -import android.annotation.Nullable; -import android.annotation.WorkerThread; -import android.content.ContentResolver; -import android.database.Cursor; -import android.mtp.MtpConstants; -import android.mtp.MtpObjectInfo; -import android.net.Uri; -import android.os.Bundle; -import android.os.Process; -import android.provider.DocumentsContract; -import android.util.Log; - -import com.android.internal.util.Preconditions; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedList; - -/** - * Loader for MTP document. - * At the first request, the loader returns only first NUM_INITIAL_ENTRIES. Then it launches - * background thread to load the rest documents and caches its result for next requests. - * TODO: Rename this class to ObjectInfoLoader - */ -class DocumentLoader implements AutoCloseable { - static final int NUM_INITIAL_ENTRIES = 10; - static final int NUM_LOADING_ENTRIES = 20; - static final int NOTIFY_PERIOD_MS = 500; - - private final MtpDeviceRecord mDevice; - private final MtpManager mMtpManager; - private final ContentResolver mResolver; - private final MtpDatabase mDatabase; - private final TaskList mTaskList = new TaskList(); - private Thread mBackgroundThread; - - DocumentLoader(MtpDeviceRecord device, MtpManager mtpManager, ContentResolver resolver, - MtpDatabase database) { - mDevice = device; - mMtpManager = mtpManager; - mResolver = resolver; - mDatabase = database; - } - - /** - * Queries the child documents of given parent. - * It loads the first NUM_INITIAL_ENTRIES of object info, then launches the background thread - * to load the rest. - */ - synchronized Cursor queryChildDocuments(String[] columnNames, Identifier parent) - throws IOException { - assert parent.mDeviceId == mDevice.deviceId; - - LoaderTask task = mTaskList.findTask(parent); - if (task == null) { - if (parent.mDocumentId == null) { - throw new FileNotFoundException("Parent not found."); - } - // TODO: Handle nit race around here. - // 1. getObjectHandles. - // 2. putNewDocument. - // 3. startAddingChildDocuemnts. - // 4. stopAddingChildDocuments - It removes the new document added at the step 2, - // because it is not updated between start/stopAddingChildDocuments. - task = new LoaderTask(mMtpManager, mDatabase, mDevice.operationsSupported, parent); - task.loadObjectHandles(); - task.loadObjectInfoList(NUM_INITIAL_ENTRIES); - } else { - // Once remove the existing task in order to add it to the head of the list. - mTaskList.remove(task); - } - - mTaskList.addFirst(task); - if (task.getState() == LoaderTask.STATE_LOADING) { - resume(); - } - return task.createCursor(mResolver, columnNames); - } - - /** - * Resumes a background thread. - */ - synchronized void resume() { - if (mBackgroundThread == null) { - mBackgroundThread = new BackgroundLoaderThread(); - mBackgroundThread.start(); - } - } - - /** - * Obtains next task to be run in background thread, or release the reference to background - * thread. - * - * Worker thread that receives null task needs to exit. - */ - @WorkerThread - synchronized @Nullable LoaderTask getNextTaskOrReleaseBackgroundThread() { - Preconditions.checkState(mBackgroundThread != null); - - for (final LoaderTask task : mTaskList) { - if (task.getState() == LoaderTask.STATE_LOADING) { - return task; - } - } - - final Identifier identifier = mDatabase.getUnmappedDocumentsParent(mDevice.deviceId); - if (identifier != null) { - final LoaderTask existingTask = mTaskList.findTask(identifier); - if (existingTask != null) { - Preconditions.checkState(existingTask.getState() != LoaderTask.STATE_LOADING); - mTaskList.remove(existingTask); - } - final LoaderTask newTask = new LoaderTask( - mMtpManager, mDatabase, mDevice.operationsSupported, identifier); - newTask.loadObjectHandles(); - mTaskList.addFirst(newTask); - return newTask; - } - - mBackgroundThread = null; - return null; - } - - /** - * Terminates background thread. - */ - @Override - public void close() throws InterruptedException { - final Thread thread; - synchronized (this) { - mTaskList.clear(); - thread = mBackgroundThread; - } - if (thread != null) { - thread.interrupt(); - thread.join(); - } - } - - synchronized void clearCompletedTasks() { - mTaskList.clearCompletedTasks(); - } - - /** - * Cancels the task for |parentIdentifier|. - * - * Task is removed from the cached list and it will create new task when |parentIdentifier|'s - * children are queried next. - */ - void cancelTask(Identifier parentIdentifier) { - final LoaderTask task; - synchronized (this) { - task = mTaskList.findTask(parentIdentifier); - } - if (task != null) { - task.cancel(); - mTaskList.remove(task); - } - } - - /** - * Background thread to fetch object info. - */ - private class BackgroundLoaderThread extends Thread { - /** - * Finds task that needs to be processed, then loads NUM_LOADING_ENTRIES of object info and - * store them to the database. If it does not find a task, exits the thread. - */ - @Override - public void run() { - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - while (!Thread.interrupted()) { - final LoaderTask task = getNextTaskOrReleaseBackgroundThread(); - if (task == null) { - return; - } - task.loadObjectInfoList(NUM_LOADING_ENTRIES); - final boolean shouldNotify = - task.getState() != LoaderTask.STATE_CANCELLED && - (task.mLastNotified.getTime() < - new Date().getTime() - NOTIFY_PERIOD_MS || - task.getState() != LoaderTask.STATE_LOADING); - if (shouldNotify) { - task.notify(mResolver); - } - } - } - } - - /** - * Task list that has helper methods to search/clear tasks. - */ - private static class TaskList extends LinkedList<LoaderTask> { - LoaderTask findTask(Identifier parent) { - for (int i = 0; i < size(); i++) { - if (get(i).mIdentifier.equals(parent)) - return get(i); - } - return null; - } - - void clearCompletedTasks() { - int i = 0; - while (i < size()) { - if (get(i).getState() == LoaderTask.STATE_COMPLETED) { - remove(i); - } else { - i++; - } - } - } - } - - /** - * Loader task. - * Each task is responsible for fetching child documents for the given parent document. - */ - private static class LoaderTask { - static final int STATE_START = 0; - static final int STATE_LOADING = 1; - static final int STATE_COMPLETED = 2; - static final int STATE_ERROR = 3; - static final int STATE_CANCELLED = 4; - - final MtpManager mManager; - final MtpDatabase mDatabase; - final int[] mOperationsSupported; - final Identifier mIdentifier; - int[] mObjectHandles; - int mState; - Date mLastNotified; - int mPosition; - IOException mError; - - LoaderTask(MtpManager manager, MtpDatabase database, int[] operationsSupported, - Identifier identifier) { - assert operationsSupported != null; - assert identifier.mDocumentType != MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE; - mManager = manager; - mDatabase = database; - mOperationsSupported = operationsSupported; - mIdentifier = identifier; - mObjectHandles = null; - mState = STATE_START; - mPosition = 0; - mLastNotified = new Date(); - } - - synchronized void loadObjectHandles() { - assert mState == STATE_START; - mPosition = 0; - int parentHandle = mIdentifier.mObjectHandle; - // Need to pass the special value MtpManager.OBJECT_HANDLE_ROOT_CHILDREN to - // getObjectHandles if we would like to obtain children under the root. - if (mIdentifier.mDocumentType == MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE) { - parentHandle = MtpManager.OBJECT_HANDLE_ROOT_CHILDREN; - } - try { - mObjectHandles = mManager.getObjectHandles( - mIdentifier.mDeviceId, mIdentifier.mStorageId, parentHandle); - mState = STATE_LOADING; - } catch (IOException error) { - mError = error; - mState = STATE_ERROR; - } - } - - /** - * Returns a cursor that traverses the child document of the parent document handled by the - * task. - * The returned task may have a EXTRA_LOADING flag. - */ - synchronized Cursor createCursor(ContentResolver resolver, String[] columnNames) - throws IOException { - final Bundle extras = new Bundle(); - switch (getState()) { - case STATE_LOADING: - extras.putBoolean(DocumentsContract.EXTRA_LOADING, true); - break; - case STATE_ERROR: - throw mError; - } - final Cursor cursor = - mDatabase.queryChildDocuments(columnNames, mIdentifier.mDocumentId); - cursor.setExtras(extras); - cursor.setNotificationUri(resolver, createUri()); - return cursor; - } - - /** - * Stores object information into database. - */ - void loadObjectInfoList(int count) { - synchronized (this) { - if (mState != STATE_LOADING) { - return; - } - if (mPosition == 0) { - try{ - mDatabase.getMapper().startAddingDocuments(mIdentifier.mDocumentId); - } catch (FileNotFoundException error) { - mError = error; - mState = STATE_ERROR; - return; - } - } - } - final ArrayList<MtpObjectInfo> infoList = new ArrayList<>(); - for (int chunkEnd = mPosition + count; - mPosition < mObjectHandles.length && mPosition < chunkEnd; - mPosition++) { - try { - infoList.add(mManager.getObjectInfo( - mIdentifier.mDeviceId, mObjectHandles[mPosition])); - } catch (IOException error) { - Log.e(MtpDocumentsProvider.TAG, "Failed to load object info", error); - } - } - final long[] objectSizeList = new long[infoList.size()]; - for (int i = 0; i < infoList.size(); i++) { - final MtpObjectInfo info = infoList.get(i); - // Compressed size is 32-bit unsigned integer but getCompressedSize returns the - // value in Java int (signed 32-bit integer). Use getCompressedSizeLong instead - // to get the value in Java long. - if (info.getCompressedSizeLong() != 0xffffffffl) { - objectSizeList[i] = info.getCompressedSizeLong(); - continue; - } - - if (!MtpDeviceRecord.isSupported( - mOperationsSupported, - MtpConstants.OPERATION_GET_OBJECT_PROP_DESC) || - !MtpDeviceRecord.isSupported( - mOperationsSupported, - MtpConstants.OPERATION_GET_OBJECT_PROP_VALUE)) { - objectSizeList[i] = -1; - continue; - } - - // Object size is more than 4GB. - try { - objectSizeList[i] = mManager.getObjectSizeLong( - mIdentifier.mDeviceId, - info.getObjectHandle(), - info.getFormat()); - } catch (IOException error) { - Log.e(MtpDocumentsProvider.TAG, "Failed to get object size property.", error); - objectSizeList[i] = -1; - } - } - synchronized (this) { - // Check if the task is cancelled or not. - if (mState != STATE_LOADING) { - return; - } - try { - mDatabase.getMapper().putChildDocuments( - mIdentifier.mDeviceId, - mIdentifier.mDocumentId, - mOperationsSupported, - infoList.toArray(new MtpObjectInfo[infoList.size()]), - objectSizeList); - } catch (FileNotFoundException error) { - // Looks like the parent document information is removed. - // Adding documents has already cancelled in Mapper so we don't need to invoke - // stopAddingDocuments. - mError = error; - mState = STATE_ERROR; - return; - } - if (mPosition >= mObjectHandles.length) { - try{ - mDatabase.getMapper().stopAddingDocuments(mIdentifier.mDocumentId); - mState = STATE_COMPLETED; - } catch (FileNotFoundException error) { - mError = error; - mState = STATE_ERROR; - return; - } - } - } - } - - /** - * Cancels the task. - */ - synchronized void cancel() { - mDatabase.getMapper().cancelAddingDocuments(mIdentifier.mDocumentId); - mState = STATE_CANCELLED; - } - - /** - * Returns a state of the task. - */ - int getState() { - return mState; - } - - /** - * Notifies a change of child list of the document. - */ - void notify(ContentResolver resolver) { - resolver.notifyChange(createUri(), null, false); - mLastNotified = new Date(); - } - - private Uri createUri() { - return DocumentsContract.buildChildDocumentsUri( - MtpDocumentsProvider.AUTHORITY, mIdentifier.mDocumentId); - } - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java b/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java deleted file mode 100644 index 124d207696aa..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/Identifier.java +++ /dev/null @@ -1,81 +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.mtp; - -import java.util.Objects; -import static com.android.mtp.MtpDatabaseConstants.DocumentType; - -/** - * Static utilities for ID. - */ -class Identifier { - final int mDeviceId; - final int mStorageId; - final int mObjectHandle; - final String mDocumentId; - final @DocumentType int mDocumentType; - - Identifier(int deviceId, int storageId, int objectHandle, String documentId, - @DocumentType int documentType) { - mDeviceId = deviceId; - mStorageId = storageId; - mObjectHandle = objectHandle; - mDocumentId = documentId; - mDocumentType = documentType; - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof Identifier)) - return false; - final Identifier other = (Identifier) obj; - return mDeviceId == other.mDeviceId && mStorageId == other.mStorageId && - mObjectHandle == other.mObjectHandle && mDocumentId.equals(other.mDocumentId); - } - - @Override - public int hashCode() { - return Objects.hash(mDeviceId, mStorageId, mObjectHandle, mDocumentId); - } - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("Identifier { "); - - builder.append("mDeviceId: "); - builder.append(mDeviceId); - builder.append(", "); - - builder.append("mStorageId: "); - builder.append(mStorageId); - builder.append(", "); - - builder.append("mObjectHandle: "); - builder.append(mObjectHandle); - builder.append(", "); - - builder.append("mDocumentId: "); - builder.append(mDocumentId); - builder.append(", "); - - builder.append("mDocumentType: "); - builder.append(mDocumentType); - builder.append(" }"); - return builder.toString(); - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/Mapper.java b/packages/MtpDocumentsProvider/src/com/android/mtp/Mapper.java deleted file mode 100644 index 63f18f324d69..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/Mapper.java +++ /dev/null @@ -1,472 +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.mtp; - -import android.annotation.Nullable; -import android.content.ContentValues; -import android.database.Cursor; -import android.database.DatabaseUtils; -import android.database.sqlite.SQLiteDatabase; -import android.mtp.MtpObjectInfo; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Root; -import android.util.ArraySet; -import android.util.Log; - -import com.android.internal.util.Preconditions; - -import java.io.FileNotFoundException; -import java.util.Set; - -import static com.android.mtp.MtpDatabaseConstants.*; -import static com.android.mtp.MtpDatabase.strings; - -/** - * Mapping operations for MtpDatabase. - * Also see the comments of {@link MtpDatabase}. - */ -class Mapper { - private static final String[] EMPTY_ARGS = new String[0]; - private final MtpDatabase mDatabase; - - /** - * IDs which currently Mapper operates mapping for. - */ - private final Set<String> mInMappingIds = new ArraySet<>(); - - Mapper(MtpDatabase database) { - mDatabase = database; - } - - /** - * Puts device information to database. - * - * @return If device is added to the database. - * @throws FileNotFoundException - */ - synchronized boolean putDeviceDocument(MtpDeviceRecord device) throws FileNotFoundException { - final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - database.beginTransaction(); - try { - final ContentValues[] valuesList = new ContentValues[1]; - final ContentValues[] extraValuesList = new ContentValues[1]; - valuesList[0] = new ContentValues(); - extraValuesList[0] = new ContentValues(); - MtpDatabase.getDeviceDocumentValues(valuesList[0], extraValuesList[0], device); - final boolean changed = putDocuments( - null, - valuesList, - extraValuesList, - COLUMN_PARENT_DOCUMENT_ID + " IS NULL", - EMPTY_ARGS, - strings(COLUMN_DEVICE_ID, COLUMN_MAPPING_KEY)); - database.setTransactionSuccessful(); - return changed; - } finally { - database.endTransaction(); - } - } - - /** - * Puts root information to database. - * - * @param parentDocumentId Document ID of device document. - * @param roots List of root information. - * @return If roots are added or removed from the database. - * @throws FileNotFoundException - */ - synchronized boolean putStorageDocuments( - String parentDocumentId, int[] operationsSupported, MtpRoot[] roots) - throws FileNotFoundException { - final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - database.beginTransaction(); - try { - final ContentValues[] valuesList = new ContentValues[roots.length]; - final ContentValues[] extraValuesList = new ContentValues[roots.length]; - for (int i = 0; i < roots.length; i++) { - valuesList[i] = new ContentValues(); - extraValuesList[i] = new ContentValues(); - MtpDatabase.getStorageDocumentValues( - valuesList[i], - extraValuesList[i], - parentDocumentId, - operationsSupported, - roots[i]); - } - final boolean changed = putDocuments( - parentDocumentId, - valuesList, - extraValuesList, - COLUMN_PARENT_DOCUMENT_ID + " = ?", - strings(parentDocumentId), - strings(COLUMN_STORAGE_ID, Document.COLUMN_DISPLAY_NAME)); - - database.setTransactionSuccessful(); - return changed; - } finally { - database.endTransaction(); - } - } - - /** - * Puts document information to database. - * - * @param deviceId Device ID - * @param parentId Parent document ID. - * @param documents List of document information. - * @param documentSizes 64-bit size of documents. MtpObjectInfo#getComporessedSize will be - * ignored because it does not contain 4GB> object size. Can be -1 if the size is unknown. - * @throws FileNotFoundException - */ - synchronized void putChildDocuments( - int deviceId, String parentId, - int[] operationsSupported, - MtpObjectInfo[] documents, - long[] documentSizes) - throws FileNotFoundException { - assert documents.length == documentSizes.length; - final ContentValues[] valuesList = new ContentValues[documents.length]; - for (int i = 0; i < documents.length; i++) { - valuesList[i] = new ContentValues(); - MtpDatabase.getObjectDocumentValues( - valuesList[i], - deviceId, - parentId, - operationsSupported, - documents[i], - documentSizes[i]); - } - putDocuments( - parentId, - valuesList, - null, - COLUMN_PARENT_DOCUMENT_ID + " = ?", - strings(parentId), - strings(COLUMN_OBJECT_HANDLE, Document.COLUMN_DISPLAY_NAME)); - } - - void clearMapping() { - final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - database.beginTransaction(); - try { - mInMappingIds.clear(); - // Disconnect all device rows. - try { - startAddingDocuments(null); - stopAddingDocuments(null); - } catch (FileNotFoundException exception) { - Log.e(MtpDocumentsProvider.TAG, "Unexpected FileNotFoundException.", exception); - throw new RuntimeException(exception); - } - database.setTransactionSuccessful(); - } finally { - database.endTransaction(); - } - } - - /** - * Starts adding new documents. - * It changes the direct child documents of the given document from VALID to INVALIDATED. - * Note that it keeps DISCONNECTED documents as they are. - * - * @param parentDocumentId Parent document ID or NULL for root documents. - * @throws FileNotFoundException - */ - void startAddingDocuments(@Nullable String parentDocumentId) throws FileNotFoundException { - final String selection; - final String[] args; - if (parentDocumentId != null) { - selection = COLUMN_PARENT_DOCUMENT_ID + " = ?"; - args = strings(parentDocumentId); - } else { - selection = COLUMN_PARENT_DOCUMENT_ID + " IS NULL"; - args = EMPTY_ARGS; - } - - final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - database.beginTransaction(); - try { - getParentOrHaltMapping(parentDocumentId); - Preconditions.checkState(!mInMappingIds.contains(parentDocumentId)); - - // Set all valid documents as invalidated. - final ContentValues values = new ContentValues(); - values.put(COLUMN_ROW_STATE, ROW_STATE_INVALIDATED); - database.update( - TABLE_DOCUMENTS, - values, - selection + " AND " + COLUMN_ROW_STATE + " = ?", - DatabaseUtils.appendSelectionArgs(args, strings(ROW_STATE_VALID))); - - database.setTransactionSuccessful(); - mInMappingIds.add(parentDocumentId); - } finally { - database.endTransaction(); - } - } - - /** - * Puts the documents into the database. - * If the mapping mode is not heuristic, it just adds the rows to the database or updates the - * existing rows with the new values. If the mapping mode is heuristic, it adds some new rows as - * 'pending' state when that rows may be corresponding to existing 'invalidated' rows. Then - * {@link #stopAddingDocuments(String)} turns the pending rows into 'valid' - * rows. If the methods adds rows to database, it updates valueList with correct document ID. - * - * @param parentId Parent document ID. - * @param valuesList Values for documents to be stored in the database. - * @param rootExtraValuesList Values for root extra to be stored in the database. - * @param selection SQL where closure to select rows that shares the same parent. - * @param args Argument for selection SQL. - * @return Whether the database content is changed. - * @throws FileNotFoundException When parentId is not registered in the database. - */ - private boolean putDocuments( - String parentId, - ContentValues[] valuesList, - @Nullable ContentValues[] rootExtraValuesList, - String selection, - String[] args, - String[] mappingKeys) throws FileNotFoundException { - final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - boolean changed = false; - database.beginTransaction(); - try { - getParentOrHaltMapping(parentId); - Preconditions.checkState(mInMappingIds.contains(parentId)); - final ContentValues oldRowSnapshot = new ContentValues(); - final ContentValues newRowSnapshot = new ContentValues(); - for (int i = 0; i < valuesList.length; i++) { - final ContentValues values = valuesList[i]; - final ContentValues rootExtraValues; - if (rootExtraValuesList != null) { - rootExtraValues = rootExtraValuesList[i]; - } else { - rootExtraValues = null; - } - try (final Cursor candidateCursor = - queryCandidate(selection, args, mappingKeys, values)) { - final long rowId; - if (candidateCursor == null) { - rowId = database.insert(TABLE_DOCUMENTS, null, values); - changed = true; - } else { - candidateCursor.moveToNext(); - rowId = candidateCursor.getLong(0); - if (!changed) { - mDatabase.writeRowSnapshot(String.valueOf(rowId), oldRowSnapshot); - } - database.update( - TABLE_DOCUMENTS, - values, - SELECTION_DOCUMENT_ID, - strings(rowId)); - } - // Document ID is a primary integer key of the table. So the returned row - // IDs should be same with the document ID. - values.put(Document.COLUMN_DOCUMENT_ID, rowId); - if (rootExtraValues != null) { - rootExtraValues.put(Root.COLUMN_ROOT_ID, rowId); - database.replace(TABLE_ROOT_EXTRA, null, rootExtraValues); - } - - if (!changed) { - mDatabase.writeRowSnapshot(String.valueOf(rowId), newRowSnapshot); - // Put row state as string because SQLite returns snapshot values as string. - oldRowSnapshot.put(COLUMN_ROW_STATE, String.valueOf(ROW_STATE_VALID)); - if (!oldRowSnapshot.equals(newRowSnapshot)) { - changed = true; - } - } - } - } - - database.setTransactionSuccessful(); - return changed; - } finally { - database.endTransaction(); - } - } - - /** - * Stops adding documents. - * It handles 'invalidated' and 'disconnected' documents which we don't put corresponding - * documents so far. - * If the type adding document is 'device' or 'storage', the document may appear again - * afterward. The method marks such documents as 'disconnected'. If the type of adding document - * is 'object', it seems the documents are really removed from the remote MTP device. So the - * method deletes the metadata from the database. - * - * @param parentId Parent document ID or null for root documents. - * @return Whether the methods changes file metadata in database. - * @throws FileNotFoundException - */ - boolean stopAddingDocuments(@Nullable String parentId) throws FileNotFoundException { - final String selection; - final String[] args; - if (parentId != null) { - selection = COLUMN_PARENT_DOCUMENT_ID + " = ?"; - args = strings(parentId); - } else { - selection = COLUMN_PARENT_DOCUMENT_ID + " IS NULL"; - args = EMPTY_ARGS; - } - - final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - database.beginTransaction(); - try { - final Identifier parentIdentifier = getParentOrHaltMapping(parentId); - Preconditions.checkState(mInMappingIds.contains(parentId)); - mInMappingIds.remove(parentId); - - boolean changed = false; - // Delete/disconnect all invalidated/disconnected rows that cannot be mapped. - // If parentIdentifier is null, added documents are devices. - // if parentIdentifier is DOCUMENT_TYPE_DEVICE, added documents are storages. - final boolean keepUnmatchedDocument = - parentIdentifier == null || - parentIdentifier.mDocumentType == DOCUMENT_TYPE_DEVICE; - if (keepUnmatchedDocument) { - if (mDatabase.disconnectDocumentsRecursively( - COLUMN_ROW_STATE + " = ? AND " + selection, - DatabaseUtils.appendSelectionArgs(strings(ROW_STATE_INVALIDATED), args))) { - changed = true; - } - } else { - if (mDatabase.deleteDocumentsAndRootsRecursively( - COLUMN_ROW_STATE + " IN (?, ?) AND " + selection, - DatabaseUtils.appendSelectionArgs( - strings(ROW_STATE_INVALIDATED, ROW_STATE_DISCONNECTED), args))) { - changed = true; - } - } - - database.setTransactionSuccessful(); - return changed; - } finally { - database.endTransaction(); - } - } - - /** - * Cancels adding documents. - * @param parentId - */ - void cancelAddingDocuments(@Nullable String parentId) { - final String selection; - final String[] args; - if (parentId != null) { - selection = COLUMN_PARENT_DOCUMENT_ID + " = ?"; - args = strings(parentId); - } else { - selection = COLUMN_PARENT_DOCUMENT_ID + " IS NULL"; - args = EMPTY_ARGS; - } - - final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - database.beginTransaction(); - try { - if (!mInMappingIds.contains(parentId)) { - return; - } - mInMappingIds.remove(parentId); - final ContentValues values = new ContentValues(); - values.put(COLUMN_ROW_STATE, ROW_STATE_VALID); - mDatabase.getSQLiteDatabase().update( - TABLE_DOCUMENTS, - values, - selection + " AND " + COLUMN_ROW_STATE + " = ?", - DatabaseUtils.appendSelectionArgs(args, strings(ROW_STATE_INVALIDATED))); - database.setTransactionSuccessful(); - } finally { - database.endTransaction(); - } - } - - /** - * Queries candidate for each mappingKey, and returns the first cursor that includes a - * candidate. - * - * @param selection Pre-selection for candidate. - * @param args Arguments for selection. - * @param mappingKeys List of mapping key columns. - * @param values Values of document that Mapper tries to map. - * @return Cursor for mapping candidate or null when Mapper does not find any candidate. - */ - private @Nullable Cursor queryCandidate( - String selection, String[] args, String[] mappingKeys, ContentValues values) { - for (final String mappingKey : mappingKeys) { - final Cursor candidateCursor = queryCandidate(selection, args, mappingKey, values); - if (candidateCursor.getCount() == 0) { - candidateCursor.close(); - continue; - } - return candidateCursor; - } - return null; - } - - /** - * Looks for mapping candidate with given mappingKey. - * - * @param selection Pre-selection for candidate. - * @param args Arguments for selection. - * @param mappingKey Column name of mapping key. - * @param values Values of document that Mapper tries to map. - * @return Cursor for mapping candidate. - */ - private Cursor queryCandidate( - String selection, String[] args, String mappingKey, ContentValues values) { - final SQLiteDatabase database = mDatabase.getSQLiteDatabase(); - return database.query( - TABLE_DOCUMENTS, - strings(Document.COLUMN_DOCUMENT_ID), - selection + " AND " + - COLUMN_ROW_STATE + " IN (?, ?) AND " + - mappingKey + " = ?", - DatabaseUtils.appendSelectionArgs( - args, - strings(ROW_STATE_INVALIDATED, - ROW_STATE_DISCONNECTED, - values.getAsString(mappingKey))), - null, - null, - null, - "1"); - } - - /** - * Returns the parent identifier from parent document ID if the parent ID is found in the - * database. Otherwise it halts mapping and throws FileNotFoundException. - * - * @param parentId Parent document ID - * @return Parent identifier - * @throws FileNotFoundException - */ - private @Nullable Identifier getParentOrHaltMapping( - @Nullable String parentId) throws FileNotFoundException { - if (parentId == null) { - return null; - } - try { - return mDatabase.createIdentifier(parentId); - } catch (FileNotFoundException error) { - mInMappingIds.remove(parentId); - throw error; - } - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java deleted file mode 100644 index 59c205aebe18..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java +++ /dev/null @@ -1,921 +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.mtp; - -import static com.android.mtp.MtpDatabaseConstants.*; - -import android.annotation.Nullable; -import android.content.ContentValues; -import android.content.Context; -import android.content.res.Resources; -import android.database.Cursor; -import android.database.DatabaseUtils; -import android.database.MatrixCursor; -import android.database.MatrixCursor.RowBuilder; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.database.sqlite.SQLiteQueryBuilder; -import android.media.MediaFile; -import android.mtp.MtpConstants; -import android.mtp.MtpObjectInfo; -import android.net.Uri; -import android.provider.DocumentsContract; -import android.provider.MetadataReader; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Root; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.Preconditions; - -import java.io.FileNotFoundException; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; - -/** - * Database for MTP objects. - * The object handle which is identifier for object in MTP protocol is not stable over sessions. - * When we resume the process, we need to remap our document ID with MTP's object handle. - * - * If the remote MTP device is backed by typical file system, the file name - * is unique among files in a directory. However, MTP protocol itself does - * not guarantee the uniqueness of name so we cannot use fullpath as ID. - * - * Instead of fullpath, we use artificial ID generated by MtpDatabase itself. The database object - * remembers the map of document ID and object handle, and remaps new object handle with document ID - * by comparing the directory structure and object name. - * - * To start putting documents into the database, the client needs to call - * {@link Mapper#startAddingDocuments(String)} with the parent document ID. Also it - * needs to call {@link Mapper#stopAddingDocuments(String)} after putting all child - * documents to the database. (All explanations are same for root documents) - * - * database.getMapper().startAddingDocuments(); - * database.getMapper().putChildDocuments(); - * database.getMapper().stopAddingDocuments(); - * - * To update the existing documents, the client code can repeat to call the three methods again. - * The newly added rows update corresponding existing rows that have same MTP identifier like - * objectHandle. - * - * The client can call putChildDocuments multiple times to add documents by chunk, but it needs to - * put all documents under the parent before calling stopAddingChildDocuments. Otherwise missing - * documents are regarded as deleted, and will be removed from the database. - * - * If the client calls clearMtpIdentifier(), it clears MTP identifier in the database. In this case, - * the database tries to find corresponding rows by using document's name instead of MTP identifier - * at the next update cycle. - * - * TODO: Improve performance by SQL optimization. - */ -class MtpDatabase { - private final SQLiteDatabase mDatabase; - private final Mapper mMapper; - - SQLiteDatabase getSQLiteDatabase() { - return mDatabase; - } - - MtpDatabase(Context context, int flags) { - final OpenHelper helper = new OpenHelper(context, flags); - mDatabase = helper.getWritableDatabase(); - mMapper = new Mapper(this); - } - - void close() { - mDatabase.close(); - } - - /** - * Returns operations for mapping. - * @return Mapping operations. - */ - Mapper getMapper() { - return mMapper; - } - - /** - * Queries roots information. - * @param columnNames Column names defined in {@link android.provider.DocumentsContract.Root}. - * @return Database cursor. - */ - Cursor queryRoots(Resources resources, String[] columnNames) { - final String selection = - COLUMN_ROW_STATE + " IN (?, ?) AND " + COLUMN_DOCUMENT_TYPE + " = ?"; - final Cursor deviceCursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(COLUMN_DEVICE_ID), - selection, - strings(ROW_STATE_VALID, ROW_STATE_INVALIDATED, DOCUMENT_TYPE_DEVICE), - COLUMN_DEVICE_ID, - null, - null, - null); - - try { - final SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); - builder.setTables(JOIN_ROOTS); - builder.setProjectionMap(COLUMN_MAP_ROOTS); - final MatrixCursor result = new MatrixCursor(columnNames); - final ContentValues values = new ContentValues(); - - while (deviceCursor.moveToNext()) { - final int deviceId = deviceCursor.getInt(0); - final Cursor storageCursor = builder.query( - mDatabase, - columnNames, - selection + " AND " + COLUMN_DEVICE_ID + " = ?", - strings(ROW_STATE_VALID, - ROW_STATE_INVALIDATED, - DOCUMENT_TYPE_STORAGE, - deviceId), - null, - null, - null); - try { - values.clear(); - try (final Cursor deviceRoot = builder.query( - mDatabase, - columnNames, - selection + " AND " + COLUMN_DEVICE_ID + " = ?", - strings(ROW_STATE_VALID, - ROW_STATE_INVALIDATED, - DOCUMENT_TYPE_DEVICE, - deviceId), - null, - null, - null)) { - deviceRoot.moveToNext(); - DatabaseUtils.cursorRowToContentValues(deviceRoot, values); - } - - if (storageCursor.getCount() != 0) { - long capacityBytes = 0; - long availableBytes = 0; - final int capacityIndex = - storageCursor.getColumnIndex(Root.COLUMN_CAPACITY_BYTES); - final int availableIndex = - storageCursor.getColumnIndex(Root.COLUMN_AVAILABLE_BYTES); - while (storageCursor.moveToNext()) { - // If requested columnNames does not include COLUMN_XXX_BYTES, we - // don't calculate corresponding values. - if (capacityIndex != -1) { - capacityBytes += storageCursor.getLong(capacityIndex); - } - if (availableIndex != -1) { - availableBytes += storageCursor.getLong(availableIndex); - } - } - values.put(Root.COLUMN_CAPACITY_BYTES, capacityBytes); - values.put(Root.COLUMN_AVAILABLE_BYTES, availableBytes); - } else { - values.putNull(Root.COLUMN_CAPACITY_BYTES); - values.putNull(Root.COLUMN_AVAILABLE_BYTES); - } - if (storageCursor.getCount() == 1 && values.containsKey(Root.COLUMN_TITLE)) { - storageCursor.moveToFirst(); - // Add storage name to device name if we have only 1 storage. - values.put( - Root.COLUMN_TITLE, - resources.getString( - R.string.root_name, - values.getAsString(Root.COLUMN_TITLE), - storageCursor.getString( - storageCursor.getColumnIndex(Root.COLUMN_TITLE)))); - } - } finally { - storageCursor.close(); - } - - putValuesToCursor(values, result); - } - - return result; - } finally { - deviceCursor.close(); - } - } - - /** - * Queries root documents information. - * @param columnNames Column names defined in - * {@link android.provider.DocumentsContract.Document}. - * @return Database cursor. - */ - @VisibleForTesting - Cursor queryRootDocuments(String[] columnNames) { - return mDatabase.query( - TABLE_DOCUMENTS, - columnNames, - COLUMN_ROW_STATE + " IN (?, ?) AND " + COLUMN_DOCUMENT_TYPE + " = ?", - strings(ROW_STATE_VALID, ROW_STATE_INVALIDATED, DOCUMENT_TYPE_STORAGE), - null, - null, - null); - } - - /** - * Queries documents information. - * @param columnNames Column names defined in - * {@link android.provider.DocumentsContract.Document}. - * @return Database cursor. - */ - Cursor queryChildDocuments(String[] columnNames, String parentDocumentId) { - return mDatabase.query( - TABLE_DOCUMENTS, - columnNames, - COLUMN_ROW_STATE + " IN (?, ?) AND " + COLUMN_PARENT_DOCUMENT_ID + " = ?", - strings(ROW_STATE_VALID, ROW_STATE_INVALIDATED, parentDocumentId), - null, - null, - null); - } - - /** - * Returns document IDs of storages under the given device document. - * - * @param documentId Document ID that points a device. - * @return Storage document IDs. - * @throws FileNotFoundException The given document ID is not registered in database. - */ - String[] getStorageDocumentIds(String documentId) - throws FileNotFoundException { - Preconditions.checkArgument(createIdentifier(documentId).mDocumentType == - DOCUMENT_TYPE_DEVICE); - // Check if the parent document is device that has single storage. - try (final Cursor cursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(Document.COLUMN_DOCUMENT_ID), - COLUMN_ROW_STATE + " IN (?, ?) AND " + - COLUMN_PARENT_DOCUMENT_ID + " = ? AND " + - COLUMN_DOCUMENT_TYPE + " = ?", - strings(ROW_STATE_VALID, - ROW_STATE_INVALIDATED, - documentId, - DOCUMENT_TYPE_STORAGE), - null, - null, - null)) { - final String[] ids = new String[cursor.getCount()]; - for (int i = 0; cursor.moveToNext(); i++) { - ids[i] = cursor.getString(0); - } - return ids; - } - } - - /** - * Queries a single document. - * @param documentId - * @param projection - * @return Database cursor. - */ - Cursor queryDocument(String documentId, String[] projection) { - return mDatabase.query( - TABLE_DOCUMENTS, - projection, - SELECTION_DOCUMENT_ID, - strings(documentId), - null, - null, - null, - "1"); - } - - @Nullable String getDocumentIdForDevice(int deviceId) { - final Cursor cursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(Document.COLUMN_DOCUMENT_ID), - COLUMN_DOCUMENT_TYPE + " = ? AND " + COLUMN_DEVICE_ID + " = ?", - strings(DOCUMENT_TYPE_DEVICE, deviceId), - null, - null, - null, - "1"); - try { - if (cursor.moveToNext()) { - return cursor.getString(0); - } else { - return null; - } - } finally { - cursor.close(); - } - } - - /** - * Obtains parent identifier. - * @param documentId - * @return parent identifier. - * @throws FileNotFoundException - */ - Identifier getParentIdentifier(String documentId) throws FileNotFoundException { - final Cursor cursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(COLUMN_PARENT_DOCUMENT_ID), - SELECTION_DOCUMENT_ID, - strings(documentId), - null, - null, - null, - "1"); - try { - if (cursor.moveToNext()) { - return createIdentifier(cursor.getString(0)); - } else { - throw new FileNotFoundException("Cannot find a row having ID = " + documentId); - } - } finally { - cursor.close(); - } - } - - String getDeviceDocumentId(int deviceId) throws FileNotFoundException { - try (final Cursor cursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(Document.COLUMN_DOCUMENT_ID), - COLUMN_DEVICE_ID + " = ? AND " + COLUMN_DOCUMENT_TYPE + " = ? AND " + - COLUMN_ROW_STATE + " != ?", - strings(deviceId, DOCUMENT_TYPE_DEVICE, ROW_STATE_DISCONNECTED), - null, - null, - null, - "1")) { - if (cursor.getCount() > 0) { - cursor.moveToNext(); - return cursor.getString(0); - } else { - throw new FileNotFoundException("The device ID not found: " + deviceId); - } - } - } - - /** - * Adds new document under the parent. - * The method does not affect invalidated and pending documents because we know the document is - * newly added and never mapped with existing ones. - * @param parentDocumentId - * @param info - * @param size Object size. info#getCompressedSize() will be ignored because it does not contain - * object size more than 4GB. - * @return Document ID of added document. - */ - String putNewDocument( - int deviceId, String parentDocumentId, int[] operationsSupported, MtpObjectInfo info, - long size) { - final ContentValues values = new ContentValues(); - getObjectDocumentValues( - values, deviceId, parentDocumentId, operationsSupported, info, size); - mDatabase.beginTransaction(); - try { - final long id = mDatabase.insert(TABLE_DOCUMENTS, null, values); - mDatabase.setTransactionSuccessful(); - return Long.toString(id); - } finally { - mDatabase.endTransaction(); - } - } - - /** - * Deletes document and its children. - * @param documentId - */ - void deleteDocument(String documentId) { - deleteDocumentsAndRootsRecursively(SELECTION_DOCUMENT_ID, strings(documentId)); - } - - /** - * Gets identifier from document ID. - * @param documentId Document ID. - * @return Identifier. - * @throws FileNotFoundException - */ - Identifier createIdentifier(String documentId) throws FileNotFoundException { - // Currently documentId is old format. - final Cursor cursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(COLUMN_DEVICE_ID, - COLUMN_STORAGE_ID, - COLUMN_OBJECT_HANDLE, - COLUMN_DOCUMENT_TYPE), - SELECTION_DOCUMENT_ID + " AND " + COLUMN_ROW_STATE + " IN (?, ?)", - strings(documentId, ROW_STATE_VALID, ROW_STATE_INVALIDATED), - null, - null, - null, - "1"); - try { - if (cursor.getCount() == 0) { - throw new FileNotFoundException("ID \"" + documentId + "\" is not found."); - } else { - cursor.moveToNext(); - return new Identifier( - cursor.getInt(0), - cursor.getInt(1), - cursor.getInt(2), - documentId, - cursor.getInt(3)); - } - } finally { - cursor.close(); - } - } - - /** - * Deletes a document, and its root information if the document is a root document. - * @param selection Query to select documents. - * @param args Arguments for selection. - * @return Whether the method deletes rows. - */ - boolean deleteDocumentsAndRootsRecursively(String selection, String[] args) { - mDatabase.beginTransaction(); - try { - boolean changed = false; - final Cursor cursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(Document.COLUMN_DOCUMENT_ID), - selection, - args, - null, - null, - null); - try { - while (cursor.moveToNext()) { - if (deleteDocumentsAndRootsRecursively( - COLUMN_PARENT_DOCUMENT_ID + " = ?", - strings(cursor.getString(0)))) { - changed = true; - } - } - } finally { - cursor.close(); - } - if (deleteDocumentsAndRoots(selection, args)) { - changed = true; - } - mDatabase.setTransactionSuccessful(); - return changed; - } finally { - mDatabase.endTransaction(); - } - } - - /** - * Marks the documents and their child as disconnected documents. - * @param selection - * @param args - * @return True if at least one row is updated. - */ - boolean disconnectDocumentsRecursively(String selection, String[] args) { - mDatabase.beginTransaction(); - try { - boolean changed = false; - try (final Cursor cursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(Document.COLUMN_DOCUMENT_ID), - selection, - args, - null, - null, - null)) { - while (cursor.moveToNext()) { - if (disconnectDocumentsRecursively( - COLUMN_PARENT_DOCUMENT_ID + " = ?", - strings(cursor.getString(0)))) { - changed = true; - } - } - } - if (disconnectDocuments(selection, args)) { - changed = true; - } - mDatabase.setTransactionSuccessful(); - return changed; - } finally { - mDatabase.endTransaction(); - } - } - - boolean deleteDocumentsAndRoots(String selection, String[] args) { - mDatabase.beginTransaction(); - try { - int deleted = 0; - deleted += mDatabase.delete( - TABLE_ROOT_EXTRA, - Root.COLUMN_ROOT_ID + " IN (" + SQLiteQueryBuilder.buildQueryString( - false, - TABLE_DOCUMENTS, - new String[] { Document.COLUMN_DOCUMENT_ID }, - selection, - null, - null, - null, - null) + ")", - args); - deleted += mDatabase.delete(TABLE_DOCUMENTS, selection, args); - mDatabase.setTransactionSuccessful(); - // TODO Remove mappingState. - return deleted != 0; - } finally { - mDatabase.endTransaction(); - } - } - - boolean disconnectDocuments(String selection, String[] args) { - mDatabase.beginTransaction(); - try { - final ContentValues values = new ContentValues(); - values.put(COLUMN_ROW_STATE, ROW_STATE_DISCONNECTED); - values.putNull(COLUMN_DEVICE_ID); - values.putNull(COLUMN_STORAGE_ID); - values.putNull(COLUMN_OBJECT_HANDLE); - final boolean updated = mDatabase.update(TABLE_DOCUMENTS, values, selection, args) != 0; - mDatabase.setTransactionSuccessful(); - return updated; - } finally { - mDatabase.endTransaction(); - } - } - - int getRowState(String documentId) throws FileNotFoundException { - try (final Cursor cursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(COLUMN_ROW_STATE), - SELECTION_DOCUMENT_ID, - strings(documentId), - null, - null, - null)) { - if (cursor.getCount() == 0) { - throw new FileNotFoundException(); - } - cursor.moveToNext(); - return cursor.getInt(0); - } - } - - void writeRowSnapshot(String documentId, ContentValues values) throws FileNotFoundException { - try (final Cursor cursor = mDatabase.query( - JOIN_ROOTS, - strings("*"), - SELECTION_DOCUMENT_ID, - strings(documentId), - null, - null, - null, - "1")) { - if (cursor.getCount() == 0) { - throw new FileNotFoundException(); - } - cursor.moveToNext(); - values.clear(); - DatabaseUtils.cursorRowToContentValues(cursor, values); - } - } - - void updateObject(String documentId, int deviceId, String parentId, int[] operationsSupported, - MtpObjectInfo info, Long size) { - final ContentValues values = new ContentValues(); - getObjectDocumentValues(values, deviceId, parentId, operationsSupported, info, size); - - mDatabase.beginTransaction(); - try { - mDatabase.update( - TABLE_DOCUMENTS, - values, - Document.COLUMN_DOCUMENT_ID + " = ?", - strings(documentId)); - mDatabase.setTransactionSuccessful(); - } finally { - mDatabase.endTransaction(); - } - } - - /** - * Obtains a document that has already mapped but has unmapped children. - * @param deviceId Device to find documents. - * @return Identifier of found document or null. - */ - @Nullable Identifier getUnmappedDocumentsParent(int deviceId) { - final String fromClosure = - TABLE_DOCUMENTS + " AS child INNER JOIN " + - TABLE_DOCUMENTS + " AS parent ON " + - "child." + COLUMN_PARENT_DOCUMENT_ID + " = " + - "parent." + Document.COLUMN_DOCUMENT_ID; - final String whereClosure = - "parent." + COLUMN_DEVICE_ID + " = ? AND " + - "parent." + COLUMN_ROW_STATE + " IN (?, ?) AND " + - "parent." + COLUMN_DOCUMENT_TYPE + " != ? AND " + - "child." + COLUMN_ROW_STATE + " = ?"; - try (final Cursor cursor = mDatabase.query( - fromClosure, - strings("parent." + COLUMN_DEVICE_ID, - "parent." + COLUMN_STORAGE_ID, - "parent." + COLUMN_OBJECT_HANDLE, - "parent." + Document.COLUMN_DOCUMENT_ID, - "parent." + COLUMN_DOCUMENT_TYPE), - whereClosure, - strings(deviceId, ROW_STATE_VALID, ROW_STATE_INVALIDATED, DOCUMENT_TYPE_DEVICE, - ROW_STATE_DISCONNECTED), - null, - null, - null, - "1")) { - if (cursor.getCount() == 0) { - return null; - } - cursor.moveToNext(); - return new Identifier( - cursor.getInt(0), - cursor.getInt(1), - cursor.getInt(2), - cursor.getString(3), - cursor.getInt(4)); - } - } - - /** - * Removes metadata except for data used by outgoingPersistedUriPermissions. - */ - void cleanDatabase(Uri[] outgoingPersistedUris) { - mDatabase.beginTransaction(); - try { - final Set<String> ids = new HashSet<>(); - for (final Uri uri : outgoingPersistedUris) { - String documentId = DocumentsContract.getDocumentId(uri); - while (documentId != null) { - if (ids.contains(documentId)) { - break; - } - ids.add(documentId); - try (final Cursor cursor = mDatabase.query( - TABLE_DOCUMENTS, - strings(COLUMN_PARENT_DOCUMENT_ID), - SELECTION_DOCUMENT_ID, - strings(documentId), - null, - null, - null)) { - documentId = cursor.moveToNext() ? cursor.getString(0) : null; - } - } - } - deleteDocumentsAndRoots( - Document.COLUMN_DOCUMENT_ID + " NOT IN " + getIdList(ids), null); - mDatabase.setTransactionSuccessful(); - } finally { - mDatabase.endTransaction(); - } - } - - int getLastBootCount() { - try (final Cursor cursor = mDatabase.query( - TABLE_LAST_BOOT_COUNT, strings(COLUMN_VALUE), null, null, null, null, null)) { - if (cursor.moveToNext()) { - return cursor.getInt(0); - } else { - return 0; - } - } - } - - void setLastBootCount(int value) { - Preconditions.checkArgumentNonnegative(value, "Boot count must not be negative."); - mDatabase.beginTransaction(); - try { - final ContentValues values = new ContentValues(); - values.put(COLUMN_VALUE, value); - mDatabase.delete(TABLE_LAST_BOOT_COUNT, null, null); - mDatabase.insert(TABLE_LAST_BOOT_COUNT, null, values); - mDatabase.setTransactionSuccessful(); - } finally { - mDatabase.endTransaction(); - } - } - - private static class OpenHelper extends SQLiteOpenHelper { - public OpenHelper(Context context, int flags) { - super(context, - flags == FLAG_DATABASE_IN_MEMORY ? null : DATABASE_NAME, - null, - DATABASE_VERSION); - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL(QUERY_CREATE_DOCUMENTS); - db.execSQL(QUERY_CREATE_ROOT_EXTRA); - db.execSQL(QUERY_CREATE_LAST_BOOT_COUNT); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - db.execSQL("DROP TABLE IF EXISTS " + TABLE_DOCUMENTS); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_ROOT_EXTRA); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_LAST_BOOT_COUNT); - onCreate(db); - } - } - - @VisibleForTesting - static void deleteDatabase(Context context) { - context.deleteDatabase(DATABASE_NAME); - } - - static void getDeviceDocumentValues( - ContentValues values, - ContentValues extraValues, - MtpDeviceRecord device) { - values.clear(); - values.put(COLUMN_DEVICE_ID, device.deviceId); - values.putNull(COLUMN_STORAGE_ID); - values.putNull(COLUMN_OBJECT_HANDLE); - values.putNull(COLUMN_PARENT_DOCUMENT_ID); - values.put(COLUMN_ROW_STATE, ROW_STATE_VALID); - values.put(COLUMN_DOCUMENT_TYPE, DOCUMENT_TYPE_DEVICE); - values.put(COLUMN_MAPPING_KEY, device.deviceKey); - values.put(Document.COLUMN_MIME_TYPE, Document.MIME_TYPE_DIR); - values.put(Document.COLUMN_DISPLAY_NAME, device.name); - values.putNull(Document.COLUMN_SUMMARY); - values.putNull(Document.COLUMN_LAST_MODIFIED); - values.put(Document.COLUMN_ICON, R.drawable.ic_root_mtp); - values.put(Document.COLUMN_FLAGS, getDocumentFlags( - device.operationsSupported, - Document.MIME_TYPE_DIR, - 0, - MtpConstants.PROTECTION_STATUS_NONE, - // Storages are placed under device so we cannot create a document just under - // device. - DOCUMENT_TYPE_DEVICE) & ~Document.FLAG_DIR_SUPPORTS_CREATE); - values.putNull(Document.COLUMN_SIZE); - - extraValues.clear(); - extraValues.put(Root.COLUMN_FLAGS, getRootFlags(device.operationsSupported)); - extraValues.putNull(Root.COLUMN_AVAILABLE_BYTES); - extraValues.putNull(Root.COLUMN_CAPACITY_BYTES); - extraValues.put(Root.COLUMN_MIME_TYPES, ""); - } - - /** - * Gets {@link ContentValues} for the given root. - * @param values {@link ContentValues} that receives values. - * @param extraValues {@link ContentValues} that receives extra values for roots. - * @param parentDocumentId Parent document ID. - * @param operationsSupported Array of Operation code supported by the device. - * @param root Root to be converted {@link ContentValues}. - */ - static void getStorageDocumentValues( - ContentValues values, - ContentValues extraValues, - String parentDocumentId, - int[] operationsSupported, - MtpRoot root) { - values.clear(); - values.put(COLUMN_DEVICE_ID, root.mDeviceId); - values.put(COLUMN_STORAGE_ID, root.mStorageId); - values.putNull(COLUMN_OBJECT_HANDLE); - values.put(COLUMN_PARENT_DOCUMENT_ID, parentDocumentId); - values.put(COLUMN_ROW_STATE, ROW_STATE_VALID); - values.put(COLUMN_DOCUMENT_TYPE, DOCUMENT_TYPE_STORAGE); - values.put(Document.COLUMN_MIME_TYPE, Document.MIME_TYPE_DIR); - values.put(Document.COLUMN_DISPLAY_NAME, root.mDescription); - values.putNull(Document.COLUMN_SUMMARY); - values.putNull(Document.COLUMN_LAST_MODIFIED); - values.put(Document.COLUMN_ICON, R.drawable.ic_root_mtp); - values.put(Document.COLUMN_FLAGS, getDocumentFlags( - operationsSupported, - Document.MIME_TYPE_DIR, - 0, - MtpConstants.PROTECTION_STATUS_NONE, - DOCUMENT_TYPE_STORAGE)); - values.put(Document.COLUMN_SIZE, root.mMaxCapacity - root.mFreeSpace); - - extraValues.put(Root.COLUMN_FLAGS, getRootFlags(operationsSupported)); - extraValues.put(Root.COLUMN_AVAILABLE_BYTES, root.mFreeSpace); - extraValues.put(Root.COLUMN_CAPACITY_BYTES, root.mMaxCapacity); - extraValues.put(Root.COLUMN_MIME_TYPES, ""); - } - - /** - * Gets {@link ContentValues} for the given MTP object. - * @param values {@link ContentValues} that receives values. - * @param deviceId Device ID of the object. - * @param parentId Parent document ID of the object. - * @param info MTP object info. getCompressedSize will be ignored. - * @param size 64-bit size of documents. Negative value is regarded as unknown size. - */ - static void getObjectDocumentValues( - ContentValues values, int deviceId, String parentId, - int[] operationsSupported, MtpObjectInfo info, long size) { - values.clear(); - final String mimeType = getMimeType(info); - values.put(COLUMN_DEVICE_ID, deviceId); - values.put(COLUMN_STORAGE_ID, info.getStorageId()); - values.put(COLUMN_OBJECT_HANDLE, info.getObjectHandle()); - values.put(COLUMN_PARENT_DOCUMENT_ID, parentId); - values.put(COLUMN_ROW_STATE, ROW_STATE_VALID); - values.put(COLUMN_DOCUMENT_TYPE, DOCUMENT_TYPE_OBJECT); - values.put(Document.COLUMN_MIME_TYPE, mimeType); - values.put(Document.COLUMN_DISPLAY_NAME, info.getName()); - values.putNull(Document.COLUMN_SUMMARY); - values.put( - Document.COLUMN_LAST_MODIFIED, - info.getDateModified() != 0 ? info.getDateModified() : null); - values.putNull(Document.COLUMN_ICON); - values.put(Document.COLUMN_FLAGS, getDocumentFlags( - operationsSupported, mimeType, info.getThumbCompressedSizeLong(), - info.getProtectionStatus(), DOCUMENT_TYPE_OBJECT)); - if (size >= 0) { - values.put(Document.COLUMN_SIZE, size); - } else { - values.putNull(Document.COLUMN_SIZE); - } - } - - private static String getMimeType(MtpObjectInfo info) { - if (info.getFormat() == MtpConstants.FORMAT_ASSOCIATION) { - return DocumentsContract.Document.MIME_TYPE_DIR; - } - - return MediaFile.getMimeType(info.getName(), info.getFormat()); - } - - private static int getRootFlags(int[] operationsSupported) { - int rootFlag = Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_LOCAL_ONLY; - if (MtpDeviceRecord.isWritingSupported(operationsSupported)) { - rootFlag |= Root.FLAG_SUPPORTS_CREATE; - } - return rootFlag; - } - - private static int getDocumentFlags( - @Nullable int[] operationsSupported, String mimeType, long thumbnailSize, - int protectionState, @DocumentType int documentType) { - int flag = 0; - if (!mimeType.equals(Document.MIME_TYPE_DIR) && - MtpDeviceRecord.isWritingSupported(operationsSupported) && - protectionState == MtpConstants.PROTECTION_STATUS_NONE) { - flag |= Document.FLAG_SUPPORTS_WRITE; - } - if (MtpDeviceRecord.isSupported( - operationsSupported, MtpConstants.OPERATION_DELETE_OBJECT) && - (protectionState == MtpConstants.PROTECTION_STATUS_NONE || - protectionState == MtpConstants.PROTECTION_STATUS_NON_TRANSFERABLE_DATA) && - documentType == DOCUMENT_TYPE_OBJECT) { - flag |= Document.FLAG_SUPPORTS_DELETE; - } - if (mimeType.equals(Document.MIME_TYPE_DIR) && - MtpDeviceRecord.isWritingSupported(operationsSupported) && - protectionState == MtpConstants.PROTECTION_STATUS_NONE) { - flag |= Document.FLAG_DIR_SUPPORTS_CREATE; - } - if (MetadataReader.isSupportedMimeType(mimeType)) { - flag |= Document.FLAG_SUPPORTS_METADATA; - } - if (thumbnailSize > 0) { - flag |= Document.FLAG_SUPPORTS_THUMBNAIL; - } - return flag; - } - - static String[] strings(Object... args) { - final String[] results = new String[args.length]; - for (int i = 0; i < args.length; i++) { - results[i] = Objects.toString(args[i]); - } - return results; - } - - static void putValuesToCursor(ContentValues values, MatrixCursor cursor) { - final RowBuilder row = cursor.newRow(); - for (final String name : cursor.getColumnNames()) { - row.add(values.get(name)); - } - } - - private static String getIdList(Set<String> ids) { - String result = "("; - for (final String id : ids) { - if (result.length() > 1) { - result += ","; - } - result += id; - } - result += ")"; - return result; - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java deleted file mode 100644 index 6d98e3419de8..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabaseConstants.java +++ /dev/null @@ -1,186 +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.mtp; - -import android.annotation.IntDef; -import android.database.sqlite.SQLiteQueryBuilder; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Root; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.HashMap; -import java.util.Map; - -/** - * Class containing MtpDatabase constants. - */ -class MtpDatabaseConstants { - static final int DATABASE_VERSION = 5; - static final String DATABASE_NAME = "database"; - - static final int FLAG_DATABASE_IN_MEMORY = 1; - static final int FLAG_DATABASE_IN_FILE = 0; - - /** - * Table representing documents including root documents. - */ - static final String TABLE_DOCUMENTS = "Documents"; - - /** - * Table containing additional information only available for root documents. - * The table uses same primary keys with corresponding documents. - */ - static final String TABLE_ROOT_EXTRA = "RootExtra"; - - /** - * Table containing last boot count. - */ - static final String TABLE_LAST_BOOT_COUNT = "LastBootCount"; - - /** - * 'FROM' closure of joining TABLE_DOCUMENTS and TABLE_ROOT_EXTRA. - */ - static final String JOIN_ROOTS = createJoinFromClosure( - TABLE_DOCUMENTS, - TABLE_ROOT_EXTRA, - Document.COLUMN_DOCUMENT_ID, - Root.COLUMN_ROOT_ID); - - static final String COLUMN_DEVICE_ID = "device_id"; - static final String COLUMN_STORAGE_ID = "storage_id"; - static final String COLUMN_OBJECT_HANDLE = "object_handle"; - static final String COLUMN_PARENT_DOCUMENT_ID = "parent_document_id"; - static final String COLUMN_DOCUMENT_TYPE = "document_type"; - static final String COLUMN_ROW_STATE = "row_state"; - static final String COLUMN_MAPPING_KEY = "mapping_key"; - - /** - * Value for TABLE_LAST_BOOT_COUNT. - * Type: INTEGER - */ - static final String COLUMN_VALUE = "value"; - - /** - * The state represents that the row has a valid object handle. - */ - static final int ROW_STATE_VALID = 0; - - /** - * The state represents that the rows added at the previous cycle and need to be updated with - * fresh values. - * The row may not have valid object handle. External application can still fetch the documents. - * If the external application tries to fetch object handle, the provider resolves pending - * documents with invalidated documents ahead. - */ - static final int ROW_STATE_INVALIDATED = 1; - - /** - * The documents are of device/storage that are disconnected now. The documents are invisible - * but their document ID will be reuse when the device/storage is connected again. - */ - static final int ROW_STATE_DISCONNECTED = 2; - - @IntDef(value = { DOCUMENT_TYPE_DEVICE, DOCUMENT_TYPE_STORAGE, DOCUMENT_TYPE_OBJECT }) - @Retention(RetentionPolicy.SOURCE) - public @interface DocumentType {} - - /** - * Document that represents a MTP device. - */ - static final int DOCUMENT_TYPE_DEVICE = 0; - - /** - * Document that represents a MTP storage. - */ - static final int DOCUMENT_TYPE_STORAGE = 1; - - /** - * Document that represents a MTP object. - */ - static final int DOCUMENT_TYPE_OBJECT = 2; - - static final String SELECTION_DOCUMENT_ID = Document.COLUMN_DOCUMENT_ID + " = ?"; - static final String SELECTION_ROOT_ID = Root.COLUMN_ROOT_ID + " = ?"; - - static final String QUERY_CREATE_DOCUMENTS = - "CREATE TABLE " + TABLE_DOCUMENTS + " (" + - Document.COLUMN_DOCUMENT_ID + - " INTEGER PRIMARY KEY AUTOINCREMENT," + - COLUMN_DEVICE_ID + " INTEGER," + - COLUMN_STORAGE_ID + " INTEGER," + - COLUMN_OBJECT_HANDLE + " INTEGER," + - COLUMN_PARENT_DOCUMENT_ID + " INTEGER," + - COLUMN_ROW_STATE + " INTEGER NOT NULL," + - COLUMN_DOCUMENT_TYPE + " INTEGER NOT NULL," + - COLUMN_MAPPING_KEY + " STRING," + - Document.COLUMN_MIME_TYPE + " TEXT NOT NULL," + - Document.COLUMN_DISPLAY_NAME + " TEXT NOT NULL," + - Document.COLUMN_SUMMARY + " TEXT," + - Document.COLUMN_LAST_MODIFIED + " INTEGER," + - Document.COLUMN_ICON + " INTEGER," + - Document.COLUMN_FLAGS + " INTEGER NOT NULL," + - Document.COLUMN_SIZE + " INTEGER);"; - - static final String QUERY_CREATE_ROOT_EXTRA = - "CREATE TABLE " + TABLE_ROOT_EXTRA + " (" + - Root.COLUMN_ROOT_ID + " INTEGER PRIMARY KEY," + - Root.COLUMN_FLAGS + " INTEGER NOT NULL," + - Root.COLUMN_AVAILABLE_BYTES + " INTEGER," + - Root.COLUMN_CAPACITY_BYTES + " INTEGER," + - Root.COLUMN_MIME_TYPES + " TEXT NOT NULL);"; - - static final String QUERY_CREATE_LAST_BOOT_COUNT = - "CREATE TABLE " + TABLE_LAST_BOOT_COUNT + " (value INTEGER NOT NULL);"; - - /** - * Map for columns names to provide DocumentContract.Root compatible columns. - * @see SQLiteQueryBuilder#setProjectionMap(Map) - */ - static final Map<String, String> COLUMN_MAP_ROOTS; - static { - COLUMN_MAP_ROOTS = new HashMap<>(); - COLUMN_MAP_ROOTS.put(Root.COLUMN_ROOT_ID, TABLE_ROOT_EXTRA + "." + Root.COLUMN_ROOT_ID); - COLUMN_MAP_ROOTS.put(Root.COLUMN_FLAGS, TABLE_ROOT_EXTRA + "." + Root.COLUMN_FLAGS); - COLUMN_MAP_ROOTS.put( - Root.COLUMN_ICON, - TABLE_DOCUMENTS + "." + Document.COLUMN_ICON + " AS " + Root.COLUMN_ICON); - COLUMN_MAP_ROOTS.put( - Root.COLUMN_TITLE, - TABLE_DOCUMENTS + "." + Document.COLUMN_DISPLAY_NAME + " AS " + Root.COLUMN_TITLE); - COLUMN_MAP_ROOTS.put( - Root.COLUMN_SUMMARY, - TABLE_DOCUMENTS + "." + Document.COLUMN_SUMMARY + " AS " + Root.COLUMN_SUMMARY); - COLUMN_MAP_ROOTS.put( - Root.COLUMN_DOCUMENT_ID, - TABLE_DOCUMENTS + "." + Document.COLUMN_DOCUMENT_ID + - " AS " + Root.COLUMN_DOCUMENT_ID); - COLUMN_MAP_ROOTS.put( - Root.COLUMN_AVAILABLE_BYTES, TABLE_ROOT_EXTRA + "." + Root.COLUMN_AVAILABLE_BYTES); - COLUMN_MAP_ROOTS.put( - Root.COLUMN_CAPACITY_BYTES, TABLE_ROOT_EXTRA + "." + Root.COLUMN_CAPACITY_BYTES); - COLUMN_MAP_ROOTS.put( - Root.COLUMN_MIME_TYPES, TABLE_ROOT_EXTRA + "." + Root.COLUMN_MIME_TYPES); - COLUMN_MAP_ROOTS.put(COLUMN_DEVICE_ID, COLUMN_DEVICE_ID); - } - - private static String createJoinFromClosure( - String table1, String table2, String column1, String column2) { - return table1 + " LEFT JOIN " + table2 + - " ON " + table1 + "." + column1 + " = " + table2 + "." + column2; - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDeviceRecord.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDeviceRecord.java deleted file mode 100644 index c52b81d76d36..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDeviceRecord.java +++ /dev/null @@ -1,74 +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.mtp; - -import android.annotation.Nullable; -import android.mtp.MtpConstants; - -class MtpDeviceRecord { - public final int deviceId; - public final String name; - public final @Nullable String deviceKey; - public final boolean opened; - public final MtpRoot[] roots; - public final @Nullable int[] operationsSupported; - public final @Nullable int[] eventsSupported; - - MtpDeviceRecord(int deviceId, String name, @Nullable String deviceKey, boolean opened, - MtpRoot[] roots, @Nullable int[] operationsSupported, - @Nullable int[] eventsSupported) { - this.deviceId = deviceId; - this.name = name; - this.opened = opened; - this.roots = roots; - this.deviceKey = deviceKey; - this.operationsSupported = operationsSupported; - this.eventsSupported = eventsSupported; - } - - /** - * Helper method to check operations/events are supported by the device or not. - */ - static boolean isSupported(@Nullable int[] supportedList, int code) { - if (supportedList == null) { - return false; - } - for (int i = 0; i < supportedList.length; i++) { - if (supportedList[i] == code) { - return true; - } - } - return false; - } - - static boolean isPartialReadSupported(@Nullable int[] supportedList, long fileSize) { - if (isSupported(supportedList, MtpConstants.OPERATION_GET_PARTIAL_OBJECT_64)) { - return true; - } - if (0 <= fileSize && - fileSize <= 0xffffffffL && - isSupported(supportedList, MtpConstants.OPERATION_GET_PARTIAL_OBJECT)) { - return true; - } - return false; - } - - static boolean isWritingSupported(@Nullable int[] supportedList) { - return isSupported(supportedList, MtpConstants.OPERATION_SEND_OBJECT_INFO) && - isSupported(supportedList, MtpConstants.OPERATION_SEND_OBJECT); - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java deleted file mode 100644 index 8c8116bd342a..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java +++ /dev/null @@ -1,856 +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.mtp; - -import android.annotation.Nullable; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.UriPermission; -import android.content.res.AssetFileDescriptor; -import android.content.res.Resources; -import android.database.Cursor; -import android.database.DatabaseUtils; -import android.database.MatrixCursor; -import android.database.sqlite.SQLiteDiskIOException; -import android.graphics.Point; -import android.media.MediaFile; -import android.mtp.MtpConstants; -import android.mtp.MtpObjectInfo; -import android.net.Uri; -import android.os.Bundle; -import android.os.CancellationSignal; -import android.os.FileUtils; -import android.os.ParcelFileDescriptor; -import android.os.ProxyFileDescriptorCallback; -import android.os.storage.StorageManager; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Path; -import android.provider.DocumentsContract.Root; -import android.provider.DocumentsProvider; -import android.provider.MetadataReader; -import android.provider.Settings; -import android.system.ErrnoException; -import android.system.OsConstants; -import android.util.Log; - -import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.VisibleForTesting; - -import libcore.io.IoUtils; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeoutException; - -/** - * DocumentsProvider for MTP devices. - */ -public class MtpDocumentsProvider extends DocumentsProvider { - static final String AUTHORITY = "com.android.mtp.documents"; - static final String TAG = "MtpDocumentsProvider"; - static final String[] DEFAULT_ROOT_PROJECTION = new String[] { - Root.COLUMN_ROOT_ID, Root.COLUMN_FLAGS, Root.COLUMN_ICON, - Root.COLUMN_TITLE, Root.COLUMN_DOCUMENT_ID, - Root.COLUMN_AVAILABLE_BYTES, - }; - 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, - }; - - static final boolean DEBUG = false; - - private final Object mDeviceListLock = new Object(); - - private static MtpDocumentsProvider sSingleton; - - private MtpManager mMtpManager; - private ContentResolver mResolver; - @GuardedBy("mDeviceListLock") - private Map<Integer, DeviceToolkit> mDeviceToolkits; - private RootScanner mRootScanner; - private Resources mResources; - private MtpDatabase mDatabase; - private ServiceIntentSender mIntentSender; - private Context mContext; - private StorageManager mStorageManager; - - /** - * Provides singleton instance to MtpDocumentsService. - */ - static MtpDocumentsProvider getInstance() { - return sSingleton; - } - - @Override - public boolean onCreate() { - sSingleton = this; - mContext = getContext(); - mResources = getContext().getResources(); - mMtpManager = new MtpManager(getContext()); - mResolver = getContext().getContentResolver(); - mDeviceToolkits = new HashMap<>(); - mDatabase = new MtpDatabase(getContext(), MtpDatabaseConstants.FLAG_DATABASE_IN_FILE); - mRootScanner = new RootScanner(mResolver, mMtpManager, mDatabase); - mIntentSender = new ServiceIntentSender(getContext()); - mStorageManager = getContext().getSystemService(StorageManager.class); - - // Check boot count and cleans database if it's first time to launch MtpDocumentsProvider - // after booting. - try { - final int bootCount = Settings.Global.getInt(mResolver, Settings.Global.BOOT_COUNT, -1); - final int lastBootCount = mDatabase.getLastBootCount(); - if (bootCount != -1 && bootCount != lastBootCount) { - mDatabase.setLastBootCount(bootCount); - final List<UriPermission> permissions = - mResolver.getOutgoingPersistedUriPermissions(); - final Uri[] uris = new Uri[permissions.size()]; - for (int i = 0; i < permissions.size(); i++) { - uris[i] = permissions.get(i).getUri(); - } - mDatabase.cleanDatabase(uris); - } - } catch (SQLiteDiskIOException error) { - // It can happen due to disk shortage. - Log.e(TAG, "Failed to clean database.", error); - return false; - } - - resume(); - return true; - } - - @VisibleForTesting - boolean onCreateForTesting( - Context context, - Resources resources, - MtpManager mtpManager, - ContentResolver resolver, - MtpDatabase database, - StorageManager storageManager, - ServiceIntentSender intentSender) { - mContext = context; - mResources = resources; - mMtpManager = mtpManager; - mResolver = resolver; - mDeviceToolkits = new HashMap<>(); - mDatabase = database; - mRootScanner = new RootScanner(mResolver, mMtpManager, mDatabase); - mIntentSender = intentSender; - mStorageManager = storageManager; - - resume(); - return true; - } - - @Override - public Cursor queryRoots(String[] projection) throws FileNotFoundException { - if (projection == null) { - projection = MtpDocumentsProvider.DEFAULT_ROOT_PROJECTION; - } - final Cursor cursor = mDatabase.queryRoots(mResources, projection); - cursor.setNotificationUri( - mResolver, DocumentsContract.buildRootsUri(MtpDocumentsProvider.AUTHORITY)); - return cursor; - } - - @Override - public Cursor queryDocument(String documentId, String[] projection) - throws FileNotFoundException { - if (projection == null) { - projection = MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION; - } - final Cursor cursor = mDatabase.queryDocument(documentId, projection); - final int cursorCount = cursor.getCount(); - if (cursorCount == 0) { - cursor.close(); - throw new FileNotFoundException(); - } else if (cursorCount != 1) { - cursor.close(); - Log.wtf(TAG, "Unexpected cursor size: " + cursorCount); - return null; - } - - final Identifier identifier = mDatabase.createIdentifier(documentId); - if (identifier.mDocumentType != MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE) { - return cursor; - } - final String[] storageDocIds = mDatabase.getStorageDocumentIds(documentId); - if (storageDocIds.length != 1) { - return mDatabase.queryDocument(documentId, projection); - } - - // If the documentId specifies a device having exact one storage, we repalce some device - // attributes with the storage attributes. - try { - final String storageName; - final int storageFlags; - try (final Cursor storageCursor = mDatabase.queryDocument( - storageDocIds[0], - MtpDatabase.strings(Document.COLUMN_DISPLAY_NAME, Document.COLUMN_FLAGS))) { - if (!storageCursor.moveToNext()) { - throw new FileNotFoundException(); - } - storageName = storageCursor.getString(0); - storageFlags = storageCursor.getInt(1); - } - - cursor.moveToNext(); - final ContentValues values = new ContentValues(); - DatabaseUtils.cursorRowToContentValues(cursor, values); - if (values.containsKey(Document.COLUMN_DISPLAY_NAME)) { - values.put(Document.COLUMN_DISPLAY_NAME, mResources.getString( - R.string.root_name, - values.getAsString(Document.COLUMN_DISPLAY_NAME), - storageName)); - } - values.put(Document.COLUMN_FLAGS, storageFlags); - final MatrixCursor output = new MatrixCursor(projection, 1); - MtpDatabase.putValuesToCursor(values, output); - return output; - } finally { - cursor.close(); - } - } - - @Override - public Cursor queryChildDocuments(String parentDocumentId, - String[] projection, String sortOrder) throws FileNotFoundException { - if (DEBUG) { - Log.d(TAG, "queryChildDocuments: " + parentDocumentId); - } - if (projection == null) { - projection = MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION; - } - Identifier parentIdentifier = mDatabase.createIdentifier(parentDocumentId); - try { - openDevice(parentIdentifier.mDeviceId); - if (parentIdentifier.mDocumentType == MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE) { - final String[] storageDocIds = mDatabase.getStorageDocumentIds(parentDocumentId); - if (storageDocIds.length == 0) { - // Remote device does not provide storages. Maybe it is locked. - return createErrorCursor(projection, R.string.error_locked_device); - } else if (storageDocIds.length > 1) { - // Returns storage list from database. - return mDatabase.queryChildDocuments(projection, parentDocumentId); - } - - // Exact one storage is found. Skip storage and returns object in the single - // storage. - parentIdentifier = mDatabase.createIdentifier(storageDocIds[0]); - } - - // Returns object list from document loader. - return getDocumentLoader(parentIdentifier).queryChildDocuments( - projection, parentIdentifier); - } catch (BusyDeviceException exception) { - return createErrorCursor(projection, R.string.error_busy_device); - } catch (IOException exception) { - Log.e(MtpDocumentsProvider.TAG, "queryChildDocuments", exception); - throw new FileNotFoundException(exception.getMessage()); - } - } - - @Override - public ParcelFileDescriptor openDocument( - String documentId, String mode, CancellationSignal signal) - throws FileNotFoundException { - if (DEBUG) { - Log.d(TAG, "openDocument: " + documentId); - } - final Identifier identifier = mDatabase.createIdentifier(documentId); - try { - openDevice(identifier.mDeviceId); - final MtpDeviceRecord device = getDeviceToolkit(identifier.mDeviceId).mDeviceRecord; - // Turn off MODE_CREATE because openDocument does not allow to create new files. - final int modeFlag = - ParcelFileDescriptor.parseMode(mode) & ~ParcelFileDescriptor.MODE_CREATE; - if ((modeFlag & ParcelFileDescriptor.MODE_READ_ONLY) != 0) { - long fileSize; - try { - fileSize = getFileSize(documentId); - } catch (UnsupportedOperationException exception) { - fileSize = -1; - } - if (MtpDeviceRecord.isPartialReadSupported( - device.operationsSupported, fileSize)) { - - return mStorageManager.openProxyFileDescriptor( - modeFlag, - new MtpProxyFileDescriptorCallback(Integer.parseInt(documentId))); - } else { - // If getPartialObject{|64} are not supported for the device, returns - // non-seekable pipe FD instead. - return getPipeManager(identifier).readDocument(mMtpManager, identifier); - } - } else if ((modeFlag & ParcelFileDescriptor.MODE_WRITE_ONLY) != 0) { - // TODO: Clear the parent document loader task (if exists) and call notify - // when writing is completed. - if (MtpDeviceRecord.isWritingSupported(device.operationsSupported)) { - return mStorageManager.openProxyFileDescriptor( - modeFlag, - new MtpProxyFileDescriptorCallback(Integer.parseInt(documentId))); - } else { - throw new UnsupportedOperationException( - "The device does not support writing operation."); - } - } else { - // TODO: Add support for "rw" mode. - throw new UnsupportedOperationException("The provider does not support 'rw' mode."); - } - } catch (FileNotFoundException | RuntimeException error) { - Log.e(MtpDocumentsProvider.TAG, "openDocument", error); - throw error; - } catch (IOException error) { - Log.e(MtpDocumentsProvider.TAG, "openDocument", error); - throw new IllegalStateException(error); - } - } - - @Override - public AssetFileDescriptor openDocumentThumbnail( - String documentId, - Point sizeHint, - CancellationSignal signal) throws FileNotFoundException { - final Identifier identifier = mDatabase.createIdentifier(documentId); - try { - openDevice(identifier.mDeviceId); - return new AssetFileDescriptor( - getPipeManager(identifier).readThumbnail(mMtpManager, identifier), - 0, // Start offset. - AssetFileDescriptor.UNKNOWN_LENGTH); - } catch (IOException error) { - Log.e(MtpDocumentsProvider.TAG, "openDocumentThumbnail", error); - throw new FileNotFoundException(error.getMessage()); - } - } - - @Override - public void deleteDocument(String documentId) throws FileNotFoundException { - try { - final Identifier identifier = mDatabase.createIdentifier(documentId); - openDevice(identifier.mDeviceId); - final Identifier parentIdentifier = mDatabase.getParentIdentifier(documentId); - mMtpManager.deleteDocument(identifier.mDeviceId, identifier.mObjectHandle); - mDatabase.deleteDocument(documentId); - getDocumentLoader(parentIdentifier).cancelTask(parentIdentifier); - notifyChildDocumentsChange(parentIdentifier.mDocumentId); - if (parentIdentifier.mDocumentType == MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE) { - // If the parent is storage, the object might be appeared as child of device because - // we skip storage when the device has only one storage. - final Identifier deviceIdentifier = mDatabase.getParentIdentifier( - parentIdentifier.mDocumentId); - notifyChildDocumentsChange(deviceIdentifier.mDocumentId); - } - } catch (IOException error) { - Log.e(MtpDocumentsProvider.TAG, "deleteDocument", error); - throw new FileNotFoundException(error.getMessage()); - } - } - - @Override - public void onTrimMemory(int level) { - synchronized (mDeviceListLock) { - for (final DeviceToolkit toolkit : mDeviceToolkits.values()) { - toolkit.mDocumentLoader.clearCompletedTasks(); - } - } - } - - @Override - public String createDocument(String parentDocumentId, String mimeType, String displayName) - throws FileNotFoundException { - if (DEBUG) { - Log.d(TAG, "createDocument: " + displayName); - } - final Identifier parentId; - final MtpDeviceRecord record; - final ParcelFileDescriptor[] pipe; - try { - parentId = mDatabase.createIdentifier(parentDocumentId); - openDevice(parentId.mDeviceId); - record = getDeviceToolkit(parentId.mDeviceId).mDeviceRecord; - if (!MtpDeviceRecord.isWritingSupported(record.operationsSupported)) { - throw new UnsupportedOperationException( - "Writing operation is not supported by the device."); - } - - final int parentObjectHandle; - final int storageId; - switch (parentId.mDocumentType) { - case MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE: - final String[] storageDocumentIds = - mDatabase.getStorageDocumentIds(parentId.mDocumentId); - if (storageDocumentIds.length == 1) { - final String newDocumentId = - createDocument(storageDocumentIds[0], mimeType, displayName); - notifyChildDocumentsChange(parentDocumentId); - return newDocumentId; - } else { - throw new UnsupportedOperationException( - "Cannot create a file under the device."); - } - case MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE: - storageId = parentId.mStorageId; - parentObjectHandle = -1; - break; - case MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT: - storageId = parentId.mStorageId; - parentObjectHandle = parentId.mObjectHandle; - break; - default: - throw new IllegalArgumentException("Unexpected document type."); - } - - pipe = ParcelFileDescriptor.createReliablePipe(); - int objectHandle = -1; - MtpObjectInfo info = null; - try { - pipe[0].close(); // 0 bytes for a new document. - - final int formatCode = Document.MIME_TYPE_DIR.equals(mimeType) ? - MtpConstants.FORMAT_ASSOCIATION : - MediaFile.getFormatCode(displayName, mimeType); - info = new MtpObjectInfo.Builder() - .setStorageId(storageId) - .setParent(parentObjectHandle) - .setFormat(formatCode) - .setName(displayName) - .build(); - - final String[] parts = FileUtils.splitFileName(mimeType, displayName); - final String baseName = parts[0]; - final String extension = parts[1]; - for (int i = 0; i <= 32; i++) { - final MtpObjectInfo infoUniqueName; - if (i == 0) { - infoUniqueName = info; - } else { - String suffixedName = baseName + " (" + i + " )"; - if (!extension.isEmpty()) { - suffixedName += "." + extension; - } - infoUniqueName = - new MtpObjectInfo.Builder(info).setName(suffixedName).build(); - } - try { - objectHandle = mMtpManager.createDocument( - parentId.mDeviceId, infoUniqueName, pipe[1]); - break; - } catch (SendObjectInfoFailure exp) { - // This can be caused when we have an existing file with the same name. - continue; - } - } - } finally { - pipe[1].close(); - } - if (objectHandle == -1) { - throw new IllegalArgumentException( - "The file name \"" + displayName + "\" is conflicted with existing files " + - "and the provider failed to find unique name."); - } - final MtpObjectInfo infoWithHandle = - new MtpObjectInfo.Builder(info).setObjectHandle(objectHandle).build(); - final String documentId = mDatabase.putNewDocument( - parentId.mDeviceId, parentDocumentId, record.operationsSupported, - infoWithHandle, 0l); - getDocumentLoader(parentId).cancelTask(parentId); - notifyChildDocumentsChange(parentDocumentId); - return documentId; - } catch (FileNotFoundException | RuntimeException error) { - Log.e(TAG, "createDocument", error); - throw error; - } catch (IOException error) { - Log.e(TAG, "createDocument", error); - throw new IllegalStateException(error); - } - } - - @Override - public Path findDocumentPath(String parentDocumentId, String childDocumentId) - throws FileNotFoundException { - final LinkedList<String> ids = new LinkedList<>(); - final Identifier childIdentifier = mDatabase.createIdentifier(childDocumentId); - - Identifier i = childIdentifier; - outer: while (true) { - if (i.mDocumentId.equals(parentDocumentId)) { - ids.addFirst(i.mDocumentId); - break; - } - switch (i.mDocumentType) { - case MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT: - ids.addFirst(i.mDocumentId); - i = mDatabase.getParentIdentifier(i.mDocumentId); - break; - case MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE: { - // Check if there is the multiple storage. - final Identifier deviceIdentifier = - mDatabase.getParentIdentifier(i.mDocumentId); - final String[] storageIds = - mDatabase.getStorageDocumentIds(deviceIdentifier.mDocumentId); - // Add storage's document ID to the path only when the device has multiple - // storages. - if (storageIds.length > 1) { - ids.addFirst(i.mDocumentId); - break outer; - } - i = deviceIdentifier; - break; - } - case MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE: - ids.addFirst(i.mDocumentId); - break outer; - } - } - - if (parentDocumentId != null) { - return new Path(null, ids); - } else { - return new Path(/* Should be same with root ID */ i.mDocumentId, ids); - } - } - - @Override - public boolean isChildDocument(String parentDocumentId, String documentId) { - try { - Identifier identifier = mDatabase.createIdentifier(documentId); - while (true) { - if (parentDocumentId.equals(identifier.mDocumentId)) { - return true; - } - if (identifier.mDocumentType == MtpDatabaseConstants.DOCUMENT_TYPE_DEVICE) { - return false; - } - identifier = mDatabase.getParentIdentifier(identifier.mDocumentId); - } - } catch (FileNotFoundException error) { - return false; - } - } - - @Override - public @Nullable Bundle getDocumentMetadata(String docId) throws FileNotFoundException { - String mimeType = getDocumentType(docId); - - if (!MetadataReader.isSupportedMimeType(mimeType)) { - return null; - } - - InputStream stream = null; - try { - stream = new ParcelFileDescriptor.AutoCloseInputStream( - openDocument(docId, "r", null)); - Bundle metadata = new Bundle(); - MetadataReader.getMetadata(metadata, stream, mimeType, null); - return metadata; - } catch (IOException e) { - Log.e(TAG, "An error occurred retrieving the metadata", e); - return null; - } finally { - IoUtils.closeQuietly(stream); - } - } - - void openDevice(int deviceId) throws IOException { - synchronized (mDeviceListLock) { - if (mDeviceToolkits.containsKey(deviceId)) { - return; - } - if (DEBUG) { - Log.d(TAG, "Open device " + deviceId); - } - final MtpDeviceRecord device = mMtpManager.openDevice(deviceId); - final DeviceToolkit toolkit = - new DeviceToolkit(mMtpManager, mResolver, mDatabase, device); - mDeviceToolkits.put(deviceId, toolkit); - mIntentSender.sendUpdateNotificationIntent(getOpenedDeviceRecordsCache()); - try { - mRootScanner.resume().await(); - } catch (InterruptedException error) { - Log.e(TAG, "openDevice", error); - } - // Resume document loader to remap disconnected document ID. Must be invoked after the - // root scanner resumes. - toolkit.mDocumentLoader.resume(); - } - } - - void closeDevice(int deviceId) throws IOException, InterruptedException { - synchronized (mDeviceListLock) { - closeDeviceInternal(deviceId); - mIntentSender.sendUpdateNotificationIntent(getOpenedDeviceRecordsCache()); - } - mRootScanner.resume(); - } - - MtpDeviceRecord[] getOpenedDeviceRecordsCache() { - synchronized (mDeviceListLock) { - final MtpDeviceRecord[] records = new MtpDeviceRecord[mDeviceToolkits.size()]; - int i = 0; - for (final DeviceToolkit toolkit : mDeviceToolkits.values()) { - records[i] = toolkit.mDeviceRecord; - i++; - } - return records; - } - } - - /** - * Obtains document ID for the given device ID. - * @param deviceId - * @return document ID - * @throws FileNotFoundException device ID has not been build. - */ - public String getDeviceDocumentId(int deviceId) throws FileNotFoundException { - return mDatabase.getDeviceDocumentId(deviceId); - } - - /** - * Resumes root scanner to handle the update of device list. - */ - void resumeRootScanner() { - if (DEBUG) { - Log.d(MtpDocumentsProvider.TAG, "resumeRootScanner"); - } - mRootScanner.resume(); - } - - /** - * Finalize the content provider for unit tests. - */ - @Override - public void shutdown() { - synchronized (mDeviceListLock) { - try { - // Copy the opened key set because it will be modified when closing devices. - final Integer[] keySet = - mDeviceToolkits.keySet().toArray(new Integer[mDeviceToolkits.size()]); - for (final int id : keySet) { - closeDeviceInternal(id); - } - mRootScanner.pause(); - } catch (InterruptedException | IOException | TimeoutException e) { - // It should fail unit tests by throwing runtime exception. - throw new RuntimeException(e); - } finally { - mDatabase.close(); - super.shutdown(); - } - } - } - - private void notifyChildDocumentsChange(String parentDocumentId) { - mResolver.notifyChange( - DocumentsContract.buildChildDocumentsUri(AUTHORITY, parentDocumentId), - null, - false); - } - - /** - * Clears MTP identifier in the database. - */ - private void resume() { - synchronized (mDeviceListLock) { - mDatabase.getMapper().clearMapping(); - } - } - - private void closeDeviceInternal(int deviceId) throws IOException, InterruptedException { - // TODO: Flush the device before closing (if not closed externally). - if (!mDeviceToolkits.containsKey(deviceId)) { - return; - } - if (DEBUG) { - Log.d(TAG, "Close device " + deviceId); - } - getDeviceToolkit(deviceId).close(); - mDeviceToolkits.remove(deviceId); - mMtpManager.closeDevice(deviceId); - } - - private DeviceToolkit getDeviceToolkit(int deviceId) throws FileNotFoundException { - synchronized (mDeviceListLock) { - final DeviceToolkit toolkit = mDeviceToolkits.get(deviceId); - if (toolkit == null) { - throw new FileNotFoundException(); - } - return toolkit; - } - } - - private PipeManager getPipeManager(Identifier identifier) throws FileNotFoundException { - return getDeviceToolkit(identifier.mDeviceId).mPipeManager; - } - - private DocumentLoader getDocumentLoader(Identifier identifier) throws FileNotFoundException { - return getDeviceToolkit(identifier.mDeviceId).mDocumentLoader; - } - - private long getFileSize(String documentId) throws FileNotFoundException { - final Cursor cursor = mDatabase.queryDocument( - documentId, - MtpDatabase.strings(Document.COLUMN_SIZE, Document.COLUMN_DISPLAY_NAME)); - try { - if (cursor.moveToNext()) { - if (cursor.isNull(0)) { - throw new UnsupportedOperationException(); - } - return cursor.getLong(0); - } else { - throw new FileNotFoundException(); - } - } finally { - cursor.close(); - } - } - - /** - * Creates empty cursor with specific error message. - * - * @param projection Column names. - * @param stringResId String resource ID of error message. - * @return Empty cursor with error message. - */ - private Cursor createErrorCursor(String[] projection, int stringResId) { - final Bundle bundle = new Bundle(); - bundle.putString(DocumentsContract.EXTRA_ERROR, mResources.getString(stringResId)); - final Cursor cursor = new MatrixCursor(projection); - cursor.setExtras(bundle); - return cursor; - } - - private static class DeviceToolkit implements AutoCloseable { - public final PipeManager mPipeManager; - public final DocumentLoader mDocumentLoader; - public final MtpDeviceRecord mDeviceRecord; - - public DeviceToolkit(MtpManager manager, - ContentResolver resolver, - MtpDatabase database, - MtpDeviceRecord record) { - mPipeManager = new PipeManager(database); - mDocumentLoader = new DocumentLoader(record, manager, resolver, database); - mDeviceRecord = record; - } - - @Override - public void close() throws InterruptedException { - mPipeManager.close(); - mDocumentLoader.close(); - } - } - - private class MtpProxyFileDescriptorCallback extends ProxyFileDescriptorCallback { - private final int mInode; - private MtpFileWriter mWriter; - - MtpProxyFileDescriptorCallback(int inode) { - mInode = inode; - } - - @Override - public long onGetSize() throws ErrnoException { - try { - return getFileSize(String.valueOf(mInode)); - } catch (FileNotFoundException e) { - Log.e(TAG, e.getMessage(), e); - throw new ErrnoException("onGetSize", OsConstants.ENOENT); - } - } - - @Override - public int onRead(long offset, int size, byte[] data) throws ErrnoException { - try { - final Identifier identifier = mDatabase.createIdentifier(Integer.toString(mInode)); - final MtpDeviceRecord record = getDeviceToolkit(identifier.mDeviceId).mDeviceRecord; - if (MtpDeviceRecord.isSupported( - record.operationsSupported, MtpConstants.OPERATION_GET_PARTIAL_OBJECT_64)) { - - return (int) mMtpManager.getPartialObject64( - identifier.mDeviceId, identifier.mObjectHandle, offset, size, data); - - } - if (0 <= offset && offset <= 0xffffffffL && MtpDeviceRecord.isSupported( - record.operationsSupported, MtpConstants.OPERATION_GET_PARTIAL_OBJECT)) { - return (int) mMtpManager.getPartialObject( - identifier.mDeviceId, identifier.mObjectHandle, offset, size, data); - } - throw new ErrnoException("onRead", OsConstants.ENOTSUP); - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - throw new ErrnoException("onRead", OsConstants.EIO); - } - } - - @Override - public int onWrite(long offset, int size, byte[] data) throws ErrnoException { - try { - if (mWriter == null) { - mWriter = new MtpFileWriter(mContext, String.valueOf(mInode)); - } - return mWriter.write(offset, size, data); - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - throw new ErrnoException("onWrite", OsConstants.EIO); - } - } - - @Override - public void onFsync() throws ErrnoException { - tryFsync(); - } - - @Override - public void onRelease() { - try { - tryFsync(); - } catch (ErrnoException error) { - // Cannot recover from the error at onRelease. Client app should use fsync to - // ensure the provider writes data correctly. - Log.e(TAG, "Cannot recover from the error at onRelease.", error); - } finally { - if (mWriter != null) { - IoUtils.closeQuietly(mWriter); - } - } - } - - private void tryFsync() throws ErrnoException { - try { - if (mWriter != null) { - final MtpDeviceRecord device = - getDeviceToolkit(mDatabase.createIdentifier( - mWriter.getDocumentId()).mDeviceId).mDeviceRecord; - mWriter.flush(mMtpManager, mDatabase, device.operationsSupported); - } - } catch (IOException e) { - Log.e(TAG, e.getMessage(), e); - throw new ErrnoException("onWrite", OsConstants.EIO); - } - } - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java deleted file mode 100644 index fa1a12030240..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsService.java +++ /dev/null @@ -1,124 +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.mtp; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.app.Notification; -import android.app.Service; -import android.app.NotificationManager; -import android.content.Intent; -import android.os.IBinder; -import android.os.Parcelable; -import android.service.notification.StatusBarNotification; -import android.util.Log; -import com.android.internal.util.Preconditions; -import java.util.HashSet; -import java.util.Set; - -/** - * Service to manage lifetime of DocumentsProvider's process. - * The service prevents the system from killing the process that holds USB connections. The service - * starts to run when the first MTP device is opened, and stops when the last MTP device is closed. - */ -public class MtpDocumentsService extends Service { - static final String ACTION_UPDATE_NOTIFICATION = "com.android.mtp.UPDATE_NOTIFICATION"; - static final String EXTRA_DEVICE_IDS = "deviceIds"; - static final String EXTRA_DEVICE_NOTIFICATIONS = "deviceNotifications"; - - private NotificationManager mNotificationManager; - - @Override - public IBinder onBind(Intent intent) { - // The service is used via intents. - return null; - } - - @Override - public void onCreate() { - super.onCreate(); - mNotificationManager = getSystemService(NotificationManager.class); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - // If intent is null, the service was restarted. - if (intent == null || ACTION_UPDATE_NOTIFICATION.equals(intent.getAction())) { - final int[] ids = intent.hasExtra(EXTRA_DEVICE_IDS) ? - intent.getExtras().getIntArray(EXTRA_DEVICE_IDS) : null; - final Notification[] notifications = intent.hasExtra(EXTRA_DEVICE_NOTIFICATIONS) ? - castToNotifications(intent.getExtras().getParcelableArray( - EXTRA_DEVICE_NOTIFICATIONS)) : null; - return updateForegroundState(ids, notifications) ? START_STICKY : START_NOT_STICKY; - } - return START_NOT_STICKY; - } - - /** - * Updates the foreground state of the service. - * @return Whether the service is foreground or not. - */ - private boolean updateForegroundState( - @Nullable int[] ids, @Nullable Notification[] notifications) { - final Set<Integer> openedNotification = new HashSet<>(); - final int size = ids != null ? ids.length : 0; - if (size != 0) { - Preconditions.checkArgument(ids != null); - Preconditions.checkArgument(notifications != null); - Preconditions.checkArgument(ids.length == notifications.length); - } - - for (int i = 0; i < size; i++) { - if (i == 0) { - // Mark this service as foreground with the notification so that the process is - // not killed by the system while a MTP device is opened. - startForeground(ids[i], notifications[i]); - } else { - // Only one notification can be shown as a foreground notification. We need to - // show the rest as normal notification. - mNotificationManager.notify(ids[i], notifications[i]); - } - openedNotification.add(ids[i]); - } - - final StatusBarNotification[] activeNotifications = - mNotificationManager.getActiveNotifications(); - for (final StatusBarNotification notification : activeNotifications) { - if (!openedNotification.contains(notification.getId())) { - mNotificationManager.cancel(notification.getId()); - } - } - - if (size == 0) { - // There is no opened device. - stopForeground(true /* removeNotification */); - stopSelf(); - return false; - } - - return true; - } - - private static @NonNull Notification[] castToNotifications(@NonNull Parcelable[] src) { - Preconditions.checkNotNull(src); - final Notification[] notifications = new Notification[src.length]; - for (int i = 0; i < src.length; i++) { - notifications[i] = (Notification) src[i]; - } - return notifications; - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpFileWriter.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpFileWriter.java deleted file mode 100644 index 3e1bedce49ea..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpFileWriter.java +++ /dev/null @@ -1,108 +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.mtp; - -import android.content.Context; -import android.mtp.MtpObjectInfo; -import android.os.ParcelFileDescriptor; -import android.system.ErrnoException; -import android.system.Os; -import android.system.OsConstants; - -import com.android.internal.util.Preconditions; - -import java.io.File; -import java.io.IOException; - -class MtpFileWriter implements AutoCloseable { - final ParcelFileDescriptor mCacheFd; - final String mDocumentId; - boolean mDirty; - - MtpFileWriter(Context context, String documentId) throws IOException { - mDocumentId = documentId; - mDirty = false; - final File tempFile = File.createTempFile("mtp", "tmp", context.getCacheDir()); - mCacheFd = ParcelFileDescriptor.open( - tempFile, - ParcelFileDescriptor.MODE_READ_WRITE | - ParcelFileDescriptor.MODE_TRUNCATE | - ParcelFileDescriptor.MODE_CREATE); - tempFile.delete(); - } - - String getDocumentId() { - return mDocumentId; - } - - int write(long offset, int size, byte[] bytes) throws IOException, ErrnoException { - Preconditions.checkArgumentNonnegative(offset, "offset"); - Preconditions.checkArgumentNonnegative(size, "size"); - Preconditions.checkArgument(size <= bytes.length); - if (size == 0) { - return 0; - } - mDirty = true; - Os.lseek(mCacheFd.getFileDescriptor(), offset, OsConstants.SEEK_SET); - return Os.write(mCacheFd.getFileDescriptor(), bytes, 0, size); - } - - void flush(MtpManager manager, MtpDatabase database, int[] operationsSupported) - throws IOException, ErrnoException { - // Skip unnecessary flush. - if (!mDirty) { - return; - } - - // Get the placeholder object info. - final Identifier identifier = database.createIdentifier(mDocumentId); - final MtpObjectInfo placeholderObjectInfo = - manager.getObjectInfo(identifier.mDeviceId, identifier.mObjectHandle); - - // Delete the target object info if it already exists (as a placeholder). - manager.deleteDocument(identifier.mDeviceId, identifier.mObjectHandle); - - // Create the target object info with a correct file size and upload the file. - final long size = Os.lseek(mCacheFd.getFileDescriptor(), 0, OsConstants.SEEK_END); - final MtpObjectInfo targetObjectInfo = new MtpObjectInfo.Builder(placeholderObjectInfo) - .setCompressedSize(size) - .build(); - - Os.lseek(mCacheFd.getFileDescriptor(), 0, OsConstants.SEEK_SET); - final int newObjectHandle = manager.createDocument( - identifier.mDeviceId, targetObjectInfo, mCacheFd); - - final MtpObjectInfo newObjectInfo = manager.getObjectInfo( - identifier.mDeviceId, newObjectHandle); - final Identifier parentIdentifier = - database.getParentIdentifier(identifier.mDocumentId); - database.updateObject( - identifier.mDocumentId, - identifier.mDeviceId, - parentIdentifier.mDocumentId, - operationsSupported, - newObjectInfo, - size); - - mDirty = false; - } - - @Override - public void close() throws IOException { - mCacheFd.close(); - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java deleted file mode 100644 index a7de631cd6fa..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java +++ /dev/null @@ -1,321 +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.mtp; - -import android.annotation.Nullable; -import android.content.Context; -import android.hardware.usb.UsbConstants; -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbDeviceConnection; -import android.hardware.usb.UsbInterface; -import android.hardware.usb.UsbManager; -import android.mtp.MtpConstants; -import android.mtp.MtpDevice; -import android.mtp.MtpDeviceInfo; -import android.mtp.MtpEvent; -import android.mtp.MtpObjectInfo; -import android.mtp.MtpStorageInfo; -import android.os.CancellationSignal; -import android.os.ParcelFileDescriptor; -import android.util.Log; -import android.util.SparseArray; - -import com.android.internal.annotations.VisibleForTesting; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; - -/** - * The model wrapping android.mtp API. - */ -class MtpManager { - final static int OBJECT_HANDLE_ROOT_CHILDREN = -1; - - /** - * Subclass for PTP. - */ - private static final int SUBCLASS_STILL_IMAGE_CAPTURE = 1; - - /** - * Subclass for Android style MTP. - */ - private static final int SUBCLASS_MTP = 0xff; - - /** - * Protocol for Picture Transfer Protocol (PIMA 15470). - */ - private static final int PROTOCOL_PICTURE_TRANSFER = 1; - - /** - * Protocol for Android style MTP. - */ - private static final int PROTOCOL_MTP = 0; - - private final UsbManager mManager; - private final SparseArray<MtpDevice> mDevices = new SparseArray<>(); - - MtpManager(Context context) { - mManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); - } - - synchronized MtpDeviceRecord openDevice(int deviceId) throws IOException { - UsbDevice rawDevice = null; - for (final UsbDevice candidate : mManager.getDeviceList().values()) { - if (candidate.getDeviceId() == deviceId) { - rawDevice = candidate; - break; - } - } - - ensureNotNull(rawDevice, "Not found USB device: " + deviceId); - - if (!mManager.hasPermission(rawDevice)) { - mManager.grantPermission(rawDevice); - if (!mManager.hasPermission(rawDevice)) { - throw new IOException("Failed to grant a device permission."); - } - } - - final MtpDevice device = new MtpDevice(rawDevice); - - final UsbDeviceConnection connection = ensureNotNull( - mManager.openDevice(rawDevice), - "Failed to open a USB connection."); - - if (!device.open(connection)) { - // We cannot open connection when another application use the device. - throw new BusyDeviceException(); - } - - // Handle devices that fail to obtain storages just after opening a MTP session. - final int[] storageIds = ensureNotNull( - device.getStorageIds(), - "Not found MTP storages in the device."); - - mDevices.put(deviceId, device); - return createDeviceRecord(rawDevice); - } - - synchronized void closeDevice(int deviceId) throws IOException { - getDevice(deviceId).close(); - mDevices.remove(deviceId); - } - - synchronized MtpDeviceRecord[] getDevices() { - final ArrayList<MtpDeviceRecord> devices = new ArrayList<>(); - for (UsbDevice device : mManager.getDeviceList().values()) { - if (!isMtpDevice(device)) { - continue; - } - devices.add(createDeviceRecord(device)); - } - return devices.toArray(new MtpDeviceRecord[devices.size()]); - } - - MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - return ensureNotNull( - device.getObjectInfo(objectHandle), - "Failed to get object info: " + objectHandle); - } - } - - int[] getObjectHandles(int deviceId, int storageId, int parentObjectHandle) - throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - return ensureNotNull( - device.getObjectHandles(storageId, 0 /* all format */, parentObjectHandle), - "Failed to fetch object handles."); - } - } - - byte[] getObject(int deviceId, int objectHandle, int expectedSize) - throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - return ensureNotNull( - device.getObject(objectHandle, expectedSize), - "Failed to fetch object bytes"); - } - } - - long getPartialObject(int deviceId, int objectHandle, long offset, long size, byte[] buffer) - throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - return device.getPartialObject(objectHandle, offset, size, buffer); - } - } - - long getPartialObject64(int deviceId, int objectHandle, long offset, long size, byte[] buffer) - throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - return device.getPartialObject64(objectHandle, offset, size, buffer); - } - } - - byte[] getThumbnail(int deviceId, int objectHandle) throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - return ensureNotNull( - device.getThumbnail(objectHandle), - "Failed to obtain thumbnail bytes"); - } - } - - void deleteDocument(int deviceId, int objectHandle) throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - if (!device.deleteObject(objectHandle)) { - throw new IOException("Failed to delete document"); - } - } - } - - int createDocument(int deviceId, MtpObjectInfo objectInfo, - ParcelFileDescriptor source) throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - final MtpObjectInfo sendObjectInfoResult = device.sendObjectInfo(objectInfo); - if (sendObjectInfoResult == null) { - throw new SendObjectInfoFailure(); - } - if (objectInfo.getFormat() != MtpConstants.FORMAT_ASSOCIATION) { - if (!device.sendObject(sendObjectInfoResult.getObjectHandle(), - sendObjectInfoResult.getCompressedSizeLong(), source)) { - throw new IOException("Failed to send contents of a document"); - } - } - return sendObjectInfoResult.getObjectHandle(); - } - } - - int getParent(int deviceId, int objectHandle) throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - final int result = (int) device.getParent(objectHandle); - if (result == 0xffffffff) { - throw new FileNotFoundException("Not found parent object"); - } - return result; - } - } - - void importFile(int deviceId, int objectHandle, ParcelFileDescriptor target) - throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - if (!device.importFile(objectHandle, target)) { - throw new IOException("Failed to import file to FD"); - } - } - } - - @VisibleForTesting - MtpEvent readEvent(int deviceId, CancellationSignal signal) throws IOException { - final MtpDevice device = getDevice(deviceId); - return device.readEvent(signal); - } - - long getObjectSizeLong(int deviceId, int objectHandle, int format) throws IOException { - final MtpDevice device = getDevice(deviceId); - return device.getObjectSizeLong(objectHandle, format); - } - - private synchronized MtpDevice getDevice(int deviceId) throws IOException { - return ensureNotNull( - mDevices.get(deviceId), - "USB device " + deviceId + " is not opened."); - } - - private MtpRoot[] getRoots(int deviceId) throws IOException { - final MtpDevice device = getDevice(deviceId); - synchronized (device) { - final int[] storageIds = - ensureNotNull(device.getStorageIds(), "Failed to obtain storage IDs."); - final ArrayList<MtpRoot> roots = new ArrayList<>(); - for (int i = 0; i < storageIds.length; i++) { - final MtpStorageInfo info = device.getStorageInfo(storageIds[i]); - if (info == null) { - continue; - } - roots.add(new MtpRoot(device.getDeviceId(), info)); - } - return roots.toArray(new MtpRoot[roots.size()]); - } - } - - private MtpDeviceRecord createDeviceRecord(UsbDevice device) { - final MtpDevice mtpDevice = mDevices.get(device.getDeviceId()); - final boolean opened = mtpDevice != null; - final String name = device.getProductName(); - MtpRoot[] roots; - int[] operationsSupported = null; - int[] eventsSupported = null; - if (opened) { - try { - roots = getRoots(device.getDeviceId()); - } catch (IOException exp) { - Log.e(MtpDocumentsProvider.TAG, "Failed to open device", exp); - // If we failed to fetch roots for the device, we still returns device model - // with an empty set of roots so that the device is shown DocumentsUI as long as - // the device is physically connected. - roots = new MtpRoot[0]; - } - final MtpDeviceInfo info = mtpDevice.getDeviceInfo(); - if (info != null) { - operationsSupported = info.getOperationsSupported(); - eventsSupported = info.getEventsSupported(); - } - } else { - roots = new MtpRoot[0]; - } - return new MtpDeviceRecord( - device.getDeviceId(), name, device.getSerialNumber(), opened, roots, - operationsSupported, eventsSupported); - } - - static boolean isMtpDevice(UsbDevice device) { - for (int i = 0; i < device.getInterfaceCount(); i++) { - final UsbInterface usbInterface = device.getInterface(i); - if ((usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_STILL_IMAGE && - usbInterface.getInterfaceSubclass() == SUBCLASS_STILL_IMAGE_CAPTURE && - usbInterface.getInterfaceProtocol() == PROTOCOL_PICTURE_TRANSFER)) { - return true; - } - if (usbInterface.getInterfaceClass() == UsbConstants.USB_SUBCLASS_VENDOR_SPEC && - usbInterface.getInterfaceSubclass() == SUBCLASS_MTP && - usbInterface.getInterfaceProtocol() == PROTOCOL_MTP && - "MTP".equals(usbInterface.getName())) { - return true; - } - } - return false; - } - - private static <T> T ensureNotNull(@Nullable T t, String errorMessage) throws IOException { - if (t != null) { - return t; - } else { - throw new IOException(errorMessage); - } - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpRoot.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpRoot.java deleted file mode 100644 index 8530aaff7f95..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpRoot.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.mtp; - -import android.mtp.MtpStorageInfo; - -import com.android.internal.annotations.VisibleForTesting; - -class MtpRoot { - final int mDeviceId; - final int mStorageId; - final String mDescription; - final long mFreeSpace; - final long mMaxCapacity; - final String mVolumeIdentifier; - - @VisibleForTesting - MtpRoot(int deviceId, - int storageId, - String description, - long freeSpace, - long maxCapacity, - String volumeIdentifier) { - mDeviceId = deviceId; - mStorageId = storageId; - mDescription = description; - mFreeSpace = freeSpace; - mMaxCapacity = maxCapacity; - mVolumeIdentifier = volumeIdentifier; - } - - MtpRoot(int deviceId, MtpStorageInfo storageInfo) { - mDeviceId = deviceId; - mStorageId = storageInfo.getStorageId(); - mDescription = storageInfo.getDescription(); - mFreeSpace = storageInfo.getFreeSpace(); - mMaxCapacity = storageInfo.getMaxCapacity(); - mVolumeIdentifier = storageInfo.getVolumeIdentifier(); - } - - @Override - public boolean equals(Object object) { - if (!(object instanceof MtpRoot)) - return false; - final MtpRoot other = (MtpRoot) object; - return mDeviceId == other.mDeviceId && - mStorageId == other.mStorageId && - mDescription.equals(other.mDescription) && - mFreeSpace == other.mFreeSpace && - mMaxCapacity == other.mMaxCapacity && - mVolumeIdentifier.equals(other.mVolumeIdentifier); - } - - @Override - public int hashCode() { - return mDeviceId ^ mStorageId ^ mDescription.hashCode() ^ - ((int) mFreeSpace) ^ ((int) mMaxCapacity) ^ mVolumeIdentifier.hashCode(); - } - - @Override - public String toString() { - return "MtpRoot{Name: " + mDescription + "}"; - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/PipeManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/PipeManager.java deleted file mode 100644 index 795bbc190336..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/PipeManager.java +++ /dev/null @@ -1,121 +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.mtp; - -import android.os.ParcelFileDescriptor; -import android.util.Log; - -import java.io.IOException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -class PipeManager { - /** - * Milliseconds we wait for background thread when pausing. - */ - private final static long AWAIT_TERMINATION_TIMEOUT = 2000; - - final ExecutorService mExecutor; - final MtpDatabase mDatabase; - - PipeManager(MtpDatabase database) { - this(database, Executors.newSingleThreadExecutor()); - } - - PipeManager(MtpDatabase database, ExecutorService executor) { - this.mDatabase = database; - this.mExecutor = executor; - } - - ParcelFileDescriptor readDocument(MtpManager model, Identifier identifier) throws IOException { - final Task task = new ImportFileTask(model, identifier); - mExecutor.execute(task); - return task.getReadingFileDescriptor(); - } - - ParcelFileDescriptor readThumbnail(MtpManager model, Identifier identifier) throws IOException { - final Task task = new GetThumbnailTask(model, identifier); - mExecutor.execute(task); - return task.getReadingFileDescriptor(); - } - - private static abstract class Task implements Runnable { - protected final MtpManager mManager; - protected final Identifier mIdentifier; - protected final ParcelFileDescriptor[] mDescriptors; - - Task(MtpManager manager, Identifier identifier) throws IOException { - mManager = manager; - mIdentifier = identifier; - mDescriptors = ParcelFileDescriptor.createReliablePipe(); - } - - ParcelFileDescriptor getReadingFileDescriptor() { - return mDescriptors[0]; - } - } - - private static class ImportFileTask extends Task { - ImportFileTask(MtpManager model, Identifier identifier) throws IOException { - super(model, identifier); - } - - @Override - public void run() { - try { - mManager.importFile( - mIdentifier.mDeviceId, mIdentifier.mObjectHandle, mDescriptors[1]); - mDescriptors[1].close(); - } catch (IOException error) { - try { - mDescriptors[1].closeWithError("Failed to stream a file."); - } catch (IOException closeError) { - Log.w(MtpDocumentsProvider.TAG, closeError.getMessage()); - } - } - } - } - - private static class GetThumbnailTask extends Task { - GetThumbnailTask(MtpManager model, Identifier identifier) throws IOException { - super(model, identifier); - } - - @Override - public void run() { - try { - try (final ParcelFileDescriptor.AutoCloseOutputStream stream = - new ParcelFileDescriptor.AutoCloseOutputStream(mDescriptors[1])) { - try { - stream.write(mManager.getThumbnail( - mIdentifier.mDeviceId, mIdentifier.mObjectHandle)); - } catch (IOException error) { - mDescriptors[1].closeWithError("Failed to stream a thumbnail."); - } - } - } catch (IOException closeError) { - Log.w(MtpDocumentsProvider.TAG, closeError.getMessage()); - } - } - } - - boolean close() throws InterruptedException { - mExecutor.shutdownNow(); - return mExecutor.awaitTermination(AWAIT_TERMINATION_TIMEOUT, TimeUnit.MILLISECONDS); - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/ReceiverActivity.java b/packages/MtpDocumentsProvider/src/com/android/mtp/ReceiverActivity.java deleted file mode 100644 index 19c2c14478f1..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/ReceiverActivity.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.mtp; - -import android.app.Activity; -import android.content.Intent; -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbManager; -import android.net.Uri; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.util.Log; - -import java.io.IOException; - -/** - * Invisible activity to receive intents. - * To show Files app for the UsbManager.ACTION_USB_DEVICE_ATTACHED intent, the intent should be - * received by activity. The activity has NoDisplay theme and immediately terminate after routing - * intent to DocumentsUI. - */ -public class ReceiverActivity extends Activity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(getIntent().getAction())) { - final UsbDevice device = getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE); - try { - final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance(); - provider.openDevice(device.getDeviceId()); - final String deviceRootId = provider.getDeviceDocumentId(device.getDeviceId()); - final Uri uri = DocumentsContract.buildRootUri( - MtpDocumentsProvider.AUTHORITY, deviceRootId); - - final Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(uri, DocumentsContract.Root.MIME_TYPE_ITEM); - intent.addCategory(Intent.CATEGORY_DEFAULT); - this.startActivity(intent); - } catch (IOException exception) { - Log.e(MtpDocumentsProvider.TAG, "Failed to open device", exception); - } - } - finish(); - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java b/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java deleted file mode 100644 index 20be2ba736fa..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/RootScanner.java +++ /dev/null @@ -1,200 +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.mtp; - -import android.content.ContentResolver; -import android.net.Uri; -import android.os.Process; -import android.provider.DocumentsContract; -import android.util.Log; - -import java.io.FileNotFoundException; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -final class RootScanner { - /** - * Polling interval in milliseconds used for first SHORT_POLLING_TIMES because it is more - * likely to add new root just after the device is added. - */ - private final static long SHORT_POLLING_INTERVAL = 2000; - - /** - * Polling interval in milliseconds for low priority polling, when changes are not expected. - */ - private final static long LONG_POLLING_INTERVAL = 30 * 1000; - - /** - * @see #SHORT_POLLING_INTERVAL - */ - private final static long SHORT_POLLING_TIMES = 10; - - /** - * Milliseconds we wait for background thread when pausing. - */ - private final static long AWAIT_TERMINATION_TIMEOUT = 2000; - - final ContentResolver mResolver; - final MtpManager mManager; - final MtpDatabase mDatabase; - - ExecutorService mExecutor; - private UpdateRootsRunnable mCurrentTask; - - RootScanner( - ContentResolver resolver, - MtpManager manager, - MtpDatabase database) { - mResolver = resolver; - mManager = manager; - mDatabase = database; - } - - /** - * Notifies a change of the roots list via ContentResolver. - */ - void notifyChange() { - final Uri uri = DocumentsContract.buildRootsUri(MtpDocumentsProvider.AUTHORITY); - mResolver.notifyChange(uri, null, false); - } - - /** - * Starts to check new changes right away. - */ - synchronized CountDownLatch resume() { - if (mExecutor == null) { - // Only single thread updates the database. - mExecutor = Executors.newSingleThreadExecutor(); - } - if (mCurrentTask != null) { - // Stop previous task. - mCurrentTask.stop(); - } - mCurrentTask = new UpdateRootsRunnable(); - mExecutor.execute(mCurrentTask); - return mCurrentTask.mFirstScanCompleted; - } - - /** - * Stops background thread and wait for its termination. - * @throws InterruptedException - */ - synchronized void pause() throws InterruptedException, TimeoutException { - if (mExecutor == null) { - return; - } - mExecutor.shutdownNow(); - try { - if (!mExecutor.awaitTermination(AWAIT_TERMINATION_TIMEOUT, TimeUnit.MILLISECONDS)) { - throw new TimeoutException( - "Timeout for terminating RootScanner's background thread."); - } - } finally { - mExecutor = null; - } - } - - /** - * Runnable to scan roots and update the database information. - */ - private final class UpdateRootsRunnable implements Runnable { - /** - * Count down latch that specifies the runnable is stopped. - */ - final CountDownLatch mStopped = new CountDownLatch(1); - - /** - * Count down latch that specifies the first scan is completed. - */ - final CountDownLatch mFirstScanCompleted = new CountDownLatch(1); - - @Override - public void run() { - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - int pollingCount = 0; - while (mStopped.getCount() > 0) { - boolean changed = false; - - // Update devices. - final MtpDeviceRecord[] devices = mManager.getDevices(); - try { - mDatabase.getMapper().startAddingDocuments(null /* parentDocumentId */); - for (final MtpDeviceRecord device : devices) { - if (mDatabase.getMapper().putDeviceDocument(device)) { - changed = true; - } - } - if (mDatabase.getMapper().stopAddingDocuments( - null /* parentDocumentId */)) { - changed = true; - } - } catch (FileNotFoundException exception) { - // The top root (ID is null) must exist always. - // FileNotFoundException is unexpected. - Log.e(MtpDocumentsProvider.TAG, "Unexpected FileNotFoundException", exception); - throw new AssertionError("Unexpected exception for the top parent", exception); - } - - // Update roots. - for (final MtpDeviceRecord device : devices) { - final String documentId = mDatabase.getDocumentIdForDevice(device.deviceId); - if (documentId == null) { - continue; - } - try { - mDatabase.getMapper().startAddingDocuments(documentId); - if (mDatabase.getMapper().putStorageDocuments( - documentId, device.operationsSupported, device.roots)) { - changed = true; - } - if (mDatabase.getMapper().stopAddingDocuments(documentId)) { - changed = true; - } - } catch (FileNotFoundException exception) { - Log.e(MtpDocumentsProvider.TAG, "Parent document is gone.", exception); - continue; - } - } - - if (changed) { - notifyChange(); - } - mFirstScanCompleted.countDown(); - pollingCount++; - if (devices.length == 0) { - break; - } - try { - // Use SHORT_POLLING_PERIOD for the first SHORT_POLLING_TIMES because it is - // more likely to add new root just after the device is added. - // TODO: Use short interval only for a device that is just added. - mStopped.await(pollingCount > SHORT_POLLING_TIMES ? - LONG_POLLING_INTERVAL : SHORT_POLLING_INTERVAL, TimeUnit.MILLISECONDS); - } catch (InterruptedException exp) { - break; - } - } - } - - void stop() { - mStopped.countDown(); - } - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/SendObjectInfoFailure.java b/packages/MtpDocumentsProvider/src/com/android/mtp/SendObjectInfoFailure.java deleted file mode 100644 index db7d777e280e..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/SendObjectInfoFailure.java +++ /dev/null @@ -1,28 +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.mtp; - -import java.io.IOException; - -/** - * Exception thrown when sendObjectInfo failed. - */ -class SendObjectInfoFailure extends IOException { - SendObjectInfoFailure() { - super("Failed to MtpDevice#sendObjectInfo."); - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/ServiceIntentSender.java b/packages/MtpDocumentsProvider/src/com/android/mtp/ServiceIntentSender.java deleted file mode 100644 index 629f6dfc1923..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/ServiceIntentSender.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.mtp; - -import android.annotation.NonNull; -import android.app.Notification; -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.Preconditions; - -/** - * Sends intent to MtpDocumentsService. - */ -class ServiceIntentSender { - private final static String CHANNEL_ID = "device_notification_channel"; - private final Context mContext; - - ServiceIntentSender(Context context) { - mContext = context; - - // Create notification channel. - final NotificationChannel mChannel = new NotificationChannel( - CHANNEL_ID, - context.getResources().getString( - com.android.internal.R.string.default_notification_channel_label), - NotificationManager.IMPORTANCE_LOW); - final NotificationManager notificationManager = - (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.createNotificationChannel(mChannel); - } - - @VisibleForTesting - protected ServiceIntentSender() { - mContext = null; - } - - /** - * Notify the change of opened device set. - * @param records List of opened devices. Can be empty. - */ - void sendUpdateNotificationIntent(@NonNull MtpDeviceRecord[] records) { - Preconditions.checkNotNull(records); - final Intent intent = new Intent(MtpDocumentsService.ACTION_UPDATE_NOTIFICATION); - intent.setComponent(new ComponentName(mContext, MtpDocumentsService.class)); - if (records.length != 0) { - final int[] ids = new int[records.length]; - final Notification[] notifications = new Notification[records.length]; - for (int i = 0; i < records.length; i++) { - ids[i] = records[i].deviceId; - notifications[i] = createNotification(mContext, records[i]); - } - intent.putExtra(MtpDocumentsService.EXTRA_DEVICE_IDS, ids); - intent.putExtra(MtpDocumentsService.EXTRA_DEVICE_NOTIFICATIONS, notifications); - mContext.startForegroundService(intent); - } else { - mContext.startService(intent); - } - } - - private static Notification createNotification(Context context, MtpDeviceRecord device) { - final String title = context.getResources().getString( - R.string.accessing_notification_title, - device.name); - return new Notification.Builder(context, CHANNEL_ID) - .setLocalOnly(true) - .setContentTitle(title) - .setSmallIcon(com.android.internal.R.drawable.stat_sys_data_usb) - .setCategory(Notification.CATEGORY_SYSTEM) - .setFlag(Notification.FLAG_NO_CLEAR, true) - .build(); - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/UsbIntentReceiver.java b/packages/MtpDocumentsProvider/src/com/android/mtp/UsbIntentReceiver.java deleted file mode 100644 index 0489ea863396..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/UsbIntentReceiver.java +++ /dev/null @@ -1,45 +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.mtp; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbManager; -import android.util.Log; - -import java.io.IOException; - -public class UsbIntentReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - final UsbDevice device = intent.getExtras().getParcelable(UsbManager.EXTRA_DEVICE); - switch (intent.getAction()) { - case UsbManager.ACTION_USB_DEVICE_ATTACHED: - MtpDocumentsProvider.getInstance().resumeRootScanner(); - break; - case UsbManager.ACTION_USB_DEVICE_DETACHED: - try { - MtpDocumentsProvider.getInstance().closeDevice(device.getDeviceId()); - } catch (IOException | InterruptedException e) { - Log.e(MtpDocumentsProvider.TAG, "Failed to close device", e); - } - break; - } - } -} diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/annotations/UsedByNative.java b/packages/MtpDocumentsProvider/src/com/android/mtp/annotations/UsedByNative.java deleted file mode 100644 index 2ded92540627..000000000000 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/annotations/UsedByNative.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.mtp.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Target; - -/** - * Annotation that shows the method is used by JNI. - */ -@Target({ElementType.METHOD, ElementType.FIELD}) -public @interface UsedByNative { - /** - * JNI file name that uses the method. - */ - String value(); -} diff --git a/packages/MtpDocumentsProvider/tests/Android.mk b/packages/MtpDocumentsProvider/tests/Android.mk deleted file mode 100644 index 11daac344587..000000000000 --- a/packages/MtpDocumentsProvider/tests/Android.mk +++ /dev/null @@ -1,14 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE_TAGS := tests -LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base android.test.mock -LOCAL_STATIC_JAVA_LIBRARIES := junit -LOCAL_PACKAGE_NAME := MtpDocumentsProviderTests -LOCAL_PRIVATE_PLATFORM_APIS := true -LOCAL_INSTRUMENTATION_FOR := MtpDocumentsProvider -LOCAL_CERTIFICATE := media -LOCAL_COMPATIBILITY_SUITE := device-tests - -include $(BUILD_PACKAGE) diff --git a/packages/MtpDocumentsProvider/tests/AndroidManifest.xml b/packages/MtpDocumentsProvider/tests/AndroidManifest.xml deleted file mode 100644 index e1307e90ac64..000000000000 --- a/packages/MtpDocumentsProvider/tests/AndroidManifest.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.mtp.tests" - android:sharedUserId="android.media"> - - <application> - <uses-library android:name="android.test.runner" /> - <activity android:name="com.android.mtp.TestResultActivity" - android:screenOrientation="locked" - android:launchMode="singleInstance"> - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - <category android:name="android.intent.category.LAUNCHER" /> - </intent-filter> - </activity> - </application> - - <instrumentation android:name="com.android.mtp.TestResultInstrumentation" - android:targetPackage="com.android.mtp" - android:label="Tests for MtpDocumentsProvider with the UI for output." /> -</manifest> diff --git a/packages/MtpDocumentsProvider/tests/AndroidTest.xml b/packages/MtpDocumentsProvider/tests/AndroidTest.xml deleted file mode 100644 index f84131c22915..000000000000 --- a/packages/MtpDocumentsProvider/tests/AndroidTest.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2017 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<configuration description="Runs Tests for MtpDocumentsProvider with the UI for output."> - <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup"> - <option name="test-file-name" value="MtpDocumentsProviderTests.apk" /> - </target_preparer> - - <option name="test-suite-tag" value="apct" /> - <option name="test-tag" value="MtpDocumentsProviderTests" /> - <test class="com.android.tradefed.testtype.InstrumentationTest" > - <option name="package" value="com.android.mtp.tests" /> - <option name="runner" value="com.android.mtp.TestResultInstrumentation" /> - <option name="hidden-api-checks" value="false"/> - </test> -</configuration> diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java deleted file mode 100644 index a3c6bd77cefb..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java +++ /dev/null @@ -1,229 +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.mtp; - -import android.content.Context; -import android.database.Cursor; -import android.mtp.MtpObjectInfo; -import android.net.Uri; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeoutException; - -@MediumTest -public class DocumentLoaderTest extends AndroidTestCase { - private MtpDatabase mDatabase; - private BlockableTestMtpManager mManager; - private TestContentResolver mResolver; - private DocumentLoader mLoader; - final private Identifier mParentIdentifier = new Identifier( - 0, 0, 0, "2", MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE); - - @Override - public void setUp() throws Exception { - mDatabase = new MtpDatabase(getContext(), MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument( - new MtpDeviceRecord(0, "Device", null, true, new MtpRoot[0], null, null)); - mDatabase.getMapper().stopAddingDocuments(null); - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", new int[0], new MtpRoot[] { - new MtpRoot(0, 0, "Storage", 1000, 1000, "") - }); - mDatabase.getMapper().stopAddingDocuments("1"); - - mManager = new BlockableTestMtpManager(getContext()); - mResolver = new TestContentResolver(); - } - - @Override - public void tearDown() throws Exception { - mLoader.close(); - mDatabase.close(); - } - - public void testBasic() throws Exception { - setUpLoader(); - - final Uri uri = DocumentsContract.buildChildDocumentsUri( - MtpDocumentsProvider.AUTHORITY, mParentIdentifier.mDocumentId); - setUpDocument(mManager, 40); - mManager.blockDocument(0, 15); - mManager.blockDocument(0, 35); - - { - final Cursor cursor = mLoader.queryChildDocuments( - MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); - assertEquals(DocumentLoader.NUM_INITIAL_ENTRIES, cursor.getCount()); - } - - Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS); - mManager.unblockDocument(0, 15); - mResolver.waitForNotification(uri, 1); - - { - final Cursor cursor = mLoader.queryChildDocuments( - MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); - assertEquals( - DocumentLoader.NUM_INITIAL_ENTRIES + DocumentLoader.NUM_LOADING_ENTRIES, - cursor.getCount()); - } - - mManager.unblockDocument(0, 35); - mResolver.waitForNotification(uri, 2); - - { - final Cursor cursor = mLoader.queryChildDocuments( - MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); - assertEquals(40, cursor.getCount()); - } - - assertEquals(2, mResolver.getChangeCount(uri)); - } - - public void testError_GetObjectHandles() throws Exception { - mManager = new BlockableTestMtpManager(getContext()) { - @Override - int[] getObjectHandles(int deviceId, int storageId, int parentObjectHandle) - throws IOException { - throw new IOException(); - } - }; - setUpLoader(); - mManager.setObjectHandles(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, null); - try { - try (final Cursor cursor = mLoader.queryChildDocuments( - MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier)) {} - fail(); - } catch (IOException exception) { - // Expect exception. - } - } - - public void testError_GetObjectInfo() throws Exception { - mManager = new BlockableTestMtpManager(getContext()) { - @Override - MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException { - if (objectHandle == DocumentLoader.NUM_INITIAL_ENTRIES) { - throw new IOException(); - } else { - return super.getObjectInfo(deviceId, objectHandle); - } - } - }; - setUpLoader(); - setUpDocument(mManager, DocumentLoader.NUM_INITIAL_ENTRIES); - try (final Cursor cursor = mLoader.queryChildDocuments( - MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier)) { - // Even if MtpManager returns an error for a document, loading must complete. - assertFalse(cursor.getExtras().getBoolean(DocumentsContract.EXTRA_LOADING)); - } - } - - public void testCancelTask() throws IOException, InterruptedException, TimeoutException { - setUpDocument(mManager, - DocumentLoader.NUM_INITIAL_ENTRIES + 1); - - // Block the first iteration in the background thread. - mManager.blockDocument( - 0, DocumentLoader.NUM_INITIAL_ENTRIES + 1); - setUpLoader(); - try (final Cursor cursor = mLoader.queryChildDocuments( - MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier)) { - assertTrue(cursor.getExtras().getBoolean(DocumentsContract.EXTRA_LOADING)); - } - - final Uri uri = DocumentsContract.buildChildDocumentsUri( - MtpDocumentsProvider.AUTHORITY, mParentIdentifier.mDocumentId); - assertEquals(0, mResolver.getChangeCount(uri)); - - // Clear task while the first iteration is being blocked. - mLoader.cancelTask(mParentIdentifier); - mManager.unblockDocument( - 0, DocumentLoader.NUM_INITIAL_ENTRIES + 1); - Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS); - assertEquals(0, mResolver.getChangeCount(uri)); - - // Check if it's OK to query invalidated task. - try (final Cursor cursor = mLoader.queryChildDocuments( - MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier)) { - assertTrue(cursor.getExtras().getBoolean(DocumentsContract.EXTRA_LOADING)); - } - mResolver.waitForNotification(uri, 1); - } - - private void setUpLoader() { - mLoader = new DocumentLoader( - new MtpDeviceRecord( - 0, "Device", "Key", true, new MtpRoot[0], - TestUtil.OPERATIONS_SUPPORTED, new int[0]), - mManager, - mResolver, - mDatabase); - } - - private void setUpDocument(TestMtpManager manager, int count) { - int[] childDocuments = new int[count]; - for (int i = 0; i < childDocuments.length; i++) { - final int objectHandle = i + 1; - childDocuments[i] = objectHandle; - manager.setObjectInfo(0, new MtpObjectInfo.Builder() - .setObjectHandle(objectHandle) - .setName(Integer.toString(i)) - .build()); - } - manager.setObjectHandles(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, childDocuments); - } - - private static class BlockableTestMtpManager extends TestMtpManager { - final private Map<String, CountDownLatch> blockedDocuments = new HashMap<>(); - - BlockableTestMtpManager(Context context) { - super(context); - } - - void blockDocument(int deviceId, int objectHandle) { - blockedDocuments.put(pack(deviceId, objectHandle), new CountDownLatch(1)); - } - - void unblockDocument(int deviceId, int objectHandle) { - blockedDocuments.get(pack(deviceId, objectHandle)).countDown(); - } - - @Override - MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException { - final CountDownLatch latch = blockedDocuments.get(pack(deviceId, objectHandle)); - if (latch != null) { - try { - latch.await(); - } catch(InterruptedException e) { - fail(); - } - } - return super.getObjectInfo(deviceId, objectHandle); - } - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java deleted file mode 100644 index 32b169e6fa9f..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java +++ /dev/null @@ -1,1133 +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.mtp; - -import android.database.Cursor; -import android.media.MediaFile; -import android.media.MediaFile.MediaFileType; -import android.mtp.MtpConstants; -import android.mtp.MtpObjectInfo; -import android.net.Uri; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Root; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -import java.io.FileNotFoundException; -import java.util.Arrays; - -import static android.provider.DocumentsContract.Document.*; -import static com.android.mtp.MtpDatabase.strings; -import static com.android.mtp.MtpDatabaseConstants.*; -import static com.android.mtp.TestUtil.OPERATIONS_SUPPORTED; - -@SmallTest -public class MtpDatabaseTest extends AndroidTestCase { - private static final String[] COLUMN_NAMES = new String[] { - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - MtpDatabaseConstants.COLUMN_DEVICE_ID, - MtpDatabaseConstants.COLUMN_STORAGE_ID, - MtpDatabaseConstants.COLUMN_OBJECT_HANDLE, - DocumentsContract.Document.COLUMN_MIME_TYPE, - DocumentsContract.Document.COLUMN_DISPLAY_NAME, - DocumentsContract.Document.COLUMN_SUMMARY, - DocumentsContract.Document.COLUMN_LAST_MODIFIED, - DocumentsContract.Document.COLUMN_ICON, - DocumentsContract.Document.COLUMN_FLAGS, - DocumentsContract.Document.COLUMN_SIZE, - MtpDatabaseConstants.COLUMN_DOCUMENT_TYPE - }; - - private final TestResources resources = new TestResources(); - MtpDatabase mDatabase; - - @Override - public void setUp() { - mDatabase = new MtpDatabase(getContext(), MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - } - - @Override - public void tearDown() { - mDatabase.close(); - mDatabase = null; - } - - private static int getInt(Cursor cursor, String columnName) { - return cursor.getInt(cursor.getColumnIndex(columnName)); - } - - private static boolean isNull(Cursor cursor, String columnName) { - return cursor.isNull(cursor.getColumnIndex(columnName)); - } - - private static String getString(Cursor cursor, String columnName) { - return cursor.getString(cursor.getColumnIndex(columnName)); - } - - public void testPutSingleStorageDocuments() throws Exception { - addTestDevice(); - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 1, "Storage", 1000, 2000, "") - }); - mDatabase.getMapper().stopAddingDocuments("1"); - - { - final Cursor cursor = mDatabase.queryRootDocuments(COLUMN_NAMES); - assertEquals(1, cursor.getCount()); - - cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); - assertEquals(1, getInt(cursor, COLUMN_STORAGE_ID)); - assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals( - DocumentsContract.Document.MIME_TYPE_DIR, getString(cursor, COLUMN_MIME_TYPE)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - assertTrue(isNull(cursor, COLUMN_SUMMARY)); - assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED)); - assertEquals(R.drawable.ic_root_mtp, getInt(cursor, COLUMN_ICON)); - assertEquals(Document.FLAG_DIR_SUPPORTS_CREATE, getInt(cursor, COLUMN_FLAGS)); - assertEquals(1000, getInt(cursor, COLUMN_SIZE)); - assertEquals( - MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE, - getInt(cursor, COLUMN_DOCUMENT_TYPE)); - - cursor.close(); - } - - { - final Cursor cursor = mDatabase.queryRoots(resources, new String [] { - Root.COLUMN_ROOT_ID, - Root.COLUMN_FLAGS, - Root.COLUMN_ICON, - Root.COLUMN_TITLE, - Root.COLUMN_SUMMARY, - Root.COLUMN_DOCUMENT_ID, - Root.COLUMN_AVAILABLE_BYTES, - Root.COLUMN_CAPACITY_BYTES - }); - assertEquals(1, cursor.getCount()); - - cursor.moveToNext(); - assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID)); - assertEquals( - Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY, - getInt(cursor, Root.COLUMN_FLAGS)); - assertEquals(R.drawable.ic_root_mtp, getInt(cursor, Root.COLUMN_ICON)); - assertEquals("Device Storage", getString(cursor, Root.COLUMN_TITLE)); - assertTrue(isNull(cursor, Root.COLUMN_SUMMARY)); - assertEquals(1, getInt(cursor, Root.COLUMN_DOCUMENT_ID)); - assertEquals(1000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES)); - assertEquals(2000, getInt(cursor, Root.COLUMN_CAPACITY_BYTES)); - - cursor.close(); - } - } - - public void testPutStorageDocuments() throws Exception { - addTestDevice(); - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 1, "Storage", 1000, 2000, ""), - new MtpRoot(0, 2, "Storage", 2000, 4000, ""), - new MtpRoot(0, 3, "/@#%&<>Storage", 3000, 6000,"") - }); - - { - final Cursor cursor = mDatabase.queryRootDocuments(COLUMN_NAMES); - assertEquals(3, cursor.getCount()); - - cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); - assertEquals(1, getInt(cursor, COLUMN_STORAGE_ID)); - assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals(DocumentsContract.Document.MIME_TYPE_DIR, getString(cursor, COLUMN_MIME_TYPE)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - assertTrue(isNull(cursor, COLUMN_SUMMARY)); - assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED)); - assertEquals(R.drawable.ic_root_mtp, getInt(cursor, COLUMN_ICON)); - assertEquals(Document.FLAG_DIR_SUPPORTS_CREATE, getInt(cursor, COLUMN_FLAGS)); - assertEquals(1000, getInt(cursor, COLUMN_SIZE)); - assertEquals( - MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE, getInt(cursor, COLUMN_DOCUMENT_TYPE)); - - cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - - cursor.moveToNext(); - assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals("/@#%&<>Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - - cursor.close(); - } - } - - private MtpObjectInfo createDocument(int objectHandle, String name, int format, int size) { - final MtpObjectInfo.Builder builder = new MtpObjectInfo.Builder(); - builder.setObjectHandle(objectHandle); - builder.setName(name); - builder.setFormat(format); - builder.setCompressedSize(size); - return builder.build(); - } - - public void testPutChildDocuments() throws Exception { - addTestDevice(); - addTestStorage("1"); - - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024), - createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024) - }, new long[] { 1024L, 2L * 1024L * 1024L, 3L * 1024L * 1024L}); - - final Cursor cursor = mDatabase.queryChildDocuments(COLUMN_NAMES, "2"); - assertEquals(3, cursor.getCount()); - - cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); - assertEquals(0, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals(100, getInt(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals("text/plain", getString(cursor, COLUMN_MIME_TYPE)); - assertEquals("note.txt", getString(cursor, COLUMN_DISPLAY_NAME)); - assertTrue(isNull(cursor, COLUMN_SUMMARY)); - assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED)); - assertTrue(isNull(cursor, COLUMN_ICON)); - assertEquals( - COLUMN_FLAGS, - DocumentsContract.Document.FLAG_SUPPORTS_DELETE | - DocumentsContract.Document.FLAG_SUPPORTS_WRITE, - cursor.getInt(9)); - assertEquals(1024, getInt(cursor, COLUMN_SIZE)); - assertEquals( - MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT, getInt(cursor, COLUMN_DOCUMENT_TYPE)); - - cursor.moveToNext(); - assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); - assertEquals(0, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals(101, getInt(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals("image/jpeg", getString(cursor, COLUMN_MIME_TYPE)); - assertEquals("image.jpg", getString(cursor, COLUMN_DISPLAY_NAME)); - assertTrue(isNull(cursor, COLUMN_SUMMARY)); - assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED)); - assertTrue(isNull(cursor, COLUMN_ICON)); - assertEquals( - COLUMN_FLAGS, - DocumentsContract.Document.FLAG_SUPPORTS_DELETE | - DocumentsContract.Document.FLAG_SUPPORTS_WRITE | - DocumentsContract.Document.FLAG_SUPPORTS_METADATA, - cursor.getInt(9)); - assertEquals(2 * 1024 * 1024, getInt(cursor, COLUMN_SIZE)); - assertEquals( - MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT, getInt(cursor, COLUMN_DOCUMENT_TYPE)); - - cursor.moveToNext(); - assertEquals(5, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID)); - assertEquals(0, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals(102, getInt(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals("audio/mpeg", getString(cursor, COLUMN_MIME_TYPE)); - assertEquals("music.mp3", getString(cursor, COLUMN_DISPLAY_NAME)); - assertTrue(isNull(cursor, COLUMN_SUMMARY)); - assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED)); - assertTrue(isNull(cursor, COLUMN_ICON)); - assertEquals( - COLUMN_FLAGS, - DocumentsContract.Document.FLAG_SUPPORTS_DELETE | - DocumentsContract.Document.FLAG_SUPPORTS_WRITE, - cursor.getInt(9)); - assertEquals(3 * 1024 * 1024, getInt(cursor, COLUMN_SIZE)); - assertEquals( - MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT, getInt(cursor, COLUMN_DOCUMENT_TYPE)); - - cursor.close(); - } - - public void testPutChildDocuments_operationsSupported() throws Exception { - addTestDevice(); - addTestStorage("1"); - - // Put a document with empty supported operations. - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", new int[0], new MtpObjectInfo[] { - createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024) - }, new long[] { 1024L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - try (final Cursor cursor = - mDatabase.queryChildDocuments(strings(Document.COLUMN_FLAGS), "2")) { - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(0, cursor.getInt(0)); - } - - // Put a document with writable operations. - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", new int[] { - MtpConstants.OPERATION_SEND_OBJECT, - MtpConstants.OPERATION_SEND_OBJECT_INFO, - }, new MtpObjectInfo[] { - createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024) - }, new long[] { 1024L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - try (final Cursor cursor = - mDatabase.queryChildDocuments(strings(Document.COLUMN_FLAGS), "2")) { - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(Document.FLAG_SUPPORTS_WRITE, cursor.getInt(0)); - } - - // Put a document with deletable operations. - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", new int[] { - MtpConstants.OPERATION_DELETE_OBJECT - }, new MtpObjectInfo[] { - createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024) - }, new long[] { 1024L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - try (final Cursor cursor = - mDatabase.queryChildDocuments(strings(Document.COLUMN_FLAGS), "2")) { - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(Document.FLAG_SUPPORTS_DELETE, cursor.getInt(0)); - } - } - - public void testRestoreIdForRootDocuments() throws Exception { - final String[] columns = new String[] { - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - MtpDatabaseConstants.COLUMN_STORAGE_ID, - DocumentsContract.Document.COLUMN_DISPLAY_NAME - }; - - // Add device and two storages. - addTestDevice(); - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 1000, 0, ""), - new MtpRoot(0, 101, "Storage B", 1001, 0, "") - }); - - { - final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(2, cursor.getCount()); - cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(100, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage A", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(101, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage B", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.close(); - } - - // Clear mapping and add a device. - mDatabase.getMapper().clearMapping(); - addTestDevice(); - - { - final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(0, cursor.getCount()); - cursor.close(); - } - - // Add two storages, but one's name is different from previous one. - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 200, "Storage A", 2000, 0, ""), - new MtpRoot(0, 202, "Storage C", 2002, 0, "") - }); - mDatabase.getMapper().stopAddingDocuments("1"); - - { - // After compeleting mapping, Storage A can be obtained with new storage ID. - final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(2, cursor.getCount()); - cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(200, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage A", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.moveToNext(); - assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(202, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage C", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.close(); - } - } - - public void testRestoreIdForChildDocuments() throws Exception { - final String[] columns = new String[] { - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - MtpDatabaseConstants.COLUMN_OBJECT_HANDLE, - DocumentsContract.Document.COLUMN_DISPLAY_NAME - }; - - addTestDevice(); - addTestStorage("1"); - - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024), - createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024) - }, new long[] { 1024L, 2L * 1024L * 1024L, 3L * 1024L * 1024L}); - mDatabase.getMapper().clearMapping(); - - addTestDevice(); - addTestStorage("1"); - - { - // Don't return objects that lost MTP object handles. - final Cursor cursor = mDatabase.queryChildDocuments(columns, "2"); - assertEquals(0, cursor.getCount()); - cursor.close(); - } - - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - createDocument(203, "video.mp4", MtpConstants.FORMAT_MP4_CONTAINER, 1024), - }, new long[] { 1024L, 1024L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - { - final Cursor cursor = mDatabase.queryChildDocuments(columns, "2"); - assertEquals(2, cursor.getCount()); - - cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(200, getInt(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals("note.txt", getString(cursor, COLUMN_DISPLAY_NAME)); - - cursor.moveToNext(); - assertEquals(6, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(203, getInt(cursor, COLUMN_OBJECT_HANDLE)); - assertEquals("video.mp4", getString(cursor, COLUMN_DISPLAY_NAME)); - - cursor.close(); - } - } - - public void testRestoreIdForDifferentDevices() throws Exception { - final String[] columns = new String[] { - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - MtpDatabaseConstants.COLUMN_STORAGE_ID, - DocumentsContract.Document.COLUMN_DISPLAY_NAME - }; - final String[] rootColumns = new String[] { - Root.COLUMN_ROOT_ID, - Root.COLUMN_AVAILABLE_BYTES - }; - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device A", "Device key A", true, new MtpRoot[0], null, null)); - mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 1, "Device B", "Device key B", true, new MtpRoot[0], null, null)); - mDatabase.getMapper().stopAddingDocuments(null); - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage", 0, 0, "") - }); - mDatabase.getMapper().putStorageDocuments("2", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(1, 100, "Storage", 0, 0, "") - }); - - { - final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(2, cursor.getCount()); - cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(100, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.moveToNext(); - assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(100, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.close(); - } - - { - final Cursor cursor = mDatabase.queryRoots(resources, rootColumns); - assertEquals(2, cursor.getCount()); - cursor.moveToNext(); - assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID)); - assertEquals(0, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES)); - cursor.moveToNext(); - assertEquals(2, getInt(cursor, Root.COLUMN_ROOT_ID)); - assertEquals(0, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES)); - cursor.close(); - } - - mDatabase.getMapper().clearMapping(); - - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device A", "Device key A", true, new MtpRoot[0], null, null)); - mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 1, "Device B", "Device key B", true, new MtpRoot[0], null, null)); - mDatabase.getMapper().stopAddingDocuments(null); - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 200, "Storage", 2000, 0, "") - }); - mDatabase.getMapper().putStorageDocuments("2", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(1, 300, "Storage", 3000, 0, "") - }); - mDatabase.getMapper().stopAddingDocuments("1"); - mDatabase.getMapper().stopAddingDocuments("2"); - - { - final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(2, cursor.getCount()); - cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(200, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.moveToNext(); - assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(300, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.close(); - } - - { - final Cursor cursor = mDatabase.queryRoots(resources, rootColumns); - assertEquals(2, cursor.getCount()); - cursor.moveToNext(); - assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID)); - assertEquals(2000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES)); - cursor.moveToNext(); - assertEquals(2, getInt(cursor, Root.COLUMN_ROOT_ID)); - assertEquals(3000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES)); - cursor.close(); - } - } - - public void testRestoreIdForDifferentParents() throws Exception { - final String[] columns = new String[] { - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - MtpDatabaseConstants.COLUMN_OBJECT_HANDLE - }; - - // Add device, storage, and two directories. - addTestDevice(); - addTestStorage("1"); - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(50, "A", MtpConstants.FORMAT_ASSOCIATION, 0), - createDocument(51, "B", MtpConstants.FORMAT_ASSOCIATION, 0), - }, new long[] { 0L, 0L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - // Put note.txt in each directory. - mDatabase.getMapper().startAddingDocuments("3"); - mDatabase.getMapper().startAddingDocuments("4"); - mDatabase.getMapper().putChildDocuments(0, "3", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - }, new long[] { 1024L }); - mDatabase.getMapper().putChildDocuments(0, "4", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(101, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - }, new long[] { 1024L }); - - // Clear mapping. - mDatabase.getMapper().clearMapping(); - - // Add device, storage, and two directories again. - addTestDevice(); - addTestStorage("1"); - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(50, "A", MtpConstants.FORMAT_ASSOCIATION, 0), - createDocument(51, "B", MtpConstants.FORMAT_ASSOCIATION, 0), - }, new long[] { 0L, 0L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - // Add note.txt in each directory again. - mDatabase.getMapper().startAddingDocuments("3"); - mDatabase.getMapper().startAddingDocuments("4"); - mDatabase.getMapper().putChildDocuments(0, "3", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - }, new long[] { 1024L }); - mDatabase.getMapper().putChildDocuments(0, "4", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(201, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - }, new long[] { 1024L }); - mDatabase.getMapper().stopAddingDocuments("3"); - mDatabase.getMapper().stopAddingDocuments("4"); - - // Check if the two note.txt are mapped correctly. - { - final Cursor cursor = mDatabase.queryChildDocuments(columns, "3"); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(5, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(200, getInt(cursor, COLUMN_OBJECT_HANDLE)); - cursor.close(); - } - { - final Cursor cursor = mDatabase.queryChildDocuments(columns, "4"); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(6, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(201, getInt(cursor, COLUMN_OBJECT_HANDLE)); - cursor.close(); - } - } - - public void testClearMtpIdentifierBeforeResolveRootDocuments() throws Exception { - final String[] columns = new String[] { - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - MtpDatabaseConstants.COLUMN_STORAGE_ID, - DocumentsContract.Document.COLUMN_DISPLAY_NAME - }; - final String[] rootColumns = new String[] { - Root.COLUMN_ROOT_ID, - Root.COLUMN_AVAILABLE_BYTES - }; - - addTestDevice(); - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage", 0, 0, ""), - }); - mDatabase.getMapper().clearMapping(); - - addTestDevice(); - - try (final Cursor cursor = mDatabase.queryRoots(resources, rootColumns)) { - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals("1", getString(cursor, Root.COLUMN_ROOT_ID)); - } - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 200, "Storage", 2000, 0, ""), - }); - mDatabase.getMapper().clearMapping(); - - addTestDevice(); - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 300, "Storage", 3000, 0, ""), - }); - mDatabase.getMapper().stopAddingDocuments("1"); - - { - final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(300, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.close(); - } - { - final Cursor cursor = mDatabase.queryRoots(resources, rootColumns); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID)); - assertEquals(3000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES)); - cursor.close(); - } - } - - public void testPutSameNameRootsAfterClearing() throws Exception { - final String[] columns = new String[] { - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - MtpDatabaseConstants.COLUMN_STORAGE_ID, - DocumentsContract.Document.COLUMN_DISPLAY_NAME - }; - - // Add a device and a storage. - addTestDevice(); - addTestStorage("1"); - - // Disconnect devices. - mDatabase.getMapper().clearMapping(); - - // Add a device and two storages that has same name. - addTestDevice(); - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 200, "Storage", 2000, 0, ""), - new MtpRoot(0, 201, "Storage", 2001, 0, ""), - }); - mDatabase.getMapper().stopAddingDocuments("1"); - - { - final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(2, cursor.getCount()); - - // First storage reuse document ID of previous storage. - cursor.moveToNext(); - // One reuses exisitng document ID 1. - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(200, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - - // Second one has new document ID. - cursor.moveToNext(); - assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(201, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME)); - - cursor.close(); - } - } - - public void testReplaceExistingRoots() throws Exception { - addTestDevice(); - - // The client code should be able to replace existing rows with new information. - // Add one. - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 0, 0, ""), - }); - mDatabase.getMapper().stopAddingDocuments("1"); - // Replace it. - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage B", 1000, 1000, ""), - }); - mDatabase.getMapper().stopAddingDocuments("1"); - { - final String[] columns = new String[] { - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - MtpDatabaseConstants.COLUMN_STORAGE_ID, - DocumentsContract.Document.COLUMN_DISPLAY_NAME - }; - final Cursor cursor = mDatabase.queryRootDocuments(columns); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID)); - assertEquals(100, getInt(cursor, COLUMN_STORAGE_ID)); - assertEquals("Storage B", getString(cursor, COLUMN_DISPLAY_NAME)); - cursor.close(); - } - { - final String[] columns = new String[] { - Root.COLUMN_ROOT_ID, - Root.COLUMN_TITLE, - Root.COLUMN_AVAILABLE_BYTES - }; - final Cursor cursor = mDatabase.queryRoots(resources, columns); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID)); - assertEquals("Device Storage B", getString(cursor, Root.COLUMN_TITLE)); - assertEquals(1000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES)); - cursor.close(); - } - } - - public void testFailToReplaceExisitingUnmappedRoots() throws Exception { - // The client code should not be able to replace rows before resolving 'unmapped' rows. - // Add one. - addTestDevice(); - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 0, 0, ""), - }); - mDatabase.getMapper().clearMapping(); - - addTestDevice(); - try (final Cursor oldCursor = - mDatabase.queryRoots(resources, strings(Root.COLUMN_ROOT_ID))) { - assertEquals(1, oldCursor.getCount()); - oldCursor.moveToNext(); - assertEquals("1", getString(oldCursor, Root.COLUMN_ROOT_ID)); - - // Add one. - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 101, "Storage B", 1000, 1000, ""), - }); - // Add one more before resolving unmapped documents. - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 102, "Storage B", 1000, 1000, ""), - }); - mDatabase.getMapper().stopAddingDocuments("1"); - - // Because the roots shares the same name, the roots should have new IDs. - try (final Cursor newCursor = mDatabase.queryChildDocuments( - strings(Document.COLUMN_DOCUMENT_ID), "1")) { - assertEquals(2, newCursor.getCount()); - newCursor.moveToNext(); - assertFalse(oldCursor.getString(0).equals(newCursor.getString(0))); - newCursor.moveToNext(); - assertFalse(oldCursor.getString(0).equals(newCursor.getString(0))); - } - } - } - - public void testQueryDocuments() throws Exception { - addTestDevice(); - addTestStorage("1"); - - final Cursor cursor = mDatabase.queryDocument("2", strings(Document.COLUMN_DISPLAY_NAME)); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals("Storage", getString(cursor, Document.COLUMN_DISPLAY_NAME)); - cursor.close(); - } - - public void testQueryRoots() throws Exception { - // Add device document. - addTestDevice(); - - // It the device does not have storages, it shows a device root. - { - final Cursor cursor = mDatabase.queryRoots(resources, strings(Root.COLUMN_TITLE)); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals("Device", cursor.getString(0)); - cursor.close(); - } - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 0, 0, "") - }); - mDatabase.getMapper().stopAddingDocuments("1"); - - // It the device has single storage, it shows a storage root. - { - final Cursor cursor = mDatabase.queryRoots(resources, strings(Root.COLUMN_TITLE)); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals("Device Storage A", cursor.getString(0)); - cursor.close(); - } - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 0, 0, ""), - new MtpRoot(0, 101, "Storage B", 0, 0, "") - }); - mDatabase.getMapper().stopAddingDocuments("1"); - - // It the device has multiple storages, it shows a device root. - { - final Cursor cursor = mDatabase.queryRoots(resources, strings(Root.COLUMN_TITLE)); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals("Device", cursor.getString(0)); - cursor.close(); - } - } - - public void testGetParentId() throws FileNotFoundException { - addTestDevice(); - - mDatabase.getMapper().startAddingDocuments("1"); - mDatabase.getMapper().putStorageDocuments("1", OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 0, 0, ""), - }); - mDatabase.getMapper().stopAddingDocuments("1"); - - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - }, new long[] { 1024L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - assertEquals("2", mDatabase.getParentIdentifier("3").mDocumentId); - } - - public void testDeleteDocument() throws Exception { - addTestDevice(); - addTestStorage("1"); - - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(200, "dir", MtpConstants.FORMAT_ASSOCIATION, 1024), - }, new long[] { 1024L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - mDatabase.getMapper().startAddingDocuments("3"); - mDatabase.getMapper().putChildDocuments(0, "3", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - }, new long[] { 1024L }); - mDatabase.getMapper().stopAddingDocuments("3"); - - mDatabase.deleteDocument("3"); - - { - // Do not query deleted documents. - final Cursor cursor = - mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "2"); - assertEquals(0, cursor.getCount()); - cursor.close(); - } - - { - // Child document should be deleted also. - final Cursor cursor = - mDatabase.queryDocument("4", strings(Document.COLUMN_DOCUMENT_ID)); - assertEquals(0, cursor.getCount()); - cursor.close(); - } - } - - public void testPutNewDocument() throws Exception { - addTestDevice(); - addTestStorage("1"); - - assertEquals( - "3", - mDatabase.putNewDocument( - 0, "2", OPERATIONS_SUPPORTED, - createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - 1024L)); - - { - final Cursor cursor = - mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "2"); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals("3", cursor.getString(0)); - cursor.close(); - } - - // The new document should not be mapped with existing invalidated document. - mDatabase.getMapper().clearMapping(); - addTestDevice(); - addTestStorage("1"); - - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.putNewDocument( - 0, "2", OPERATIONS_SUPPORTED, - createDocument(201, "note.txt", MtpConstants.FORMAT_TEXT, 1024), - 1024L); - mDatabase.getMapper().stopAddingDocuments("2"); - - { - final Cursor cursor = - mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "2"); - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals("4", cursor.getString(0)); - cursor.close(); - } - } - - public void testGetDocumentIdForDevice() throws Exception { - addTestDevice(); - assertEquals("1", mDatabase.getDocumentIdForDevice(0)); - } - - public void testGetClosedDevice() throws Exception { - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device", null /* deviceKey */, /* opened is */ false, new MtpRoot[0], null, - null)); - mDatabase.getMapper().stopAddingDocuments(null); - - final String[] columns = new String [] { - DocumentsContract.Root.COLUMN_ROOT_ID, - DocumentsContract.Root.COLUMN_TITLE, - DocumentsContract.Root.COLUMN_AVAILABLE_BYTES - }; - try (final Cursor cursor = mDatabase.queryRoots(resources, columns)) { - assertEquals(1, cursor.getCount()); - assertTrue(cursor.moveToNext()); - assertEquals(1, cursor.getLong(0)); - assertEquals("Device", cursor.getString(1)); - assertTrue(cursor.isNull(2)); - } - } - - public void testMappingWithoutKey() throws FileNotFoundException { - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device", null /* device key */, /* opened is */ true, new MtpRoot[0], null, - null)); - mDatabase.getMapper().stopAddingDocuments(null); - - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device", null /* device key */, /* opened is */ true, new MtpRoot[0], null, - null)); - mDatabase.getMapper().stopAddingDocuments(null); - - try (final Cursor cursor = - mDatabase.queryRoots(resources, strings(DocumentsContract.Root.COLUMN_ROOT_ID))) { - assertEquals(1, cursor.getCount()); - assertTrue(cursor.moveToNext()); - assertEquals(1, cursor.getLong(0)); - } - } - - public void testMappingFailsWithoutKey() throws FileNotFoundException { - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device", null /* device key */, /* opened is */ true, new MtpRoot[0], null, - null)); - mDatabase.getMapper().stopAddingDocuments(null); - - // MTP identifier is cleared here. Mapping no longer works without device key. - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().stopAddingDocuments(null); - - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device", null /* device key */, /* opened is */ true, new MtpRoot[0], null, - null)); - mDatabase.getMapper().stopAddingDocuments(null); - - try (final Cursor cursor = - mDatabase.queryRoots(resources, strings(DocumentsContract.Root.COLUMN_ROOT_ID))) { - assertEquals(1, cursor.getCount()); - assertTrue(cursor.moveToNext()); - assertEquals(2, cursor.getLong(0)); - } - } - - public void testUpdateDocumentWithoutChange() throws FileNotFoundException { - mDatabase.getMapper().startAddingDocuments(null); - assertTrue(mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device", "device_key", /* opened is */ true, new MtpRoot[0], null, - null))); - assertFalse(mDatabase.getMapper().stopAddingDocuments(null)); - - mDatabase.getMapper().startAddingDocuments(null); - assertFalse(mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device", "device_key", /* opened is */ true, new MtpRoot[0], null, - null))); - assertFalse(mDatabase.getMapper().stopAddingDocuments(null)); - } - - public void testSetBootCount() { - assertEquals(0, mDatabase.getLastBootCount()); - mDatabase.setLastBootCount(10); - assertEquals(10, mDatabase.getLastBootCount()); - try { - mDatabase.setLastBootCount(-1); - fail(); - } catch (IllegalArgumentException e) {} - } - - public void testCleanDatabase() throws FileNotFoundException { - // Add tree. - addTestDevice(); - addTestStorage("1"); - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(100, "apple.txt", MtpConstants.FORMAT_TEXT, 1024), - createDocument(101, "orange.txt", MtpConstants.FORMAT_TEXT, 1024), - }, new long[] { 1024L, 1024L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - // Disconnect the device. - mDatabase.getMapper().startAddingDocuments(null); - mDatabase.getMapper().stopAddingDocuments(null); - - // Clean database. - mDatabase.cleanDatabase(new Uri[] { - DocumentsContract.buildDocumentUri(MtpDocumentsProvider.AUTHORITY, "3") - }); - - // Add tree again. - addTestDevice(); - addTestStorage("1"); - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(100, "apple.txt", MtpConstants.FORMAT_TEXT, 1024), - createDocument(101, "orange.txt", MtpConstants.FORMAT_TEXT, 1024), - }, new long[] { 1024L, 1024L }); - mDatabase.getMapper().stopAddingDocuments("2"); - - try (final Cursor cursor = mDatabase.queryChildDocuments( - strings(COLUMN_DOCUMENT_ID, Document.COLUMN_DISPLAY_NAME), "2")) { - assertEquals(2, cursor.getCount()); - - // Persistent uri uses the same ID. - cursor.moveToNext(); - assertEquals("3", cursor.getString(0)); - assertEquals("apple.txt", cursor.getString(1)); - - // Others does not. - cursor.moveToNext(); - assertEquals("5", cursor.getString(0)); - assertEquals("orange.txt", cursor.getString(1)); - } - } - - public void testFormatCodeForMpeg() throws FileNotFoundException { - addTestDevice(); - addTestStorage("1"); - mDatabase.getMapper().startAddingDocuments("2"); - mDatabase.getMapper().putChildDocuments(0, "2", OPERATIONS_SUPPORTED, new MtpObjectInfo[] { - createDocument(100, "audio.m4a", MtpConstants.FORMAT_MPEG, 1000), - createDocument(101, "video.m4v", MtpConstants.FORMAT_MPEG, 1000), - createDocument(102, "unknown.mp4", MtpConstants.FORMAT_MPEG, 1000), - createDocument(103, "inconsistent.txt", MtpConstants.FORMAT_MPEG, 1000), - createDocument(104, "noext", MtpConstants.FORMAT_UNDEFINED, 1000), - }, new long[] { 1000L, 1000L, 1000L, 1000L, 1000L }); - mDatabase.getMapper().stopAddingDocuments("2"); - try (final Cursor cursor = mDatabase.queryChildDocuments( - strings(COLUMN_DISPLAY_NAME, COLUMN_MIME_TYPE), - "2")) { - assertEquals(5, cursor.getCount()); - cursor.moveToNext(); - assertEquals("audio.m4a", cursor.getString(0)); - assertEquals("audio/mp4", cursor.getString(1)); - cursor.moveToNext(); - assertEquals("video.m4v", cursor.getString(0)); - assertEquals("video/mp4", cursor.getString(1)); - cursor.moveToNext(); - // Assume that the file is video as we don't have any hints to find out if the file is - // video or audio. - assertEquals("unknown.mp4", cursor.getString(0)); - assertEquals("video/mp4", cursor.getString(1)); - // Don't return mime type that is inconsistent with format code. - cursor.moveToNext(); - assertEquals("inconsistent.txt", cursor.getString(0)); - assertEquals("video/mpeg", cursor.getString(1)); - cursor.moveToNext(); - assertEquals("noext", cursor.getString(0)); - assertEquals("application/octet-stream", cursor.getString(1)); - } - } - - private void addTestDevice() throws FileNotFoundException { - TestUtil.addTestDevice(mDatabase); - } - - private void addTestStorage(String parentId) throws FileNotFoundException { - TestUtil.addTestStorage(mDatabase, parentId); - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java deleted file mode 100644 index 65c86dfb6d4c..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ /dev/null @@ -1,1040 +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.mtp; - -import android.database.Cursor; -import android.mtp.MtpConstants; -import android.mtp.MtpObjectInfo; -import android.net.Uri; -import android.os.ParcelFileDescriptor; -import android.os.storage.StorageManager; -import android.provider.DocumentsContract.Document; -import android.provider.DocumentsContract.Path; -import android.provider.DocumentsContract.Root; -import android.system.Os; -import android.system.OsConstants; -import android.provider.DocumentsContract; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.Queue; -import java.util.concurrent.TimeoutException; - -import static com.android.mtp.MtpDatabase.strings; -import static com.android.mtp.TestUtil.OPERATIONS_SUPPORTED; - -@MediumTest -public class MtpDocumentsProviderTest extends AndroidTestCase { - private final static Uri ROOTS_URI = - DocumentsContract.buildRootsUri(MtpDocumentsProvider.AUTHORITY); - private TestContentResolver mResolver; - private MtpDocumentsProvider mProvider; - private TestMtpManager mMtpManager; - private final TestResources mResources = new TestResources(); - private MtpDatabase mDatabase; - - @Override - public void setUp() throws IOException { - mResolver = new TestContentResolver(); - mMtpManager = new TestMtpManager(getContext()); - } - - @Override - public void tearDown() { - mProvider.shutdown(); - MtpDatabase.deleteDatabase(getContext()); - } - - public void testOpenAndCloseDevice() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, - "Device A", - null /* deviceKey */, - false /* unopened */, - new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 2048 /* total space */, - "" /* no volume identifier */) - }, - OPERATIONS_SUPPORTED, - null)); - - mProvider.resumeRootScanner(); - mResolver.waitForNotification(ROOTS_URI, 1); - - mProvider.openDevice(0); - mResolver.waitForNotification(ROOTS_URI, 2); - - mProvider.closeDevice(0); - mResolver.waitForNotification(ROOTS_URI, 3); - } - - public void testOpenAndCloseErrorDevice() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - try { - mProvider.openDevice(1); - fail(); - } catch (Throwable error) { - assertTrue(error instanceof IOException); - } - assertEquals(0, mProvider.getOpenedDeviceRecordsCache().length); - - // Check if the following notification is the first one or not. - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, - "Device A", - null /* deviceKey */, - false /* unopened */, - new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 2048 /* total space */, - "" /* no volume identifier */) - }, - OPERATIONS_SUPPORTED, - null)); - mProvider.resumeRootScanner(); - mResolver.waitForNotification(ROOTS_URI, 1); - mProvider.openDevice(0); - mResolver.waitForNotification(ROOTS_URI, 2); - } - - public void testOpenDeviceOnDemand() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, - "Device A", - null /* deviceKey */, - false /* unopened */, - new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 2048 /* total space */, - "" /* no volume identifier */) - }, - OPERATIONS_SUPPORTED, - null)); - mMtpManager.setObjectHandles(0, 1, -1, new int[0]); - mProvider.resumeRootScanner(); - mResolver.waitForNotification(ROOTS_URI, 1); - final String[] columns = new String[] { - DocumentsContract.Root.COLUMN_TITLE, - DocumentsContract.Root.COLUMN_DOCUMENT_ID - }; - try (final Cursor cursor = mProvider.queryRoots(columns)) { - assertEquals(1, cursor.getCount()); - assertTrue(cursor.moveToNext()); - assertEquals("Device A", cursor.getString(0)); - assertEquals(1, cursor.getLong(1)); - } - { - final MtpDeviceRecord[] openedDevice = mProvider.getOpenedDeviceRecordsCache(); - assertEquals(0, openedDevice.length); - } - // Device is opened automatically when querying its children. - try (final Cursor cursor = mProvider.queryChildDocuments("1", null, (String) null)) {} - - { - final MtpDeviceRecord[] openedDevice = mProvider.getOpenedDeviceRecordsCache(); - assertEquals(1, openedDevice.length); - assertEquals(0, openedDevice[0].deviceId); - } - } - - public void testQueryRoots() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, - "Device A", - "Device key A", - false /* unopened */, - new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 2048 /* total space */, - "" /* no volume identifier */) - }, - OPERATIONS_SUPPORTED, - null)); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 1, - "Device B", - "Device key B", - false /* unopened */, - new MtpRoot[] { - new MtpRoot( - 1 /* deviceId */, - 1 /* storageId */, - "Storage B" /* volume description */, - 2048 /* free space */, - 4096 /* total space */, - "Identifier B" /* no volume identifier */) - }, - new int[0] /* No operations supported */, - null)); - - { - mProvider.openDevice(0); - mResolver.waitForNotification(ROOTS_URI, 1); - final Cursor cursor = mProvider.queryRoots(null); - assertEquals(2, cursor.getCount()); - cursor.moveToNext(); - assertEquals("1", cursor.getString(0)); - assertEquals( - Root.FLAG_SUPPORTS_IS_CHILD | - Root.FLAG_SUPPORTS_CREATE | - Root.FLAG_LOCAL_ONLY, - cursor.getInt(1)); - assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); - assertEquals("Device A Storage A", cursor.getString(3)); - assertEquals("1", cursor.getString(4)); - assertEquals(1024, cursor.getInt(5)); - } - - { - mProvider.openDevice(1); - mResolver.waitForNotification(ROOTS_URI, 2); - final Cursor cursor = mProvider.queryRoots(null); - assertEquals(2, cursor.getCount()); - cursor.moveToNext(); - cursor.moveToNext(); - assertEquals("2", cursor.getString(0)); - assertEquals( - Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_LOCAL_ONLY, cursor.getInt(1)); - assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); - assertEquals("Device B Storage B", cursor.getString(3)); - assertEquals("2", cursor.getString(4)); - assertEquals(2048, cursor.getInt(5)); - } - } - - public void testQueryRoots_error() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, - "Device A", - "Device key A", - false /* unopened */, - new MtpRoot[0], - OPERATIONS_SUPPORTED, - null)); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 1, - "Device B", - "Device key B", - false /* unopened */, - new MtpRoot[] { - new MtpRoot( - 1 /* deviceId */, - 1 /* storageId */, - "Storage B" /* volume description */, - 2048 /* free space */, - 4096 /* total space */, - "Identifier B" /* no volume identifier */) - }, - OPERATIONS_SUPPORTED, - null)); - { - mProvider.openDevice(0); - mResolver.waitForNotification(ROOTS_URI, 1); - - mProvider.openDevice(1); - mResolver.waitForNotification(ROOTS_URI, 2); - - final Cursor cursor = mProvider.queryRoots(null); - assertEquals(2, cursor.getCount()); - - cursor.moveToNext(); - assertEquals("1", cursor.getString(0)); - assertEquals( - Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY, - cursor.getInt(1)); - assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); - assertEquals("Device A", cursor.getString(3)); - assertEquals("1", cursor.getString(4)); - assertEquals(0, cursor.getInt(5)); - - cursor.moveToNext(); - assertEquals("2", cursor.getString(0)); - assertEquals( - Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY, - cursor.getInt(1)); - assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); - assertEquals("Device B Storage B", cursor.getString(3)); - assertEquals("2", cursor.getString(4)); - assertEquals(2048, cursor.getInt(5)); - } - } - - public void testQueryDocument() throws IOException, InterruptedException, TimeoutException { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); - setupDocuments( - 0, - 0, - MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, - "1", - new MtpObjectInfo[] { - new MtpObjectInfo.Builder() - .setObjectHandle(100) - .setFormat(MtpConstants.FORMAT_EXIF_JPEG) - .setName("image.jpg") - .setDateModified(1422716400000L) - .setCompressedSize(1024 * 1024 * 5) - .setThumbCompressedSize(50 * 1024) - .build() - }); - - final Cursor cursor = mProvider.queryDocument("3", null); - assertEquals(1, cursor.getCount()); - - cursor.moveToNext(); - - assertEquals("3", cursor.getString(0)); - assertEquals("image/jpeg", cursor.getString(1)); - assertEquals("image.jpg", cursor.getString(2)); - assertEquals(1422716400000L, cursor.getLong(3)); - assertEquals( - DocumentsContract.Document.FLAG_SUPPORTS_DELETE | - DocumentsContract.Document.FLAG_SUPPORTS_WRITE | - DocumentsContract.Document.FLAG_SUPPORTS_THUMBNAIL | - DocumentsContract.Document.FLAG_SUPPORTS_METADATA, - cursor.getInt(4)); - assertEquals(1024 * 1024 * 5, cursor.getInt(5)); - } - - public void testQueryDocument_directory() - throws IOException, InterruptedException, TimeoutException { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); - setupDocuments( - 0, - 0, - MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, - "1", - new MtpObjectInfo[] { - new MtpObjectInfo.Builder() - .setObjectHandle(2) - .setStorageId(1) - .setFormat(MtpConstants.FORMAT_ASSOCIATION) - .setName("directory") - .setDateModified(1422716400000L) - .build() - }); - - final Cursor cursor = mProvider.queryDocument("3", null); - assertEquals(1, cursor.getCount()); - - cursor.moveToNext(); - assertEquals("3", cursor.getString(0)); - assertEquals(DocumentsContract.Document.MIME_TYPE_DIR, cursor.getString(1)); - assertEquals("directory", cursor.getString(2)); - assertEquals(1422716400000L, cursor.getLong(3)); - assertEquals( - DocumentsContract.Document.FLAG_SUPPORTS_DELETE | - DocumentsContract.Document.FLAG_DIR_SUPPORTS_CREATE, - cursor.getInt(4)); - assertEquals(0, cursor.getInt(5)); - } - - public void testQueryDocument_forStorage() - throws IOException, InterruptedException, TimeoutException { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 4096 /* total space */, - "" /* no volume identifier */) - }); - final Cursor cursor = mProvider.queryDocument("2", null); - assertEquals(1, cursor.getCount()); - - cursor.moveToNext(); - assertEquals("2", cursor.getString(0)); - assertEquals(DocumentsContract.Document.MIME_TYPE_DIR, cursor.getString(1)); - assertEquals("Storage A", cursor.getString(2)); - assertTrue(cursor.isNull(3)); - assertEquals(DocumentsContract.Document.FLAG_DIR_SUPPORTS_CREATE, cursor.getInt(4)); - assertEquals(3072, cursor.getInt(5)); - } - - public void testQueryDocument_forDeviceWithSingleStorage() - throws IOException, InterruptedException, TimeoutException { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 4096 /* total space */, - "" /* no volume identifier */) - }); - final Cursor cursor = mProvider.queryDocument("1", null); - assertEquals(1, cursor.getCount()); - - cursor.moveToNext(); - assertEquals("1", cursor.getString(0)); - assertEquals(DocumentsContract.Document.MIME_TYPE_DIR, cursor.getString(1)); - assertEquals("Device Storage A", cursor.getString(2)); - assertTrue(cursor.isNull(3)); - assertEquals(DocumentsContract.Document.FLAG_DIR_SUPPORTS_CREATE, cursor.getInt(4)); - assertTrue(cursor.isNull(5)); - } - - public void testQueryDocument_forDeviceWithTwoStorages() - throws IOException, InterruptedException, TimeoutException { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 4096 /* total space */, - "" /* no volume identifier */), - new MtpRoot( - 0 /* deviceId */, - 2 /* storageId */, - "Storage B" /* volume description */, - 1024 /* free space */, - 4096 /* total space */, - "" /* no volume identifier */) - }); - final Cursor cursor = mProvider.queryDocument("1", null); - assertEquals(1, cursor.getCount()); - - cursor.moveToNext(); - assertEquals("1", cursor.getString(0)); - assertEquals(DocumentsContract.Document.MIME_TYPE_DIR, cursor.getString(1)); - assertEquals("Device", cursor.getString(2)); - assertTrue(cursor.isNull(3)); - assertEquals(0, cursor.getInt(4)); - assertTrue(cursor.isNull(5)); - } - - public void testQueryChildDocuments() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); - setupDocuments( - 0, - 0, - MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, - "1", - new MtpObjectInfo[] { - new MtpObjectInfo.Builder() - .setObjectHandle(100) - .setFormat(MtpConstants.FORMAT_EXIF_JPEG) - .setName("image.jpg") - .setCompressedSize(1024 * 1024 * 5) - .setThumbCompressedSize(5 * 1024) - .setProtectionStatus(MtpConstants.PROTECTION_STATUS_READ_ONLY) - .build() - }); - - final Cursor cursor = mProvider.queryChildDocuments("1", null, (String) null); - assertEquals(1, cursor.getCount()); - - assertTrue(cursor.moveToNext()); - assertEquals("3", cursor.getString(0)); - assertEquals("image/jpeg", cursor.getString(1)); - assertEquals("image.jpg", cursor.getString(2)); - assertEquals(0, cursor.getLong(3)); - assertEquals(Document.FLAG_SUPPORTS_THUMBNAIL - | Document.FLAG_SUPPORTS_METADATA, cursor.getInt(4)); - assertEquals(1024 * 1024 * 5, cursor.getInt(5)); - - cursor.close(); - } - - public void testQueryChildDocuments_cursorError() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - try { - mProvider.queryChildDocuments("1", null, (String) null); - fail(); - } catch (FileNotFoundException error) {} - } - - public void testQueryChildDocuments_documentError() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); - mMtpManager.setObjectHandles(0, 0, -1, new int[] { 1 }); - try (final Cursor cursor = mProvider.queryChildDocuments("1", null, (String) null)) { - assertEquals(0, cursor.getCount()); - assertFalse(cursor.getExtras().getBoolean(DocumentsContract.EXTRA_LOADING)); - } - } - - public void testDeleteDocument() throws IOException, InterruptedException, TimeoutException { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 0, "Storage", 0, 0, "") - }); - setupDocuments(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, "1", new MtpObjectInfo[] { - new MtpObjectInfo.Builder() - .setName("test.txt") - .setObjectHandle(1) - .setParent(-1) - .build() - }); - - mProvider.deleteDocument("3"); - assertEquals(1, mResolver.getChangeCount( - DocumentsContract.buildChildDocumentsUri( - MtpDocumentsProvider.AUTHORITY, "1"))); - } - - public void testDeleteDocument_error() - throws IOException, InterruptedException, TimeoutException { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 0, "Storage", 0, 0, "") - }); - setupDocuments(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, "1", new MtpObjectInfo[] { - new MtpObjectInfo.Builder() - .setName("test.txt") - .setObjectHandle(1) - .setParent(-1) - .build() - }); - try { - mProvider.deleteDocument("4"); - fail(); - } catch (Throwable e) { - assertTrue(e instanceof IOException); - } - assertEquals(0, mResolver.getChangeCount( - DocumentsContract.buildChildDocumentsUri( - MtpDocumentsProvider.AUTHORITY, "1"))); - } - - public void testOpenDocument() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 0, "Storage", 0, 0, "") - }); - final byte[] bytes = "Hello world".getBytes(); - setupDocuments(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, "1", new MtpObjectInfo[] { - new MtpObjectInfo.Builder() - .setName("test.txt") - .setObjectHandle(1) - .setCompressedSize(bytes.length) - .setParent(-1) - .build() - }); - mMtpManager.setImportFileBytes(0, 1, bytes); - try (final ParcelFileDescriptor fd = mProvider.openDocument("3", "r", null)) { - final byte[] readBytes = new byte[5]; - assertEquals(6, Os.lseek(fd.getFileDescriptor(), 6, OsConstants.SEEK_SET)); - assertEquals(5, Os.read(fd.getFileDescriptor(), readBytes, 0, 5)); - assertTrue(Arrays.equals("world".getBytes(), readBytes)); - - assertEquals(0, Os.lseek(fd.getFileDescriptor(), 0, OsConstants.SEEK_SET)); - assertEquals(5, Os.read(fd.getFileDescriptor(), readBytes, 0, 5)); - assertTrue(Arrays.equals("Hello".getBytes(), readBytes)); - } - } - - public void testOpenDocument_shortBytes() throws Exception { - mMtpManager = new TestMtpManager(getContext()) { - @Override - MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException { - if (objectHandle == 1) { - return new MtpObjectInfo.Builder(super.getObjectInfo(deviceId, objectHandle)) - .setObjectHandle(1).setCompressedSize(1024 * 1024).build(); - } - - return super.getObjectInfo(deviceId, objectHandle); - } - }; - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 0, "Storage", 0, 0, "") - }); - final byte[] bytes = "Hello world".getBytes(); - setupDocuments(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, "1", new MtpObjectInfo[] { - new MtpObjectInfo.Builder() - .setName("test.txt") - .setObjectHandle(1) - .setCompressedSize(bytes.length) - .setParent(-1) - .build() - }); - mMtpManager.setImportFileBytes(0, 1, bytes); - try (final ParcelFileDescriptor fd = mProvider.openDocument("3", "r", null)) { - final byte[] readBytes = new byte[1024 * 1024]; - assertEquals(11, Os.read(fd.getFileDescriptor(), readBytes, 0, readBytes.length)); - } - } - - public void testOpenDocument_writing() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 100, "Storage", 0, 0, "") - }); - final String documentId = mProvider.createDocument("2", "text/plain", "test.txt"); - { - final ParcelFileDescriptor fd = mProvider.openDocument(documentId, "w", null); - try (ParcelFileDescriptor.AutoCloseOutputStream stream = - new ParcelFileDescriptor.AutoCloseOutputStream(fd)) { - stream.write("Hello".getBytes()); - fd.getFileDescriptor().sync(); - } - } - { - final ParcelFileDescriptor fd = mProvider.openDocument(documentId, "r", null); - try (ParcelFileDescriptor.AutoCloseInputStream stream = - new ParcelFileDescriptor.AutoCloseInputStream(fd)) { - final byte[] bytes = new byte[5]; - stream.read(bytes); - assertTrue(Arrays.equals("Hello".getBytes(), bytes)); - } - } - } - - public void testBusyDevice() throws Exception { - mMtpManager = new TestMtpManager(getContext()) { - @Override - synchronized MtpDeviceRecord openDevice(int deviceId) - throws IOException { - throw new BusyDeviceException(); - } - }; - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, "Device A", null /* deviceKey */, false /* unopened */, new MtpRoot[0], - OPERATIONS_SUPPORTED, null)); - - mProvider.resumeRootScanner(); - mResolver.waitForNotification(ROOTS_URI, 1); - - try (final Cursor cursor = mProvider.queryRoots(null)) { - assertEquals(1, cursor.getCount()); - } - - try (final Cursor cursor = mProvider.queryChildDocuments("1", null, (String) null)) { - assertEquals(0, cursor.getCount()); - assertEquals( - "error_busy_device", - cursor.getExtras().getString(DocumentsContract.EXTRA_ERROR)); - } - } - - public void testLockedDevice() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, "Device A", null, false /* unopened */, new MtpRoot[0], OPERATIONS_SUPPORTED, - null)); - - mProvider.resumeRootScanner(); - mResolver.waitForNotification(ROOTS_URI, 1); - - try (final Cursor cursor = mProvider.queryRoots(null)) { - assertEquals(1, cursor.getCount()); - } - - try (final Cursor cursor = mProvider.queryChildDocuments("1", null, (String) null)) { - assertEquals(0, cursor.getCount()); - assertEquals( - "error_locked_device", - cursor.getExtras().getString(DocumentsContract.EXTRA_ERROR)); - } - } - - public void testMappingDisconnectedDocuments() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, - "Device A", - "device key", - true /* opened */, - new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 2048 /* total space */, - "" /* no volume identifier */) - }, - OPERATIONS_SUPPORTED, - null)); - - final String[] names = strings("Directory A", "Directory B", "Directory C"); - final int objectHandleOffset = 100; - for (int i = 0; i < names.length; i++) { - final int parentHandle = i == 0 ? - MtpManager.OBJECT_HANDLE_ROOT_CHILDREN : objectHandleOffset + i - 1; - final int objectHandle = i + objectHandleOffset; - mMtpManager.setObjectHandles(0, 1, parentHandle, new int[] { objectHandle }); - mMtpManager.setObjectInfo( - 0, - new MtpObjectInfo.Builder() - .setName(names[i]) - .setObjectHandle(objectHandle) - .setFormat(MtpConstants.FORMAT_ASSOCIATION) - .setStorageId(1) - .build()); - } - - mProvider.resumeRootScanner(); - mResolver.waitForNotification(ROOTS_URI, 1); - - final int documentIdOffset = 2; - for (int i = 0; i < names.length; i++) { - try (final Cursor cursor = mProvider.queryChildDocuments( - String.valueOf(documentIdOffset + i), - strings(Document.COLUMN_DOCUMENT_ID, Document.COLUMN_DISPLAY_NAME), - (String) null)) { - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(String.valueOf(documentIdOffset + i + 1), cursor.getString(0)); - assertEquals(names[i], cursor.getString(1)); - } - } - - mProvider.closeDevice(0); - mResolver.waitForNotification(ROOTS_URI, 2); - - mProvider.openDevice(0); - mResolver.waitForNotification(ROOTS_URI, 3); - - for (int i = 0; i < names.length; i++) { - mResolver.waitForNotification(DocumentsContract.buildChildDocumentsUri( - MtpDocumentsProvider.AUTHORITY, - String.valueOf(documentIdOffset + i)), 1); - try (final Cursor cursor = mProvider.queryChildDocuments( - String.valueOf(documentIdOffset + i), - strings(Document.COLUMN_DOCUMENT_ID), - (String) null)) { - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals(String.valueOf(documentIdOffset + i + 1), cursor.getString(0)); - } - } - } - - public void testCreateDocument() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 100, "Storage A", 100, 100, null) - }); - final String documentId = mProvider.createDocument("1", "text/plain", "note.txt"); - final Uri deviceUri = DocumentsContract.buildChildDocumentsUri( - MtpDocumentsProvider.AUTHORITY, "1"); - final Uri storageUri = DocumentsContract.buildChildDocumentsUri( - MtpDocumentsProvider.AUTHORITY, "2"); - mResolver.waitForNotification(storageUri, 1); - mResolver.waitForNotification(deviceUri, 1); - try (final Cursor cursor = mProvider.queryDocument(documentId, null)) { - assertTrue(cursor.moveToNext()); - assertEquals( - "note.txt", - cursor.getString(cursor.getColumnIndex(Document.COLUMN_DISPLAY_NAME))); - assertEquals( - "text/plain", - cursor.getString(cursor.getColumnIndex(Document.COLUMN_MIME_TYPE))); - } - } - - public void testCreateDocument_noWritingSupport() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, "Device A", null /* deviceKey */, false /* unopened */, - new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 2048 /* total space */, - "" /* no volume identifier */) - }, - new int[0] /* no operations supported */, null)); - mProvider.resumeRootScanner(); - mResolver.waitForNotification(ROOTS_URI, 1); - try { - mProvider.createDocument("1", "text/palin", "note.txt"); - fail(); - } catch (UnsupportedOperationException exception) {} - } - - public void testOpenDocument_noWritingSupport() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mMtpManager.addValidDevice(new MtpDeviceRecord( - 0, "Device A", null /* deviceKey */, false /* unopened */, - new MtpRoot[] { - new MtpRoot( - 0 /* deviceId */, - 1 /* storageId */, - "Storage A" /* volume description */, - 1024 /* free space */, - 2048 /* total space */, - "" /* no volume identifier */) - }, - new int[0] /* no operations supported */, null)); - mMtpManager.setObjectHandles( - 0, 1, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, new int[] { 100 }); - mMtpManager.setObjectInfo( - 0, new MtpObjectInfo.Builder().setObjectHandle(100).setName("note.txt").build()); - mProvider.resumeRootScanner(); - mResolver.waitForNotification(ROOTS_URI, 1); - try (final Cursor cursor = mProvider.queryChildDocuments( - "1", strings(Document.COLUMN_DOCUMENT_ID), (String) null)) { - assertEquals(1, cursor.getCount()); - cursor.moveToNext(); - assertEquals("3", cursor.getString(0)); - } - try { - mProvider.openDocument("3", "w", null); - fail(); - } catch (UnsupportedOperationException exception) {} - } - - public void testObjectSizeLong() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); - mMtpManager.setObjectSizeLong(0, 100, MtpConstants.FORMAT_EXIF_JPEG, 0x400000000L); - setupDocuments( - 0, - 0, - MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, - "1", - new MtpObjectInfo[] { - new MtpObjectInfo.Builder() - .setObjectHandle(100) - .setFormat(MtpConstants.FORMAT_EXIF_JPEG) - .setName("image.jpg") - .setCompressedSize(0xffffffffl) - .build() - }); - - final Cursor cursor = mProvider.queryDocument("3", new String[] { - DocumentsContract.Document.COLUMN_SIZE - }); - assertEquals(1, cursor.getCount()); - - cursor.moveToNext(); - assertEquals(0x400000000L, cursor.getLong(0)); - } - - public void testFindDocumentPath_singleStorage_toRoot() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); - setupHierarchyDocuments("1"); - - final Path path = mProvider.findDocumentPath(null, "15"); - assertEquals("1", path.getRootId()); - assertEquals(4, path.getPath().size()); - assertEquals("1", path.getPath().get(0)); - assertEquals("3", path.getPath().get(1)); - assertEquals("6", path.getPath().get(2)); - assertEquals("15", path.getPath().get(3)); - } - - public void testFindDocumentPath_singleStorage_toDoc() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); - setupHierarchyDocuments("1"); - - final Path path = mProvider.findDocumentPath("3", "18"); - assertNull(path.getRootId()); - assertEquals(3, path.getPath().size()); - assertEquals("3", path.getPath().get(0)); - assertEquals("7", path.getPath().get(1)); - assertEquals("18", path.getPath().get(2)); - } - - public void testFindDocumentPath_multiStorage_toRoot() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 0, "Storage A", 1000, 1000, ""), - new MtpRoot(0, 1, "Storage B", 1000, 1000, "") }); - setupHierarchyDocuments("2"); - - final Path path = mProvider.findDocumentPath(null, "16"); - assertEquals("2", path.getRootId()); - assertEquals(4, path.getPath().size()); - assertEquals("2", path.getPath().get(0)); - assertEquals("4", path.getPath().get(1)); - assertEquals("7", path.getPath().get(2)); - assertEquals("16", path.getPath().get(3)); - } - - public void testFindDocumentPath_multiStorage_toDoc() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { - new MtpRoot(0, 0, "Storage A", 1000, 1000, ""), - new MtpRoot(0, 1, "Storage B", 1000, 1000, "") }); - setupHierarchyDocuments("2"); - - final Path path = mProvider.findDocumentPath("4", "19"); - assertNull(path.getRootId()); - assertEquals(3, path.getPath().size()); - assertEquals("4", path.getPath().get(0)); - assertEquals("8", path.getPath().get(1)); - assertEquals("19", path.getPath().get(2)); - } - - public void testIsChildDocument() throws Exception { - setupProvider(MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - setupRoots(0, new MtpRoot[] { new MtpRoot(0, 0, "Storage", 1000, 1000, "") }); - setupHierarchyDocuments("1"); - assertTrue(mProvider.isChildDocument("1", "1")); - assertTrue(mProvider.isChildDocument("1", "14")); - assertTrue(mProvider.isChildDocument("2", "14")); - assertTrue(mProvider.isChildDocument("5", "14")); - assertFalse(mProvider.isChildDocument("3", "14")); - assertFalse(mProvider.isChildDocument("6", "14")); - } - - private void setupProvider(int flag) { - mDatabase = new MtpDatabase(getContext(), flag); - mProvider = new MtpDocumentsProvider(); - final StorageManager storageManager = getContext().getSystemService(StorageManager.class); - assertTrue(mProvider.onCreateForTesting( - getContext(), - mResources, - mMtpManager, - mResolver, - mDatabase, - storageManager, - new TestServiceIntentSender())); - } - - private String[] getStrings(Cursor cursor) { - try { - final String[] results = new String[cursor.getCount()]; - for (int i = 0; cursor.moveToNext(); i++) { - results[i] = cursor.getString(0); - } - return results; - } finally { - cursor.close(); - } - } - - private String[] setupRoots(int deviceId, MtpRoot[] roots) - throws InterruptedException, TimeoutException, IOException { - final int changeCount = mResolver.getChangeCount(ROOTS_URI); - mMtpManager.addValidDevice( - new MtpDeviceRecord(deviceId, "Device", null /* deviceKey */, false /* unopened */, - roots, OPERATIONS_SUPPORTED, null)); - mProvider.openDevice(deviceId); - mResolver.waitForNotification(ROOTS_URI, changeCount + 1); - return getStrings(mProvider.queryRoots(strings(DocumentsContract.Root.COLUMN_ROOT_ID))); - } - - private String[] setupDocuments( - int deviceId, - int storageId, - int parentHandle, - String parentDocumentId, - MtpObjectInfo[] objects) throws FileNotFoundException { - final int[] handles = new int[objects.length]; - int i = 0; - for (final MtpObjectInfo info : objects) { - handles[i++] = info.getObjectHandle(); - mMtpManager.setObjectInfo(deviceId, info); - } - mMtpManager.setObjectHandles(deviceId, storageId, parentHandle, handles); - return getStrings(mProvider.queryChildDocuments( - parentDocumentId, - strings(DocumentsContract.Document.COLUMN_DOCUMENT_ID), - (String) null)); - } - - static class HierarchyDocument { - int depth; - String documentId; - int objectHandle; - int parentHandle; - - HierarchyDocument createChildDocument(int newHandle) { - final HierarchyDocument doc = new HierarchyDocument(); - doc.depth = depth - 1; - doc.objectHandle = newHandle; - doc.parentHandle = objectHandle; - return doc; - } - - MtpObjectInfo toObjectInfo() { - return new MtpObjectInfo.Builder() - .setName("doc_" + documentId) - .setFormat(depth > 0 ? - MtpConstants.FORMAT_ASSOCIATION : MtpConstants.FORMAT_TEXT) - .setObjectHandle(objectHandle) - .setParent(parentHandle) - .build(); - } - } - - private void setupHierarchyDocuments(String documentId) throws Exception { - final Queue<HierarchyDocument> ids = new LinkedList<>(); - final HierarchyDocument firstDocument = new HierarchyDocument(); - firstDocument.depth = 3; - firstDocument.documentId = documentId; - firstDocument.objectHandle = MtpManager.OBJECT_HANDLE_ROOT_CHILDREN; - ids.add(firstDocument); - - int objectHandle = 100; - while (!ids.isEmpty()) { - final HierarchyDocument document = ids.remove(); - final HierarchyDocument[] children = new HierarchyDocument[] { - document.createChildDocument(objectHandle++), - document.createChildDocument(objectHandle++), - document.createChildDocument(objectHandle++), - }; - final String[] childDocIds = setupDocuments( - 0, 0, document.objectHandle, document.documentId, new MtpObjectInfo[] { - children[0].toObjectInfo(), - children[1].toObjectInfo(), - children[2].toObjectInfo(), - }); - children[0].documentId = childDocIds[0]; - children[1].documentId = childDocIds[1]; - children[2].documentId = childDocIds[2]; - - if (children[0].depth > 0) { - ids.add(children[0]); - ids.add(children[1]); - ids.add(children[2]); - } - } - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java deleted file mode 100644 index 5ada14fa8b45..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpManagerTest.java +++ /dev/null @@ -1,164 +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.mtp; - -import android.content.Context; -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbManager; -import android.mtp.MtpConstants; -import android.mtp.MtpEvent; -import android.mtp.MtpObjectInfo; -import android.os.CancellationSignal; -import android.os.OperationCanceledException; -import android.os.ParcelFileDescriptor; -import android.os.SystemClock; -import android.test.InstrumentationTestCase; - -import java.io.IOException; -import java.util.Arrays; -import java.util.concurrent.Callable; -import java.util.concurrent.FutureTask; -import java.util.concurrent.TimeUnit; - -@RealDeviceTest -public class MtpManagerTest extends InstrumentationTestCase { - private static final int TIMEOUT_MS = 1000; - UsbManager mUsbManager; - MtpManager mManager; - UsbDevice mUsbDevice; - - @Override - public void setUp() throws Exception { - mUsbManager = getContext().getSystemService(UsbManager.class); - mManager = new MtpManager(getContext()); - mUsbDevice = TestUtil.setupMtpDevice(getInstrumentation(), mUsbManager, mManager); - } - - @Override - public void tearDown() throws IOException { - mManager.closeDevice(mUsbDevice.getDeviceId()); - } - - @Override - public TestResultInstrumentation getInstrumentation() { - return (TestResultInstrumentation) super.getInstrumentation(); - } - - public void testCancelEvent() throws Exception { - final CancellationSignal signal = new CancellationSignal(); - final FutureTask<Boolean> future = new FutureTask<Boolean>( - new Callable<Boolean>() { - @Override - public Boolean call() throws IOException { - try { - while (true) { - mManager.readEvent(mUsbDevice.getDeviceId(), signal); - } - } catch (OperationCanceledException exception) { - return true; - } - } - }); - final Thread thread = new Thread(future); - thread.start(); - SystemClock.sleep(TIMEOUT_MS); - signal.cancel(); - assertTrue(future.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)); - } - - public void testOperationsSupported() { - final MtpDeviceRecord[] records = mManager.getDevices(); - assertEquals(1, records.length); - assertNotNull(records[0].operationsSupported); - getInstrumentation().show(Arrays.toString(records[0].operationsSupported)); - } - - public void testEventsSupported() { - final MtpDeviceRecord[] records = mManager.getDevices(); - assertEquals(1, records.length); - assertNotNull(records[0].eventsSupported); - getInstrumentation().show(Arrays.toString(records[0].eventsSupported)); - } - - public void testDeviceKey() { - final MtpDeviceRecord[] records = mManager.getDevices(); - assertEquals(1, records.length); - assertNotNull(records[0].deviceKey); - getInstrumentation().show("deviceKey: " + records[0].deviceKey); - } - - public void testEventObjectAdded() throws Exception { - while (true) { - getInstrumentation().show("Please take a photo by using connected MTP device."); - final CancellationSignal signal = new CancellationSignal(); - MtpEvent event = mManager.readEvent(mUsbDevice.getDeviceId(), signal); - if (event.getEventCode() != MtpEvent.EVENT_OBJECT_ADDED) { - continue; - } - assertTrue(event.getObjectHandle() != 0); - break; - } - } - - public void testCreateDocumentAndGetPartialObject() throws Exception { - int storageId = 0; - for (final MtpDeviceRecord record : mManager.getDevices()) { - if (record.deviceId == mUsbDevice.getDeviceId()) { - storageId = record.roots[0].mStorageId; - break; - } - } - assertTrue("Valid storage not found.", storageId != 0); - - final String testFileName = "MtpManagerTest_testFile.txt"; - for (final int handle : mManager.getObjectHandles( - mUsbDevice.getDeviceId(), storageId, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN)) { - if (mManager.getObjectInfo(mUsbDevice.getDeviceId(), handle) - .getName().equals(testFileName)) { - mManager.deleteDocument(mUsbDevice.getDeviceId(), handle); - break; - } - } - - final ParcelFileDescriptor[] fds = ParcelFileDescriptor.createPipe(); - final byte[] expectedBytes = "Hello Android!".getBytes("ascii"); - try (final ParcelFileDescriptor.AutoCloseOutputStream stream = - new ParcelFileDescriptor.AutoCloseOutputStream(fds[1])) { - stream.write(expectedBytes); - } - final int objectHandle = mManager.createDocument( - mUsbDevice.getDeviceId(), - new MtpObjectInfo.Builder() - .setStorageId(storageId) - .setName(testFileName) - .setCompressedSize(expectedBytes.length) - .setFormat(MtpConstants.FORMAT_TEXT) - .build(), - fds[0]); - final byte[] bytes = new byte[100]; - assertEquals(5, mManager.getPartialObject( - mUsbDevice.getDeviceId(), objectHandle, 0, 5, bytes)); - assertEquals("Hello", new String(bytes, 0, 5, "ascii")); - assertEquals(8, mManager.getPartialObject( - mUsbDevice.getDeviceId(), objectHandle, 6, 100, bytes)); - assertEquals("Android!", new String(bytes, 0, 8, "ascii")); - } - - private Context getContext() { - return getInstrumentation().getContext(); - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java deleted file mode 100644 index 53dc3dbcf1ea..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/PipeManagerTest.java +++ /dev/null @@ -1,106 +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.mtp; - -import android.os.ParcelFileDescriptor; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; - -import java.io.IOException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -@MediumTest -public class PipeManagerTest extends AndroidTestCase { - private static final byte[] HELLO_BYTES = new byte[] { 'h', 'e', 'l', 'l', 'o' }; - - private TestMtpManager mtpManager; - private ExecutorService mExecutor; - private PipeManager mPipeManager; - private MtpDatabase mDatabase; - - @Override - public void setUp() { - mtpManager = new TestMtpManager(getContext()); - mExecutor = Executors.newSingleThreadExecutor(); - mDatabase = new MtpDatabase(getContext(), MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); - mPipeManager = new PipeManager(mDatabase, mExecutor); - } - - @Override - protected void tearDown() throws Exception { - assertTrue(mPipeManager.close()); - mDatabase.close(); - } - - public void testReadDocument_basic() throws Exception { - mtpManager.setImportFileBytes(0, 1, HELLO_BYTES); - final ParcelFileDescriptor descriptor = mPipeManager.readDocument( - mtpManager, - new Identifier(0, 0, 1, null, MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT)); - assertDescriptor(descriptor, HELLO_BYTES); - } - - public void testReadDocument_error() throws Exception { - final ParcelFileDescriptor descriptor = mPipeManager.readDocument( - mtpManager, - new Identifier(0, 0, 1, null, MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT)); - assertDescriptorError(descriptor); - } - - public void testReadThumbnail_basic() throws Exception { - mtpManager.setThumbnail(0, 1, HELLO_BYTES); - final ParcelFileDescriptor descriptor = mPipeManager.readThumbnail( - mtpManager, - new Identifier(0, 0, 1, null, MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT)); - assertDescriptor(descriptor, HELLO_BYTES); - } - - public void testReadThumbnail_error() throws Exception { - final ParcelFileDescriptor descriptor = mPipeManager.readThumbnail( - mtpManager, - new Identifier(0, 0, 1, null, MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT)); - assertDescriptorError(descriptor); - } - - private void assertDescriptor(ParcelFileDescriptor descriptor, byte[] expectedBytes) - throws IOException, InterruptedException { - mExecutor.shutdown(); - assertTrue(mExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS)); - try (final ParcelFileDescriptor.AutoCloseInputStream stream = - new ParcelFileDescriptor.AutoCloseInputStream(descriptor)) { - byte[] results = new byte[100]; - assertEquals(expectedBytes.length, stream.read(results)); - for (int i = 0; i < expectedBytes.length; i++) { - assertEquals(expectedBytes[i], results[i]); - } - } - } - - private void assertDescriptorError(ParcelFileDescriptor descriptor) - throws InterruptedException { - mExecutor.shutdown(); - assertTrue(mExecutor.awaitTermination(1000, TimeUnit.MILLISECONDS)); - try { - descriptor.checkError(); - fail(); - } catch (Throwable error) { - assertTrue(error instanceof IOException); - } - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/RealDeviceTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/RealDeviceTest.java deleted file mode 100644 index 22daaf2971e6..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/RealDeviceTest.java +++ /dev/null @@ -1,26 +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.mtp; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.TYPE, ElementType.METHOD}) -@interface RealDeviceTest {} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestContentResolver.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestContentResolver.java deleted file mode 100644 index 7e772c36d103..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestContentResolver.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.mtp; - -import android.database.ContentObserver; -import android.net.Uri; -import android.test.mock.MockContentResolver; - -import junit.framework.Assert; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Phaser; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -class TestContentResolver extends MockContentResolver { - private static final int TIMEOUT_PERIOD_MS = 3000; - private final Map<Uri, Phaser> mPhasers = new HashMap<>(); - - @Override - public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) { - getPhaser(uri).arrive(); - } - - - void waitForNotification(Uri uri, int count) throws InterruptedException, TimeoutException { - Assert.assertEquals(count, getPhaser(uri).awaitAdvanceInterruptibly( - count - 1, TIMEOUT_PERIOD_MS, TimeUnit.MILLISECONDS)); - } - - int getChangeCount(Uri uri) { - if (mPhasers.containsKey(uri)) { - return mPhasers.get(uri).getPhase(); - } else { - return 0; - } - } - - private synchronized Phaser getPhaser(Uri uri) { - Phaser phaser = mPhasers.get(uri); - if (phaser == null) { - phaser = new Phaser(1); - mPhasers.put(uri, phaser); - } - return phaser; - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java deleted file mode 100644 index f20bbeca11dd..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestMtpManager.java +++ /dev/null @@ -1,236 +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.mtp; - -import android.content.Context; -import android.mtp.MtpObjectInfo; -import android.os.ParcelFileDescriptor; -import android.util.SparseArray; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import junit.framework.Assert; - -public class TestMtpManager extends MtpManager { - public static final int CREATED_DOCUMENT_HANDLE = 1000; - - protected static String pack(int... args) { - return Arrays.toString(args); - } - - private final SparseArray<MtpDeviceRecord> mDevices = new SparseArray<>(); - private final Map<String, MtpObjectInfo> mObjectInfos = new HashMap<>(); - private final Map<String, int[]> mObjectHandles = new HashMap<>(); - private final Map<String, byte[]> mThumbnailBytes = new HashMap<>(); - private final Map<String, byte[]> mImportFileBytes = new HashMap<>(); - private final Map<String, Long> mObjectSizeLongs = new HashMap<>(); - - TestMtpManager(Context context) { - super(context); - } - - void addValidDevice(MtpDeviceRecord device) { - mDevices.put(device.deviceId, device); - } - - void setObjectHandles(int deviceId, int storageId, int parentHandle, int[] objectHandles) { - mObjectHandles.put(pack(deviceId, storageId, parentHandle), objectHandles); - } - - void setObjectInfo(int deviceId, MtpObjectInfo objectInfo) { - mObjectInfos.put(pack(deviceId, objectInfo.getObjectHandle()), objectInfo); - } - - void setImportFileBytes(int deviceId, int objectHandle, byte[] bytes) { - mImportFileBytes.put(pack(deviceId, objectHandle), bytes); - } - - byte[] getImportFileBytes(int deviceId, int objectHandle) { - return mImportFileBytes.get(pack(deviceId, objectHandle)); - } - - void setThumbnail(int deviceId, int objectHandle, byte[] bytes) { - mThumbnailBytes.put(pack(deviceId, objectHandle), bytes); - } - - void setObjectSizeLong(int deviceId, int objectHandle, int format, long value) { - mObjectSizeLongs.put(pack(deviceId, objectHandle, format), value); - } - - @Override - synchronized MtpDeviceRecord[] getDevices() { - final MtpDeviceRecord[] result = new MtpDeviceRecord[mDevices.size()]; - for (int i = 0; i < mDevices.size(); i++) { - final MtpDeviceRecord device = mDevices.valueAt(i); - if (device.opened) { - result[i] = device; - } else { - result[i] = new MtpDeviceRecord( - device.deviceId, device.name, device.deviceKey, device.opened, - new MtpRoot[0], null, null); - } - } - return result; - } - - @Override - synchronized MtpDeviceRecord openDevice(int deviceId) throws IOException { - final MtpDeviceRecord device = mDevices.get(deviceId); - if (device == null) { - throw new IOException(); - } - final MtpDeviceRecord record = new MtpDeviceRecord( - device.deviceId, device.name, device.deviceKey, true, device.roots, - device.operationsSupported, device.eventsSupported); - mDevices.put(deviceId, record); - return record; - } - - @Override - synchronized void closeDevice(int deviceId) throws IOException { - final MtpDeviceRecord device = mDevices.get(deviceId); - if (device == null) { - throw new IOException(); - } - mDevices.put( - deviceId, - new MtpDeviceRecord(device.deviceId, device.name, device.deviceKey, false, - device.roots, device.operationsSupported, device.eventsSupported)); - } - - @Override - MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException { - final String key = pack(deviceId, objectHandle); - if (mObjectInfos.containsKey(key)) { - return mObjectInfos.get(key); - } else { - throw new IOException("getObjectInfo error: " + key); - } - } - - @Override - int[] getObjectHandles(int deviceId, int storageId, int parentObjectHandle) throws IOException { - final String key = pack(deviceId, storageId, parentObjectHandle); - if (mObjectHandles.containsKey(key)) { - return mObjectHandles.get(key); - } else { - throw new IOException("getObjectHandles error: " + key); - } - } - - @Override - void importFile(int deviceId, int objectHandle, ParcelFileDescriptor target) - throws IOException { - final String key = pack(deviceId, objectHandle); - if (mImportFileBytes.containsKey(key)) { - try (final ParcelFileDescriptor.AutoCloseOutputStream outputStream = - new ParcelFileDescriptor.AutoCloseOutputStream(target)) { - outputStream.write(mImportFileBytes.get(key)); - } - } else { - throw new IOException("importFile error: " + key); - } - } - - @Override - int createDocument(int deviceId, MtpObjectInfo objectInfo, ParcelFileDescriptor source) - throws IOException { - Assert.assertNotSame(0, objectInfo.getStorageId()); - Assert.assertNotSame(-1, objectInfo.getStorageId()); - Assert.assertNotSame(0, objectInfo.getParent()); - final String key = pack(deviceId, CREATED_DOCUMENT_HANDLE); - if (mObjectInfos.containsKey(key)) { - throw new IOException(); - } - final MtpObjectInfo newInfo = new MtpObjectInfo.Builder(objectInfo). - setObjectHandle(CREATED_DOCUMENT_HANDLE).build(); - mObjectInfos.put(key, newInfo); - if (objectInfo.getFormat() != 0x3001) { - try (final ParcelFileDescriptor.AutoCloseInputStream inputStream = - new ParcelFileDescriptor.AutoCloseInputStream(source)) { - final byte[] buffer = new byte[objectInfo.getCompressedSize()]; - if (inputStream.read(buffer, 0, objectInfo.getCompressedSize()) != - objectInfo.getCompressedSize()) { - throw new IOException(); - } - - mImportFileBytes.put(pack(deviceId, CREATED_DOCUMENT_HANDLE), buffer); - } - } - return CREATED_DOCUMENT_HANDLE; - } - - @Override - byte[] getThumbnail(int deviceId, int objectHandle) throws IOException { - final String key = pack(deviceId, objectHandle); - if (mThumbnailBytes.containsKey(key)) { - return mThumbnailBytes.get(key); - } else { - throw new IOException("getThumbnail error: " + key); - } - } - - @Override - void deleteDocument(int deviceId, int objectHandle) throws IOException { - final String key = pack(deviceId, objectHandle); - if (mObjectInfos.containsKey(key)) { - mObjectInfos.remove(key); - } else { - throw new IOException(); - } - } - - @Override - int getParent(int deviceId, int objectHandle) throws IOException { - final String key = pack(deviceId, objectHandle); - if (mObjectInfos.containsKey(key)) { - return mObjectInfos.get(key).getParent(); - } else { - throw new IOException(); - } - } - - @Override - byte[] getObject(int deviceId, int objectHandle, int expectedSize) throws IOException { - return mImportFileBytes.get(pack(deviceId, objectHandle)); - } - - @Override - long getPartialObject(int deviceId, int objectHandle, long offset, long size, byte[] buffer) - throws IOException { - final byte[] bytes = mImportFileBytes.get(pack(deviceId, objectHandle)); - int i = 0; - while (i < size && i + offset < bytes.length) { - buffer[i] = bytes[(int) (i + offset)]; - i++; - } - return i; - } - - @Override - long getObjectSizeLong(int deviceId, int objectHandle, int format) throws IOException { - final String key = pack(deviceId, objectHandle, format); - if (mObjectSizeLongs.containsKey(key)) { - return mObjectSizeLongs.get(key); - } else { - throw new IOException(); - } - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResources.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResources.java deleted file mode 100644 index 8676b5a0d315..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResources.java +++ /dev/null @@ -1,39 +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.mtp; - -import android.test.mock.MockResources; - -class TestResources extends MockResources { - @Override - public String getString(int id) throws NotFoundException { - switch (id) { - case R.string.root_name: - return "%1$s %2$s"; - case R.string.error_busy_device: - return "error_busy_device"; - case R.string.error_locked_device: - return "error_locked_device"; - } - throw new NotFoundException(); - } - - @Override - public String getString(int id, Object... formatArgs) throws NotFoundException { - return String.format(getString(id), formatArgs); - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultActivity.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultActivity.java deleted file mode 100644 index 9f2bb2ac8a49..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultActivity.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.mtp; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.util.Log; -import android.view.ViewGroup.LayoutParams; -import android.widget.LinearLayout; -import android.widget.TextView; - - -/** - * Activity that shows the test results instead of adb while using USB port to connect MTP device. - */ -public class TestResultActivity extends Activity { - private final static String TAG = "MtpDocumentsProviderTest"; - private TextView mTextView; - - static void show(Context context, String message) { - Log.d(TAG, message); - final Intent intent = new Intent(context, TestResultActivity.class); - intent.putExtra("message", message); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - final LinearLayout linearLayout = new LinearLayout(this); - linearLayout.setOrientation(LinearLayout.VERTICAL); - setContentView(linearLayout); - - mTextView = new TextView(this); - mTextView.setText(getIntent().getStringExtra("message") + "\n"); - linearLayout.addView( - mTextView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - mTextView.setText(mTextView.getText() + intent.getStringExtra("message") + "\n"); - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultInstrumentation.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultInstrumentation.java deleted file mode 100644 index 4e4cf7833dd0..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestResultInstrumentation.java +++ /dev/null @@ -1,87 +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.mtp; - -import android.os.Bundle; -import android.test.InstrumentationTestRunner; - -import junit.framework.AssertionFailedError; -import junit.framework.Test; -import junit.framework.TestListener; - -/** - * Instrumentation that can show the test result in the TestResultActivity. - * It's useful when it runs testcases with a real USB device and could not use USB port for ADB. - */ -public class TestResultInstrumentation extends InstrumentationTestRunner implements TestListener { - private boolean mHasError = false; - - @Override - public void onCreate(Bundle arguments) { - if (arguments == null) { - arguments = new Bundle(); - } - final boolean includeRealDeviceTest = - Boolean.parseBoolean(arguments.getString("realDeviceTest", "false")); - if (!includeRealDeviceTest) { - arguments.putString("notAnnotation", "com.android.mtp.RealDeviceTest"); - } - super.onCreate(arguments); - if (includeRealDeviceTest) { - // Show the test result by using activity because we need to disconnect USB cable - // from adb host while testing with real MTP device. - addTestListener(this); - } - } - - @Override - public void addError(Test test, Throwable t) { - mHasError = true; - show("ERROR", test, t); - } - - @Override - public void addFailure(Test test, AssertionFailedError t) { - mHasError = true; - show("FAIL", test, t); - } - - @Override - public void endTest(Test test) { - if (!mHasError) { - show("PASS", test, null); - } - } - - @Override - public void startTest(Test test) { - mHasError = false; - } - - void show(String message) { - TestResultActivity.show(getContext(), " " + message); - } - - private void show(String tag, Test test, Throwable t) { - String message = ""; - if (t != null && t.getMessage() != null) { - message = t.getMessage(); - } - TestResultActivity.show( - getContext(), String.format("[%s] %s %s", tag, test.toString(), message)); - } -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestServiceIntentSender.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestServiceIntentSender.java deleted file mode 100644 index 17b30862e82d..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestServiceIntentSender.java +++ /dev/null @@ -1,22 +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.mtp; - -class TestServiceIntentSender extends ServiceIntentSender { - @Override - void sendUpdateNotificationIntent(MtpDeviceRecord[] record) {} -} diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestUtil.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestUtil.java deleted file mode 100644 index 8805d19293eb..000000000000 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/TestUtil.java +++ /dev/null @@ -1,131 +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.mtp; - -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbDeviceConnection; -import android.hardware.usb.UsbManager; -import android.mtp.MtpConstants; -import android.os.SystemClock; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.HashMap; -import java.util.Objects; - -/** - * Static utility methods for testing. - */ -final class TestUtil { - private TestUtil() {} - - static final int[] OPERATIONS_SUPPORTED = new int[] { - MtpConstants.OPERATION_GET_PARTIAL_OBJECT, - MtpConstants.OPERATION_SEND_OBJECT, - MtpConstants.OPERATION_SEND_OBJECT_INFO, - MtpConstants.OPERATION_DELETE_OBJECT, - MtpConstants.OPERATION_GET_OBJECT_PROP_DESC, - MtpConstants.OPERATION_GET_OBJECT_PROP_VALUE - }; - - /** - * Requests permission for a MTP device and returns the first MTP device that has at least one - * storage. - */ - static UsbDevice setupMtpDevice( - TestResultInstrumentation instrumentation, - UsbManager usbManager, - MtpManager manager) { - while (true) { - try { - final UsbDevice device = findMtpDevice(usbManager, manager); - waitForStorages(instrumentation, manager, device.getDeviceId()); - return device; - } catch (IOException exp) { - instrumentation.show(Objects.toString(exp.getMessage())); - SystemClock.sleep(1000); - // When the MTP device is Android, and it changes the USB device type from - // "Charging" to "MTP", the device ID will be updated. We need to find a device - // again. - continue; - } - } - } - - static void addTestDevice(MtpDatabase database) throws FileNotFoundException { - database.getMapper().startAddingDocuments(null); - database.getMapper().putDeviceDocument(new MtpDeviceRecord( - 0, "Device", "device_key", /* opened is */ true, new MtpRoot[0], - OPERATIONS_SUPPORTED, null)); - database.getMapper().stopAddingDocuments(null); - } - - static void addTestStorage(MtpDatabase database, String parentId) throws FileNotFoundException { - database.getMapper().startAddingDocuments(parentId); - database.getMapper().putStorageDocuments(parentId, OPERATIONS_SUPPORTED, new MtpRoot[] { - new MtpRoot(0, 100, "Storage", 1024, 1024, ""), - }); - database.getMapper().stopAddingDocuments(parentId); - } - - private static UsbDevice findMtpDevice( - UsbManager usbManager, - MtpManager manager) throws IOException { - final HashMap<String,UsbDevice> devices = usbManager.getDeviceList(); - if (devices.size() == 0) { - throw new IOException("Device not found."); - } - final UsbDevice device = devices.values().iterator().next(); - // Tries to get ownership of the device in case that another application use it. - if (usbManager.hasPermission(device)) { - final UsbDeviceConnection connection = usbManager.openDevice(device); - for (int i = 0; i < device.getInterfaceCount(); i++) { - // Since the test runs real environment, we need to call claim interface with - // force = true to rob interfaces from other applications. - connection.claimInterface(device.getInterface(i), true); - connection.releaseInterface(device.getInterface(i)); - } - connection.close(); - } - manager.openDevice(device.getDeviceId()); - return device; - } - - private static void waitForStorages( - TestResultInstrumentation instrumentation, - MtpManager manager, - int deviceId) throws IOException { - while (true) { - MtpDeviceRecord device = null; - for (final MtpDeviceRecord deviceCandidate : manager.getDevices()) { - if (deviceCandidate.deviceId == deviceId) { - device = deviceCandidate; - break; - } - } - if (device == null) { - throw new IOException("Device was detached."); - } - if (device.roots.length == 0) { - instrumentation.show("Wait for storages."); - SystemClock.sleep(1000); - continue; - } - return; - } - } -} |