From 331aa69f9212b4a49740b03a90a5599d38f52818 Mon Sep 17 00:00:00 2001 From: Floens Date: Thu, 30 Apr 2015 23:42:51 +0200 Subject: [PATCH] Keep search open for navigating back --- .../chan/controller/NavigationController.java | 4 +- .../chan/ui/toolbar/NavigationItem.java | 10 +- .../org/floens/chan/ui/toolbar/Toolbar.java | 297 +++++++++--------- 3 files changed, 162 insertions(+), 149 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java index 641f7f14..2a8fc693 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java @@ -186,8 +186,6 @@ public abstract class NavigationController extends Controller implements Control for (Controller controller : controllerList) { controller.onConfigurationChanged(newConfig); } - - toolbar.onConfigurationChanged(newConfig); } public void onMenuClicked() { @@ -195,7 +193,7 @@ public abstract class NavigationController extends Controller implements Control } public void showSearch() { - toolbar.showSearch(); + toolbar.openSearch(); } @Override diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java index 7d7c1d50..2cbece32 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/NavigationItem.java @@ -36,6 +36,9 @@ public class NavigationItem { public View rightView; public boolean hasDrawer = false; + boolean search = false; + String searchText; + Toolbar toolbar; LinearLayout view; public ToolbarMenuItem createOverflow(Context context, ToolbarMenuItem.ToolbarMenuItemCallback callback, List items) { @@ -46,11 +49,8 @@ public class NavigationItem { } public void updateTitle() { - if (view != null) { - TextView titleView = (TextView) view.findViewById(R.id.title); - if (titleView != null) { - titleView.setText(title); - } + if (toolbar != null) { + toolbar.setTitle(this, title); } } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java index 6d5da0a0..54417b0b 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java @@ -23,7 +23,6 @@ import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.content.Context; -import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Build; import android.text.Editable; @@ -63,7 +62,7 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV private ToolbarCallback callback; private NavigationItem navigationItem; - private boolean search = false; + private boolean openKeyboardAfterSearchViewCreated = false; public Toolbar(Context context) { super(context); @@ -81,102 +80,20 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV } public void updateNavigation() { - closeSearchInternal(true); + closeSearchInternal(); setNavigationItem(false, false, navigationItem); } - public boolean showSearch() { - if (!search) { - search = true; - - LinearLayout searchViewWrapper = new LinearLayout(getContext()); - final EditText searchView = new EditText(getContext()); - searchView.setImeOptions(EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_ACTION_DONE); - searchView.setHint(callback.getSearchHint()); - searchView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - searchView.setHintTextColor(0x88ffffff); - searchView.setTextColor(0xffffffff); - searchView.setSingleLine(true); - searchView.setBackgroundResource(0); - searchView.setPadding(0, 0, 0, 0); - final ImageView clearButton = new ImageView(getContext()); - searchView.addTextChangedListener(new TextWatcher() { - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - callback.onSearchEntered(s.toString()); - clearButton.setAlpha(s.length() == 0 ? 0.6f : 1.0f); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void afterTextChanged(Editable s) { - } - }); - searchView.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_DONE) { - AndroidUtils.hideKeyboard(searchView); - callback.onSearchEntered(searchView.getText().toString()); - return true; - } - return false; - } - }); - LinearLayout.LayoutParams searchViewParams = new LinearLayout.LayoutParams(0, dp(36), 1); - searchViewParams.gravity = Gravity.CENTER_VERTICAL; - searchViewWrapper.addView(searchView, searchViewParams); - - clearButton.setImageResource(R.drawable.ic_close_white_24dp); - clearButton.setAlpha(0.6f); - clearButton.setScaleType(ImageView.ScaleType.CENTER); - clearButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - searchView.setText(""); - AndroidUtils.requestKeyboardFocus(searchView); - } - }); - searchViewWrapper.addView(clearButton, dp(48), LayoutParams.MATCH_PARENT); - searchViewWrapper.setPadding(dp(16), 0, 0, 0); - - searchView.post(new Runnable() { - @Override - public void run() { - searchView.requestFocus(); - AndroidUtils.requestKeyboardFocus(searchView); - } - }); - - navigationItemContainer.setView(searchViewWrapper, true); - animateArrow(true, 0); - callback.onSearchVisibilityChanged(true); - return true; - } else { - return false; - } + public boolean openSearch() { + return openSearchInternal(); } public boolean closeSearch() { - return closeSearchInternal(false); + return closeSearchInternal(); } public void setNavigationItem(final boolean animate, final boolean pushing, final NavigationItem item) { - closeSearchInternal(true); - if (item.menu != null) { - AndroidUtils.waitForMeasure(this, new AndroidUtils.OnMeasuredCallback() { - @Override - public boolean onMeasured(View view) { - setNavigationItemInternal(animate, pushing, false, item); - return true; - } - }); - } else { - setNavigationItemInternal(animate, pushing, false, item); - } + setNavigationItemInternal(animate, pushing, item); } public void setCallback(ToolbarCallback callback) { @@ -186,9 +103,7 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV @Override public void onClick(View v) { if (v == arrowMenuView) { - if (callback != null) { - callback.onMenuOrBackClicked(arrowMenuDrawable.getProgress() == 1f); - } + callback.onMenuOrBackClicked(arrowMenuDrawable.getProgress() == 1f); } } @@ -196,9 +111,6 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV arrowMenuDrawable.setProgress(progress); } - public void onConfigurationChanged(Configuration newConfig) { - } - @Override public void onLoadViewRemoved(View view) { // TODO: this is kinda a hack @@ -207,6 +119,15 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV } } + void setTitle(NavigationItem navigationItem, String title) { + if (navigationItem.view != null) { + TextView titleView = (TextView) navigationItem.view.findViewById(R.id.title); + if (titleView != null) { + titleView.setText(title); + } + } + } + private void init() { setOrientation(HORIZONTAL); @@ -233,24 +154,47 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV addView(navigationItemContainer, new LayoutParams(0, LayoutParams.MATCH_PARENT, 1f)); } - private boolean closeSearchInternal(boolean fromSetNavigation) { - if (search) { - search = false; - setNavigationItemInternal(true, false, true, navigationItem); + private boolean openSearchInternal() { + if (!navigationItem.search) { + navigationItem.search = true; + openKeyboardAfterSearchViewCreated = true; + setNavigationItem(true, true, navigationItem); + setNavigationItemInternal(true, false, navigationItem); + callback.onSearchVisibilityChanged(true); + return true; + } else { + return false; + } + } + + private boolean closeSearchInternal() { + if (navigationItem.search) { + navigationItem.search = false; + navigationItem.searchText = null; + setNavigationItemInternal(true, false, navigationItem); AndroidUtils.hideKeyboard(navigationItemContainer); callback.onSearchVisibilityChanged(false); - if (!fromSetNavigation) { - animateArrow(navigationItem.hasBack, 0); - } return true; } else { return false; } } - private void setNavigationItemInternal(boolean animate, boolean pushing, boolean fromSearch, NavigationItem toItem) { + private void setNavigationItemInternal(boolean animate, boolean pushing, NavigationItem toItem) { final NavigationItem fromItem = navigationItem; + boolean same = toItem == navigationItem; + + if (!toItem.search) { + AndroidUtils.hideKeyboard(navigationItemContainer); + } + + if (fromItem != null) { + fromItem.toolbar = null; + } + + toItem.toolbar = this; + if (!animate) { if (fromItem != null) { removeNavigationItem(fromItem); @@ -261,7 +205,7 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV toItem.view = createNavigationItemView(toItem); // use the LoadView animation when from a search - if (fromSearch) { + if (same) { navigationItemContainer.setView(toItem.view, true); } else { navigationItemContainer.addView(toItem.view, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); @@ -271,18 +215,16 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV final int offset = dp(16); final int delay = pushing ? 0 : 100; + if (animate) { + animateArrow(toItem.hasBack || toItem.search, toItem.search ? 0 : delay); + } + // Use the LoadView animation when from a search - if (animate && !fromSearch) { + if (animate && !same) { toItem.view.setAlpha(0f); List animations = new ArrayList<>(5); - if (fromItem != null && fromItem.hasBack != toItem.hasBack) { - animateArrow(toItem.hasBack, delay); - } else { - setArrowMenuProgress(toItem.hasBack ? 1f : 0f); - } - Animator toYAnimation = ObjectAnimator.ofFloat(toItem.view, View.TRANSLATION_Y, pushing ? offset : -offset, 0f); toYAnimation.setDuration(duration); toYAnimation.setInterpolator(new DecelerateInterpolator(2f)); @@ -329,48 +271,121 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV } private LinearLayout createNavigationItemView(final NavigationItem item) { - LinearLayout wrapper = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.toolbar_menu, null); - wrapper.setGravity(Gravity.CENTER_VERTICAL); - - final TextView titleView = (TextView) wrapper.findViewById(R.id.title); - titleView.setTypeface(AndroidUtils.ROBOTO_MEDIUM); - titleView.setText(item.title); - // black: titleView.setTextColor(Color.argb((int)(0.87 * 255.0), 0, 0, 0)); + if (item.search) { + LinearLayout searchViewWrapper = new LinearLayout(getContext()); + final EditText searchView = new EditText(getContext()); + searchView.setImeOptions(EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_ACTION_DONE); + searchView.setHint(callback.getSearchHint()); + if (item.searchText != null) { + searchView.setText(item.searchText); + } + searchView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + searchView.setHintTextColor(0x88ffffff); + searchView.setTextColor(0xffffffff); + searchView.setSingleLine(true); + searchView.setBackgroundResource(0); + searchView.setPadding(0, 0, 0, 0); + final ImageView clearButton = new ImageView(getContext()); + searchView.addTextChangedListener(new TextWatcher() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + item.searchText = s.toString(); + callback.onSearchEntered(s.toString()); + clearButton.setAlpha(s.length() == 0 ? 0.6f : 1.0f); + } - if (item.middleMenu != null) { - item.middleMenu.setAnchor(titleView, Gravity.LEFT, dp(5), dp(5)); + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } - Drawable drawable = new DropdownArrowDrawable(); - titleView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null); + @Override + public void afterTextChanged(Editable s) { + } + }); + searchView.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + AndroidUtils.hideKeyboard(searchView); + callback.onSearchEntered(searchView.getText().toString()); + return true; + } + return false; + } + }); + LinearLayout.LayoutParams searchViewParams = new LinearLayout.LayoutParams(0, dp(36), 1); + searchViewParams.gravity = Gravity.CENTER_VERTICAL; + searchViewWrapper.addView(searchView, searchViewParams); - titleView.setOnClickListener(new OnClickListener() { + clearButton.setImageResource(R.drawable.ic_close_white_24dp); + clearButton.setAlpha(searchView.length() == 0 ? 0.6f : 1.0f); + clearButton.setScaleType(ImageView.ScaleType.CENTER); + clearButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - item.middleMenu.show(); + searchView.setText(""); + AndroidUtils.requestKeyboardFocus(searchView); } }); - } + searchViewWrapper.addView(clearButton, dp(48), LayoutParams.MATCH_PARENT); + searchViewWrapper.setPadding(dp(16), 0, 0, 0); - if (item.menu != null) { - wrapper.addView(item.menu, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); - } + if (openKeyboardAfterSearchViewCreated) { + openKeyboardAfterSearchViewCreated = false; + searchView.post(new Runnable() { + @Override + public void run() { + searchView.requestFocus(); + AndroidUtils.requestKeyboardFocus(searchView); + } + }); + } - if (item.rightView != null) { - item.rightView.setPadding(0, 0, dp(16), 0); - wrapper.addView(item.rightView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); - } + return searchViewWrapper; + } else { + LinearLayout menu = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.toolbar_menu, null); + menu.setGravity(Gravity.CENTER_VERTICAL); - AndroidUtils.waitForMeasure(titleView, new AndroidUtils.OnMeasuredCallback() { - @Override - public boolean onMeasured(View view) { - if (item.middleMenu != null) { - item.middleMenu.setPopupWidth(Math.max(dp(200), titleView.getWidth())); - } - return false; + final TextView titleView = (TextView) menu.findViewById(R.id.title); + titleView.setTypeface(AndroidUtils.ROBOTO_MEDIUM); + titleView.setText(item.title); + // black: titleView.setTextColor(Color.argb((int)(0.87 * 255.0), 0, 0, 0)); + + if (item.middleMenu != null) { + item.middleMenu.setAnchor(titleView, Gravity.LEFT, dp(5), dp(5)); + + Drawable drawable = new DropdownArrowDrawable(); + titleView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null); + + titleView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + item.middleMenu.show(); + } + }); + } + + if (item.menu != null) { + menu.addView(item.menu, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); } - }); - return wrapper; + if (item.rightView != null) { + item.rightView.setPadding(0, 0, dp(16), 0); + menu.addView(item.rightView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); + } + + AndroidUtils.waitForMeasure(titleView, new AndroidUtils.OnMeasuredCallback() { + @Override + public boolean onMeasured(View view) { + if (item.middleMenu != null) { + item.middleMenu.setPopupWidth(Math.max(dp(200), titleView.getWidth())); + } + return false; + } + }); + + return menu; + } } private void animateArrow(boolean toArrow, long delay) {