Skip to content

Commit 30585b4

Browse files
author
Chris Bellew
committed
Moved search functionality into a service, and created new NowPlayingActivity; Don't need two BroadcastReceivers.
1 parent a4ee9ca commit 30585b4

File tree

11 files changed

+1513
-1591
lines changed

11 files changed

+1513
-1591
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@
22
local.properties
33
app/build
44
Voice Control For Plex/build
5+
.idea
6+
out
7+
ignored

Voice Control For Plex/src/main/AndroidManifest.xml

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
<action android:name="com.twofortyfouram.locale.intent.action.EDIT_SETTING" />
3030
</intent-filter>
3131
</activity>
32+
<service android:name=".PlexSearch"
33+
android:label="Plex Search">
34+
</service>
3235
<activity
3336
android:name=".PlayMediaActivity"
3437
android:configChanges="orientation|screenSize"
@@ -37,19 +40,19 @@
3740
<action android:name="android.intent.action.SEND" />
3841
</intent-filter>
3942
</activity>
43+
<activity
44+
android:name=".NowPlayingActivity"
45+
android:configChanges="orientation|screenSize"
46+
android:label="@string/app_name" >
47+
<intent-filter>
48+
<action android:name="android.intent.action.SEND" />
49+
</intent-filter>
50+
</activity>
4051

4152
<service
4253
android:name=".GDMService"
4354
android:exported="false" />
4455

45-
<receiver
46-
android:name=".GoogleSearchReceiver"
47-
android:exported="true" >
48-
<intent-filter>
49-
<action android:name="com.mohammadag.googlesearchapi.NEW_SEARCH" />
50-
</intent-filter>
51-
</receiver>
52-
5356
<receiver
5457
android:name=".PlayReceiver"
5558
android:exported="true"
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.atomjack.vcfp;
2+
3+
import android.content.Context;
4+
import android.content.SharedPreferences;
5+
import android.speech.tts.TextToSpeech;
6+
import android.widget.Toast;
7+
8+
public class Feedback implements TextToSpeech.OnInitListener {
9+
private SharedPreferences mPrefs;
10+
private TextToSpeech feedbackTts = null;
11+
private TextToSpeech errorsTts = null;
12+
private Context context;
13+
private String feedbackQueue = null;
14+
private String errorsQueue = null;
15+
16+
public Feedback(SharedPreferences prefs, Context ctx) {
17+
mPrefs = prefs;
18+
context = ctx;
19+
}
20+
21+
@Override
22+
public void onInit(int i) {
23+
Logger.d("Feedback onInit");
24+
if(errorsTts != null)
25+
errorsTts.setLanguage(VoiceControlForPlexApplication.getVoiceLocale(mPrefs.getString(VoiceControlForPlexApplication.PREF_ERRORS_VOICE, "Locale.US")));
26+
if(feedbackTts != null)
27+
feedbackTts.setLanguage(VoiceControlForPlexApplication.getVoiceLocale(mPrefs.getString(VoiceControlForPlexApplication.PREF_FEEDBACK_VOICE, "Locale.US")));
28+
29+
if(errorsQueue != null) {
30+
feedback(errorsQueue, true);
31+
errorsQueue = null;
32+
}
33+
if(feedbackQueue != null) {
34+
feedback(feedbackQueue, true);
35+
feedbackQueue = null;
36+
}
37+
}
38+
39+
public void m(String text, Object... arguments) {
40+
text = String.format(text, arguments);
41+
m(text);
42+
}
43+
44+
public void e(String text, Object... arguments) {
45+
text = String.format(text, arguments);
46+
e(text);
47+
}
48+
49+
public void m(String text) {
50+
feedback(text, false);
51+
}
52+
53+
public void e(String text) {
54+
feedback(text, true);
55+
}
56+
57+
private void feedback(String text, boolean errors) {
58+
if(mPrefs.getInt(errors ? "errors" : "feedback", 0) == MainActivity.FEEDBACK_VOICE) {
59+
TextToSpeech tts = errors ? errorsTts : feedbackTts;
60+
if (tts == null) {
61+
// This tts not set up yet, so initiate it and add the text to be spoken to the appropriate queue.
62+
// The text will be spoken when the tts is finished setting up (in onInit)
63+
if (errors) {
64+
errorsTts = new TextToSpeech(context, this);
65+
errorsQueue = text;
66+
} else {
67+
feedbackTts = new TextToSpeech(context, this);
68+
feedbackQueue = text;
69+
}
70+
} else {
71+
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
72+
if (errors)
73+
errorsQueue = null;
74+
else
75+
feedbackQueue = null;
76+
}
77+
} else {
78+
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
79+
}
80+
}
81+
}

