diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java index 44ba6affc..015fe6f1c 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/activities/ShowConversationActivity.java @@ -78,6 +78,7 @@ public class ShowConversationActivity extends BaseActivity implements OnRetriev private StatusListAdapter statusListAdapter; private boolean expanded; private BroadcastReceiver receive_action; + private String conversationId; @Override protected void onCreate(Bundle savedInstanceState) { @@ -112,6 +113,7 @@ public class ShowConversationActivity extends BaseActivity implements OnRetriev detailsStatus = b.getParcelable("status"); expanded = b.getBoolean("expanded", false); initialStatus = b.getParcelable("initialStatus"); + conversationId = b.getString("conversationId", null); } if( detailsStatus == null || detailsStatus.getId() == null) finish(); @@ -253,6 +255,8 @@ public class ShowConversationActivity extends BaseActivity implements OnRetriev statusIdToFetch = detailsStatus.getId(); if( statusIdToFetch == null) finish(); + if( conversationId != null) + statusIdToFetch = conversationId; new RetrieveContextAsyncTask(getApplicationContext(), expanded, statusIdToFetch, ShowConversationActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); switch (theme){ case Helper.THEME_LIGHT: @@ -322,33 +326,74 @@ public class ShowConversationActivity extends BaseActivity implements OnRetriev if( context.getAncestors() == null ){ return; } - - 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()); + if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.GNU && MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA){ + 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 statusesTemp = context.getDescendants(); + int i = 1; + int position = 0; + for(Status status: statusesTemp){ + statuses.add(status); + if( status.getId().equals(detailsStatus.getId())) { + statusListAdapter.setConversationPosition(i); + detailsStatus = status; + position = i; + } + i++; + } + statusListAdapter.notifyItemRangeChanged(1,context.getDescendants().size()); + lv_status.scrollToPosition(position); } }else{ - List statusesTemp = context.getDescendants(); - int i = 1; - int position = 0; - for(Status status: statusesTemp){ - statuses.add(status); - if( status.getId().equals(detailsStatus.getId())) { - statusListAdapter.setConversationPosition(i); - detailsStatus = status; - position = i; + int i = 0; + if( context.getAncestors() != null && context.getAncestors().size() > 1){ + statuses = new ArrayList<>(); + statuses.clear(); + for(Status status: context.getAncestors()){ + if(detailsStatus.equals(status)) { + break; + } + i++; } - i++; + boolean isOnWifi = Helper.isOnWIFI(getApplicationContext()); + for(Status status: context.getAncestors()){ + statuses.add(0,status); + } + statusListAdapter = new StatusListAdapter(ShowConversationActivity.this, (statuses.size()-1-i), null, isOnWifi, statuses); + statusListAdapter.setConversationPosition((statuses.size()-1-i)); + final LinearLayoutManager mLayoutManager; + mLayoutManager = new LinearLayoutManager(this); + lv_status.setLayoutManager(mLayoutManager); + SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE); + int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); + switch (theme){ + case Helper.THEME_LIGHT: + setTheme(R.style.AppTheme_NoActionBar); + break; + case Helper.THEME_DARK: + setTheme(R.style.AppThemeDark_NoActionBar); + break; + case Helper.THEME_BLACK: + setTheme(R.style.AppThemeBlack_NoActionBar); + break; + default: + setTheme(R.style.AppThemeDark_NoActionBar); + } + + lv_status.addItemDecoration(new ConversationDecoration(ShowConversationActivity.this, theme)); + lv_status.setAdapter(statusListAdapter); } - statusListAdapter.notifyItemRangeChanged(1,context.getDescendants().size()); - lv_status.scrollToPosition(position); } + } } diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/GNUAPI.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/GNUAPI.java index 8e331a453..4556663cb 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/client/GNUAPI.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/GNUAPI.java @@ -20,7 +20,6 @@ import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; -import android.util.Log; import org.json.JSONArray; import org.json.JSONException; @@ -548,19 +547,11 @@ public class GNUAPI { fr.gouv.etalab.mastodon.client.Entities.Context statusContext = new fr.gouv.etalab.mastodon.client.Entities.Context(); try { HttpsConnection httpsConnection = new HttpsConnection(context); - Log.v(Helper.TAG,"url: " + getAbsoluteUrl(String.format("/statusnet/conversation/%s.json", statusId))); String response = httpsConnection.get(getAbsoluteUrl(String.format("/statusnet/conversation/%s.json", statusId)), 60, null, prefKeyOauthTokenT); statuses = parseStatuses(context, new JSONArray(response)); if( statuses != null && statuses.size() > 0){ - ArrayList ancestors = new ArrayList<>(); ArrayList descendants = new ArrayList<>(); - for(Status status: statuses){ - if( Long.parseLong(status.getId()) > Long.parseLong(statusId) +1) - descendants.add(status); - else if( Long.parseLong(status.getId()) < Long.parseLong(statusId)) - ancestors.add(status); - } - statusContext.setAncestors(ancestors); + statusContext.setAncestors(statuses); statusContext.setDescendants(descendants); } @@ -1818,7 +1809,11 @@ public class GNUAPI { }catch (Exception ignored){ status.setMedia_attachments(new ArrayList<>());} status.setCard(null); - + try { + status.setConversationId(resobj.get("statusnet_conversation_id").toString()); + }catch (Exception ignored){ + status.setConversationId(resobj.get("id").toString()); + } //Retrieves mentions List mentions = new ArrayList<>(); if( resobj.has("attentions")) { diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java index eb88545d8..f4db79f79 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/StatusListAdapter.java @@ -855,6 +855,8 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (type != RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE) { Intent intent = new Intent(context, ShowConversationActivity.class); Bundle b = new Bundle(); + if( social == UpdateAccountInfoAsyncTask.SOCIAL.GNU || social == UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) + b.putString("conversationId", status.getConversationId()); if (status.getReblog() == null) b.putParcelable("status", status); else @@ -875,6 +877,8 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (type != RetrieveFeedsAsyncTask.Type.REMOTE_INSTANCE) { Intent intent = new Intent(context, ShowConversationActivity.class); Bundle b = new Bundle(); + if( social == UpdateAccountInfoAsyncTask.SOCIAL.GNU || social == UpdateAccountInfoAsyncTask.SOCIAL.FRIENDICA) + b.putString("conversationId", status.getConversationId()); if (status.getReblog() == null) b.putParcelable("status", status); else