package com.erakk.lnreader.helper; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.erakk.lnreader.R; import com.erakk.lnreader.UI.activity.DisplayLightNovelContentActivity; import com.erakk.lnreader.UIHelper; import com.erakk.lnreader.service.TtsService; import com.erakk.lnreader.service.TtsService.TtsBinder; public class DisplayNovelContentTTSHelper { protected static final String TAG = DisplayNovelContentTTSHelper.class.toString(); private final DisplayLightNovelContentActivity callingCtx; private TtsBinder ttsBinder = null; private TtsService ttsService = null; public DisplayNovelContentTTSHelper(DisplayLightNovelContentActivity parent) { callingCtx = parent; } private TtsBinder getTtsBinder() { if (UIHelper.isTTSEnabled(callingCtx)) { int retry = 0; while (ttsBinder == null && retry < 3) { Log.i(TAG, "Trying to get TTS Binder: " + retry); if (ttsService == null || ttsBinder == null) { setupTtsService(); try{ ttsBinder.initConfig(); } catch (NullPointerException ex) { Log.i(TAG, "Failed to init TTS Binder, retrying..."); } break; } ++retry; } if (retry >= 3) Toast.makeText(callingCtx, "Failed to get TTS Service", Toast.LENGTH_SHORT).show(); } return ttsBinder; } public void stop() { if (getTtsBinder() != null) ttsBinder.stop(); } public void pause() { if (getTtsBinder() != null) ttsBinder.pause(); } public void start(NonLeakingWebView webView, int index) { if (getTtsBinder() != null) ttsBinder.start(webView, index); } public void start(String html, int index) { if (getTtsBinder() != null) ttsBinder.speak(html, index); } private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder binder) { ttsBinder = (TtsBinder) binder; ttsService = ttsBinder.getService(); Log.d(TAG, "TTS onServiceConnected"); ttsService.setOnCompleteListener(callingCtx); ttsService.setOnInitListener(callingCtx); } @Override public void onServiceDisconnected(ComponentName className) { ttsService = null; Log.d(TAG, "TTS onServiceDisconnected"); } }; public void setupTtsService() { Log.d(TAG, "Binding TTS Service"); Intent serviceIntent = new Intent(callingCtx, TtsService.class); callingCtx.bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE); } public void unbindTtsService() { if (mConnection != null && ttsService != null) { try { callingCtx.unbindService(mConnection); Log.i(TAG, "Unbind service done."); } catch (Exception ex) { Log.e(TAG, "Failed to unbind.", ex); } } } public void setupTTSMenu(Menu menu) { MenuItem menuSpeak = menu.findItem(R.id.menu_speak); MenuItem menuPause = menu.findItem(R.id.menu_pause_tts); if (ttsBinder != null && UIHelper.isTTSEnabled(callingCtx)) { menuSpeak.setEnabled(ttsBinder.IsTtsInitSuccess()); menuPause.setEnabled(!ttsBinder.isPaused()); } else { menuSpeak.setEnabled(false); menuPause.setEnabled(false); } } public void autoScroll(final NonLeakingWebView webView, final String index) { if (webView != null) { callingCtx.runOnUiThread(new Runnable() { @Override public void run() { if (true && webView != null && index != null) { Log.d(TAG, "Auto Scroll to: " + index); try { webView.loadUrl("javascript:goToParagraph(" + index + ", true)"); } catch (Exception ex) { Log.e(TAG, ex.getMessage(), ex); } } } }); } } }