Convert AddAccountDialog to compose

pull/1967/head
Alex Baker 2 years ago
parent 68b91ed2c7
commit e16f076fb7

@ -0,0 +1,52 @@
package org.tasks.compose
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
@Composable
fun SyncAccount(
@StringRes title: Int,
@StringRes description: Int,
@DrawableRes icon: Int,
tint: Color? = null,
onClick: () -> Unit,
) {
Row(
modifier = Modifier
.clickable { onClick() }
.padding(vertical = 8.dp, horizontal = 16.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = painterResource(id = icon),
contentDescription = stringResource(id = title),
tint = tint ?: Color.Unspecified,
modifier = Modifier.padding(end = 16.dp).size(48.dp),
)
Column {
Text(
text = stringResource(id = title),
style = MaterialTheme.typography.body1,
)
Text(
text = stringResource(id = description),
style = MaterialTheme.typography.body2,
)
}
}
}

@ -1,18 +0,0 @@
package org.tasks.extensions
import android.content.res.Resources
object Resources {
fun Resources.getMutableStringList(id: Int): MutableList<String> =
getStringArray(id).toMutableList()
fun Resources.getMutableIntList(id: Int): MutableList<Int> {
val typedArray = obtainTypedArray(id)
val result = IntArray(typedArray.length())
for (i in result.indices) {
result[i] = typedArray.getResourceId(i, 0)
}
typedArray.recycle()
return result.toMutableList()
}
}

