proton-mail-android/app/src/main/java/ch/protonmail/android/activities/DefaultAddressActivity.kt

204 lines
7.8 KiB
Kotlin

/*
* Copyright (c) 2022 Proton AG
*
* This file is part of Proton Mail.
*
* Proton Mail is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Proton Mail is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Proton Mail. If not, see https://www.gnu.org/licenses/.
*/
package ch.protonmail.android.activities
import android.app.Activity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.widget.LinearLayout
import android.widget.RadioButton
import android.widget.RadioGroup
import android.widget.TextView
import androidx.core.content.res.ResourcesCompat
import androidx.core.view.isVisible
import butterknife.OnClick
import ch.protonmail.android.R
import ch.protonmail.android.core.ProtonMailApplication
import ch.protonmail.android.domain.entity.user.Address
import ch.protonmail.android.domain.entity.user.User
import ch.protonmail.android.domain.entity.user.isPaidUser
import ch.protonmail.android.jobs.UpdateSettingsJob
import ch.protonmail.android.utils.MessageUtils
import ch.protonmail.android.utils.extensions.showToast
class DefaultAddressActivity : BaseActivity() {
private var mInflater: LayoutInflater? = null
private lateinit var mAllRadioButtons: MutableList<RadioButton>
private var mAvailableAddressesMap: MutableMap<Address, RadioButton>? = null
private var mSelectedAddress: Address? = null
private var mUser: User? = null
private var mCurrentSelectedRadioButton: RadioButton? = null
private val addressChooser by lazy { findViewById<LinearLayout>(R.id.addressChooser) }
private val defaultAddress by lazy { findViewById<TextView>(R.id.defaultAddress) }
private val availableAddresses by lazy { findViewById<RadioGroup>(R.id.availableAddresses) }
private val inactiveAddresses by lazy { findViewById<LinearLayout>(R.id.inactiveAddresses) }
private val noAvailableAddresses by lazy { findViewById<TextView>(R.id.noAvailableAddresses) }
private val noInactiveAddresses by lazy { findViewById<TextView>(R.id.noInactiveAddresses) }
private val radioButtonClick = View.OnClickListener { v ->
val selectedAddressRadioButton = v as RadioButton
for ((address, radioButton) in mAvailableAddressesMap!!) {
if (radioButton.id == selectedAddressRadioButton.id) {
// this is selected
if (MessageUtils.isPmMeAddress(address.email.s) && mUser?.isPaidUser() == false) {
mCurrentSelectedRadioButton?.isChecked = true
showToast(String.format(getString(R.string.pm_me_can_not_be_default), address.email.s))
return@OnClickListener
}
mSelectedAddress = address
mCurrentSelectedRadioButton = selectedAddressRadioButton
clearSelection()
selectedAddressRadioButton.isChecked = true
defaultAddress.text = mSelectedAddress?.email?.s
val user = mUserManager.currentUser
val selectedAddress = mSelectedAddress
if (selectedAddress != null && user?.addresses?.primary?.id?.id != selectedAddress.id.id) {
// Add first the selected address.
val addressIds = mutableSetOf(selectedAddress.id.id)
// Add all other.
user?.addresses?.addresses?.forEach { addressIds.add(it.value.id.id) }
//
val job = UpdateSettingsJob(addressIds = addressIds.toList())
mJobManager.addJobInBackground(job)
}
break
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val actionBar = supportActionBar
actionBar?.setDisplayHomeAsUpEnabled(true)
val elevation = resources.getDimension(R.dimen.action_bar_elevation)
actionBar?.elevation = elevation
mAvailableAddressesMap = HashMap()
mAllRadioButtons = ArrayList()
mUser = mUserManager.currentUser
val addresses = mUser?.addresses?.addresses
mInflater = LayoutInflater.from(this)
renderAddresses(addresses)
}
override fun onStart() {
super.onStart()
ProtonMailApplication.getApplication().bus.register(this)
}
override fun onStop() {
super.onStop()
ProtonMailApplication.getApplication().bus.unregister(this)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val itemId = item.itemId
if (itemId == android.R.id.home) {
saveAndFinish()
return true
}
return super.onOptionsItemSelected(item)
}
override fun onBackPressed() {
saveAndFinish()
}
override fun getLayoutId() = R.layout.activity_default_address
@OnClick(R.id.defaultAddress)
fun onDefaultAddressClicked() {
val icon = ResourcesCompat.getDrawable(
resources, if (!addressChooser.isVisible) R.drawable.ic_chevron_down else R.drawable.ic_chevron_up, null
)?.mutate()
defaultAddress.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, icon, null)
addressChooser.isVisible = !addressChooser.isVisible
}
private fun clearSelection() {
availableAddresses.clearCheck()
for (radioButton in mAllRadioButtons) {
radioButton.isChecked = false
}
}
private fun renderAddresses(addresses: Map<Int, Address>?) {
mSelectedAddress = addresses?.values?.elementAt(0)
defaultAddress.text = mSelectedAddress?.email?.s
var mNoAvailableAddresses = true
var mNoInactiveAddresses = true
addresses?.values?.forEachIndexed { index, address ->
val aliasAvailable = address.enabled && address.allowedToReceive
var addressRadio: RadioButton? = null
var inactiveAddress: TextView? = null
if (aliasAvailable) {
addressRadio = mInflater?.inflate(
R.layout.radio_button_list_item,
availableAddresses,
false
) as RadioButton
addressRadio.text = address.email.s
addressRadio.isChecked = index == 0
if (index == 0) {
mCurrentSelectedRadioButton = addressRadio
}
mAllRadioButtons.add(addressRadio)
addressRadio.setOnClickListener(radioButtonClick)
addressRadio.id = View.generateViewId()
mAvailableAddressesMap!![address] = addressRadio
} else {
inactiveAddress =
mInflater?.inflate(R.layout.alias_list_item_inactive, inactiveAddresses, false) as TextView
inactiveAddress.text = address.email.s
}
if (aliasAvailable) {
mNoAvailableAddresses = false
availableAddresses.addView(addressRadio)
} else {
mNoInactiveAddresses = false
inactiveAddresses?.addView(inactiveAddress)
}
}
if (mNoAvailableAddresses) {
noAvailableAddresses.visibility = View.VISIBLE
}
if (mNoInactiveAddresses) {
noInactiveAddresses.visibility = View.VISIBLE
}
}
private fun saveAndFinish() {
setResult(Activity.RESULT_OK)
finish()
}
}