commit
a07ab64469
26 changed files with 164 additions and 82 deletions
|
@ -105,7 +105,6 @@
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.storage.StorageActivity"
|
android:name=".ui.storage.StorageActivity"
|
||||||
android:theme="@style/AppTheme.NoActionBar"
|
|
||||||
android:windowSoftInputMode="adjustResize" />
|
android:windowSoftInputMode="adjustResize" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
|
@ -115,15 +114,13 @@
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.recoverycode.RecoveryCodeActivity"
|
android:name=".ui.recoverycode.RecoveryCodeActivity"
|
||||||
android:label="@string/recovery_code_title"
|
android:label="@string/recovery_code_title" />
|
||||||
android:theme="@style/AppTheme.NoActionBar" />
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".restore.RestoreActivity"
|
android:name=".restore.RestoreActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/restore_title"
|
android:label="@string/restore_title"
|
||||||
android:permission="com.stevesoltys.seedvault.RESTORE_BACKUP"
|
android:permission="com.stevesoltys.seedvault.RESTORE_BACKUP">
|
||||||
android:theme="@style/AppTheme.NoActionBar">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.stevesoltys.seedvault.RESTORE_BACKUP" />
|
<action android:name="com.stevesoltys.seedvault.RESTORE_BACKUP" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
|
|
@ -20,6 +20,7 @@ import android.os.UserManager
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
import androidx.work.ExistingPeriodicWorkPolicy.UPDATE
|
import androidx.work.ExistingPeriodicWorkPolicy.UPDATE
|
||||||
import androidx.work.WorkManager
|
import androidx.work.WorkManager
|
||||||
|
import com.google.android.material.color.DynamicColors
|
||||||
import com.stevesoltys.seedvault.crypto.cryptoModule
|
import com.stevesoltys.seedvault.crypto.cryptoModule
|
||||||
import com.stevesoltys.seedvault.header.headerModule
|
import com.stevesoltys.seedvault.header.headerModule
|
||||||
import com.stevesoltys.seedvault.metadata.MetadataManager
|
import com.stevesoltys.seedvault.metadata.MetadataManager
|
||||||
|
@ -114,6 +115,7 @@ open class App : Application() {
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
DynamicColors.applyToActivitiesIfAvailable(this)
|
||||||
startKoin()
|
startKoin()
|
||||||
if (isDebugBuild()) {
|
if (isDebugBuild()) {
|
||||||
StrictMode.setThreadPolicy(
|
StrictMode.setThreadPolicy(
|
||||||
|
|
|
@ -14,12 +14,12 @@ import android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
|
||||||
import android.widget.Button
|
import android.widget.Button
|
||||||
import android.widget.ProgressBar
|
import android.widget.ProgressBar
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.core.content.ContextCompat.getColor
|
import androidx.core.content.ContextCompat.getColor
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.stevesoltys.seedvault.R
|
import com.stevesoltys.seedvault.R
|
||||||
import com.stevesoltys.seedvault.ui.AppBackupState.FAILED_NOT_INSTALLED
|
import com.stevesoltys.seedvault.ui.AppBackupState.FAILED_NOT_INSTALLED
|
||||||
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
|
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
|
||||||
|
@ -99,7 +99,7 @@ class RestoreProgressFragment : Fragment() {
|
||||||
// check if any restore failed, because the app is not installed
|
// check if any restore failed, because the app is not installed
|
||||||
val failed = viewModel.restoreProgress.value?.any { it.state == FAILED_NOT_INSTALLED }
|
val failed = viewModel.restoreProgress.value?.any { it.state == FAILED_NOT_INSTALLED }
|
||||||
if (failed != true) return // nothing left to do if there's no failures due to not installed
|
if (failed != true) return // nothing left to do if there's no failures due to not installed
|
||||||
AlertDialog.Builder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setTitle(R.string.restore_restoring_error_title)
|
.setTitle(R.string.restore_restoring_error_title)
|
||||||
.setMessage(R.string.restore_restoring_error_message)
|
.setMessage(R.string.restore_restoring_error_message)
|
||||||
.setPositiveButton(android.R.string.ok) { dialog, _ ->
|
.setPositiveButton(android.R.string.ok) { dialog, _ ->
|
||||||
|
|
|
@ -19,11 +19,11 @@ import android.widget.TextView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import android.widget.Toast.LENGTH_LONG
|
import android.widget.Toast.LENGTH_LONG
|
||||||
import androidx.activity.result.contract.ActivityResultContract
|
import androidx.activity.result.contract.ActivityResultContract
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.stevesoltys.seedvault.R
|
import com.stevesoltys.seedvault.R
|
||||||
import com.stevesoltys.seedvault.restore.RestoreViewModel
|
import com.stevesoltys.seedvault.restore.RestoreViewModel
|
||||||
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
|
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
|
||||||
|
@ -96,7 +96,7 @@ class InstallProgressFragment : Fragment(), InstallItemListener {
|
||||||
adapter.setFinished()
|
adapter.setFinished()
|
||||||
button.isEnabled = true
|
button.isEnabled = true
|
||||||
if (!hasShownFailDialog && installResult.hasFailed) {
|
if (!hasShownFailDialog && installResult.hasFailed) {
|
||||||
AlertDialog.Builder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setIcon(R.drawable.ic_warning)
|
.setIcon(R.drawable.ic_warning)
|
||||||
.setTitle(R.string.restore_installing_error_title)
|
.setTitle(R.string.restore_installing_error_title)
|
||||||
.setMessage(R.string.restore_installing_error_message)
|
.setMessage(R.string.restore_installing_error_message)
|
||||||
|
|
|
@ -8,6 +8,8 @@ package com.stevesoltys.seedvault.settings
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import androidx.preference.ListPreference
|
||||||
|
import androidx.preference.Preference
|
||||||
import androidx.preference.PreferenceCategory
|
import androidx.preference.PreferenceCategory
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
|
@ -16,6 +18,7 @@ import androidx.work.ExistingPeriodicWorkPolicy.UPDATE
|
||||||
import com.stevesoltys.seedvault.R
|
import com.stevesoltys.seedvault.R
|
||||||
import com.stevesoltys.seedvault.permitDiskReads
|
import com.stevesoltys.seedvault.permitDiskReads
|
||||||
import com.stevesoltys.seedvault.plugins.StoragePluginManager
|
import com.stevesoltys.seedvault.plugins.StoragePluginManager
|
||||||
|
import com.stevesoltys.seedvault.settings.preference.M3ListPreference
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
|
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
|
||||||
|
|
||||||
|
@ -42,6 +45,21 @@ class SchedulingFragment : PreferenceFragmentCompat(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onDisplayPreferenceDialog(preference: Preference?) {
|
||||||
|
when (preference) {
|
||||||
|
is ListPreference -> {
|
||||||
|
val dialogFragment = M3ListPreference.newInstance(preference.getKey())
|
||||||
|
dialogFragment.setTargetFragment(this, 0)
|
||||||
|
dialogFragment.show(
|
||||||
|
parentFragmentManager,
|
||||||
|
M3ListPreference.PREFERENCE_DIALOG_FRAGMENT_TAG
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> super.onDisplayPreferenceDialog(preference)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
super.onStart()
|
super.onStart()
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ class SettingsActivity : RequireProvisioningActivity(), OnPreferenceStartFragmen
|
||||||
|
|
||||||
setContentView(R.layout.activity_fragment_container)
|
setContentView(R.layout.activity_fragment_container)
|
||||||
|
|
||||||
|
setSupportActionBar(requireViewById(R.id.toolbar))
|
||||||
supportActionBar!!.setDisplayHomeAsUpEnabled(true)
|
supportActionBar!!.setDisplayHomeAsUpEnabled(true)
|
||||||
|
|
||||||
// always start with settings fragment as a base (when fresh start)
|
// always start with settings fragment as a base (when fresh start)
|
||||||
|
|
|
@ -19,12 +19,12 @@ import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import android.widget.Toast.LENGTH_LONG
|
import android.widget.Toast.LENGTH_LONG
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
import androidx.preference.Preference.OnPreferenceChangeListener
|
import androidx.preference.Preference.OnPreferenceChangeListener
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import androidx.preference.TwoStatePreference
|
import androidx.preference.TwoStatePreference
|
||||||
import androidx.work.WorkInfo
|
import androidx.work.WorkInfo
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.stevesoltys.seedvault.R
|
import com.stevesoltys.seedvault.R
|
||||||
import com.stevesoltys.seedvault.permitDiskReads
|
import com.stevesoltys.seedvault.permitDiskReads
|
||||||
import com.stevesoltys.seedvault.plugins.StoragePluginManager
|
import com.stevesoltys.seedvault.plugins.StoragePluginManager
|
||||||
|
@ -77,7 +77,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
||||||
when (enabled) {
|
when (enabled) {
|
||||||
true -> return@OnPreferenceChangeListener trySetBackupEnabled(true)
|
true -> return@OnPreferenceChangeListener trySetBackupEnabled(true)
|
||||||
false -> {
|
false -> {
|
||||||
AlertDialog.Builder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setIcon(R.drawable.ic_warning)
|
.setIcon(R.drawable.ic_warning)
|
||||||
.setTitle(R.string.settings_backup_dialog_title)
|
.setTitle(R.string.settings_backup_dialog_title)
|
||||||
.setMessage(R.string.settings_backup_dialog_message)
|
.setMessage(R.string.settings_backup_dialog_message)
|
||||||
|
@ -123,7 +123,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
||||||
apkBackup.onPreferenceChangeListener = OnPreferenceChangeListener { _, newValue ->
|
apkBackup.onPreferenceChangeListener = OnPreferenceChangeListener { _, newValue ->
|
||||||
val enable = newValue as Boolean
|
val enable = newValue as Boolean
|
||||||
if (enable) return@OnPreferenceChangeListener true
|
if (enable) return@OnPreferenceChangeListener true
|
||||||
AlertDialog.Builder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setIcon(R.drawable.ic_warning)
|
.setIcon(R.drawable.ic_warning)
|
||||||
.setTitle(R.string.settings_backup_apk_dialog_title)
|
.setTitle(R.string.settings_backup_apk_dialog_title)
|
||||||
.setMessage(R.string.settings_backup_apk_dialog_message)
|
.setMessage(R.string.settings_backup_apk_dialog_message)
|
||||||
|
@ -313,7 +313,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onEnablingStorageBackup() {
|
private fun onEnablingStorageBackup() {
|
||||||
AlertDialog.Builder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setIcon(R.drawable.ic_warning)
|
.setIcon(R.drawable.ic_warning)
|
||||||
.setTitle(R.string.settings_backup_storage_dialog_title)
|
.setTitle(R.string.settings_backup_storage_dialog_title)
|
||||||
.setMessage(R.string.settings_backup_storage_dialog_message)
|
.setMessage(R.string.settings_backup_storage_dialog_message)
|
||||||
|
@ -341,7 +341,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showCodeRegenerationNeededDialog() {
|
private fun showCodeRegenerationNeededDialog() {
|
||||||
AlertDialog.Builder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setIcon(R.drawable.ic_vpn_key)
|
.setIcon(R.drawable.ic_vpn_key)
|
||||||
.setTitle(R.string.settings_backup_new_code_dialog_title)
|
.setTitle(R.string.settings_backup_new_code_dialog_title)
|
||||||
.setMessage(R.string.settings_backup_new_code_dialog_message)
|
.setMessage(R.string.settings_backup_new_code_dialog_message)
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2024 The Calyx Institute
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.stevesoltys.seedvault.settings.preference
|
||||||
|
|
||||||
|
import android.app.Dialog
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.preference.ListPreferenceDialogFragmentCompat
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
|
||||||
|
class M3ListPreference : ListPreferenceDialogFragmentCompat() {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val PREFERENCE_DIALOG_FRAGMENT_TAG = "androidx.preference.PreferenceFragment.DIALOG"
|
||||||
|
|
||||||
|
fun newInstance(key: String?): M3ListPreference {
|
||||||
|
val fragment = M3ListPreference()
|
||||||
|
val bundle = Bundle(1)
|
||||||
|
bundle.putString(ARG_KEY, key)
|
||||||
|
fragment.arguments = bundle
|
||||||
|
return fragment
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
|
val builder = MaterialAlertDialogBuilder(requireContext())
|
||||||
|
.setTitle(preference.dialogTitle)
|
||||||
|
.setIcon(preference.dialogIcon)
|
||||||
|
.setPositiveButton(preference.positiveButtonText, this)
|
||||||
|
.setNegativeButton(preference.negativeButtonText, this)
|
||||||
|
|
||||||
|
val contentView = onCreateDialogView(requireContext())
|
||||||
|
if (contentView != null) {
|
||||||
|
onBindDialogView(contentView)
|
||||||
|
builder.setView(contentView)
|
||||||
|
} else {
|
||||||
|
builder.setMessage(preference.dialogMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
onPrepareDialogBuilder(builder)
|
||||||
|
return builder.create()
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,20 +21,20 @@ import android.view.View.VISIBLE
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.WindowManager.LayoutParams.FLAG_SECURE
|
import android.view.WindowManager.LayoutParams.FLAG_SECURE
|
||||||
import android.widget.ArrayAdapter
|
import android.widget.ArrayAdapter
|
||||||
import android.widget.AutoCompleteTextView
|
|
||||||
import android.widget.Button
|
import android.widget.Button
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import android.widget.Toast.LENGTH_LONG
|
import android.widget.Toast.LENGTH_LONG
|
||||||
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
|
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
import androidx.constraintlayout.widget.ConstraintLayout
|
||||||
import androidx.core.content.ContextCompat.getMainExecutor
|
import androidx.core.content.ContextCompat.getMainExecutor
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import cash.z.ecc.android.bip39.Mnemonics
|
import cash.z.ecc.android.bip39.Mnemonics
|
||||||
import cash.z.ecc.android.bip39.Mnemonics.ChecksumException
|
import cash.z.ecc.android.bip39.Mnemonics.ChecksumException
|
||||||
import cash.z.ecc.android.bip39.Mnemonics.InvalidWordException
|
import cash.z.ecc.android.bip39.Mnemonics.InvalidWordException
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
import com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
import com.google.android.material.textfield.TextInputLayout
|
import com.google.android.material.textfield.TextInputLayout
|
||||||
import com.stevesoltys.seedvault.R
|
import com.stevesoltys.seedvault.R
|
||||||
import com.stevesoltys.seedvault.isDebugBuild
|
import com.stevesoltys.seedvault.isDebugBuild
|
||||||
|
@ -118,7 +118,7 @@ class RecoveryCodeInputFragment : Fragment() {
|
||||||
|
|
||||||
for (i in 0 until WORD_NUM) {
|
for (i in 0 until WORD_NUM) {
|
||||||
val wordLayout = getWordLayout(i)
|
val wordLayout = getWordLayout(i)
|
||||||
val editText = wordLayout.editText as AutoCompleteTextView
|
val editText = wordLayout.editText as MaterialAutoCompleteTextView
|
||||||
editText.onFocusChangeListener = OnFocusChangeListener { _, focus ->
|
editText.onFocusChangeListener = OnFocusChangeListener { _, focus ->
|
||||||
if (!focus) wordLayout.isErrorEnabled = false
|
if (!focus) wordLayout.isErrorEnabled = false
|
||||||
}
|
}
|
||||||
|
@ -207,7 +207,7 @@ class RecoveryCodeInputFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onExistingCodeChecked(verified: Boolean) {
|
private fun onExistingCodeChecked(verified: Boolean) {
|
||||||
AlertDialog.Builder(requireContext()).apply {
|
MaterialAlertDialogBuilder(requireContext()).apply {
|
||||||
if (verified) {
|
if (verified) {
|
||||||
setTitle(R.string.recovery_code_verification_ok_title)
|
setTitle(R.string.recovery_code_verification_ok_title)
|
||||||
setMessage(R.string.recovery_code_verification_ok_message)
|
setMessage(R.string.recovery_code_verification_ok_message)
|
||||||
|
@ -237,7 +237,7 @@ class RecoveryCodeInputFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateNewCode() {
|
private fun generateNewCode() {
|
||||||
AlertDialog.Builder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setIcon(R.drawable.ic_warning)
|
.setIcon(R.drawable.ic_warning)
|
||||||
.setTitle(R.string.recovery_code_verification_new_dialog_title)
|
.setTitle(R.string.recovery_code_verification_new_dialog_title)
|
||||||
.setMessage(R.string.recovery_code_verification_new_dialog_message)
|
.setMessage(R.string.recovery_code_verification_new_dialog_message)
|
||||||
|
|
|
@ -16,7 +16,7 @@ import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.result.contract.ActivityResultContracts.OpenDocumentTree
|
import androidx.activity.result.contract.ActivityResultContracts.OpenDocumentTree
|
||||||
import androidx.annotation.CallSuper
|
import androidx.annotation.CallSuper
|
||||||
import androidx.appcompat.app.AlertDialog
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.stevesoltys.seedvault.R
|
import com.stevesoltys.seedvault.R
|
||||||
import com.stevesoltys.seedvault.plugins.saf.StorageRootResolver
|
import com.stevesoltys.seedvault.plugins.saf.StorageRootResolver
|
||||||
import com.stevesoltys.seedvault.ui.BackupActivity
|
import com.stevesoltys.seedvault.ui.BackupActivity
|
||||||
|
@ -89,7 +89,7 @@ class StorageActivity : BackupActivity() {
|
||||||
|
|
||||||
private fun onInvalidLocation(errorMsg: String) {
|
private fun onInvalidLocation(errorMsg: String) {
|
||||||
if (viewModel.isRestoreOperation) {
|
if (viewModel.isRestoreOperation) {
|
||||||
val dialog = AlertDialog.Builder(this)
|
val dialog = MaterialAlertDialogBuilder(this)
|
||||||
.setTitle(getString(R.string.restore_invalid_location_title))
|
.setTitle(getString(R.string.restore_invalid_location_title))
|
||||||
.setMessage(errorMsg)
|
.setMessage(errorMsg)
|
||||||
.setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() }
|
.setPositiveButton(android.R.string.ok) { dialog, _ -> dialog.dismiss() }
|
||||||
|
|
|
@ -15,9 +15,9 @@ import android.view.View.VISIBLE
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.recyclerview.widget.RecyclerView.Adapter
|
import androidx.recyclerview.widget.RecyclerView.Adapter
|
||||||
import androidx.recyclerview.widget.RecyclerView.ViewHolder
|
import androidx.recyclerview.widget.RecyclerView.ViewHolder
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.stevesoltys.seedvault.R
|
import com.stevesoltys.seedvault.R
|
||||||
import com.stevesoltys.seedvault.ui.storage.StorageOption.SafOption
|
import com.stevesoltys.seedvault.ui.storage.StorageOption.SafOption
|
||||||
import com.stevesoltys.seedvault.ui.storage.StorageOptionAdapter.StorageOptionViewHolder
|
import com.stevesoltys.seedvault.ui.storage.StorageOptionAdapter.StorageOptionViewHolder
|
||||||
|
@ -91,7 +91,7 @@ internal class StorageOptionAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showWarningDialog(context: Context, item: StorageOption) {
|
private fun showWarningDialog(context: Context, item: StorageOption) {
|
||||||
AlertDialog.Builder(context)
|
MaterialAlertDialogBuilder(context)
|
||||||
.setTitle(R.string.storage_internal_warning_title)
|
.setTitle(R.string.storage_internal_warning_title)
|
||||||
.setMessage(R.string.storage_internal_warning_message)
|
.setMessage(R.string.storage_internal_warning_message)
|
||||||
.setPositiveButton(R.string.storage_internal_warning_choose_other) { dialog, _ ->
|
.setPositiveButton(R.string.storage_internal_warning_choose_other) { dialog, _ ->
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:tint="?attr/colorControlNormal"
|
android:tint="@color/accent_primary"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:tint="?attr/colorControlNormal"
|
android:tint="@color/accent_primary"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:tint="?attr/colorControlNormal"
|
android:tint="@color/accent_primary"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:tint="?attr/colorControlNormal"
|
android:tint="@color/accent_primary"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:tint="?attr/colorControlNormal"
|
android:tint="@color/accent_primary"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
|
|
|
@ -3,7 +3,21 @@
|
||||||
SPDX-FileCopyrightText: 2020 The Calyx Institute
|
SPDX-FileCopyrightText: 2020 The Calyx Institute
|
||||||
SPDX-License-Identifier: Apache-2.0
|
SPDX-License-Identifier: Apache-2.0
|
||||||
-->
|
-->
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
android:theme="?attr/actionBarTheme" />
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
android:id="@+id/fragment"
|
android:id="@+id/fragment"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent" />
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
|
@ -16,7 +16,8 @@
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@color/background">
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/imageView"
|
android:id="@+id/imageView"
|
||||||
|
|
8
app/src/main/res/layout/preference_switch.xml
Normal file
8
app/src/main/res/layout/preference_switch.xml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<com.google.android.material.materialswitch.MaterialSwitch xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/switchWidget"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@null"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false" />
|
|
@ -23,8 +23,9 @@
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintVertical_chainStyle="spread_inside">
|
app:layout_constraintVertical_chainStyle="spread_inside">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput1"
|
android:id="@+id/wordInput1"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -45,8 +46,9 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout1">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout1">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput3"
|
android:id="@+id/wordInput3"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -67,8 +69,9 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout3">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout3">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput5"
|
android:id="@+id/wordInput5"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -89,8 +92,9 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout5">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout5">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput7"
|
android:id="@+id/wordInput7"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -111,8 +115,9 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout7">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout7">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput9"
|
android:id="@+id/wordInput9"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -133,8 +138,9 @@
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout9">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout9">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput11"
|
android:id="@+id/wordInput11"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -156,8 +162,9 @@
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintVertical_chainStyle="spread_inside">
|
app:layout_constraintVertical_chainStyle="spread_inside">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput2"
|
android:id="@+id/wordInput2"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -178,8 +185,9 @@
|
||||||
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout2">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout2">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput4"
|
android:id="@+id/wordInput4"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -200,8 +208,9 @@
|
||||||
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout4">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout4">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput6"
|
android:id="@+id/wordInput6"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -222,8 +231,9 @@
|
||||||
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout6">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout6">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput8"
|
android:id="@+id/wordInput8"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -244,8 +254,9 @@
|
||||||
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout8">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout8">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput10"
|
android:id="@+id/wordInput10"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
@ -266,8 +277,9 @@
|
||||||
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
app:layout_constraintStart_toEndOf="@+id/wordLayout1"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/wordLayout10">
|
app:layout_constraintTop_toBottomOf="@+id/wordLayout10">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
||||||
android:id="@+id/wordInput12"
|
android:id="@+id/wordInput12"
|
||||||
|
style="@style/Widget.Material3.AutoCompleteTextView.OutlinedBox"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:completionThreshold="1"
|
android:completionThreshold="1"
|
||||||
|
|
|
@ -6,9 +6,7 @@
|
||||||
<resources>
|
<resources>
|
||||||
<!-- AOSP colors -->
|
<!-- AOSP colors -->
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#36 -->
|
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#36 -->
|
||||||
<color name="accent">@android:color/system_accent1_100</color>
|
<color name="accent_primary">@android:color/system_accent1_100</color>
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#22 -->
|
|
||||||
<color name="primary">@android:color/system_neutral1_900</color>
|
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#51 -->
|
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#51 -->
|
||||||
<color name="background">@android:color/system_neutral1_900</color>
|
<color name="background">@android:color/system_neutral1_900</color>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -6,22 +6,14 @@
|
||||||
<resources>
|
<resources>
|
||||||
<!-- AOSP colors -->
|
<!-- AOSP colors -->
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#35 -->
|
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#35 -->
|
||||||
<color name="accent">@android:color/system_accent1_600</color>
|
<color name="accent_primary">@android:color/system_accent1_600</color>
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#23 -->
|
|
||||||
<color name="primary">@android:color/system_neutral1_50</color>
|
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#27 -->
|
|
||||||
<color name="primaryDark">@color/primary</color>
|
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#52 -->
|
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#52 -->
|
||||||
<color name="background">@android:color/system_neutral1_50</color>
|
<color name="background">@android:color/system_neutral1_50</color>
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#21 -->
|
|
||||||
<color name="actionBarPrimary">@color/primary</color>
|
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#23 -->
|
|
||||||
<color name="statusBarColor">@color/primary</color>
|
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#69 -->
|
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#69 -->
|
||||||
<!-- private resource, access it from colorError attribute instead -->
|
<!-- private resource, access it directly -->
|
||||||
<color name="red">@*android:color/error_color_device_default_dark</color>
|
<color name="red">#ff7043</color>
|
||||||
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#35 -->
|
<!-- https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-14.0.0_r1/core/res/res/values/colors_device_defaults.xml#35 -->
|
||||||
<color name="ic_launcher_background">@color/accent</color>
|
<color name="ic_launcher_background">@color/accent_primary</color>
|
||||||
|
|
||||||
<!-- Custom colors -->
|
<!-- Custom colors -->
|
||||||
<color name="divider">#20ffffff</color>
|
<color name="divider">#20ffffff</color>
|
||||||
|
|
|
@ -2,30 +2,19 @@
|
||||||
SPDX-FileCopyrightText: 2020 The Calyx Institute
|
SPDX-FileCopyrightText: 2020 The Calyx Institute
|
||||||
SPDX-License-Identifier: Apache-2.0
|
SPDX-License-Identifier: Apache-2.0
|
||||||
-->
|
-->
|
||||||
<resources>
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<style name="AppTheme" parent="@style/Theme.AppCompat.DayNight">
|
<style name="AppTheme" parent="@style/Theme.Material3.DayNight.NoActionBar">
|
||||||
<item name="colorPrimary">@color/primary</item>
|
<item name="colorPrimary">@color/accent_primary</item>
|
||||||
<item name="colorPrimaryDark">@color/primaryDark</item>
|
<item name="colorAccent">@color/accent_primary</item>
|
||||||
<item name="colorAccent">@color/accent</item>
|
|
||||||
<item name="colorError">@color/red</item>
|
<item name="colorError">@color/red</item>
|
||||||
<item name="android:windowBackground">@color/background</item>
|
<item name="android:windowBackground">@color/background</item>
|
||||||
<item name="fontFamily">@*android:string/config_bodyFontFamily</item>
|
<item name="fontFamily">@*android:string/config_bodyFontFamily</item>
|
||||||
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
|
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
|
||||||
<item name="android:windowLightStatusBar">@bool/isLight</item>
|
<item name="android:windowLightStatusBar">@bool/isLight</item>
|
||||||
<item name="android:statusBarColor">@color/statusBarColor</item>
|
<item name="android:statusBarColor">@color/background</item>
|
||||||
<item name="actionBarTheme">@style/Theme.ActionBar</item>
|
|
||||||
<item name="android:windowLightNavigationBar">@bool/isLight</item>
|
<item name="android:windowLightNavigationBar">@bool/isLight</item>
|
||||||
<item name="android:navigationBarColor">@color/primary</item>
|
<item name="android:navigationBarColor">@color/background</item>
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="Theme.ActionBar" parent="Theme.AppCompat.DayNight.DarkActionBar">
|
|
||||||
<item name="colorPrimary">@color/actionBarPrimary</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="AppTheme.NoActionBar" parent="AppTheme">
|
|
||||||
<item name="windowActionBar">false</item>
|
|
||||||
<item name="windowNoTitle">true</item>
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- Copied from Settings -->
|
<!-- Copied from Settings -->
|
||||||
|
@ -85,7 +74,7 @@
|
||||||
<item name="android:textAlignment">gravity</item>
|
<item name="android:textAlignment">gravity</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="SudPrimaryButton" parent="Widget.AppCompat.Button.Colored">
|
<style name="SudPrimaryButton" parent="Widget.Material3.Button.UnelevatedButton">
|
||||||
<item name="android:buttonStyle">@style/SudPrimaryButton</item>
|
<item name="android:buttonStyle">@style/SudPrimaryButton</item>
|
||||||
<item name="android:theme">@style/SudPrimaryButton</item>
|
<item name="android:theme">@style/SudPrimaryButton</item>
|
||||||
<item name="buttonStyle">@style/SudPrimaryButton</item>
|
<item name="buttonStyle">@style/SudPrimaryButton</item>
|
||||||
|
@ -100,7 +89,7 @@
|
||||||
<item name="textAllCaps">false</item>
|
<item name="textAllCaps">false</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="SudSecondaryButton" parent="Widget.AppCompat.Button.Borderless.Colored">
|
<style name="SudSecondaryButton" parent="Widget.Material3.Button.TextButton">
|
||||||
<item name="android:buttonStyle">@style/SudSecondaryButton</item>
|
<item name="android:buttonStyle">@style/SudSecondaryButton</item>
|
||||||
<item name="android:theme">@style/SudSecondaryButton</item>
|
<item name="android:theme">@style/SudSecondaryButton</item>
|
||||||
<item name="buttonStyle">@style/SudSecondaryButton</item>
|
<item name="buttonStyle">@style/SudSecondaryButton</item>
|
||||||
|
@ -111,4 +100,8 @@
|
||||||
<item name="android:minHeight">56dp</item>
|
<item name="android:minHeight">56dp</item>
|
||||||
<item name="textAllCaps">false</item>
|
<item name="textAllCaps">false</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="Preference.SwitchPreferenceCompat" parent="@style/Preference.SwitchPreferenceCompat.Material" tools:ignore="ResourceCycle">
|
||||||
|
<item name="widgetLayout">@layout/preference_switch</item>
|
||||||
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -19,6 +19,7 @@ import android.widget.Toast
|
||||||
import android.widget.Toast.LENGTH_SHORT
|
import android.widget.Toast.LENGTH_SHORT
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import de.grobox.storagebackuptester.MainViewModel
|
import de.grobox.storagebackuptester.MainViewModel
|
||||||
import de.grobox.storagebackuptester.R
|
import de.grobox.storagebackuptester.R
|
||||||
import de.grobox.storagebackuptester.restore.DemoSnapshotFragment
|
import de.grobox.storagebackuptester.restore.DemoSnapshotFragment
|
||||||
|
@ -133,7 +134,7 @@ class SettingsFragment : BackupContentFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onRestoreClicked() {
|
private fun onRestoreClicked() {
|
||||||
AlertDialog.Builder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setIcon(android.R.drawable.stat_sys_warning)
|
.setIcon(android.R.drawable.stat_sys_warning)
|
||||||
.setTitle("Warning")
|
.setTitle("Warning")
|
||||||
.setMessage("This will override data and should only be used on a clean phone. Not the one you just made the backup on.")
|
.setMessage("This will override data and should only be used on a clean phone. Not the one you just made the backup on.")
|
||||||
|
|
|
@ -12,9 +12,9 @@ import android.view.ViewGroup
|
||||||
import android.widget.ImageButton
|
import android.widget.ImageButton
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.widget.SwitchCompat
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import androidx.recyclerview.widget.RecyclerView.Adapter
|
import androidx.recyclerview.widget.RecyclerView.Adapter
|
||||||
|
import com.google.android.material.materialswitch.MaterialSwitch
|
||||||
import org.calyxos.backup.storage.R
|
import org.calyxos.backup.storage.R
|
||||||
import org.calyxos.backup.storage.api.EXTERNAL_STORAGE_PROVIDER_AUTHORITY
|
import org.calyxos.backup.storage.api.EXTERNAL_STORAGE_PROVIDER_AUTHORITY
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ internal class BackupContentAdapter(private val listener: ContentClickListener)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal inner class MediaHolder(view: View) : ViewHolder(view) {
|
internal inner class MediaHolder(view: View) : ViewHolder(view) {
|
||||||
private val switch: SwitchCompat = view.findViewById(R.id.switchView)
|
private val switch: MaterialSwitch = view.findViewById(R.id.switchView)
|
||||||
|
|
||||||
override fun bind(item: BackupContentItem) {
|
override fun bind(item: BackupContentItem) {
|
||||||
super.bind(item)
|
super.bind(item)
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:text="@string/content_videos" />
|
tools:text="@string/content_videos" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.SwitchCompat
|
<com.google.android.material.materialswitch.MaterialSwitch
|
||||||
android:id="@+id/switchView"
|
android:id="@+id/switchView"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
Loading…
Reference in a new issue