package com.mygoproremote; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Timer; import java.util.TimerTask; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.StatusLine; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.gopro.core.GoProHelper; import org.gopro.core.model.BacPacStatus; import org.gopro.core.model.CamFields; import org.gopro.main.GoProApi; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.StrictMode; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class FullscreenActivity extends Activity { static String GoproPassword = ""; public int refresh_status = 2; public int timeout = 2; private static String URL = "http://10.5.5.9/bacpac/sd"; String libFov[] = {"W","M","N"}; String libPhotoRes[] = {"11MP","8MP","5MP","5MP","7MP","12MP","7MP"}; String libPhotoAngle[] = {"W","M","W","M","W","W","M"}; String libBurstRate[] = {"3/1 SEC","5/1 SEC","10/1 SEC","10/2 SEC","30/1 SEC","30/2 SEC","30/3 SEC"}; String libVidres[] = {"WVGA","720","960","1080","1440","2.7K","4K","2.7K Cin","4K Cin","1080Super","720Super"}; String libFps[]={"12","15","24","25","30","48","50","60","100","120","240" }; public String camname,version; public int Model=0,lastmode=0,cammode=0,currentshutter=0,busy_error=0; Drawable ledred,ledblue,exposure,balence; Handler mHandler; Timer timer; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fullscreen); final Button button_Record = (Button) findViewById(R.id.Record); final Button button_Mode = (Button) findViewById(R.id.Mode); final Button button_Preview = (Button) findViewById(R.id.Preview); // button_Preview.setEnabled(false); // button_Preview.setClickable(false); // button_Preview.setFocusable(false); button_Record.setEnabled(false); button_Record.setClickable(false); button_Record.setFocusable(false); button_Mode.setEnabled(false); button_Mode.setClickable(false); button_Mode.setFocusable(false); TextView tv = (TextView) findViewById(R.id.status_ligne3); Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/ladyic.ttf"); tv.setTypeface(tf); tv.setTextSize(100); checkGopro(); GoproPassword = getPassword(); if (GoproPassword!="") { button_Mode.setEnabled(true); button_Mode.setClickable(true); button_Mode.setFocusable(true); ImageView led_blue = (ImageView) findViewById(R.id.blue); Resources res = getResources(); ledblue = res.getDrawable(R.drawable.led_blue_on); led_blue.setImageDrawable(ledblue); button_Preview.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { System.out.println("Preview On"); final GlobalClass globalVariable = (GlobalClass) getApplicationContext(); //Set name and email in global/application context globalVariable.setpassword(GoproPassword); globalVariable.setMode(lastmode); timer.cancel(); Intent i = new Intent(getApplicationContext(), PreviewActivity.class); i.putExtra("busy_activite",1); startActivity(i); } }); button_Record.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { GoProApi gopro = new GoProApi(GoproPassword); if (currentshutter==0) { try { System.out.println("Record On"); gopro.getHelper().startRecord(); // button_Preview.setEnabled(false); // button_Preview.setClickable(false); // button_Preview.setFocusable(false); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("Error in /Record On/"); } } else { try { System.out.println("Record Off"); gopro.getHelper().stopRecord(); // button_Preview.setEnabled(true); // button_Preview.setClickable(true); // button_Preview.setFocusable(true); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("Error in /Record Off/"); } } } }); button_Mode.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { // TODO auto-generated method stub GoProApi gopro = new GoProApi(GoproPassword); GoProHelper helper = gopro.getHelper(); try { BacPacStatus bacpacStatus = helper.getBacpacStatus(); if (bacpacStatus.isCameraPowerOn()) { // la camera est on, donc on l'eteind gopro.getHelper().turnOffCamera(); System.out.println("Power Off"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("Error in /Power Off/"); } return true; } }); button_Mode.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { GoProApi gopro = new GoProApi(GoproPassword); GoProHelper helper = gopro.getHelper(); try { BacPacStatus bacpacStatus = helper.getBacpacStatus(); if (bacpacStatus.isCameraPowerOn()) { try { System.out.println("Mode suivant"); // la camera est on, donc on change le Mode switch (lastmode) { case 0 : gopro.getHelper().modePhoto(); break; case 1 : gopro.getHelper().modeBurst(); break; case 2 : gopro.getHelper().timelapse1(); break; default: gopro.getHelper().modeCamera(); break; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("exception1"); } } else { try { gopro.getHelper().turnOnCamera(); System.out.println("Power On"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("Error in /Power On/"); } } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); } } @Override public void onResume() { super.onResume(); timer = new Timer(); TimerTask updateProfile = new CustomTimerTask(FullscreenActivity.this); timer.scheduleAtFixedRate(updateProfile, 0, refresh_status*1000); } // // BOUCLE DE STATUS // // class CustomTimerTask extends TimerTask { private Context context; private Handler mHandler = new Handler(); public CustomTimerTask(Context con) { this.context = con; } // Runnable runnable = new Runnable() { @Override public void run() { new Thread(new Runnable() { @Override public void run() { mHandler.post(new Runnable() { @Override public void run() { // // Boucle de status // GoProApi gopro = new GoProApi(GoproPassword); GoProHelper helper = gopro.getHelper(); TextView Status1 = (TextView) findViewById(R.id.status_ligne1); TextView Status4 = (TextView) findViewById(R.id.status_ligne4); TextView Status2 = (TextView) findViewById(R.id.status_ligne2); TextView Status3 = (TextView) findViewById(R.id.status_ligne3); Button button_Record = (Button) findViewById(R.id.Record); Button button_Mode = (Button) findViewById(R.id.Mode); Button button_Preview = (Button) findViewById(R.id.Preview); Typeface tf = Typeface.createFromAsset(getAssets(),"fonts/ladyic.ttf"); Status3.setTypeface(tf); Status3.setTextSize(72); ImageView BatteryLeft = (ImageView) findViewById(R.id.image_battery); ImageView wifistatus = (ImageView) findViewById(R.id.Image_wifi); ImageView image_mode = (ImageView) findViewById(R.id.image_mode); ImageView image_expo = (ImageView) findViewById(R.id.image_expo); ImageView image_balence = (ImageView) findViewById(R.id.image_balence); ImageView led_red = (ImageView) findViewById(R.id.red); ImageView led_blue = (ImageView) findViewById(R.id.blue); Resources res = getResources(); Drawable drawwifi = res.getDrawable(R.drawable.iconwifi0); ledblue = res.getDrawable(R.drawable.led_blue_on); led_blue.setImageDrawable(ledblue); button_Mode.setEnabled(true); button_Mode.setClickable(true); button_Mode.setFocusable(true); image_expo.setVisibility(View.INVISIBLE); image_balence.setVisibility(View.INVISIBLE); try { BacPacStatus bacpacStatus = helper.getBacpacStatus(); CamFields camFields; int wifiLevel = bacpacStatus.getRSSI(); if (bacpacStatus.isCameraPowerOn()) { try { camFields=helper.getCameraInfo(); Model = camFields.getModel(); version = camFields.getVersion(); camname = camFields.getCamname(); } catch (Exception e2) { e2.printStackTrace(); } camFields = helper.getCameraSettings(); int getBattery = camFields.getBattery(); camFields = helper.getCameraSettingsExtended(); int BatteryOn = camFields.getBattery(); int currentMode = camFields.getMode(); int currentAngle = camFields.getFieldOfView(); int currentPhotoRes = camFields.getPhotoResolution(); int currentProtuneEnabled=camFields.getProtuneEnabled(); String libProtune; if (currentProtuneEnabled==6) libProtune=" Pt"; else libProtune=" "; int currentProtuneSetting=camFields.getProtuneSetting(); int currentExposure = camFields.getExposure(); if (currentExposure==1) { exposure = res.getDrawable(R.drawable.exposure); image_expo.setImageDrawable(exposure); image_expo.setVisibility(View.VISIBLE); } int currentBurstRate = camFields.getBurstRate(); int currentVideoRes =camFields.getVidres(); int currentfps = camFields.getFramesPerSecond(); int currentTimelapse = camFields.getTimeLapse(); long currentNbrePhotos = 0; String ScurrentNbrePhotos; currentNbrePhotos = camFields.getPhotosOncard(); if (currentNbrePhotos<10) { ScurrentNbrePhotos="0"+String.valueOf(currentNbrePhotos); } else { ScurrentNbrePhotos=String.valueOf(currentNbrePhotos); } long currentNbreVideos = 0; String ScurrentNbreVideos; currentNbreVideos = camFields.getVideoOncard(); if (currentNbreVideos<10) { ScurrentNbreVideos="0"+String.valueOf(currentNbreVideos); } else { ScurrentNbreVideos=String.valueOf(currentNbreVideos); } long FreePhotos = camFields.getPhotosAvailable(); long FreeVideos = camFields.getVideoAvailable(); long hours, minutes; if (FreeVideos!=65535) { hours = FreeVideos / 60; //since both are ints, you get an int minutes = FreeVideos % 60; } else { hours = 0; minutes = 0; } String FreeTime = String.format("%d H %02d", hours, minutes); currentshutter = camFields.getShutter(); int RecordingSec = camFields.getPlaybackSec(); int RecordingMin = camFields.getPlaybackMin(); String libTimelapse; if (currentTimelapse == 0) { libTimelapse="0.5"; } else { libTimelapse = String.valueOf(currentTimelapse); } Drawable drawPower = res.getDrawable(R.drawable.iconepower4); if (isBetween(getBattery, 72, 100)) drawPower = res.getDrawable(R.drawable.iconepower3); if (isBetween(getBattery, 42, 71)) drawPower = res.getDrawable(R.drawable.iconepower2); if (isBetween(getBattery, 12, 41)) drawPower = res.getDrawable(R.drawable.iconepower1); if (isBetween(getBattery, 0, 11)) drawPower = res.getDrawable(R.drawable.iconepower00); if (BatteryOn==4) drawPower = res.getDrawable(R.drawable.iconepowerac); BatteryLeft.setImageDrawable(drawPower); lastmode=currentMode; switch (currentMode) { case 0 : image_mode.setBackgroundResource(R.drawable.mode1); if (currentProtuneSetting>0) { balence = res.getDrawable(R.drawable.whitebalance); image_balence.setImageDrawable(balence); image_balence.setVisibility(View.VISIBLE); } Status1.setText(libFov[currentAngle]+libProtune); if (currentshutter==0) { Status2.setText(libVidres[currentVideoRes]+" / "+libFps[currentfps]); ledred = res.getDrawable(R.drawable.led_red_off); led_red.setImageDrawable(ledred); Status3.setText(ScurrentNbreVideos); Status4.setText(FreeTime); button_Preview.setEnabled(true); button_Preview.setClickable(true); button_Preview.setFocusable(true); } else { Status2.setText(libVidres[currentVideoRes]+" / "+libFps[currentfps]); String libRecording; if (RecordingMin<10) { libRecording="0"+RecordingMin+":"; } else { libRecording=RecordingMin+":"; } if (RecordingSec<10) { libRecording+="0"+RecordingSec; } else { libRecording+=RecordingSec; } ledred = res.getDrawable(R.drawable.led_red_on); led_red.setImageDrawable(ledred); Status3.setText(libRecording); Status4.setText(FreeTime); button_Preview.setEnabled(false); button_Preview.setClickable(false); button_Preview.setFocusable(false); } break; case 1 : image_mode.setBackgroundResource(R.drawable.mode2); Status1.setText(libPhotoAngle[currentPhotoRes]); Status2.setText(libPhotoRes[currentPhotoRes]); Status3.setText(ScurrentNbrePhotos); Status4.setText(String.valueOf(FreePhotos)); break; case 2 : image_mode.setBackgroundResource(R.drawable.mode3); Status1.setText(libPhotoAngle[currentPhotoRes]); Status2.setText(libPhotoRes[currentPhotoRes]+" - "+libBurstRate[currentBurstRate]); Status3.setText(ScurrentNbrePhotos); Status4.setText(String.valueOf(FreePhotos)); break; case 3 : image_mode.setBackgroundResource(R.drawable.mode4); Status1.setText(libPhotoAngle[currentPhotoRes]); Status2.setText(libPhotoRes[currentPhotoRes]+" - "+libTimelapse+" SEC"); Status3.setText(String.valueOf(currentNbrePhotos)); Status4.setText(String.valueOf(FreePhotos)); break; } if (currentNbreVideos==65535) { Status3.setText(""); } BatteryLeft.setVisibility(View.VISIBLE); wifistatus.setVisibility(View.VISIBLE); Status1.setVisibility(View.VISIBLE); Status2.setVisibility(View.VISIBLE); Status3.setVisibility(View.VISIBLE); Status4.setVisibility(View.VISIBLE); image_mode.setVisibility(View.VISIBLE); ledblue = res.getDrawable(R.drawable.led_blue_on); led_blue.setImageDrawable(ledblue); button_Record.setEnabled(true); button_Record.setClickable(true); button_Record.setFocusable(true); switch (wifiLevel) { case 0 : drawwifi = res.getDrawable(R.drawable.iconwifi0); break; case 1 : drawwifi = res.getDrawable(R.drawable.iconwifi1); break; case 2 : drawwifi = res.getDrawable(R.drawable.iconwifi2); break; case 3 : drawwifi = res.getDrawable(R.drawable.iconwifi3); break; case 4 : drawwifi = res.getDrawable(R.drawable.iconwifi4); break; } wifistatus.setImageDrawable(drawwifi); } else { wifistatus.setVisibility(View.INVISIBLE); BatteryLeft.setVisibility(View.INVISIBLE); Status1.setVisibility(View.INVISIBLE); Status2.setVisibility(View.INVISIBLE); Status3.setVisibility(View.INVISIBLE); Status4.setVisibility(View.INVISIBLE); image_mode.setVisibility(View.INVISIBLE); button_Preview.setEnabled(false); button_Preview.setClickable(false); button_Preview.setFocusable(false); button_Record.setEnabled(false); button_Record.setClickable(false); button_Record.setFocusable(false); } busy_error=0; } catch (Exception e) { // TODO Auto-generated catch block busy_error++; if (busy_error==timeout) { System.out.println("Erreur reading settings from Gopro..."); Status2.setText("GoPro not found"); wifistatus.setVisibility(View.INVISIBLE); BatteryLeft.setVisibility(View.INVISIBLE); Status1.setVisibility(View.INVISIBLE); Status3.setVisibility(View.INVISIBLE); Status4.setVisibility(View.INVISIBLE); image_mode.setVisibility(View.INVISIBLE); Status2.setVisibility(View.VISIBLE); button_Preview.setEnabled(false); button_Preview.setClickable(false); button_Preview.setFocusable(false); button_Record.setEnabled(false); button_Record.setClickable(false); button_Record.setFocusable(false); button_Mode.setEnabled(false); button_Mode.setClickable(false); button_Mode.setFocusable(false); ledblue = res.getDrawable(R.drawable.led_blue_off); led_blue.setImageDrawable(ledblue); } e.printStackTrace(); } } }); } }).start(); } }; // @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); } protected void onDestroy() { // TODO Auto-generated method stub super.onStop(); System.exit(0); } public String getPassword() { String localObject = "", localObject1 = ""; try { HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = null; response = httpclient.execute(new HttpGet(URL)); StatusLine statusLine = response.getStatusLine(); if(statusLine.getStatusCode() == HttpStatus.SC_OK){ ByteArrayOutputStream out = new ByteArrayOutputStream(); response.getEntity().writeTo(out); out.close(); localObject1 = out.toString(); } localObject=localObject1.substring(2); } catch (Exception e) { e.printStackTrace(); Toast.makeText(FullscreenActivity.this, "GoPro not found", Toast.LENGTH_LONG).show(); System.out.println("GoPro not found..." ); TextView Status2 = (TextView) findViewById(R.id.status_ligne2); Status2.setText("GoPro not found"); } return (String) localObject; } public static boolean isBetween(int x, int lower, int upper) { return lower <= x && x <= upper; } public static String getTwoDecimalsValue(long value) { if(value>=0 && value<=9) { return "0"+value; } else { return value+"";} } public static boolean isPortOpen(final String ip, final int port, final int timeout) { InetAddress in =null; try { in = InetAddress.getByName(ip); } catch (UnknownHostException e) { e.printStackTrace(); } try { if (in.isReachable(timeout)) { return true; } else { return false; } } catch (IOException e) { // TODO Auto-generated catch block return false; } } public void checkGopro() { boolean opened = false; StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); opened=isPortOpen("10.5.5.9",80,4000); if (opened) { System.out.println("Check gopro : found"); } else { System.out.println("Check gopro : not found"); startActivity(new Intent(FullscreenActivity.this, GoproNotFound.class)); } } }