package ml.docilealligator.infinityforreddit.customviews; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; import android.widget.LinearLayout; import androidx.annotation.Nullable; import java.util.ArrayList; import ml.docilealligator.infinityforreddit.utils.Utils; public class CommentIndentationView extends LinearLayout { private final Paint paint; private int level; private int[] colors; private ArrayList startXs; private final int spacing; private int pathWidth; private boolean showOnlyOneDivider = false; public CommentIndentationView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); setSaveEnabled(true); setWillNotDraw(false); paint = new Paint(Paint.ANTI_ALIAS_FLAG); pathWidth = (int) Utils.convertDpToPixel(2, context); spacing = pathWidth * 6; paint.setStrokeWidth(pathWidth); paint.setStyle(Paint.Style.STROKE); startXs = new ArrayList<>(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); startXs.clear(); for (int i = 0; i < level; i++) { startXs.add(spacing * (i + 1) + pathWidth); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (showOnlyOneDivider) { if (startXs.size() > 0) { paint.setColor(colors[(startXs.size() - 1) % 7]); canvas.drawLine(level * pathWidth, 0, level * pathWidth, getHeight(), paint); } } else { for (int i = 0; i < startXs.size(); i++) { paint.setColor(colors[i % 7]); canvas.drawLine(startXs.get(i), 0, startXs.get(i), getHeight(), paint); } } } @Nullable @Override protected Parcelable onSaveInstanceState() { Parcelable parcelable = super.onSaveInstanceState(); SavedState myState = new SavedState(parcelable); myState.startXs = this.startXs; myState.colors = this.colors; return parcelable; } @Override protected void onRestoreInstanceState(Parcelable state) { SavedState savedState = (SavedState) state; super.onRestoreInstanceState(savedState.getSuperState()); this.startXs = savedState.startXs; this.colors = savedState.colors; invalidate(); } public void setLevelAndColors(int level, int[] colors) { this.colors = colors; this.level = level; if (level > 0) { int indentationSpacing = showOnlyOneDivider ? pathWidth * level : level * spacing + pathWidth; setPaddingRelative(indentationSpacing, 0, pathWidth, 0); } else { setPaddingRelative(0, 0, 0, 0); } invalidate(); } public void setShowOnlyOneDivider(boolean showOnlyOneDivider) { this.showOnlyOneDivider = showOnlyOneDivider; if (showOnlyOneDivider) { pathWidth = (int) Utils.convertDpToPixel(4, getContext()); } } private static class SavedState extends BaseSavedState { ArrayList startXs; int[] colors; SavedState(Parcelable superState) { super(superState); } private SavedState(Parcel in) { super(in); startXs = new ArrayList<>(); in.readList(startXs, Integer.class.getClassLoader()); colors = in.createIntArray(); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeList(startXs); out.writeIntArray(colors); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator<>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; } }