diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java index d3890c9c3..1ba256a4f 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.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 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); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomEditText.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomEditText.java index 3992c8b94..a3d63f990 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomEditText.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomEditText.java @@ -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(); + } } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java index dbf70b84b..f421c826e 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java @@ -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 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 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(); }