/* * Copyright (C) 2015-present, osfans * waxaca@163.com https://github.com/osfans * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.osfans.trime; import android.content.Context; import android.content.SharedPreferences; import android.media.AudioManager; import android.os.Vibrator; import android.speech.tts.TextToSpeech; import android.view.KeyEvent; import java.util.Locale; /** 處理按鍵聲音、震動、朗讀等效果 */ class Effect { private static final int MAX_VOLUME = 101; //100%音量時只響一下,暫從100改成101 private int duration = 10; private long durationLong; private int volume = 100; private float volumeFloat; private final Context context; private boolean vibrateOn; private Vibrator vibrator; private boolean soundOn; private AudioManager audioManager; private boolean isSpeakCommit, isSpeakKey; private TextToSpeech mTTS; public Effect(Context context) { this.context = context; } public void reset() { SharedPreferences pref = Function.getPref(context); duration = pref.getInt("key_vibrate_duration", duration); durationLong = duration * 1L; vibrateOn = pref.getBoolean("key_vibrate", false) && (duration > 0); if (vibrateOn && (vibrator == null)) { vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); } volume = pref.getInt("key_sound_volume", volume); volumeFloat = (float) (1 - (Math.log(MAX_VOLUME - volume) / Math.log(MAX_VOLUME))); soundOn = pref.getBoolean("key_sound", false); if (soundOn && (audioManager == null)) { audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); } isSpeakCommit = pref.getBoolean("speak_commit", false); isSpeakKey = pref.getBoolean("speak_key", false); if (mTTS == null && (isSpeakCommit || isSpeakKey)) { mTTS = new TextToSpeech( context, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { //初始化結果 } }); } } public void vibrate() { if (vibrateOn && (vibrator != null)) vibrator.vibrate(durationLong); } public void playSound(final int code) { if (soundOn && (audioManager != null)) { final int sound; switch (code) { case KeyEvent.KEYCODE_DEL: sound = AudioManager.FX_KEYPRESS_DELETE; break; case KeyEvent.KEYCODE_ENTER: sound = AudioManager.FX_KEYPRESS_RETURN; break; case KeyEvent.KEYCODE_SPACE: sound = AudioManager.FX_KEYPRESS_SPACEBAR; break; default: sound = AudioManager.FX_KEYPRESS_STANDARD; break; } audioManager.playSoundEffect(sound, volumeFloat); } } public void setLanguage(Locale loc) { if (mTTS != null) mTTS.setLanguage(loc); } private void speak(CharSequence text) { if (text != null && mTTS != null) mTTS.speak(text.toString(), TextToSpeech.QUEUE_FLUSH, null); } public void speakCommit(CharSequence text) { if (isSpeakCommit) speak(text); } public void speakKey(CharSequence text) { if (isSpeakKey) speak(text); } public void speakKey(int code) { if (code <= 0) return; String text = KeyEvent.keyCodeToString(code) .replace("KEYCODE_", "") .replace("_", " ") .toLowerCase(Locale.getDefault()); speakKey(text); } public void destory() { if (mTTS != null) { mTTS.stop(); mTTS.shutdown(); mTTS = null; } } }