diff --git a/Sample Code/app/build.gradle b/Sample Code/app/build.gradle index 6cdd42ff..7f593193 100644 --- a/Sample Code/app/build.gradle +++ b/Sample Code/app/build.gradle @@ -76,7 +76,7 @@ android { dependencies { implementation 'androidx.multidex:multidex:2.0.0' implementation 'com.squareup:otto:1.3.8' - implementation('com.dji:dji-sdk:4.14-trial1', { + implementation('com.dji:dji-sdk:4.14', { /** * Uncomment the "library-anti-distortion" if your app does not need Anti Distortion for Mavic 2 Pro and Mavic 2 Zoom. * Uncomment the "fly-safe-database" if you need database for release, or we will download it when DJISDKManager.getInstance().registerApp @@ -84,11 +84,9 @@ dependencies { * Both will greatly reducing the size of the APK. */ exclude module: 'library-anti-distortion' - exclude module: 'utmiss' //exclude module: 'fly-safe-database' }) - implementation 'com.dji:utmiss:1.0.8' - compileOnly 'com.dji:dji-sdk-provided:4.14-trial1' + compileOnly 'com.dji:dji-sdk-provided:4.14' implementation 'androidx.appcompat:appcompat:1.0.0' implementation 'androidx.core:core:1.0.0' diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/camera/RecordVideoView.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/camera/RecordVideoView.java index 5417a624..45cd459c 100644 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/camera/RecordVideoView.java +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/camera/RecordVideoView.java @@ -13,8 +13,6 @@ import java.util.concurrent.TimeUnit; import dji.common.camera.SettingsDefinitions; -import dji.common.error.DJIError; -import dji.common.util.CommonCallbacks; /** * Created by dji on 16/1/6. diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/missionoperator/WaypointMissionOperatorView.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/missionoperator/WaypointMissionOperatorView.java index 674b9440..e35fde5e 100644 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/missionoperator/WaypointMissionOperatorView.java +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/missionoperator/WaypointMissionOperatorView.java @@ -4,9 +4,6 @@ import android.util.Log; import android.view.View; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - import com.dji.sdk.sample.R; import com.dji.sdk.sample.demo.missionmanager.MissionBaseView; import com.dji.sdk.sample.internal.controller.DJISampleApplication; @@ -14,8 +11,9 @@ import java.util.ArrayList; import java.util.List; -import java.util.Random; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import dji.common.error.DJIError; import dji.common.flightcontroller.FlightControllerState; import dji.common.flightcontroller.simulator.InitializationData; @@ -31,6 +29,7 @@ import dji.common.mission.waypoint.WaypointMissionHeadingMode; import dji.common.mission.waypoint.WaypointMissionState; import dji.common.mission.waypoint.WaypointMissionUploadEvent; +import dji.common.mission.waypoint.WaypointTurnMode; import dji.common.model.LocationCoordinate2D; import dji.common.util.CommonCallbacks; import dji.keysdk.FlightControllerKey; @@ -45,132 +44,118 @@ import static dji.keysdk.FlightControllerKey.HOME_LOCATION_LATITUDE; import static dji.keysdk.FlightControllerKey.HOME_LOCATION_LONGITUDE; -/** - * Class for waypoint mission. - */ public class WaypointMissionOperatorView extends MissionBaseView { + private static final double BASE_LATITUDE = 22; + private static final double BASE_LONGITUDE = 113; + private static final int REFRESH_FREQ = 10; + private static final int SATELLITE_COUNT = 10; + private static final int MAX_HEIGHT = 500; + private static final int MAX_RADIUS = 500; private static final double ONE_METER_OFFSET = 0.00000899322; - private static final String TAG = WaypointMissionOperatorView.class.getSimpleName(); - private WaypointMissionOperator waypointMissionOperator; - private WaypointMission mission; + private static final double HORIZONTAL_DISTANCE = 30; + private static final double VERTICAL_DISTANCE = 30; + + private WaypointMissionOperator waypointMissionOperator = null; + private FlightController flightController = null; + private WaypointMission mission = null; private WaypointMissionOperatorListener listener; - private final int WAYPOINT_COUNT = 5; + private static final int WAYPOINT_COUNT = 4; public WaypointMissionOperatorView(Context context) { super(context); } - //region Mission Action Demo @Override - public void onClick(View v) { - if (waypointMissionOperator == null) { - waypointMissionOperator = MissionControl.getInstance().getWaypointMissionOperator(); - } - switch (v.getId()) { + public void onClick(View view) { + waypointMissionOperator = getWaypointMissionOperator(); + switch(view.getId()) { case R.id.btn_simulator: - if (getFlightController() != null) { - flightController.getSimulator() - .start(InitializationData.createInstance(new LocationCoordinate2D(22, 113), 10, 10), - new CommonCallbacks.CompletionCallback() { - @Override - public void onResult(DJIError djiError) { - showResultToast(djiError); - } - }); - } + startSimulator(); break; case R.id.btn_set_maximum_altitude: - if (getFlightController() != null) { - flightController.setMaxFlightHeight(500, new CommonCallbacks.CompletionCallback() { + if (null != getFlightController()) { + flightController.setMaxFlightHeight(MAX_HEIGHT, new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - ToastUtils.setResultToToast(djiError == null ? "Max Flight Height is set to 500m!" : djiError.getDescription()); + ToastUtils.setResultToToast(djiError == null ? "The maximum height is set to 500m!" : djiError.getDescription()); } }); } break; - case R.id.btn_set_maximum_radius: - if (getFlightController() != null) { - flightController.setMaxFlightRadius(500, new CommonCallbacks.CompletionCallback() { + if (null != getFlightController()) { + flightController.setMaxFlightRadius(MAX_RADIUS, new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - ToastUtils.setResultToToast(djiError == null ? "Max Flight Radius is set to 500m!" : djiError.getDescription()); + ToastUtils.setResultToToast(djiError == null ? "The maximum radius is set to 500m!" : djiError.getDescription()); } }); } break; case R.id.btn_load: - // Example of loading a Mission - mission = createRandomWaypointMission(WAYPOINT_COUNT, 1); + mission = createRectangleWaypointMission(); DJIError djiError = waypointMissionOperator.loadMission(mission); - showResultToast(djiError); - + if (djiError == null) { + ToastUtils.setResultToToast("Mission is loaded successfully"); + } else { + ToastUtils.setResultToToast(djiError.getDescription()); + } break; - case R.id.btn_upload: - // Example of uploading a Mission - if (WaypointMissionState.READY_TO_RETRY_UPLOAD.equals(waypointMissionOperator.getCurrentState()) - || WaypointMissionState.READY_TO_UPLOAD.equals(waypointMissionOperator.getCurrentState())) { + if (WaypointMissionState.READY_TO_RETRY_UPLOAD.equals(waypointMissionOperator.getCurrentState()) || WaypointMissionState.READY_TO_UPLOAD.equals(waypointMissionOperator.getCurrentState())) { waypointMissionOperator.uploadMission(new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - showResultToast(djiError); + ToastUtils.setResultToToast(djiError != null ? "" : djiError.getDescription()); } }); } else { - ToastUtils.setResultToToast("Not ready!"); + ToastUtils.setResultToToast("Wait for mission to be loaded"); } break; case R.id.btn_start: - // Example of starting a Mission - if (mission != null) { + if (null != mission) { waypointMissionOperator.startMission(new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - showResultToast(djiError); + ToastUtils.setResultToToast(djiError != null ? "" : djiError.getDescription()); } }); } else { - ToastUtils.setResultToToast("Prepare Mission First!"); + ToastUtils.setResultToToast("Wait for mission to be uploaded"); } break; case R.id.btn_stop: - // Example of stopping a Mission waypointMissionOperator.stopMission(new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - showResultToast(djiError); + ToastUtils.setResultToToast(djiError != null ? "" : djiError.getDescription()); } }); break; case R.id.btn_pause: - // Example of pausing an executing Mission waypointMissionOperator.pauseMission(new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - showResultToast(djiError); + ToastUtils.setResultToToast(djiError == null ? "The mission has been paused" : djiError.getDescription()); } }); break; case R.id.btn_resume: - // Example of resuming a paused Mission waypointMissionOperator.resumeMission(new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - showResultToast(djiError); + ToastUtils.setResultToToast(djiError == null ? "The mission has been resumed" : djiError.getDescription()); } }); break; case R.id.btn_download: - // Example of downloading an executing Mission - if (WaypointMissionState.EXECUTING.equals(waypointMissionOperator.getCurrentState()) || - WaypointMissionState.EXECUTION_PAUSED.equals(waypointMissionOperator.getCurrentState())) { + if (WaypointMissionState.EXECUTING.equals(waypointMissionOperator.getCurrentState()) || WaypointMissionState.EXECUTION_PAUSED.equals(waypointMissionOperator.getCurrentState())) { waypointMissionOperator.downloadMission(new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - showResultToast(djiError); + ToastUtils.setResultToToast(djiError != null ? "" : djiError.getDescription()); } }); } else { @@ -181,9 +166,7 @@ public void onResult(DJIError djiError) { break; } } - //endregion - //region View Life-Cycle @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); @@ -196,9 +179,7 @@ protected void onAttachedToWindow() { if (product instanceof Aircraft) { flightController = ((Aircraft) product).getFlightController(); } - if (flightController != null) { - flightController.setStateCallback(new FlightControllerState.Callback() { @Override public void onUpdate(@NonNull FlightControllerState flightControllerState) { @@ -209,7 +190,6 @@ public void onUpdate(@NonNull FlightControllerState flightControllerState) { updateWaypointMissionState(); } }); - } } waypointMissionOperator = MissionControl.getInstance().getWaypointMissionOperator(); @@ -225,59 +205,17 @@ protected void onDetachedFromWindow() { } super.onDetachedFromWindow(); } - //endregion - - //region Internal Helper Methods - private FlightController getFlightController(){ - if (flightController == null) { - BaseProduct product = DJISampleApplication.getProductInstance(); - if (product != null && product instanceof Aircraft) { - flightController = ((Aircraft) product).getFlightController(); - } else { - ToastUtils.setResultToToast("Product is disconnected!"); - } - } - - return flightController; - } - private void updateWaypointMissionState(){ - if (waypointMissionOperator != null && waypointMissionOperator.getCurrentState() != null) { - ToastUtils.setResultToText(FCPushInfoTV, - "home point latitude: " - + homeLatitude - + "\nhome point longitude: " - + homeLongitude - + "\nFlight state: " - + flightState.name() - + "\nCurrent Waypointmission state : " - + waypointMissionOperator.getCurrentState().getName()); - } else { - ToastUtils.setResultToText(FCPushInfoTV, - "home point latitude: " - + homeLatitude - + "\nhome point longitude: " - + homeLongitude - + "\nFlight state: " - + flightState.name()); - } - } - //endregion - - //region Example of Creating a Waypoint Mission /** - * Randomize a WaypointMission - * - * @param numberOfWaypoint total number of Waypoint to randomize - * @param numberOfAction total number of Action to randomize + * Pre-define a square, co-ordination (0,0),(0,30),(30,30),(30,0). So the drone heading needs to turn 45 degrees every turn. */ - private WaypointMission createRandomWaypointMission(int numberOfWaypoint, int numberOfAction) { + private WaypointMission createRectangleWaypointMission() { WaypointMission.Builder builder = new WaypointMission.Builder(); double baseLatitude = 22; double baseLongitude = 113; Object latitudeValue = KeyManager.getInstance().getValue((FlightControllerKey.create(HOME_LOCATION_LATITUDE))); - Object longitudeValue = - KeyManager.getInstance().getValue((FlightControllerKey.create(HOME_LOCATION_LONGITUDE))); + Object longitudeValue = KeyManager.getInstance().getValue((FlightControllerKey.create(HOME_LOCATION_LONGITUDE))); + if (latitudeValue != null && latitudeValue instanceof Double) { baseLatitude = (double) latitudeValue; } @@ -285,57 +223,74 @@ private WaypointMission createRandomWaypointMission(int numberOfWaypoint, int nu baseLongitude = (double) longitudeValue; } - final float baseAltitude = 20.0f; + final float baseAltitude = 30.0f; builder.autoFlightSpeed(5f); builder.maxFlightSpeed(10f); builder.setExitMissionOnRCSignalLostEnabled(false); - builder.finishedAction(WaypointMissionFinishedAction.NO_ACTION); + builder.finishedAction(WaypointMissionFinishedAction.GO_HOME); builder.flightPathMode(WaypointMissionFlightPathMode.NORMAL); builder.gotoFirstWaypointMode(WaypointMissionGotoWaypointMode.SAFELY); - builder.headingMode(WaypointMissionHeadingMode.AUTO); + builder.setPointOfInterest(new LocationCoordinate2D(15, 15)); + builder.headingMode(WaypointMissionHeadingMode.TOWARD_POINT_OF_INTEREST); builder.repeatTimes(1); - Random randomGenerator = new Random(System.currentTimeMillis()); + List waypointList = new ArrayList<>(); - for (int i = 0; i < numberOfWaypoint; i++) { - final double variation = (Math.floor(i / 4) + 1) * 2 * ONE_METER_OFFSET; - final float variationFloat = (baseAltitude + (i + 1) * 2); - final Waypoint eachWaypoint = new Waypoint(baseLatitude + variation * Math.pow(-1, i) * Math.pow(0, i % 2), - baseLongitude + variation * Math.pow(-1, (i + 1)) * Math.pow(0, (i + 1) % 2), - variationFloat); - for (int j = 0; j < numberOfAction; j++) { - final int randomNumber = randomGenerator.nextInt() % 6; - switch (randomNumber) { - case 0: - eachWaypoint.addAction(new WaypointAction(WaypointActionType.STAY, 1)); - break; - case 1: - eachWaypoint.addAction(new WaypointAction(WaypointActionType.START_TAKE_PHOTO, 1)); - break; - case 2: - eachWaypoint.addAction(new WaypointAction(WaypointActionType.START_RECORD, 1)); - eachWaypoint.addAction(new WaypointAction(WaypointActionType.STOP_RECORD, 1)); - break; - case 3: - eachWaypoint.addAction(new WaypointAction(WaypointActionType.GIMBAL_PITCH, - randomGenerator.nextInt() % 45 - 45)); - break; - case 4: - eachWaypoint.addAction(new WaypointAction(WaypointActionType.ROTATE_AIRCRAFT, - randomGenerator.nextInt() % 180)); - break; - default: - eachWaypoint.addAction(new WaypointAction(WaypointActionType.START_TAKE_PHOTO, 1)); - break; - } - } - waypointList.add(eachWaypoint); - } + + // Waypoint 0: (0,10) + Waypoint waypoint0 = new Waypoint(baseLatitude, baseLongitude, baseAltitude); + waypoint0.turnMode = WaypointTurnMode.CLOCKWISE; + waypoint0.addAction(new WaypointAction(WaypointActionType.ROTATE_AIRCRAFT,0 + calculateTurnAngle())); + waypoint0.addAction(new WaypointAction(WaypointActionType.START_TAKE_PHOTO, 1000)); + waypointList.add(waypoint0); + + // Waypoint 1: (0,30) + Waypoint waypoint1 = new Waypoint(baseLatitude, baseLongitude + HORIZONTAL_DISTANCE * ONE_METER_OFFSET, baseAltitude); + waypoint0.turnMode = WaypointTurnMode.COUNTER_CLOCKWISE; + waypoint1.addAction(new WaypointAction(WaypointActionType.ROTATE_AIRCRAFT, 0 - calculateTurnAngle())); + waypoint1.addAction(new WaypointAction(WaypointActionType.START_TAKE_PHOTO, 0)); + waypointList.add(waypoint1); + + // Waypoint 2: (30,30) + Waypoint waypoint2 = new Waypoint(baseLatitude + VERTICAL_DISTANCE * ONE_METER_OFFSET, baseLongitude + HORIZONTAL_DISTANCE * ONE_METER_OFFSET, baseAltitude); + waypoint0.turnMode = WaypointTurnMode.COUNTER_CLOCKWISE; + waypoint2.addAction(new WaypointAction(WaypointActionType.ROTATE_AIRCRAFT, -180 + calculateTurnAngle())); + waypoint2.addAction(new WaypointAction(WaypointActionType.START_TAKE_PHOTO, 0)); + waypointList.add(waypoint2); + + // Waypoint 3: (30,0) + Waypoint waypoint3 = new Waypoint(baseLatitude + VERTICAL_DISTANCE * ONE_METER_OFFSET, baseLongitude, baseAltitude); + waypoint0.turnMode = WaypointTurnMode.COUNTER_CLOCKWISE; + waypoint3.addAction(new WaypointAction(WaypointActionType.ROTATE_AIRCRAFT, 180 - calculateTurnAngle())); + waypoint3.addAction(new WaypointAction(WaypointActionType.START_TAKE_PHOTO, 0)); + waypointList.add(waypoint3); + builder.waypointList(waypointList).waypointCount(waypointList.size()); return builder.build(); } - //endregion - //region Not important stuff + + private void updateWaypointMissionState(){ + if (waypointMissionOperator != null && waypointMissionOperator.getCurrentState() != null) { + ToastUtils.setResultToText(FCPushInfoTV, + "home point latitude: " + + homeLatitude + + "\nhome point longitude: " + + homeLongitude + + "\nFlight state: " + + flightState.name() + + "\nCurrent Waypointmission state : " + + waypointMissionOperator.getCurrentState().getName()); + } else { + ToastUtils.setResultToText(FCPushInfoTV, + "home point latitude: " + + homeLatitude + + "\nhome point longitude: " + + homeLongitude + + "\nFlight state: " + + flightState.name()); + } + } + private void setUpListener() { // Example of Listener listener = new WaypointMissionOperatorListener() { @@ -343,9 +298,9 @@ private void setUpListener() { public void onDownloadUpdate(@NonNull WaypointMissionDownloadEvent waypointMissionDownloadEvent) { // Example of Download Listener if (waypointMissionDownloadEvent.getProgress() != null - && waypointMissionDownloadEvent.getProgress().isSummaryDownloaded - && waypointMissionDownloadEvent.getProgress().downloadedWaypointIndex == (WAYPOINT_COUNT - 1)) { - ToastUtils.setResultToToast("Download successful!"); + && waypointMissionDownloadEvent.getProgress().isSummaryDownloaded + && waypointMissionDownloadEvent.getProgress().downloadedWaypointIndex == (WAYPOINT_COUNT - 1)) { + ToastUtils.setResultToToast("Mission is downloaded successfully"); } updateWaypointMissionState(); } @@ -354,9 +309,9 @@ public void onDownloadUpdate(@NonNull WaypointMissionDownloadEvent waypointMissi public void onUploadUpdate(@NonNull WaypointMissionUploadEvent waypointMissionUploadEvent) { // Example of Upload Listener if (waypointMissionUploadEvent.getProgress() != null - && waypointMissionUploadEvent.getProgress().isSummaryUploaded - && waypointMissionUploadEvent.getProgress().uploadedWaypointIndex == (WAYPOINT_COUNT - 1)) { - ToastUtils.setResultToToast("Upload successful!"); + && waypointMissionUploadEvent.getProgress().isSummaryUploaded + && waypointMissionUploadEvent.getProgress().uploadedWaypointIndex == (WAYPOINT_COUNT - 1)) { + ToastUtils.setResultToToast("Mission is uploaded successfully"); } updateWaypointMissionState(); } @@ -364,27 +319,27 @@ public void onUploadUpdate(@NonNull WaypointMissionUploadEvent waypointMissionUp @Override public void onExecutionUpdate(@NonNull WaypointMissionExecutionEvent waypointMissionExecutionEvent) { // Example of Execution Listener - Log.d(TAG, - (waypointMissionExecutionEvent.getPreviousState() == null - ? "" - : waypointMissionExecutionEvent.getPreviousState().getName()) - + ", " - + waypointMissionExecutionEvent.getCurrentState().getName() - + (waypointMissionExecutionEvent.getProgress() == null - ? "" - : waypointMissionExecutionEvent.getProgress().targetWaypointIndex)); + Log.d("TAG", + (waypointMissionExecutionEvent.getPreviousState() == null + ? "" + : waypointMissionExecutionEvent.getPreviousState().getName()) + + ", " + + waypointMissionExecutionEvent.getCurrentState().getName() + + (waypointMissionExecutionEvent.getProgress() == null + ? "" + : waypointMissionExecutionEvent.getProgress().targetWaypointIndex)); updateWaypointMissionState(); } @Override public void onExecutionStart() { - ToastUtils.setResultToToast("Execution started!"); + ToastUtils.setResultToToast("Mission started"); updateWaypointMissionState(); } @Override public void onExecutionFinish(@Nullable DJIError djiError) { - ToastUtils.setResultToToast("Execution finished!"); + ToastUtils.setResultToToast("Mission finished"); updateWaypointMissionState(); } }; @@ -402,14 +357,42 @@ private void tearDownListener() { } } - private void showResultToast(DJIError djiError) { - ToastUtils.setResultToToast(djiError == null ? "Action started!" : djiError.getDescription()); + private int calculateTurnAngle() { + return Math.round((float)Math.toDegrees(Math.atan(VERTICAL_DISTANCE/ HORIZONTAL_DISTANCE))); + } + + private WaypointMissionOperator getWaypointMissionOperator() { + if (null == waypointMissionOperator) { + if (null != MissionControl.getInstance()) { + return MissionControl.getInstance().getWaypointMissionOperator(); + } + } + return waypointMissionOperator; + } + + private FlightController getFlightController() { + if (null == flightController) { + if (null != DJISampleApplication.getAircraftInstance()) { + return DJISampleApplication.getAircraftInstance().getFlightController(); + } + ToastUtils.setResultToToast("Product is disconnected!"); + } + return flightController; + } + + private void startSimulator() { + if (null != getFlightController()) { + flightController.getSimulator().start(InitializationData.createInstance(new LocationCoordinate2D(BASE_LATITUDE, BASE_LONGITUDE),REFRESH_FREQ, SATELLITE_COUNT), new CommonCallbacks.CompletionCallback() { + @Override + public void onResult(DJIError djiError) { + ToastUtils.setResultToToast(djiError != null ? "Simulator started" : djiError.getDescription()); + } + }); + } } @Override public int getDescription() { return R.string.component_listview_waypoint_mission_operator; } - - //endregion } diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/missionoperator/WaypointV2MissionOperatorView.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/missionoperator/WaypointV2MissionOperatorView.java index be384cc1..987572ef 100755 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/missionoperator/WaypointV2MissionOperatorView.java +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/missionoperator/WaypointV2MissionOperatorView.java @@ -147,7 +147,7 @@ public void onResult(DJIError djiError) { flightController.setMaxFlightHeight(MAX_HEIGHT, new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - ToastUtils.setResultToToast(djiError == null ? "Max Flight Height is set to 500m!" : djiError.getDescription()); + ToastUtils.setResultToToast(djiError == null ? "The maximum height is set to 500m!" : djiError.getDescription()); } }); break; @@ -155,7 +155,7 @@ public void onResult(DJIError djiError) { flightController.setMaxFlightRadius(MAX_RADIUS, new CommonCallbacks.CompletionCallback() { @Override public void onResult(DJIError djiError) { - ToastUtils.setResultToToast(djiError == null ? "Max Flight Radius is set to 500m!" : djiError.getDescription()); + ToastUtils.setResultToToast(djiError == null ? "The maximum radius is set to 500m!" : djiError.getDescription()); } }); break; diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/useraccount/LDMView.kt b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/useraccount/LDMView.kt index 02ff0c8e..741caf2a 100644 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/useraccount/LDMView.kt +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/useraccount/LDMView.kt @@ -6,7 +6,6 @@ import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout import android.widget.TextView -import butterknife.OnClick import com.dji.sdk.sample.R import com.dji.sdk.sample.internal.utils.ToastUtils import com.dji.sdk.sample.internal.view.PresentableView @@ -14,12 +13,14 @@ import dji.common.error.DJIError import dji.common.util.CommonCallbacks.CompletionCallbackWith import dji.sdk.sdkmanager.DJISDKManager import dji.sdk.sdkmanager.LDMManager.LDMCallback +import dji.sdk.sdkmanager.LDMModule +import dji.sdk.sdkmanager.LDMModuleType class LDMView(context: Context?) : LinearLayout(context), PresentableView, View.OnClickListener { private lateinit var ldmInfoText: TextView - private var isLDMEnable: Boolean = false - private var isLDMSupport: Boolean = false + private var isLDMSupported: Boolean = false + private var isLDMEnabled: Boolean = false init { initUI(context) @@ -36,19 +37,20 @@ class LDMView(context: Context?) : LinearLayout(context), PresentableView, View. findViewById(R.id.btn_disable_ldm).setOnClickListener(this) findViewById(R.id.btn_enable_rtk_network).setOnClickListener(this) findViewById(R.id.btn_disable_rtk_network).setOnClickListener(this) - findViewById(R.id.btn_is_rtk_network_enabled).setOnClickListener(this) + findViewById(R.id.btn_is_enable_user_account).setOnClickListener(this) + findViewById(R.id.btn_is_disable_user_account).setOnClickListener(this) findViewById(R.id.btn_get_ldm_license).setOnClickListener(this) } private fun initListener() { DJISDKManager.getInstance().ldmManager.setCallback(object : LDMCallback { override fun onLDMEnabledChange(isEnabled: Boolean) { - isLDMEnable = isEnabled; + isLDMEnabled = isEnabled; handler.post { updateLdmInfo() } } override fun onLDMSupportedChange(isSupported: Boolean) { - isLDMSupport = isSupported; + isLDMSupported = isSupported; handler.post { updateLdmInfo() } } }) @@ -68,18 +70,40 @@ class LDMView(context: Context?) : LinearLayout(context), PresentableView, View. } } - fun enableRTKNetwork() { - val error = DJISDKManager.getInstance().ldmManager.setRTKNetworkServiceEnabled(true) - ToastUtils.setResultToToast("enableRTKNetwork " + if (error == null) "success" else "error=" + error.description) + fun setRTKEnabled() { + var error = DJISDKManager.getInstance().ldmManager.setModuleNetworkServiceEnabled(LDMModule.Builder() + .enabled(true) + .moduleType(LDMModuleType.RTK) + .build()) + ToastUtils.setResultToToast("setRTKEnabled " + if (error == null) "success" else "error=" + error.description) + updateLdmInfo() } - fun disableRTKNetwork() { - val error = DJISDKManager.getInstance().ldmManager.setRTKNetworkServiceEnabled(false) - ToastUtils.setResultToToast("disableRTKNetwork " + if (error == null) "success" else "error=" + error.description) + fun setRTKDisabled() { + var error = DJISDKManager.getInstance().ldmManager.setModuleNetworkServiceEnabled(LDMModule.Builder() + .enabled(false) + .moduleType(LDMModuleType.RTK) + .build()) + ToastUtils.setResultToToast("setRTKDisabled " + if (error == null) "success" else "error=" + error.description) + updateLdmInfo() } - fun isRTKNetworkEnabled() { - ToastUtils.setResultToToast("isRTKNetworkServiceEnabled: " + DJISDKManager.getInstance().ldmManager.isRTKNetworkServiceEnabled) + fun setUserAccountEnabled() { + var error = DJISDKManager.getInstance().ldmManager.setModuleNetworkServiceEnabled(LDMModule.Builder() + .enabled(true) + .moduleType(LDMModuleType.USER_ACCOUNT) + .build()) + ToastUtils.setResultToToast("setUserAccountEnabled " + if (error == null) "success" else "error=" + error.description) + updateLdmInfo() + } + + fun setUserAccountDisabled() { + var error = DJISDKManager.getInstance().ldmManager.setModuleNetworkServiceEnabled(LDMModule.Builder() + .enabled(false) + .moduleType(LDMModuleType.USER_ACCOUNT) + .build()) + ToastUtils.setResultToToast("setUserAccountDisabled " + if (error == null) "success" else "error=" + error.description) + updateLdmInfo() } fun getLdmLicense() { @@ -92,10 +116,18 @@ class LDMView(context: Context?) : LinearLayout(context), PresentableView, View. ToastUtils.setResultToToast("getLdmLicense error=" + error.description) } }) + updateLdmInfo() } private fun updateLdmInfo() { - ldmInfoText.text = "LDM enabled:$isLDMEnable,LDM supported:$isLDMSupport" + isLDMEnabled = DJISDKManager.getInstance().ldmManager.isLDMEnabled + var isRTKEnabled = DJISDKManager.getInstance().ldmManager.isModuleNetworkServiceEnabled(LDMModuleType.RTK) + var isUserAccountEnabled = DJISDKManager.getInstance().ldmManager.isModuleNetworkServiceEnabled(LDMModuleType.USER_ACCOUNT) + + ldmInfoText.text = "LDM enabled: $isLDMEnabled\n" + + "LDM supported: $isLDMSupported\n" + + "isRTKEnabled: $isRTKEnabled\n" + + "isUserAccountEnabled: $isUserAccountEnabled\n" } override fun getDescription(): Int = R.string.component_listview_ldm @@ -106,9 +138,10 @@ class LDMView(context: Context?) : LinearLayout(context), PresentableView, View. when (v?.id) { R.id.btn_enable_ldm -> enableLDM() R.id.btn_disable_ldm -> disableLDM() - R.id.btn_enable_rtk_network -> enableRTKNetwork() - R.id.btn_disable_rtk_network -> disableRTKNetwork() - R.id.btn_is_rtk_network_enabled -> isRTKNetworkEnabled() + R.id.btn_enable_rtk_network -> setRTKEnabled() + R.id.btn_disable_rtk_network -> setRTKDisabled() + R.id.btn_is_enable_user_account -> setUserAccountEnabled() + R.id.btn_is_disable_user_account -> setUserAccountDisabled() R.id.btn_get_ldm_license -> getLdmLicense() } } diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/utmiss/UTMISSActivity.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/utmiss/UTMISSActivity.java index 0869c0b6..5a2b39dd 100644 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/utmiss/UTMISSActivity.java +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/demo/utmiss/UTMISSActivity.java @@ -7,12 +7,13 @@ import android.widget.EditText; import android.widget.TextView; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + import com.dji.sdk.sample.R; import java.io.File; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/controller/MainActivity.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/controller/MainActivity.java index e0fd7874..c19b2b97 100644 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/controller/MainActivity.java +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/controller/MainActivity.java @@ -1,6 +1,5 @@ package com.dji.sdk.sample.internal.controller; -import android.Manifest; import android.animation.AnimatorInflater; import android.animation.LayoutTransition; import android.animation.ObjectAnimator; @@ -8,13 +7,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; import android.hardware.usb.UsbManager; -import android.os.AsyncTask; -import android.os.Build; import android.os.Bundle; -import android.os.Handler; -import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -23,14 +17,6 @@ import android.widget.FrameLayout; import android.widget.ProgressBar; import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.SearchView; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; import com.dji.sdk.sample.R; import com.dji.sdk.sample.internal.model.ViewWrapper; @@ -39,39 +25,18 @@ import com.dji.sdk.sample.internal.view.PresentableView; import com.squareup.otto.Subscribe; -import java.util.ArrayList; -import java.util.List; import java.util.Stack; -import java.util.concurrent.atomic.AtomicBoolean; -import dji.common.error.DJIError; -import dji.common.error.DJISDKError; -import dji.common.util.CommonCallbacks; -import dji.log.DJILog; -import dji.sdk.base.BaseComponent; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.SearchView; import dji.sdk.base.BaseProduct; -import dji.sdk.sdkmanager.DJISDKInitEvent; import dji.sdk.sdkmanager.DJISDKManager; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); - private static final String[] REQUIRED_PERMISSION_LIST = new String[] { - Manifest.permission.VIBRATE, // Gimbal rotation - Manifest.permission.INTERNET, // API requests - Manifest.permission.ACCESS_WIFI_STATE, // WIFI connected products - Manifest.permission.ACCESS_COARSE_LOCATION, // Maps - Manifest.permission.ACCESS_NETWORK_STATE, // WIFI connected products - Manifest.permission.ACCESS_FINE_LOCATION, // Maps - Manifest.permission.CHANGE_WIFI_STATE, // Changing between WIFI and USB connection - Manifest.permission.WRITE_EXTERNAL_STORAGE, // Log files - Manifest.permission.BLUETOOTH, // Bluetooth connected products - Manifest.permission.BLUETOOTH_ADMIN, // Bluetooth connected products - Manifest.permission.READ_EXTERNAL_STORAGE, // Log files - Manifest.permission.READ_PHONE_STATE, // Device UUID accessed upon registration - Manifest.permission.RECORD_AUDIO // Speaker accessory - }; - private static final int REQUEST_PERMISSION_CODE = 12345; private FrameLayout contentFrameLayout; private ObjectAnimator pushInAnimator; private ObjectAnimator pushOutAnimator; @@ -83,57 +48,18 @@ public class MainActivity extends AppCompatActivity { private SearchView searchView; private MenuItem searchViewItem; private MenuItem hintItem; - private List missingPermission = new ArrayList<>(); - private AtomicBoolean isRegistrationInProgress = new AtomicBoolean(false); - private int lastProcess = -1; - private Handler mHander = new Handler(); - private BaseComponent.ComponentListener mDJIComponentListener = new BaseComponent.ComponentListener() { - - @Override - public void onConnectivityChange(boolean isConnected) { - Log.d(TAG, "onComponentConnectivityChanged: " + isConnected); - notifyStatusChange(); - } - }; //region Life-cycle @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - checkAndRequestPermissions(); DJISampleApplication.getEventBus().register(this); setContentView(R.layout.activity_main); setupActionBar(); contentFrameLayout = (FrameLayout) findViewById(R.id.framelayout_content); - progressBar = (ProgressBar) findViewById(R.id.progress_bar); initParams(); } - - /** - * Result of runtime permission request - */ - @Override - public void onRequestPermissionsResult(int requestCode, - @NonNull String[] permissions, - @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - // Check for granted permission and remove from missing list - if (requestCode == REQUEST_PERMISSION_CODE) { - for (int i = grantResults.length - 1; i >= 0; i--) { - if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { - missingPermission.remove(permissions[i]); - } - } - } - // If there is enough permission, we will start the registration - if (missingPermission.isEmpty()) { - startSDKRegistration(); - } else { - Toast.makeText(getApplicationContext(), "Missing permissions!!!", Toast.LENGTH_LONG).show(); - } - } - @Override protected void onDestroy() { DJISampleApplication.getEventBus().unregister(this); @@ -207,153 +133,6 @@ public void onBackPressed() { //endregion - - //region Registration n' Permissions Helpers - - /** - * Checks if there is any missing permissions, and - * requests runtime permission if needed. - */ - private void checkAndRequestPermissions() { - // Check for permissions - for (String eachPermission : REQUIRED_PERMISSION_LIST) { - if (ContextCompat.checkSelfPermission(this, eachPermission) != PackageManager.PERMISSION_GRANTED) { - missingPermission.add(eachPermission); - } - } - // Request for missing permissions - if (missingPermission.isEmpty()) { - startSDKRegistration(); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - ActivityCompat.requestPermissions(this, - missingPermission.toArray(new String[missingPermission.size()]), - REQUEST_PERMISSION_CODE); - } - - } - - private void startSDKRegistration() { - if (isRegistrationInProgress.compareAndSet(false, true)) { - AsyncTask.execute(new Runnable() { - @Override - public void run() { - ToastUtils.setResultToToast(MainActivity.this.getString(R.string.sdk_registration_doing_message)); - DJISDKManager.getInstance().registerApp(MainActivity.this.getApplicationContext(), new DJISDKManager.SDKManagerCallback() { - @Override - public void onRegister(DJIError djiError) { - if (djiError == DJISDKError.REGISTRATION_SUCCESS) { - DJILog.e("App registration", DJISDKError.REGISTRATION_SUCCESS.getDescription()); - DJISDKManager.getInstance().startConnectionToProduct(); - ToastUtils.setResultToToast(MainActivity.this.getString(R.string.sdk_registration_success_message)); - showDBVersion(); - } else { - ToastUtils.setResultToToast(MainActivity.this.getString(R.string.sdk_registration_message) + djiError.getDescription()); - } - Log.v(TAG, djiError.getDescription()); - hideProcess(); - } - @Override - public void onProductDisconnect() { - Log.d(TAG, "onProductDisconnect"); - notifyStatusChange(); - } - @Override - public void onProductConnect(BaseProduct baseProduct) { - Log.d(TAG, String.format("onProductConnect newProduct:%s", baseProduct)); - notifyStatusChange(); - } - - @Override - public void onProductChanged(BaseProduct baseProduct) { - notifyStatusChange(); - } - - @Override - public void onComponentChange(BaseProduct.ComponentKey componentKey, - BaseComponent oldComponent, - BaseComponent newComponent) { - if (newComponent != null) { - newComponent.setComponentListener(mDJIComponentListener); - } - Log.d(TAG, - String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s", - componentKey, - oldComponent, - newComponent)); - - notifyStatusChange(); - } - - @Override - public void onInitProcess(DJISDKInitEvent djisdkInitEvent, int i) { - - } - - @Override - public void onDatabaseDownloadProgress(long current, long total) { - int process = (int) (100 * current / total); - if (process == lastProcess) { - return; - } - lastProcess = process; - showProgress(process); - if (process % 25 == 0){ - ToastUtils.setResultToToast("DB load process : " + process); - }else if (process == 0){ - ToastUtils.setResultToToast("DB load begin"); - } - } - }); - } - }); - } - } - - private void showProgress(final int process){ - runOnUiThread(new Runnable() { - @Override - public void run() { - progressBar.setVisibility(View.VISIBLE); - progressBar.setProgress(process); - } - }); - } - - private void showDBVersion(){ - mHander.postDelayed(new Runnable() { - @Override - public void run() { - DJISDKManager.getInstance().getFlyZoneManager().getPreciseDatabaseVersion(new CommonCallbacks.CompletionCallbackWith() { - @Override - public void onSuccess(String s) { - ToastUtils.setResultToToast("db load success ! version : " + s); - } - - @Override - public void onFailure(DJIError djiError) { - ToastUtils.setResultToToast("db load success ! get version error : " + djiError.getDescription()); - - } - }); - } - },1000); - } - - private void hideProcess(){ - runOnUiThread(new Runnable() { - @Override - public void run() { - progressBar.setVisibility(View.GONE); - } - }); - } - - - private void notifyStatusChange() { - DJISampleApplication.getEventBus().post(new ConnectivityChangeEvent()); - } - //endregion - private void setupActionBar() { ActionBar actionBar = getSupportActionBar(); if (null != actionBar) { @@ -528,6 +307,4 @@ public static class RequestEndFullScreenEvent { public static class ConnectivityChangeEvent { } //endregion - - } \ No newline at end of file diff --git a/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/view/MainContent.java b/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/view/MainContent.java index d5febf27..88254b76 100644 --- a/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/view/MainContent.java +++ b/Sample Code/app/src/main/java/com/dji/sdk/sample/internal/view/MainContent.java @@ -1,6 +1,10 @@ package com.dji.sdk.sample.internal.view; +import android.Manifest; +import android.app.Activity; import android.content.Context; +import android.content.pm.PackageManager; +import android.os.AsyncTask; import android.os.Build; import android.os.Handler; import android.os.HandlerThread; @@ -16,6 +20,7 @@ import android.view.inputmethod.EditorInfo; import android.widget.Button; import android.widget.EditText; +import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; @@ -29,9 +34,14 @@ import com.dji.sdk.sample.internal.utils.ToastUtils; import com.squareup.otto.Subscribe; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; import dji.common.error.DJIError; +import dji.common.error.DJISDKError; import dji.common.realname.AppActivationState; import dji.common.useraccount.UserAccountState; import dji.common.util.CommonCallbacks; @@ -39,11 +49,14 @@ import dji.keysdk.KeyManager; import dji.keysdk.ProductKey; import dji.keysdk.callback.KeyListener; +import dji.log.DJILog; import dji.log.GlobalConfig; +import dji.sdk.base.BaseComponent; import dji.sdk.base.BaseProduct; import dji.sdk.products.Aircraft; import dji.sdk.realname.AppActivationManager; import dji.sdk.sdkmanager.BluetoothProductConnector; +import dji.sdk.sdkmanager.DJISDKInitEvent; import dji.sdk.sdkmanager.DJISDKManager; import dji.sdk.useraccount.UserAccountManager; @@ -53,10 +66,41 @@ public class MainContent extends RelativeLayout { public static final String TAG = MainContent.class.getName(); + private static final String[] REQUIRED_PERMISSION_LIST = new String[] { + Manifest.permission.VIBRATE, // Gimbal rotation + Manifest.permission.INTERNET, // API requests + Manifest.permission.ACCESS_WIFI_STATE, // WIFI connected products + Manifest.permission.ACCESS_COARSE_LOCATION, // Maps + Manifest.permission.ACCESS_NETWORK_STATE, // WIFI connected products + Manifest.permission.ACCESS_FINE_LOCATION, // Maps + Manifest.permission.CHANGE_WIFI_STATE, // Changing between WIFI and USB connection + Manifest.permission.WRITE_EXTERNAL_STORAGE, // Log files + Manifest.permission.BLUETOOTH, // Bluetooth connected products + Manifest.permission.BLUETOOTH_ADMIN, // Bluetooth connected products + Manifest.permission.READ_EXTERNAL_STORAGE, // Log files + Manifest.permission.READ_PHONE_STATE, // Device UUID accessed upon registration + Manifest.permission.RECORD_AUDIO // Speaker accessory + }; + private static final int REQUEST_PERMISSION_CODE = 12345; + private List missingPermission = new ArrayList<>(); + private AtomicBoolean isRegistrationInProgress = new AtomicBoolean(false); + private int lastProcess = -1; + private Handler mHander = new Handler(); + private BaseComponent.ComponentListener mDJIComponentListener = new BaseComponent.ComponentListener() { + + @Override + public void onConnectivityChange(boolean isConnected) { + Log.d(TAG, "onComponentConnectivityChanged: " + isConnected); + notifyStatusChange(); + } + }; + private ProgressBar progressBar; private static BluetoothProductConnector connector = null; private TextView mTextConnectionStatus; private TextView mTextProduct; private TextView mTextModelAvailable; + private Button mBtnRegisterApp; + private Button getmBtnRegisterAppForLDM; private Button mBtnOpen; private Button mBtnBluetooth; private ViewWrapper componentList = @@ -76,8 +120,11 @@ public class MainContent extends RelativeLayout { private static final int MSG_INFORM_ACTIVATION = 1; private static final int ACTIVATION_DALAY_TIME = 3000; private AppActivationState.AppActivationStateListener appActivationStateListener; + private boolean isregisterForLDM = false; + private Context mContext; public MainContent(Context context, AttributeSet attrs) { super(context, attrs); + mContext = context; } @Override @@ -90,14 +137,32 @@ protected void onFinishInflate() { private void initUI() { Log.v(TAG, "initUI"); + progressBar = (ProgressBar) findViewById(R.id.progress_bar); mTextConnectionStatus = (TextView) findViewById(R.id.text_connection_status); mTextModelAvailable = (TextView) findViewById(R.id.text_model_available); mTextProduct = (TextView) findViewById(R.id.text_product_info); + mBtnRegisterApp = (Button) findViewById(R.id.btn_registerApp); + getmBtnRegisterAppForLDM = (Button) findViewById(R.id.btn_registerAppForLDM); mBtnOpen = (Button) findViewById(R.id.btn_open); mBridgeModeEditText = (EditText) findViewById(R.id.edittext_bridge_ip); mBtnBluetooth = (Button) findViewById(R.id.btn_bluetooth); //mBtnBluetooth.setEnabled(false); + + mBtnRegisterApp.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + isregisterForLDM = false; + checkAndRequestPermissions(); + } + }); + getmBtnRegisterAppForLDM.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + isregisterForLDM = true; + checkAndRequestPermissions(); + } + }); mBtnOpen.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -379,4 +444,222 @@ public void onFailure(DJIError djiError) { }); } } + + //region Registration n' Permissions Helpers + + /** + * Checks if there is any missing permissions, and + * requests runtime permission if needed. + */ + private void checkAndRequestPermissions() { + // Check for permissions + for (String eachPermission : REQUIRED_PERMISSION_LIST) { + if (ContextCompat.checkSelfPermission(mContext, eachPermission) != PackageManager.PERMISSION_GRANTED) { + missingPermission.add(eachPermission); + } + } + // Request for missing permissions + if (missingPermission.isEmpty()) { + startSDKRegistration(); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + ActivityCompat.requestPermissions((Activity) mContext, + missingPermission.toArray(new String[missingPermission.size()]), + REQUEST_PERMISSION_CODE); + } + + } + + private void startSDKRegistration() { + if (isRegistrationInProgress.compareAndSet(false, true)) { + AsyncTask.execute(new Runnable() { + @Override + public void run() { + ToastUtils.setResultToToast(mContext.getString(R.string.sdk_registration_doing_message)); + if(isregisterForLDM) { + DJISDKManager.getInstance().registerAppForLDM(mContext.getApplicationContext(), new DJISDKManager.SDKManagerCallback() { + @Override + public void onRegister(DJIError djiError) { + if (djiError == DJISDKError.REGISTRATION_SUCCESS) { + DJILog.e("App registration for LDM", DJISDKError.REGISTRATION_SUCCESS.getDescription()); + DJISDKManager.getInstance().startConnectionToProduct(); + ToastUtils.setResultToToast(mContext.getString(R.string.sdk_registration_success_message)); + showDBVersion(); + notifyStatusChange(); + } else { + ToastUtils.setResultToToast(mContext.getString(R.string.sdk_registration_message) + djiError.getDescription()); + } + Log.v(TAG, djiError.getDescription()); + hideProcess(); + } + @Override + public void onProductDisconnect() { + Log.d(TAG, "onProductDisconnect"); + notifyStatusChange(); + } + @Override + public void onProductConnect(BaseProduct baseProduct) { + Log.d(TAG, String.format("onProductConnect newProduct:%s", baseProduct)); + notifyStatusChange(); + } + + @Override + public void onProductChanged(BaseProduct baseProduct) { + notifyStatusChange(); + } + + @Override + public void onComponentChange(BaseProduct.ComponentKey componentKey, + BaseComponent oldComponent, + BaseComponent newComponent) { + if (newComponent != null) { + newComponent.setComponentListener(mDJIComponentListener); + } + Log.d(TAG, + String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s", + componentKey, + oldComponent, + newComponent)); + + notifyStatusChange(); + } + + @Override + public void onInitProcess(DJISDKInitEvent djisdkInitEvent, int i) { + + } + + @Override + public void onDatabaseDownloadProgress(long current, long total) { + int process = (int) (100 * current / total); + if (process == lastProcess) { + return; + } + lastProcess = process; + showProgress(process); + if (process % 25 == 0){ + ToastUtils.setResultToToast("DB load process : " + process); + }else if (process == 0){ + ToastUtils.setResultToToast("DB load begin"); + } + } + }); + + } else { + DJISDKManager.getInstance().registerApp(mContext.getApplicationContext(), new DJISDKManager.SDKManagerCallback() { + @Override + public void onRegister(DJIError djiError) { + if (djiError == DJISDKError.REGISTRATION_SUCCESS) { + DJILog.e("App registration", DJISDKError.REGISTRATION_SUCCESS.getDescription()); + DJISDKManager.getInstance().startConnectionToProduct(); + ToastUtils.setResultToToast(mContext.getString(R.string.sdk_registration_success_message)); + showDBVersion(); + notifyStatusChange(); + } else { + ToastUtils.setResultToToast(mContext.getString(R.string.sdk_registration_message) + djiError.getDescription()); + } + Log.v(TAG, djiError.getDescription()); + hideProcess(); + } + @Override + public void onProductDisconnect() { + Log.d(TAG, "onProductDisconnect"); + notifyStatusChange(); + } + @Override + public void onProductConnect(BaseProduct baseProduct) { + Log.d(TAG, String.format("onProductConnect newProduct:%s", baseProduct)); + notifyStatusChange(); + } + + @Override + public void onProductChanged(BaseProduct baseProduct) { + notifyStatusChange(); + } + + @Override + public void onComponentChange(BaseProduct.ComponentKey componentKey, + BaseComponent oldComponent, + BaseComponent newComponent) { + if (newComponent != null) { + newComponent.setComponentListener(mDJIComponentListener); + } + Log.d(TAG, + String.format("onComponentChange key:%s, oldComponent:%s, newComponent:%s", + componentKey, + oldComponent, + newComponent)); + + notifyStatusChange(); + } + + @Override + public void onInitProcess(DJISDKInitEvent djisdkInitEvent, int i) { + + } + + @Override + public void onDatabaseDownloadProgress(long current, long total) { + int process = (int) (100 * current / total); + if (process == lastProcess) { + return; + } + lastProcess = process; + showProgress(process); + if (process % 25 == 0){ + ToastUtils.setResultToToast("DB load process : " + process); + }else if (process == 0){ + ToastUtils.setResultToToast("DB load begin"); + } + } + }); + + } + } + }); + } + } + + private void showProgress(final int process){ + mHander.post(new Runnable() { + @Override + public void run() { + progressBar.setVisibility(View.VISIBLE); + progressBar.setProgress(process); + } + }); + } + + private void showDBVersion(){ + mHander.postDelayed(new Runnable() { + @Override + public void run() { + DJISDKManager.getInstance().getFlyZoneManager().getPreciseDatabaseVersion(new CommonCallbacks.CompletionCallbackWith() { + @Override + public void onSuccess(String s) { + ToastUtils.setResultToToast("db load success ! version : " + s); + } + + @Override + public void onFailure(DJIError djiError) { + ToastUtils.setResultToToast("db load success ! get version error : " + djiError.getDescription()); + + } + }); + } + },1000); + } + + private void hideProcess(){ + mHander.post(new Runnable() { + @Override + public void run() { + progressBar.setVisibility(View.GONE); + } + }); + } + + private void notifyStatusChange() { + DJISampleApplication.getEventBus().post(new MainActivity.ConnectivityChangeEvent()); + } + //endregion } \ No newline at end of file diff --git a/Sample Code/app/src/main/res/layout/activity_main.xml b/Sample Code/app/src/main/res/layout/activity_main.xml index 0697a048..65d7ae49 100644 --- a/Sample Code/app/src/main/res/layout/activity_main.xml +++ b/Sample Code/app/src/main/res/layout/activity_main.xml @@ -4,15 +4,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + +