Conversation redone

This commit is contained in:
stom79 2018-11-16 15:39:53 +01:00
parent 2a1e20543d
commit 71a4d57a38
6 changed files with 116 additions and 137 deletions

View File

@ -16,18 +16,17 @@ package fr.gouv.etalab.mastodon.activities;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@ -41,19 +40,14 @@ import java.util.List;
import fr.gouv.etalab.mastodon.R;
import fr.gouv.etalab.mastodon.asynctasks.RetrieveContextAsyncTask;
import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask;
import fr.gouv.etalab.mastodon.client.APIResponse;
import fr.gouv.etalab.mastodon.client.Entities.Account;
import fr.gouv.etalab.mastodon.client.Entities.Card;
import fr.gouv.etalab.mastodon.client.Entities.Context;
import fr.gouv.etalab.mastodon.client.Entities.Error;
import fr.gouv.etalab.mastodon.client.Entities.Status;
import fr.gouv.etalab.mastodon.drawers.ConversationDecoration;
import fr.gouv.etalab.mastodon.drawers.StatusListAdapter;
import fr.gouv.etalab.mastodon.helper.Helper;
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveCardInterface;
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveContextInterface;
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveFeedsInterface;
import fr.gouv.etalab.mastodon.sqlite.AccountDAO;
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
@ -66,15 +60,13 @@ import static fr.gouv.etalab.mastodon.helper.Helper.THEME_LIGHT;
* Show conversation activity class
*/
public class ShowConversationActivity extends BaseActivity implements OnRetrieveFeedsInterface, OnRetrieveContextInterface, OnRetrieveCardInterface {
public class ShowConversationActivity extends BaseActivity implements OnRetrieveContextInterface {
private String statusId;
private Status initialStatus;
private Status detailsStatus;
private SwipeRefreshLayout swipeRefreshLayout;
private RecyclerView lv_status;
private boolean isRefreshed;
private ImageView pp_actionBar;
private List<Status> statuses;
private StatusListAdapter statusListAdapter;
@ -99,7 +91,6 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve
default:
setTheme(R.style.AppThemeDark_NoActionBar);
}
expanded = false;
setContentView(R.layout.activity_show_conversation);
lv_status = findViewById(R.id.lv_status);
@ -110,8 +101,11 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve
Bundle b = getIntent().getExtras();
statuses = new ArrayList<>();
if(b != null)
if(b != null) {
detailsStatus = b.getParcelable("status");
expanded = b.getBoolean("expanded", false);
initialStatus = b.getParcelable("initialStatus");
}
if( detailsStatus == null || detailsStatus.getId() == null)
finish();
@ -126,10 +120,14 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve
TextView title = getSupportActionBar().getCustomView().findViewById(R.id.toolbar_title);
pp_actionBar = getSupportActionBar().getCustomView().findViewById(R.id.pp_actionBar);
ImageView action_refresh = getSupportActionBar().getCustomView().findViewById(R.id.action_refresh);
final ImageView action_expand = getSupportActionBar().getCustomView().findViewById(R.id.action_expand);
ImageView action_expand = getSupportActionBar().getCustomView().findViewById(R.id.action_expand);
title.setText(R.string.conversation);
ImageView close_conversation = getSupportActionBar().getCustomView().findViewById(R.id.close_conversation);
if( expanded)
action_expand.setImageResource(R.drawable.ic_expand_less);
else
action_expand.setImageResource(R.drawable.ic_expand_more);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@ -149,29 +147,30 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve
action_refresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if( statuses != null) {
swipeRefreshLayout.setRefreshing(true);
(new Handler()).postDelayed(new Runnable() {
@Override
public void run() {
isRefreshed = true;
statusId = statuses.get(statuses.size() - 1).getId();
new RetrieveFeedsAsyncTask(getApplicationContext(), RetrieveFeedsAsyncTask.Type.ONESTATUS, statusId, null, false, false, ShowConversationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}, 1000);
}
Intent intent = new Intent(ShowConversationActivity.this, ShowConversationActivity.class);
Bundle b = new Bundle();
b.putParcelable("status", detailsStatus);
b.putBoolean("expanded", expanded);
if( expanded && statuses != null && statuses.size() > 0)
b.putParcelable("initialStatus", statuses.get(0));
intent.putExtras(b);
finish();
startActivity(intent);
}
});
action_expand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
expanded = !expanded;
if( expanded)
action_expand.setImageResource(R.drawable.ic_expand_less);
else
action_expand.setImageResource(R.drawable.ic_expand_more);
new RetrieveFeedsAsyncTask(getApplicationContext(), RetrieveFeedsAsyncTask.Type.ONESTATUS, statusId,null, false,false, ShowConversationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Intent intent = new Intent(ShowConversationActivity.this, ShowConversationActivity.class);
Bundle b = new Bundle();
b.putParcelable("status", detailsStatus);
b.putBoolean("expanded", expanded);
if( expanded && statuses != null && statuses.size() > 0)
b.putParcelable("initialStatus", statuses.get(0));
intent.putExtras(b);
finish();
startActivity(intent);
}
});
@ -195,24 +194,29 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve
}
Helper.loadGiF(getApplicationContext(), url, pp_actionBar);
isRefreshed = false;
swipeRefreshLayout = findViewById(R.id.swipeContainer);
//new RetrieveFeedsAsyncTask(getApplicationContext(), RetrieveFeedsAsyncTask.Type.ONESTATUS, statusId,null, false,false, ShowConversationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
boolean isOnWifi = Helper.isOnWIFI(getApplicationContext());
int behaviorWithAttachments = sharedpreferences.getInt(Helper.SET_ATTACHMENT_ACTION, Helper.ATTACHMENT_ALWAYS);
int positionSpinnerTrans = sharedpreferences.getInt(Helper.SET_TRANSLATOR, Helper.TRANS_YANDEX);
statuses.add(detailsStatus);
if( initialStatus != null)
statuses.add(initialStatus);
else
statuses.add(detailsStatus);
statusListAdapter = new StatusListAdapter(ShowConversationActivity.this, 0, null, isOnWifi, behaviorWithAttachments, positionSpinnerTrans, statuses);
final LinearLayoutManager mLayoutManager;
mLayoutManager = new LinearLayoutManager(this);
Log.v(Helper.TAG,"statuses= " + statuses.size());
lv_status.setLayoutManager(mLayoutManager);
boolean compactMode = sharedpreferences.getBoolean(Helper.SET_COMPACT_MODE, false);
lv_status.addItemDecoration(new ConversationDecoration(ShowConversationActivity.this, theme, compactMode));
lv_status.setAdapter(statusListAdapter);
new RetrieveContextAsyncTask(getApplicationContext(), expanded, detailsStatus.getId(), ShowConversationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
String statusIdToFetch;
if( initialStatus != null)
statusIdToFetch = initialStatus.getId();
else
statusIdToFetch = detailsStatus.getId();
new RetrieveContextAsyncTask(getApplicationContext(), expanded, statusIdToFetch, ShowConversationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
switch (theme){
case Helper.THEME_LIGHT:
swipeRefreshLayout.setColorSchemeResources(R.color.mastodonC4,
@ -236,8 +240,16 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
isRefreshed = true;
new RetrieveFeedsAsyncTask(getApplicationContext(), RetrieveFeedsAsyncTask.Type.ONESTATUS, statusId,null, false,false, ShowConversationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Intent intent = new Intent(ShowConversationActivity.this, ShowConversationActivity.class);
Bundle b = new Bundle();
b.putParcelable("status", detailsStatus);
b.putBoolean("expanded", expanded);
if( expanded && statuses != null && statuses.size() > 0)
b.putParcelable("initialStatus", statuses.get(0));
b.putParcelable("status", detailsStatus);
intent.putExtras(b);
finish();
startActivity(intent);
}
});
@ -256,107 +268,41 @@ public class ShowConversationActivity extends BaseActivity implements OnRetrieve
}
}
@Override
public void onRetrieveFeeds(APIResponse apiResponse) {
if( apiResponse.getError() != null){
Toast.makeText(getApplicationContext(), apiResponse.getError().getError(),Toast.LENGTH_LONG).show();
return;
}
List<Status> statuses = apiResponse.getStatuses();
if( statuses != null && statuses.size() > 0 ){
initialStatus = statuses.get(0);
new RetrieveContextAsyncTask(getApplicationContext(), expanded, initialStatus.getId(), ShowConversationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
@Override
public void onRetrieveContext(Context context, Status statusFirst, Error error) {
public void onRetrieveContext(Context context, Error error) {
swipeRefreshLayout.setRefreshing(false);
if( error != null){
Toast.makeText(getApplicationContext(), error.getError(),Toast.LENGTH_LONG).show();
return;
}
if( expanded) {
statusListAdapter.setConversationPosition( context.getAncestors().size());
if(!expanded) {
if (context.getAncestors() != null && context.getAncestors().size() > 0) {
statuses.addAll(0, context.getAncestors());
statusListAdapter.notifyItemRangeInserted(0, context.getAncestors().size());
}
if (context.getDescendants() != null && context.getDescendants().size() > 0) {
statuses.addAll(context.getAncestors().size() + 1, context.getDescendants());
statusListAdapter.notifyItemRangeChanged(context.getAncestors().size()+1, context.getDescendants().size());
}
}else{
List<Status> statusesTemp = context.getDescendants();
int i = 1;
int position = 0;
boolean positionFound = false;
statuses = new ArrayList<>();
if (statusFirst != null)
statuses.add(0, statusFirst);
if (context.getAncestors() != null && context.getAncestors().size() > 0) {
for (Status status : context.getAncestors()) {
statuses.add(status);
if (!positionFound)
position++;
if (status.getId().equals(initialStatus.getId()))
positionFound = true;
for(Status status: statusesTemp){
statuses.add(status);
if( status.getId().equals(detailsStatus.getId())) {
statusListAdapter.setConversationPosition(i);
detailsStatus = status;
position = i;
}
} else if (statusFirst == null) {
statuses.add(0, initialStatus);
positionFound = true;
i++;
}
if (context.getDescendants() != null && context.getDescendants().size() > 0) {
for (Status status : context.getDescendants()) {
statuses.add(status);
if (!positionFound)
position++;
if (status.getId().equals(initialStatus.getId()))
positionFound = true;
}
}
if( isRefreshed){
position = statuses.size()-1;
lv_status.scrollToPosition(position);
}else {
lv_status.smoothScrollToPosition(position);
}
statusListAdapter.notifyDataSetChanged();
}else {
if (context.getAncestors() != null && context.getAncestors().size() > 0) {
Log.v(Helper.TAG,"getAncestors= " + context.getAncestors().size());
statuses.addAll(0,context.getAncestors());
statusListAdapter.notifyItemRangeInserted(0, context.getAncestors().size()-1);
}
if (context.getDescendants() != null && context.getDescendants().size() > 0) {
Log.v(Helper.TAG,"getDescendants= " + context.getDescendants().size());
statuses.addAll(context.getAncestors().size()+1,context.getDescendants());
statusListAdapter.notifyItemRangeInserted(context.getAncestors().size()+1, context.getDescendants().size()-1);
}
Log.v(Helper.TAG,"statuses= " +statuses.size());
}
/*statusListAdapter = new StatusListAdapter(ShowConversationActivity.this, position, null, isOnWifi, behaviorWithAttachments, positionSpinnerTrans, statuses);
final LinearLayoutManager mLayoutManager;
mLayoutManager = new LinearLayoutManager(this);
lv_status.setLayoutManager(mLayoutManager);
int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
boolean compactMode = sharedpreferences.getBoolean(Helper.SET_COMPACT_MODE, false);
lv_status.addItemDecoration(new ConversationDecoration(ShowConversationActivity.this, theme, compactMode));
lv_status.setAdapter(statusListAdapter);*/
}
@Override
public void onRetrieveAccount(Card card) {
int position = 0;
for(Status status: this.statuses) {
if( initialStatus.getId().equals(status.getId())) {
if( card != null) {
this.statuses.get(position).setCard(card);
initialStatus.setCard(card);
statusListAdapter.notifyItemChanged(position);
}
return;
}
position++;
statusListAdapter.notifyItemRangeChanged(1,context.getDescendants().size());
lv_status.scrollToPosition(position);
}
}
}

View File

@ -31,7 +31,6 @@ import fr.gouv.etalab.mastodon.interfaces.OnRetrieveContextInterface;
public class RetrieveContextAsyncTask extends AsyncTask<Void, Void, Void> {
private String statusId;
private fr.gouv.etalab.mastodon.client.Entities.Status statusFirst;
private fr.gouv.etalab.mastodon.client.Entities.Context statusContext;
private OnRetrieveContextInterface listener;
private API api;
@ -51,7 +50,6 @@ public class RetrieveContextAsyncTask extends AsyncTask<Void, Void, Void> {
statusContext = api.getStatusContext(statusId);
//Retrieves the first toot
if( expanded && statusContext != null && statusContext.getAncestors() != null && statusContext.getAncestors().size() > 0 ) {
statusFirst = statusContext.getAncestors().get(0);
statusContext = api.getStatusContext(statusContext.getAncestors().get(0).getId());
}
return null;
@ -59,7 +57,7 @@ public class RetrieveContextAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPostExecute(Void result) {
listener.onRetrieveContext(statusContext, statusFirst, api.getError());
listener.onRetrieveContext(statusContext, api.getError());
}
}

View File

@ -15,16 +15,38 @@
package fr.gouv.etalab.mastodon.client.Entities;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by Thomas on 23/04/2017.
* Manage Entity Application
*/
public class Application {
public class Application implements Parcelable {
private String name;
private String website;
public Application(){}
protected Application(Parcel in) {
name = in.readString();
website = in.readString();
}
public static final Creator<Application> CREATOR = new Creator<Application>() {
@Override
public Application createFromParcel(Parcel in) {
return new Application(in);
}
@Override
public Application[] newArray(int size) {
return new Application[size];
}
};
public String getName() {
return name;
}
@ -40,4 +62,15 @@ public class Application {
public void setWebsite(String website) {
this.website = website;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(website);
}
}

View File

@ -114,15 +114,12 @@ public class Status implements Parcelable{
private boolean isNew = false;
private boolean isVisible = true;
private boolean fetchMore = false;
private Status status;
private String content, contentCW, contentTranslated;
private SpannableString contentSpan, displayNameSpan, contentSpanCW, contentSpanTranslated;
private RetrieveFeedsAsyncTask.Type type;
private int itemViewType;
public Status(){
this.status = this;
}
public Status(){}
private List<String> conversationProfilePicture;
private String webviewURL = null;
@ -134,6 +131,7 @@ public class Status implements Parcelable{
in_reply_to_account_id = in.readString();
reblog = in.readParcelable(Status.class.getClassLoader());
account = in.readParcelable(Account.class.getClassLoader());
application = in.readParcelable(Application.class.getClassLoader());
mentions = in.readArrayList(Mention.class.getClassLoader());
media_attachments = in.readArrayList(Attachment.class.getClassLoader());
emojis = in.readArrayList(Emojis.class.getClassLoader());
@ -169,6 +167,7 @@ public class Status implements Parcelable{
dest.writeString(in_reply_to_account_id);
dest.writeParcelable(reblog, flags);
dest.writeParcelable(account, flags);
dest.writeParcelable(application, flags);
dest.writeList(mentions);
dest.writeList(media_attachments);
dest.writeList(emojis);

View File

@ -2279,4 +2279,8 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct
notifyStatusChanged(status);
}
}
public void setConversationPosition(int position){
this.conversationPosition = position;
}
}

View File

@ -17,12 +17,11 @@ package fr.gouv.etalab.mastodon.interfaces;
import fr.gouv.etalab.mastodon.client.Entities.Context;
import fr.gouv.etalab.mastodon.client.Entities.Error;
import fr.gouv.etalab.mastodon.client.Entities.Status;
/**
* Created by Thomas on 04/05/2017.
* Interface when a context for a status has been retrieved
*/
public interface OnRetrieveContextInterface {
void onRetrieveContext(Context context, Status statusFirst, Error error);
void onRetrieveContext(Context context, Error error);
}