Skip to content

Commit 45528cf

Browse files
feat(toolbar): Provides toolbar for native markdown editor
Signed-off-by: Stefan Niedermann <[email protected]>
1 parent b69a0d1 commit 45528cf

File tree

3 files changed

+114
-59
lines changed

3 files changed

+114
-59
lines changed

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

+28-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.content.res.ColorStateList;
1414
import android.graphics.Color;
1515
import android.graphics.PorterDuff;
16+
import android.graphics.drawable.Drawable;
1617
import android.graphics.drawable.LayerDrawable;
1718
import android.util.Log;
1819
import android.view.View;
@@ -26,6 +27,8 @@
2627
import androidx.appcompat.widget.SearchView;
2728
import androidx.appcompat.widget.Toolbar;
2829
import androidx.core.content.ContextCompat;
30+
import androidx.core.graphics.BlendModeColorFilterCompat;
31+
import androidx.core.graphics.BlendModeCompat;
2932
import androidx.core.graphics.drawable.DrawableCompat;
3033

3134
import com.google.android.material.appbar.AppBarLayout;
@@ -35,7 +38,11 @@
3538
import com.nextcloud.android.common.ui.theme.ViewThemeUtilsBase;
3639
import com.nextcloud.android.common.ui.theme.utils.MaterialViewThemeUtils;
3740

41+
import java.util.Optional;
42+
43+
import dynamiccolor.DynamicScheme;
3844
import dynamiccolor.MaterialDynamicColors;
45+
import it.niedermann.android.markdown.controller.MarkdownToolbarController;
3946
import it.niedermann.android.util.ColorUtil;
4047
import it.niedermann.owncloud.notes.R;
4148
import it.niedermann.owncloud.notes.main.navigation.NavigationItem;
@@ -190,8 +197,8 @@ public void themeSearchToolbar(@NonNull MaterialToolbar toolbar) {
190197
}
191198

192199
/**
193-
* @deprecated Should be replaced with {@link com.google.android.material.search.SearchView}
194200
* @see com.nextcloud.android.common.ui.theme.utils.AndroidXViewThemeUtils#themeToolbarSearchView(SearchView)
201+
* @deprecated Should be replaced with {@link com.google.android.material.search.SearchView}
195202
*/
196203
@Deprecated
197204
public void themeToolbarSearchView(@NonNull SearchView searchView) {
@@ -209,4 +216,24 @@ public void themeToolbarSearchView(@NonNull SearchView searchView) {
209216
return searchView;
210217
});
211218
}
219+
220+
public void themeToolbar(@NonNull Toolbar toolbar) {
221+
withScheme(toolbar, scheme -> {
222+
toolbar.setBackgroundColor(dynamicColor.surface().getArgb(scheme));
223+
// toolbar.setNavigationIconTint(dynamicColor.onSurface().getArgb(scheme));
224+
toolbar.setTitleTextColor(dynamicColor.onSurface().getArgb(scheme));
225+
final var overflowIcon = Optional.ofNullable(toolbar.getOverflowIcon());
226+
overflowIcon.ifPresent(drawable -> colorTrailingIcon(scheme, drawable));
227+
return toolbar;
228+
});
229+
}
230+
231+
private void colorTrailingIcon(@NonNull DynamicScheme scheme,
232+
@NonNull Drawable icon) {
233+
icon.setColorFilter(
234+
BlendModeColorFilterCompat.createBlendModeColorFilterCompat(
235+
dynamicColor.surfaceVariant().getArgb(scheme),
236+
BlendModeCompat.SRC_ATOP
237+
));
238+
}
212239
}

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

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
3535
import com.google.android.material.floatingactionbutton.FloatingActionButton;
3636

37+
import it.niedermann.android.markdown.controller.ControllerConnector;
3738
import it.niedermann.owncloud.notes.R;
3839
import it.niedermann.owncloud.notes.branding.BrandingUtil;
3940
import it.niedermann.owncloud.notes.databinding.FragmentNoteEditBinding;
@@ -124,6 +125,7 @@ protected ExtendedFloatingActionButton getNormalEditButton() {
124125
@Override
125126
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
126127
binding = FragmentNoteEditBinding.inflate(inflater, container, false);
128+
ControllerConnector.connect(getViewLifecycleOwner(), binding.editContent, binding.controller);
127129
return binding.getRoot();
128130
}
129131

