Apply layout changes

This commit is contained in:
tom79 2019-10-31 09:58:05 +01:00
parent de73a10c00
commit 431f81aec2
7 changed files with 1913 additions and 1770 deletions

View File

@ -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<Status> 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());
}
}

View File

@ -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<Status> CREATOR = new Creator<Status>() {
@ -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;
}
}

View File

@ -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 <http://www.gnu.org/licenses>. */
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);
}
}
}
}

View File

@ -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) {

View File

@ -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">
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<View
android:id="@+id/status_reply_indicator_diag_top"
android:layout_width="20dp"
android:layout_height="11dp"
android:layout_marginStart="10dp"
android:background="@drawable/diag_top"
android:id="@+id/status_reply_indicator_top"
android:visibility="gone"
android:layout_width="2dp"
android:layout_height="0dp"
android:background="?colorAccent"
app:layout_constraintBottom_toBottomOf="@id/reply_indicator_dot"
app:layout_constraintEnd_toEndOf="@id/reply_indicator_dot"
app:layout_constraintStart_toStartOf="@id/reply_indicator_dot"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/status_reply_indicator_top"
android:layout_width="2dp"
android:layout_height="0dp"
android:background="?colorAccent"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/reply_indicator_dot"
app:layout_constraintEnd_toEndOf="@id/reply_indicator_dot"
app:layout_constraintStart_toStartOf="@id/reply_indicator_dot"
app:layout_constraintTop_toBottomOf="@id/status_reply_indicator_diag_top" />
<View
android:id="@+id/reply_indicator_dot"
android:layout_width="8dp"
android:layout_height="8dp"
android:layout_marginStart="0dp"
android:layout_marginStart="15sp"
android:background="?colorAccent"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:visibility="gone"
android:id="@+id/status_reply_indicator_bottom"
android:layout_width="2dp"
android:layout_height="0dp"
android:background="?colorAccent"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/status_reply_indicator_diag_bottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/reply_indicator_dot"
app:layout_constraintStart_toStartOf="@id/reply_indicator_dot"
app:layout_constraintTop_toTopOf="@id/reply_indicator_dot" />
<View
android:id="@+id/status_reply_indicator_diag_bottom"
android:layout_width="20dp"
android:layout_height="11dp"
android:layout_marginStart="10dp"
android:background="@drawable/diag_bottom"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@id/reply_indicator_dot"
app:layout_constraintStart_toStartOf="parent" />
<androidx.cardview.widget.CardView
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginStart="4dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
style="?attr/cardStyle"
app:layout_constraintStart_toEndOf="@id/reply_indicator_dot"
app:layout_constraintBottom_toBottomOf="parent"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff