22
22
import android .os .Bundle ;
23
23
import android .os .Environment ;
24
24
import android .os .Handler ;
25
+ import android .speech .tts .TextToSpeech ;
25
26
import android .support .design .widget .NavigationView ;
26
27
import android .support .v4 .app .ActivityCompat ;
27
28
import android .support .v4 .app .Fragment ;
105
106
import com .google .gson .GsonBuilder ;
106
107
import com .splunk .mint .Mint ;
107
108
109
+ import org .honorato .multistatetogglebutton .MultiStateToggleButton ;
110
+ import org .honorato .multistatetogglebutton .ToggleButton ;
111
+
108
112
import java .io .BufferedReader ;
109
113
import java .io .ByteArrayInputStream ;
110
114
import java .io .File ;
115
119
import java .io .Writer ;
116
120
import java .net .SocketTimeoutException ;
117
121
import java .util .ArrayList ;
122
+ import java .util .Collections ;
118
123
import java .util .Date ;
119
124
import java .util .HashMap ;
120
125
import java .util .List ;
126
131
127
132
public class MainActivity extends AppCompatActivity
128
133
implements VoiceControlForPlexApplication .NetworkChangeListener ,
129
- ActivityListener {
134
+ ActivityListener ,
135
+ TextToSpeech .OnInitListener {
130
136
131
137
public final static int RESULT_VOICE_FEEDBACK_SELECTED = 0 ;
132
138
public final static int RESULT_TASKER_PROJECT_IMPORTED = 1 ;
@@ -140,6 +146,10 @@ public class MainActivity extends AppCompatActivity
140
146
141
147
public final static String BUGSENSE_APIKEY = "879458d0" ;
142
148
149
+ private ArrayList <String > availableVoices ;
150
+ private boolean settingErrorFeedback = false ;
151
+ private TextToSpeech tts ;
152
+
143
153
private DrawerLayout mDrawer ;
144
154
private Toolbar toolbar ;
145
155
private NavigationView navigationViewMain ;
@@ -542,7 +552,20 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
542
552
Logger .d ("onActivityResult: %d, %d" , requestCode , resultCode );
543
553
// Pass on the activity result to the helper for handling
544
554
if (VoiceControlForPlexApplication .getInstance ().getIabHelper () == null || !VoiceControlForPlexApplication .getInstance ().getIabHelper ().handleActivityResult (requestCode , resultCode , data )) {
545
- if (requestCode == RESULT_SHORTCUT_CREATED ) {
555
+ if (requestCode == RESULT_VOICE_FEEDBACK_SELECTED ) {
556
+ if (resultCode == TextToSpeech .Engine .CHECK_VOICE_DATA_PASS ) {
557
+ // success, create the TTS instance
558
+ availableVoices = data .getStringArrayListExtra (TextToSpeech .Engine .EXTRA_AVAILABLE_VOICES );
559
+ Collections .sort (availableVoices );
560
+ // Need this or else voice selection won't show up:
561
+ tts = new TextToSpeech (this , this );
562
+ } else {
563
+ // missing data, install it
564
+ Intent installIntent = new Intent ();
565
+ installIntent .setAction (TextToSpeech .Engine .ACTION_INSTALL_TTS_DATA );
566
+ startActivity (installIntent );
567
+ }
568
+ } else if (requestCode == RESULT_SHORTCUT_CREATED ) {
546
569
if (resultCode == RESULT_OK ) {
547
570
data .setAction ("com.android.launcher.action.INSTALL_SHORTCUT" );
548
571
sendBroadcast (data );
@@ -890,7 +913,7 @@ protected void onNewIntent(Intent intent) {
890
913
setServer (PlexServer .getScanAllServer ());
891
914
}
892
915
prefs .put (Preferences .SAVED_SERVERS , gsonWrite .toJson (VoiceControlForPlexApplication .servers ));
893
- Logger .d ("doing first time setup: %s" , doingFirstTimeSetup );
916
+ Logger .d ("doing first time setup: %s, client scan finished: %s " , doingFirstTimeSetup , firstTimeSetupClientScanFinished );
894
917
if (doingFirstTimeSetup ) {
895
918
firstTimeSetupServerScanFinished = true ;
896
919
if (firstTimeSetupClientScanFinished )
@@ -913,16 +936,17 @@ protected void onNewIntent(Intent intent) {
913
936
}
914
937
}
915
938
prefs .put (Preferences .SAVED_CLIENTS , gsonWrite .toJson (VoiceControlForPlexApplication .clients ));
916
- if ( doingFirstTimeSetup ) {
917
- firstTimeSetupClientScanFinished = true ;
918
- if ( firstTimeSetupServerScanFinished )
919
- onFirstTimeScanFinished ();
920
- }
939
+ }
940
+ if ( doingFirstTimeSetup ) {
941
+ firstTimeSetupClientScanFinished = true ;
942
+ if ( firstTimeSetupServerScanFinished )
943
+ onFirstTimeScanFinished ();
921
944
}
922
945
if (onClientRefreshFinished != null ) {
923
946
onClientRefreshFinished .run ();
924
947
}
925
948
949
+
926
950
} else if (intent .getAction ().equals (ACTION_SHOW_NOW_PLAYING )) {
927
951
handleShowNowPlayingIntent (intent );
928
952
} else if (intent .getAction () != null && intent .getAction ().equals (com .atomjack .shared .Intent .SHOW_WEAR_PURCHASE )) {
@@ -959,6 +983,7 @@ else if(castPlayerManager.isSubscribed())
959
983
960
984
// This is called after first time setup client & server scan is done.
961
985
private void onFirstTimeScanFinished () {
986
+ Logger .d ("first time scan finished" );
962
987
doingFirstTimeSetup = false ;
963
988
prefs .put (Preferences .FIRST_TIME_SETUP_COMPLETED , true );
964
989
if (alertDialog != null )
@@ -1540,6 +1565,54 @@ public void donate(MenuItem item) {
1540
1565
startActivity (intent );
1541
1566
}
1542
1567
1568
+ public void setFeedback (MenuItem item ) {
1569
+ AlertDialog .Builder builder = new AlertDialog .Builder (this );
1570
+ View view = getLayoutInflater ().inflate (R .layout .popup_feedback , null );
1571
+ builder .setView (view );
1572
+ final AlertDialog dialog = builder .create ();
1573
+ MultiStateToggleButton feedbackToggleButton = (MultiStateToggleButton )view .findViewById (R .id .feedbackToggleButton );
1574
+ boolean [] v = new boolean [2 ];
1575
+ v [prefs .get (Preferences .FEEDBACK , 1 ) == 0 ? 0 : 1 ] = true ;
1576
+ feedbackToggleButton .setStates (v );
1577
+ feedbackToggleButton .setOnValueChangedListener (new ToggleButton .OnValueChangedListener () {
1578
+ @ Override
1579
+ public void onValueChanged (int value ) {
1580
+ prefs .put (Preferences .FEEDBACK , value );
1581
+ if (value == 0 ) {
1582
+ onVoiceFeedbackSelected (false );
1583
+ }
1584
+ }
1585
+ });
1586
+ MultiStateToggleButton errorsToggleButton = (MultiStateToggleButton )view .findViewById (R .id .errorsToggleButton );
1587
+ v = new boolean [2 ];
1588
+ v [prefs .get (Preferences .ERRORS , 1 ) == 0 ? 0 : 1 ] = true ;
1589
+ errorsToggleButton .setStates (v );
1590
+ errorsToggleButton .setOnValueChangedListener (new ToggleButton .OnValueChangedListener () {
1591
+ @ Override
1592
+ public void onValueChanged (int value ) {
1593
+ prefs .put (Preferences .ERRORS , value );
1594
+ if (value == 0 ) {
1595
+ onVoiceFeedbackSelected (true );
1596
+ }
1597
+ }
1598
+ });
1599
+ dialog .show ();
1600
+ }
1601
+
1602
+ private void onVoiceFeedbackSelected (boolean errors ) {
1603
+ Intent checkIntent = new Intent ();
1604
+ checkIntent .setAction (TextToSpeech .Engine .ACTION_CHECK_TTS_DATA );
1605
+ tts = new TextToSpeech (this , new TextToSpeech .OnInitListener () {
1606
+ @ Override
1607
+ public void onInit (int i ) {}
1608
+ });
1609
+ String engine = tts .getDefaultEngine ();
1610
+ if (engine != null )
1611
+ checkIntent .setPackage (engine );
1612
+ settingErrorFeedback = errors ;
1613
+ startActivityForResult (checkIntent , RESULT_VOICE_FEEDBACK_SELECTED );
1614
+ }
1615
+
1543
1616
public void installTasker (MenuItem item ) {
1544
1617
openAppInPlayStore ("net.dinglisch.android.taskerm" );
1545
1618
}
@@ -2237,5 +2310,51 @@ public void onSuccess(Bitmap bitmap) {
2237
2310
}
2238
2311
}
2239
2312
2313
+ @ Override
2314
+ public void onInit (int status ) {
2315
+ if (status == TextToSpeech .SUCCESS ) {
2316
+ final String pref = settingErrorFeedback ? Preferences .ERRORS_VOICE : Preferences .FEEDBACK_VOICE ;
2317
+ if (availableVoices != null ) {
2318
+ AlertDialog .Builder adb = new AlertDialog .Builder (this );
2319
+ View view = getLayoutInflater ().inflate (R .layout .popup_language_selector , null );
2320
+ adb .setView (view );
2321
+ final CharSequence items [] = availableVoices .toArray (new CharSequence [availableVoices .size ()]);
2322
+ int selectedVoice = -1 ;
2323
+ String v = VoiceControlForPlexApplication .getInstance ().prefs .get (pref , "Locale.US" );
2324
+ if (availableVoices .indexOf (v ) > -1 )
2325
+ selectedVoice = availableVoices .indexOf (v );
2326
+
2327
+ final AlertDialog dialog = adb .create ();
2328
+ Button languageSelectorCancelButton = (Button )view .findViewById (R .id .languageSelectorCancelButton );
2329
+ languageSelectorCancelButton .setOnClickListener (new View .OnClickListener () {
2330
+ @ Override
2331
+ public void onClick (View v ) {
2332
+ dialog .cancel ();
2333
+ }
2334
+ });
2240
2335
2336
+ RadioGroup languageSelectorRadioGroup = (RadioGroup )view .findViewById (R .id .languageSelectorRadioGroup );
2337
+ LinearLayout .LayoutParams layoutParams = new RadioGroup .LayoutParams (
2338
+ RadioGroup .LayoutParams .WRAP_CONTENT ,
2339
+ RadioGroup .LayoutParams .WRAP_CONTENT );
2340
+ for (int i =0 ;i <items .length ;i ++) {
2341
+ RadioButton button = (RadioButton )getLayoutInflater ().inflate (R .layout .popup_chromecast_video_options_button , null );
2342
+ button .setText (items [i ]);
2343
+ button .setId (i );
2344
+ languageSelectorRadioGroup .addView (button , layoutParams );
2345
+ }
2346
+ languageSelectorRadioGroup .check (selectedVoice );
2347
+ languageSelectorRadioGroup .setOnCheckedChangeListener (new RadioGroup .OnCheckedChangeListener () {
2348
+ @ Override
2349
+ public void onCheckedChanged (RadioGroup group , int checkedId ) {
2350
+ VoiceControlForPlexApplication .getInstance ().prefs .put (pref , items [checkedId ].toString ());
2351
+ dialog .dismiss ();
2352
+ }
2353
+ });
2354
+ dialog .show ();
2355
+ } else {
2356
+ VoiceControlForPlexApplication .getInstance ().prefs .put (pref , "Locale.US" );
2357
+ }
2358
+ }
2359
+ }
2241
2360
}
0 commit comments