Skip to content

Commit 53d752f

Browse files
committed
Customized dialog theme.
1 parent 5716e23 commit 53d752f

38 files changed

+368
-341
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.NotificationWork
3333
import com.nextcloud.client.jobs.upload.FileUploadWorker
3434
import com.nextcloud.client.preferences.AppPreferences
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
@@ -821,7 +822,7 @@ class SyncedFoldersActivity :
821822

822823
private fun showBatteryOptimizationInfo() {
823824
if (powerManagementService.isPowerSavingExclusionAvailable || checkIfBatteryOptimizationEnabled()) {
824-
val alertDialogBuilder = MaterialAlertDialogBuilder(this, R.style.Theme_ownCloud_Dialog)
825+
val alertDialogBuilder = MaterialAlertDialogBuilder(this)
825826
.setTitle(getString(R.string.battery_optimization_title))
826827
.setMessage(getString(R.string.battery_optimization_message))
827828
.setPositiveButton(getString(R.string.battery_optimization_disable)) { _, _ ->
@@ -837,12 +838,13 @@ class SyncedFoldersActivity :
837838
}
838839
.setNeutralButton(getString(R.string.battery_optimization_close)) { dialog, _ -> dialog.dismiss() }
839840
.setIcon(R.drawable.ic_battery_alert)
841+
842+
// NMC customization
843+
DialogThemeUtils.colorMaterialAlertDialogBackground(this, alertDialogBuilder)
844+
840845
if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
841-
val alertDialog = alertDialogBuilder.show()
842-
viewThemeUtils.platform.colorTextButtons(
843-
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
844-
alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)
845-
)
846+
//NMC Customization
847+
alertDialogBuilder.show()
846848
}
847849
}
848850
}

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
@@ -27,6 +27,7 @@ import com.nextcloud.client.di.Injectable
2727
import com.nextcloud.client.network.ClientFactory
2828
import com.nextcloud.client.network.ClientFactory.CreationException
2929
import com.nextcloud.utils.extensions.getParcelableArgument
30+
import com.nmc.android.utils.DialogThemeUtils
3031
import com.owncloud.android.MainApp
3132
import com.owncloud.android.R
3233
import com.owncloud.android.databinding.ChooseTemplateBinding
@@ -98,15 +99,9 @@ class ChooseRichDocumentsTemplateDialogFragment :
9899
alertDialog?.let {
99100
positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as? MaterialButton
100101
positiveButton?.let {
101-
viewThemeUtils.material.colorMaterialButtonPrimaryTonal(it)
102102
it.setOnClickListener(this)
103103
it.isEnabled = false
104104
}
105-
106-
val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as? MaterialButton
107-
negativeButton?.let {
108-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton)
109-
}
110105
}
111106

112107
checkEnablingCreateButton()
@@ -130,7 +125,6 @@ class ChooseRichDocumentsTemplateDialogFragment :
130125

131126
initClient()
132127
initFilenames(arguments)
133-
viewThemeUtils.material.colorTextInputLayout(binding.filenameContainer)
134128

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

196-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(activity, builder)
197-
190+
//NMC customization
191+
DialogThemeUtils.colorMaterialAlertDialogBackground(activity, builder)
198192
return builder
199193
}
200194

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import com.nextcloud.client.di.Injectable
3030
import com.nextcloud.client.network.ClientFactory
3131
import com.nextcloud.client.network.ClientFactory.CreationException
3232
import com.nextcloud.utils.extensions.getParcelableArgument
33+
import com.nmc.android.utils.DialogThemeUtils
3334
import com.owncloud.android.MainApp
3435
import com.owncloud.android.R
3536
import com.owncloud.android.databinding.ChooseTemplateBinding
@@ -93,10 +94,6 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
9394
val alertDialog = dialog as AlertDialog
9495

9596
val positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as MaterialButton
96-
viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton)
97-
98-
val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as MaterialButton
99-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton)
10097

10198
positiveButton.setOnClickListener(this)
10299
positiveButton.isEnabled = false
@@ -131,10 +128,6 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
131128
_binding = ChooseTemplateBinding.inflate(inflater, null, false)
132129
val view: View = binding.root
133130

134-
viewThemeUtils.material.colorTextInputLayout(
135-
binding.filenameContainer
136-
)
137-
138131
binding.filename.addTextChangedListener(object : TextWatcher {
139132
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) = Unit
140133

@@ -168,7 +161,8 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
168161
.setNegativeButton(R.string.common_cancel, null)
169162
.setTitle(title)
170163

171-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.list.context, builder)
164+
//NMC customization
165+
DialogThemeUtils.colorMaterialAlertDialogBackground(binding.list.context, builder)
172166

173167
return builder.create()
174168
}

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)