diff --git a/samples/AutofillKeyboard/Android.bp b/samples/AutofillKeyboard/Android.bp index 5c6a56115..273dbd2f4 100644 --- a/samples/AutofillKeyboard/Android.bp +++ b/samples/AutofillKeyboard/Android.bp @@ -6,5 +6,6 @@ android_app { sdk_version: "current", static_libs: [ "androidx.annotation_annotation", + "android-support-annotations", ], } diff --git a/samples/AutofillKeyboard/res/layout/keyboard_10_9_9.xml b/samples/AutofillKeyboard/res/layout/keyboard_10_9_9.xml index 3f64b897b..846de355d 100644 --- a/samples/AutofillKeyboard/res/layout/keyboard_10_9_9.xml +++ b/samples/AutofillKeyboard/res/layout/keyboard_10_9_9.xml @@ -22,7 +22,10 @@ xmlns:android="http://schemas.android.com/apk/res/android" style="@style/KeyboardArea"> - + + mSuggestionViews = new ArrayList<>(); + @GuardedBy("this") + private List mSuggestionViewSizes = new ArrayList<>(); + @GuardedBy("this") + private boolean mSuggestionViewVisible = false; + + @Override + public InlineSuggestionsRequest onCreateInlineSuggestionsRequest() { + Log.d(TAG, "onCreateInlineSuggestionsRequest() called"); + final ArrayList presentationSpecs = new ArrayList<>(); + presentationSpecs.add(new InlinePresentationSpec.Builder(new Size(100, 100), + new Size(400, 100)).build()); + presentationSpecs.add(new InlinePresentationSpec.Builder(new Size(100, 100), + new Size(400, 100)).build()); + + return new InlineSuggestionsRequest.Builder(presentationSpecs) + .setMaxSuggestionCount(2) + .build(); + } + + @Override + public boolean onInlineSuggestionsResponse(InlineSuggestionsResponse response) { + Log.d(TAG, "onInlineSuggestionsResponse() called"); + AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> { + onInlineSuggestionsResponseInternal(response); + }); + return true; + } + + private synchronized void updateInlineSuggestionVisibility(boolean visible, boolean force) { + Log.d(TAG, "updateInlineSuggestionVisibility() called, visible=" + visible + ", force=" + + force); + mMainHandler.post(() -> { + Log.d(TAG, "updateInlineSuggestionVisibility() running"); + if (visible == mSuggestionViewVisible && !force) { + return; + } else if (visible) { + mSuggestionStrip.removeAllViews(); + final int size = mSuggestionViews.size(); + for (int i = 0; i < size; i++) { + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( + mSuggestionViewSizes.get(i).getWidth(), + mSuggestionViewSizes.get(i).getHeight()); + mSuggestionStrip.addView(mSuggestionViews.get(i), layoutParams); + } + mSuggestionViewVisible = true; + } else { + mSuggestionStrip.removeAllViews(); + mSuggestionViewVisible = false; + } + }); + } + + private synchronized void updateSuggestionViews(View[] suggestionViews, Size[] sizes) { + Log.d(TAG, "updateSuggestionViews() called"); + mSuggestionViews = Arrays.asList(suggestionViews); + mSuggestionViewSizes = Arrays.asList(sizes); + updateInlineSuggestionVisibility(true, true); + } + + private void onInlineSuggestionsResponseInternal(InlineSuggestionsResponse response) { + Log.d(TAG, "onInlineSuggestionsResponseInternal() called. Suggestion=" + + response.getInlineSuggestions().size()); + + final List inlineSuggestions = response.getInlineSuggestions(); + final int totalSuggestionsCount = inlineSuggestions.size(); + final AtomicInteger suggestionsCount = new AtomicInteger(totalSuggestionsCount); + final View[] suggestionViews = new View[totalSuggestionsCount]; + final Size[] sizes = new Size[totalSuggestionsCount]; + + for (int i=0; i { + Log.d(TAG, "new inline suggestion view ready"); + suggestionViews[index] = suggestionView; + sizes[index] = size; + suggestionView.setOnTouchListener((v, event) -> { + Toast.makeText(AutofillImeService.this, "hello", + Toast.LENGTH_LONG).show(); + return false; + }); + if (suggestionsCount.decrementAndGet() == 0) { + updateSuggestionViews(suggestionViews, sizes); + } + }); + } + } + void handle(String data) { + Log.d(TAG, "handle() called: [" + data + "]"); mDecoder.decode(data); + updateInlineSuggestionVisibility(mDecoder.isEmpty(), false); } } diff --git a/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Decoder.java b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Decoder.java index ffdda8503..923960285 100644 --- a/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Decoder.java +++ b/samples/AutofillKeyboard/src/com/example/android/autofillkeyboard/Decoder.java @@ -41,4 +41,12 @@ final class Decoder { mInputConnection.commitText(data, 1); } } + + boolean isEmpty() { + if (mInputConnection.getTextBeforeCursor(1, 0).length() == 0 + && mInputConnection.getTextAfterCursor(1, 0).length() == 0) { + return true; + } + return false; + } }