Skip to content

Commit 58b69fb

Browse files
tobiasKaminskyalperozturk96
authored andcommitted
wip
Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
1 parent e62d4ce commit 58b69fb

4 files changed

Lines changed: 114 additions & 66 deletions

File tree

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH
5+
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
6+
*/
7+
package com.nextcloud.ui.tags
8+
9+
import android.content.Context
10+
import android.content.res.ColorStateList
11+
import android.graphics.Color
12+
import com.google.android.material.chip.Chip
13+
import com.google.android.material.chip.ChipGroup
14+
import com.owncloud.android.R
15+
import com.owncloud.android.lib.resources.tags.Tag
16+
import com.owncloud.android.utils.theme.ViewThemeUtils
17+
18+
class TagChipsHelper(
19+
private val viewThemeUtils: ViewThemeUtils
20+
) {
21+
fun refresh(
22+
context: Context,
23+
chipGroup: ChipGroup,
24+
tags: List<Tag>,
25+
onEditClicked: Runnable
26+
) {
27+
chipGroup.removeAllViews()
28+
chipGroup.visibility = android.view.View.VISIBLE
29+
30+
for (tag in tags) {
31+
val chip = Chip(context).apply {
32+
text = tag.name
33+
chipBackgroundColor = ColorStateList.valueOf(
34+
context.resources.getColor(R.color.bg_default, context.theme)
35+
)
36+
shapeAppearanceModel = shapeAppearanceModel.toBuilder()
37+
.setAllCornerSizes(100.0f)
38+
.build()
39+
isClickable = false
40+
}
41+
chip.setEnsureMinTouchTargetSize(false)
42+
viewThemeUtils.material.themeChipSuggestion(chip)
43+
44+
if (tag.color != null) {
45+
val color = Color.parseColor(tag.color)
46+
chip.chipStrokeColor = ColorStateList.valueOf(color)
47+
chip.setTextColor(color)
48+
}
49+
50+
chipGroup.addView(chip)
51+
}
52+
53+
val editChip = Chip(context).apply {
54+
setChipIconResource(R.drawable.ic_edit)
55+
setText(R.string.manage_tags)
56+
chipBackgroundColor = ColorStateList.valueOf(
57+
context.resources.getColor(R.color.bg_default, context.theme)
58+
)
59+
shapeAppearanceModel = shapeAppearanceModel.toBuilder()
60+
.setAllCornerSizes(100.0f)
61+
.build()
62+
setOnClickListener { onEditClicked.run() }
63+
}
64+
editChip.setEnsureMinTouchTargetSize(false)
65+
viewThemeUtils.material.themeChipSuggestion(editChip)
66+
chipGroup.addView(editChip)
67+
}
68+
}

app/src/main/java/com/nextcloud/ui/tags/TagManagementViewModel.kt

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -117,29 +117,30 @@ class TagManagementViewModel @Inject constructor(
117117
val nextcloudClient = clientFactory.createNextcloudClient(currentAccountProvider.user)
118118
val createResult = CreateTagRemoteOperation(name).execute(nextcloudClient)
119119

120-
if (createResult.isSuccess) {
121-
val ownCloudClient = clientFactory.create(currentAccountProvider.user)
122-
val tagsResult = GetTagsRemoteOperation().execute(ownCloudClient)
123-
124-
if (tagsResult.isSuccess) {
125-
val allTags = tagsResult.resultData
126-
val newTag = allTags.find { it.name == name }
127-
128-
if (newTag != null) {
129-
PutTagRemoteOperation(newTag.id, fileId).execute(nextcloudClient)
130-
131-
_uiState.update { state ->
132-
if (state is TagUiState.Loaded) {
133-
state.copy(
134-
allTags = allTags,
135-
assignedTagIds = state.assignedTagIds + newTag.id
136-
)
137-
} else {
138-
TagUiState.Loaded(
139-
allTags = allTags,
140-
assignedTagIds = setOf(newTag.id)
141-
)
142-
}
120+
if (!createResult.isSuccess) {
121+
return@launch
122+
}
123+
val ownCloudClient = clientFactory.create(currentAccountProvider.user)
124+
val tagsResult = GetTagsRemoteOperation().execute(ownCloudClient)
125+
126+
if (tagsResult.isSuccess) {
127+
val allTags = tagsResult.resultData
128+
val newTag = allTags.find { it.name == name }
129+
130+
if (newTag != null) {
131+
PutTagRemoteOperation(newTag.id, fileId).execute(nextcloudClient)
132+
133+
_uiState.update { state ->
134+
if (state is TagUiState.Loaded) {
135+
state.copy(
136+
allTags = allTags,
137+
assignedTagIds = state.assignedTagIds + newTag.id
138+
)
139+
} else {
140+
TagUiState.Loaded(
141+
allTags = allTags,
142+
assignedTagIds = setOf(newTag.id)
143+
)
143144
}
144145
}
145146
}

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

Lines changed: 14 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,14 @@
1010
package com.owncloud.android.ui.fragment;
1111

1212
import android.content.Context;
13-
import android.content.res.ColorStateList;
1413
import android.graphics.Bitmap;
15-
import android.graphics.Color;
1614
import android.os.Bundle;
1715
import android.view.LayoutInflater;
1816
import android.view.Menu;
1917
import android.view.View;
2018
import android.view.View.OnClickListener;
2119
import android.view.ViewGroup;
2220

23-
import com.google.android.material.chip.Chip;
2421
import com.google.android.material.floatingactionbutton.FloatingActionButton;
2522
import com.google.android.material.tabs.TabLayout;
2623
import com.nextcloud.client.account.User;
@@ -34,6 +31,7 @@
3431
import com.nextcloud.client.preferences.AppPreferences;
3532
import com.nextcloud.ui.fileactions.FileAction;
3633
import com.nextcloud.ui.fileactions.FileActionsBottomSheet;
34+
import com.nextcloud.ui.tags.TagChipsHelper;
3735
import com.nextcloud.ui.tags.TagManagementBottomSheet;
3836
import com.nextcloud.utils.MenuUtils;
3937
import com.nextcloud.utils.extensions.BundleExtensionsKt;
@@ -114,6 +112,8 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
114112
@Inject ViewThemeUtils viewThemeUtils;
115113
@Inject BackgroundJobManager backgroundJobManager;
116114

115+
private TagChipsHelper tagChipsHelper;
116+
117117
/**
118118
* Public factory method to create new FileDetailFragment instances.
119119
* <p>
@@ -297,47 +297,18 @@ private void onOverflowIconClicked() {
297297
}
298298

299299
private void refreshTagChips(Context context) {
300-
binding.tagsGroup.removeAllViews();
301-
binding.tagsGroup.setVisibility(View.VISIBLE);
302-
303-
for (Tag tag : getFile().getTags()) {
304-
Chip chip = new Chip(context);
305-
chip.setText(tag.getName());
306-
chip.setChipBackgroundColor(ColorStateList.valueOf(getResources().getColor(R.color.bg_default,
307-
context.getTheme())));
308-
chip.setShapeAppearanceModel(chip.getShapeAppearanceModel().toBuilder().setAllCornerSizes((100.0f))
309-
.build());
310-
chip.setEnsureMinTouchTargetSize(false);
311-
chip.setClickable(false);
312-
viewThemeUtils.material.themeChipSuggestion(chip);
313-
314-
if (tag.getColor() != null) {
315-
int color = Color.parseColor(tag.getColor());
316-
chip.setChipStrokeColor(ColorStateList.valueOf(color));
317-
chip.setTextColor(color);
300+
new TagChipsHelper(viewThemeUtils).refresh(
301+
context,
302+
binding.tagsGroup,
303+
getFile().getTags(),
304+
() -> {
305+
TagManagementBottomSheet bottomSheet = TagManagementBottomSheet.Companion.newInstance(
306+
getFile().getLocalId(),
307+
getFile().getTags()
308+
);
309+
bottomSheet.show(getChildFragmentManager(), "tag_management");
318310
}
319-
320-
binding.tagsGroup.addView(chip);
321-
}
322-
323-
Chip editChip = new Chip(context);
324-
editChip.setChipIconResource(R.drawable.ic_edit);
325-
editChip.setText(R.string.manage_tags);
326-
editChip.setChipBackgroundColor(ColorStateList.valueOf(getResources().getColor(R.color.bg_default,
327-
context.getTheme())));
328-
editChip.setShapeAppearanceModel(editChip.getShapeAppearanceModel().toBuilder().setAllCornerSizes(100.0f)
329-
.build());
330-
editChip.setEnsureMinTouchTargetSize(false);
331-
viewThemeUtils.material.themeChipSuggestion(editChip);
332-
editChip.setOnClickListener(v -> {
333-
TagManagementBottomSheet bottomSheet = TagManagementBottomSheet.Companion.newInstance(
334-
getFile().getLocalId(),
335-
getFile().getTags()
336-
);
337-
// FileActionsBottomSheet bottomSheet = FileActionsBottomSheet.Companion.newInstance(getFile(), false);
338-
bottomSheet.show(getChildFragmentManager(), "tag_management");
339-
});
340-
binding.tagsGroup.addView(editChip);
311+
);
341312
}
342313

343314
private void setupViewPager() {

gradle/verification-metadata.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21109,6 +21109,14 @@
2110921109
<sha256 value="5b9cf7ee434a9aeab4feb814b02c4301484dabad11182765c1663a92306e3f3a" origin="Generated by Gradle" reason="Artifact is not signed"/>
2111021110
</artifact>
2111121111
</component>
21112+
<component group="com.github.nextcloud" name="android-library" version="34f714cf39a10f47e10ea0e760b6356422c37af9">
21113+
<artifact name="android-library-34f714cf39a10f47e10ea0e760b6356422c37af9.aar">
21114+
<sha256 value="466a9b32866e76c9613a15f2fcb749636a46b484b16fe8debde2e095c35f70a5" origin="Generated by Gradle" reason="Artifact is not signed"/>
21115+
</artifact>
21116+
<artifact name="android-library-34f714cf39a10f47e10ea0e760b6356422c37af9.module">
21117+
<sha256 value="b1a21dd2e8f207eca79fc3e560afc6c66da73cba02ee19b4c661569cfb1dbeca" origin="Generated by Gradle" reason="Artifact is not signed"/>
21118+
</artifact>
21119+
</component>
2111221120
<component group="com.github.nextcloud" name="android-library" version="3546bd82fc">
2111321121
<artifact name="android-library-3546bd82fc.aar">
2111421122
<sha256 value="3f571c11cc718d9a83c7afa356d8d6312bfa688caf09469b615f40cc6e2906a7" origin="Generated by Gradle" reason="Artifact is not signed"/>

0 commit comments

Comments
 (0)