|
|
|
|
@ -6,15 +6,11 @@ import android.content.Intent; |
|
|
|
|
import android.content.pm.PackageManager; |
|
|
|
|
import android.os.Handler; |
|
|
|
|
import android.os.Looper; |
|
|
|
|
import android.speech.RecognizerIntent; |
|
|
|
|
import android.speech.SpeechRecognizer; |
|
|
|
|
import android.text.Editable; |
|
|
|
|
import android.text.TextUtils; |
|
|
|
|
import android.view.View; |
|
|
|
|
import android.view.animation.Animation; |
|
|
|
|
import android.view.inputmethod.EditorInfo; |
|
|
|
|
|
|
|
|
|
import androidx.activity.result.ActivityResultLauncher; |
|
|
|
|
import androidx.activity.result.contract.ActivityResultContracts; |
|
|
|
|
import androidx.annotation.NonNull; |
|
|
|
|
import androidx.core.content.ContextCompat; |
|
|
|
|
@ -31,7 +27,6 @@ import com.fongmi.android.tv.ui.adapter.WordAdapter; |
|
|
|
|
import com.fongmi.android.tv.ui.custom.CustomKeyboard; |
|
|
|
|
import com.fongmi.android.tv.ui.custom.CustomListener; |
|
|
|
|
import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; |
|
|
|
|
import com.fongmi.android.tv.utils.ResUtil; |
|
|
|
|
import com.fongmi.android.tv.utils.Utils; |
|
|
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
|
@ -42,13 +37,9 @@ import okhttp3.Response; |
|
|
|
|
|
|
|
|
|
public class SearchActivity extends BaseActivity implements WordAdapter.OnClickListener, HistoryAdapter.OnClickListener, CustomKeyboard.Callback { |
|
|
|
|
|
|
|
|
|
private final ActivityResultLauncher<String> launcher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> startListening()); |
|
|
|
|
|
|
|
|
|
private ActivitySearchBinding mBinding; |
|
|
|
|
private SpeechRecognizer mRecognizer; |
|
|
|
|
private HistoryAdapter mHistoryAdapter; |
|
|
|
|
private WordAdapter mWordAdapter; |
|
|
|
|
private Animation mFlicker; |
|
|
|
|
private Handler mHandler; |
|
|
|
|
|
|
|
|
|
public static void start(Activity activity) { |
|
|
|
|
@ -62,9 +53,7 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
protected void initView() { |
|
|
|
|
mFlicker = ResUtil.getAnim(R.anim.flicker); |
|
|
|
|
mHandler = new Handler(Looper.getMainLooper()); |
|
|
|
|
mRecognizer = SpeechRecognizer.createSpeechRecognizer(this); |
|
|
|
|
CustomKeyboard.init(this, mBinding); |
|
|
|
|
setRecyclerView(); |
|
|
|
|
getHot(); |
|
|
|
|
@ -72,6 +61,7 @@ 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; |
|
|
|
|
@ -83,10 +73,10 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL |
|
|
|
|
else getSuggest(s.toString()); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
mRecognizer.setRecognitionListener(new CustomListener() { |
|
|
|
|
mBinding.mic.setListener(new CustomListener() { |
|
|
|
|
@Override |
|
|
|
|
public void onResults(String result) { |
|
|
|
|
stopListening(); |
|
|
|
|
mBinding.mic.stop(); |
|
|
|
|
mBinding.keyword.setText(result); |
|
|
|
|
mBinding.keyword.setSelection(mBinding.keyword.length()); |
|
|
|
|
} |
|
|
|
|
@ -124,6 +114,14 @@ 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); |
|
|
|
|
@ -150,56 +148,9 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL |
|
|
|
|
PushActivity.start(this); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onVoice() { |
|
|
|
|
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { |
|
|
|
|
launcher.launch(Manifest.permission.RECORD_AUDIO); |
|
|
|
|
} else { |
|
|
|
|
startListening(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void startListening() { |
|
|
|
|
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); |
|
|
|
|
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); |
|
|
|
|
mBinding.keyboard.setVisibility(View.INVISIBLE); |
|
|
|
|
mBinding.voice.setVisibility(View.VISIBLE); |
|
|
|
|
mBinding.voice.startAnimation(mFlicker); |
|
|
|
|
mRecognizer.startListening(intent); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void stopListening() { |
|
|
|
|
mBinding.keyboard.setVisibility(View.VISIBLE); |
|
|
|
|
mBinding.voice.setVisibility(View.GONE); |
|
|
|
|
mBinding.voice.clearAnimation(); |
|
|
|
|
mRecognizer.stopListening(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void destroyRecognizer() { |
|
|
|
|
try { |
|
|
|
|
mRecognizer.destroy(); |
|
|
|
|
} catch (Exception ignored) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
protected void onResume() { |
|
|
|
|
super.onResume(); |
|
|
|
|
mBinding.keyword.requestFocus(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void onBackPressed() { |
|
|
|
|
if (mBinding.voice.getVisibility() == View.VISIBLE) { |
|
|
|
|
stopListening(); |
|
|
|
|
} else { |
|
|
|
|
super.onBackPressed(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
protected void onDestroy() { |
|
|
|
|
super.onDestroy(); |
|
|
|
|
destroyRecognizer(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|