Skip to content

Commit bbf1a7d

Browse files
#1277 Redesign note details
Signed-off-by: Stefan Niedermann <[email protected]>
1 parent fc8baca commit bbf1a7d

15 files changed

+386
-362
lines changed

app/src/main/java/it/niedermann/owncloud/notes/branding/BrandingUtil.java

+13
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import androidx.lifecycle.MediatorLiveData;
2222
import androidx.preference.PreferenceManager;
2323

24+
import com.google.android.material.textfield.TextInputLayout;
25+
2426
import it.niedermann.android.sharedpreferences.SharedPreferenceIntLiveData;
2527
import it.niedermann.owncloud.notes.NotesApplication;
2628
import it.niedermann.owncloud.notes.R;
@@ -161,4 +163,15 @@ public static void applyBrandToLayerDrawable(@NonNull LayerDrawable check, @IdRe
161163
DrawableCompat.setTint(drawable, mainColor);
162164
}
163165
}
166+
167+
public static void applyBrandToEditTextInputLayout(@ColorInt int color, @NonNull TextInputLayout til) {
168+
final int colorPrimary = ContextCompat.getColor(til.getContext(), R.color.primary);
169+
final int colorAccent = ContextCompat.getColor(til.getContext(), R.color.accent);
170+
final ColorStateList colorDanger = ColorStateList.valueOf(ContextCompat.getColor(til.getContext(), R.color.design_default_color_error));
171+
til.setBoxStrokeColor(contrastRatioIsSufficient(color, colorPrimary) ? color : colorAccent);
172+
til.setHintTextColor(ColorStateList.valueOf(contrastRatioIsSufficient(color, colorPrimary) ? color : colorAccent));
173+
til.setErrorTextColor(colorDanger);
174+
til.setBoxStrokeErrorColor(colorDanger);
175+
til.setErrorIconTintList(colorDanger);
176+
}
164177
}

app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java

+4-18
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,18 @@
3535
import it.niedermann.owncloud.notes.R;
3636
import it.niedermann.owncloud.notes.accountpicker.AccountPickerDialogFragment;
3737
import it.niedermann.owncloud.notes.branding.BrandedFragment;
38-
import it.niedermann.owncloud.notes.edit.category.CategoryDialogFragment;
39-
import it.niedermann.owncloud.notes.edit.category.CategoryDialogFragment.CategoryDialogListener;
4038
import it.niedermann.owncloud.notes.edit.details.NoteDetailsDialogFragment;
41-
import it.niedermann.owncloud.notes.edit.title.EditTitleDialogFragment;
42-
import it.niedermann.owncloud.notes.edit.title.EditTitleDialogFragment.EditTitleListener;
4339
import it.niedermann.owncloud.notes.persistence.NotesRepository;
4440
import it.niedermann.owncloud.notes.persistence.entity.Account;
4541
import it.niedermann.owncloud.notes.persistence.entity.Note;
4642
import it.niedermann.owncloud.notes.shared.model.DBStatus;
4743
import it.niedermann.owncloud.notes.shared.model.ISyncCallback;
4844
import it.niedermann.owncloud.notes.shared.util.NoteUtil;
4945
import it.niedermann.owncloud.notes.shared.util.NotesColorUtil;
50-
import it.niedermann.owncloud.notes.shared.util.ShareUtil;
5146

5247
import static it.niedermann.owncloud.notes.NotesApplication.isDarkThemeActive;
5348

54-
public abstract class BaseNoteFragment extends BrandedFragment implements CategoryDialogListener, EditTitleListener {
49+
public abstract class BaseNoteFragment extends BrandedFragment implements NoteDetailsDialogFragment.NoteDetailsListener {
5550

5651
private static final String TAG = BaseNoteFragment.class.getSimpleName();
5752
protected final ExecutorService executor = Executors.newCachedThreadPool();
@@ -284,22 +279,13 @@ public void onScheduled() {
284279
}
285280

286281
@Override
287-
public void onCategoryChosen(String category) {
288-
repo.setCategory(localAccount, note.getId(), category);
282+
public void onNoteDetailsEdited(String title, String category) {
283+
titleModified = true;
284+
note.setTitle(title);
289285
note.setCategory(category);
290286
listener.onNoteUpdated(note);
291287
}
292288

293-
@Override
294-
public void onTitleEdited(String newTitle) {
295-
titleModified = true;
296-
note.setTitle(newTitle);
297-
executor.submit(() -> {
298-
note = repo.updateNoteAndSync(localAccount, note, note.getContent(), newTitle, null);
299-
requireActivity().runOnUiThread(() -> listener.onNoteUpdated(note));
300-
});
301-
}
302-
303289
public void moveNote(Account account) {
304290
final LiveData<Note> moveLiveData = repo.moveNoteToAnotherAccount(account, note);
305291
moveLiveData.observe(this, (v) -> moveLiveData.removeObservers(this));

app/src/main/java/it/niedermann/owncloud/notes/edit/EditNoteActivity.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,9 @@
2929
import it.niedermann.owncloud.notes.R;
3030
import it.niedermann.owncloud.notes.accountpicker.AccountPickerListener;
3131
import it.niedermann.owncloud.notes.databinding.ActivityEditBinding;
32-
import it.niedermann.owncloud.notes.databinding.ActivityEditBinding;
33-
import it.niedermann.owncloud.notes.edit.category.CategoryViewModel;
32+
import it.niedermann.owncloud.notes.edit.details.CategoryViewModel;
3433
import it.niedermann.owncloud.notes.persistence.entity.Account;
3534
import it.niedermann.owncloud.notes.persistence.entity.Note;
36-
import it.niedermann.owncloud.notes.shared.model.DBStatus;
3735
import it.niedermann.owncloud.notes.shared.model.NavigationCategory;
3836
import it.niedermann.owncloud.notes.shared.util.NoteUtil;
3937
import it.niedermann.owncloud.notes.shared.util.ShareUtil;

app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryAdapter.java

-134
This file was deleted.

app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryDialogFragment.java

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import it.niedermann.owncloud.notes.branding.BrandedDialogFragment;
2525
import it.niedermann.owncloud.notes.branding.BrandingUtil;
2626
import it.niedermann.owncloud.notes.databinding.DialogChangeCategoryBinding;
27+
import it.niedermann.owncloud.notes.edit.details.CategoryAdapter;
28+
import it.niedermann.owncloud.notes.edit.details.CategoryViewModel;
2729
import it.niedermann.owncloud.notes.main.navigation.NavigationItem;
2830

2931
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package it.niedermann.owncloud.notes.edit.details;
2+
3+
import android.content.Context;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.TextView;
8+
9+
import androidx.annotation.NonNull;
10+
import androidx.annotation.Nullable;
11+
import androidx.appcompat.widget.AppCompatImageView;
12+
import androidx.core.content.ContextCompat;
13+
import androidx.recyclerview.widget.RecyclerView;
14+
15+
import java.util.ArrayList;
16+
import java.util.List;
17+
18+
import it.niedermann.owncloud.notes.R;
19+
import it.niedermann.owncloud.notes.databinding.ItemCategoryBinding;
20+
import it.niedermann.owncloud.notes.main.navigation.NavigationItem;
21+
import it.niedermann.owncloud.notes.shared.util.NoteUtil;
22+
23+
public class CategoryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
24+
25+
@NonNull
26+
private final List<NavigationItem> categories = new ArrayList<>();
27+
@NonNull
28+
private final CategoryListener listener;
29+
private final Context context;
30+
31+
32+
public CategoryAdapter(@NonNull Context context, @NonNull CategoryListener categoryListener) {
33+
this.context = context;
34+
this.listener = categoryListener;
35+
}
36+
37+
@NonNull
38+
@Override
39+
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
40+
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_category, parent, false);
41+
return new CategoryViewHolder(v);
42+
}
43+
44+
@Override
45+
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
46+
final NavigationItem category = categories.get(position);
47+
final CategoryViewHolder categoryViewHolder = (CategoryViewHolder) holder;
48+
categoryViewHolder.getIcon().setImageDrawable(ContextCompat.getDrawable(context, category.icon));
49+
categoryViewHolder.getCategoryWrapper().setOnClickListener((v) -> listener.onCategoryChosen(category.label));
50+
categoryViewHolder.getCategory().setText(NoteUtil.extendCategory(category.label));
51+
if (category.count != null && category.count > 0) {
52+
categoryViewHolder.getCount().setText(String.valueOf(category.count));
53+
} else {
54+
categoryViewHolder.getCount().setVisibility(View.GONE);
55+
}
56+
}
57+
58+
@Override
59+
public int getItemCount() {
60+
return categories.size();
61+
}
62+
63+
static class CategoryViewHolder extends RecyclerView.ViewHolder {
64+
private final ItemCategoryBinding binding;
65+
66+
private CategoryViewHolder(View view) {
67+
super(view);
68+
binding = ItemCategoryBinding.bind(view);
69+
}
70+
71+
private View getCategoryWrapper() {
72+
return binding.categoryWrapper;
73+
}
74+
75+
private AppCompatImageView getIcon() {
76+
return binding.icon;
77+
}
78+
79+
private TextView getCategory() {
80+
return binding.category;
81+
}
82+
83+
private TextView getCount() {
84+
return binding.count;
85+
}
86+
}
87+
88+
/**
89+
* @deprecated use {@link #setCategoryList(List)}
90+
*/
91+
public void setCategoryList(List<NavigationItem.CategoryNavigationItem> categories, @Nullable String currentSearchString) {
92+
setCategoryList(categories);
93+
}
94+
95+
public void setCategoryList(@NonNull List<NavigationItem.CategoryNavigationItem> categories) {
96+
this.categories.clear();
97+
this.categories.addAll(categories);
98+
notifyDataSetChanged();
99+
}
100+
101+
public interface CategoryListener {
102+
void onCategoryChosen(String category);
103+
104+
default void onCategoryAdded() {
105+
}
106+
107+
default void onCategoryCleared() {
108+
}
109+
}
110+
}

