diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 837924118db4eb0186f4d8289aa1b316a82577da..5d79305d522aff76df6f009b922a5eb6b92325d1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -244,6 +244,16 @@ android:description="@string/connection_service_description" android:exported="false" android:label="@string/connection_service_title" /> + + <provider + android:name="androidx.core.content.FileProvider" + android:authorities="de.kuschku.quasseldroid.fileprovider" + android:exported="false" + android:grantUriPermissions="true"> + <meta-data + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/filepaths" /> + </provider> </application> </manifest> diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashAdapter.kt index bed1e52b68e70e15b5a3d225affa018d5c3145d9..2bfbbecc0dc96e7591274205759357e8e1cdbd59 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashAdapter.kt @@ -20,6 +20,7 @@ package de.kuschku.quasseldroid.ui.clientsettings.crash import android.content.Intent +import android.net.Uri import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -35,12 +36,12 @@ import org.threeten.bp.Instant import org.threeten.bp.ZoneId import org.threeten.bp.format.DateTimeFormatter -class CrashAdapter : ListAdapter<Pair<Report, String>, CrashAdapter.CrashViewHolder>( - object : DiffUtil.ItemCallback<Pair<Report, String>>() { - override fun areItemsTheSame(oldItem: Pair<Report, String>, newItem: Pair<Report, String>) = +class CrashAdapter : ListAdapter<Pair<Report, Uri>, CrashAdapter.CrashViewHolder>( + object : DiffUtil.ItemCallback<Pair<Report, Uri>>() { + override fun areItemsTheSame(oldItem: Pair<Report, Uri>, newItem: Pair<Report, Uri>) = oldItem.second == newItem.second - override fun areContentsTheSame(oldItem: Pair<Report, String>, newItem: Pair<Report, String>) = + override fun areContentsTheSame(oldItem: Pair<Report, Uri>, newItem: Pair<Report, Uri>) = oldItem == newItem } ) { @@ -49,8 +50,8 @@ class CrashAdapter : ListAdapter<Pair<Report, String>, CrashAdapter.CrashViewHol ) override fun onBindViewHolder(holder: CrashViewHolder, position: Int) { - val (report, data) = getItem(position) - holder.bind(report, data) + val (report, uri) = getItem(position) + holder.bind(report, uri) } class CrashViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { @@ -64,20 +65,21 @@ class CrashAdapter : ListAdapter<Pair<Report, String>, CrashAdapter.CrashViewHol lateinit var error: TextView var item: Report? = null - var data: String? = null + var uri: Uri? = null private val dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss") init { ButterKnife.bind(this, itemView) itemView.setOnClickListener { - data?.let { - val intent = Intent(Intent.ACTION_SEND) - intent.type = "application/json" - intent.putExtra(Intent.EXTRA_TEXT, it) + uri?.let { itemView.context.startActivity( Intent.createChooser( - intent, + Intent(Intent.ACTION_SEND).apply { + type = "application/json" + putExtra(Intent.EXTRA_STREAM, uri) + flags = Intent.FLAG_GRANT_READ_URI_PERMISSION + }, itemView.context.getString(R.string.label_share_crashreport) ) ) @@ -85,9 +87,9 @@ class CrashAdapter : ListAdapter<Pair<Report, String>, CrashAdapter.CrashViewHol } } - fun bind(item: Report, data: String) { + fun bind(item: Report, uri: Uri) { this.item = item - this.data = data + this.uri = uri this.crashTime.text = item.environment?.crashTime?.let { dateTimeFormatter.format(Instant.ofEpochMilli(it).atZone(ZoneId.systemDefault())) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashFragment.kt index f2051e6e202a71d7d922d62d5c0679a98edadffa..18530da042031cc0a4583df81dd33a06793bf465 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/crash/CrashFragment.kt @@ -19,10 +19,12 @@ package de.kuschku.quasseldroid.ui.clientsettings.crash +import android.net.Uri import android.os.Bundle import android.os.Handler import android.os.HandlerThread import android.view.* +import androidx.core.content.FileProvider import androidx.core.view.ViewCompat import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager @@ -80,13 +82,18 @@ class CrashFragment : DaggerFragment() { handler.post { val crashDir = this.crashDir val gson = this.gson + val context = this.context - if (crashDir != null) { + if (crashDir != null && context != null) { crashDir.mkdirs() - val list: List<Pair<Report, String>> = crashDir.listFiles() + val list: List<Pair<Report, Uri>> = crashDir.listFiles() .orEmpty() - .map { it.readText() } - .map { Pair<Report, String>(gson.fromJson(it), it) } + .map { + Pair<Report, Uri>( + gson.fromJson(it.readText()), + FileProvider.getUriForFile(context, "de.kuschku.quasseldroid.fileprovider", it) + ) + } .sortedByDescending { it.first.environment?.crashTime } activity?.runOnUiThread { diff --git a/app/src/main/res/xml/filepaths.xml b/app/src/main/res/xml/filepaths.xml new file mode 100644 index 0000000000000000000000000000000000000000..84279f7b7b18ef2cceb04eb0d44b6300dbe15d57 --- /dev/null +++ b/app/src/main/res/xml/filepaths.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<paths> + <cache-path + name="crashes" + path="crashes" /> +</paths>