Skip to content

Commit 47670b8

Browse files
author
Chris Bellew
committed
Refresh servers after logging in, in case user subsequently restricts access to their server to authentication, so we can get the access token for that server.
1 parent 2286e89 commit 47670b8

File tree

9 files changed

+124
-21
lines changed

9 files changed

+124
-21
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,17 @@ public void e(int id) {
7171
feedback(context.getString(id), true);
7272
}
7373

74+
public void t(int id) {
75+
feedback(context.getString(id), true, true);
76+
}
77+
7478
private void feedback(String text, boolean errors) {
75-
if(mPrefs.getInt(errors ? "errors" : "feedback", MainActivity.FEEDBACK_TOAST) == MainActivity.FEEDBACK_VOICE) {
79+
feedback(text, errors, false);
80+
}
81+
82+
private void feedback(String text, boolean errors, boolean forceToast) {
83+
84+
if(!forceToast && mPrefs.getInt(errors ? "errors" : "feedback", MainActivity.FEEDBACK_TOAST) == MainActivity.FEEDBACK_VOICE) {
7685
TextToSpeech tts = errors ? errorsTts : feedbackTts;
7786
if (tts == null) {
7887
// This tts not set up yet, so initiate it and add the text to be spoken to the appropriate queue.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ protected void onHandleIntent(Intent intent) {
6666
listening = false;
6767
Intent socketBroadcast = new Intent(GDMService.SOCKET_CLOSED);
6868
socketBroadcast.putExtra("ORIGIN", origin);
69+
socketBroadcast.putExtra(VoiceControlForPlexApplication.Intent.EXTRA_SILENT, intent.getBooleanExtra(VoiceControlForPlexApplication.Intent.EXTRA_SILENT, false));
6970
socketBroadcast.putExtra("class", intent.getSerializableExtra("class"));
7071
socketBroadcast.putExtra(VoiceControlForPlexApplication.Intent.SCAN_TYPE, intent.getStringExtra(VoiceControlForPlexApplication.Intent.SCAN_TYPE));
7172
if(queryText != null) {

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,29 @@ public LocalScan(Context ctx, Class cls, SharedPreferences prefs, ScanHandler ha
4545
}
4646

4747
public void searchForPlexServers() {
48+
searchForPlexServers(false);
49+
}
50+
51+
public void searchForPlexServers(boolean silent) {
4852
Logger.d("searchForPlexServers()");
4953
if(!VoiceControlForPlexApplication.isWifiConnected(context)) {
5054
VoiceControlForPlexApplication.showNoWifiDialog(context);
5155
return;
5256
}
5357

54-
searchDialog = new Dialog(context);
58+
if(!silent) {
59+
searchDialog = new Dialog(context);
5560

56-
searchDialog.setContentView(R.layout.search_popup);
57-
searchDialog.setTitle(context.getResources().getString(R.string.searching_for_plex_servers));
61+
searchDialog.setContentView(R.layout.search_popup);
62+
searchDialog.setTitle(context.getResources().getString(R.string.searching_for_plex_servers));
5863

59-
searchDialog.show();
64+
searchDialog.show();
65+
}
6066

6167
Intent mServiceIntent = new Intent(context, GDMService.class);
6268
mServiceIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
6369
mServiceIntent.putExtra("ORIGIN", theClass.getSimpleName());
70+
mServiceIntent.putExtra(VoiceControlForPlexApplication.Intent.EXTRA_SILENT, silent);
6471
mServiceIntent.putExtra("class", theClass);
6572
mServiceIntent.putExtra(VoiceControlForPlexApplication.Intent.SCAN_TYPE, "server");
6673
context.startService(mServiceIntent);

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

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
import org.simpleframework.xml.Serializer;
1616
import org.simpleframework.xml.core.Persister;
1717

18+
import java.util.ArrayList;
1819
import java.util.HashMap;
20+
import java.util.List;
1921
import java.util.concurrent.ConcurrentHashMap;
2022

2123
public class RemoteScan {
@@ -35,6 +37,15 @@ public interface RefreshResourcesResponseHandler {
3537
}
3638

3739
public void refreshResources(String authToken, final RefreshResourcesResponseHandler responseHandler) {
40+
refreshResources(authToken, responseHandler, false);
41+
}
42+
43+
public void refreshResources(String authToken) {
44+
refreshResources(authToken, null, true);
45+
}
46+
47+
48+
public void refreshResources(String authToken, final RefreshResourcesResponseHandler responseHandler, boolean silent) {
3849
VoiceControlForPlexApplication.servers = new ConcurrentHashMap<String, PlexServer>();
3950
VoiceControlForPlexApplication.clients = new HashMap<String, PlexClient>();
4051
String url = String.format("https://plex.tv/pms/resources?%s=%s", PlexHeaders.XPlexToken, authToken);
@@ -53,15 +64,16 @@ public void onSuccess(int statusCode, org.apache.http.Header[] headers, byte[] r
5364
e.printStackTrace();
5465
}
5566
Logger.d("got %d devices", mediaContainer.devices.size());
56-
for(Device device : mediaContainer.devices) {
67+
68+
List<PlexServer> servers = new ArrayList<PlexServer>();
69+
for(final Device device : mediaContainer.devices) {
5770
if(device.lastSeenAt < System.currentTimeMillis()/1000 - (60*60*24))
5871
continue;
5972
if(device.provides.contains("server")) {
6073

6174
PlexServer server = PlexServer.fromDevice(device);
6275
Logger.d("Device %s is a server, has %d connections", server.name, server.connections.size());
63-
VoiceControlForPlexApplication.addPlexServer(server);
64-
76+
servers.add(server);
6577
} else if(device.provides.contains("player")) {
6678
Logger.d("Device %s is a player", device.name);
6779
PlexClient client = PlexClient.fromDevice(device);
@@ -75,7 +87,26 @@ public void onSuccess(int statusCode, org.apache.http.Header[] headers, byte[] r
7587
mPrefs.edit().putString(Preferences.SAVED_CLIENTS, gson.toJson(VoiceControlForPlexApplication.clients));
7688
mPrefs.edit().commit();
7789

78-
responseHandler.onSuccess();
90+
final int[] serversScanned = new int[1];
91+
serversScanned[0] = 0;
92+
final int numServers = servers.size();
93+
for(final PlexServer server : servers) {
94+
VoiceControlForPlexApplication.addPlexServer(server, new Runnable() {
95+
@Override
96+
public void run() {
97+
Logger.d("Done scanning %s", server.name);
98+
serversScanned[0]++;
99+
Logger.d("%d out of %d servers scanned", serversScanned[0], numServers);
100+
if(serversScanned[0] >= numServers && responseHandler != null)
101+
responseHandler.onSuccess();
102+
}
103+
});
104+
}
105+
106+
107+
108+
109+
79110
} catch (Exception e) {
80111
e.printStackTrace();
81112
}
@@ -85,8 +116,8 @@ public void onSuccess(int statusCode, org.apache.http.Header[] headers, byte[] r
85116
public void onFailure(int statusCode, org.apache.http.Header[] headers, byte[] responseBody, java.lang.Throwable error) {
86117
Logger.d("Failure getting resources: %d", statusCode);
87118
error.printStackTrace();
88-
responseHandler.onFailure(statusCode);
89-
// responseHandler.onFailure(error);
119+
if(responseHandler != null)
120+
responseHandler.onFailure(statusCode);
90121
}
91122
});
92123
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.atomjack.vcfp;
22

3+
import java.util.ArrayList;
34
import java.util.HashMap;
45
import java.util.Locale;
56
import java.util.Map;
@@ -36,6 +37,8 @@ public final static class Intent {
3637
public final static String EXTRA_SERVER = "com.atomjack.vcfp.intent.extra_server";
3738
public final static String EXTRA_CLIENT = "com.atomjack.vcfp.intent.extra_client";
3839
public final static String EXTRA_RESUME = "com.atomjack.vcfp.intent.extra_resume";
40+
public final static String EXTRA_SILENT = "com.atomjack.vcfp.intent.extra_silent";
41+
3942

4043
public final static String SCAN_TYPE = "com.atomjack.vcfp.intent.scan_type";
4144
public final static String EXTRA_SERVERS = "com.atomjack.vcfp.intent.extra_servers";
@@ -76,6 +79,10 @@ public static String getUUID(SharedPreferences mPrefs) {
7679
}
7780

7881
public static void addPlexServer(final PlexServer server) {
82+
addPlexServer(server, null);
83+
}
84+
85+
public static void addPlexServer(final PlexServer server, final Runnable onFinish) {
7986
Logger.d("ADDING PLEX SERVER: %s, %s", server.name, server.address);
8087
if(server.name.equals("") || server.address.equals("")) {
8188
return;
@@ -102,6 +109,9 @@ public void onSuccess(int statusCode, org.apache.http.Header[] headers, byte[] r
102109
} catch (Exception e) {
103110
e.printStackTrace();
104111
}
112+
server.movieSections = new ArrayList<String>();
113+
server.tvSections = new ArrayList<String>();
114+
server.musicSections = new ArrayList<String>();
105115
for(int i=0;i<mc.directories.size();i++) {
106116
if(mc.directories.get(i).type.equals("movie")) {
107117
server.addMovieSection(mc.directories.get(i).key);
@@ -114,17 +124,20 @@ public void onSuccess(int statusCode, org.apache.http.Header[] headers, byte[] r
114124
}
115125
}
116126
Logger.d("%s has %d directories.", server.name, mc.directories != null ? mc.directories.size() : 0);
117-
if(!server.name.equals("") && !server.address.equals("")) {
127+
if(!server.name.equals("")) {
118128
servers.put(server.name, server);
119129
Logger.d("Added %s.", server.name);
120130
}
131+
if(onFinish != null)
132+
onFinish.run();
121133
}
122134
});
123135
}
124136

125137
@Override
126138
public void onFailure(int statusCode) {
127139
// TODO: Handle failure here
140+
Logger.d("Failed to find connection for %s: %d", server.name, statusCode);
128141
}
129142
});
130143

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

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public class MainActivity extends Activity implements TextToSpeech.OnInitListene
112112
private TextToSpeech tts;
113113

114114
Menu menu;
115+
private Dialog searchDialog;
115116

116117
private String authToken;
117118

@@ -315,12 +316,16 @@ public void onItemClick(AdapterView<?> adapter, View view, int position,
315316
return;
316317
}
317318
if(authToken != null) {
318-
Logger.d("Logged in");
319+
searchDialog = new Dialog(MainActivity.this);
320+
321+
searchDialog.setContentView(R.layout.search_popup);
322+
searchDialog.setTitle(getResources().getString(R.string.searching_for_plex_servers));
323+
324+
searchDialog.show();
319325
remoteScan.refreshResources(authToken, new RemoteScan.RefreshResourcesResponseHandler() {
320326
@Override
321327
public void onSuccess() {
322-
Logger.d("server: %s", VoiceControlForPlexApplication.servers.get("callandor"));
323-
localScan.searchForPlexServers();
328+
localScan.searchForPlexServers(true);
324329
}
325330

326331
@Override
@@ -580,6 +585,17 @@ public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
580585
public void run() {
581586
feedback.m(R.string.logged_in);
582587
switchLogin();
588+
remoteScan.refreshResources(authToken, new RemoteScan.RefreshResourcesResponseHandler() {
589+
@Override
590+
public void onSuccess() {
591+
feedback.t(R.string.servers_refreshed);
592+
}
593+
594+
@Override
595+
public void onFailure(int statusCode) {
596+
feedback.e(R.string.remote_scan_error);
597+
}
598+
});
583599
}
584600
});
585601
// We got the auth token, so cancel this task
@@ -773,6 +789,8 @@ public void onNewIntent(Intent intent) {
773789

774790
mPrefsEditor.putString(Preferences.SAVED_SERVERS, gson.toJson(VoiceControlForPlexApplication.servers));
775791
mPrefsEditor.commit();
792+
if(searchDialog != null)
793+
searchDialog.dismiss();
776794
if (VoiceControlForPlexApplication.servers.size() > 0) {
777795
localScan.showPlexServers();
778796
} else {

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import android.widget.ScrollView;
1111
import android.widget.TextView;
1212

13+
import com.atomjack.vcfp.BuildConfig;
1314
import com.atomjack.vcfp.Logger;
1415
import com.atomjack.vcfp.PlexHeaders;
1516
import com.atomjack.vcfp.QueryString;
@@ -23,6 +24,7 @@
2324
import com.atomjack.vcfp.model.Timeline;
2425
import com.atomjack.vcfp.net.PlexHttpClient;
2526
import com.atomjack.vcfp.net.PlexHttpResponseHandler;
27+
import com.bugsense.trace.BugSenseHandler;
2628

2729
import org.apache.http.Header;
2830
import org.apache.http.message.BasicHeader;
@@ -47,7 +49,7 @@ public class NowPlayingActivity extends Activity {
4749
private PlexClient client = null;
4850

4951
private int commandId = 0;
50-
private int subscriptionPort = 7777;
52+
private int subscriptionPort = 59409;
5153
private boolean subscribed = false;
5254
private boolean subscriptionHasStarted = false;
5355
private ServerSocket serverSocket;
@@ -64,7 +66,8 @@ protected void onCreate(Bundle savedInstanceState) {
6466

6567
mPrefs = getSharedPreferences(MainActivity.PREFS, MODE_PRIVATE);
6668

67-
// BugSenseHandler.initAndStartSession(NowPlayingActivity.this, MainActivity.BUGSENSE_APIKEY);
69+
if(BuildConfig.USE_BUGSENSE)
70+
BugSenseHandler.initAndStartSession(NowPlayingActivity.this, MainActivity.BUGSENSE_APIKEY);
6871

6972
setContentView(R.layout.play_media);
7073

@@ -258,6 +261,14 @@ else if(playingTrack != null)
258261
@Override
259262
public void run() {
260263
subscriptionHasStarted = false;
264+
serverThread.interrupt();
265+
try {
266+
if (serverSocket != null) {
267+
serverSocket.close();
268+
}
269+
} catch (Exception ex) {
270+
ex.printStackTrace();
271+
}
261272
if(VoiceControlForPlexApplication.isApplicationVisible())
262273
finish();
263274
}
@@ -343,7 +354,12 @@ protected void onDestroy() {
343354
if(subscribed) {
344355
unsubscribe();
345356
serverThread.interrupt();
346-
serverSocket.close();
357+
if(serverSocket != null) {
358+
serverSocket.close();
359+
Logger.d("Closed serverSocket");
360+
} else {
361+
Logger.d("ServerSocket was null");
362+
}
347363
}
348364
} catch(Exception ex) {
349365
ex.printStackTrace();

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ public int describeContents() {
4141
}
4242

4343

44+
public String toString() {
45+
String out = String.format("Address: %s", address);
46+
out += String.format("Port: %s", port);
47+
out += String.format("Protocol: %s", protocol);
48+
return out;
49+
}
50+
4451
@Attribute
4552
public String uri;
4653
public boolean local;

Voice Control For Plex/src/main/res/values/strings.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@
9494
<string name="login_unauthorized">Sorry, but I got an unauthorized login error. You will have to login again.</string>
9595
<string name="remote_scan_error">Sorry, but I got an error trying to access myPlex. You may have to logout and log back in.</string>
9696
<string name="searching_for_plex_clients">Searching for Plex Clients</string>
97-
<string name="select_plex_client">Select a Plex Client</string>
98-
<string name="no_servers_found">No Plex Servers Found</string>
99-
<string name="no_clients_found">No Plex Clients Found</string>
97+
<string name="select_plex_client">Select a Plex Client.</string>
98+
<string name="no_servers_found">No Plex Servers Found.</string>
99+
<string name="no_clients_found">No Plex Clients Found.</string>
100+
<string name="servers_refreshed">Servers refreshed.</string>
100101
</resources>

0 commit comments

Comments
 (0)