@ -3,27 +3,29 @@ package org.tasks.sync
import android.app.Dialog
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ContentAlpha
import androidx.compose.material.MaterialTheme
import androidx.compose.ui.Modifier
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import com.google.android.material.composethemeadapter.MdcTheme
import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.BuildConfig
import org.tasks.R
import org.tasks.auth.SignInActivity
import org.tasks.caldav.CaldavAccountSettingsActivity
import org.tasks.compose.SyncAccount
import org.tasks.dialogs.DialogBuilder
import org.tasks.etebase.EtebaseAccountSettingsActivity
import org.tasks.extensions.Context.openUri
import org.tasks.extensions.Resources.getMutableIntList
import org.tasks.extensions.Resources.getMutableStringList
import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_CALDAV_SETTINGS
import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_GOOGLE_TASKS
import org.tasks.preferences.fragments.MainSettingsFragment.Companion.REQUEST_TASKS_ORG
import org.tasks.themes.DrawableUtil
import timber.log.Timber
import javax.inject.Inject
@AndroidEntryPoint
@ -35,63 +37,101 @@ class AddAccountDialog : DialogFragment() {
get() = arguments?.getBoolean(EXTRA_HAS_TASKS_ACCOUNT) ?: false
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val services = resources.getMutableStringList(R.array.synchronization_services)
val descriptions = resources.getMutableStringList(R.array.synchronization_services_description)
val icons = resources.getMutableIntList(R.array.synchronization_services_icons)
if (hasTasksAccount) {
services.removeAt(0)
descriptions.removeAt(0)
icons.removeAt(0)
}
val adapter: ArrayAdapter<String> = object : ArrayAdapter<String>(
requireActivity(), R.layout.simple_list_item_2_themed, R.id.text1, services) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = super.getView(position, convertView, parent)
view.findViewById<TextView>(R.id.text1).text = services[position]
view.findViewById<TextView>(R.id.text2).text = descriptions[position]
val icon = view.findViewById<ImageView>(R.id.image_view)
val iconResId = icons[position]
icon.setImageDrawable(DrawableUtil.getWrapped(context, iconResId))
if (iconResId == R.drawable.ic_webdav_logo) {
icon.drawable.setTint(context.getColor(R.color.icon_tint))
}
return view
}
}
return dialogBuilder
.newDialog()
.setTitle(R.string.choose_synchronization_service)
.setSingleChoiceItems(adapter, -1) { dialog, which ->
when (if (hasTasksAccount) which + 1 else which) {
0 -> activity?.startActivityForResult(
Intent(activity, SignInActivity::class.java),
REQUEST_TASKS_ORG)
1 -> activity?.startActivityForResult(
Intent(activity, GtasksLoginActivity::class.java),
REQUEST_GOOGLE_TASKS)
2 -> activity?.openUri(R.string.url_davx5)
3 -> activity?.startActivityForResult(
Intent(activity, CaldavAccountSettingsActivity::class.java),
REQUEST_CALDAV_SETTINGS)
4 -> activity?.startActivityForResult(
Intent(activity, EtebaseAccountSettingsActivity::class.java),
REQUEST_CALDAV_SETTINGS)
5 -> activity?.openUri(R.string.url_decsync)
.newDialog()
.setTitle(R.string.choose_synchronization_service)
.setContent {
MdcTheme {
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
if (!hasTasksAccount) {
SyncAccount(
title = R.string.tasks_org,
description = R.string.tasks_org_description,
icon = R.drawable.ic_round_icon,
onClick = {
activity?.startActivityForResult(
Intent(activity, SignInActivity::class.java),
REQUEST_TASKS_ORG
)
dismiss()
}
)
}
SyncAccount(
title = R.string.gtasks_GPr_header,
description = R.string.google_tasks_selection_description,
icon = R.drawable.ic_google,
onClick = {
activity?.startActivityForResult(
Intent(activity, GtasksLoginActivity::class.java),
REQUEST_GOOGLE_TASKS
)
dismiss()
}
)
SyncAccount(
title = R.string.davx5,
description = R.string.davx5_selection_description,
icon = R.drawable.ic_davx5_icon_green_bg,
onClick = {
activity?.openUri(R.string.url_davx5)
dismiss()
}
)
SyncAccount(
title = R.string.caldav,
description = R.string.caldav_selection_description,
icon = R.drawable.ic_webdav_logo,
tint = MaterialTheme.colors.onSurface.copy(
alpha = ContentAlpha.medium
),
onClick = {
activity?.startActivityForResult(
Intent(activity, CaldavAccountSettingsActivity::class.java),
REQUEST_CALDAV_SETTINGS
)
dismiss()
}
)
SyncAccount(
title = R.string.etesync,
description = R.string.etesync_selection_description,
icon = R.drawable.ic_etesync,
onClick = {
activity?.startActivityForResult(
Intent(
activity,
EtebaseAccountSettingsActivity::class.java
),
REQUEST_CALDAV_SETTINGS
)
dismiss()
}
)
SyncAccount(
title = R.string.decsync,
description = R.string.decsync_selection_description,
icon = R.drawable.ic_decsync,
onClick = {
activity?.openUri(R.string.url_decsync)
dismiss()
}
)
}
dialog.dismiss()
}
.setNeutralButton(R.string.help) { _, _ -> activity?.openUri(R.string.help_url_sync) }
.setNegativeButton(R.string.cancel, null)
.show()
}
.setNeutralButton(R.string.help) { _, _ -> activity?.openUri(R.string.help_url_sync) }
.setNegativeButton(R.string.cancel, null)
.show()
}
companion object {
private const val EXTRA_HAS_TASKS_ACCOUNT = "extra_has_tasks_account"
fun newAccountDialog(
targetFragment: Fragment,
rc: Int,
hasTasksAccount: Boolean
targetFragment: Fragment,
rc: Int,
hasTasksAccount: Boolean
): AddAccountDialog {
val dialog = AddAccountDialog()
dialog.arguments = Bundle().apply {

@ -126,33 +126,6 @@
<item>3</item>
</string-array>
<string-array name="synchronization_services">
<item>@string/tasks_org</item>
<item>@string/gtasks_GPr_header</item>
<item>@string/davx5</item>
<item>@string/caldav</item>
<item>@string/etesync</item>
<item>@string/decsync</item>
</string-array>
<string-array name="synchronization_services_description">
<item>@string/tasks_org_description</item>
<item>@string/google_tasks_selection_description</item>
<item>@string/davx5_selection_description</item>
<item>@string/caldav_selection_description</item>
<item>@string/etesync_selection_description</item>
<item>@string/decsync_selection_description</item>
</string-array>
<array name="synchronization_services_icons">
<item>@drawable/ic_round_icon</item>
<item>@drawable/ic_google</item>
<item>@drawable/ic_davx5_icon_green_bg</item>
<item>@drawable/ic_webdav_logo</item>
<item>@drawable/ic_etesync</item>
<item>@drawable/ic_decsync</item>
</array>
<string-array name="chip_appearance">
<item>@string/chip_appearance_text_and_icon</item>
<item>@string/chip_appearance_text_only</item>

Loading…
Cancel
Save