/* <!-- +++
package com.almalence.opencam_plus.ui;
+++ --> */
//<!-- -+-
package com.almalence.opencam.ui;
//-+- -->
import java.util.List;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.SharedPreferences;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.preference.PreferenceManager;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import com.almalence.sony.cameraremote.DeviceListAdapter;
import com.almalence.sony.cameraremote.ServerDevice;
import com.almalence.sony.cameraremote.SimpleSsdpClient;
import com.almalence.sony.cameraremote.utils.WifiListener;
/* <!-- +++
import com.almalence.opencam_plus.ApplicationScreen;
import com.almalence.opencam_plus.R;
import com.almalence.opencam_plus.cameracontroller.CameraController;
import com.almalence.opencam_plus.MainScreen;
+++ --> */
//<!-- -+-
import com.almalence.opencam.ApplicationScreen;
import com.almalence.opencam.MainScreen;
import com.almalence.opencam.R;
import com.almalence.opencam.cameracontroller.CameraController;
//-+- -->
public class SonyCameraDeviceExplorer implements WifiListener
{
private SimpleSsdpClient mSsdpClient;
private DeviceListAdapter mListAdapter;
private SonyCameraDeviceExplorerDialog dialog = null;
private boolean isSearchingDevice = false;
public SonyCameraDeviceExplorer(View gui)
{
dialog = new SonyCameraDeviceExplorerDialog(ApplicationScreen.instance);
mSsdpClient = new SimpleSsdpClient();
mListAdapter = new DeviceListAdapter(ApplicationScreen.instance);
}
public void showExplorer()
{
isSearchingDevice = true;
if (MainScreen.getInstance().getWifiHandler() != null)
{
MainScreen.getInstance().getWifiHandler().addListener(this);
}
dialog.show();
dialog.setOnDismissListener(new OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialog)
{
isSearchingDevice = false;
}
});
mListAdapter.clearDevices();
ListView listView = (ListView) dialog.findViewById(R.id.list_device);
listView.setAdapter(mListAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
ListView listView = (ListView) parent;
ServerDevice device = (ServerDevice) listView.getAdapter().getItem(position);
launchRemoteCamera(device);
}
});
dialog.findViewById(R.id.button_search).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Button btn = (Button) v;
if (!mSsdpClient.isSearching())
{
searchDevices();
btn.setEnabled(false);
}
}
});
// Show Wi-Fi SSID.
TextView textWifiSsid = (TextView) dialog.findViewById(R.id.text_wifi_ssid);
WifiManager wifiManager = (WifiManager) ApplicationScreen.instance
.getSystemService(ApplicationScreen.WIFI_SERVICE);
if (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED)
{
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String htmlLabel = String.format("SSID: <b>%s</b>", wifiInfo.getSSID());
textWifiSsid.setText(Html.fromHtml(htmlLabel));
} else
{
textWifiSsid.setText(R.string.msg_wifi_disconnect);
}
}
public void launchRemoteCamera(ServerDevice device)
{
hideExplorer();
ApplicationScreen.instance.pauseMain();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ApplicationScreen.getMainContext());
prefs.edit().putInt(ApplicationScreen.sCameraModePref, CameraController.getNumberOfCameras() - 1).commit();
ApplicationScreen.getGUIManager().setCameraModeGUI(CameraController.getNumberOfCameras() - 1);
CameraController.setCameraIndex(CameraController.getNumberOfCameras() - 1);
ApplicationScreen.instance.switchingMode(false);
CameraController.setTargetServerDevice(device);
ApplicationScreen.instance.resumeMain();
}
public void hideExplorer()
{
if (progress != null)
{
progress.dismiss();
}
isSearchingDevice = false;
if (MainScreen.getInstance().getWifiHandler() != null)
{
MainScreen.getInstance().getWifiHandler().removeListener(this);
}
if (mSsdpClient != null && mSsdpClient.isSearching())
{
mSsdpClient.cancelSearching();
}
dialog.dismiss();
}
/**
* Start searching supported devices.
*/
private void searchDevices()
{
mListAdapter.clearDevices();
mSsdpClient.search(new SimpleSsdpClient.SearchResultHandler()
{
@Override
public void onDeviceFound(final ServerDevice device)
{
// Called by non-UI thread.
ApplicationScreen.instance.runOnUiThread(new Runnable()
{
@Override
public void run()
{
mListAdapter.addDevice(device);
mListAdapter.notifyDataSetChanged();
if (dialog != null)
{
dialog.setRotate(GUI.mDeviceOrientation);
}
}
});
}
@Override
public void onFinished()
{
// Called by non-UI thread.
ApplicationScreen.instance.runOnUiThread(new Runnable()
{
@Override
public void run()
{
dialog.findViewById(R.id.button_search).setEnabled(true);
}
});
}
@Override
public void onErrorFinished()
{
// Called by non-UI thread.
ApplicationScreen.instance.runOnUiThread(new Runnable()
{
@Override
public void run()
{
dialog.findViewById(R.id.button_search).setEnabled(true);
}
});
}
});
}
public void setOrientation()
{
if (dialog != null)
{
dialog.setRotate(GUI.mDeviceOrientation);
}
}
public static ProgressDialog progress;
SimpleSsdpClient.SearchResultHandler loopSearchHandler = new SimpleSsdpClient.SearchResultHandler()
{
@Override
public void onDeviceFound(final ServerDevice device)
{
// Called by non-UI thread.
ApplicationScreen.instance.runOnUiThread(new Runnable()
{
@Override
public void run()
{
if (isSearchingDevice)
launchRemoteCamera(device);
}
});
}
@Override
public void onFinished()
{
// Called by non-UI thread.
ApplicationScreen.instance.runOnUiThread(new Runnable()
{
@Override
public void run()
{
if (progress != null)
{
progress.dismiss();
}
}
});
}
@Override
public void onErrorFinished()
{
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
if (isSearchingDevice) {
searchForCameraAndOpenLoop();
}
}
};
private void searchForCameraAndOpenLoop()
{
mSsdpClient.search(loopSearchHandler);
}
@Override
public void onWifiConnected(String ssid)
{
if (isSearchingDevice) {
ApplicationScreen.instance.runOnUiThread(new Runnable()
{
@Override
public void run()
{
if (progress != null) {
progress.dismiss();
}
progress = ProgressDialog.show(ApplicationScreen.instance, ApplicationScreen.instance.getResources().getString(R.string.title_connecting),
ApplicationScreen.instance.getResources().getString(R.string.msg_connecting), true, true);
progress.setOnDismissListener(new OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialog)
{
isSearchingDevice = false;
}
});
}
});
searchForCameraAndOpenLoop();
}
}
@Override
public void onWifiDisconnected()
{
}
@Override
public void onWifiStartScan()
{
}
@Override
public void onWifiScanFinished(List<ScanResult> sonyCameraScanResults,
List<WifiConfiguration> sonyCameraWifiConfiguration)
{
}
@Override
public void onWifiConnecting(String ssid)
{
ApplicationScreen.instance.runOnUiThread(new Runnable()
{
@Override
public void run()
{
if (progress != null) {
progress.dismiss();
}
progress = ProgressDialog.show(ApplicationScreen.instance, ApplicationScreen.instance.getResources().getString(R.string.title_connecting),
ApplicationScreen.instance.getResources().getString(R.string.msg_connecting), true, true);
progress.setOnDismissListener(new OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialog)
{
isSearchingDevice = false;
}
});
}
});
}
}