That fuck shit the fascists are using
at master 154 lines 4.3 kB view raw
1package org.tm.archive.components; 2 3 4import android.animation.Animator; 5import android.content.Context; 6import android.graphics.drawable.Drawable; 7import android.os.Build; 8import android.util.AttributeSet; 9import android.view.MenuItem; 10import android.view.View; 11import android.view.ViewAnimationUtils; 12import android.widget.EditText; 13import android.widget.LinearLayout; 14 15import androidx.annotation.MainThread; 16import androidx.annotation.Nullable; 17import androidx.appcompat.widget.SearchView; 18import androidx.appcompat.widget.Toolbar; 19import androidx.core.content.ContextCompat; 20 21import org.tm.archive.R; 22import org.tm.archive.animation.AnimationCompleteListener; 23import org.tm.archive.util.EditTextExtensionsKt; 24import org.tm.archive.util.TextSecurePreferences; 25 26public class SearchToolbar extends LinearLayout { 27 28 private float x, y; 29 private MenuItem searchItem; 30 private SearchListener listener; 31 32 public SearchToolbar(Context context) { 33 super(context); 34 initialize(); 35 } 36 37 public SearchToolbar(Context context, @Nullable AttributeSet attrs) { 38 super(context, attrs); 39 initialize(); 40 } 41 42 public SearchToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 43 super(context, attrs, defStyleAttr); 44 initialize(); 45 } 46 47 private void initialize() { 48 inflate(getContext(), R.layout.search_toolbar, this); 49 setOrientation(VERTICAL); 50 51 Toolbar toolbar = findViewById(R.id.toolbar); 52 53 Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_arrow_left_24); 54 toolbar.setNavigationIcon(drawable); 55 toolbar.setCollapseIcon(drawable); 56 toolbar.inflateMenu(R.menu.conversation_list_search); 57 58 this.searchItem = toolbar.getMenu().findItem(R.id.action_filter_search); 59 SearchView searchView = (SearchView) searchItem.getActionView(); 60 EditText searchText = searchView.findViewById(R.id.search_src_text); 61 62 EditTextExtensionsKt.setIncognitoKeyboardEnabled(searchText, TextSecurePreferences.isIncognitoKeyboardEnabled(getContext())); 63 64 searchView.setSubmitButtonEnabled(false); 65 searchView.setMaxWidth(Integer.MAX_VALUE); 66 67 if (searchText != null) searchText.setHint(R.string.SearchToolbar_search); 68 else searchView.setQueryHint(getResources().getString(R.string.SearchToolbar_search)); 69 70 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 71 @Override 72 public boolean onQueryTextSubmit(String query) { 73 if (listener != null) { 74 listener.onSearchTextChange(query); 75 } 76 return true; 77 } 78 79 @Override 80 public boolean onQueryTextChange(String newText) { 81 return onQueryTextSubmit(newText); 82 } 83 }); 84 85 searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { 86 @Override 87 public boolean onMenuItemActionExpand(MenuItem item) { 88 return true; 89 } 90 91 @Override 92 public boolean onMenuItemActionCollapse(MenuItem item) { 93 hide(); 94 return true; 95 } 96 }); 97 98 toolbar.setNavigationOnClickListener(v -> hide()); 99 } 100 101 @MainThread 102 public void display(float x, float y) { 103 if (getVisibility() != View.VISIBLE) { 104 this.x = x; 105 this.y = y; 106 107 searchItem.expandActionView(); 108 109 Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, 0, getWidth()); 110 animator.setDuration(400); 111 112 setVisibility(View.VISIBLE); 113 animator.start(); 114 } 115 } 116 117 public void collapse() { 118 searchItem.collapseActionView(); 119 } 120 121 @MainThread 122 private void hide() { 123 if (getVisibility() == View.VISIBLE) { 124 125 126 if (listener != null) listener.onSearchClosed(); 127 128 Animator animator = ViewAnimationUtils.createCircularReveal(this, (int)x, (int)y, getWidth(), 0); 129 animator.setDuration(400); 130 animator.addListener(new AnimationCompleteListener() { 131 @Override 132 public void onAnimationEnd(Animator animation) { 133 setVisibility(View.INVISIBLE); 134 } 135 }); 136 animator.start(); 137 } 138 } 139 140 public boolean isVisible() { 141 return getVisibility() == View.VISIBLE; 142 } 143 144 @MainThread 145 public void setListener(SearchListener listener) { 146 this.listener = listener; 147 } 148 149 public interface SearchListener { 150 void onSearchTextChange(String text); 151 void onSearchClosed(); 152 } 153 154}