Conditionally show a toolbar shadow in the conversation list.

This commit is contained in:
Greyson Parrelli 2019-10-17 22:23:27 -04:00
parent 096c9e0ff7
commit 12c4283c30
5 changed files with 62 additions and 7 deletions

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="90"
android:dither="true"
android:startColor="@android:color/transparent"
android:endColor="@color/conversation_compose_divider" />
</shape>

View file

@ -14,7 +14,6 @@
android:layout_height="?attr/actionBarSize"
android:minHeight="?attr/actionBarSize"
android:background="?attr/conversation_list_toolbar_background"
android:elevation="4dp"
android:theme="?attr/actionBarStyle">
<androidx.constraintlayout.widget.ConstraintLayout
@ -64,6 +63,14 @@
</androidx.appcompat.widget.Toolbar>
<ImageView
android:id="@+id/conversation_list_toolbar_shadow"
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_below="@id/toolbar"
android:src="@drawable/toolbar_shadow"
android:visibility="gone" />
<FrameLayout android:id="@+id/fragment_container"
android:layout_below="@id/toolbar"
android:layout_width="match_parent"

View file

@ -33,6 +33,7 @@ import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
@ -60,13 +61,14 @@ import org.thoughtcrime.securesms.util.DynamicLanguage;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
import org.whispersystems.libsignal.util.guava.Optional;
import java.util.List;
public class ConversationListActivity extends PassphraseRequiredActionBarActivity
implements ConversationListFragment.ConversationSelectedListener
implements ConversationListFragment.Controller
{
@SuppressWarnings("unused")
private static final String TAG = ConversationListActivity.class.getSimpleName();
@ -79,6 +81,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
private SearchToolbar searchToolbar;
private ImageView searchAction;
private ViewGroup fragmentContainer;
private View toolbarShadow;
@Override
protected void onPreCreate() {
@ -96,6 +99,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
searchToolbar = findViewById(R.id.search_toolbar);
searchAction = findViewById(R.id.search_action);
fragmentContainer = findViewById(R.id.fragment_container);
toolbarShadow = findViewById(R.id.conversation_list_toolbar_shadow);
conversationListFragment = initFragment(R.id.fragment_container, new ConversationListFragment(), dynamicLanguage.getCurrentLocale());
initializeSearchListener();
@ -246,6 +250,20 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
else super.onBackPressed();
}
@Override
public void onListScrolledToTop() {
if (toolbarShadow.getVisibility() != View.GONE) {
ViewUtil.fadeOut(toolbarShadow, 250);
}
}
@Override
public void onListScrolledAwayFromTop() {
if (toolbarShadow.getVisibility() != View.VISIBLE) {
ViewUtil.fadeIn(toolbarShadow, 250);
}
}
private void createGroup() {
Intent intent = new Intent(this, GroupCreateActivity.class);
startActivity(intent);

View file

@ -10,7 +10,7 @@ import org.thoughtcrime.securesms.util.DynamicLanguage;
import org.thoughtcrime.securesms.util.DynamicTheme;
public class ConversationListArchiveActivity extends PassphraseRequiredActionBarActivity
implements ConversationListFragment.ConversationSelectedListener
implements ConversationListFragment.Controller
{
private final DynamicTheme dynamicTheme = new DynamicTheme();
@ -69,4 +69,13 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
throw new AssertionError();
}
@Override
public void onListScrolledToTop() {
}
@Override
public void onListScrolledAwayFromTop() {
}
}

View file

@ -34,7 +34,6 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.fragment.app.Fragment;
import androidx.loader.app.LoaderManager;
@ -155,6 +154,7 @@ public class ConversationListFragment extends Fragment
list.setHasFixedSize(true);
list.setLayoutManager(new LinearLayoutManager(getActivity()));
list.setItemAnimator(new DeleteItemAnimator());
list.addOnScrollListener(new ScrollListener());
new ItemTouchHelper(new ArchiveListenerCallback()).attachToRecyclerView(list);
@ -373,7 +373,7 @@ public class ConversationListFragment extends Fragment
}
private void handleCreateConversation(long threadId, Recipient recipient, int distributionType, long lastSeen) {
((ConversationSelectedListener)getActivity()).onCreateConversation(threadId, recipient, distributionType, lastSeen);
((Controller)getActivity()).onCreateConversation(threadId, recipient, distributionType, lastSeen);
}
@Override
@ -441,12 +441,14 @@ public class ConversationListFragment extends Fragment
@Override
public void onSwitchToArchive() {
((ConversationSelectedListener)getActivity()).onSwitchToArchive();
((Controller)getActivity()).onSwitchToArchive();
}
public interface ConversationSelectedListener {
public interface Controller {
void onCreateConversation(long threadId, Recipient recipient, int distributionType, long lastSeen);
void onSwitchToArchive();
void onListScrolledToTop();
void onListScrolledAwayFromTop();
}
@Override
@ -628,6 +630,17 @@ public class ConversationListFragment extends Fragment
}
}
}
private class ScrollListener extends RecyclerView.OnScrollListener {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (recyclerView.canScrollVertically(-1)) {
((Controller) getActivity()).onListScrolledAwayFromTop();
} else {
((Controller) getActivity()).onListScrolledToTop();
}
}
}
}