Added a dialog for turning the WiFi radio on.
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
android:versionName="1.0" >
|
android:versionName="1.0" >
|
||||||
|
|
||||||
<uses-sdk
|
<uses-sdk
|
||||||
android:minSdkVersion="10"
|
android:minSdkVersion="11"
|
||||||
android:targetSdkVersion="19" />
|
android:targetSdkVersion="19" />
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|||||||
@@ -8,32 +8,4 @@
|
|||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
android:baselineAligned="false"
|
android:baselineAligned="false"
|
||||||
tools:context=".MainActivity" >
|
tools:context=".MainActivity" >
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/startButton"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignParentBottom="true"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:text="@string/start_button" />
|
|
||||||
|
|
||||||
<!-- <EditText
|
|
||||||
android:id="@+id/ipAddressField"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_above="@+id/startButton"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:ems="10"
|
|
||||||
android:inputType="text" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/textView1"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignBaseline="@+id/ipAddressField"
|
|
||||||
android:layout_alignBottom="@+id/ipAddressField"
|
|
||||||
android:layout_toLeftOf="@+id/ipAddressField"
|
|
||||||
android:text="@string/ipAddressLabel" />
|
|
||||||
-->
|
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|||||||
@@ -12,5 +12,11 @@
|
|||||||
<string name="ipAddressLabel">Dirección IP de NxtAR</string>
|
<string name="ipAddressLabel">Dirección IP de NxtAR</string>
|
||||||
<string name="badIpToast">La dirección IP no es válida</string>
|
<string name="badIpToast">La dirección IP no es válida</string>
|
||||||
<string name="emptyIpToast">Rellene el campo de dirección IP</string>
|
<string name="emptyIpToast">Rellene el campo de dirección IP</string>
|
||||||
|
<string name="wifi_on_title">Esta app requiere WiFi</string>
|
||||||
|
<string name="wifi_on_msg">¿Encender el WiFi?</string>
|
||||||
|
<string name="cancel_button">Cancelar</string>
|
||||||
|
<string name="wifi_on_button">Encender</string>
|
||||||
|
<string name="wifi_on_success">El radio del WiFi está encendido</string>
|
||||||
|
<string name="wifi_on_fail">Esta app no puede funcionar sin wifi. Cerrando.</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -12,5 +12,11 @@
|
|||||||
<string name="ipAddressLabel">NxtAR IP Address</string>
|
<string name="ipAddressLabel">NxtAR IP Address</string>
|
||||||
<string name="badIpToast">Invalid IP address</string>
|
<string name="badIpToast">Invalid IP address</string>
|
||||||
<string name="emptyIpToast">Fill out the IP address field</string>
|
<string name="emptyIpToast">Fill out the IP address field</string>
|
||||||
|
<string name="wifi_on_title">This app requires WiFi</string>
|
||||||
|
<string name="wifi_on_msg">Turn on the WiFi?</string>
|
||||||
|
<string name="cancel_button">Cancel</string>
|
||||||
|
<string name="wifi_on_button">Turn on</string>
|
||||||
|
<string name="wifi_on_success">The Wifi radio is on now</string>
|
||||||
|
<string name="wifi_on_fail">This app cannot work without wifi. Closing.</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -3,14 +3,12 @@ package ve.ucv.ciens.ccg.nxtcam;
|
|||||||
import ve.ucv.ciens.ccg.nxtcam.camera.CameraPreview;
|
import ve.ucv.ciens.ccg.nxtcam.camera.CameraPreview;
|
||||||
import ve.ucv.ciens.ccg.nxtcam.network.ImageTransferThread;
|
import ve.ucv.ciens.ccg.nxtcam.network.ImageTransferThread;
|
||||||
import ve.ucv.ciens.ccg.nxtcam.utils.Logger;
|
import ve.ucv.ciens.ccg.nxtcam.utils.Logger;
|
||||||
import ve.ucv.ciens.ccg.nxtcam.utils.ProjectConstants;
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.hardware.Camera;
|
import android.hardware.Camera;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.NavUtils;
|
import android.support.v4.app.NavUtils;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
@@ -94,7 +92,7 @@ public class CamActivity extends Activity{
|
|||||||
if(hwCamera != null){
|
if(hwCamera != null){
|
||||||
cPreview.setCamera(hwCamera);
|
cPreview.setCamera(hwCamera);
|
||||||
}else{
|
}else{
|
||||||
Log.wtf(TAG, CLASS_NAME + ".startCameraPreview() :: CAMERA IS NULL!");
|
Logger.log_wtf(TAG, CLASS_NAME + ".startCameraPreview() :: CAMERA IS NULL!");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -115,7 +113,7 @@ public class CamActivity extends Activity{
|
|||||||
try{
|
try{
|
||||||
cam = Camera.open(0);
|
cam = Camera.open(0);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
if(ProjectConstants.DEBUG) Log.e(TAG, CLASS_NAME + ".doInBackground() :: Failed to open the camera.");
|
Logger.log_e(TAG, CLASS_NAME + ".doInBackground() :: Failed to open the camera.");
|
||||||
}
|
}
|
||||||
return cam;
|
return cam;
|
||||||
}
|
}
|
||||||
@@ -124,9 +122,9 @@ public class CamActivity extends Activity{
|
|||||||
protected void onPostExecute(Camera result) {
|
protected void onPostExecute(Camera result) {
|
||||||
hwCamera = result;
|
hwCamera = result;
|
||||||
if(result != null){
|
if(result != null){
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".onPostExecute() :: Camera successfully opened");
|
Logger.log_d(TAG, CLASS_NAME + ".onPostExecute() :: Camera successfully opened");
|
||||||
}else{
|
}else{
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".onPostExecute() :: Camera open failed on background task.");
|
Logger.log_d(TAG, CLASS_NAME + ".onPostExecute() :: Camera open failed on background task.");
|
||||||
Toast.makeText(getApplicationContext(), R.string.camera_failure, Toast.LENGTH_LONG).show();
|
Toast.makeText(getApplicationContext(), R.string.camera_failure, Toast.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
startCameraPreview();
|
startCameraPreview();
|
||||||
|
|||||||
@@ -4,11 +4,13 @@ import java.io.IOException;
|
|||||||
import java.net.DatagramPacket;
|
import java.net.DatagramPacket;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.MulticastSocket;
|
import java.net.MulticastSocket;
|
||||||
import java.net.UnknownHostException;
|
|
||||||
|
|
||||||
|
import ve.ucv.ciens.ccg.nxtcam.dialogs.WifiOnDialog;
|
||||||
|
import ve.ucv.ciens.ccg.nxtcam.dialogs.WifiOnDialog.WifiOnDialogListener;
|
||||||
import ve.ucv.ciens.ccg.nxtcam.utils.Logger;
|
import ve.ucv.ciens.ccg.nxtcam.utils.Logger;
|
||||||
import ve.ucv.ciens.ccg.nxtcam.utils.ProjectConstants;
|
import ve.ucv.ciens.ccg.nxtcam.utils.ProjectConstants;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.DialogFragment;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
@@ -16,9 +18,6 @@ import android.net.wifi.WifiManager.MulticastLock;
|
|||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.View;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,15 +33,11 @@ import android.widget.Toast;
|
|||||||
* @author miky
|
* @author miky
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class MainActivity extends Activity {
|
public class MainActivity extends Activity implements WifiOnDialogListener{
|
||||||
// Cosntant fields.
|
// Cosntant fields.
|
||||||
private final String TAG = "NXTCAM_MAIN";
|
private final String TAG = "NXTCAM_MAIN";
|
||||||
private final String CLASS_NAME = MainActivity.class.getSimpleName();
|
private final String CLASS_NAME = MainActivity.class.getSimpleName();
|
||||||
|
|
||||||
// Gui components.
|
|
||||||
private Button startButton;
|
|
||||||
//private TextView ipField;
|
|
||||||
|
|
||||||
// Resources.
|
// Resources.
|
||||||
private WifiManager wifiManager;
|
private WifiManager wifiManager;
|
||||||
|
|
||||||
@@ -57,23 +52,18 @@ public class MainActivity extends Activity {
|
|||||||
// Set up fields.
|
// Set up fields.
|
||||||
wifiOnByMe = false;
|
wifiOnByMe = false;
|
||||||
|
|
||||||
// Set up gui components.
|
|
||||||
startButton = (Button)findViewById(R.id.startButton);
|
|
||||||
startButton.setOnClickListener(startClickListener);
|
|
||||||
// ipField = (TextView)findViewById(R.id.ipAddressField);
|
|
||||||
|
|
||||||
// Set up services.
|
// Set up services.
|
||||||
wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
|
wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
|
||||||
if(!wifiManager.isWifiEnabled())
|
|
||||||
setWifi(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResume(){
|
public void onResume(){
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
if(!wifiManager.isWifiEnabled())
|
if(!wifiManager.isWifiEnabled()){
|
||||||
setWifi(true);
|
DialogFragment wifiOn = new WifiOnDialog();
|
||||||
|
wifiOn.show(getFragmentManager(), "wifi_on");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -99,12 +89,12 @@ public class MainActivity extends Activity {
|
|||||||
*/
|
*/
|
||||||
private void startCamActivity(boolean serverFound, String ipAddress){
|
private void startCamActivity(boolean serverFound, String ipAddress){
|
||||||
if(serverFound){
|
if(serverFound){
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".startCamActivity() :: Launching camera activity.");
|
Logger.log_d(TAG, CLASS_NAME + ".startCamActivity() :: Launching camera activity.");
|
||||||
Intent intent = new Intent(this, CamActivity.class);
|
Intent intent = new Intent(this, CamActivity.class);
|
||||||
intent.putExtra("address", ipAddress);
|
intent.putExtra("address", ipAddress);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
}else{
|
}else{
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".startCamActivity() :: Cannot launch camera activity.");
|
Logger.log_d(TAG, CLASS_NAME + ".startCamActivity() :: Cannot launch camera activity.");
|
||||||
Toast.makeText(this, R.string.badIpToast, Toast.LENGTH_SHORT).show();
|
Toast.makeText(this, R.string.badIpToast, Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,36 +106,13 @@ public class MainActivity extends Activity {
|
|||||||
*/
|
*/
|
||||||
private void setWifi(boolean radioState){
|
private void setWifi(boolean radioState){
|
||||||
wifiManager.setWifiEnabled(radioState);
|
wifiManager.setWifiEnabled(radioState);
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".setWifi() :: setting wifi to " + (radioState ? "on" : "off"));
|
Logger.log_d(TAG, CLASS_NAME + ".setWifi() :: setting wifi to " + (radioState ? "on" : "off"));
|
||||||
if(radioState)
|
if(radioState)
|
||||||
wifiOnByMe = true;
|
wifiOnByMe = true;
|
||||||
else
|
else
|
||||||
wifiOnByMe = false;
|
wifiOnByMe = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*private void validateIpAddress(){
|
|
||||||
if(ipField.getText().toString().compareTo("") != 0){
|
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + "validateIpAddress() :: Launching verification task.");
|
|
||||||
VerifyIpAddressTask verifyIp = new VerifyIpAddressTask();
|
|
||||||
verifyIp.execute(ipField.getText().toString());
|
|
||||||
}else{
|
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + "validateIpAddress() :: Ip address field is empty.");
|
|
||||||
Toast.makeText(this, R.string.emptyIpToast, Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event listener for the connection button.
|
|
||||||
*/
|
|
||||||
private final View.OnClickListener startClickListener = new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
//validateIpAddress();
|
|
||||||
ServiceDiscoveryTask serviceDiscovery = new ServiceDiscoveryTask();
|
|
||||||
serviceDiscovery.execute();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asynchronous task for ad hoc UDP service discovery.
|
* Asynchronous task for ad hoc UDP service discovery.
|
||||||
*
|
*
|
||||||
@@ -166,7 +133,7 @@ public class MainActivity extends Activity {
|
|||||||
InetAddress group = InetAddress.getByName(ProjectConstants.MULTICAST_ADDRESS);
|
InetAddress group = InetAddress.getByName(ProjectConstants.MULTICAST_ADDRESS);
|
||||||
udpSocket.joinGroup(group);
|
udpSocket.joinGroup(group);
|
||||||
}catch(IOException io){
|
}catch(IOException io){
|
||||||
Logger.log(Logger.LOG_TYPES.ERROR, TAG ,CLASS_NAME + ".ServiceDiscoveryTask() :: " + io.getMessage());
|
Logger.log_e(TAG ,CLASS_NAME + ".ServiceDiscoveryTask() :: " + io.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,14 +154,14 @@ public class MainActivity extends Activity {
|
|||||||
try{
|
try{
|
||||||
while(!done){
|
while(!done){
|
||||||
udpSocket.receive(packet);
|
udpSocket.receive(packet);
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".run() :: Found a server at " + packet.getAddress().getHostAddress());
|
Logger.log_d(TAG, CLASS_NAME + ".run() :: Found a server at " + packet.getAddress().getHostAddress());
|
||||||
String received = new String(packet.getData());
|
String received = new String(packet.getData());
|
||||||
if(received.compareTo("NxtAR server here!") == 0)
|
if(received.compareTo("NxtAR server here!") == 0)
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
result = true;
|
result = true;
|
||||||
}catch(IOException io){
|
}catch(IOException io){
|
||||||
Logger.log(Logger.LOG_TYPES.ERROR, TAG, CLASS_NAME + ".doInBackground() :: " + io.getMessage());
|
Logger.log_e(TAG, CLASS_NAME + ".doInBackground() :: " + io.getMessage());
|
||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,27 +183,19 @@ public class MainActivity extends Activity {
|
|||||||
else
|
else
|
||||||
startCamActivity(false, null);
|
startCamActivity(false, null);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ServiceDiscoveryTask serviceDiscovery = new ServiceDiscoveryTask();
|
||||||
|
serviceDiscovery.execute(); */
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onWifiOnDialogPositiveClick(DialogFragment dialog) {
|
||||||
|
Toast.makeText(this, R.string.wifi_on_success, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onWifiOnDialogNegativeClick(DialogFragment dialog) {
|
||||||
|
Toast.makeText(this, R.string.wifi_on_fail, Toast.LENGTH_SHORT).show();
|
||||||
|
System.exit(0);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* private class VerifyIpAddressTask extends AsyncTask<String, Void, Boolean>{
|
|
||||||
private final String CLASS_NAME = VerifyIpAddressTask.class.getSimpleName();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Boolean doInBackground(String... params) {
|
|
||||||
try{
|
|
||||||
InetAddress.getByName(params[0]);
|
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + "doInBackground() :: IP address is valid.");
|
|
||||||
return true;
|
|
||||||
}catch(UnknownHostException uh){
|
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + "doInBackground() :: IP address is not valid.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostExecute(Boolean result) {
|
|
||||||
super.onPostExecute(result);
|
|
||||||
startCamActivity(result);
|
|
||||||
}
|
|
||||||
};*/
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,29 +22,29 @@ public class CameraImageMonitor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setImageData(byte[] image){
|
public void setImageData(byte[] image){
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".setImageData() :: Copying new image.");
|
Logger.log_d(TAG, CLASS_NAME + ".setImageData() :: Copying new image.");
|
||||||
synchronized(image){
|
synchronized(image){
|
||||||
this.image = new byte[image.length];
|
this.image = new byte[image.length];
|
||||||
System.arraycopy(image, 0, this.image, 0, image.length);
|
System.arraycopy(image, 0, this.image, 0, image.length);
|
||||||
imgChanged = true;
|
imgChanged = true;
|
||||||
image.notifyAll();
|
image.notifyAll();
|
||||||
}
|
}
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".setImageData() :: Data copy finished.");
|
Logger.log_d(TAG, CLASS_NAME + ".setImageData() :: Data copy finished.");
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getImageData(){
|
public byte[] getImageData(){
|
||||||
byte[] returnImg;
|
byte[] returnImg;
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".getImageData() :: Entry point.");
|
Logger.log_d(TAG, CLASS_NAME + ".getImageData() :: Entry point.");
|
||||||
synchronized(image){
|
synchronized(image){
|
||||||
while(!imgChanged){
|
while(!imgChanged){
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".getImageData() :: Waiting for new data.");
|
Logger.log_d(TAG, CLASS_NAME + ".getImageData() :: Waiting for new data.");
|
||||||
try{ image.wait(); }catch(InterruptedException ie){}
|
try{ image.wait(); }catch(InterruptedException ie){}
|
||||||
}
|
}
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".getImageData() :: Retrieving new data.");
|
Logger.log_d(TAG, CLASS_NAME + ".getImageData() :: Retrieving new data.");
|
||||||
returnImg = image.clone();
|
returnImg = image.clone();
|
||||||
imgChanged = false;
|
imgChanged = false;
|
||||||
}
|
}
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".getImageData() :: New data retreived.");
|
Logger.log_d(TAG, CLASS_NAME + ".getImageData() :: New data retreived.");
|
||||||
return returnImg;
|
return returnImg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
|
|||||||
private final String CLASS_NAME = CameraPreview.class.getSimpleName();
|
private final String CLASS_NAME = CameraPreview.class.getSimpleName();
|
||||||
|
|
||||||
private Size mPreviewSize;
|
private Size mPreviewSize;
|
||||||
private List<Size> mSupportedPreviewSizes;
|
private List<Size> mSupportedPreviewSizes;
|
||||||
private CameraImageMonitor camMonitor;
|
private CameraImageMonitor camMonitor;
|
||||||
private Activity parentActivity;
|
private Activity parentActivity;
|
||||||
private SurfaceView mSurfaceView;
|
private SurfaceView mSurfaceView;
|
||||||
@@ -42,7 +42,7 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
|
|||||||
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB)
|
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB)
|
||||||
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
|
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCamera(Camera camera){
|
public void setCamera(Camera camera){
|
||||||
mCamera = camera;
|
mCamera = camera;
|
||||||
if(mCamera != null){
|
if(mCamera != null){
|
||||||
@@ -59,7 +59,7 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
|
|||||||
mCamera.setPreviewDisplay(holder);
|
mCamera.setPreviewDisplay(holder);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, "Error setting camera preview: " + e.getMessage());
|
Logger.log_d(TAG, "Error setting camera preview: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
|
|||||||
}catch (Exception e){ }
|
}catch (Exception e){ }
|
||||||
|
|
||||||
requestLayout();
|
requestLayout();
|
||||||
|
|
||||||
Camera.Parameters camParams = mCamera.getParameters();
|
Camera.Parameters camParams = mCamera.getParameters();
|
||||||
/*Size optimal = getOptimalPreviewSize(camParams.getSupportedPreviewSizes(), w, h);
|
/*Size optimal = getOptimalPreviewSize(camParams.getSupportedPreviewSizes(), w, h);
|
||||||
if(ProjectConstants.DEBUG)
|
if(ProjectConstants.DEBUG)
|
||||||
@@ -109,20 +109,20 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
|
|||||||
mCamera.setDisplayOrientation(result);
|
mCamera.setDisplayOrientation(result);
|
||||||
|
|
||||||
mCamera.setPreviewCallback(this);
|
mCamera.setPreviewCallback(this);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mCamera.setPreviewDisplay(mHolder);
|
mCamera.setPreviewDisplay(mHolder);
|
||||||
mCamera.startPreview();
|
mCamera.startPreview();
|
||||||
|
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".surfaceChanged() :: Error starting camera preview: " + e.getMessage());
|
Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged() :: Error starting camera preview: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPreviewFrame(byte[] data, Camera camera){
|
public void onPreviewFrame(byte[] data, Camera camera){
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".onPreviewFrame() :: Preview received");
|
Logger.log_d(TAG, CLASS_NAME + ".onPreviewFrame() :: Preview received");
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".onPreviewFrame() :: Frame has" + (camMonitor.hasChanged() ? "" : " not") + " changed.");
|
Logger.log_d(TAG, CLASS_NAME + ".onPreviewFrame() :: Frame has" + (camMonitor.hasChanged() ? "" : " not") + " changed.");
|
||||||
if(!camMonitor.hasChanged())
|
if(!camMonitor.hasChanged())
|
||||||
camMonitor.setImageData(data);
|
camMonitor.setImageData(data);
|
||||||
}
|
}
|
||||||
@@ -132,74 +132,74 @@ public class CameraPreview extends ViewGroup implements SurfaceHolder.Callback,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
|
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
|
||||||
final double ASPECT_TOLERANCE = 0.1;
|
final double ASPECT_TOLERANCE = 0.1;
|
||||||
double targetRatio = (double) w / h;
|
double targetRatio = (double) w / h;
|
||||||
if (sizes == null) return null;
|
if (sizes == null) return null;
|
||||||
|
|
||||||
Size optimalSize = null;
|
Size optimalSize = null;
|
||||||
double minDiff = Double.MAX_VALUE;
|
double minDiff = Double.MAX_VALUE;
|
||||||
|
|
||||||
int targetHeight = h;
|
int targetHeight = h;
|
||||||
|
|
||||||
// Try to find an size match aspect ratio and size
|
// Try to find an size match aspect ratio and size
|
||||||
for (Size size : sizes) {
|
for (Size size : sizes) {
|
||||||
double ratio = (double) size.width / size.height;
|
double ratio = (double) size.width / size.height;
|
||||||
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
|
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
|
||||||
if (Math.abs(size.height - targetHeight) < minDiff) {
|
if (Math.abs(size.height - targetHeight) < minDiff) {
|
||||||
optimalSize = size;
|
optimalSize = size;
|
||||||
minDiff = Math.abs(size.height - targetHeight);
|
minDiff = Math.abs(size.height - targetHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cannot find the one match the aspect ratio, ignore the requirement
|
// Cannot find the one match the aspect ratio, ignore the requirement
|
||||||
if (optimalSize == null) {
|
if (optimalSize == null) {
|
||||||
minDiff = Double.MAX_VALUE;
|
minDiff = Double.MAX_VALUE;
|
||||||
for (Size size : sizes) {
|
for (Size size : sizes) {
|
||||||
if (Math.abs(size.height - targetHeight) < minDiff) {
|
if (Math.abs(size.height - targetHeight) < minDiff) {
|
||||||
optimalSize = size;
|
optimalSize = size;
|
||||||
minDiff = Math.abs(size.height - targetHeight);
|
minDiff = Math.abs(size.height - targetHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return optimalSize;
|
return optimalSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||||
if (changed && getChildCount() > 0) {
|
if (changed && getChildCount() > 0) {
|
||||||
final View child = getChildAt(0);
|
final View child = getChildAt(0);
|
||||||
|
|
||||||
final int width = r - l;
|
final int width = r - l;
|
||||||
final int height = b - t;
|
final int height = b - t;
|
||||||
|
|
||||||
int previewWidth = width;
|
int previewWidth = width;
|
||||||
int previewHeight = height;
|
int previewHeight = height;
|
||||||
if (mPreviewSize != null) {
|
if (mPreviewSize != null) {
|
||||||
previewWidth = mPreviewSize.width;
|
previewWidth = mPreviewSize.width;
|
||||||
previewHeight = mPreviewSize.height;
|
previewHeight = mPreviewSize.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Center the child SurfaceView within the parent.
|
// Center the child SurfaceView within the parent.
|
||||||
if (width * previewHeight > height * previewWidth) {
|
if (width * previewHeight > height * previewWidth) {
|
||||||
final int scaledChildWidth = previewWidth * height / previewHeight;
|
final int scaledChildWidth = previewWidth * height / previewHeight;
|
||||||
child.layout((width - scaledChildWidth) / 2, 0,
|
child.layout((width - scaledChildWidth) / 2, 0,
|
||||||
(width + scaledChildWidth) / 2, height);
|
(width + scaledChildWidth) / 2, height);
|
||||||
} else {
|
} else {
|
||||||
final int scaledChildHeight = previewHeight * width / previewWidth;
|
final int scaledChildHeight = previewHeight * width / previewWidth;
|
||||||
child.layout(0, (height - scaledChildHeight) / 2,
|
child.layout(0, (height - scaledChildHeight) / 2,
|
||||||
width, (height + scaledChildHeight) / 2);
|
width, (height + scaledChildHeight) / 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
||||||
final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
|
|
||||||
final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
|
|
||||||
setMeasuredDimension(width, height);
|
|
||||||
|
|
||||||
if (mSupportedPreviewSizes != null) {
|
@Override
|
||||||
mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
}
|
final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
|
||||||
}
|
final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
|
||||||
|
setMeasuredDimension(width, height);
|
||||||
|
|
||||||
|
if (mSupportedPreviewSizes != null) {
|
||||||
|
mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
62
src/ve/ucv/ciens/ccg/nxtcam/dialogs/WifiOnDialog.java
Normal file
62
src/ve/ucv/ciens/ccg/nxtcam/dialogs/WifiOnDialog.java
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
package ve.ucv.ciens.ccg.nxtcam.dialogs;
|
||||||
|
|
||||||
|
import ve.ucv.ciens.ccg.nxtcam.R;
|
||||||
|
import ve.ucv.ciens.ccg.nxtcam.utils.Logger;
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.app.DialogFragment;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.net.wifi.WifiManager;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
public class WifiOnDialog extends DialogFragment {
|
||||||
|
private final String TAG = "NXTCAM_MAIN";
|
||||||
|
private final String CLASS_NAME = WifiOnDialog.class.getSimpleName();
|
||||||
|
|
||||||
|
private WifiManager wifiManager;
|
||||||
|
|
||||||
|
public interface WifiOnDialogListener{
|
||||||
|
public void onWifiOnDialogPositiveClick(DialogFragment dialog);
|
||||||
|
public void onWifiOnDialogNegativeClick(DialogFragment dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWifiManager(WifiManager wifiManager){
|
||||||
|
this.wifiManager = wifiManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
// Use the Builder class for convenient dialog construction
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
|
||||||
|
builder.setMessage(R.string.wifi_on_msg).setPositiveButton(R.string.wifi_on_button, new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
|
if(wifiManager != null){
|
||||||
|
wifiManager.setWifiEnabled(true);
|
||||||
|
Logger.log_d(TAG, CLASS_NAME + " :: setting wifi to on.");
|
||||||
|
}else
|
||||||
|
Logger.log_wtf(TAG, CLASS_NAME + " :: wifiManager is null! Doing nothing.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}).setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
|
public void onClick(DialogInterface dialog, int id) { }
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create the AlertDialog object and return it
|
||||||
|
return builder.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttach(Activity activity){
|
||||||
|
try{
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
WifiOnDialogListener listener = (WifiOnDialogListener)activity;
|
||||||
|
}catch(ClassCastException cce){
|
||||||
|
throw new ClassCastException(activity.toString() + "Must implement WifiOnDialogListener.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,14 +10,13 @@ import java.net.Socket;
|
|||||||
|
|
||||||
import ve.ucv.ciens.ccg.nxtcam.camera.CameraImageMonitor;
|
import ve.ucv.ciens.ccg.nxtcam.camera.CameraImageMonitor;
|
||||||
import ve.ucv.ciens.ccg.nxtcam.utils.Logger;
|
import ve.ucv.ciens.ccg.nxtcam.utils.Logger;
|
||||||
import ve.ucv.ciens.ccg.nxtcam.utils.Logger.LOG_TYPES;
|
|
||||||
import ve.ucv.ciens.ccg.nxtcam.utils.ProjectConstants;
|
import ve.ucv.ciens.ccg.nxtcam.utils.ProjectConstants;
|
||||||
|
|
||||||
public class ImageTransferThread extends Thread{
|
public class ImageTransferThread extends Thread{
|
||||||
private final String TAG = "IM_THREAD";
|
private final String TAG = "IM_THREAD";
|
||||||
private final String CLASS_NAME = ImageTransferThread.class.getSimpleName();
|
private final String CLASS_NAME = ImageTransferThread.class.getSimpleName();
|
||||||
|
|
||||||
private boolean pause, done, connected;
|
private boolean pause, done;
|
||||||
private Object threadPauseMonitor;
|
private Object threadPauseMonitor;
|
||||||
private CameraImageMonitor camMonitor;
|
private CameraImageMonitor camMonitor;
|
||||||
private Socket socket;
|
private Socket socket;
|
||||||
@@ -30,7 +29,6 @@ public class ImageTransferThread extends Thread{
|
|||||||
this.serverIp = serverIp;
|
this.serverIp = serverIp;
|
||||||
pause = false;
|
pause = false;
|
||||||
done = false;
|
done = false;
|
||||||
connected = false;
|
|
||||||
threadPauseMonitor = new Object();
|
threadPauseMonitor = new Object();
|
||||||
socket = null;
|
socket = null;
|
||||||
writer = null;
|
writer = null;
|
||||||
@@ -41,7 +39,7 @@ public class ImageTransferThread extends Thread{
|
|||||||
public void run(){
|
public void run(){
|
||||||
connectToServer();
|
connectToServer();
|
||||||
if(socket.isConnected()){
|
if(socket.isConnected()){
|
||||||
Logger.log(Logger.LOG_TYPES.ERROR, TAG, CLASS_NAME + ".run() :: Not connected to a server. Finishing thread.");
|
Logger.log_e(TAG, CLASS_NAME + ".run() :: Not connected to a server. Finishing thread.");
|
||||||
}else{
|
}else{
|
||||||
while(!done){
|
while(!done){
|
||||||
checkPause();
|
checkPause();
|
||||||
@@ -53,13 +51,13 @@ public class ImageTransferThread extends Thread{
|
|||||||
|
|
||||||
private void connectToServer(){
|
private void connectToServer(){
|
||||||
try{
|
try{
|
||||||
Logger.log(Logger.LOG_TYPES.INFO, TAG, CLASS_NAME + ".connectToServer() :: Connecting to the server at " + serverIp);
|
Logger.log_i(TAG, CLASS_NAME + ".connectToServer() :: Connecting to the server at " + serverIp);
|
||||||
socket = new Socket(InetAddress.getByName(serverIp), ProjectConstants.SERVER_TCP_PORT_1);
|
socket = new Socket(InetAddress.getByName(serverIp), ProjectConstants.SERVER_TCP_PORT_1);
|
||||||
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
|
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
|
||||||
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||||
Logger.log(Logger.LOG_TYPES.INFO, TAG, CLASS_NAME + ".connectToServer() :: Connection successful.");
|
Logger.log_i(TAG, CLASS_NAME + ".connectToServer() :: Connection successful.");
|
||||||
}catch(IOException io){
|
}catch(IOException io){
|
||||||
Logger.log(Logger.LOG_TYPES.ERROR, TAG, CLASS_NAME + ".connectToServer() :: Connection failed with message: " + io.getMessage());
|
Logger.log_e(TAG, CLASS_NAME + ".connectToServer() :: Connection failed with message: " + io.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,20 +66,20 @@ public class ImageTransferThread extends Thread{
|
|||||||
try{
|
try{
|
||||||
socket.close();
|
socket.close();
|
||||||
}catch (IOException io) {
|
}catch (IOException io) {
|
||||||
Logger.log(Logger.LOG_TYPES.ERROR, TAG, CLASS_NAME + ".connectToServer() :: " + io.getMessage());
|
Logger.log_e(TAG, CLASS_NAME + ".connectToServer() :: " + io.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void finish(){
|
public synchronized void finish(){
|
||||||
done = true;
|
done = true;
|
||||||
Logger.log(Logger.LOG_TYPES.INFO, TAG, CLASS_NAME + ".finish() :: Finishing thread.");
|
Logger.log_i(TAG, CLASS_NAME + ".finish() :: Finishing thread.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkPause(){
|
private void checkPause(){
|
||||||
synchronized (threadPauseMonitor){
|
synchronized (threadPauseMonitor){
|
||||||
while(pause){
|
while(pause){
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".checkPause() :: Pause requested.");
|
Logger.log_d(TAG, CLASS_NAME + ".checkPause() :: Pause requested.");
|
||||||
try{ threadPauseMonitor.wait(); }catch(InterruptedException ie){}
|
try{ threadPauseMonitor.wait(); }catch(InterruptedException ie){}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -89,11 +87,11 @@ public class ImageTransferThread extends Thread{
|
|||||||
|
|
||||||
public synchronized void pauseThread(){
|
public synchronized void pauseThread(){
|
||||||
pause = true;
|
pause = true;
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".pauseThread() :: Pausing thread.");
|
Logger.log_d(TAG, CLASS_NAME + ".pauseThread() :: Pausing thread.");
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void resumeThread(){
|
public synchronized void resumeThread(){
|
||||||
Logger.log(Logger.LOG_TYPES.DEBUG, TAG, CLASS_NAME + ".resumeThread() :: Resuming thread.");
|
Logger.log_d(TAG, CLASS_NAME + ".resumeThread() :: Resuming thread.");
|
||||||
synchronized (threadPauseMonitor) {
|
synchronized (threadPauseMonitor) {
|
||||||
pause = false;
|
pause = false;
|
||||||
threadPauseMonitor.notifyAll();
|
threadPauseMonitor.notifyAll();
|
||||||
|
|||||||
@@ -3,30 +3,27 @@ package ve.ucv.ciens.ccg.nxtcam.utils;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
public abstract class Logger {
|
public abstract class Logger {
|
||||||
public static enum LOG_TYPES{ DEBUG, INFO, WARN, ERROR, VERBOSE, WTF }
|
public static void log_d(String tag, String msg){
|
||||||
|
if(ProjectConstants.DEBUG) Log.d(tag, msg);
|
||||||
public static void log(LOG_TYPES log_type, String tag, String msg){
|
}
|
||||||
if(ProjectConstants.DEBUG){
|
|
||||||
switch(log_type){
|
public static void log_i(String tag, String msg){
|
||||||
case DEBUG:
|
if(ProjectConstants.DEBUG) Log.i(tag, msg);
|
||||||
Log.d(tag, msg);
|
}
|
||||||
break;
|
|
||||||
case INFO:
|
public static void log_v(String tag, String msg){
|
||||||
Log.i(tag, msg);
|
if(ProjectConstants.DEBUG) Log.v(tag, msg);
|
||||||
break;
|
}
|
||||||
case WARN:
|
|
||||||
Log.w(tag, msg);
|
public static void log_w(String tag, String msg){
|
||||||
break;
|
if(ProjectConstants.DEBUG) Log.w(tag, msg);
|
||||||
case ERROR:
|
}
|
||||||
Log.e(tag, msg);
|
|
||||||
break;
|
public static void log_e(String tag, String msg){
|
||||||
case VERBOSE:
|
if(ProjectConstants.DEBUG) Log.e(tag, msg);
|
||||||
Log.v(tag, msg);
|
}
|
||||||
break;
|
|
||||||
case WTF:
|
public static void log_wtf(String tag, String msg){
|
||||||
Log.wtf(tag, msg);
|
if(ProjectConstants.DEBUG) Log.wtf(tag, msg);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user