Skip to content

Commit c8469d6

Browse files
Merge pull request #16259 from nextcloud/fix/16245/improveThemingAndLayouting
Improve color theming and general layouting
2 parents 606e6d7 + 946b54f commit c8469d6

16 files changed

+120
-74
lines changed

app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.webkit.WebView;
2626

2727
import com.google.android.material.snackbar.Snackbar;
28+
import com.nextcloud.android.common.ui.theme.utils.ColorRole;
2829
import com.nextcloud.client.account.User;
2930
import com.nextcloud.utils.extensions.IntentExtensionsKt;
3031
import com.owncloud.android.R;
@@ -130,6 +131,8 @@ protected void bindView() {
130131
protected void postOnCreate() {
131132
super.postOnCreate();
132133

134+
viewThemeUtils.platform.colorCircularProgressBar(binding.progressBar2, ColorRole.PRIMARY);
135+
133136
getWebView().setWebChromeClient(new WebChromeClient() {
134137
final EditorWebView activity = EditorWebView.this;
135138

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class InternalTwoWaySyncActivity :
5050
override fun onCreate(savedInstanceState: Bundle?) {
5151
super.onCreate(savedInstanceState)
5252

53-
internalTwoWaySyncAdapter = InternalTwoWaySyncAdapter(fileDataStorageManager, user.get(), this, this)
53+
internalTwoWaySyncAdapter =
54+
InternalTwoWaySyncAdapter(fileDataStorageManager, user.get(), this, this, viewThemeUtils)
5455

5556
binding = InternalTwoWaySyncLayoutBinding.inflate(layoutInflater)
5657
setContentView(binding.root)
@@ -163,6 +164,7 @@ class InternalTwoWaySyncActivity :
163164
handleDurationSelected(durations[position].first.inWholeMinutes)
164165
}
165166
}
167+
viewThemeUtils.material.colorTextInputLayout(binding.twoWaySyncIntervalLayout)
166168
}
167169

168170
private fun handleDurationSelected(duration: Long) {
@@ -184,6 +186,7 @@ class InternalTwoWaySyncActivity :
184186
backgroundJobManager.cancelTwoWaySyncJob()
185187
}
186188
}
189+
viewThemeUtils.material.colorMaterialSwitch(binding.twoWaySyncToggle)
187190
}
188191

189192
private fun checkLayoutVisibilities(condition: Boolean) {

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,19 @@ import android.content.Context
1212
import android.view.LayoutInflater
1313
import android.view.ViewGroup
1414
import androidx.recyclerview.widget.RecyclerView
15+
import com.nextcloud.android.common.ui.theme.utils.ColorRole
1516
import com.nextcloud.client.account.User
1617
import com.owncloud.android.databinding.InternalTwoWaySyncViewHolderBinding
1718
import com.owncloud.android.datamodel.FileDataStorageManager
1819
import com.owncloud.android.datamodel.OCFile
20+
import com.owncloud.android.utils.theme.ViewThemeUtils
1921

2022
class InternalTwoWaySyncAdapter(
2123
private val dataStorageManager: FileDataStorageManager,
2224
private val user: User,
2325
val context: Context,
24-
private val onUpdateListener: InternalTwoWaySyncAdapterOnUpdate
26+
private val onUpdateListener: InternalTwoWaySyncAdapterOnUpdate,
27+
private val viewThemeUtils: ViewThemeUtils
2528
) : RecyclerView.Adapter<InternalTwoWaySyncViewHolder>() {
2629

2730
interface InternalTwoWaySyncAdapterOnUpdate {
@@ -30,14 +33,11 @@ class InternalTwoWaySyncAdapter(
3033

3134
var folders: List<OCFile> = dataStorageManager.getInternalTwoWaySyncFolders(user)
3235

33-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InternalTwoWaySyncViewHolder =
34-
InternalTwoWaySyncViewHolder(
35-
InternalTwoWaySyncViewHolderBinding.inflate(
36-
LayoutInflater.from(parent.context),
37-
parent,
38-
false
39-
)
40-
)
36+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InternalTwoWaySyncViewHolder {
37+
val binding = InternalTwoWaySyncViewHolderBinding.inflate(LayoutInflater.from(parent.context), parent, false)
38+
viewThemeUtils.platform.colorImageView(binding.folderIcon, ColorRole.PRIMARY)
39+
return InternalTwoWaySyncViewHolder(binding)
40+
}
4141

4242
override fun getItemCount(): Int = folders.size
4343

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,9 @@ internal class LinkShareViewHolder(itemView: View) : RecyclerView.ViewHolder(ite
9393
}
9494

9595
val label = publicShare.label
96-
if (label.isNullOrEmpty()) {
97-
return
96+
if (!label.isNullOrEmpty()) {
97+
binding.name.text = context.getString(R.string.share_link_with_label, label)
9898
}
99-
100-
binding.name.text = context.getString(R.string.share_link_with_label, label)
10199
}
102100

103101
private fun setSubline(binding: FileDetailsShareLinkShareItemBinding?, context: Context?, publicShare: OCShare) {

app/src/main/java/com/owncloud/android/ui/adapter/ShareViewHolder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ private void setPermissionName(String permissionName) {
135135
if (!TextUtils.isEmpty(permissionName)) {
136136
binding.permissionName.setText(permissionName);
137137
binding.permissionName.setVisibility(View.VISIBLE);
138+
viewThemeUtils.androidx.colorPrimaryTextViewElement(binding.permissionName);
138139
} else {
139140
binding.permissionName.setVisibility(View.GONE);
140141
}

app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
276276
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
277277
if (getFile() != null && user != null) {
278278
viewThemeUtils.platform.themeHorizontalProgressBar(binding.progressBar);
279+
viewThemeUtils.platform.themeCheckbox(binding.folderSyncButton);
279280
progressListener = new DownloadProgressListener(binding.progressBar);
280281
binding.cancelBtn.setOnClickListener(this);
281282
binding.favorite.setOnClickListener(this);

app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import android.view.animation.AnimationUtils;
3535
import android.widget.LinearLayout;
3636

37+
import com.nextcloud.android.common.ui.theme.utils.ColorRole;
3738
import com.nextcloud.client.account.User;
3839
import com.nextcloud.client.account.UserAccountManager;
3940
import com.nextcloud.client.database.entity.FileEntity;
@@ -292,15 +293,22 @@ private void setupView() {
292293
(SearchManager) fileActivity.getSystemService(Context.SEARCH_SERVICE),
293294
binding.searchView,
294295
fileActivity.getComponentName());
295-
viewThemeUtils.androidx.themeToolbarSearchView(binding.searchView);
296+
viewThemeUtils.material.themeSearchCardView(binding.searchCardWrapper);
297+
viewThemeUtils.files.themeContentSearchView(binding.searchView);
298+
viewThemeUtils.platform.colorImageView(binding.searchViewIcon, ColorRole.ON_SURFACE_VARIANT);
299+
viewThemeUtils.platform.colorImageView(binding.pickContactEmailBtn, ColorRole.ON_SURFACE_VARIANT);
296300

301+
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(binding.sharesListInternalShowAll);
297302
viewThemeUtils.material.colorMaterialTextButton(binding.sharesListInternalShowAll);
298303
binding.sharesListInternalShowAll.setOnClickListener(view -> {
299304
internalShareeListAdapter.toggleShowAll();
300305
int textRes = internalShareeListAdapter.isShowAll() ? R.string.show_less : R.string.show_all;
301306
binding.sharesListInternalShowAll.setText(textRes);
302307
});
303308

309+
viewThemeUtils.material.colorMaterialButtonPrimaryOutlined(binding.createLink);
310+
311+
viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(binding.sharesListExternalShowAll);
304312
viewThemeUtils.material.colorMaterialTextButton(binding.sharesListExternalShowAll);
305313
binding.sharesListExternalShowAll.setOnClickListener(view -> {
306314
externalShareeListAdapter.toggleShowAll();

app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@ import android.preference.PreferenceCategory
1616
import android.text.Spannable
1717
import android.text.SpannableString
1818
import android.text.style.ForegroundColorSpan
19+
import android.view.View
1920
import android.widget.ImageView
21+
import android.widget.LinearLayout
2022
import androidx.annotation.DrawableRes
2123
import androidx.annotation.Px
2224
import androidx.annotation.StringRes
2325
import androidx.appcompat.app.ActionBar
26+
import androidx.appcompat.widget.AppCompatAutoCompleteTextView
27+
import androidx.appcompat.widget.SearchView
2428
import androidx.core.content.res.ResourcesCompat
2529
import com.google.android.material.card.MaterialCardView
2630
import com.nextcloud.android.common.ui.color.ColorUtil
@@ -36,6 +40,7 @@ import me.zhanghai.android.fastscroll.FastScrollerBuilder
3640
import me.zhanghai.android.fastscroll.PopupStyles
3741
import javax.inject.Inject
3842

43+
@Suppress("TooManyFunctions")
3944
class FilesSpecificViewThemeUtils @Inject constructor(
4045
schemes: MaterialSchemes,
4146
private val colorUtil: ColorUtil,
@@ -256,6 +261,23 @@ class FilesSpecificViewThemeUtils @Inject constructor(
256261
supportActionBar.setHomeAsUpIndicator(tinted)
257262
}
258263

264+
fun themeContentSearchView(searchView: SearchView) {
265+
withScheme(searchView) { scheme ->
266+
// hacky as no default way is provided
267+
val editText = searchView
268+
.findViewById<View?>(androidx.appcompat.R.id.search_src_text) as AppCompatAutoCompleteTextView
269+
val searchPlate = searchView.findViewById<View?>(androidx.appcompat.R.id.search_plate) as LinearLayout
270+
val closeButton = searchView.findViewById<View?>(androidx.appcompat.R.id.search_close_btn) as ImageView
271+
val searchButton = searchView.findViewById<View?>(androidx.appcompat.R.id.search_button) as ImageView
272+
editText.setHintTextColor(scheme.onSurfaceVariant)
273+
editText.highlightColor = scheme.inverseOnSurface
274+
editText.setTextColor(scheme.onSurface)
275+
closeButton.setColorFilter(scheme.onSurface)
276+
searchButton.setColorFilter(scheme.onSurface)
277+
searchPlate.setBackgroundColor(scheme.surfaceContainerHigh)
278+
}
279+
}
280+
259281
companion object {
260282
private val TAG = FilesSpecificViewThemeUtils::class.simpleName
261283

app/src/main/res/layout/file_details_fragment.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@
198198
<TextView
199199
android:layout_width="match_parent"
200200
android:layout_height="wrap_content"
201+
android:textSize="@dimen/two_line_primary_text_size"
201202
android:text="@string/sync" />
202203
</LinearLayout>
203204

app/src/main/res/layout/file_details_sharing_fragment.xml

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -83,45 +83,53 @@
8383
</LinearLayout>
8484
</LinearLayout>
8585

86-
<LinearLayout
87-
android:id="@+id/search_container"
86+
<com.google.android.material.card.MaterialCardView
87+
android:id="@+id/searchCardWrapper"
8888
android:layout_width="match_parent"
8989
android:layout_height="wrap_content"
90-
android:orientation="horizontal"
91-
android:paddingStart="@dimen/standard_padding"
92-
android:paddingEnd="@dimen/zero">
93-
94-
<ImageView
95-
android:id="@+id/searchViewIcon"
96-
android:layout_width="@dimen/user_icon_size"
97-
android:layout_height="@dimen/user_icon_size"
98-
android:layout_gravity="center_vertical"
99-
android:contentDescription="@string/avatar"
100-
android:padding="@dimen/standard_half_padding"
101-
android:src="@drawable/ic_search_grey" />
90+
android:layout_marginHorizontal="@dimen/standard_margin"
91+
android:layout_marginTop="@dimen/standard_half_margin"
92+
app:cardBackgroundColor="@color/grey_600"
93+
app:cardCornerRadius="28dp"
94+
app:strokeWidth="0dp">
10295

103-
<androidx.appcompat.widget.SearchView
104-
android:id="@+id/searchView"
105-
style="@style/ownCloud.SearchView"
106-
android:layout_width="0dp"
96+
<LinearLayout
97+
android:id="@+id/search_container"
98+
android:layout_width="match_parent"
10799
android:layout_height="wrap_content"
108-
android:layout_marginStart="@dimen/zero"
109-
android:layout_marginEnd="@dimen/standard_quarter_margin"
110-
android:layout_weight="1"
111-
android:hint="@string/share_search"
112-
app:searchIcon="@null" />
113-
114-
<androidx.appcompat.widget.AppCompatImageView
115-
android:id="@+id/pick_contact_email_btn"
116-
android:layout_width="@dimen/minimum_size_for_touchable_area"
117-
android:layout_height="@dimen/minimum_size_for_touchable_area"
118-
android:layout_gravity="center_vertical"
119-
android:layout_marginEnd="@dimen/standard_quarter_margin"
120-
android:contentDescription="@string/pick_contact_to_share_with"
121-
android:padding="12dp"
122-
android:src="@drawable/ic_contact_book" />
100+
android:orientation="horizontal">
101+
102+
<ImageView
103+
android:id="@+id/searchViewIcon"
104+
android:layout_width="wrap_content"
105+
android:layout_height="@dimen/minimum_size_for_touchable_area"
106+
android:layout_gravity="center_vertical"
107+
android:layout_marginStart="@dimen/standard_margin"
108+
android:contentDescription="@null"
109+
android:src="@drawable/ic_search_grey" />
110+
111+
<androidx.appcompat.widget.SearchView
112+
android:id="@+id/searchView"
113+
style="@style/ownCloud.SearchView"
114+
android:layout_width="0dp"
115+
android:layout_height="wrap_content"
116+
android:layout_weight="1"
117+
android:hint="@string/share_search"
118+
app:searchIcon="@null" />
119+
120+
<androidx.appcompat.widget.AppCompatImageView
121+
android:id="@+id/pick_contact_email_btn"
122+
android:layout_width="@dimen/minimum_size_for_touchable_area"
123+
android:layout_height="@dimen/minimum_size_for_touchable_area"
124+
android:layout_gravity="center_vertical"
125+
android:contentDescription="@string/pick_contact_to_share_with"
126+
android:paddingStart="@dimen/standard_half_padding"
127+
android:paddingEnd="@dimen/standard_padding"
128+
android:src="@drawable/ic_contact_book" />
123129

124-
</LinearLayout>
130+
</LinearLayout>
131+
132+
</com.google.android.material.card.MaterialCardView>
125133

126134
<TextView
127135
android:paddingStart="@dimen/standard_padding"
@@ -154,7 +162,7 @@
154162
android:id="@+id/divider2"
155163
android:layout_width="match_parent"
156164
android:layout_height="1dp"
157-
android:background="?android:attr/listDivider" />
165+
android:background="@color/list_divider_background" />
158166

159167
<TextView
160168
android:id="@+id/external_shares_headline"
@@ -172,8 +180,8 @@
172180
style="@style/Widget.Material3.Button.OutlinedButton"
173181
android:layout_width="match_parent"
174182
android:layout_height="wrap_content"
175-
android:layout_marginStart="@dimen/standard_double_margin"
176-
android:layout_marginEnd="@dimen/standard_double_margin"
183+
android:layout_marginStart="@dimen/standard_margin"
184+
android:layout_marginEnd="@dimen/standard_margin"
177185
app:icon="@drawable/file_link"
178186
app:iconGravity="textStart"
179187
android:text="@string/create_link" />
@@ -202,5 +210,4 @@
202210

203211
</FrameLayout>
204212

205-
206213
</androidx.core.widget.NestedScrollView>

0 commit comments

Comments
 (0)