Skip to content

Commit d2cfcb4

Browse files
committed
Customized dialog theme.
NMC-3805 -- logout popup wording adaptation
1 parent a7f50c1 commit d2cfcb4

37 files changed

+362
-332
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+
androidx.appcompat.R.attr.alertDialogStyle,
16+
com.google.android.material.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: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import com.nextcloud.client.jobs.MediaFoldersDetectionWork
3535
import com.nextcloud.client.jobs.NotificationWork
3636
import com.nextcloud.client.jobs.upload.FileUploadWorker
3737
import com.nextcloud.client.preferences.SubFolderRule
38+
import com.nmc.android.utils.DialogThemeUtils
3839
import com.nextcloud.utils.extensions.getParcelableArgument
3940
import com.nextcloud.utils.extensions.isDialogFragmentReady
4041
import com.owncloud.android.BuildConfig
@@ -223,7 +224,8 @@ class SyncedFoldersActivity :
223224
.setTitle(R.string.autoupload_disable_power_save_check)
224225
.setMessage(getString(R.string.power_save_check_dialog_message))
225226

226-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(this, builder)
227+
// NMC customization
228+
DialogThemeUtils.colorMaterialAlertDialogBackground(this, builder)
227229

228230
return builder.create()
229231
}
@@ -836,7 +838,7 @@ class SyncedFoldersActivity :
836838

837839
private fun showBatteryOptimizationInfo() {
838840
if (powerManagementService.isPowerSavingExclusionAvailable || checkIfBatteryOptimizationEnabled()) {
839-
val alertDialogBuilder = MaterialAlertDialogBuilder(this, R.style.Theme_ownCloud_Dialog)
841+
val alertDialogBuilder = MaterialAlertDialogBuilder(this)
840842
.setTitle(getString(R.string.battery_optimization_title))
841843
.setMessage(getString(R.string.battery_optimization_message))
842844
.setPositiveButton(getString(R.string.battery_optimization_disable)) { _, _ ->
@@ -852,12 +854,13 @@ class SyncedFoldersActivity :
852854
}
853855
.setNeutralButton(getString(R.string.battery_optimization_close)) { dialog, _ -> dialog.dismiss() }
854856
.setIcon(R.drawable.ic_battery_alert)
857+
858+
// NMC customization
859+
DialogThemeUtils.colorMaterialAlertDialogBackground(this, alertDialogBuilder)
860+
855861
if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
856-
val alertDialog = alertDialogBuilder.show()
857-
viewThemeUtils.platform.colorTextButtons(
858-
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
859-
alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)
860-
)
862+
//NMC Customization
863+
alertDialogBuilder.show()
861864
}
862865
}
863866
}

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
@@ -29,7 +29,6 @@ class StoragePathAdapter(
2929
val storagePathItem = pathList[position]
3030
holder.binding.btnStoragePath.setIconResource(storagePathItem.icon)
3131
holder.binding.btnStoragePath.text = storagePathItem.name
32-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(holder.binding.btnStoragePath)
3332
}
3433
}
3534

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

Lines changed: 16 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +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 :
33-
DialogFragment(),
34-
AvatarGenerationListener,
35-
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 {
3627

3728
@Inject
3829
lateinit var backgroundJobManager: BackgroundJobManager
@@ -41,134 +32,33 @@ class AccountRemovalDialog :
4132
lateinit var viewThemeUtils: ViewThemeUtils
4233

4334
private var user: User? = null
44-
private lateinit var alertDialog: AlertDialog
45-
private var _binding: AccountRemovalDialogBinding? = null
46-
val binding get() = _binding!!
4735

4836
override fun onCreate(savedInstanceState: Bundle?) {
4937
super.onCreate(savedInstanceState)
5038
user = requireArguments().getParcelableArgument(KEY_USER, User::class.java)
5139
}
5240

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

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

11757
return builder.create()
11858
}
11959

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

17363
@JvmStatic
17464
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)
@@ -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 & 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
@@ -94,14 +95,8 @@ class ChooseTemplateDialogFragment :
9495
super.onStart()
9596
val alertDialog = dialog as AlertDialog
9697

97-
val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as? MaterialButton
98-
negativeButton?.let {
99-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton)
100-
}
101-
10298
val positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as? MaterialButton
10399
positiveButton?.let {
104-
viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton)
105100
positiveButton.setOnClickListener(this)
106101
positiveButton.isEnabled = false
107102
positiveButton.isClickable = false
@@ -134,10 +129,6 @@ class ChooseTemplateDialogFragment :
134129
val inflater = requireActivity().layoutInflater
135130
_binding = ChooseTemplateBinding.inflate(inflater, null, false)
136131

137-
viewThemeUtils.material.colorTextInputLayout(
138-
binding.filenameContainer
139-
)
140-
141132
binding.filename.addTextChangedListener(object : TextWatcher {
142133
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) = Unit
143134
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) = Unit
@@ -166,7 +157,8 @@ class ChooseTemplateDialogFragment :
166157
.setNegativeButton(R.string.common_cancel, null)
167158
.setTitle(title)
168159

169-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.list.context, builder)
160+
//NMC customization
161+
DialogThemeUtils.colorMaterialAlertDialogBackground(binding.list.context, builder)
170162

171163
return builder.create()
172164
}

0 commit comments

Comments
 (0)