Skip to content

Commit 20030cb

Browse files
committedMay 10, 2024
Introduce margin between elements + huge refactoring of layout display of elements
1 parent 0500382 commit 20030cb

35 files changed

+672
-516
lines changed
 

‎app/src/main/java/fr/nuage/souvenirs/model/Album.java

+19
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ public class Album {
4747
private UUID id;
4848
private String albumImage;
4949
private MutableLiveData<String> ldAlbumImage = new MutableLiveData<>();
50+
private int elementMargin = 1;
51+
private MutableLiveData<Integer> ldElementMargin = new MutableLiveData<>();
5052
private boolean unsavedModifications = false;
5153

5254

@@ -68,6 +70,7 @@ public void updateAllLiveDataObject() {
6870
ldPages.postValue(pages);
6971
ldDate.postValue(date);
7072
ldAlbumImage.postValue(albumImage);
73+
ldElementMargin.postValue(elementMargin);
7174
}
7275

7376
public String getName(){
@@ -111,6 +114,7 @@ public JSONObject toJSON() {
111114
if (getAlbumImage() != null) {
112115
json.put("albumImage", Utils.getRelativePath(getAlbumPath(),getAlbumImage()));
113116
}
117+
json.put("elementMargin", getElementMargin());
114118
} catch (JSONException e) {
115119
e.printStackTrace();
116120
return null;
@@ -209,6 +213,9 @@ public boolean load() {
209213
}
210214
}
211215
}
216+
if (json.has("elementMargin")) {
217+
setElementMargin(json.getInt("elementMargin"));
218+
}
212219
} catch (JSONException e) {
213220
Log.w(this.getClass().getSimpleName(),"Wrong file format for "+this.albumPath,e);
214221
return false;
@@ -536,4 +543,16 @@ public LiveData<Date> getLdDate() {
536543
public int getSize() {
537544
return pages.size();
538545
}
546+
547+
public int getElementMargin() {
548+
return elementMargin;
549+
}
550+
551+
public void setElementMargin(int elementMargin) {
552+
this.elementMargin = elementMargin;
553+
this.ldElementMargin.postValue(elementMargin);
554+
onChange();
555+
}
556+
557+
public LiveData<Integer> getLiveDataElementMargin() { return ldElementMargin; }
539558
}

‎app/src/main/java/fr/nuage/souvenirs/model/TilePageBuilder.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ public void applyStyle(int style, Page page) {
237237
if (e.getClass().equals(TextElement.class)) {
238238
textElementArrayList.add((TextElement)e);
239239
}
240-
if (e instanceof ImageElement) {
240+
if ((e instanceof ImageElement) && !(e instanceof PaintElement)) {
241241
imageElementArrayList.add(e);
242242
}
243243
}
@@ -283,6 +283,9 @@ public int getDefaultStyle(Page page) {
283283
boolean hasTextElement = false;
284284
boolean areAllPortrait = true;
285285
for (Element element: page.getElements()) {
286+
if (element instanceof PaintElement) {
287+
continue;
288+
}
286289
if ((element instanceof ImageElement) || (element instanceof TextElement) || (element instanceof VideoElement)) {
287290
visibleElements += 1;
288291
}

‎app/src/main/java/fr/nuage/souvenirs/model/nc/APIProvider.java

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public static class AlbumResp {
9393
String shareToken;
9494
String defaultStyle;
9595
List<PageResp> pages;
96+
int elementMargin;
9697
}
9798

9899
public static class PageResp {

‎app/src/main/java/fr/nuage/souvenirs/model/nc/AlbumNC.java

+11
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class AlbumNC {
2929
private Date lastEditDate;
3030
private final MutableLiveData<Date> ldLastEditDate = new MutableLiveData<>();
3131
private String albumImage;
32+
private int elementMargin;
3233
private Date pagesLastEditDate;
3334
private final MutableLiveData<Date> ldPageLastEditDate = new MutableLiveData<>();
3435
private ArrayList<PageNC> pages = new ArrayList<>();
@@ -155,6 +156,7 @@ public boolean save() {
155156
albumResp.name = getName();
156157
albumResp.pagesLastEditDate = getPagesLastEditDate();
157158
albumResp.defaultStyle = getDefaultStyle();
159+
albumResp.elementMargin = getElementMargin();
158160
String result = APIProvider.getApi().modifyAlbum(getId().toString(), albumResp).execute().body();
159161
if ((result != null) && (result.equals("OK"))) {
160162
setState(STATE_OK);
@@ -169,6 +171,10 @@ public boolean save() {
169171
}
170172
}
171173

174+
public int getElementMargin() {
175+
return elementMargin;
176+
}
177+
172178
private String getDefaultStyle() {
173179
return defaultStyle;
174180
}
@@ -451,6 +457,7 @@ public boolean load(APIProvider.AlbumResp albumResp) {
451457
setDate(albumResp.date);
452458
setLastEditDate(albumResp.lastEditDate);
453459
setAlbumImage(albumResp.albumImage);
460+
setElementMargin(albumResp.elementMargin);
454461
setPagesLastEditDate(albumResp.pagesLastEditDate);
455462
setIsShared(albumResp.isShared);
456463
setShareToken(albumResp.shareToken);
@@ -466,6 +473,10 @@ public boolean load(APIProvider.AlbumResp albumResp) {
466473
return true;
467474
}
468475

476+
public void setElementMargin(int elementMargin) {
477+
this.elementMargin = elementMargin;
478+
}
479+
469480

470481
public boolean load(boolean full) {
471482
//reload album from nextcloud
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,28 @@
11
package fr.nuage.souvenirs.view;
22

3-
import static com.bumptech.glide.request.RequestOptions.bitmapTransform;
4-
3+
import android.graphics.Bitmap;
54
import android.graphics.drawable.AnimatedVectorDrawable;
65
import android.graphics.drawable.Drawable;
76
import android.util.TypedValue;
87
import android.view.View;
9-
import android.widget.FrameLayout;
108
import android.widget.ImageView;
11-
import android.widget.VideoView;
129

13-
import androidx.annotation.Nullable;
1410
import androidx.constraintlayout.widget.ConstraintLayout;
1511
import androidx.constraintlayout.widget.Guideline;
1612
import androidx.core.content.ContextCompat;
1713
import androidx.databinding.BindingAdapter;
1814

1915
import com.bumptech.glide.Glide;
20-
import com.bumptech.glide.load.engine.DiskCacheStrategy;
21-
import com.bumptech.glide.request.RequestOptions;
2216
import com.bumptech.glide.request.target.CustomTarget;
23-
import com.bumptech.glide.request.target.SimpleTarget;
2417
import com.bumptech.glide.request.transition.Transition;
2518
import com.google.android.material.card.MaterialCardView;
2619

2720
import java.io.File;
28-
21+
import androidx.annotation.NonNull;
22+
import androidx.annotation.Nullable;
2923
import fr.nuage.souvenirs.R;
3024
import fr.nuage.souvenirs.model.ImageElement;
31-
import fr.nuage.souvenirs.view.helpers.BlurTransformation;
32-
import fr.nuage.souvenirs.view.helpers.ZoomOffsetTransformation;
33-
import fr.nuage.souvenirs.viewmodel.ImageElementViewModel;
25+
import fr.nuage.souvenirs.viewmodel.ElementViewModel;
3426

3527
public class DataBindingAdapters {
3628

@@ -45,36 +37,41 @@ public static void setLayoutConstraintGuidePercent(Guideline guideline, Integer
4537

4638

4739
@BindingAdapter(value = { "srcCompat", "android:scrollX", "android:scrollY", "android:scaleX"}, requireAll=false)
48-
public static void setSrcCompatZoomOffset(ImageView view, String imagePath, int offsetX, int offsetY, int scaleX) {
40+
public static void setSrcCompatZoomOffset(ImageElementView view, String imagePath, int offsetX, int offsetY, int scaleX) {
4941
if (imagePath != null) {
5042
if (imagePath.equals("")) {
5143
view.setImageDrawable(ContextCompat.getDrawable(view.getContext(),R.drawable.ic_image_black_24dp));
5244
} else {
53-
if (view.getScaleType() == ImageView.ScaleType.MATRIX) {
54-
Glide.with(view.getContext()).load(new File(imagePath)).dontTransform().transform(new ZoomOffsetTransformation(offsetX, offsetY,scaleX)).into(view);
55-
if (scaleX < 100) {
56-
//if image smaller than layout, display blured background
57-
Glide.with(view.getContext()).load(new File(imagePath))
58-
.transform(new BlurTransformation(25,view.getContext()))
59-
.into(new CustomTarget<Drawable>() {
60-
@Override
61-
public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
62-
view.setBackground(resource);
63-
}
64-
@Override
65-
public void onLoadCleared(@Nullable @org.jetbrains.annotations.Nullable Drawable placeholder) { }
66-
});
67-
}
68-
69-
} else {
70-
Glide.with(view.getContext()).load(new File(imagePath)).into(view);
71-
}
45+
view.setOffsetX(offsetX);
46+
view.setOffsetY(offsetY);
47+
view.setZoom(scaleX);
48+
Glide.with(view.getContext()).load(new File(imagePath)).into(view);
7249
}
7350
} else {
7451
view.setImageDrawable(null);
7552
}
7653
}
7754

55+
@BindingAdapter(value = { "srcCompat" }, requireAll=false)
56+
public static void setSrcCompatZoomOffset(PaintElementView view, String imagePath) {
57+
if (imagePath != null) {
58+
if (!imagePath.equals("")) {
59+
Glide.with(view.getContext())
60+
.asBitmap()
61+
.load(new File(imagePath))
62+
.into(new CustomTarget<Bitmap>() {
63+
@Override
64+
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
65+
view.setFirstBitmap(resource);
66+
}
67+
68+
@Override
69+
public void onLoadCleared(@Nullable Drawable placeholder) { }
70+
});
71+
}
72+
}
73+
}
74+
7875
@BindingAdapter("srcCompat")
7976
public static void setSrcCompat(ImageView view, Drawable drawable) {
8077
view.setImageDrawable(drawable);
@@ -112,11 +109,33 @@ public static void setTint(ImageView v, int color) {
112109
v.setColorFilter(color);
113110
}
114111

115-
@BindingAdapter(value = { "android:layout_marginLeft", "android:layout_marginBottom", "android:layout_marginRight", "android:layout_marginTop" })
116-
public static void setLayoutMarginLeft(MaterialCardView v, float marginLeft, float marginTop, float marginRight, float marginBottom) {
117-
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) v.getLayoutParams();
118-
params.setMargins((int)marginLeft, (int)marginTop, (int)marginRight, (int)marginBottom);
119-
v.setLayoutParams(params);
112+
@BindingAdapter(value = { "android:layout_marginStart", "android:layout_marginTop", "android:layout_marginEnd", "android:layout_marginBottom"}, requireAll=false)
113+
public static void setLayoutMarginLeft(View v, int marginLeft, int marginTop, int marginRight, int marginBottom) {
114+
if ((v.getParent() != null) && !(v instanceof PaintElementView)) {
115+
int height = ((View)(v.getParent())).getHeight();
116+
int width = ((View)(v.getParent())).getWidth();
117+
if ((height > 0) && (width > 0)) {
118+
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) v.getLayoutParams();
119+
params.setMargins((int)width * marginLeft / 100,
120+
(int)height * marginTop / 100,
121+
(int)(100 - marginRight) * width / 100,
122+
(int)(100 - marginBottom) * height / 100);
123+
v.setLayoutParams(params);
124+
}
125+
ImageElementView imageElementView = v.findViewById(R.id.image_imageview);
126+
if (imageElementView != null) {
127+
imageElementView.updateMatrix();
128+
}
129+
}
130+
}
131+
132+
public static void onLayoutChange(View view, int left, int top, int right, int bottom) {
133+
setLayoutMarginLeft(view, left, top, right, bottom);
134+
}
135+
136+
@BindingAdapter("is_selected")
137+
public static void setSelected(View view, boolean selected) {
138+
view.setSelected(selected);
120139
}
121140

122141
}

‎app/src/main/java/fr/nuage/souvenirs/view/EditAlbumFragment.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public void onCreate(Bundle savedInstanceState) {
6262

6363
public void setAlbumVM(AlbumViewModel albumVM) {
6464
this.albumVM = albumVM;
65+
editPageListAdapter.setAlbum(albumVM);
6566
}
6667

6768
@Override
@@ -78,7 +79,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
7879
pageListRecyclerView.setLayoutManager(mLayoutManager);
7980

8081
//fill recyclerview
81-
editPageListAdapter = new EditPageListAdapter(this);
82+
editPageListAdapter = new EditPageListAdapter(this, albumVM);
8283
pageListRecyclerView.setAdapter(editPageListAdapter);
8384

8485
//add touch helper to move pages

‎app/src/main/java/fr/nuage/souvenirs/view/EditAlbumNameDialogFragment.java

+14-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import androidx.navigation.Navigation;
1414

1515
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
16+
import com.google.android.material.slider.Slider;
1617

1718
import java.util.Calendar;
1819
import java.util.Date;
@@ -26,6 +27,7 @@ public class EditAlbumNameDialogFragment extends DialogFragment {
2627

2728
private final AlbumViewModel albumViewModel;
2829
private Date selectedDate;
30+
private int selectedMargin;
2931

3032
public EditAlbumNameDialogFragment(AlbumViewModel albumViewModel) {
3133
super();
@@ -42,13 +44,17 @@ public AlertDialog onCreateDialog(Bundle savedInstanceState) {
4244
albumEditText.setText(albumViewModel.getAlbum().getName());
4345
CalendarView calendarView = createLayout.findViewById(R.id.calendarViewAlbum);
4446
calendarView.setDate(albumViewModel.getAlbum().getDate().getTime());
45-
calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
46-
@Override
47-
public void onSelectedDayChange(@NonNull CalendarView calendarView, int year, int month, int day) {
48-
Calendar calendar = Calendar.getInstance();
49-
calendar.set(year,month,day);
50-
selectedDate = new Date(calendar.getTimeInMillis());
51-
}
47+
selectedDate = albumViewModel.getAlbum().getDate();
48+
calendarView.setOnDateChangeListener((calendarView1, year, month, day) -> {
49+
Calendar calendar = Calendar.getInstance();
50+
calendar.set(year,month,day);
51+
selectedDate = new Date(calendar.getTimeInMillis());
52+
});
53+
Slider slider = createLayout.findViewById(R.id.marginSliderViewAlbum);
54+
slider.setValue(albumViewModel.getAlbum().getElementMargin());
55+
selectedMargin = albumViewModel.getAlbum().getElementMargin();
56+
slider.addOnChangeListener((s, value, fromUser) -> {
57+
selectedMargin = (int)value;
5258
});
5359
//build dialog with accept button
5460
builder.setTitle(R.string.dialog_edit_album_msg)
@@ -57,6 +63,7 @@ public void onSelectedDayChange(@NonNull CalendarView calendarView, int year, in
5763
String albumName = albumEditText.getText().toString();
5864
albumViewModel.getAlbum().setName(albumName);
5965
albumViewModel.getAlbum().setDate(selectedDate);
66+
albumViewModel.getAlbum().setElementMargin(selectedMargin);
6067
dismiss();
6168
})
6269
.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.cancel());

‎app/src/main/java/fr/nuage/souvenirs/view/EditPageFragment.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
167167
//set new page on UI
168168
PageViewModel pageVM = albumVM.getPage(uuid);
169169
binding.setPage(pageVM);
170-
binding.pageViewEdit.setPageViewModel(pageVM);
170+
binding.pageViewEdit.setViewModels(pageVM, albumVM);
171171
//binding.executePendingBindings();
172172
if (pageVM != null) {
173173
//listen for audiomode change to change menu

0 commit comments

Comments
 (0)
Failed to load comments.