@@ -272,6 +274,7 @@ public void applyBrand(int color) {
272274

273275
final var util = BrandingUtil.of(color, requireContext());
274276
binding.editContent.setSearchColor(color);
277+
util.notes.themeToolbar(binding.controller);
275278
binding.editContent.setHighlightColor(util.notes.getTextHighlightBackgroundColor(requireContext(), color, colorPrimary, colorAccent));
276279
}
277280

+83-58
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
<?xml version="1.0" encoding="utf-8"?>
2-
<!--
1+
<?xml version="1.0" encoding="utf-8"?><!--
32
~ Nextcloud Notes - Android Client
43
~
54
~ SPDX-FileCopyrightText: 2015-2024 Nextcloud GmbH and Nextcloud contributors
@@ -20,68 +19,94 @@
2019
android:focusableInTouchMode="true"
2120
android:orientation="horizontal" />
2221

23-
<ScrollView
24-
android:id="@+id/scrollView"
22+
<androidx.constraintlayout.widget.ConstraintLayout
2523
android:layout_width="match_parent"
2624
android:layout_height="match_parent"
27-
android:fillViewport="true"
28-
android:orientation="vertical"
29-
tools:context="it.niedermann.owncloud.notes.edit.EditNoteActivity">
25+
android:orientation="vertical">
3026

31-
<it.niedermann.android.markdown.MarkdownEditorImpl
32-
android:id="@+id/editContent"
27+
<ScrollView
28+
android:id="@+id/scrollView"
29+
android:layout_width="match_parent"
30+
android:layout_height="0dp"
31+
android:fillViewport="true"
32+
android:orientation="vertical"
33+
app:layout_constraintBottom_toTopOf="@id/controller"
34+
app:layout_constraintEnd_toEndOf="parent"
35+
app:layout_constraintStart_toStartOf="parent"
36+
app:layout_constraintTop_toTopOf="parent"
37+
tools:context="it.niedermann.owncloud.notes.edit.EditNoteActivity">
38+
39+
<it.niedermann.android.markdown.MarkdownEditorImpl
40+
android:id="@+id/editContent"
41+
android:layout_width="match_parent"
42+
android:layout_height="wrap_content"
43+
android:layout_marginHorizontal="@dimen/spacer_activity_sides"
44+
android:background="@android:color/transparent"
45+
android:ems="10"
46+
android:gravity="top"
47+
android:inputType="textMultiLine|textCapSentences"
48+
android:lineSpacingMultiplier="@dimen/note_line_spacing"
49+
android:padding="@dimen/spacer_2x"
50+
android:textColor="@color/fg_default"
51+
tools:text="@tools:sample/lorem/random" />
52+
</ScrollView>
53+
54+
<it.niedermann.android.markdown.controller.MarkdownToolbarController
55+
android:id="@+id/controller"
3356
android:layout_width="match_parent"
3457
android:layout_height="wrap_content"
35-
android:layout_marginHorizontal="@dimen/spacer_activity_sides"
36-
android:background="@android:color/transparent"
37-
android:ems="10"
38-
android:gravity="top"
39-
android:inputType="textMultiLine|textCapSentences"
40-
android:lineSpacingMultiplier="@dimen/note_line_spacing"
41-
android:padding="@dimen/spacer_2x"
42-
android:textColor="@color/fg_default"
43-
tools:text="@tools:sample/lorem/random" />
44-
</ScrollView>
58+
android:gravity="bottom"
59+
app:layout_constraintBottom_toBottomOf="parent"
60+
app:layout_constraintEnd_toEndOf="parent"
61+
app:layout_constraintStart_toStartOf="parent"
62+
app:menu="@menu/toolbar" />
4563

