From b64b95e204f6c90b495ac0005dacd47ad7e26c62 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Sat, 23 Feb 2019 22:04:56 +0000 Subject: [PATCH] Import from file: fix issues with sometimes importing from file. --- .../ui/importlocal/ImportFragment.kt | 14 +- .../etesync/syncadapter/utils/FileUtils.kt | 146 ------------------ 2 files changed, 7 insertions(+), 153 deletions(-) delete mode 100644 app/src/main/java/com/etesync/syncadapter/utils/FileUtils.kt diff --git a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt index cc24a0a7..3b73b0d8 100644 --- a/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt +++ b/app/src/main/java/com/etesync/syncadapter/ui/importlocal/ImportFragment.kt @@ -29,16 +29,16 @@ import com.etesync.syncadapter.resource.* import com.etesync.syncadapter.syncadapter.ContactsSyncManager import com.etesync.syncadapter.ui.Refreshable import com.etesync.syncadapter.ui.importlocal.ResultFragment.ImportResult -import java.io.File import java.io.FileNotFoundException -import java.io.FileReader import java.io.IOException +import java.io.InputStream +import java.io.InputStreamReader class ImportFragment : DialogFragment() { private lateinit var account: Account private lateinit var info: CollectionInfo - private var importFile: File? = null + private var inputStream: InputStream? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -143,10 +143,10 @@ class ImportFragment : DialogFragment() { if (resultCode == Activity.RESULT_OK) { if (data != null) { // Get the URI of the selected file - val uri = data.data - App.log.info("Importing uri = " + uri!!.toString()) + val uri = data.data!! + App.log.info("Importing uri = ${uri.toString()}") try { - importFile = File(com.etesync.syncadapter.utils.FileUtils.getPath(context!!, uri)) + inputStream = activity!!.getContentResolver().openInputStream(uri) Thread(ImportCalendarsLoader()).start() } catch (e: Exception) { @@ -210,7 +210,7 @@ class ImportFragment : DialogFragment() { val result = ImportResult() try { - val importReader = FileReader(importFile!!) + val importReader = InputStreamReader(inputStream) if (info.type == CollectionInfo.Type.CALENDAR) { val events = Event.fromReader(importReader, null) diff --git a/app/src/main/java/com/etesync/syncadapter/utils/FileUtils.kt b/app/src/main/java/com/etesync/syncadapter/utils/FileUtils.kt deleted file mode 100644 index 6ec3cbf6..00000000 --- a/app/src/main/java/com/etesync/syncadapter/utils/FileUtils.kt +++ /dev/null @@ -1,146 +0,0 @@ -package com.etesync.syncadapter.utils - -import android.annotation.SuppressLint -import android.content.ContentUris -import android.content.Context -import android.database.Cursor -import android.net.Uri -import android.os.Build -import android.os.Environment -import android.provider.DocumentsContract -import android.provider.MediaStore - -import java.io.File - -object FileUtils { - - /** - * Get a file path from a Uri. This will get the the path for Storage Access - * Framework Documents, as well as the _data field for the MediaStore and - * other file-based ContentProviders. - * - * @param context The context. - * @param uri The Uri to query. - * @author paulburke - */ - @SuppressLint("NewApi") - fun getPath(context: Context, uri: Uri?): String? { - if (uri == null) { - return null - } - - val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT - - // DocumentProvider - if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { - // ExternalStorageProvider - if (isExternalStorageDocument(uri)) { - val docId = DocumentsContract.getDocumentId(uri) - val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() - val type = split[0] - - if ("primary".equals(type, ignoreCase = true)) { - return Environment.getExternalStorageDirectory().toString() + "/" + split[1] - } - - // TODO handle non-primary volumes - } else if (isDownloadsDocument(uri)) { - - val id = DocumentsContract.getDocumentId(uri) - val contentUri = ContentUris.withAppendedId( - Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id)) - - return getDataColumn(context, contentUri, null, null) - } else if (isMediaDocument(uri)) { - val docId = DocumentsContract.getDocumentId(uri) - val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() - val type = split[0] - - var contentUri: Uri? = null - if ("image" == type) { - contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI - } else if ("video" == type) { - contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI - } else if ("audio" == type) { - contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI - } - - val selection = "_id=?" - val selectionArgs = arrayOf(split[1]) - - return getDataColumn(context, contentUri, selection, selectionArgs) - }// MediaProvider - // DownloadsProvider - } else if ("content".equals(uri.scheme!!, ignoreCase = true)) { - val path = getDataColumn(context, uri, null, null) - if (path != null) { - val file = File(path) - if (!file.canRead()) { - return null - } - } - return path - } else if ("file".equals(uri.scheme!!, ignoreCase = true)) { - return uri.path - }// File - // MediaStore (and general) - - return null - } - - /** - * Get the value of the data column for this Uri. This is useful for - * MediaStore Uris, and other file-based ContentProviders. - * - * @param context The context. - * @param uri The Uri to query. - * @param selection (Optional) Filter used in the query. - * @param selectionArgs (Optional) Selection arguments used in the query. - * @return The value of the _data column, which is typically a file path. - */ - fun getDataColumn(context: Context, uri: Uri?, selection: String?, - selectionArgs: Array?): String? { - - var cursor: Cursor? = null - val column = "_data" - val projection = arrayOf(column) - - try { - cursor = context.contentResolver.query(uri!!, projection, selection, selectionArgs, null) - if (cursor != null && cursor.moveToFirst()) { - val column_index = cursor.getColumnIndexOrThrow(column) - return cursor.getString(column_index) - } - } catch (e: Exception) { - return null - } finally { - cursor?.close() - } - return null - } - - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is ExternalStorageProvider. - */ - fun isExternalStorageDocument(uri: Uri): Boolean { - return "com.android.externalstorage.documents" == uri.authority - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is DownloadsProvider. - */ - fun isDownloadsDocument(uri: Uri): Boolean { - return "com.android.providers.downloads.documents" == uri.authority - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is MediaProvider. - */ - fun isMediaDocument(uri: Uri): Boolean { - return "com.android.providers.media.documents" == uri.authority - } -}