mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Fix some crashes when restoring backups
This commit is contained in:
		@@ -125,7 +125,7 @@ dependencies {
 | 
			
		||||
    compile "com.squareup.retrofit2:adapter-rxjava:$RETROFIT_VERSION"
 | 
			
		||||
 | 
			
		||||
    // IO
 | 
			
		||||
    compile 'com.squareup.okio:okio:1.6.0'
 | 
			
		||||
    compile 'com.squareup.okio:okio:1.7.0'
 | 
			
		||||
 | 
			
		||||
    // JSON
 | 
			
		||||
    compile 'com.google.code.gson:gson:2.6.2'
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,11 @@ import eu.kanade.tachiyomi.ui.base.fragment.BaseRxFragment
 | 
			
		||||
import eu.kanade.tachiyomi.util.toast
 | 
			
		||||
import kotlinx.android.synthetic.main.fragment_backup.*
 | 
			
		||||
import nucleus.factory.RequiresPresenter
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import rx.android.schedulers.AndroidSchedulers
 | 
			
		||||
import rx.internal.util.SubscriptionList
 | 
			
		||||
import rx.schedulers.Schedulers
 | 
			
		||||
import timber.log.Timber
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.text.SimpleDateFormat
 | 
			
		||||
import java.util.*
 | 
			
		||||
@@ -28,11 +33,16 @@ class BackupFragment : BaseRxFragment<BackupPresenter>() {
 | 
			
		||||
    private var backupDialog: Dialog? = null
 | 
			
		||||
    private var restoreDialog: Dialog? = null
 | 
			
		||||
 | 
			
		||||
    private lateinit var subscriptions: SubscriptionList
 | 
			
		||||
 | 
			
		||||
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedState: Bundle?): View {
 | 
			
		||||
        return inflater.inflate(R.layout.fragment_backup, container, false)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onViewCreated(view: View, savedState: Bundle?) {
 | 
			
		||||
        baseActivity.requestPermissionsOnMarshmallow()
 | 
			
		||||
        subscriptions = SubscriptionList()
 | 
			
		||||
 | 
			
		||||
        backup_button.setOnClickListener {
 | 
			
		||||
            val today = SimpleDateFormat("yyyy-MM-dd").format(Date())
 | 
			
		||||
            val file = File(activity.externalCacheDir, "tachiyomi-$today.json")
 | 
			
		||||
@@ -48,11 +58,16 @@ class BackupFragment : BaseRxFragment<BackupPresenter>() {
 | 
			
		||||
            val intent = Intent(Intent.ACTION_GET_CONTENT)
 | 
			
		||||
            intent.addCategory(Intent.CATEGORY_OPENABLE)
 | 
			
		||||
            intent.type = "application/octet-stream"
 | 
			
		||||
            val chooser = Intent.createChooser(intent, getString(R.string.file_select_cover))
 | 
			
		||||
            val chooser = Intent.createChooser(intent, getString(R.string.file_select_backup))
 | 
			
		||||
            startActivityForResult(chooser, REQUEST_BACKUP_OPEN)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onDestroyView() {
 | 
			
		||||
        subscriptions.unsubscribe()
 | 
			
		||||
        super.onDestroyView()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called from the presenter when the backup is completed.
 | 
			
		||||
     *
 | 
			
		||||
@@ -99,8 +114,18 @@ class BackupFragment : BaseRxFragment<BackupPresenter>() {
 | 
			
		||||
                    .progress(true, 0)
 | 
			
		||||
                    .show()
 | 
			
		||||
 | 
			
		||||
            val stream = context.contentResolver.openInputStream(data.data)
 | 
			
		||||
            presenter.restoreBackup(stream)
 | 
			
		||||
            // When using cloud services, we have to open the input stream in a background thread.
 | 
			
		||||
            Observable.fromCallable { context.contentResolver.openInputStream(data.data) }
 | 
			
		||||
                    .subscribeOn(Schedulers.io())
 | 
			
		||||
                    .observeOn(AndroidSchedulers.mainThread())
 | 
			
		||||
                    .subscribe({
 | 
			
		||||
                        presenter.restoreBackup(it)
 | 
			
		||||
                    }, {
 | 
			
		||||
                        context.toast(it.message)
 | 
			
		||||
                        Timber.e(it, it.message)
 | 
			
		||||
                    })
 | 
			
		||||
                    .apply { subscriptions.add(this) }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,12 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.activity
 | 
			
		||||
 | 
			
		||||
import android.Manifest
 | 
			
		||||
import android.content.pm.PackageManager
 | 
			
		||||
import android.graphics.Color
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.support.design.widget.Snackbar
 | 
			
		||||
import android.support.v4.app.ActivityCompat
 | 
			
		||||
import android.support.v4.content.ContextCompat
 | 
			
		||||
import android.support.v7.app.AppCompatActivity
 | 
			
		||||
import android.support.v7.widget.Toolbar
 | 
			
		||||
import android.view.View
 | 
			
		||||
@@ -42,6 +47,22 @@ open class BaseActivity : AppCompatActivity() {
 | 
			
		||||
        supportActionBar?.subtitle = getString(titleResource)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Requests read and write permissions on Android M and higher.
 | 
			
		||||
     */
 | 
			
		||||
    fun requestPermissionsOnMarshmallow() {
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
 | 
			
		||||
            if (ContextCompat.checkSelfPermission(this,
 | 
			
		||||
                    Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
 | 
			
		||||
 | 
			
		||||
                ActivityCompat.requestPermissions(this,
 | 
			
		||||
                        arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE),
 | 
			
		||||
                        1)
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected val app: App
 | 
			
		||||
        get() = App.get(this)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,11 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.manga
 | 
			
		||||
 | 
			
		||||
import android.Manifest
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.content.pm.PackageManager
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v4.app.ActivityCompat
 | 
			
		||||
import android.support.v4.app.Fragment
 | 
			
		||||
import android.support.v4.app.FragmentManager
 | 
			
		||||
import android.support.v4.app.FragmentPagerAdapter
 | 
			
		||||
import android.support.v4.content.ContextCompat
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.event.MangaEvent
 | 
			
		||||
@@ -69,19 +64,6 @@ class MangaActivity : BaseRxActivity<MangaPresenter>() {
 | 
			
		||||
        setToolbarTitle(manga.title)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun requestPermissionsOnMarshmallow() {
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
 | 
			
		||||
            if (ContextCompat.checkSelfPermission(this,
 | 
			
		||||
                    Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
 | 
			
		||||
 | 
			
		||||
                ActivityCompat.requestPermissions(this,
 | 
			
		||||
                        arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE),
 | 
			
		||||
                        1)
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    internal class MangaDetailAdapter(fm: FragmentManager, activity: MangaActivity) : FragmentPagerAdapter(fm) {
 | 
			
		||||
 | 
			
		||||
        private var pageCount: Int = 0
 | 
			
		||||
 
 | 
			
		||||
@@ -265,6 +265,7 @@
 | 
			
		||||
 | 
			
		||||
    <!-- File Picker Titles -->
 | 
			
		||||
    <string name="file_select_cover">Select cover image</string>
 | 
			
		||||
    <string name="file_select_backup">Select backup file</string>
 | 
			
		||||
 | 
			
		||||
    <!--UpdateCheck-->
 | 
			
		||||
    <string name="update_check_title">New update available!</string>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user