persist search across device rotations
This commit is contained in:
		
							parent
							
								
									2505ac8b77
								
							
						
					
					
						commit
						303cc89b61
					
				|  | @ -63,6 +63,7 @@ import eu.siacs.conversations.ui.util.Color; | |||
| import eu.siacs.conversations.ui.util.DateSeparator; | ||||
| import eu.siacs.conversations.ui.util.Drawable; | ||||
| import eu.siacs.conversations.ui.util.ListViewUtils; | ||||
| import eu.siacs.conversations.ui.util.PendingItem; | ||||
| import eu.siacs.conversations.ui.util.ShareUtil; | ||||
| import eu.siacs.conversations.utils.FtsUtils; | ||||
| import eu.siacs.conversations.utils.MessageUtils; | ||||
|  | @ -72,15 +73,23 @@ import static eu.siacs.conversations.ui.util.SoftKeyboardUtils.showKeyboard; | |||
| 
 | ||||
| public class SearchActivity extends XmppActivity implements TextWatcher, OnSearchResultsAvailable, MessageAdapter.OnContactPictureClicked { | ||||
| 
 | ||||
| 	private static final String EXTRA_SEARCH_TERM = "search-term"; | ||||
| 
 | ||||
| 	private ActivitySearchBinding binding; | ||||
| 	private MessageAdapter messageListAdapter; | ||||
| 	private final List<Message> messages = new ArrayList<>(); | ||||
| 	private WeakReference<Message> selectedMessageReference = new WeakReference<>(null); | ||||
| 	private final ChangeWatcher<List<String>> currentSearch = new ChangeWatcher<>(); | ||||
| 	private final PendingItem<String> pendingSearchTerm = new PendingItem<>(); | ||||
| 	private final PendingItem<List<String>> pendingSearch = new PendingItem<>(); | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void onCreate(final Bundle savedInstanceState) { | ||||
| 		super.onCreate(savedInstanceState); | ||||
| 	public void onCreate(final Bundle bundle) { | ||||
| 		final String searchTerm = bundle == null ? null : bundle.getString(EXTRA_SEARCH_TERM); | ||||
| 		if (searchTerm != null) { | ||||
| 			pendingSearchTerm.push(searchTerm); | ||||
| 		} | ||||
| 		super.onCreate(bundle); | ||||
| 		this.binding = DataBindingUtil.setContentView(this, R.layout.activity_search); | ||||
| 		setSupportActionBar((Toolbar) this.binding.toolbar); | ||||
| 		configureActionBar(getSupportActionBar()); | ||||
|  | @ -93,8 +102,20 @@ public class SearchActivity extends XmppActivity implements TextWatcher, OnSearc | |||
| 	@Override | ||||
| 	public boolean onCreateOptionsMenu(final Menu menu) { | ||||
| 		getMenuInflater().inflate(R.menu.activity_search, menu); | ||||
| 		MenuItem searchActionMenuItem = menu.findItem(R.id.action_search); | ||||
| 		EditText searchField = searchActionMenuItem.getActionView().findViewById(R.id.search_field); | ||||
| 		final MenuItem searchActionMenuItem = menu.findItem(R.id.action_search); | ||||
| 		final EditText searchField = searchActionMenuItem.getActionView().findViewById(R.id.search_field); | ||||
| 		final String term = pendingSearchTerm.pop(); | ||||
| 		if (term != null) { | ||||
| 			searchField.append(term); | ||||
| 			List<String> searchTerm = FtsUtils.parse(term); | ||||
| 			if (xmppConnectionService != null) { | ||||
| 				if (currentSearch.watch(searchTerm)) { | ||||
| 					xmppConnectionService.search(searchTerm, this); | ||||
| 				} | ||||
| 			} else { | ||||
| 				pendingSearch.push(searchTerm); | ||||
| 			} | ||||
| 		} | ||||
| 		searchField.addTextChangedListener(this); | ||||
| 		searchField.setHint(R.string.search_messages); | ||||
| 		searchField.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); | ||||
|  | @ -153,6 +174,15 @@ public class SearchActivity extends XmppActivity implements TextWatcher, OnSearc | |||
| 		return super.onContextItemSelected(item); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void onSaveInstanceState(Bundle bundle) { | ||||
| 		List<String> term = currentSearch.get(); | ||||
| 		if (term != null && term.size() > 0) { | ||||
| 			bundle.putString(EXTRA_SEARCH_TERM,FtsUtils.toUserEnteredString(term)); | ||||
| 		} | ||||
| 		super.onSaveInstanceState(bundle); | ||||
| 	} | ||||
| 
 | ||||
| 	private void quote(Message message) { | ||||
| 		switchToConversationAndQuote(wrap(message.getConversation()), MessageUtils.prepareQuote(message)); | ||||
| 	} | ||||
|  | @ -176,7 +206,10 @@ public class SearchActivity extends XmppActivity implements TextWatcher, OnSearc | |||
| 
 | ||||
| 	@Override | ||||
| 	void onBackendConnected() { | ||||
| 
 | ||||
| 		final List<String> searchTerm = pendingSearch.pop(); | ||||
| 		if (searchTerm != null && currentSearch.watch(searchTerm)) { | ||||
| 			xmppConnectionService.search(searchTerm, this); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private void changeBackground(boolean hasSearch, boolean hasResults) { | ||||
|  |  | |||
|  | @ -44,4 +44,7 @@ public class ChangeWatcher<T> { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public T get() { | ||||
| 		return object; | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -109,4 +109,14 @@ public class FtsUtils { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public static String toUserEnteredString(List<String> term) { | ||||
| 		final StringBuilder builder = new StringBuilder(); | ||||
| 		for(String part : term) { | ||||
| 			if (builder.length() != 0) { | ||||
| 				builder.append(' '); | ||||
| 			} | ||||
| 			builder.append(part); | ||||
| 		} | ||||
| 		return builder.toString(); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ | |||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:focusable="true" | ||||
|         android:imeOptions="actionSearch" | ||||
|         android:imeOptions="flagNoExtractUi|actionSearch" | ||||
|         android:inputType="textEmailAddress|textNoSuggestions"/> | ||||
| 
 | ||||
| </RelativeLayout> | ||||
		Loading…
	
		Reference in New Issue
	
	 Daniel Gultsch
						Daniel Gultsch