Conditionally show a toolbar shadow in the conversation list.
This commit is contained in:
parent
096c9e0ff7
commit
12c4283c30
5 changed files with 62 additions and 7 deletions
8
res/drawable/toolbar_shadow.xml
Normal file
8
res/drawable/toolbar_shadow.xml
Normal 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>
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue