package com.atomjack.vcfp.activities; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.CheckBox; import android.widget.ListView; import android.widget.TextView; import com.atomjack.shared.NewLogger; import com.atomjack.shared.Preferences; import com.atomjack.shared.UriDeserializer; import com.atomjack.shared.UriSerializer; import com.atomjack.vcfp.R; import com.atomjack.vcfp.VoiceControlForPlexApplication; import com.atomjack.vcfp.adapters.PlexListAdapter; import com.atomjack.vcfp.interfaces.ScanHandler; import com.atomjack.vcfp.model.PlexClient; import com.atomjack.vcfp.model.PlexDevice; import com.atomjack.vcfp.model.PlexServer; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; public class ShortcutProviderActivity extends AppCompatActivity implements DialogInterface.OnCancelListener { private NewLogger logger; private Gson gsonWrite = new GsonBuilder() .registerTypeAdapter(Uri.class, new UriSerializer()) .create(); private Gson gsonRead = new GsonBuilder() .registerTypeAdapter(Uri.class, new UriDeserializer()) .create(); private PlexServer server; private PlexClient client; ConcurrentHashMap<String, PlexServer> servers; HashMap<String, PlexClient> clients; private boolean cancelScan = false; private Dialog deviceSelectDialog; private boolean resume = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); logger = new NewLogger(this); logger.d("onCreate"); Type serverType = new TypeToken<ConcurrentHashMap<String, PlexServer>>(){}.getType(); Type clientType = new TypeToken<HashMap<String, PlexClient>>(){}.getType(); servers = gsonRead.fromJson(VoiceControlForPlexApplication.getInstance().prefs.get(Preferences.SAVED_SERVERS, ""), serverType); clients = gsonRead.fromJson(VoiceControlForPlexApplication.getInstance().prefs.get(Preferences.SAVED_CLIENTS, ""), clientType); logger.d("servers: %s", servers); boolean didScan = false; if(servers != null && servers.size() > 0 && VoiceControlForPlexApplication.getAllClients().size() > 0) didScan = true; AlertDialog.Builder builder = new AlertDialog.Builder(ShortcutProviderActivity.this); LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.popup_create_shortcut, null); builder.setOnCancelListener(this); builder.setView(layout); final AlertDialog chooserDialog = builder.create(); Button popupCreateShortcutSpecifyButton = (Button)layout.findViewById(R.id.popupCreateShortcutSpecifyButton); TextView popupCreateShortcutMessage = (TextView)layout.findViewById(R.id.popupCreateShortcutMessage); if(!didScan) { popupCreateShortcutMessage.setText(R.string.create_shortcut_blurb_no_servers); popupCreateShortcutSpecifyButton.setVisibility(View.GONE); } else { popupCreateShortcutSpecifyButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chooserDialog.dismiss(); showPlexServers(servers, new ScanHandler() { @Override public void onDeviceSelected(PlexDevice device, boolean unused) { // Set the server that was selected server = (PlexServer) device; showPlexClients(true, new ScanHandler() { @Override public void onDeviceSelected(PlexDevice device, boolean _resume) { // Set the client that was selected, and whether or not to resume client = (PlexClient)device; logger.d("resume is set to %s", _resume); resume = _resume; createShortcut(false); } }); } }); } }); } Button popupCreateShortcutUseCurrentButton = (Button)layout.findViewById(R.id.popupCreateShortcutUseCurrentButton); popupCreateShortcutUseCurrentButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chooserDialog.dismiss(); createShortcut(true); } }); Button popupCreateShortcutCancelButton = (Button)layout.findViewById(R.id.popupCreateShortcutCancelButton); popupCreateShortcutCancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { chooserDialog.dismiss(); finish(); } }); chooserDialog.show(); } private void createShortcut(boolean use_current) { logger.d("Creating shortcut."); Intent.ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher); Intent sendIntent = new Intent(); Intent launchIntent = new Intent(this, ShortcutActivity.class); if(!use_current) { logger.d("setting client to %s", client.name); launchIntent.putExtra(com.atomjack.shared.Intent.EXTRA_SERVER, gsonWrite.toJson(server)); launchIntent.putExtra(com.atomjack.shared.Intent.EXTRA_CLIENT, gsonWrite.toJson(client)); launchIntent.putExtra(com.atomjack.shared.Intent.EXTRA_RESUME, resume); String label = server.name.equals(client.name) ? server.name : (server.owned ? server.name : server.sourceTitle) + "/" + client.name; sendIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, label); } else { launchIntent.putExtra(com.atomjack.shared.Intent.USE_CURRENT, true); sendIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getResources().getString(R.string.app_name)); } sendIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launchIntent); sendIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); setResult(RESULT_OK, sendIntent); finish(); } @Override protected void onDestroy() { // feedback.destroy(); super.onDestroy(); } @Override protected void onPause() { super.onPause(); } @Override protected void onResume() { super.onResume(); } public void showPlexServers(ConcurrentHashMap<String, PlexServer> servers, final ScanHandler scanHandler) { if(cancelScan) { cancelScan = false; return; } deviceSelectDialog = getDeviceSelectDialog(true, getResources().getString(R.string.select_plex_server)); deviceSelectDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { finish(); } }); deviceSelectDialog.show(); final ListView serverListView = (ListView) deviceSelectDialog.findViewById(R.id.serverListView); if(servers == null) servers = new ConcurrentHashMap<>(VoiceControlForPlexApplication.servers); final PlexListAdapter adapter = new PlexListAdapter(this, PlexListAdapter.TYPE_SERVER); adapter.setServers(servers); serverListView.setAdapter(adapter); serverListView.setOnItemClickListener(new ListView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id) { logger.d("Clicked position %d", position); PlexServer s = (PlexServer)parentAdapter.getItemAtPosition(position); deviceSelectDialog.dismiss(); scanHandler.onDeviceSelected(s, false); } }); } public Dialog getDeviceSelectDialog(boolean isServer, String title) { AlertDialog.Builder builder = new AlertDialog.Builder(this); LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.device_select, null); if(VoiceControlForPlexApplication.getInstance().unauthorizedLocalServersFound.size() > 0 && isServer) { layout.findViewById(R.id.unauthorizedLocalServerFoundFrameView).setVisibility(View.VISIBLE); if(VoiceControlForPlexApplication.getInstance().isLoggedIn()) { layout.findViewById(R.id.unauthorizedLocalServerFoundTextViewLoggedIn).setVisibility(View.VISIBLE); layout.findViewById(R.id.unauthorizedLocalServerFoundTextViewLoggedOut).setVisibility(View.INVISIBLE); } else { layout.findViewById(R.id.unauthorizedLocalServerFoundTextViewLoggedOut).setVisibility(View.VISIBLE); layout.findViewById(R.id.unauthorizedLocalServerFoundTextViewLoggedIn).setVisibility(View.INVISIBLE); } } else { layout.findViewById(R.id.unauthorizedLocalServerFoundFrameView).setVisibility(View.GONE); } builder.setView(layout); final TextView headerView = (TextView)layout.findViewById(R.id.deviceListHeader); headerView.setText(title); return builder.create(); } public void showPlexClients(boolean showResume, final ScanHandler onFinish) { if(cancelScan) { cancelScan = false; return; } deviceSelectDialog = getDeviceSelectDialog(false, getString(R.string.select_plex_client)); deviceSelectDialog.setOnCancelListener(this); deviceSelectDialog.show(); if(deviceSelectDialog.findViewById(R.id.unauthorizedLocalServerFoundFrameView) != null) deviceSelectDialog.findViewById(R.id.unauthorizedLocalServerFoundFrameView).setVisibility(View.GONE); if (showResume) { CheckBox resumeCheckbox = (CheckBox) deviceSelectDialog.findViewById(R.id.deviceListResume); resumeCheckbox.setVisibility(View.VISIBLE); } final ListView clientListView = (ListView) deviceSelectDialog.findViewById(R.id.serverListView); final PlexListAdapter adapter = new PlexListAdapter(this, PlexListAdapter.TYPE_CLIENT); adapter.setClients(VoiceControlForPlexApplication.getAllClients()); clientListView.setAdapter(adapter); clientListView.setOnItemClickListener(new ListView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id) { PlexClient s = (PlexClient) parentAdapter.getItemAtPosition(position); deviceSelectDialog.dismiss(); CheckBox resumeCheckbox = (CheckBox) deviceSelectDialog.findViewById(R.id.deviceListResume); if (onFinish != null) onFinish.onDeviceSelected(s, resumeCheckbox.isChecked()); } }); } @Override public void onCancel(DialogInterface dialog) { finish(); } }