added elevation to input panel in message conversation screen
This commit is contained in:
parent
c5278f9000
commit
a930fcb96f
|
@ -28,6 +28,7 @@ import android.database.Cursor;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v4.app.FragmentActivity;
|
import android.support.v4.app.FragmentActivity;
|
||||||
|
@ -35,6 +36,7 @@ import android.support.v4.app.LoaderManager;
|
||||||
import android.support.v4.app.LoaderManager.LoaderCallbacks;
|
import android.support.v4.app.LoaderManager.LoaderCallbacks;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.content.Loader;
|
import android.support.v4.content.Loader;
|
||||||
|
import android.support.v4.view.ViewCompat;
|
||||||
import android.support.v7.app.ActionBar;
|
import android.support.v7.app.ActionBar;
|
||||||
import android.support.v7.widget.FixedLinearLayoutManager;
|
import android.support.v7.widget.FixedLinearLayoutManager;
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
|
@ -43,6 +45,7 @@ import android.support.v7.widget.RecyclerView;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
|
import android.util.Property;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
@ -113,6 +116,8 @@ import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import me.uucky.colorpicker.internal.EffectViewHelper;
|
||||||
|
|
||||||
import static org.mariotaku.twidere.util.Utils.buildDirectMessageConversationUri;
|
import static org.mariotaku.twidere.util.Utils.buildDirectMessageConversationUri;
|
||||||
import static org.mariotaku.twidere.util.Utils.showOkMessage;
|
import static org.mariotaku.twidere.util.Utils.showOkMessage;
|
||||||
|
|
||||||
|
@ -125,7 +130,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
private static final String EXTRA_FROM_CACHE = "from_cache";
|
private static final String EXTRA_FROM_CACHE = "from_cache";
|
||||||
|
|
||||||
|
|
||||||
// Callbacks
|
// Callbacks and listeners
|
||||||
private LoaderCallbacks<List<ParcelableUser>> mSearchLoadersCallback = new LoaderCallbacks<List<ParcelableUser>>() {
|
private LoaderCallbacks<List<ParcelableUser>> mSearchLoadersCallback = new LoaderCallbacks<List<ParcelableUser>>() {
|
||||||
@Override
|
@Override
|
||||||
public Loader<List<ParcelableUser>> onCreateLoader(int id, Bundle args) {
|
public Loader<List<ParcelableUser>> onCreateLoader(int id, Bundle args) {
|
||||||
|
@ -153,6 +158,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
private PanelShowHideListener mScrollListener;
|
||||||
|
|
||||||
// Utility classes
|
// Utility classes
|
||||||
private TwidereValidator mValidator;
|
private TwidereValidator mValidator;
|
||||||
|
@ -162,6 +168,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
private ReadStateManager mReadStateManager;
|
private ReadStateManager mReadStateManager;
|
||||||
private MediaLoaderWrapper mImageLoader;
|
private MediaLoaderWrapper mImageLoader;
|
||||||
private UserColorNameManager mUserColorNameManager;
|
private UserColorNameManager mUserColorNameManager;
|
||||||
|
private EffectViewHelper mEffectHelper;
|
||||||
|
|
||||||
// Views
|
// Views
|
||||||
private RecyclerView mMessagesListView;
|
private RecyclerView mMessagesListView;
|
||||||
|
@ -178,6 +185,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
private View mUsersSearchEmpty;
|
private View mUsersSearchEmpty;
|
||||||
private TextView mUsersSearchEmptyText;
|
private TextView mUsersSearchEmptyText;
|
||||||
private PopupMenu mPopupMenu;
|
private PopupMenu mPopupMenu;
|
||||||
|
private View mInputPanelShadowCompat;
|
||||||
|
|
||||||
// Adapters
|
// Adapters
|
||||||
private MessageConversationAdapter mAdapter;
|
private MessageConversationAdapter mAdapter;
|
||||||
|
@ -192,6 +200,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
private ParcelableAccount mAccount;
|
private ParcelableAccount mAccount;
|
||||||
private ParcelableUser mRecipient;
|
private ParcelableUser mRecipient;
|
||||||
private boolean mTextChanged, mQueryTextChanged;
|
private boolean mTextChanged, mQueryTextChanged;
|
||||||
|
private View mInputPanel;
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void notifyTaskStateChanged(TaskStateChangedEvent event) {
|
public void notifyTaskStateChanged(TaskStateChangedEvent event) {
|
||||||
|
@ -260,6 +269,20 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
mMessagesListView.setLayoutManager(layoutManager);
|
mMessagesListView.setLayoutManager(layoutManager);
|
||||||
mMessagesListView.setAdapter(mAdapter);
|
mMessagesListView.setAdapter(mAdapter);
|
||||||
|
|
||||||
|
final boolean useOutline = Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP;
|
||||||
|
|
||||||
|
if (useOutline) {
|
||||||
|
final float elevation = getResources().getDimension(R.dimen.element_spacing_normal);
|
||||||
|
final PanelElevationProperty property = new PanelElevationProperty(elevation);
|
||||||
|
mEffectHelper = new EffectViewHelper(mInputPanel, property, 100);
|
||||||
|
} else {
|
||||||
|
mEffectHelper = new EffectViewHelper(mInputPanelShadowCompat, View.ALPHA, 100);
|
||||||
|
}
|
||||||
|
mScrollListener = new PanelShowHideListener(mEffectHelper);
|
||||||
|
|
||||||
|
mInputPanelShadowCompat.setVisibility(useOutline ? View.GONE : View.VISIBLE);
|
||||||
|
ViewCompat.setAlpha(mInputPanelShadowCompat, 0);
|
||||||
|
|
||||||
mUsersSearchAdapter = new SimpleParcelableUsersAdapter(activity);
|
mUsersSearchAdapter = new SimpleParcelableUsersAdapter(activity);
|
||||||
mUsersSearchList.setAdapter(mUsersSearchAdapter);
|
mUsersSearchList.setAdapter(mUsersSearchAdapter);
|
||||||
mUsersSearchList.setEmptyView(mUsersSearchEmpty);
|
mUsersSearchList.setEmptyView(mUsersSearchEmpty);
|
||||||
|
@ -329,6 +352,8 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
bus.register(this);
|
bus.register(this);
|
||||||
updateTextCount();
|
updateTextCount();
|
||||||
updateEmptyText();
|
updateEmptyText();
|
||||||
|
mMessagesListView.addOnScrollListener(mScrollListener);
|
||||||
|
mScrollListener.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -350,6 +375,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStop() {
|
public void onStop() {
|
||||||
|
mMessagesListView.removeOnScrollListener(mScrollListener);
|
||||||
final Bus bus = TwidereApplication.getInstance(getActivity()).getMessageBus();
|
final Bus bus = TwidereApplication.getInstance(getActivity()).getMessageBus();
|
||||||
bus.unregister(this);
|
bus.unregister(this);
|
||||||
if (mPopupMenu != null) {
|
if (mPopupMenu != null) {
|
||||||
|
@ -386,14 +412,15 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
mUsersSearchEmpty = view.findViewById(R.id.users_search_empty);
|
mUsersSearchEmpty = view.findViewById(R.id.users_search_empty);
|
||||||
mUsersSearchEmptyText = (TextView) view.findViewById(R.id.users_search_empty_text);
|
mUsersSearchEmptyText = (TextView) view.findViewById(R.id.users_search_empty_text);
|
||||||
mMessagesListView = (RecyclerView) view.findViewById(R.id.recycler_view);
|
mMessagesListView = (RecyclerView) view.findViewById(R.id.recycler_view);
|
||||||
final View inputSendContainer = view.findViewById(R.id.input_send_container);
|
|
||||||
mConversationContainer = view.findViewById(R.id.conversation_container);
|
mConversationContainer = view.findViewById(R.id.conversation_container);
|
||||||
mRecipientSelectorContainer = view.findViewById(R.id.recipient_selector_container);
|
|
||||||
mEditText = (StatusComposeEditText) inputSendContainer.findViewById(R.id.edit_text);
|
|
||||||
mTextCountView = (StatusTextCountView) inputSendContainer.findViewById(R.id.text_count);
|
|
||||||
mSendButton = inputSendContainer.findViewById(R.id.send);
|
|
||||||
mAddImageButton = (ImageView) inputSendContainer.findViewById(R.id.add_image);
|
|
||||||
mUsersSearchList = (ListView) view.findViewById(R.id.users_search_list);
|
mUsersSearchList = (ListView) view.findViewById(R.id.users_search_list);
|
||||||
|
mRecipientSelectorContainer = view.findViewById(R.id.recipient_selector_container);
|
||||||
|
mInputPanelShadowCompat = view.findViewById(R.id.input_panel_shadow_compat);
|
||||||
|
mInputPanel = view.findViewById(R.id.input_panel);
|
||||||
|
mEditText = (StatusComposeEditText) mInputPanel.findViewById(R.id.edit_text);
|
||||||
|
mTextCountView = (StatusTextCountView) mInputPanel.findViewById(R.id.text_count);
|
||||||
|
mSendButton = mInputPanel.findViewById(R.id.send);
|
||||||
|
mAddImageButton = (ImageView) mInputPanel.findViewById(R.id.add_image);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -527,6 +554,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void showConversation(final ParcelableAccount account, final ParcelableUser recipient) {
|
public void showConversation(final ParcelableAccount account, final ParcelableUser recipient) {
|
||||||
mAccount = account;
|
mAccount = account;
|
||||||
mRecipient = recipient;
|
mRecipient = recipient;
|
||||||
|
@ -873,5 +901,47 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class PanelShowHideListener extends RecyclerView.OnScrollListener {
|
||||||
|
|
||||||
|
private final EffectViewHelper mEffectHelper;
|
||||||
|
private boolean mShowElevation;
|
||||||
|
|
||||||
|
PanelShowHideListener(EffectViewHelper helper) {
|
||||||
|
mEffectHelper = helper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
|
||||||
|
final LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
|
||||||
|
final boolean showElevation = layoutManager.findLastCompletelyVisibleItemPosition() < layoutManager.getItemCount() - 1;
|
||||||
|
if (mShowElevation != showElevation) {
|
||||||
|
mEffectHelper.setState(showElevation);
|
||||||
|
}
|
||||||
|
mShowElevation = showElevation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
mEffectHelper.resetState(mShowElevation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class PanelElevationProperty extends Property<View, Float> {
|
||||||
|
|
||||||
|
private final float mElevation;
|
||||||
|
|
||||||
|
private PanelElevationProperty(float elevation) {
|
||||||
|
super(Float.TYPE, null);
|
||||||
|
mElevation = elevation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(View object, Float value) {
|
||||||
|
ViewCompat.setTranslationZ(object, mElevation * value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Float get(View object) {
|
||||||
|
return ViewCompat.getTranslationZ(object) / mElevation;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,10 +19,10 @@
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<org.mariotaku.twidere.view.ExtendedRelativeLayout
|
<org.mariotaku.twidere.view.ExtendedRelativeLayout
|
||||||
android:id="@+id/main_content"
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/main_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:padding="@dimen/element_spacing_normal">
|
android:padding="@dimen/element_spacing_normal">
|
||||||
|
@ -88,6 +88,7 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
|
android:listSelector="?selectableItemBackground"
|
||||||
tools:listitem="@layout/list_item_user"/>
|
tools:listitem="@layout/list_item_user"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
android:id="@+id/list_container"
|
android:id="@+id/list_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_above="@+id/input_send_container">
|
android:layout_above="@+id/input_panel">
|
||||||
|
|
||||||
<android.support.v7.widget.RecyclerView
|
<android.support.v7.widget.RecyclerView
|
||||||
android:id="@+id/recycler_view"
|
android:id="@+id/recycler_view"
|
||||||
|
@ -47,20 +47,23 @@
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/input_panel_shadow_compat"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="@dimen/element_spacing_small"
|
android:layout_height="@dimen/element_spacing_small"
|
||||||
android:layout_above="@+id/input_send_container"
|
android:layout_above="@+id/input_panel"
|
||||||
android:background="@drawable/shadow_top" />
|
android:background="@drawable/shadow_top" />
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
android:id="@+id/input_send_container"
|
android:id="@+id/input_panel"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentBottom="true"
|
android:layout_alignParentBottom="true"
|
||||||
android:background="?android:colorBackground"
|
android:background="?android:colorBackground"
|
||||||
android:gravity="bottom"
|
android:gravity="bottom"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:padding="@dimen/element_spacing_normal">
|
android:outlineProvider="bounds"
|
||||||
|
android:padding="@dimen/element_spacing_normal"
|
||||||
|
tools:ignore="UnusedAttribute">
|
||||||
|
|
||||||
<org.mariotaku.twidere.view.ActionIconView
|
<org.mariotaku.twidere.view.ActionIconView
|
||||||
android:id="@+id/add_image"
|
android:id="@+id/add_image"
|
||||||
|
@ -117,7 +120,9 @@
|
||||||
android:hint="@string/type_to_compose"
|
android:hint="@string/type_to_compose"
|
||||||
android:inputType="textShortMessage|textMultiLine"
|
android:inputType="textShortMessage|textMultiLine"
|
||||||
android:maxHeight="140dp"
|
android:maxHeight="140dp"
|
||||||
android:singleLine="false">
|
android:singleLine="false"
|
||||||
|
android:textAppearance="?android:textAppearanceMedium"
|
||||||
|
android:textColor="?android:textColorPrimary">
|
||||||
|
|
||||||
<requestFocus />
|
<requestFocus />
|
||||||
</org.mariotaku.twidere.view.StatusComposeEditText>
|
</org.mariotaku.twidere.view.StatusComposeEditText>
|
||||||
|
|
Loading…
Reference in New Issue