diff --git a/app/src/main/java/com/github/libretube/ui/activities/WelcomeActivity.kt b/app/src/main/java/com/github/libretube/ui/activities/WelcomeActivity.kt index b4d32844d3..ef2cc37f2c 100644 --- a/app/src/main/java/com/github/libretube/ui/activities/WelcomeActivity.kt +++ b/app/src/main/java/com/github/libretube/ui/activities/WelcomeActivity.kt @@ -3,6 +3,7 @@ package com.github.libretube.ui.activities import android.content.Intent import android.os.Bundle import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.isGone import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.get @@ -10,15 +11,34 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.github.libretube.R import com.github.libretube.constants.PreferenceKeys import com.github.libretube.databinding.ActivityWelcomeBinding +import com.github.libretube.helpers.BackupHelper import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.ui.adapters.InstancesAdapter import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.models.WelcomeModel +import com.github.libretube.ui.preferences.BackupRestoreSettings +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class WelcomeActivity : BaseActivity() { private lateinit var binding: ActivityWelcomeBinding private var viewModel: WelcomeModel? = null + private val restoreFilePicker = + registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> + if (uri == null) return@registerForActivityResult + CoroutineScope(Dispatchers.IO).launch { + BackupHelper.restoreAdvancedBackup(this@WelcomeActivity, uri) + + // only skip the welcome activity if the restored backup contains an instance + if (PreferenceHelper.getString(PreferenceKeys.FETCH_INSTANCE, "").isNotEmpty()) { + withContext(Dispatchers.Main) { startMainActivity() } + } + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get() @@ -26,6 +46,7 @@ class WelcomeActivity : BaseActivity() { binding = ActivityWelcomeBinding.inflate(layoutInflater) setContentView(binding.root) + // ALl the binding values are optional due to two different possible layouts (normal, landscape) viewModel!!.instances.observe(this) { instances -> binding.instancesRecycler?.layoutManager = LinearLayoutManager(this@WelcomeActivity) binding.instancesRecycler?.adapter = InstancesAdapter(instances, viewModel!!) { index -> @@ -42,12 +63,20 @@ class WelcomeActivity : BaseActivity() { val selectedInstance = viewModel!!.instances.value!![viewModel!!.selectedInstanceIndex.value!!] PreferenceHelper.putString(PreferenceKeys.FETCH_INSTANCE, selectedInstance.apiUrl) - val mainActivityIntent = Intent(this@WelcomeActivity, MainActivity::class.java) - startActivity(mainActivityIntent) - finish() + startMainActivity() } else { Toast.makeText(this, R.string.choose_instance, Toast.LENGTH_LONG).show() } } + + binding.restore?.setOnClickListener { + restoreFilePicker.launch(BackupRestoreSettings.JSON) + } + } + + private fun startMainActivity() { + val mainActivityIntent = Intent(this@WelcomeActivity, MainActivity::class.java) + startActivity(mainActivityIntent) + finish() } } diff --git a/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt index 37b87be9d1..68f844e0e6 100644 --- a/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt +++ b/app/src/main/java/com/github/libretube/ui/preferences/BackupRestoreSettings.kt @@ -52,10 +52,11 @@ class BackupRestoreSettings : BasePreferenceFragment() { override val titleResourceId: Int = R.string.backup_restore // backup and restore database - private val getBackupFile = registerForActivityResult(ActivityResultContracts.GetContent()) { - it?.let { + private val getBackupFile = + registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> + if (uri == null) return@registerForActivityResult CoroutineScope(Dispatchers.IO).launch { - BackupHelper.restoreAdvancedBackup(requireContext(), it) + BackupHelper.restoreAdvancedBackup(requireContext(), uri) withContext(Dispatchers.Main) { // could fail if fragment is already closed runCatching { @@ -64,12 +65,10 @@ class BackupRestoreSettings : BasePreferenceFragment() { } } } - } - private val createBackupFile = registerForActivityResult(CreateDocument(JSON)) { - it?.let { - CoroutineScope(Dispatchers.IO).launch { - BackupHelper.createAdvancedBackup(requireContext(), it, backupFile) - } + private val createBackupFile = registerForActivityResult(CreateDocument(JSON)) { uri -> + if (uri == null) return@registerForActivityResult + CoroutineScope(Dispatchers.IO).launch { + BackupHelper.createAdvancedBackup(requireContext(), uri, backupFile) } } @@ -78,19 +77,17 @@ class BackupRestoreSettings : BasePreferenceFragment() { */ private val getSubscriptionsFile = registerForActivityResult( ActivityResultContracts.GetContent() - ) { - it?.let { - lifecycleScope.launch(Dispatchers.IO) { - ImportHelper.importSubscriptions(requireActivity(), it, importFormat) - } + ) { uri -> + if (uri == null) return@registerForActivityResult + lifecycleScope.launch(Dispatchers.IO) { + ImportHelper.importSubscriptions(requireActivity(), uri, importFormat) } } - private val createSubscriptionsFile = registerForActivityResult(CreateDocument(JSON)) { - it?.let { - lifecycleScope.launch(Dispatchers.IO) { - ImportHelper.exportSubscriptions(requireActivity(), it, importFormat) - } + private val createSubscriptionsFile = registerForActivityResult(CreateDocument(JSON)) { uri -> + if (uri == null) return@registerForActivityResult + lifecycleScope.launch(Dispatchers.IO) { + ImportHelper.exportSubscriptions(requireActivity(), uri, importFormat) } } @@ -197,6 +194,6 @@ class BackupRestoreSettings : BasePreferenceFragment() { } companion object { - private const val JSON = "application/json" + const val JSON = "application/json" } } diff --git a/app/src/main/res/layout-land/activity_welcome.xml b/app/src/main/res/layout-land/activity_welcome.xml index c7bf5acb1e..f6777cbfd9 100644 --- a/app/src/main/res/layout-land/activity_welcome.xml +++ b/app/src/main/res/layout-land/activity_welcome.xml @@ -66,16 +66,29 @@ - + android:layout_marginBottom="5dp"> + + + + + + diff --git a/app/src/main/res/layout/activity_welcome.xml b/app/src/main/res/layout/activity_welcome.xml index 56b1d15ee1..df99d84306 100644 --- a/app/src/main/res/layout/activity_welcome.xml +++ b/app/src/main/res/layout/activity_welcome.xml @@ -54,15 +54,28 @@ - + android:layout_marginBottom="5dp"> + + + + + + \ No newline at end of file