abouttreesummaryrefslogcommitdiff
path: root/srcs/juloo.keyboard2/CandidatesView.java
diff options
context:
space:
mode:
authorJules Aguillon2025-07-27 22:09:45 +0200
committerJules Aguillon2025-12-28 17:56:37 +0100
commit98c1b8db82c0da8f49eb12d18c9001a57009eca5 (patch)
treefaddcbd29f19cb5c526f0a37c078ec11fc901c85 /srcs/juloo.keyboard2/CandidatesView.java
parentdfaf4dbb5766bf134cbf97d0516493e2256d2e5a (diff)
downloadunexpected-keyboard-98c1b8db82c0da8f49eb12d18c9001a57009eca5.tar.gz
unexpected-keyboard-98c1b8db82c0da8f49eb12d18c9001a57009eca5.zip
Candidates view
The `CandidatesView` is implemented as a `LinearLayout` that is divided horizontally with up to 3 `TextView`. It might in the future contain buttons on the sides. The candidate view is nested into the input view rather than using Android's `setCandidatesView` and callbacks as the API is unreliable and complicated. The first suggestion goes in the middle to be more accessible. The second suggestion goes on the right to be more accessible to the right-handed, because it must go somewhere.
Diffstat (limited to 'srcs/juloo.keyboard2/CandidatesView.java')
-rw-r--r--srcs/juloo.keyboard2/CandidatesView.java104
1 files changed, 104 insertions, 0 deletions
diff --git a/srcs/juloo.keyboard2/CandidatesView.java b/srcs/juloo.keyboard2/CandidatesView.java
new file mode 100644
index 0000000..232ed23
--- /dev/null
+++ b/srcs/juloo.keyboard2/CandidatesView.java
@@ -0,0 +1,104 @@
+package juloo.keyboard2;
+
+import android.content.Context;
+import android.text.InputType;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CandidatesView extends LinearLayout
+{
+ static final int NUM_CANDIDATES = 3;
+
+ Config _config;
+
+ /** Candidates currently visible. Entries can be [null] when there are less
+ than [NUM_CANDIDATES] suggestions. */
+ String[] _items = new String[NUM_CANDIDATES];
+
+ /** Text views showing the candidates in [_items]. Text views visibility is
+ set to [GONE] when there are less than [NUM_CANDIDATES] suggestions. */
+ TextView[] _item_views = new TextView[NUM_CANDIDATES];
+
+ public CandidatesView(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ _config = Config.globalConfig();
+ }
+
+ @Override
+ protected void onFinishInflate()
+ {
+ super.onFinishInflate();
+ setup_item_view(0, R.id.candidates_middle);
+ setup_item_view(1, R.id.candidates_right);
+ setup_item_view(2, R.id.candidates_left);
+ }
+
+ public void set_candidates(List<String> suggestions)
+ {
+ int s_count = suggestions.size();
+ for (int i = 0; i < _item_views.length; i++)
+ {
+ TextView v = _item_views[i];
+ if (i < s_count)
+ {
+ String it = suggestions.get(i);
+ _items[i] = it;
+ v.setText(it);
+ v.setVisibility(View.VISIBLE);
+ }
+ else
+ {
+ _items[i] = null;
+ v.setVisibility(View.GONE);
+ }
+ }
+ }
+
+ private void setup_item_view(final int item_index, int item_id)
+ {
+ TextView v = (TextView)findViewById(item_id);
+ v.setOnClickListener(new View.OnClickListener()
+ {
+ @Override
+ public void onClick(View _v)
+ {
+ String it = _items[item_index];
+ if (it != null)
+ _config.handler.suggestion_entered(it);
+ }
+ });
+ v.setVisibility(View.GONE);
+ _item_views[item_index] = v;
+ }
+
+ public static boolean should_show(EditorInfo info)
+ {
+ int variation = info.inputType & InputType.TYPE_MASK_VARIATION;
+ int flags = info.inputType & InputType.TYPE_MASK_FLAGS;
+ switch (info.inputType & InputType.TYPE_MASK_CLASS)
+ {
+ case InputType.TYPE_CLASS_TEXT:
+ switch (variation)
+ {
+ case InputType.TYPE_TEXT_VARIATION_PASSWORD:
+ case InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD:
+ case InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD:
+ return false;
+ default:
+ if ((flags & InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS) != 0)
+ return false; // Editor requested that we don't show suggestions
+ return true;
+ }
+ case InputType.TYPE_CLASS_NUMBER:
+ // Beware of TYPE_NUMBER_VARIATION_PASSWORD
+ return false;
+ default: return false;
+ }
+ }
+}