Skip to content

Commit 3cf9d90

Browse files
committed
Customized dialog theme.
1 parent e625f45 commit 3cf9d90

35 files changed

+342
-333
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: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -827,11 +827,8 @@ class SyncedFoldersActivity :
827827
.setNeutralButton(getString(R.string.battery_optimization_close)) { dialog, _ -> dialog.dismiss() }
828828
.setIcon(R.drawable.ic_battery_alert)
829829
if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
830-
val alertDialog = alertDialogBuilder.show()
831-
viewThemeUtils.platform.colorTextButtons(
832-
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
833-
alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)
834-
)
830+
//NMC Customization
831+
alertDialogBuilder.show()
835832
}
836833
}
837834
}

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
@@ -44,7 +44,6 @@ class StoragePathAdapter(
4444
val storagePathItem = pathList[position]
4545
holder.binding.btnStoragePath.setIconResource(storagePathItem.icon)
4646
holder.binding.btnStoragePath.text = storagePathItem.name
47-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(holder.binding.btnStoragePath)
4847
}
4948
}
5049

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
@@ -24,27 +24,21 @@
2424
package com.owncloud.android.ui.dialog
2525

2626
import android.app.Dialog
27-
import android.graphics.drawable.Drawable
27+
import android.content.DialogInterface
2828
import android.os.Bundle
29-
import android.view.View
30-
import androidx.appcompat.app.AlertDialog
3129
import androidx.fragment.app.DialogFragment
32-
import com.google.android.material.button.MaterialButton
3330
import com.google.android.material.dialog.MaterialAlertDialogBuilder
3431
import com.nextcloud.client.account.User
35-
import com.nextcloud.client.account.UserAccountManager
3632
import com.nextcloud.client.di.Injectable
3733
import com.nextcloud.client.jobs.BackgroundJobManager
3834
import com.nextcloud.utils.extensions.getParcelableArgument
35+
import com.nmc.android.utils.DialogThemeUtils
3936
import com.owncloud.android.R
40-
import com.owncloud.android.databinding.AccountRemovalDialogBinding
41-
import com.owncloud.android.datamodel.FileDataStorageManager
42-
import com.owncloud.android.utils.DisplayUtils
43-
import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener
4437
import com.owncloud.android.utils.theme.ViewThemeUtils
4538
import javax.inject.Inject
4639

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

4943
@Inject
5044
lateinit var backgroundJobManager: BackgroundJobManager
@@ -53,136 +47,33 @@ class AccountRemovalDialog : DialogFragment(), AvatarGenerationListener, Injecta
5347
lateinit var viewThemeUtils: ViewThemeUtils
5448

5549
private var user: User? = null
56-
private lateinit var alertDialog: AlertDialog
57-
private var _binding: AccountRemovalDialogBinding? = null
58-
private val binding get() = _binding!!
5950

6051
override fun onCreate(savedInstanceState: Bundle?) {
6152
super.onCreate(savedInstanceState)
6253
user = requireArguments().getParcelableArgument(KEY_USER, User::class.java)
6354
}
6455

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

127-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(requireActivity(), builder)
69+
// NMC customization
70+
DialogThemeUtils.colorMaterialAlertDialogBackground(requireActivity(), builder)
12871

12972
return builder.create()
13073
}
13174

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

18778
@JvmStatic
18879
fun newInstance(user: User) = AccountRemovalDialog().apply {

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

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.nextcloud.client.di.Injectable;
4343
import com.nextcloud.client.network.ClientFactory;
4444
import com.nextcloud.utils.extensions.BundleExtensionsKt;
45+
import com.nmc.android.utils.DialogThemeUtils;
4546
import com.owncloud.android.MainApp;
4647
import com.owncloud.android.R;
4748
import com.owncloud.android.databinding.ChooseTemplateBinding;
@@ -129,17 +130,9 @@ public void onStart() {
129130

130131
if (alertDialog != null) {
131132
positiveButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
132-
viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton);
133-
134-
MaterialButton negativeButton = (MaterialButton) alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE);
135-
if (negativeButton != null) {
136-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton);
137-
}
138-
139133
positiveButton.setOnClickListener(this);
140134
positiveButton.setEnabled(false);
141135
}
142-
143136
checkEnablingCreateButton();
144137
}
145138

@@ -181,8 +174,6 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
181174
binding = ChooseTemplateBinding.inflate(inflater, null, false);
182175
View view = binding.getRoot();
183176

184-
viewThemeUtils.material.colorTextInputLayout(binding.filenameContainer);
185-
186177
Type type = Type.valueOf(arguments.getString(ARG_TYPE));
187178
new FetchTemplateTask(this, client).execute(type);
188179

@@ -222,7 +213,8 @@ public void afterTextChanged(Editable s) {
222213
.setNegativeButton(R.string.common_cancel, null)
223214
.setTitle(titleTextId);
224215

225-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(activity, builder);
216+
//NMC customization
217+
DialogThemeUtils.INSTANCE.colorMaterialAlertDialogBackground(activity, builder);
226218

227219
return builder.create();
228220
}

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
@@ -45,6 +45,7 @@ import com.nextcloud.client.di.Injectable
4545
import com.nextcloud.client.network.ClientFactory
4646
import com.nextcloud.client.network.ClientFactory.CreationException
4747
import com.nextcloud.utils.extensions.getParcelableArgument
48+
import com.nmc.android.utils.DialogThemeUtils
4849
import com.owncloud.android.MainApp
4950
import com.owncloud.android.R
5051
import com.owncloud.android.databinding.ChooseTemplateBinding
@@ -106,10 +107,6 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
106107
val alertDialog = dialog as AlertDialog
107108

108109
val positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as MaterialButton
109-
viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton)
110-
111-
val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as MaterialButton
112-
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton)
113110

114111
positiveButton.setOnClickListener(this)
115112
positiveButton.isEnabled = false
@@ -144,10 +141,6 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
144141
_binding = ChooseTemplateBinding.inflate(inflater, null, false)
145142
val view: View = binding.root
146143

147-
viewThemeUtils.material.colorTextInputLayout(
148-
binding.filenameContainer
149-
)
150-
151144
binding.filename.addTextChangedListener(object : TextWatcher {
152145
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) = Unit
153146

@@ -181,7 +174,8 @@ class ChooseTemplateDialogFragment : DialogFragment(), View.OnClickListener, Tem
181174
.setNegativeButton(R.string.common_cancel, null)
182175
.setTitle(title)
183176

184-
viewThemeUtils.dialog.colorMaterialAlertDialogBackground(binding.list.context, builder)
177+
//NMC customization
178+
DialogThemeUtils.colorMaterialAlertDialogBackground(binding.list.context, builder)
185179

186180
return builder.create()
187181
}

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
@@ -20,11 +20,10 @@ import android.R
2020
import android.app.Dialog
2121
import android.content.DialogInterface
2222
import android.os.Bundle
23-
import androidx.appcompat.app.AlertDialog
2423
import androidx.fragment.app.DialogFragment
25-
import com.google.android.material.button.MaterialButton
2624
import com.google.android.material.dialog.MaterialAlertDialogBuilder
2725
import com.nextcloud.client.di.Injectable
26+
import com.nmc.android.utils.DialogThemeUtils
2827
import com.owncloud.android.utils.theme.ViewThemeUtils
2928
import javax.inject.Inject
3029

@@ -36,29 +35,6 @@ open class ConfirmationDialogFragment : DialogFragment(), Injectable {
3635

3736
private var mListener: ConfirmationDialogFragmentListener? = null
3837

39-
override fun onStart() {
40-
super.onStart()
41-
42-
val alertDialog = dialog as AlertDialog?
43-
44-
if (alertDialog != null) {
45-
val positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE) as MaterialButton?
46-
if (positiveButton != null) {
47-
viewThemeUtils?.material?.colorMaterialButtonPrimaryTonal(positiveButton)
48-
}
49-
50-
val negativeButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) as MaterialButton?
51-
if (negativeButton != null) {
52-
viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(negativeButton)
53-
}
54-
55-
val neutralButton = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL) as MaterialButton?
56-
if (neutralButton != null) {
57-
viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(neutralButton)
58-
}
59-
}
60-
}
61-
6238
fun setOnConfirmationListener(listener: ConfirmationDialogFragmentListener?) {
6339
mListener = listener
6440
}
@@ -104,7 +80,8 @@ open class ConfirmationDialogFragment : DialogFragment(), Injectable {
10480
}
10581
}
10682

107-
viewThemeUtils?.dialog?.colorMaterialAlertDialogBackground(requireActivity(), builder)
83+
// NMC customization
84+
DialogThemeUtils.colorMaterialAlertDialogBackground(requireActivity(), builder)
10885

10986
return builder.create()
11087
}

0 commit comments

Comments
 (0)