From 224431f1b11c78e3bdcbdd7eee3e43ad2f742ed4 Mon Sep 17 00:00:00 2001 From: dji-dev Date: Tue, 23 Feb 2021 16:58:43 +0800 Subject: [PATCH] update for 4.14 --- Sample Code/app/build.gradle | 6 +- .../sample/demo/camera/RecordVideoView.java | 2 - .../WaypointMissionOperatorView.java | 323 ++-- .../WaypointV2MissionOperatorView.java | 4 +- .../sdk/sample/demo/useraccount/LDMView.kt | 69 +- .../sample/demo/utmiss/UTMISSActivity.java | 5 +- .../internal/controller/MainActivity.java | 231 +-- .../sdk/sample/internal/view/MainContent.java | 283 ++++ .../app/src/main/res/layout/activity_main.xml | 9 - .../app/src/main/res/layout/content_main.xml | 43 +- .../app/src/main/res/layout/view_ldm.xml | 37 +- .../app/src/main/res/values/strings.xml | 5 +- .../BaseClasses/DJIBaseProduct.html | 8 +- .../BaseClasses/DJIVideoFeeder.html | 8 +- .../DJIVideoFeeder_DJIVideoFeed.html | 8 +- ...eoFeedPhysicalSourceCallbackInterface.html | 8 +- ...DJIVideoFeeder_PhysicalSourceListener.html | 8 +- ...er_VideoActiveStatusListenerInterface.html | 8 +- ...ideoFeeder_VideoDataListenerInterface.html | 10 +- .../DJIAccessoryAggregation.html | 8 +- ...AccessoryAggregation_AggregationState.html | 8 +- ...on_AggregationState_callbackInterface.html | 8 +- .../DJIAccessoryAggregation_DJIBeacon.html | 8 +- .../DJIAccessoryAggregation_DJISpeaker.html | 8 +- ...gregation_DJISpeaker_DJIAudioFileInfo.html | 8 +- ...ggregation_DJISpeaker_DJISpeakerState.html | 8 +- ...ker_DJISpeakerState_CallbackInterface.html | 8 +- ...Speaker_TransmissionListenerInterface.html | 8 +- .../DJIAccessoryAggregation_DJISpotlight.html | 8 +- ...gation_DJISpotlight_DJISpotlightState.html | 8 +- ...t_DJISpotlightState_CallbackInterface.html | 8 +- .../Components/AirLink/DJIAirLink.html | 8 +- ...SignalQualityUpdatedCallbackInterface.html | 8 +- ...IAirLink_CountryCodeCallbackInterface.html | 8 +- ...irlink_SignalQualityCallbackInterface.html | 8 +- .../DJIAppActivationManager.html | 8 +- ...AircraftBindingStateListenerInterface.html | 8 +- ...r_AppActivationStateListenerInterface.html | 8 +- .../BaseComponent/DJIBaseComponent.html | 8 +- ...mponent_DJIComponentListenerInterface.html | 8 +- .../Components/Battery/DJIBattery.html | 8 +- .../Battery/DJIBattery_AggregationState.html | 8 +- ...regation_StateUpdateCallbackInterface.html | 8 +- .../Battery/DJIBattery_BatteryOverview.html | 8 +- .../Battery/DJIBattery_BatteryState.html | 8 +- ...IBattery_StateUpdateCallbackInterface.html | 8 +- .../Battery/DJIBattery_WarningRecord.html | 8 +- .../Components/Camera/DJICamera.html | 18 +- ...eneratedNewMediaFileCallbackInterface.html | 8 +- ...atedTimeLapsePreviewCallbackInterface.html | 8 +- .../Camera/DJICamera_CameraPeakThreshold.html | 8 +- ...eraReceivedVideoDataCallbackInterface.html | 8 +- ...urrentExposureValuesCallbackInterface.html | 8 +- ...meraUpdatedLensStateCallbackInterface.html | 8 +- ...ameraUpdatedSSDStateCallbackInterface.html | 8 +- ...aUpdatedStorageStateCallbackInterface.html | 8 +- ...raUpdatedSystemStateCallbackInterface.html | 8 +- ...raVideoStreamSource_CallbackInterface.html | 8 +- .../DJICamera_ColorWaveformSettings.html | 8 +- ...DJICamera_DJICameraExposureParameters.html | 8 +- ...amera_DJICameraFocusAssistantSettings.html | 8 +- .../DJICamera_DJICameraHybridZoomSpec.html | 8 +- ...mera_DJICameraLaserMeasureInformation.html | 10 +- ...rMeasureInformation_CallbackInterface.html | 8 +- .../Camera/DJICamera_DJICameraLensState.html | 8 +- ...a_DJICameraMultispectralExposureState.html | 8 +- ...pectralExposureStateCallbackInterface.html | 8 +- ...DJICameraMultispectralStorageSettings.html | 8 +- ...tings_StoragePhotoCamerasParamBuilder.html | 8 +- .../DJICamera_DJICameraOpticalZoomSpec.html | 8 +- ...Camera_DJICameraOriginalPhotoSettings.html | 8 +- .../Camera/DJICamera_DJICameraParameters.html | 8 +- ...DJICameraParameters_ListenerInterface.html | 8 +- ...ureCompensationRangeCallbackInterface.html | 8 +- ...ralShutterSpeedRangeCallbackInterface.html | 8 +- ...DJICamera_DJICameraPhotoIntervalParam.html | 8 +- ...amera_DJICameraPhotoTimeLapseSettings.html | 8 +- ...DJICamera_DJICameraPictureStylePreset.html | 8 +- .../DJICamera_DJICameraSDCardState.html | 8 +- ...era_DJICameraSSDClipFileNameInterface.html | 8 +- .../Camera/DJICamera_DJICameraSSDState.html | 8 +- .../DJICamera_DJICameraSettingsDef.html | 8 +- .../DJICamera_DJICameraStreamSettings.html | 8 +- .../DJICamera_DJICameraSystemState.html | 8 +- ...eraThermalAreaTemperatureAggregations.html | 8 +- ...DJICameraThermalExternalSceneSettings.html | 8 +- .../DJICamera_DJICameraThermalProfile.html | 8 +- ..._DJICameraVideoResolutionAndFrameRate.html | 8 +- .../DJICamera_DJICameraWatermarkSettings.html | 8 +- ...Camera_DJICameraWhiteBalanceInterface.html | 8 +- .../Components/Camera/DJICamera_DJILens.html | 8 +- .../DJICamera_DJILens_LensCapabilities.html | 22 +- ...DJILens_TapZoomStateCallbackInterface.html | 8 +- ...Lens_TemperatureDataCallbackInterface.html | 8 +- ...ermalGainModeTemperatureRangeCallback.html | 8 +- ...Lens_ThermalGlobalTemperatureCallback.html | 8 +- .../Camera/DJICamera_StabilizationState.html | 8 +- ...ICamera_TapZoomStateCallbackInterface.html | 8 +- ...mera_TemperatureDataCallbackInterface.html | 8 +- ...eAggregationsUpdatedCallbackInterface.html | 8 +- ...SceneSettingsUpdatedCallbackInterface.html | 8 +- ...mera_histogramUpdateCallbackInterface.html | 8 +- ...s_DJILensParameters_ListenerInterface.html | 8 +- .../Components/Camera/DJIMediaManager.html | 8 +- ...nager_CameraDownloadListenerInterface.html | 8 +- .../DJIMediaManager_DJIFetchMediaTask.html | 8 +- ...r_DJIFetchMediaTask_CallbackInterface.html | 8 +- .../Camera/DJIMediaManager_DJIMedia.html | 8 +- ...DJIMediaManager_DJIMedia_DJIMediaFile.html | 8 +- ...IMediaManager_FetchMediaTaskScheduler.html | 8 +- ...DJIMediaManager_FileListStateListener.html | 8 +- ...eoPlayback_DJIMediaVideoPlaybackState.html | 8 +- ...teVideoPlaybackStateCallbackInterface.html | 8 +- .../Components/Camera/DJIPlaybackManager.html | 8 +- ...r_CameraFileDownloadCallbackInterface.html | 8 +- ...ICameraPlayBackStateCallBackInterface.html | 8 +- ...laybackManager_DJICameraPlaybackState.html | 8 +- .../CodecManager/DJICodecManager.html | 8 +- ...CodecManager_YuvDataCallbackInterface.html | 8 +- .../Components/Compass/DJICompass.html | 8 +- ...mpass_CompassCalibrationStateCallback.html | 8 +- .../DJIDataProtectionManager.html | 8 +- .../Diagnostics/DJIDiagnostics.html | 8 +- ...DJIDiagnosticsDeviceHealthInformation.html | 8 +- .../DJIDiagnostics_DJIDiagnosticsError.html | 8 +- ...agnosticsInformationCallbackInterface.html | 8 +- .../DJIAirSenseAirplaneState.html | 8 +- ...rSenseAirplaneState_callbackInterface.html | 8 +- .../DJIAirSenseSystemInformation.html | 8 +- ...seSystemInformation_callbackInterface.html | 8 +- .../FlightController/DJIFlightController.html | 30 +- .../DJIFlightController_DJIAttitude.html | 8 +- ...oller_DJIFlightControllerCurrentState.html | 8 +- ..._DJIFlightControllerSmartGoHomeStatus.html | 8 +- ...oller_DJIFlightControllerLEDsSettings.html | 8 +- ...IFlightControllerLEDsSettings_Builder.html | 8 +- ...lightController_DJIGravityCenterState.html | 8 +- ...ghtController_DJILocationCoordinate2D.html | 8 +- ...ghtController_DJILocationCoordinate3D.html | 8 +- ...ller_DJIVirtualStickFlightControlData.html | 8 +- .../DJIFlightController_Limits.html | 8 +- ...taFromExternalDeviceCallbackInterface.html | 8 +- ...er_UpdateSystemStateCallbackInterface.html | 8 +- ...JIGravityCenterStateInterfaceCallback.html | 8 +- .../FlightHubManager/DJIFlightHubManager.html | 8 +- ...ghtHubManager_DJIFlightHubBoundDevice.html | 8 +- ...er_DJIFlightHubFlightHistoricalDetail.html | 8 +- ...HubManager_DJIFlightHubFlightPathNode.html | 8 +- ...bManager_DJIFlightHubHistoricalFlight.html | 8 +- ...ightHubManager_DJIFlightHubLiveStream.html | 8 +- ...htHubManager_DJIFlightHubOnlineDevice.html | 8 +- ...anager_DJIFlightHubRealTimeFlightData.html | 8 +- ...ightHubManager_DJIFlightHubStatistics.html | 8 +- .../DJIFlightHubManager_DJIFlightHubTeam.html | 8 +- ...FlightHubManager_DJIFlightHubUpStream.html | 8 +- .../DJIFlightHubManager_DJIFlightHubUser.html | 8 +- ...r_UpdatedUploadStateCallbackInterface.html | 8 +- .../FlyZoneManager/DJIFlyZoneManager.html | 8 +- ...FlyZoneManager_DJIFlySafeNotification.html | 8 +- ...IFlySafeNotificationCallbackInterface.html | 8 +- ...ger_DJIFlySafeReturnToHomeInformation.html | 8 +- ...IFlyZoneManager_DJIFlyZoneInformation.html | 8 +- ...FlyingSafetySeriousWarningInformation.html | 8 +- .../DJIFlyZoneManager_DJIFlyingSafetyTip.html | 8 +- ...ger_DJIFlyingSafetyWarningInformation.html | 8 +- ...lyZoneManager_DJIIndividualUnlockZone.html | 8 +- ...yZoneManager_DJISubFlyZoneInformation.html | 8 +- ...JIFlyZoneManager_DJIUnlockedZoneGroup.html | 8 +- ...gradeProgressUpdatedCallbackInterface.html | 8 +- ...yForbidStatusUpdatedCallbackInterface.html | 8 +- .../Components/Gimbal/DJIGimbal.html | 16 +- ...Gimbal_DJIGimbalBalanceDetectionState.html | 8 +- ...lanceDetectionState_callbackInterface.html | 8 +- ...bal_DJIGimbalCoaxialityDetectionState.html | 8 +- ...alityDetectionState_CallbackInterface.html | 8 +- ...imbalControlParametersAutoTuningState.html | 8 +- ...tersAutoTuningState_CallbackInterface.html | 8 +- .../DJIGimbal_DJIGimbalDirectionState.html | 8 +- .../Gimbal/DJIGimbal_DJIGimbalRotation.html | 8 +- ...IGimbal_DJIGimbalRotation_Constructor.html | 8 +- ...DJIMultiGimbalConnectionWorkingStatus.html | 8 +- .../Gimbal/DJIGimbal_GimbalState.html | 8 +- .../Components/Gimbal/DJIGimbal_attitude.html | 8 +- ...emainingEnergyUpdateCallbackInterface.html | 8 +- .../DJIGimbal_movementSettingsState.html | 8 +- ...tSettingsStateUpdateCallbackInterface.html | 8 +- ...JIGimbal_stateUpdateCallbackInterface.html | 8 +- .../DJIHandheldController.html | 8 +- ...er_DJIHandheldControllerHardwareState.html | 8 +- ...oller_DJIHandheldControllerLEDCommand.html | 8 +- ..._DJIHandheldControllerLEDColorPattern.html | 8 +- ...DJIHandheldPowerModeListenerInterface.html | 8 +- ...IUpdateHardwareStateCallbackInterface.html | 8 +- ...ller_IMUStateChangedCallbackInterface.html | 8 +- .../Components/IMUState/DJIIMUState.html | 8 +- ...DJIIMUMultiOrientationCalibrationHint.html | 8 +- .../DJIFlightAssistantPerceptionState.html | 8 +- ...ssistant_ObstacleAvoidanceSensorState.html | 8 +- .../DJIIntelligentFlightAssistant.html | 10 +- ...teVisionControlStateCallbackInterface.html | 8 +- ...VisionFaceAwareStateCallbackInterface.html | 8 +- ...sionPalmControlStateCallbackInterface.html | 8 +- ...ionSmartCaptureStateCallbackInterface.html | 8 +- .../DJISmartCaptureState.html | 8 +- ...nDetectionState_DJIVisionControlState.html | 8 +- .../KeyManager/DJIAccessoryKey.html | 8 +- .../Components/KeyManager/DJIAirLinkKey.html | 8 +- .../Components/KeyManager/DJIBatteryKey.html | 8 +- .../Components/KeyManager/DJICameraKey.html | 8 +- .../KeyManager/DJIDiagnosticsKey.html | 8 +- .../KeyManager/DJIFlightControllerKey.html | 8 +- .../Components/KeyManager/DJIGimbalKey.html | 8 +- .../KeyManager/DJIHandheldControllerKey.html | 8 +- .../Components/KeyManager/DJIKey.html | 8 +- .../Components/KeyManager/DJIKeyManager.html | 8 +- ...JIKeyManager_ActionCallback_Interface.html | 8 +- ...eyManager_DJIKeyedListenerUpdateBlock.html | 8 +- .../DJIKeyManager_GetCallback_Interface.html | 8 +- .../DJIKeyManager_SetCallback_Interface.html | 8 +- .../Components/KeyManager/DJIPayloadKey.html | 8 +- .../Components/KeyManager/DJIProductKey.html | 8 +- .../KeyManager/DJIRTKBaseStationKey.html | 8 +- .../Components/KeyManager/DJIRadarKey.html | 8 +- .../KeyManager/DJIRemoteControllerKey.html | 8 +- .../Components/LBAirLink/DJILBAirLink.html | 8 +- ...BAirLink_AntennaRSSICallbackInterface.html | 8 +- ...rLink_DJILBAirLinkChannelInterference.html | 8 +- ...JILBAirLink_DJILightbridgeAntennaRSSI.html | 8 +- ...lChannelInterferenceCallbackInterface.html | 8 +- .../Components/LDMManager/DJILDMManager.html | 36 +- .../DJILDMManager_LDMCallbackInterface.html | 8 +- .../LDMManager/DJILDMManager_LDMModule.html | 1434 ++++++++++++++++ .../DJILDMManager_LDMModule_Builder.html | 1437 +++++++++++++++++ .../LandingGear/DJILandingGear.html | 8 +- .../DJILiveStreamManager.html | 8 +- .../ActiveTrackMissionOperatorListener.html | 8 +- .../Missions/DJIActiveTrackMission.html | 8 +- .../Missions/DJIActiveTrackMissionEvent.html | 8 +- .../DJIActiveTrackMissionOperator.html | 8 +- .../Missions/DJIActiveTrackMissionState.html | 8 +- ...veTrackMission_DJISubjectSensingState.html | 8 +- .../Missions/DJIActiveTrackTrackingState.html | 8 +- .../Missions/DJIAircraftYawAction.html | 8 +- ...ftYawAction_DJIAircraftYawActionError.html | 8 +- .../Missions/DJIFollowMeMission.html | 8 +- .../Missions/DJIFollowMeMissionEvent.html | 8 +- .../Missions/DJIFollowMeMissionOperator.html | 8 +- .../DJIFollowMeMissionOperatorListener.html | 8 +- .../Missions/DJIFollowMeMissionState.html | 8 +- .../Missions/DJIGimbalAttitudeAction.html | 8 +- ...deAction_DJIGimbalAttitudeActionError.html | 8 +- .../Components/Missions/DJIGoHomeAction.html | 8 +- .../Components/Missions/DJIGoToAction.html | 8 +- .../DJIGoToAction_DJIGoToActionError.html | 8 +- .../Missions/DJIHotPointMission.html | 10 +- .../Missions/DJIHotpointAction.html | 8 +- .../Missions/DJIHotpointMissionEvent.html | 8 +- .../Missions/DJIHotpointMissionOperator.html | 8 +- .../DJIHotpointMissionOperatorListener.html | 8 +- .../Missions/DJIHotpointMissionState.html | 8 +- .../DJIIntelligentHotpointMission.html | 8 +- ...DJIIntelligentHotpointMissionOperator.html | 8 +- ...pointMissionOperatorListenerInterface.html | 8 +- ...or_DJIIntelligentHotpointMissionEvent.html | 8 +- ...or_DJIIntelligentHotpointMissionState.html | 8 +- .../Components/Missions/DJILandAction.html | 8 +- .../Components/Missions/DJIMissionAction.html | 8 +- .../Missions/DJIMissionControl.html | 8 +- .../Missions/DJIMissionControlError.html | 8 +- .../DJIMissionControlTimelineElement.html | 8 +- ...MissionControlTimelineElementFeedback.html | 8 +- ...ionControlTimelineEventBlockInterface.html | 8 +- .../Missions/DJIMissionTrigger.html | 8 +- ...igger_DJIAircraftLandedMissionTrigger.html | 8 +- ...Trigger_DJIBatteryLevelMissionTrigger.html | 8 +- ...gger_DJIMissionTriggerActionInterface.html | 8 +- ...gger_DJIWaypointReachedMissionTrigger.html | 8 +- .../DJIMissionTrigger_listenerInterface.html | 8 +- .../Missions/DJIPanoramaMissionEvent.html | 8 +- .../Missions/DJIPanoramaMissionOperator.html | 8 +- .../Missions/DJIPanoramaMissionState.html | 8 +- ...oramaMission_DJIPanoramaMissionStatus.html | 8 +- .../Missions/DJIRecordVideoAction.html | 8 +- ...VideoAction_DJIRecordVideoActionError.html | 8 +- .../Missions/DJIShootPhotoAction.html | 8 +- ...tPhotoAction_DJIShootPhotoActionError.html | 8 +- .../Components/Missions/DJITakeOffAction.html | 8 +- .../Components/Missions/DJITapFlyMission.html | 8 +- .../Missions/DJITapFlyMissionEvent.html | 8 +- .../Missions/DJITapFlyMissionOperator.html | 8 +- .../Missions/DJITapFlyMissionState.html | 8 +- ...TapFlyMission_DJITapFlyExecutionState.html | 8 +- .../Missions/DJITapFlyMission_DJIVector.html | 8 +- .../Components/Missions/DJITriggerable.html | 8 +- .../Components/Missions/DJIWaypoint.html | 12 +- .../Missions/DJIWaypointMission.html | 12 +- .../DJIWaypointMissionDownloadEvent.html | 8 +- .../Missions/DJIWaypointMissionEvent.html | 8 +- .../DJIWaypointMissionExecutionEvent.html | 8 +- .../Missions/DJIWaypointMissionOperator.html | 35 +- .../DJIWaypointMissionOperator_Listener.html | 8 +- .../Missions/DJIWaypointMissionState.html | 8 +- .../DJIWaypointMissionUploadEvent.html | 8 +- .../Missions/DJIWaypointMission_Builder.html | 8 +- ...ntMission_DJIWaypointDownloadProgress.html | 8 +- ...tMission_DJIWaypointExecutionProgress.html | 8 +- ...ission_DJIWaypointMissionInterruption.html | 8 +- ...ointMission_DJIWaypointUploadProgress.html | 8 +- .../Components/Missions/DJIWaypointV2.html | 10 +- .../Missions/DJIWaypointV2Action.html | 10 +- ...aypointV2ActionDownloadEventInterface.html | 8 +- ...ointV2ActionDownloadProgressInterface.html | 8 +- .../DJIWaypointV2ActionExecutionEvent.html | 8 +- ...intV2ActionExecutionProgressInterface.html | 8 +- ...IWaypointV2ActionUploadEventInterface.html | 8 +- ...ypointV2ActionUploadProgressInterface.html | 8 +- .../DJIWaypointV2Action_ActionTypes.html | 8 +- .../Missions/DJIWaypointV2Action_Builder.html | 8 +- ...aypointV2Action_DJIWaypointV2Actuator.html | 8 +- ...2Action_DJIWaypointV2Actuator_Builder.html | 8 +- ...WaypointV2Action_DJIWaypointV2Trigger.html | 8 +- ...V2Action_DJIWaypointV2Trigger_Builder.html | 8 +- ...ator_DJIWaypointCameraCustomNameParam.html | 8 +- ...WaypointCameraCustomNameParam_Builder.html | 8 +- ...tor_DJIWaypointV2AircraftControlParam.html | 8 +- ...aypointV2AircraftControlParam_Builder.html | 8 +- ...ator_DJIWaypointV2CameraActuatorParam.html | 8 +- ...WaypointV2CameraActuatorParam_Builder.html | 8 +- ...ator_DJIWaypointV2GimbalActuatorParam.html | 8 +- ...WaypointV2GimbalActuatorParam_Builder.html | 8 +- ...IWaypointV2AircraftControlFlyingParam.html | 8 +- ...tV2AircraftControlFlyingParam_Builder.html | 8 +- ...ntV2AircraftControlRotateHeadingParam.html | 8 +- ...raftControlRotateHeadingParam_Builder.html | 8 +- ...m_DJIWaypointV2CameraFocalLengthParam.html | 8 +- ...pointV2CameraFocalLengthParam_Builder.html | 8 +- ...orParam_DJIWaypointV2CameraFocusParam.html | 8 +- ...DJIWaypointV2CameraFocusParam_Builder.html | 8 +- .../Missions/DJIWaypointV2Mission.html | 8 +- .../DJIWaypointV2MissionDownloadEvent.html | 8 +- .../DJIWaypointV2MissionExecutionEvent.html | 8 +- .../DJIWaypointV2MissionOperator.html | 8 +- ...perator_DJIWaypointV2DownloadProgress.html | 8 +- ...erator_DJIWaypointV2ExecutionProgress.html | 8 +- ...nOperator_DJIWaypointV2UploadProgress.html | 8 +- .../DJIWaypointV2MissionUploadEvent.html | 8 +- .../DJIWaypointV2Mission_Builder.html | 8 +- ...er_DJIWaypointV2AssociateTriggerParam.html | 8 +- ...ypointV2AssociateTriggerParam_Builder.html | 8 +- ...ger_DJIWaypointV2IntervalTriggerParam.html | 8 +- ...aypointV2IntervalTriggerParam_Builder.html | 8 +- ...r_DJIWaypointV2ReachPointTriggerParam.html | 8 +- ...pointV2ReachPointTriggerParam_Builder.html | 8 +- ...r_DJIWaypointV2TrajectoryTriggerParam.html | 8 +- ...pointV2TrajectoryTriggerParam_Builder.html | 8 +- .../Missions/DJIWaypointV2_Builder.html | 8 +- .../DJIWaypoint_DJIWaypointAction.html | 10 +- .../PanoramaMissionOperatorListener.html | 8 +- .../TapFlyMissionOperatorListener.html | 8 +- .../Components/Missions/TimelineMission.html | 8 +- .../WaypointV2ActionListenerInterface.html | 8 +- ...intV2MissionOperatorListenerInterface.html | 8 +- .../DJIMobileRemoteController.html | 8 +- .../OcuSyncLink/DJIOcuSyncLink.html | 10 +- ...cLink_DJIOcuSyncFrequencyInterference.html | 8 +- ...ticInterferenceLevelCallbackInterface.html | 8 +- ...yInterferenceUpdatedCallbackInterface.html | 8 +- ...ceivedWarningMessageCallbackInterface.html | 8 +- ...VideoDataRateUpdatedCallbackInterface.html | 8 +- .../ParamCapability/DJIParamCapability.html | 8 +- ...amCapability_DJIParamCapabilityMinMax.html | 8 +- .../Components/Payload/DJIPayload.html | 10 +- .../Payload/DJIPayload_ActivateInfo.html | 8 +- ...IPayload_CommandDataCallbackInterface.html | 8 +- ...IPayload_HintMessageCallbackInterface.html | 8 +- .../Payload/DJIPayload_PayloadWidget.html | 8 +- ...Payload_PayloadWidgetDownloadListener.html | 8 +- .../DJIPayload_PayloadWidgetListener.html | 8 +- ...JIPayload_StreamDataCallbackInterface.html | 8 +- ...ad_VideoDataReceivedCallbackInterface.html | 8 +- ...d_WidgetValueChangedCallbackInterface.html | 8 +- .../Components/Pipeline/DJIPipeline.html | 8 +- .../Components/Pipeline/DJIPipelines.html | 8 +- docs/API Reference/Components/RTK/DJIRTK.html | 12 +- .../RTK/DJIRTKNetworkServiceProvider.html | 8 +- ...viceProvider_DJIRTKNetworkServicePlan.html | 8 +- ...ovider_DJIRTKNetworkServicePlansState.html | 8 +- ...JIRTKNetworkServicePlansState_Builder.html | 8 +- ...Provider_DJIRTKNetworkServiceSettings.html | 8 +- ...iceProvider_DJIRTKNetworkServiceState.html | 8 +- ...er_DJIRTKNetworkServiceState_callback.html | 8 +- .../DJIRTK_DJILocationStandardDeviation.html | 8 +- .../DJIRTK_DJIRTKBaseStationInformation.html | 8 +- .../RTK/DJIRTK_DJIRTKReceiverInfo.html | 8 +- ...DJIRTKReferenceStationSource_Callback.html | 8 +- .../Components/RTK/DJIRTK_DJIRTKState.html | 8 +- ...K_RTKBaseStationListCallbackInterface.html | 8 +- ...ationReferenceSourceCallbackInterface.html | 8 +- ...JIRTK_updateRtkStateCallbackInterface.html | 8 +- .../RTKBaseStation/DJIRTKBaseStation.html | 8 +- ...Station_DJIRTKBaseStationBatteryState.html | 8 +- ...eStationBatteryStateCallbackInterface.html | 8 +- ...RTKBaseStation_DJIRTKBaseStationState.html | 8 +- ...IRTKBaseStationStateCallbackInterface.html | 8 +- .../Components/Radar/DJIRadar.html | 8 +- .../RemoteController/DJIRemoteController.html | 8 +- ...RemoteController_DJIRCAircraftMapping.html | 8 +- ...eController_DJIRCAircraftStickMapping.html | 8 +- .../DJIRemoteController_DJIRCBatteryInfo.html | 8 +- .../DJIRemoteController_DJIRCFiveDButton.html | 8 +- .../DJIRemoteController_DJIRCGPSData.html | 8 +- ...oteController_DJIRCGimbalControlSpeed.html | 8 +- ...JIRemoteController_DJIRCGimbalMapping.html | 8 +- ...oteController_DJIRCGimbalStickMapping.html | 8 +- .../DJIRemoteController_DJIRCGpsTime.html | 8 +- ...oteController_DJIRCHardwareRightWheel.html | 8 +- ...JIRemoteController_DJIRCHardwareState.html | 12 +- ...eController_DJIRCHardwareState_Button.html | 8 +- ...ler_DJIRCHardwareTransformationSwitch.html | 8 +- .../DJIRemoteController_DJIRCInfo.html | 8 +- ...emoteController_DJIRCMasterSlaveState.html | 8 +- ...ller_DJIRCMultiDeviceAggregationState.html | 8 +- ...iceAggregationState_callbackInterface.html | 8 +- ...emoteController_DJIRCRemoteFocusState.html | 8 +- .../DJIRemoteController_GPSLocation.html | 8 +- ...ontroller_JoinMasterAuthorizationInfo.html | 8 +- ...ler_JoinedMasterNameAndPasswordResult.html | 8 +- ...ller_MasterSearchingCallbackInterface.html | 8 +- .../DJIRemoteController_ProfessionalRC.html | 8 +- ...er_ProfessionalRC_ButtonConfiguration.html | 8 +- ...ssionalRC_ButtonConfiguration_Builder.html | 8 +- ...ller_ProfessionalRC_CallbackInterface.html | 8 +- ...RemoteController_ProfessionalRC_Event.html | 8 +- ...RCBatteryStateUpdateCallbackInterface.html | 8 +- ...moteController_RCCustomButtonTagParam.html | 8 +- ...er_RCCustomButtonTagParam_Constructor.html | 8 +- ...CHardwareStateUpdateCallbackInterface.html | 8 +- ...trolRequestFromSlaveCallbackInterface.html | 8 +- ...moteFocusStateUpdateCallbackInterface.html | 8 +- ...hannelEnabledUpdatedCallbackInterface.html | 8 +- ...teController_ResponseForGimbalControl.html | 8 +- ...dateMasterSlaveStateCallbackInterface.html | 8 +- ...roller_updateGpsDataCallbackInterface.html | 8 +- .../Components/SDKError/DJIError.html | 8 +- .../DJIError_DJIAccessLockerError.html | 8 +- ...DJIError_DJIAccessoryAggregationError.html | 8 +- .../SDKError/DJIError_DJIAirLinkError.html | 8 +- .../SDKError/DJIError_DJIBatteryError.html | 8 +- .../SDKError/DJIError_DJICameraError.html | 10 +- .../DJIError_DJIFlightControllerError.html | 8 +- .../SDKError/DJIError_DJIGeoError.html | 8 +- .../SDKError/DJIError_DJIGimbalError.html | 8 +- .../SDKError/DJIError_DJILDMError.html | 8 +- .../DJIError_DJIMissionManagerError.html | 14 +- .../SDKError/DJIError_DJIPayloadError.html | 8 +- .../SDKError/DJIError_DJIPipelineError.html | 8 +- .../DJIError_DJIRTKNetworkServiceError.html | 12 +- .../DJIError_DJIRemoteControllerError.html | 8 +- .../SDKError/DJIError_DJISDKCacheError.html | 8 +- .../SDKError/DJIError_DJISDKError.html | 8 +- .../DJIError_DJISDKFlightHubError.html | 8 +- .../SDKError/DJIError_DJIUTMISSError.html | 8 +- .../SDKError/DJIError_DJIUpgradeError.html | 8 +- .../SDKError/DJIError_DJIWaypointV2Error.html | 8 +- .../DJIError_DataProtectionError.html | 8 +- .../DJIBluetoothProductConnector.html | 8 +- ...oothProductConnectorListenerInterface.html | 8 +- ...thProductConnector_DJIBluetoothDevice.html | 8 +- .../Components/SDKManager/DJISDKManager.html | 69 +- .../DJISDKManager_DJISDKInitEvent.html | 8 +- ...anager_DJISDKManagerCallbackInterface.html | 8 +- .../Components/Simulator/DJIAccessLocker.html | 8 +- ...Locker_DJIAccessLockerFormattingState.html | 8 +- ...ckerFormattingState_callbackInterface.html | 8 +- ...JIAccessLockerState_CallbackInterface.html | 8 +- ...Locker_DJIAccessLockerUserAccountInfo.html | 8 +- .../Components/Simulator/DJISimulator.html | 8 +- ...ulator_DJISimulatorInitializationData.html | 8 +- .../DJISimulator_DJISimulatorState.html | 8 +- ...edSimulatorStateDataCallbackInterface.html | 8 +- .../Components/Stick/DJIStick.html | 8 +- .../UTMISSManager/DJIUTMISSManager.html | 8 +- .../DJIUTMISSManager_DJIUTMISSParam.html | 8 +- ...aUpdatedUploadStatusCallbackInterface.html | 8 +- .../Components/Upgrade/DJIUpgradeManager.html | 8 +- ...DJIUpgradeManager_DJIUpgradeComponent.html | 8 +- ...gradeComponent_DJIFirmwareInformation.html | 8 +- ...eComponent_DJIFirmwareUpgradeProgress.html | 8 +- ...nent_UpgradeFirmwareListenerInterface.html | 8 +- ...anager_UpgradeComponentChangeListener.html | 8 +- .../DJIUserAccountManager.html | 8 +- ...AccountManager_UserAccountInformation.html | 8 +- ...erAccountStateChangeListenerInterface.html | 8 +- ...etectionStateUpdatedCallbackInterface.html | 8 +- .../DJIVisionDetectionState.html | 8 +- ...tectionState_DJIVisionDetectionSector.html | 8 +- .../Components/WiFiLink/DJIWiFiLink.html | 8 +- ...JIWiFiLink_DJIWiFiChannelInterference.html | 8 +- ...SignalQualityChangedCallbackInterface.html | 8 +- .../DJIWiFiLink_RSSICallbackInterface.html | 8 +- .../Products/Aircraft/DJIAircraft.html | 8 +- .../Products/Handheld/DJIHandheld.html | 8 +- .../Utils/DJICommonCallbacks.html | 8 +- ...pletionCallbackWithTwoParam_Interface.html | 8 +- ...acks_CompletionCallbackWith_Interface.html | 8 +- ...allbacks_CompletionCallback_Interface.html | 8 +- docs/API Reference/Utils/DJILocationUtil.html | 8 +- .../Utils/DJIVideoSizeCalculatorUtil.html | 8 +- .../DJIVideoSizeCalculatorUtil_Interface.html | 8 +- .../Utils/DJIWarningStatusItem.html | 8 +- docs/API Reference/index.html | 2 +- .../API Reference/javascripts/search_index.js | 562 ++++--- docs/API Reference/stylesheets/doc-app.css | 2 +- docs/API Reference/stylesheets/doc-vendor.css | 2 +- docs/SDK APIs Diff/4.13_4.14_diff.html | 4 +- 515 files changed, 7379 insertions(+), 1265 deletions(-) create mode 100644 docs/API Reference/Components/LDMManager/DJILDMManager_LDMModule.html create mode 100644 docs/API Reference/Components/LDMManager/DJILDMManager_LDMModule_Builder.html 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"> - - + +