Adjust voice search

pull/102/head
FongMi 4 years ago
parent 3eae35a60e
commit 65400421cd
  1. 23
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java
  2. 19
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomEditText.java
  3. 26
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java

@ -1,9 +1,7 @@
package com.fongmi.android.tv.ui.activity;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Looper;
import android.text.Editable;
@ -11,9 +9,10 @@ import android.text.TextUtils;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.R;
@ -46,6 +45,13 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL
activity.startActivity(new Intent(activity, SearchActivity.class));
}
private final ActivityResultLauncher<String> launcher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), new ActivityResultCallback<>() {
@Override
public void onActivityResult(Boolean isGranted) {
if (isGranted) mBinding.mic.start();
}
});
@Override
protected ViewBinding getBinding() {
return mBinding = ActivitySearchBinding.inflate(getLayoutInflater());
@ -61,7 +67,6 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL
@Override
protected void initEvent() {
mBinding.mic.setOnClickListener(view -> onMic());
mBinding.keyword.setOnEditorActionListener((textView, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_DONE) onSearch();
return true;
@ -73,7 +78,7 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL
else getSuggest(s.toString());
}
});
mBinding.mic.setListener(new CustomListener() {
mBinding.mic.setListener(launcher, new CustomListener() {
@Override
public void onResults(String result) {
mBinding.mic.stop();
@ -114,14 +119,6 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL
});
}
public void onMic() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> mBinding.mic.start()).launch(Manifest.permission.RECORD_AUDIO);
} else {
mBinding.mic.start();
}
}
@Override
public void onItemClick(String text) {
mBinding.keyword.setText(text);

@ -1,28 +1,39 @@
package com.fongmi.android.tv.ui.custom;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.animation.Animation;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatEditText;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.ResUtil;
public class CustomEditText extends AppCompatEditText {
private Animation flicker;
public CustomEditText(@NonNull Context context) {
super(context);
}
public CustomEditText(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public CustomEditText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
flicker = ResUtil.getAnim(R.anim.flicker);
}
@Override
public boolean isFocused() {
return true;
}
@Override
protected void onFocusChanged(boolean gainFocus, int direction, @Nullable Rect previouslyFocusedRect) {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
if (gainFocus) startAnimation(flicker);
else clearAnimation();
}
}

@ -1,7 +1,9 @@
package com.fongmi.android.tv.ui.custom;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.speech.RecognizerIntent;
@ -10,9 +12,11 @@ import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.animation.Animation;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.content.ContextCompat;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.ResUtil;
@ -21,6 +25,7 @@ import com.github.bassaer.library.MDColor;
public class CustomMic extends AppCompatImageView {
private ActivityResultLauncher<String> launcher;
private SpeechRecognizer recognizer;
private Animation flicker;
private boolean listen;
@ -39,16 +44,26 @@ public class CustomMic extends AppCompatImageView {
recognizer = SpeechRecognizer.createSpeechRecognizer(context);
}
public boolean isListen() {
private boolean hasPermission() {
return ContextCompat.checkSelfPermission(getContext(), Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED;
}
private boolean isListen() {
return listen;
}
public void setListen(boolean listen) {
private void setListen(boolean listen) {
this.listen = listen;
}
public void setListener(CustomListener listener) {
recognizer.setRecognitionListener(listener);
public void setListener(ActivityResultLauncher<String> launcher, CustomListener listener) {
this.recognizer.setRecognitionListener(listener);
this.launcher = launcher;
}
private void check() {
if (hasPermission()) start();
else launcher.launch(Manifest.permission.RECORD_AUDIO);
}
public void start() {
@ -56,6 +71,7 @@ public class CustomMic extends AppCompatImageView {
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
setColorFilter(MDColor.RED_500, PorterDuff.Mode.SRC_IN);
recognizer.startListening(intent);
startAnimation(flicker);
setListen(true);
}
@ -70,7 +86,7 @@ public class CustomMic extends AppCompatImageView {
@Override
protected void onFocusChanged(boolean gainFocus, int direction, @Nullable Rect previouslyFocusedRect) {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
if (gainFocus) startAnimation(flicker);
if (gainFocus) check();
else stop();
}

Loading…
Cancel
Save