package org.droidklavier; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Handler; import android.preference.PreferenceManager; import android.util.Log; import org.cybergarage.upnp.ControlPoint; import org.cybergarage.upnp.Device; import org.cybergarage.upnp.DeviceList; import org.cybergarage.upnp.device.DeviceChangeListener; import org.droidklavier.activity.Player; import org.droidklavier.activity.SettingsActivity; import org.droidklavier.db.DAO; import org.droidklavier.db.DBClient; import org.droidklavier.rc.RC; import org.droidklavier.tcp.TCPClient; import org.droidklavier.tcp.TCPHandler; public class Droidklavier extends Application { private static final int PORT = 3191; private static final String TAG = "Droidklavier"; public static Context context; private SharedPreferences mPrefs; private TCPClient mTcpClient; private DAO mDAO; private final TCPHandler mTCPHandler = new TCPHandler(this); private final RC mRC = new RC(); private Player mPlayer; private boolean mLoading; private String mConnectedAddr; private String foundHost = ""; @Override public void onCreate() { super.onCreate(); context = getApplicationContext(); mPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); mDAO = new DAO(new DBClient(getHost(), getDBName(), getDBUser(), getDBPass())); } @Override public void onTerminate() { super.onTerminate(); if (mTcpClient != null) { mTcpClient.stop(); } } private String getHost() { if (!"".equals(foundHost)) { return foundHost; } return mPrefs.getString(SettingsActivity.HOST, SettingsActivity.HOST_DEFAULT); } private String getDBName() { return mPrefs.getString(SettingsActivity.DATABASE, SettingsActivity.DATABASE_DEFAULT); } private String getDBUser() { return mPrefs.getString(SettingsActivity.DB_USER, SettingsActivity.DB_USER_DEFAULT); } private String getDBPass() { return mPrefs.getString(SettingsActivity.DB_PASS, SettingsActivity.DB_PASS_DEFAULT); } public void connect() { if (!isConnected()) { UPNPSearchTask mUPNPTask = new UPNPSearchTask(); mUPNPTask.execute(); mDAO.setDBClient(new DBClient(getHost(), getDBName(), getDBUser(), getDBPass())); ConnectTask mConnectTask = new ConnectTask(); mConnectTask.execute(); } } public void reconnect() { if (isConnected()) { disconnect(); new Handler().postDelayed(new Runnable() { @Override public void run() { connect(); } }, 2000); } else { connect(); } } public void disconnect() { if (isConnected()) { mTcpClient.stop(); } } public boolean isConnected() { return mTcpClient != null && mTcpClient.isConnected(); } public void sendTCPMessage(String message) { if (isConnected()) { SendMessageTask sendMessageTask = new SendMessageTask(); sendMessageTask.execute(message); } } public DAO getDAO() { return mDAO; } public RC getRC() { return mRC; } public Player getPlayer() { return mPlayer; } public void setPlayer(Player player) { mPlayer = player; } public boolean isLoading() { return mLoading; } public void setLoading(boolean loading) { mLoading = loading; } public String getConnectedAddr() { return mConnectedAddr; } public void setConnectedAddr(String address) { mConnectedAddr = address; } private class ConnectTask extends AsyncTask<String, Void, TCPClient> { @Override protected TCPClient doInBackground(String... params) { TCPClient client = new TCPClient(getHost(), PORT, mTCPHandler); client.connect(); return client; } @Override protected void onPostExecute(TCPClient result) { super.onPostExecute(result); mTcpClient = result; if (isConnected()) { mTcpClient.connected(); } } } private class SendMessageTask extends AsyncTask<String, Void, Void> { @Override protected Void doInBackground(String... params) { mTcpClient.sendMessage(params[0]); return null; } } private class UPNPSearchTask extends AsyncTask<String, Void, MyUPNPControlPoint> { @Override protected MyUPNPControlPoint doInBackground(String... arg0) { return new MyUPNPControlPoint(); } protected void onPostExecute(MyUPNPControlPoint result) { super.onPostExecute(result); foundHost = result._ip; if (!"".equals(foundHost)) { mDAO.setHost(foundHost); } } } private class MyUPNPControlPoint extends ControlPoint implements DeviceChangeListener { private String _ip = ""; private boolean done = false; public MyUPNPControlPoint() { addDeviceChangeListener(this); StartAndWait(); } private synchronized void StartAndWait() { start(); Log.d(TAG, "Starting pnp search"); try { wait(10000); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(TAG, "Done with StartAndWait! IP is " + _ip); if ("".equals(_ip)) { DeviceList rootDevList = getDeviceList(); int nRootDevs = rootDevList.size(); for (int n = 0; n < nRootDevs; n++) { Device dev = rootDevList.getDevice(n); String devName = dev.getFriendlyName(); String ip = dev.getAbsoluteURL(dev.getDescriptionFilePath()).split(":")[1].replace("/", ""); if (devName.startsWith("DKV") && dev.getManufacture().startsWith("YAMAHA") && dev.getModelName().contains("MarkIV")) { Log.d(TAG, "FOUND [" + n + "] = " + devName + "," + ip); _ip = ip; } } } this.stop(); } public void deviceAdded(Device dev) { String devName = dev.getFriendlyName(); String ip = dev.getAbsoluteURL(dev.getDescriptionFilePath()).split(":")[1].replace("/", ""); if(devName.startsWith("DKV") && dev.getManufacture().startsWith("YAMAHA") && dev.getModelName().contains("MarkIV")) { Log.d(TAG, "Found " + devName + "," + ip); if (!done) { _ip = ip; done = true; notify(); } } } public void deviceRemoved(Device device) { } } }