diff --git a/app/src/main/java/app/fedilab/android/activities/ShowConversationActivity.java b/app/src/main/java/app/fedilab/android/activities/ShowConversationActivity.java index 07d50150e..0cb2396ca 100644 --- a/app/src/main/java/app/fedilab/android/activities/ShowConversationActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ShowConversationActivity.java @@ -37,7 +37,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -46,10 +45,7 @@ import java.util.List; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; -import app.fedilab.android.client.Entities.Context; -import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Status; -import app.fedilab.android.drawers.ConversationDecoration; import app.fedilab.android.drawers.StatusListAdapter; import app.fedilab.android.helper.Helper; import app.fedilab.android.sqlite.AccountDAO; @@ -258,7 +254,6 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve final LinearLayoutManager mLayoutManager; mLayoutManager = new LinearLayoutManager(this); lv_status.setLayoutManager(mLayoutManager); - lv_status.addItemDecoration(new ConversationDecoration(ShowConversationActivity.this, theme)); lv_status.setAdapter(statusListAdapter); String statusIdToFetch = null; if (initialStatus != null) @@ -367,17 +362,19 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve if (apiResponse.getContext() == null || apiResponse.getContext().getAncestors() == null) { return; } - if (MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU && MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) { + if (BaseMainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU && BaseMainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) { statusListAdapter.setConversationPosition(apiResponse.getContext().getAncestors().size()); if (!expanded) { if (apiResponse.getContext().getAncestors() != null && apiResponse.getContext().getAncestors().size() > 0) { statuses.addAll(0, apiResponse.getContext().getAncestors()); statusListAdapter.notifyItemRangeInserted(0, apiResponse.getContext().getAncestors().size()); } + int targetedPosition = statuses.size()-1; if (apiResponse.getContext().getDescendants() != null && apiResponse.getContext().getDescendants().size() > 0) { statuses.addAll(apiResponse.getContext().getAncestors().size() + 1, apiResponse.getContext().getDescendants()); statusListAdapter.notifyItemRangeChanged(apiResponse.getContext().getAncestors().size() + 1, apiResponse.getContext().getDescendants().size()); } + decorate(targetedPosition); } else { List statusesTemp = apiResponse.getContext().getDescendants(); int i = 1; @@ -391,6 +388,7 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve } i++; } + decorate(position); statusListAdapter.notifyItemRangeChanged(1, apiResponse.getContext().getDescendants().size()); lv_status.scrollToPosition(position); } @@ -411,6 +409,7 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve } statusListAdapter = new StatusListAdapter((statuses.size() - 1 - i), null, isOnWifi, statuses); statusListAdapter.setConversationPosition((statuses.size() - 1 - i)); + decorate(0); final LinearLayoutManager mLayoutManager; mLayoutManager = new LinearLayoutManager(this); lv_status.setLayoutManager(mLayoutManager); @@ -430,11 +429,30 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve setTheme(R.style.AppThemeDark_NoActionBar); } - lv_status.addItemDecoration(new ConversationDecoration(ShowConversationActivity.this, theme)); lv_status.setAdapter(statusListAdapter); } } } + + private void decorate(int targetedPosition){ + for(int i =0 ; i < statuses.size() ; i++){ + if (i == targetedPosition) { + if( targetedPosition < statuses.size()-1 ) + statuses.get(targetedPosition).setShowBottomLine(true); + if( targetedPosition > 0 && statuses.get(targetedPosition).getIn_reply_to_id().compareTo(statuses.get(targetedPosition-1).getId()) == 0){ + statuses.get(targetedPosition-1).setShowBottomLine(true); + statuses.get(targetedPosition).setShowTopLine(true); + } + } else if (0 < i && i <= statuses.size() - 1) { + if( statuses.get(i-1).getId().compareTo(statuses.get(i).getIn_reply_to_id()) == 0){ + statuses.get(i-1).setShowBottomLine(true); + statuses.get(i).setShowTopLine(true); + } + } + } + statusListAdapter.notifyItemRangeChanged(0,statuses.size()); + } + } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Status.java b/app/src/main/java/app/fedilab/android/client/Entities/Status.java index 85081fcac..40e1446e7 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Status.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Status.java @@ -149,6 +149,8 @@ public class Status implements Parcelable { private boolean showSpoiler = false; private String quickReplyContent; private String quickReplyPrivacy; + private boolean showBottomLine = false; + private boolean showTopLine = false; public Status() { } @@ -243,6 +245,8 @@ public class Status implements Parcelable { dest.writeByte(this.isFocused ? (byte) 1 : (byte) 0); dest.writeString(this.quickReplyContent); dest.writeString(this.quickReplyPrivacy); + dest.writeByte(this.showBottomLine ? (byte) 1 : (byte) 0); + dest.writeByte(this.showTopLine ? (byte) 1 : (byte) 0); } @@ -314,6 +318,8 @@ public class Status implements Parcelable { this.isFocused = in.readByte() != 0; this.quickReplyContent = in.readString(); this.quickReplyPrivacy = in.readString(); + this.showBottomLine = in.readByte() != 0; + this.showTopLine = in.readByte() != 0; } public static final Creator CREATOR = new Creator() { @@ -1829,4 +1835,20 @@ public class Status implements Parcelable { public void setQuickReplyPrivacy(String quickReplyPrivacy) { this.quickReplyPrivacy = quickReplyPrivacy; } + + public boolean isShowBottomLine() { + return showBottomLine; + } + + public void setShowBottomLine(boolean showBottomLine) { + this.showBottomLine = showBottomLine; + } + + public boolean isShowTopLine() { + return showTopLine; + } + + public void setShowTopLine(boolean showTopLine) { + this.showTopLine = showTopLine; + } } diff --git a/app/src/main/java/app/fedilab/android/drawers/ConversationDecoration.java b/app/src/main/java/app/fedilab/android/drawers/ConversationDecoration.java deleted file mode 100644 index aec6cebb6..000000000 --- a/app/src/main/java/app/fedilab/android/drawers/ConversationDecoration.java +++ /dev/null @@ -1,118 +0,0 @@ -package app.fedilab.android.drawers; -/* Copyright 2018 Thomas Schneider - * - * This file is a part of Fedilab - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 3 of the - * License, or (at your option) any later version. - * - * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with Fedilab; if not, - * see . */ - - -import android.content.Context; -import android.content.SharedPreferences; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import android.view.View; - -import app.fedilab.android.client.Entities.Status; -import app.fedilab.android.helper.Helper; -import app.fedilab.android.R; - -import static app.fedilab.android.drawers.StatusListAdapter.FOCUSED_STATUS; - -/** - * Created by Thomas on 08/09/2018. - * Adapter for thread decoration - */ -public class ConversationDecoration extends RecyclerView.ItemDecoration { - - private Drawable divider; - private Context context; - private boolean compactMode, consoleMode; - - public ConversationDecoration(Context context, int theme) { - SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); - if (theme == Helper.THEME_BLACK) - divider = ContextCompat.getDrawable(context, R.drawable.line_divider_black); - else if (theme == Helper.THEME_DARK) - divider = ContextCompat.getDrawable(context, R.drawable.line_divider_dark); - else if (theme == Helper.THEME_LIGHT) - divider = ContextCompat.getDrawable(context, R.drawable.line_divider_light); - this.context = context; - - this.compactMode = sharedpreferences.getBoolean(Helper.SET_COMPACT_MODE, false); - this.consoleMode = sharedpreferences.getBoolean(Helper.SET_CONSOLE_MODE, false); - } - - @Override - public void onDraw(@NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { - - int leftSide; - - if (consoleMode) - leftSide = (int) Helper.convertDpToPixel(6, context); - else if (compactMode) - leftSide = (int) Helper.convertDpToPixel(3, context); - else - leftSide = (int) Helper.convertDpToPixel(28, context); - - int left = parent.getPaddingLeft() + leftSide; - int right = left + (int) Helper.convertDpToPixel(4, context); - int childCount = parent.getChildCount(); - - int offSet = (int) Helper.convertDpToPixel(30, context); - - for (int i = 0; i < childCount; i++) { - - View child = parent.getChildAt(i); - StatusListAdapter adapter = (StatusListAdapter) parent.getAdapter(); - int position = parent.getChildAdapterPosition(child); - - assert adapter != null; - Status status = adapter.getItem(position); - - int top, bottom; - if (status != null) { - - int itemViewType = status.getItemViewType(); - Status statusBefore = null; - if (itemViewType != FOCUSED_STATUS || position == 0) { - if (position > 0) - statusBefore = adapter.getItem(position - 1); - top = (statusBefore != null && statusBefore.getId().equals(status.getIn_reply_to_id())) ? - child.getTop() : (child.getTop() + offSet); - Status statusAfter = null; - if (adapter.getItemCount() > position + 1) - statusAfter = adapter.getItem(position + 1); - bottom = (statusAfter != null && status.getId().equals(statusAfter.getIn_reply_to_id())) ? - child.getBottom() : child.getTop() + offSet; - if (position == 0 && childCount > 1) - top = bottom - (int) Helper.convertDpToPixel(14, context); - if (position == 0 && childCount <= 1) - top = bottom; - } else { - top = child.getTop(); - bottom = top + (int) Helper.convertDpToPixel(14, context); - } - - divider.setBounds(left, top, right, bottom); - divider.draw(canvas); - } - - } - - } - -} diff --git a/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java index d3fb66169..0091ab956 100644 --- a/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java @@ -704,6 +704,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct ImageView quick_reply_emoji; Button quick_reply_button; ImageView quick_reply_privacy; + View status_reply_indicator_top, reply_indicator_dot, status_reply_indicator_bottom, status_reply_indicator_diag_top, status_reply_indicator_diag_bottom; public View getView() { return itemView; @@ -821,6 +822,12 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct quick_reply_privacy = itemView.findViewById(R.id.quick_reply_privacy); warning_message = itemView.findViewById(R.id.warning_message); + + status_reply_indicator_bottom = itemView.findViewById(R.id.status_reply_indicator_bottom); + status_reply_indicator_top = itemView.findViewById(R.id.status_reply_indicator_top); + status_reply_indicator_diag_top = itemView.findViewById(R.id.status_reply_indicator_diag_top); + status_reply_indicator_diag_bottom = itemView.findViewById(R.id.status_reply_indicator_diag_bottom); + reply_indicator_dot = itemView.findViewById(R.id.reply_indicator_dot); } void updateAnimatedEmoji() { @@ -924,7 +931,37 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct status.setItemViewType(viewHolder.getItemViewType()); - + if (type == RetrieveFeedsAsyncTask.Type.CONTEXT && holder.status_reply_indicator_top != null) { + if (status.isShowTopLine()) { + holder.status_reply_indicator_top.setVisibility(View.VISIBLE); + holder.reply_indicator_dot.setVisibility(View.VISIBLE); + if( holder.status_reply_indicator_diag_top != null){ + holder.status_reply_indicator_diag_top.setVisibility(View.VISIBLE); + } + } + if (status.isShowBottomLine()) { + holder.reply_indicator_dot.setVisibility(View.VISIBLE); + holder.status_reply_indicator_bottom.setVisibility(View.VISIBLE); + if( holder.status_reply_indicator_diag_bottom != null){ + holder.status_reply_indicator_diag_bottom.setVisibility(View.VISIBLE); + } + } + if (!status.isShowTopLine()) { + holder.status_reply_indicator_top.setVisibility(View.GONE); + if( holder.status_reply_indicator_diag_top != null){ + holder.status_reply_indicator_diag_top.setVisibility(View.GONE); + } + } + if ( !status.isShowBottomLine()) { + holder.status_reply_indicator_bottom.setVisibility(View.GONE); + if( holder.status_reply_indicator_diag_bottom != null){ + holder.status_reply_indicator_diag_bottom.setVisibility(View.GONE); + } + } + if (!status.isShowTopLine() && !status.isShowBottomLine() ) { + holder.reply_indicator_dot.setVisibility(View.GONE); + } + } boolean fullAttachement = sharedpreferences.getBoolean(Helper.SET_FULL_PREVIEW, false); @@ -4367,6 +4404,12 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if( statuses.get(i).getQuickReplyPrivacy() != null){ status.setQuickReplyPrivacy(statuses.get(i).getQuickReplyPrivacy()); } + if( statuses.get(i).isShowTopLine()){ + status.setShowTopLine(true); + } + if( statuses.get(i).isShowBottomLine()){ + status.setShowBottomLine(true); + } statuses.set(i, status); statusListAdapter.notifyItemChanged(i); /*if( mRecyclerView != null) { @@ -4407,6 +4450,12 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if( statuses.get(i).getQuickReplyPrivacy() != null){ status.setQuickReplyPrivacy(statuses.get(i).getQuickReplyPrivacy()); } + if( statuses.get(i).isShowTopLine()){ + status.setShowTopLine(true); + } + if( statuses.get(i).isShowBottomLine()){ + status.setShowBottomLine(true); + } statuses.set(i, status); statusListAdapter.notifyItemChanged(i); /*if( mRecyclerView != null) { diff --git a/app/src/main/res/layout/drawer_status.xml b/app/src/main/res/layout/drawer_status.xml index 6d887243a..be5f9d276 100644 --- a/app/src/main/res/layout/drawer_status.xml +++ b/app/src/main/res/layout/drawer_status.xml @@ -21,75 +21,55 @@ android:id="@+id/main_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="4dp" - android:layout_marginBottom="4dp"> + > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -