Skip to content

Commit 52fdf6f

Browse files
committed
Customized dialog theme.
NMC-3805 -- logout popup wording adaptation
1 parent 8d0a12c commit 52fdf6f

38 files changed

+372
-360
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.nmc.android.utils
2+
3+
import android.content.Context
4+
import android.content.res.ColorStateList
5+
import android.os.Build
6+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
7+
import com.google.android.material.shape.MaterialShapeDrawable
8+
import com.owncloud.android.R
9+
10+
object DialogThemeUtils {
11+
fun colorMaterialAlertDialogBackground(context: Context, dialogBuilder: MaterialAlertDialogBuilder) {
12+
val materialShapeDrawable = MaterialShapeDrawable(
13+
context,
14+
null,
15+
R.attr.alertDialogStyle,
16+
R.style.MaterialAlertDialog_MaterialComponents
17+
)
18+
materialShapeDrawable.initializeElevationOverlay(context)
19+
materialShapeDrawable.fillColor =
20+
ColorStateList.valueOf(context.resources.getColor(R.color.alert_bg_color, null))
21+
22+
// dialogCornerRadius first appeared in Android Pie
23+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
24+
val radius: Float =
25+
context.resources.getDimension(com.nextcloud.android.common.ui.R.dimen.dialogBorderRadius)
26+
materialShapeDrawable.setCornerSize(radius)
27+
}
28+
dialogBuilder.background = materialShapeDrawable
29+
}
30+
}

app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.nextcloud.client.jobs.MediaFoldersDetectionWork
3333
import com.nextcloud.client.jobs.NotificationWork
3434
import com.nextcloud.client.jobs.upload.FileUploadWorker
3535
import com.nextcloud.client.preferences.SubFolderRule
36+
import com.nmc.android.utils.DialogThemeUtils
3637
import com.nextcloud.utils.extensions.getParcelableArgument
3738
import com.nextcloud.utils.extensions.isDialogFragmentReady
3839
import com.owncloud.android.BuildConfig
@@ -817,7 +818,7 @@ class SyncedFoldersActivity :
817818

818819
private fun showBatteryOptimizationInfo() {
819820
if (powerManagementService.isPowerSavingExclusionAvailable || checkIfBatteryOptimizationEnabled()) {
820-
val alertDialogBuilder = MaterialAlertDialogBuilder(this, R.style.Theme_ownCloud_Dialog)
821+
val alertDialogBuilder = MaterialAlertDialogBuilder(this)
821822
.setTitle(getString(R.string.battery_optimization_title))
822823
.setMessage(getString(R.string.battery_optimization_message))
823824
.setPositiveButton(getString(R.string.battery_optimization_disable)) { _, _ ->
@@ -833,12 +834,13 @@ class SyncedFoldersActivity :
833834
}
834835
.setNeutralButton(getString(R.string.battery_optimization_close)) { dialog, _ -> dialog.dismiss() }
835836
.setIcon(R.drawable.ic_battery_alert)
837+
838+
// NMC customization
839+
DialogThemeUtils.colorMaterialAlertDialogBackground(this, alertDialogBuilder)
840+
836841
if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
837-
val alertDialog = alertDialogBuilder.show()
838-
viewThemeUtils.platform.colorTextButtons(
839-
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
840-
alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)
841-
)
842+
//NMC Customization
843+
alertDialogBuilder.show()
842844
}
843845
}
844846
}

app/src/main/java/com/owncloud/android/ui/adapter/StoragePathAdapter.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ class StoragePathAdapter(
3131
val storagePathItem = pathList[position]
3232
holder.binding.btnStoragePath.setIconResource(storagePathItem.icon)
3333
holder.binding.btnStoragePath.text = storagePathItem.name
34-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(holder.binding.btnStoragePath)
3534
}
3635
}
3736

app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalDialog.kt

Lines changed: 16 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,21 @@
99
package com.owncloud.android.ui.dialog
1010