46-
<com.google.android.material.floatingactionbutton.FloatingActionButton
47-
android:id="@+id/searchPrev"
48-
style="?attr/floatingActionButtonSmallSecondaryStyle"
49-
android:layout_width="wrap_content"
50-
android:layout_height="wrap_content"
51-
android:layout_gravity="bottom|end"
52-
android:layout_margin="@dimen/spacer_2x"
53-
android:contentDescription="@string/simple_prev"
54-
android:translationY="-56dp"
55-
android:visibility="gone"
56-
app:backgroundTint="@color/defaultBrand"
57-
app:srcCompat="@drawable/ic_keyboard_arrow_up_white_24dp"
58-
tools:visibility="visible" />
64+
<com.google.android.material.floatingactionbutton.FloatingActionButton
65+
android:id="@+id/searchPrev"
66+
style="?attr/floatingActionButtonSmallSecondaryStyle"
67+
android:layout_width="wrap_content"
68+
android:layout_height="wrap_content"
69+
android:layout_gravity="bottom|end"
70+
android:layout_margin="@dimen/spacer_2x"
71+
android:contentDescription="@string/simple_prev"
72+
android:translationY="-56dp"
73+
android:visibility="gone"
74+
app:backgroundTint="@color/defaultBrand"
75+
app:layout_constraintBottom_toTopOf="@id/controller"
76+
app:layout_constraintEnd_toEndOf="parent"
77+
app:srcCompat="@drawable/ic_keyboard_arrow_up_white_24dp"
78+
tools:visibility="visible" />
5979

60-
<com.google.android.material.floatingactionbutton.FloatingActionButton
61-
android:id="@+id/searchNext"
62-
style="?attr/floatingActionButtonSmallSecondaryStyle"
63-
android:layout_width="wrap_content"
64-
android:layout_height="wrap_content"
65-
android:layout_gravity="bottom|end"
66-
android:layout_margin="@dimen/spacer_2x"
67-
android:contentDescription="@string/simple_next"
68-
android:visibility="gone"
69-
app:backgroundTint="@color/defaultBrand"
70-
app:srcCompat="@drawable/ic_keyboard_arrow_down_white_24dp"
71-
tools:visibility="visible" />
80+
<com.google.android.material.floatingactionbutton.FloatingActionButton
81+
android:id="@+id/searchNext"
82+
style="?attr/floatingActionButtonSmallSecondaryStyle"
83+
android:layout_width="wrap_content"
84+
android:layout_height="wrap_content"
85+
android:layout_gravity="bottom|end"
86+
android:layout_margin="@dimen/spacer_2x"
87+
android:contentDescription="@string/simple_next"
88+
android:visibility="gone"
89+
app:backgroundTint="@color/defaultBrand"
90+
app:layout_constraintBottom_toTopOf="@id/controller"
91+
app:layout_constraintEnd_toEndOf="parent"
92+
app:srcCompat="@drawable/ic_keyboard_arrow_down_white_24dp"
93+
tools:visibility="visible" />
7294

73-
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
74-
android:id="@+id/direct_editing"
75-
style="?attr/floatingActionButtonPrimaryStyle"
76-
android:layout_width="wrap_content"
77-
android:layout_height="wrap_content"
78-
android:layout_gravity="bottom|end"
79-
android:layout_margin="@dimen/spacer_2x"
80-
android:contentDescription="@string/noteMode_rich_edit"
81-
android:text="@string/noteMode_rich_edit"
82-
android:visibility="visible"
83-
app:backgroundTint="@color/defaultBrand"
84-
app:layout_anchor="@id/scrollView"
85-
app:layout_anchorGravity="bottom|end"
86-
app:icon="@drawable/ic_rich_editing" />
95+
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
96+
android:id="@+id/direct_editing"
97+
style="?attr/floatingActionButtonPrimaryStyle"
98+
android:layout_width="wrap_content"
99+
android:layout_height="wrap_content"
100+
android:layout_gravity="bottom|end"
101+
android:layout_margin="@dimen/spacer_2x"
102+
android:contentDescription="@string/noteMode_rich_edit"
103+
android:text="@string/noteMode_rich_edit"
104+
android:visibility="visible"
105+
app:backgroundTint="@color/defaultBrand"
106+
app:icon="@drawable/ic_rich_editing"
107+
app:layout_anchor="@id/scrollView"
108+
app:layout_anchorGravity="bottom|end"
109+
app:layout_constraintBottom_toTopOf="@id/controller"
110+
app:layout_constraintEnd_toEndOf="parent" />
111+
</androidx.constraintlayout.widget.ConstraintLayout>
87112
</androidx.coordinatorlayout.widget.CoordinatorLayout>

0 commit comments

Comments
 (0)