Voice Control For Plex/src/main/java/com/atomjack/vcfp/GDMService.java

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -22,59 +22,57 @@ public GDMService() {
2222
}
2323
@Override
2424
protected void onHandleIntent(Intent intent) {
25-
try
26-
{
27-
String origin = intent.getStringExtra("ORIGIN") == null ? "" : intent.getStringExtra("ORIGIN");
28-
String queryText = intent.getStringExtra("queryText");
29-
DatagramSocket socket = new DatagramSocket(32420);
30-
socket.setBroadcast(true);
31-
String data = "M-SEARCH * HTTP/1.0";
32-
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(), getBroadcastAddress(), 32414);
33-
socket.send(packet);
34-
Logger.i("Search Packet Broadcasted");
35-
36-
byte[] buf = new byte[256];
37-
packet = new DatagramPacket(buf, buf.length);
38-
socket.setSoTimeout(2000);
39-
boolean listening = true;
40-
while (listening)
25+
try
4126
{
42-
try
27+
String origin = intent.getStringExtra("ORIGIN") == null ? "" : intent.getStringExtra("ORIGIN");
28+
String queryText = intent.getStringExtra("queryText");
29+
DatagramSocket socket = new DatagramSocket(32420);
30+
socket.setBroadcast(true);
31+
String data = "M-SEARCH * HTTP/1.0";
32+
DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(), getBroadcastAddress(), 32414);
33+
socket.send(packet);
34+
Logger.i("Search Packet Broadcasted");
35+
36+
byte[] buf = new byte[256];
37+
packet = new DatagramPacket(buf, buf.length);
38+
socket.setSoTimeout(2000);
39+
boolean listening = true;
40+
while (listening)
4341
{
44-
socket.receive(packet);
45-
String packetData = new String(packet.getData());
46-
if (packetData.contains("HTTP/1.0 200 OK"))
42+
try
4743
{
48-
Logger.i("PMS Packet Received");
49-
//Broadcast Received Packet
50-
Intent packetBroadcast = new Intent(GDMService.MSG_RECEIVED);
51-
packetBroadcast.putExtra("data", packetData);
52-
packetBroadcast.putExtra("ipaddress", packet.getAddress().toString());
53-
packetBroadcast.putExtra("ORIGIN", origin);
54-
LocalBroadcastManager.getInstance(this).sendBroadcast(packetBroadcast);
44+
socket.receive(packet);
45+
String packetData = new String(packet.getData());
46+
if (packetData.contains("HTTP/1.0 200 OK"))
47+
{
48+
Logger.i("PMS Packet Received");
49+
//Broadcast Received Packet
50+
Intent packetBroadcast = new Intent(GDMService.MSG_RECEIVED);
51+
packetBroadcast.putExtra("data", packetData);
52+
packetBroadcast.putExtra("ipaddress", packet.getAddress().toString());
53+
packetBroadcast.putExtra("ORIGIN", origin);
54+
LocalBroadcastManager.getInstance(this).sendBroadcast(packetBroadcast);
55+
}
5556
}
56-
}
57-
catch (SocketTimeoutException e)
58-
{
59-
Logger.w("Socket Timeout");
60-
socket.close();
61-
listening = false;
62-
Intent socketBroadcast = new Intent(GDMService.SOCKET_CLOSED);
63-
socketBroadcast.putExtra("ORIGIN", origin);
64-
if(queryText != null) {
65-
socketBroadcast.putExtra("queryText", queryText);
57+
catch (SocketTimeoutException e)
58+
{
59+
Logger.w("Socket Timeout");
60+
socket.close();
61+
listening = false;
62+
Intent socketBroadcast = new Intent(GDMService.SOCKET_CLOSED);
63+
socketBroadcast.putExtra("ORIGIN", origin);
64+
if(queryText != null) {
65+
socketBroadcast.putExtra("queryText", queryText);
66+
}
67+
LocalBroadcastManager.getInstance(this).sendBroadcast(socketBroadcast);
6668
}
67-
LocalBroadcastManager.getInstance(this).sendBroadcast(socketBroadcast);
6869
}
69-
7070
}
71-
}
72-
catch (IOException e)
73-
{
74-
Logger.e(e.toString());
75-
e.printStackTrace();
76-
}
77-
71+
catch (IOException e)
72+
{
73+
Logger.e(e.toString());
74+
e.printStackTrace();
75+
}
7876
}
7977

8078
//Builds the broadcast address based on the local network

Voice Control For Plex/src/main/java/com/atomjack/vcfp/GoogleSearchReceiver.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

Voice Control For Plex/src/main/java/com/atomjack/vcfp/ListenerWidget.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@
66
import android.content.ComponentName;
77
import android.content.Context;
88
import android.content.Intent;
9+
import android.net.Uri;
910
import android.speech.RecognizerIntent;
1011
import android.widget.RemoteViews;
1112

13+
import java.math.BigInteger;
14+
import java.security.SecureRandom;
15+
1216
public class ListenerWidget extends AppWidgetProvider {
1317

1418
@Override
@@ -21,8 +25,10 @@ public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] ap
2125
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
2226
R.layout.widget_layout);
2327

24-
Intent activityIntent = new Intent(context, PlayMediaActivity.class);
25-
PendingIntent resultsPendingIntent = PendingIntent.getActivity(context, 0, activityIntent, 0);
28+
Intent serviceIntent = new Intent(context, PlexSearch.class);
29+
// SecureRandom random = new SecureRandom();
30+
// serviceIntent.setData(Uri.parse(new BigInteger(130, random).toString(32)));
31+
PendingIntent resultsPendingIntent = PendingIntent.getService(context, 0, serviceIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
2632

2733
Intent listenerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
2834
listenerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
@@ -37,4 +43,5 @@ public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] ap
3743
Logger.d("Widget updated.");
3844
}
3945
}
46+
4047
}

0 commit comments

Comments
 (0)