1111
import android.app.Dialog
12-
import android.graphics.drawable.Drawable
12+
import android.content.DialogInterface
1313
import android.os.Bundle
14-
import android.view.View
15-
import androidx.appcompat.app.AlertDialog
1614
import androidx.fragment.app.DialogFragment
17-
import com.google.android.material.button.MaterialButton
1815
import com.google.android.material.dialog.MaterialAlertDialogBuilder
1916
import com.nextcloud.client.account.User
20-
import com.nextcloud.client.account.UserAccountManager
2117
import com.nextcloud.client.di.Injectable
2218
import com.nextcloud.client.jobs.BackgroundJobManager
2319
import com.nextcloud.utils.extensions.getParcelableArgument
20+
import com.nmc.android.utils.DialogThemeUtils
2421
import com.owncloud.android.R
25-
import com.owncloud.android.databinding.AccountRemovalDialogBinding
26-
import com.owncloud.android.datamodel.FileDataStorageManager
27-
import com.owncloud.android.utils.DisplayUtils
28-
import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener
2922
import com.owncloud.android.utils.theme.ViewThemeUtils
3023
import javax.inject.Inject
3124

32-
class AccountRemovalDialog : DialogFragment(), AvatarGenerationListener, Injectable {
25+
// NMC Customization: We don't need two option for logout. On logout directly logout the user locally from the app
26+
class AccountRemovalDialog : DialogFragment(), Injectable {
3327

3428
@Inject
3529
lateinit var backgroundJobManager: BackgroundJobManager
@@ -38,136 +32,33 @@ class AccountRemovalDialog : DialogFragment(), AvatarGenerationListener, Injecta
3832
lateinit var viewThemeUtils: ViewThemeUtils
3933

4034
private var user: User? = null
41-
private lateinit var alertDialog: AlertDialog
42-
private var _binding: AccountRemovalDialogBinding? = null
43-
val binding get() = _binding!!
4435

4536
override fun onCreate(savedInstanceState: Bundle?) {
4637
super.onCreate(savedInstanceState)
4738
user = requireArguments().getParcelableArgument(KEY_USER, User::class.java)
4839
}
4940

50-
override fun onStart() {
51-
super.onStart()
52-
53-
// disable positive button and apply theming
54-
alertDialog = dialog as AlertDialog
55-
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false
56-
57-
viewThemeUtils.platform.themeRadioButton(binding.radioLocalRemove)
58-
viewThemeUtils.platform.themeRadioButton(binding.radioRequestDeletion)
59-
viewThemeUtils.material.colorMaterialButtonPrimaryTonal(
60-
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as MaterialButton
61-
)
62-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(
63-
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as MaterialButton
64-
)
65-
66-
binding.userName.text = UserAccountManager.getDisplayName(user)
67-
binding.account.text = user?.let { DisplayUtils.convertIdn(it.accountName, false) }
68-
}
69-
7041
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
71-
_binding = AccountRemovalDialogBinding.inflate(layoutInflater)
72-
73-
// start avatar generation
74-
setAvatar()
75-
76-
// hide second option when plug-in isn't installed
77-
if (hasDropAccount()) {
78-
binding.requestDeletion.visibility = View.VISIBLE
79-
}
80-
81-
val builder =
82-
MaterialAlertDialogBuilder(requireActivity())
83-
.setTitle(R.string.delete_account)
84-
.setView(binding.root)
85-
.setNegativeButton(R.string.common_cancel) { _, _ -> }
86-
.setPositiveButton(R.string.delete_account) { _, _ -> removeAccount() }
87-
88-
// allow selection by clicking on list element
89-
binding.localRemove.setOnClickListener {
90-
binding.radioLocalRemove.performClick()
91-
}
92-
binding.requestDeletion.setOnClickListener {
93-
binding.radioRequestDeletion.performClick()
94-
}
95-
96-
// set listeners for custom radio button list
97-
binding.radioLocalRemove.setOnClickListener {
98-
binding.radioRequestDeletion.isChecked = false
99-
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).apply {
100-
text = getText(R.string.delete_account)
101-
isEnabled = true
102-
}
103-
}
104-
binding.radioRequestDeletion.setOnClickListener {
105-
binding.radioLocalRemove.isChecked = false
106-
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).apply {
107-
text = getString(R.string.request_account_deletion_button)
108-
isEnabled = true
42+
val builder = MaterialAlertDialogBuilder(requireActivity())
43+
.setTitle(R.string.delete_account)
44+
.setMessage(resources.getString(R.string.delete_account_warning, user!!.accountName))
45+
.setIcon(R.drawable.ic_warning)
46+
.setPositiveButton(R.string.common_ok) { _: DialogInterface?, _: Int ->
47+
backgroundJobManager.startAccountRemovalJob(
48+
user!!.accountName,
49+
false
50+
)
10951
}
110-
}
52+
.setNegativeButton(R.string.common_cancel, null)
11153

112-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(requireActivity(), builder)
54+
// NMC customization
55+
DialogThemeUtils.colorMaterialAlertDialogBackground(requireActivity(), builder)
11356

11457
return builder.create()
11558
}
11659

