allow tab completion in conferences
This commit is contained in:
parent
5a5e0e7121
commit
bbbc30e823
|
@ -37,6 +37,7 @@ import android.widget.Toast;
|
||||||
import net.java.otr4j.session.SessionStatus;
|
import net.java.otr4j.session.SessionStatus;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
@ -1226,6 +1227,48 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
|
||||||
updateSendButton();
|
updateSendButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int completionIndex = 0;
|
||||||
|
private int lastCompletionLength = 0;
|
||||||
|
private String incomplete;
|
||||||
|
private int lastCompletionCursor;
|
||||||
|
private boolean firstWord = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTabPressed(boolean repeated) {
|
||||||
|
if (conversation == null || conversation.getMode() == Conversation.MODE_SINGLE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (repeated) {
|
||||||
|
completionIndex++;
|
||||||
|
} else {
|
||||||
|
lastCompletionLength = 0;
|
||||||
|
completionIndex = 0;
|
||||||
|
final String content = mEditMessage.getText().toString();
|
||||||
|
lastCompletionCursor = mEditMessage.getSelectionEnd();
|
||||||
|
int start = lastCompletionCursor > 0 ? content.lastIndexOf(" ",lastCompletionCursor-1) + 1 : 0;
|
||||||
|
firstWord = start == 0;
|
||||||
|
incomplete = content.substring(start,lastCompletionCursor);
|
||||||
|
}
|
||||||
|
List<String> completions = new ArrayList<>();
|
||||||
|
for(MucOptions.User user : conversation.getMucOptions().getUsers()) {
|
||||||
|
if (user.getName().startsWith(incomplete)) {
|
||||||
|
completions.add(user.getName()+(firstWord ? ": " : " "));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Collections.sort(completions);
|
||||||
|
if (completions.size() > completionIndex) {
|
||||||
|
String completion = completions.get(completionIndex).substring(incomplete.length());
|
||||||
|
mEditMessage.getEditableText().delete(lastCompletionCursor,lastCompletionCursor + lastCompletionLength);
|
||||||
|
mEditMessage.getEditableText().insert(lastCompletionCursor, completion);
|
||||||
|
lastCompletionLength = completion.length();
|
||||||
|
} else {
|
||||||
|
completionIndex = -1;
|
||||||
|
mEditMessage.getEditableText().delete(lastCompletionCursor,lastCompletionCursor + lastCompletionLength);
|
||||||
|
lastCompletionLength = 0;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityResult(int requestCode, int resultCode,
|
public void onActivityResult(int requestCode, int resultCode,
|
||||||
final Intent data) {
|
final Intent data) {
|
||||||
|
|
|
@ -32,14 +32,24 @@ public class EditMessage extends EditText {
|
||||||
|
|
||||||
private boolean isUserTyping = false;
|
private boolean isUserTyping = false;
|
||||||
|
|
||||||
|
private boolean lastInputWasTab = false;
|
||||||
|
|
||||||
protected KeyboardListener keyboardListener;
|
protected KeyboardListener keyboardListener;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
||||||
if (keyCode == KeyEvent.KEYCODE_ENTER && !event.isShiftPressed()) {
|
if (keyCode == KeyEvent.KEYCODE_ENTER && !event.isShiftPressed()) {
|
||||||
|
lastInputWasTab = false;
|
||||||
if (keyboardListener != null && keyboardListener.onEnterPressed()) {
|
if (keyboardListener != null && keyboardListener.onEnterPressed()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
} else if (keyCode == KeyEvent.KEYCODE_TAB) {
|
||||||
|
if (keyboardListener != null && keyboardListener.onTabPressed(this.lastInputWasTab)) {
|
||||||
|
lastInputWasTab = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lastInputWasTab = false;
|
||||||
}
|
}
|
||||||
return super.onKeyDown(keyCode, event);
|
return super.onKeyDown(keyCode, event);
|
||||||
}
|
}
|
||||||
|
@ -47,6 +57,7 @@ public class EditMessage extends EditText {
|
||||||
@Override
|
@Override
|
||||||
public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
|
public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
|
||||||
super.onTextChanged(text,start,lengthBefore,lengthAfter);
|
super.onTextChanged(text,start,lengthBefore,lengthAfter);
|
||||||
|
lastInputWasTab = false;
|
||||||
if (this.mTypingHandler != null && this.keyboardListener != null) {
|
if (this.mTypingHandler != null && this.keyboardListener != null) {
|
||||||
this.mTypingHandler.removeCallbacks(mTypingTimeout);
|
this.mTypingHandler.removeCallbacks(mTypingTimeout);
|
||||||
this.mTypingHandler.postDelayed(mTypingTimeout, Config.TYPING_TIMEOUT * 1000);
|
this.mTypingHandler.postDelayed(mTypingTimeout, Config.TYPING_TIMEOUT * 1000);
|
||||||
|
@ -69,10 +80,11 @@ public class EditMessage extends EditText {
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface KeyboardListener {
|
public interface KeyboardListener {
|
||||||
public boolean onEnterPressed();
|
boolean onEnterPressed();
|
||||||
public void onTypingStarted();
|
void onTypingStarted();
|
||||||
public void onTypingStopped();
|
void onTypingStopped();
|
||||||
public void onTextDeleted();
|
void onTextDeleted();
|
||||||
|
boolean onTabPressed(boolean repeated);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue