[Welcome Activity] Add button to restore backup and skip instance selection

This commit is contained in:
Bnyro 2023-06-27 11:12:43 +02:00
parent 1cffeeb9c9
commit ee302dc166
4 changed files with 91 additions and 39 deletions

View File

@ -3,6 +3,7 @@ package com.github.libretube.ui.activities
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.widget.Toast import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.get import androidx.lifecycle.get
@ -10,15 +11,34 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.constants.PreferenceKeys import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.databinding.ActivityWelcomeBinding import com.github.libretube.databinding.ActivityWelcomeBinding
import com.github.libretube.helpers.BackupHelper
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.adapters.InstancesAdapter import com.github.libretube.ui.adapters.InstancesAdapter
import com.github.libretube.ui.base.BaseActivity import com.github.libretube.ui.base.BaseActivity
import com.github.libretube.ui.models.WelcomeModel 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() { class WelcomeActivity : BaseActivity() {
private lateinit var binding: ActivityWelcomeBinding private lateinit var binding: ActivityWelcomeBinding
private var viewModel: WelcomeModel? = null 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?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get() viewModel = ViewModelProvider(this).get()
@ -26,6 +46,7 @@ class WelcomeActivity : BaseActivity() {
binding = ActivityWelcomeBinding.inflate(layoutInflater) binding = ActivityWelcomeBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
// ALl the binding values are optional due to two different possible layouts (normal, landscape)
viewModel!!.instances.observe(this) { instances -> viewModel!!.instances.observe(this) { instances ->
binding.instancesRecycler?.layoutManager = LinearLayoutManager(this@WelcomeActivity) binding.instancesRecycler?.layoutManager = LinearLayoutManager(this@WelcomeActivity)
binding.instancesRecycler?.adapter = InstancesAdapter(instances, viewModel!!) { index -> binding.instancesRecycler?.adapter = InstancesAdapter(instances, viewModel!!) { index ->
@ -42,12 +63,20 @@ class WelcomeActivity : BaseActivity() {
val selectedInstance = val selectedInstance =
viewModel!!.instances.value!![viewModel!!.selectedInstanceIndex.value!!] viewModel!!.instances.value!![viewModel!!.selectedInstanceIndex.value!!]
PreferenceHelper.putString(PreferenceKeys.FETCH_INSTANCE, selectedInstance.apiUrl) PreferenceHelper.putString(PreferenceKeys.FETCH_INSTANCE, selectedInstance.apiUrl)
val mainActivityIntent = Intent(this@WelcomeActivity, MainActivity::class.java) startMainActivity()
startActivity(mainActivityIntent)
finish()
} else { } else {
Toast.makeText(this, R.string.choose_instance, Toast.LENGTH_LONG).show() 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()
} }
} }

View File

@ -52,10 +52,11 @@ class BackupRestoreSettings : BasePreferenceFragment() {
override val titleResourceId: Int = R.string.backup_restore override val titleResourceId: Int = R.string.backup_restore
// backup and restore database // backup and restore database
private val getBackupFile = registerForActivityResult(ActivityResultContracts.GetContent()) { private val getBackupFile =
it?.let { registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
if (uri == null) return@registerForActivityResult
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
BackupHelper.restoreAdvancedBackup(requireContext(), it) BackupHelper.restoreAdvancedBackup(requireContext(), uri)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
// could fail if fragment is already closed // could fail if fragment is already closed
runCatching { runCatching {
@ -64,12 +65,10 @@ class BackupRestoreSettings : BasePreferenceFragment() {
} }
} }
} }
} private val createBackupFile = registerForActivityResult(CreateDocument(JSON)) { uri ->
private val createBackupFile = registerForActivityResult(CreateDocument(JSON)) { if (uri == null) return@registerForActivityResult
it?.let { CoroutineScope(Dispatchers.IO).launch {
CoroutineScope(Dispatchers.IO).launch { BackupHelper.createAdvancedBackup(requireContext(), uri, backupFile)
BackupHelper.createAdvancedBackup(requireContext(), it, backupFile)
}
} }
} }
@ -78,19 +77,17 @@ class BackupRestoreSettings : BasePreferenceFragment() {
*/ */
private val getSubscriptionsFile = registerForActivityResult( private val getSubscriptionsFile = registerForActivityResult(
ActivityResultContracts.GetContent() ActivityResultContracts.GetContent()
) { ) { uri ->
it?.let { if (uri == null) return@registerForActivityResult
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
ImportHelper.importSubscriptions(requireActivity(), it, importFormat) ImportHelper.importSubscriptions(requireActivity(), uri, importFormat)
}
} }
} }
private val createSubscriptionsFile = registerForActivityResult(CreateDocument(JSON)) { private val createSubscriptionsFile = registerForActivityResult(CreateDocument(JSON)) { uri ->
it?.let { if (uri == null) return@registerForActivityResult
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
ImportHelper.exportSubscriptions(requireActivity(), it, importFormat) ImportHelper.exportSubscriptions(requireActivity(), uri, importFormat)
}
} }
} }
@ -197,6 +194,6 @@ class BackupRestoreSettings : BasePreferenceFragment() {
} }
companion object { companion object {
private const val JSON = "application/json" const val JSON = "application/json"
} }
} }

View File

@ -66,16 +66,29 @@
</FrameLayout> </FrameLayout>
<com.google.android.material.button.MaterialButton <FrameLayout
android:id="@id/okay" android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end" android:layout_marginHorizontal="15dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginEnd="15dp" android:layout_marginBottom="5dp">
android:layout_marginBottom="5dp"
android:alpha="0.5" <com.google.android.material.button.MaterialButton
android:text="@string/okay" /> android:id="@id/restore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:text="@string/restore" />
<com.google.android.material.button.MaterialButton
android:id="@id/okay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:alpha="0.5"
android:text="@string/okay" />
</FrameLayout>
</LinearLayout> </LinearLayout>

View File

@ -54,15 +54,28 @@
</FrameLayout> </FrameLayout>
<com.google.android.material.button.MaterialButton <FrameLayout
android:id="@+id/okay" android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end" android:layout_marginHorizontal="15dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginEnd="15dp" android:layout_marginBottom="5dp">
android:layout_marginBottom="5dp"
android:alpha="0.5" <com.google.android.material.button.MaterialButton
android:text="@string/okay" /> android:id="@+id/restore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:text="@string/restore" />
<com.google.android.material.button.MaterialButton
android:id="@+id/okay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:alpha="0.5"
android:text="@string/okay" />
</FrameLayout>
</LinearLayout> </LinearLayout>