117-
/**
118-
* Get value of `drop-account` capability.
119-
*/
120-
private fun hasDropAccount(): Boolean {
121-
val capability = FileDataStorageManager(user, context?.contentResolver).getCapability(user)
122-
return capability.dropAccount.isTrue
123-
}
124-
125-
/**
126-
* Start removal of account. Depending on which option is checked, either a browser will open to request deletion,
127-
* or the local account will be removed immediately.
128-
*/
129-
private fun removeAccount() {
130-
user?.let { user ->
131-
if (binding.radioRequestDeletion.isChecked) {
132-
DisplayUtils.startLinkIntent(activity, user.server.uri.toString() + DROP_ACCOUNT_URI)
133-
} else {
134-
backgroundJobManager.startAccountRemovalJob(user.accountName, false)
135-
}
136-
}
137-
}
138-
139-
/**
140-
* Start avatar generation.
141-
*/
142-
private fun setAvatar() {
143-
try {
144-
val imageView = binding.userIcon
145-
imageView.tag = user!!.accountName
146-
DisplayUtils.setAvatar(
147-
user!!,
148-
this,
149-
resources.getDimension(R.dimen.list_item_avatar_icon_radius),
150-
resources,
151-
imageView,
152-
context
153-
)
154-
} catch (_: Exception) {
155-
}
156-
}
157-
158-
override fun avatarGenerated(avatarDrawable: Drawable?, callContext: Any?) {
159-
avatarDrawable?.let {
160-
binding.userIcon.setImageDrawable(it)
161-
}
162-
}
163-
164-
override fun shouldCallGeneratedCallback(tag: String?, callContext: Any?): Boolean {
165-
return binding.userIcon.tag == tag
166-
}
167-
16860
companion object {
16961
private const val KEY_USER = "USER"
170-
private const val DROP_ACCOUNT_URI = "/settings/user/drop_account"
17162

17263
@JvmStatic
17364
fun newInstance(user: User) = AccountRemovalDialog().apply {

app/src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.kt

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.nextcloud.client.network.ClientFactory
2828
import com.nextcloud.client.network.ClientFactory.CreationException
2929
import com.nextcloud.utils.extensions.getParcelableArgument
3030
import com.nextcloud.utils.fileNameValidator.FileNameValidator
31+
import com.nmc.android.utils.DialogThemeUtils
3132
import com.owncloud.android.MainApp
3233
import com.owncloud.android.R
3334
import com.owncloud.android.databinding.ChooseTemplateBinding
@@ -99,15 +100,9 @@ class ChooseRichDocumentsTemplateDialogFragment :
99100
alertDialog?.let {
100101
positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as? MaterialButton
101102
positiveButton?.let {
102-
viewThemeUtils.material.colorMaterialButtonPrimaryTonal(it)
103103
it.setOnClickListener(this)
104104
it.isEnabled = false
105105
}
106-
107-
val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as? MaterialButton
108-
negativeButton?.let {
109-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton)
110-
}
111106
}
112107

113108
checkEnablingCreateButton()
@@ -131,7 +126,6 @@ class ChooseRichDocumentsTemplateDialogFragment :
131126

132127
initClient()
133128
initFilenames(arguments)
134-
viewThemeUtils.material.colorTextInputLayout(binding.filenameContainer)
135129

136130
val type = Type.valueOf(arguments.getString(ARG_TYPE) ?: "")
137131
FetchTemplateTask(this, client).execute(type)
@@ -194,8 +188,8 @@ class ChooseRichDocumentsTemplateDialogFragment :
194188
.setNegativeButton(R.string.common_cancel, null)
195189
.setTitle(titleTextId)
196190

197-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(activity, builder)
198-
191+
//NMC customization
192+
DialogThemeUtils.colorMaterialAlertDialogBackground(activity, builder)
199193
return builder
200194
}
201195

