hides title and menu items when hiding action bar in search fragment

This commit is contained in:
Mariotaku Lee 2015-04-04 06:06:08 +08:00
parent 4b32455fa2
commit c2dae75dec
7 changed files with 99 additions and 69 deletions

View File

@ -47,6 +47,7 @@ import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
import org.mariotaku.twidere.graphic.EmptyDrawable;
import org.mariotaku.twidere.provider.RecentSearchProvider;
import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
@ -59,6 +60,7 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
OnPageChangeListener {
private ViewPager mViewPager;
private View mPagerWindowOverlay;
private SupportTabsAdapter mAdapter;
private TabPagerIndicator mPagerIndicator;
@ -111,8 +113,14 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
}
private void updateTabOffset() {
int controlBarHeight = getControlBarHeight();
mPagerIndicator.setTranslationY(controlBarHeight - mControlBarOffsetPixels);
final int controlBarHeight = getControlBarHeight();
final int translationY = controlBarHeight - mControlBarOffsetPixels;
final View view = getActivity().getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (view != null && controlBarHeight != 0) {
view.setAlpha(translationY / (float) controlBarHeight);
}
mPagerIndicator.setTranslationY(translationY);
mPagerWindowOverlay.setTranslationY(translationY);
}
private int getControlBarHeight() {
@ -163,7 +171,8 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
mPagerIndicator.setViewPager(mViewPager);
mPagerIndicator.setTabDisplayOption(TabPagerIndicator.LABEL);
mPagerIndicator.setOnPageChangeListener(this);
ThemeUtils.initPagerIndicatorAsActionBarTab(activity,mPagerIndicator);
ThemeUtils.initPagerIndicatorAsActionBarTab(activity, mPagerIndicator);
ThemeUtils.setCompatToolbarOverlay(activity, new EmptyDrawable());
if (savedInstanceState == null && args != null && args.containsKey(EXTRA_QUERY)) {
final String query = args.getString(EXTRA_QUERY);
final SearchRecentSuggestions suggestions = new SearchRecentSuggestions(getActivity(),
@ -246,6 +255,7 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
public void onBaseViewCreated(final View view, final Bundle savedInstanceState) {
super.onBaseViewCreated(view, savedInstanceState);
mViewPager = (ViewPager) view.findViewById(R.id.view_pager);
mPagerWindowOverlay = view.findViewById(R.id.pager_window_overlay);
mPagerIndicator = (TabPagerIndicator) view.findViewById(R.id.view_pager_tabs);
}

View File

@ -31,6 +31,7 @@ import android.nfc.NdefRecord;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
@ -1207,50 +1208,52 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
timeSourceView.setTextSize(defaultTextSize * 0.85f);
textView.setMovementMethod(StatusContentMovementMethod.getInstance());
textView.setCustomSelectionActionModeCallback(new Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
final FragmentActivity activity = fragment.getActivity();
if (activity instanceof IThemedActivity) {
final int themeRes = ((IThemedActivity) activity).getCurrentThemeResourceId();
final int accentColor = ((IThemedActivity) activity).getCurrentThemeColor();
ThemeUtils.applySupportActionModeBackground(mode, fragment.getActivity(), themeRes, accentColor, true);
}
mode.getMenuInflater().inflate(R.menu.action_status_text_selection, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
final int start = textView.getSelectionStart(), end = textView.getSelectionEnd();
final SpannableString string = SpannableString.valueOf(textView.getText());
final URLSpan[] spans = string.getSpans(start, end, URLSpan.class);
final boolean avail = spans.length == 1 && URLUtil.isValidUrl(spans[0].getURL());
Utils.setMenuItemAvailability(menu, android.R.id.copyUrl, avail);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case android.R.id.copyUrl: {
final int start = textView.getSelectionStart(), end = textView.getSelectionEnd();
final SpannableString string = SpannableString.valueOf(textView.getText());
final URLSpan[] spans = string.getSpans(start, end, URLSpan.class);
if (spans.length != 1) return true;
ClipboardUtils.setText(activity, spans[0].getURL());
mode.finish();
return true;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
textView.setCustomSelectionActionModeCallback(new Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
final FragmentActivity activity = fragment.getActivity();
if (activity instanceof IThemedActivity) {
final int themeRes = ((IThemedActivity) activity).getCurrentThemeResourceId();
final int accentColor = ((IThemedActivity) activity).getCurrentThemeColor();
ThemeUtils.applySupportActionModeBackground(mode, fragment.getActivity(), themeRes, accentColor, true);
}
mode.getMenuInflater().inflate(R.menu.action_status_text_selection, menu);
return true;
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
final int start = textView.getSelectionStart(), end = textView.getSelectionEnd();
final SpannableString string = SpannableString.valueOf(textView.getText());
final URLSpan[] spans = string.getSpans(start, end, URLSpan.class);
final boolean avail = spans.length == 1 && URLUtil.isValidUrl(spans[0].getURL());
Utils.setMenuItemAvailability(menu, android.R.id.copyUrl, avail);
return true;
}
}
});
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case android.R.id.copyUrl: {
final int start = textView.getSelectionStart(), end = textView.getSelectionEnd();
final SpannableString string = SpannableString.valueOf(textView.getText());
final URLSpan[] spans = string.getSpans(start, end, URLSpan.class);
if (spans.length != 1) return true;
ClipboardUtils.setText(activity, spans[0].getURL());
mode.finish();
return true;
}
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
}
}

View File

@ -61,7 +61,6 @@ import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.internal.widget.ActionBarOverlayLayout;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
@ -133,7 +132,6 @@ import org.mariotaku.twidere.view.TabPagerIndicator;
import org.mariotaku.twidere.view.TintedStatusFrameLayout;
import org.mariotaku.twidere.view.iface.IExtendedView.OnSizeChangedListener;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Locale;
@ -1376,18 +1374,11 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
updateTitleColor();
}
private void setCompatToolbarOverlayAlpha(FragmentActivity activity, float alpha) {
private static void setCompatToolbarOverlayAlpha(FragmentActivity activity, float alpha) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) return;
final View view = activity.getWindow().findViewById(android.support.v7.appcompat.R.id.decor_content_parent);
if (!(view instanceof ActionBarOverlayLayout)) return;
try {
final Field field = ActionBarOverlayLayout.class.getDeclaredField("mWindowContentOverlay");
field.setAccessible(true);
final Drawable drawable = (Drawable) field.get(view);
if (drawable == null) return;
drawable.setAlpha(Math.round(alpha * 255));
} catch (Exception ignore) {
}
final Drawable drawable = ThemeUtils.getCompatToolbarOverlay(activity);
if (drawable == null) return;
drawable.setAlpha(Math.round(alpha * 255));
}
private void updateTitleColor() {

View File

@ -29,11 +29,11 @@ import android.view.View;
import android.view.ViewGroup;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
import org.mariotaku.twidere.graphic.EmptyDrawable;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.view.TabPagerIndicator;
@ -68,6 +68,7 @@ public class UserListsFragment extends BaseSupportFragment implements RefreshScr
mPagerIndicator.setViewPager(mViewPager);
mPagerIndicator.setTabDisplayOption(TabPagerIndicator.LABEL);
ThemeUtils.initPagerIndicatorAsActionBarTab(activity, mPagerIndicator);
ThemeUtils.setCompatToolbarOverlay(activity, new EmptyDrawable());
}

