Skip to content

Commit 695cbda

Browse files
committed
refactor: extract common layout for password policy requirements
1 parent 167fd5b commit 695cbda

3 files changed

Lines changed: 83 additions & 153 deletions

File tree

owncloudApp/src/main/java/com/owncloud/android/presentation/spaces/links/SetPasswordDialogFragment.kt

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import android.os.Bundle
2828
import android.view.LayoutInflater
2929
import android.view.View
3030
import android.view.ViewGroup
31+
import android.widget.ImageView
3132
import android.widget.TextView
3233
import androidx.appcompat.widget.AppCompatButton
3334
import androidx.core.content.ContextCompat
@@ -70,7 +71,7 @@ class SetPasswordDialogFragment: DialogFragment() {
7071
binding.passwordValue.setText(it)
7172
}
7273

73-
capabilityViewModel.capabilities.observe(viewLifecycleOwner) { event->
74+
capabilityViewModel.capabilities.observe(viewLifecycleOwner) { event ->
7475
when (val uiResult = event.peekContent()) {
7576
is UIResult.Success -> {
7677
passwordPolicy = uiResult.data?.passwordPolicy
@@ -108,7 +109,7 @@ class SetPasswordDialogFragment: DialogFragment() {
108109

109110
binding.copyPasswordButton.setOnClickListener {
110111
val clipboard = requireActivity().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
111-
val clip = ClipData.newPlainText("Public link", binding.passwordValue.text.toString())
112+
val clip = ClipData.newPlainText(getString(R.string.auth_password), binding.passwordValue.text.toString())
112113
clipboard.setPrimaryClip(clip)
113114
}
114115

@@ -141,9 +142,9 @@ class SetPasswordDialogFragment: DialogFragment() {
141142
hasMinCharacters = password.length >= minCharacters
142143
updateRequirement(
143144
hasRequirement = hasMinCharacters,
144-
layout = binding.passwordPolicyMinCharacters,
145-
textView = binding.passwordPolicyMinCharactersText,
146-
textViewIcon = binding.passwordPolicyMinCharactersIcon,
145+
layout = binding.passwordPolicyMinCharacters.passwordPolicyLayout,
146+
textView = binding.passwordPolicyMinCharacters.passwordPolicyText,
147+
textViewIcon = binding.passwordPolicyMinCharacters.passwordPolicyIcon,
147148
text = getString(R.string.password_policy_min_characters, passwordPolicy.minCharacters)
148149
)
149150
}
@@ -154,9 +155,9 @@ class SetPasswordDialogFragment: DialogFragment() {
154155
hasMaxCharacters = password.length <= maxCharacters
155156
updateRequirement(
156157
hasRequirement = hasMaxCharacters,
157-
layout = binding.passwordPolicyMaxCharacters,
158-
textView = binding.passwordPolicyMaxCharactersText,
159-
textViewIcon = binding.passwordPolicyMaxCharactersIcon,
158+
layout = binding.passwordPolicyMaxCharacters.passwordPolicyLayout,
159+
textView = binding.passwordPolicyMaxCharacters.passwordPolicyText,
160+
textViewIcon = binding.passwordPolicyMaxCharacters.passwordPolicyIcon,
160161
text = getString(R.string.password_policy_max_characters, passwordPolicy.maxCharacters)
161162
)
162163
}
@@ -167,9 +168,9 @@ class SetPasswordDialogFragment: DialogFragment() {
167168
hasUpperCase = password.count { it.isUpperCase() } >= minUppercaseCharacters
168169
updateRequirement(
169170
hasRequirement = hasUpperCase,
170-
layout = binding.passwordPolicyUpperCharacters,
171-
textView = binding.passwordPolicyUpperCharactersText,
172-
textViewIcon = binding.passwordPolicyUpperCharactersIcon,
171+
layout = binding.passwordPolicyUpperCharacters.passwordPolicyLayout,
172+
textView = binding.passwordPolicyUpperCharacters.passwordPolicyText,
173+
textViewIcon = binding.passwordPolicyUpperCharacters.passwordPolicyIcon,
173174
text = getString(R.string.password_policy_uppercase_characters, passwordPolicy.minUppercaseCharacters)
174175
)
175176
}
@@ -180,9 +181,9 @@ class SetPasswordDialogFragment: DialogFragment() {
180181
hasLowerCase = password.count { it.isLowerCase() } >= minLowercaseCharacters
181182
updateRequirement(
182183
hasRequirement = hasLowerCase,
183-
layout = binding.passwordPolicyLowerCaseCharacters,
184-
textView = binding.passwordPolicyLowerCaseCharactersText,
185-
textViewIcon = binding.passwordPolicyLowerCaseCharactersIcon,
184+
layout = binding.passwordPolicyLowerCaseCharacters.passwordPolicyLayout,
185+
textView = binding.passwordPolicyLowerCaseCharacters.passwordPolicyText,
186+
textViewIcon = binding.passwordPolicyLowerCaseCharacters.passwordPolicyIcon,
186187
text = getString(R.string.password_policy_lowercase_characters, passwordPolicy.minLowercaseCharacters)
187188
)
188189
}
@@ -193,9 +194,9 @@ class SetPasswordDialogFragment: DialogFragment() {
193194
hasSpecialCharacter = password.count { SPECIALS_CHARACTERS.contains(it) } >= minSpecialCharacters
194195
updateRequirement(
195196
hasRequirement = hasSpecialCharacter,
196-
layout = binding.passwordPolicyMinSpecialCharacters,
197-
textView = binding.passwordPolicyMinSpecialCharactersText,
198-
textViewIcon = binding.passwordPolicyMinSpecialCharactersIcon,
197+
layout = binding.passwordPolicyMinSpecialCharacters.passwordPolicyLayout,
198+
textView = binding.passwordPolicyMinSpecialCharacters.passwordPolicyText,
199+
textViewIcon = binding.passwordPolicyMinSpecialCharacters.passwordPolicyIcon,
199200
text = getString(R.string.password_policy_min_special_character, passwordPolicy.minSpecialCharacters, SPECIALS_CHARACTERS)
200201
)
201202
}
@@ -206,9 +207,9 @@ class SetPasswordDialogFragment: DialogFragment() {
206207
hasDigit = password.count { it.isDigit() } >= minDigits
207208
updateRequirement(
208209
hasRequirement = hasDigit,
209-
layout = binding.passwordPolicyMinDigits,
210-
textView = binding.passwordPolicyMinDigitsText,
211-
textViewIcon = binding.passwordPolicyMinDigitsIcon,
210+
layout = binding.passwordPolicyMinDigits.passwordPolicyLayout,
211+
textView = binding.passwordPolicyMinDigits.passwordPolicyText,
212+
textViewIcon = binding.passwordPolicyMinDigits.passwordPolicyIcon,
212213
text = getString(R.string.password_policy_min_digits, passwordPolicy.minDigits)
213214
)
214215
}
@@ -219,7 +220,7 @@ class SetPasswordDialogFragment: DialogFragment() {
219220
enableButton(binding.copyPasswordButton, allConditionsCheck)
220221
}
221222

222-
private fun updateRequirement(hasRequirement: Boolean, layout: View, textView: TextView, textViewIcon: TextView, text: String) {
223+
private fun updateRequirement(hasRequirement: Boolean, layout: View, textView: TextView, textViewIcon: ImageView, text: String) {
223224
val textColor = if (hasRequirement) R.color.success else R.color.warning
224225
val drawable = if (hasRequirement) R.drawable.ic_check_password_policy else R.drawable.ic_cross_warning_password_policy
225226

@@ -228,7 +229,7 @@ class SetPasswordDialogFragment: DialogFragment() {
228229
setText(text)
229230
setTextColor(ContextCompat.getColor(context, textColor))
230231
}
231-
textViewIcon.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, 0, 0, 0)
232+
textViewIcon.setImageResource(drawable)
232233
}
233234

234235
private fun enableButton(button: AppCompatButton, enable: Boolean) {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!--
3+
ownCloud Android client application
4+
5+
Copyright (C) 2026 ownCloud GmbH.
6+
7+
This program is free software: you can redistribute it and/or modify
8+
it under the terms of the GNU General Public License version 2,
9+
as published by the Free Software Foundation.
10+
11+
This program is distributed in the hope that it will be useful,
12+
but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
GNU General Public License for more details.
15+
16+
You should have received a copy of the GNU General Public License
17+
along with this program. If not, see <http://www.gnu.org/licenses/>.
18+
-->
19+
20+
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
21+
xmlns:tools="http://schemas.android.com/tools"
22+
android:id="@+id/password_policy_layout"
23+
android:layout_width="match_parent"
24+
android:layout_height="match_parent"
25+
android:layout_marginStart="@dimen/standard_half_margin"
26+
android:layout_marginEnd="@dimen/standard_half_margin"
27+
android:layout_gravity="center_horizontal"
28+
android:orientation="horizontal"
29+
android:visibility="gone"
30+
tools:visibility="visible">
31+
32+
<ImageView
33+
android:id="@+id/password_policy_icon"
34+
android:layout_width="wrap_content"
35+
android:layout_height="wrap_content"/>
36+
37+
<TextView
38+
android:id="@+id/password_policy_text"
39+
android:layout_width="match_parent"
40+
android:layout_height="wrap_content"/>
41+
42+
</LinearLayout>

owncloudApp/src/main/res/layout/set_password_dialog.xml

Lines changed: 18 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -95,142 +95,29 @@
9595
android:layout_marginTop="@dimen/standard_half_margin"
9696
android:text="@string/password_policy_intro"/>
9797

98-
<LinearLayout
99-
android:id="@+id/password_policy_min_characters"
100-
android:layout_width="match_parent"
101-
android:layout_height="wrap_content"
102-
android:layout_marginStart="@dimen/standard_half_margin"
103-
android:layout_marginEnd="@dimen/standard_half_margin"
104-
android:layout_gravity="center_horizontal"
105-
android:orientation="horizontal"
106-
android:visibility="gone"
107-
tools:visibility="visible">
98+
<include
99+
layout="@layout/password_policy_requirement"
100+
android:id="@+id/password_policy_min_characters"/>
108101

109-
<TextView
110-
android:id="@+id/password_policy_min_characters_icon"
111-
android:layout_width="wrap_content"
112-
android:layout_height="wrap_content"/>
102+
<include
103+
layout="@layout/password_policy_requirement"
104+
android:id="@+id/password_policy_upper_characters"/>
113105

114-
<TextView
115-
android:id="@+id/password_policy_min_characters_text"
116-
android:layout_width="match_parent"
117-
android:layout_height="wrap_content"/>
106+
<include
107+
layout="@layout/password_policy_requirement"
108+
android:id="@+id/password_policy_lower_case_characters"/>
118109

119-
</LinearLayout>
110+
<include
111+
layout="@layout/password_policy_requirement"
112+
android:id="@+id/password_policy_min_special_characters"/>
120113

121-
<LinearLayout
122-
android:id="@+id/password_policy_upper_characters"
123-
android:layout_width="match_parent"
124-
android:layout_height="wrap_content"
125-
android:layout_marginStart="@dimen/standard_half_margin"
126-
android:layout_marginEnd="@dimen/standard_half_margin"
127-
android:layout_gravity="center_horizontal"
128-
android:orientation="horizontal"
129-
android:visibility="gone"
130-
tools:visibility="visible">
131-
132-
<TextView
133-
android:id="@+id/password_policy_upper_characters_icon"
134-
android:layout_width="wrap_content"
135-
android:layout_height="wrap_content"/>
136-
137-
<TextView
138-
android:id="@+id/password_policy_upper_characters_text"
139-
android:layout_width="match_parent"
140-
android:layout_height="wrap_content"/>
114+
<include
115+
layout="@layout/password_policy_requirement"
116+
android:id="@+id/password_policy_max_characters"/>
141117

142-
</LinearLayout>
143-
144-
<LinearLayout
145-
android:id="@+id/password_policy_lower_case_characters"
146-
android:layout_width="match_parent"
147-
android:layout_height="wrap_content"
148-
android:layout_marginStart="@dimen/standard_half_margin"
149-
android:layout_marginEnd="@dimen/standard_half_margin"
150-
android:layout_gravity="center_horizontal"
151-
android:orientation="horizontal"
152-
android:visibility="gone"
153-
tools:visibility="visible">
154-
155-
<TextView
156-
android:id="@+id/password_policy_lower_case_characters_icon"
157-
android:layout_width="wrap_content"
158-
android:layout_height="wrap_content"/>
159-
160-
<TextView
161-
android:id="@+id/password_policy_lower_case_characters_text"
162-
android:layout_width="match_parent"
163-
android:layout_height="wrap_content"/>
164-
</LinearLayout>
165-
166-
<LinearLayout
167-
android:id="@+id/password_policy_min_special_characters"
168-
android:layout_width="match_parent"
169-
android:layout_height="wrap_content"
170-
android:layout_marginStart="@dimen/standard_half_margin"
171-
android:layout_marginEnd="@dimen/standard_half_margin"
172-
android:layout_gravity="center_horizontal"
173-
android:orientation="horizontal"
174-
android:visibility="gone"
175-
tools:visibility="visible">
176-
177-
<TextView
178-
android:id="@+id/password_policy_min_special_characters_icon"
179-
android:layout_width="wrap_content"
180-
android:layout_height="wrap_content"/>
181-
182-
<TextView
183-
android:id="@+id/password_policy_min_special_characters_text"
184-
android:layout_width="match_parent"
185-
android:layout_height="wrap_content"/>
186-
187-
</LinearLayout>
188-
189-
<LinearLayout
190-
android:id="@+id/password_policy_max_characters"
191-
android:layout_width="match_parent"
192-
android:layout_height="wrap_content"
193-
android:layout_marginStart="@dimen/standard_half_margin"
194-
android:layout_marginEnd="@dimen/standard_half_margin"
195-
android:layout_gravity="center_horizontal"
196-
android:orientation="horizontal"
197-
android:visibility="gone"
198-
tools:visibility="visible">
199-
200-
<TextView
201-
android:id="@+id/password_policy_max_characters_icon"
202-
android:layout_width="wrap_content"
203-
android:layout_height="wrap_content"/>
204-
205-
<TextView
206-
android:id="@+id/password_policy_max_characters_text"
207-
android:layout_width="match_parent"
208-
android:layout_height="wrap_content"/>
209-
210-
</LinearLayout>
211-
212-
<LinearLayout
213-
android:id="@+id/password_policy_min_digits"
214-
android:layout_width="match_parent"
215-
android:layout_height="wrap_content"
216-
android:layout_marginStart="@dimen/standard_half_margin"
217-
android:layout_marginEnd="@dimen/standard_half_margin"
218-
android:layout_gravity="center_horizontal"
219-
android:orientation="horizontal"
220-
android:visibility="gone"
221-
tools:visibility="visible">
222-
223-
<TextView
224-
android:id="@+id/password_policy_min_digits_icon"
225-
android:layout_width="wrap_content"
226-
android:layout_height="wrap_content"/>
227-
228-
<TextView
229-
android:id="@+id/password_policy_min_digits_text"
230-
android:layout_width="match_parent"
231-
android:layout_height="wrap_content"/>
232-
233-
</LinearLayout>
118+
<include
119+
layout="@layout/password_policy_requirement"
120+
android:id="@+id/password_policy_min_digits"/>
234121

235122
<LinearLayout
236123
android:layout_width="match_parent"

0 commit comments

Comments
 (0)