app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.kt

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.nextcloud.client.network.ClientFactory
3333
import com.nextcloud.client.network.ClientFactory.CreationException
3434
import com.nextcloud.utils.extensions.getParcelableArgument
3535
import com.nextcloud.utils.fileNameValidator.FileNameValidator
36+
import com.nmc.android.utils.DialogThemeUtils
3637
import com.owncloud.android.MainApp
3738
import com.owncloud.android.R
3839
import com.owncloud.android.databinding.ChooseTemplateBinding
@@ -90,14 +91,8 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
9091
super.onStart()
9192
val alertDialog = dialog as AlertDialog
9293

93-
val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as? MaterialButton
94-
negativeButton?.let {
95-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton)
96-
}
97-
9894
val positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as? MaterialButton
9995
positiveButton?.let {
100-
viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton)
10196
positiveButton.setOnClickListener(this)
10297
positiveButton.isEnabled = false
10398
positiveButton.isClickable = false
@@ -130,10 +125,6 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
130125
val inflater = requireActivity().layoutInflater
131126
_binding = ChooseTemplateBinding.inflate(inflater, null, false)
132127

133-
viewThemeUtils.material.colorTextInputLayout(
134-
binding.filenameContainer
135-
)
136-
137128
binding.filename.addTextChangedListener(object : TextWatcher {
138129
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) = Unit
139130
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) = Unit
@@ -162,7 +153,8 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
162153
.setNegativeButton(R.string.common_cancel, null)
163154
.setTitle(title)
164155

165-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.list.context, builder)
156+
//NMC customization
157+
DialogThemeUtils.colorMaterialAlertDialogBackground(binding.list.context, builder)
166158

167159
return builder.create()
168160
}

app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.kt

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@ import android.R
1414
import android.app.Dialog
1515
import android.content.DialogInterface
1616
import android.os.Bundle
17-
import androidx.appcompat.app.AlertDialog
1817
import androidx.fragment.app.DialogFragment
19-
import com.google.android.material.button.MaterialButton
2018
import com.google.android.material.dialog.MaterialAlertDialogBuilder
2119
import com.nextcloud.client.di.Injectable
20+
import com.nmc.android.utils.DialogThemeUtils
2221
import com.owncloud.android.utils.theme.ViewThemeUtils
2322
import javax.inject.Inject
2423

@@ -30,29 +29,6 @@ open class ConfirmationDialogFragment : DialogFragment(), Injectable {
3029

3130
private var mListener: ConfirmationDialogFragmentListener? = null
3231

33-
override fun onStart() {
34-
super.onStart()
35-
36-
val alertDialog = dialog as AlertDialog?
37-
38-
if (alertDialog != null) {
39-
val positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as MaterialButton?
40-
if (positiveButton != null) {
41-
viewThemeUtils?.material?.colorMaterialButtonPrimaryTonal(positiveButton)
42-
}
43-
44-
val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as MaterialButton?
45-
if (negativeButton != null) {
46-
viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(negativeButton)
47-
}
48-
49-
val neutralButton = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL) as MaterialButton?
50-
if (neutralButton != null) {
51-
viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(neutralButton)
52-
}
53-
}
54-
}
55-
5632
fun setOnConfirmationListener(listener: ConfirmationDialogFragmentListener?) {
5733
mListener = listener
5834
}
@@ -98,7 +74,8 @@ open class ConfirmationDialogFragment : DialogFragment(), Injectable {
9874
}
9975
}
10076

101-
viewThemeUtils?.dialog?.colorMaterialAlertDialogBackground(requireActivity(), builder)
77+
// NMC customization
78+
DialogThemeUtils.colorMaterialAlertDialogBackground(requireActivity(), builder)
10279

10380
return builder.create()
10481
}

0 commit comments

Comments
 (0)