View File

@ -41,6 +41,7 @@ import android.support.v7.internal.app.WindowDecorActionBar.ActionModeImpl;
import android.support.v7.internal.view.SupportActionModeWrapper;
import android.support.v7.internal.view.SupportActionModeWrapperTrojan;
import android.support.v7.internal.view.menu.ActionMenuItemView;
import android.support.v7.internal.widget.ActionBarOverlayLayout;
import android.support.v7.widget.ActionMenuView;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
@ -162,6 +163,19 @@ public class ThemeUtils implements Constants {
}
}
public static Drawable getCompatToolbarOverlay(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) return null;
final View view = activity.getWindow().findViewById(android.support.v7.appcompat.R.id.decor_content_parent);
if (!(view instanceof ActionBarOverlayLayout)) return null;
try {
final Field field = ActionBarOverlayLayout.class.getDeclaredField("mWindowContentOverlay");
field.setAccessible(true);
return (Drawable) field.get(view);
} catch (Exception ignore) {
}
return null;
}
public static void initPagerIndicatorAsActionBarTab(FragmentActivity activity, TabPagerIndicator indicator) {
final float supportActionBarElevation = getSupportActionBarElevation(activity);
ViewCompat.setElevation(indicator, supportActionBarElevation);
@ -203,6 +217,18 @@ public class ThemeUtils implements Constants {
}
}
public static void setCompatToolbarOverlay(Activity activity, Drawable background) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) return;
final View view = activity.getWindow().findViewById(android.support.v7.appcompat.R.id.decor_content_parent);
if (!(view instanceof ActionBarOverlayLayout)) return;
try {
final Field field = ActionBarOverlayLayout.class.getDeclaredField("mWindowContentOverlay");
field.setAccessible(true);
field.set(view, background);
} catch (Exception ignore) {
}
}
public static void wrapMenuIcon(@NonNull Menu menu, int itemColor, int subItemColor, int... excludeGroups) {
for (int i = 0, j = menu.size(); i < j; i++) {
final MenuItem item = menu.getItem(i);

View File

@ -129,7 +129,9 @@ public final class TwidereLinkify implements Constants {
addLinks(string, account_id, type, sensitive, listener, highlightOption);
}
view.setText(string);
addLinkMovementMethod(view);
if (mAddMovementMethod) {
addLinkMovementMethod(view);
}
}
public final void applyUserProfileLink(final TextView view, final long accountId, final long userId,
@ -152,7 +154,9 @@ public final class TwidereLinkify implements Constants {
applyLink(screenName, 0, string.length(), string, accountId, LINK_TYPE_MENTION, false, listener);
}
view.setText(string);
addLinkMovementMethod(view);
if (mAddMovementMethod) {
addLinkMovementMethod(view);
}
}
public void setHighlightOption(final int style) {

View File

@ -30,11 +30,11 @@
android:layout_height="match_parent"
android:orientation="vertical">
<View
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="@dimen/element_spacing_xsmall"
android:layout_alignBottom="@+id/view_pager_tabs"
android:background="?android:dividerVertical"/>
android:layout_height="match_parent"
android:layout_below="@+id/view_pager_tabs"/>
<org.mariotaku.twidere.view.TabPagerIndicator
android:id="@+id/view_pager_tabs"
@ -49,13 +49,8 @@
app:tabShowDivider="true"
tools:ignore="UnusedAttribute"/>
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/view_pager_tabs"/>
<View
android:id="@+id/pager_window_overlay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/view_pager"