From f4369b29ae0d4d3ad562ce6695af6aca8f7416ea Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 12 May 2016 18:49:54 +0200 Subject: improve keyboard handling. fixes #1387 * start a new Conversations by pressing mod+space * automatically start searching when pressing keys in StartConversationsActivity * when hitting enter when number of search results == 1 open that conversation --- .../conversations/ui/ConversationActivity.java | 3 ++ .../ui/StartConversationActivity.java | 53 +++++++++++++++++++--- src/main/res/layout/actionview_search.xml | 1 + 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index eb9ccb6b..c7fa2d28 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -953,6 +953,9 @@ public class ConversationActivity extends XmppActivity if (modifier && key == KeyEvent.KEYCODE_TAB && isConversationsOverviewHideable()) { toggleConversationsOverview(); return true; + } else if (modifier && key == KeyEvent.KEYCODE_SPACE) { + startActivity(new Intent(this, StartConversationActivity.class)); + return true; } else if (modifier && key == downKey) { if (isConversationsOverviewHideable() && !isConversationsOverviewVisable()) { showConversationsOverview(); diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java index 78c05e41..3ab6d1d2 100644 --- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java @@ -91,7 +91,6 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU private List mKnownHosts; private List mKnownConferenceHosts; private Invite mPendingInvite = null; - private Menu mOptionsMenu; private EditText mSearchEditText; private AtomicBoolean mRequestedContactsPermission = new AtomicBoolean(false); private final int REQUEST_SYNC_CONTACTS = 0x3b28cf; @@ -116,9 +115,7 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU @Override public boolean onMenuItemActionCollapse(MenuItem item) { - InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(mSearchEditText.getWindowToken(), - InputMethodManager.HIDE_IMPLICIT_ONLY); + hideKeyboard(); mSearchEditText.setText(""); filter(null); return true; @@ -169,6 +166,28 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU int count) { } }; + + private TextView.OnEditorActionListener mSearchDone = new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (getActionBar().getSelectedNavigationIndex() == 0) { + if (contacts.size() == 1) { + openConversationForContact((Contact) contacts.get(0)); + } else { + hideKeyboard(); + mContactsListFragment.getListView().requestFocus(); + } + } else { + if (conferences.size() == 1) { + openConversationsForBookmark((Bookmark) conferences.get(0)); + } else { + hideKeyboard(); + mConferenceListFragment.getListView().requestFocus(); + } + } + return true; + } + }; private MenuItem mMenuSearchView; private ListItemAdapter.OnTagClickedListener mOnTagClickedListener = new ListItemAdapter.OnTagClickedListener() { @Override @@ -260,6 +279,10 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU protected void openConversationForContact(int position) { Contact contact = (Contact) contacts.get(position); + openConversationForContact(contact); + } + + protected void openConversationForContact(Contact contact) { Conversation conversation = xmppConnectionService .findOrCreateConversation(contact.getAccount(), contact.getJid(), false); @@ -277,6 +300,10 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU protected void openConversationForBookmark(int position) { Bookmark bookmark = (Bookmark) conferences.get(position); + openConversationsForBookmark(bookmark); + } + + protected void openConversationsForBookmark(Bookmark bookmark) { Jid jid = bookmark.getJid(); if (jid == null) { Toast.makeText(this,R.string.invalid_jid,Toast.LENGTH_SHORT).show(); @@ -503,7 +530,6 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU @Override public boolean onCreateOptionsMenu(Menu menu) { - this.mOptionsMenu = menu; getMenuInflater().inflate(R.menu.start_conversation, menu); MenuItem menuCreateContact = menu.findItem(R.id.action_create_contact); MenuItem menuCreateConference = menu.findItem(R.id.action_join_conference); @@ -515,6 +541,7 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU mSearchEditText = (EditText) mSearchView .findViewById(R.id.search_field); mSearchEditText.addTextChangedListener(mSearchTextWatcher); + mSearchEditText.setOnEditorActionListener(mSearchDone); if (getActionBar().getSelectedNavigationIndex() == 0) { menuCreateConference.setVisible(false); } else { @@ -554,12 +581,26 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_SEARCH && !event.isLongPress()) { - mOptionsMenu.findItem(R.id.action_search).expandActionView(); + openSearch(); return true; } + int c = event.getUnicodeChar(); + if (c > 32) { + if (mSearchEditText != null && !mSearchEditText.isFocused()) { + openSearch(); + mSearchEditText.append(Character.toString((char) c)); + return true; + } + } return super.onKeyUp(keyCode, event); } + private void openSearch() { + if (mMenuSearchView != null) { + mMenuSearchView.expandActionView(); + } + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if ((requestCode & 0xFFFF) == IntentIntegrator.REQUEST_CODE) { diff --git a/src/main/res/layout/actionview_search.xml b/src/main/res/layout/actionview_search.xml index 8b657f4a..50becfc6 100644 --- a/src/main/res/layout/actionview_search.xml +++ b/src/main/res/layout/actionview_search.xml @@ -14,6 +14,7 @@ android:layout_height="wrap_content" android:focusable="true" android:inputType="textEmailAddress|textNoSuggestions" + android:imeOptions="actionSearch" android:textColor="@color/white" android:textColorHint="@color/white70" android:hint="@string/search_for_contacts_or_groups"/> -- cgit v1.2.3