Fixes reorienting creating a visual duplicate of the thread. Closes #237

This commit is contained in:
Vavassor 2017-05-03 16:28:46 -04:00
parent 7749c7f70b
commit 24b7e4db4c
4 changed files with 41 additions and 20 deletions

View File

@ -38,7 +38,8 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboardHidden"> android:name=".MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden">
</activity> </activity>
<activity <activity
android:name=".ComposeActivity" android:name=".ComposeActivity"
@ -59,8 +60,12 @@
<data android:mimeType="image/*" /> <data android:mimeType="image/*" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".ViewVideoActivity" android:configChanges="orientation|keyboardHidden|screenSize" /> <activity
<activity android:name=".ViewThreadActivity" /> android:name=".ViewVideoActivity"
android:configChanges="orientation|keyboardHidden|screenSize" />
<activity
android:name=".ViewThreadActivity"
android:configChanges="orientation|screenSize" />
<activity android:name=".ViewTagActivity" /> <activity android:name=".ViewTagActivity" />
<activity android:name=".AccountActivity" /> <activity android:name=".AccountActivity" />
<activity android:name=".EditProfileActivity" /> <activity android:name=".EditProfileActivity" />

View File

@ -15,7 +15,6 @@
package com.keylesspalace.tusky; package com.keylesspalace.tusky;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -94,11 +93,11 @@ class ThreadAdapter extends RecyclerView.Adapter implements AdapterItemRemover {
// In case of refresh, remove old ancestors and descendants first. We'll remove all blindly, // In case of refresh, remove old ancestors and descendants first. We'll remove all blindly,
// as we have no guarantee on their order to be the same as before // as we have no guarantee on their order to be the same as before
int old_size = statuses.size(); int oldSize = statuses.size();
if (old_size > 0) { if (oldSize > 0) {
mainStatus = statuses.get(statusIndex); mainStatus = statuses.get(statusIndex);
statuses.clear(); statuses.clear();
notifyItemRangeRemoved(0, old_size); notifyItemRangeRemoved(0, oldSize);
} }
// Insert newly fetched ancestors // Insert newly fetched ancestors

View File

@ -15,6 +15,7 @@
package com.keylesspalace.tusky; package com.keylesspalace.tusky;
import android.content.res.Configuration;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
@ -74,4 +75,11 @@ public class ViewThreadActivity extends BaseActivity implements SFragment.OnUser
listener.removePostsByUser(accountId); listener.removePostsByUser(accountId);
} }
} }
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
/* Provide a stub to ignore configuration changes so the thread isn't reloaded when the
* the activity is reoriented or resized. */
}
} }

View File

@ -34,6 +34,7 @@ import com.keylesspalace.tusky.entity.StatusContext;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response;
public class ViewThreadFragment extends SFragment implements public class ViewThreadFragment extends SFragment implements
SwipeRefreshLayout.OnRefreshListener, StatusActionListener, StatusRemoveListener { SwipeRefreshLayout.OnRefreshListener, StatusActionListener, StatusRemoveListener {
@ -42,6 +43,7 @@ public class ViewThreadFragment extends SFragment implements
private SwipeRefreshLayout swipeRefreshLayout; private SwipeRefreshLayout swipeRefreshLayout;
private RecyclerView recyclerView; private RecyclerView recyclerView;
private ThreadAdapter adapter; private ThreadAdapter adapter;
private MastodonAPI mastodonApi;
private String thisThreadsStatusId; private String thisThreadsStatusId;
public static ViewThreadFragment newInstance(String id) { public static ViewThreadFragment newInstance(String id) {
@ -72,25 +74,34 @@ public class ViewThreadFragment extends SFragment implements
R.drawable.status_divider_dark); R.drawable.status_divider_dark);
divider.setDrawable(drawable); divider.setDrawable(drawable);
recyclerView.addItemDecoration(divider); recyclerView.addItemDecoration(divider);
recyclerView.addItemDecoration(new ConversationLineItemDecoration(context, ContextCompat.getDrawable(context, R.drawable.conversation_divider_dark))); recyclerView.addItemDecoration(new ConversationLineItemDecoration(context,
ContextCompat.getDrawable(context, R.drawable.conversation_divider_dark)));
adapter = new ThreadAdapter(this); adapter = new ThreadAdapter(this);
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
String id = getArguments().getString("id"); mastodonApi = null;
sendStatusRequest(id); thisThreadsStatusId = null;
sendThreadRequest(id);
thisThreadsStatusId = id;
return rootView; return rootView;
} }
private void sendStatusRequest(final String id) { @Override
MastodonAPI api = ((BaseActivity) getActivity()).mastodonAPI; public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Call<Status> call = api.status(id); /* BaseActivity's MastodonAPI object isn't guaranteed to be valid until after its onCreate
* is run, so all calls that need it can't be done until here. */
mastodonApi = ((BaseActivity) getActivity()).mastodonAPI;
thisThreadsStatusId = getArguments().getString("id");
onRefresh();
}
private void sendStatusRequest(final String id) {
Call<Status> call = mastodonApi.status(id);
call.enqueue(new Callback<Status>() { call.enqueue(new Callback<Status>() {
@Override @Override
public void onResponse(Call<Status> call, retrofit2.Response<Status> response) { public void onResponse(Call<Status> call, Response<Status> response) {
if (response.isSuccessful()) { if (response.isSuccessful()) {
int position = adapter.setStatus(response.body()); int position = adapter.setStatus(response.body());
recyclerView.scrollToPosition(position); recyclerView.scrollToPosition(position);
@ -108,12 +119,10 @@ public class ViewThreadFragment extends SFragment implements
} }
private void sendThreadRequest(final String id) { private void sendThreadRequest(final String id) {
MastodonAPI api = ((BaseActivity) getActivity()).mastodonAPI; Call<StatusContext> call = mastodonApi.statusContext(id);
Call<StatusContext> call = api.statusContext(id);
call.enqueue(new Callback<StatusContext>() { call.enqueue(new Callback<StatusContext>() {
@Override @Override
public void onResponse(Call<StatusContext> call, retrofit2.Response<StatusContext> response) { public void onResponse(Call<StatusContext> call, Response<StatusContext> response) {
if (response.isSuccessful()) { if (response.isSuccessful()) {
swipeRefreshLayout.setRefreshing(false); swipeRefreshLayout.setRefreshing(false);
StatusContext context = response.body(); StatusContext context = response.body();