app/src/main/java/it/niedermann/owncloud/notes/edit/category/CategoryViewModel.java renamed to app/src/main/java/it/niedermann/owncloud/notes/edit/details/CategoryViewModel.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package it.niedermann.owncloud.notes.edit.category;
1+
package it.niedermann.owncloud.notes.edit.details;
22

33
import android.app.Application;
44
import android.text.TextUtils;
@@ -13,6 +13,7 @@
1313
import it.niedermann.owncloud.notes.main.navigation.NavigationItem;
1414
import it.niedermann.owncloud.notes.persistence.NotesRepository;
1515

16+
import static androidx.lifecycle.Transformations.distinctUntilChanged;
1617
import static androidx.lifecycle.Transformations.map;
1718
import static androidx.lifecycle.Transformations.switchMap;
1819
import static it.niedermann.owncloud.notes.shared.util.DisplayUtils.convertToCategoryNavigationItem;
@@ -35,7 +36,7 @@ public void postSearchTerm(@NonNull String searchTerm) {
3536

3637
@NonNull
3738
public LiveData<List<NavigationItem.CategoryNavigationItem>> getCategories(long accountId) {
38-
return switchMap(this.searchTerm, searchTerm ->
39+
return switchMap(distinctUntilChanged(this.searchTerm), searchTerm ->
3940
map(repo.searchCategories$(accountId, TextUtils.isEmpty(searchTerm) ? "%" : "%" + searchTerm + "%"),
4041
categories -> convertToCategoryNavigationItem(getApplication(), categories)));
4142
}

0 commit comments

Comments
 (0)