diff --git a/README.md b/README.md
index d5a8b44..10ca965 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# DJI UX SDK for Android Latest Version 4.15
+# DJI UX SDK for Android Latest Version 4.16
## What is This?
@@ -13,20 +13,20 @@ Declare dependency via Maven:
com.dji
dji-uxsdk
- 4.15
+ 4.16
com.dji
dji-sdk-provided
- 4.15.1
+ 4.16
~~~
or Gradle:
~~~groovy
-implementation ('com.dji:dji-uxsdk:4.15', {
+implementation ('com.dji:dji-uxsdk:4.16', {
/**
* Comment the "library-anti-distortion" if your app does need Anti Distortion for Mavic 2 Pro and Mavic 2 Zoom.
* Comment the "fly-safe-database" if you do not need database for release, or we will download it when DJISDKManager.getInstance().registerApp
@@ -42,7 +42,7 @@ implementation ('com.dji:dji-uxsdk:4.15', {
*/
// exclude group: 'com.amap.api'
})
-compileOnly ('com.dji:dji-sdk-provided:4.15.1')
+compileOnly ('com.dji:dji-sdk-provided:4.16')
~~~
For further detail on how to integrate the DJI UX SDK into your Android Studio project, please check the [Getting Started with UX SDK](http://developer.dji.com/mobile-sdk/documentation/android-tutorials/UXSDKDemo.html#import-maven-dependency) tutorial.
diff --git a/sample/app/build.gradle b/sample/app/build.gradle
index eb1c165..4cbc700 100644
--- a/sample/app/build.gradle
+++ b/sample/app/build.gradle
@@ -77,14 +77,14 @@ android {
}
dependencies {
- implementation ('com.dji:dji-uxsdk:4.15', {
+ implementation ('com.dji:dji-uxsdk:4.16', {
/**
* Uncomment the following line to exclude amap from the app.
* Note that Google Play Store does not allow APKs that include this library.
*/
// exclude group: 'com.amap.api'
})
- compileOnly ('com.dji:dji-sdk-provided:4.15.1')
+ compileOnly ('com.dji:dji-sdk-provided:4.16')
// AMAP: Do not include if publishing to Google Play Store
implementation 'com.amap.api:3dmap:7.3.0'
diff --git a/sample/app/src/main/java/com/dji/ux/sample/CompleteWidgetActivity.java b/sample/app/src/main/java/com/dji/ux/sample/CompleteWidgetActivity.java
index 14164bd..903e2fd 100644
--- a/sample/app/src/main/java/com/dji/ux/sample/CompleteWidgetActivity.java
+++ b/sample/app/src/main/java/com/dji/ux/sample/CompleteWidgetActivity.java
@@ -13,18 +13,26 @@
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
-import androidx.annotation.NonNull;
-
import com.dji.mapkit.core.maps.DJIMap;
-import com.dji.mapkit.core.models.DJILatLng;
-import dji.common.airlink.PhysicalSource;
import dji.keysdk.CameraKey;
import dji.keysdk.KeyManager;
-import dji.sdk.camera.VideoFeeder;
+import dji.ux.panel.CameraSettingAdvancedPanel;
+import dji.ux.panel.CameraSettingExposurePanel;
+import dji.ux.utils.DJIProductUtil;
+import dji.ux.widget.FPVOverlayWidget;
import dji.ux.widget.FPVWidget;
import dji.ux.widget.MapWidget;
+import dji.ux.widget.ThermalPaletteWidget;
+import dji.ux.widget.config.CameraConfigApertureWidget;
+import dji.ux.widget.config.CameraConfigEVWidget;
+import dji.ux.widget.config.CameraConfigISOAndEIWidget;
+import dji.ux.widget.config.CameraConfigSSDWidget;
+import dji.ux.widget.config.CameraConfigShutterWidget;
+import dji.ux.widget.config.CameraConfigStorageWidget;
+import dji.ux.widget.config.CameraConfigWBWidget;
import dji.ux.widget.controls.CameraControlsWidget;
+import dji.ux.widget.controls.LensControlWidget;
/**
* Activity that shows all the UI elements together
@@ -35,10 +43,25 @@ public class CompleteWidgetActivity extends Activity {
private ViewGroup parentView;
private FPVWidget fpvWidget;
private FPVWidget secondaryFPVWidget;
+ private FPVOverlayWidget fpvOverlayWidget;
private RelativeLayout primaryVideoView;
private FrameLayout secondaryVideoView;
private boolean isMapMini = true;
+ private CameraSettingExposurePanel cameraSettingExposurePanel;
+ private CameraSettingAdvancedPanel cameraSettingAdvancedPanel;
+ private CameraConfigISOAndEIWidget cameraConfigISOAndEIWidget;
+ private CameraConfigShutterWidget cameraConfigShutterWidget;
+ private CameraConfigApertureWidget cameraConfigApertureWidget;
+ private CameraConfigEVWidget cameraConfigEVWidget;
+ private CameraConfigWBWidget cameraConfigWBWidget;
+ private CameraConfigStorageWidget cameraConfigStorageWidget;
+ private CameraConfigSSDWidget cameraConfigSSDWidget;
+ private CameraControlsWidget controlsWidget;
+ private LensControlWidget lensControlWidget;
+ private ThermalPaletteWidget thermalPaletteWidget;
+
+
private int height;
private int width;
private int margin;
@@ -61,47 +84,38 @@ protected void onCreate(Bundle savedInstanceState) {
deviceHeight = outPoint.y;
deviceWidth = outPoint.x;
- mapWidget = findViewById(R.id.map_widget);
- mapWidget.initAMap(new MapWidget.OnMapReadyListener() {
- @Override
- public void onMapReady(@NonNull DJIMap map) {
- map.setOnMapClickListener(new DJIMap.OnMapClickListener() {
- @Override
- public void onMapClick(DJILatLng latLng) {
- onViewClick(mapWidget);
- }
- });
- map.getUiSettings().setZoomControlsEnabled(false);
- }
- });
+ mapWidget = (MapWidget) findViewById(R.id.map_widget);
+ mapWidget.initAMap(map -> map.setOnMapClickListener((DJIMap.OnMapClickListener) latLng -> onViewClick(mapWidget)));
mapWidget.onCreate(savedInstanceState);
+ initCameraView();
parentView = (ViewGroup) findViewById(R.id.root_view);
fpvWidget = findViewById(R.id.fpv_widget);
- fpvWidget.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- onViewClick(fpvWidget);
- }
- });
- primaryVideoView = (RelativeLayout) findViewById(R.id.fpv_container);
- secondaryVideoView = (FrameLayout) findViewById(R.id.secondary_video_view);
+ fpvWidget.setOnClickListener(view -> onViewClick(fpvWidget));
+ fpvOverlayWidget = findViewById(R.id.fpv_overlay_widget);
+ primaryVideoView = findViewById(R.id.fpv_container);
+ secondaryVideoView = findViewById(R.id.secondary_video_view);
secondaryFPVWidget = findViewById(R.id.secondary_fpv_widget);
- secondaryFPVWidget.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- swapVideoSource();
- }
- });
- if (VideoFeeder.getInstance() != null) {
- //If secondary video feed is already initialized, get video source
- updateSecondaryVideoVisibility(VideoFeeder.getInstance().getSecondaryVideoFeed().getVideoSource() != PhysicalSource.UNKNOWN);
- //If secondary video feed is not yet initialized, wait for active status
- VideoFeeder.getInstance().getSecondaryVideoFeed()
- .addVideoActiveStatusListener(isActive ->
- runOnUiThread(() -> updateSecondaryVideoVisibility(isActive)));
- }
+ secondaryFPVWidget.setOnClickListener(view -> swapVideoSource());
+
+ fpvWidget.setCameraIndexListener((cameraIndex, lensIndex) -> cameraWidgetKeyIndexUpdated(fpvWidget.getCameraKeyIndex(), fpvWidget.getLensKeyIndex()));
+ updateSecondaryVideoVisibility();
+ }
+
+ private void initCameraView() {
+ cameraSettingExposurePanel = findViewById(R.id.camera_setting_exposure_panel);
+ cameraSettingAdvancedPanel = findViewById(R.id.camera_setting_advanced_panel);
+ cameraConfigISOAndEIWidget = findViewById(R.id.camera_config_iso_and_ei_widget);
+ cameraConfigShutterWidget = findViewById(R.id.camera_config_shutter_widget);
+ cameraConfigApertureWidget = findViewById(R.id.camera_config_aperture_widget);
+ cameraConfigEVWidget = findViewById(R.id.camera_config_ev_widget);
+ cameraConfigWBWidget = findViewById(R.id.camera_config_wb_widget);
+ cameraConfigStorageWidget = findViewById(R.id.camera_config_storage_widget);
+ cameraConfigSSDWidget = findViewById(R.id.camera_config_ssd_widget);
+ lensControlWidget = findViewById(R.id.camera_lens_control);
+ controlsWidget = findViewById(R.id.CameraCapturePanel);
+ thermalPaletteWidget = findViewById(R.id.thermal_pallette_widget);
}
private void onViewClick(View view) {
@@ -158,29 +172,47 @@ private void swapVideoSource() {
}
}
- private void updateSecondaryVideoVisibility(boolean isActive) {
- if (isActive) {
- secondaryVideoView.setVisibility(View.VISIBLE);
- } else {
+ private void cameraWidgetKeyIndexUpdated(int keyIndex, int subKeyIndex) {
+ controlsWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ cameraSettingExposurePanel.updateKeyOnIndex(keyIndex, subKeyIndex);
+ cameraSettingAdvancedPanel.updateKeyOnIndex(keyIndex, subKeyIndex);
+ cameraConfigISOAndEIWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ cameraConfigShutterWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ cameraConfigApertureWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ cameraConfigEVWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ cameraConfigWBWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ cameraConfigStorageWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ cameraConfigSSDWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ controlsWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ lensControlWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ thermalPaletteWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+
+ fpvOverlayWidget.updateKeyOnIndex(keyIndex, subKeyIndex);
+ }
+
+ private void updateSecondaryVideoVisibility() {
+ if (secondaryFPVWidget.getVideoSource() == null || !DJIProductUtil.isSupportMultiCamera()) {
secondaryVideoView.setVisibility(View.GONE);
+ } else {
+ secondaryVideoView.setVisibility(View.VISIBLE);
}
}
private void hidePanels() {
//These panels appear based on keys from the drone itself.
if (KeyManager.getInstance() != null) {
- KeyManager.getInstance().setValue(CameraKey.create(CameraKey.HISTOGRAM_ENABLED), false, null);
- KeyManager.getInstance().setValue(CameraKey.create(CameraKey.COLOR_WAVEFORM_ENABLED), false, null);
+ KeyManager.getInstance().setValue(CameraKey.create(CameraKey.HISTOGRAM_ENABLED, fpvWidget.getCameraKeyIndex()), false, null);
+ KeyManager.getInstance().setValue(CameraKey.create(CameraKey.COLOR_WAVEFORM_ENABLED, fpvWidget.getCameraKeyIndex()), false, null);
}
//These panels have buttons that toggle them, so call the methods to make sure the button state is correct.
- CameraControlsWidget controlsWidget = findViewById(R.id.CameraCapturePanel);
controlsWidget.setAdvancedPanelVisibility(false);
controlsWidget.setExposurePanelVisibility(false);
//These panels don't have a button state, so we can just hide them.
findViewById(R.id.pre_flight_check_list).setVisibility(View.GONE);
findViewById(R.id.rtk_panel).setVisibility(View.GONE);
+ //findViewById(R.id.simulator_panel).setVisibility(View.GONE);
findViewById(R.id.spotlight_panel).setVisibility(View.GONE);
findViewById(R.id.speaker_panel).setVisibility(View.GONE);
}
diff --git a/sample/app/src/main/java/com/dji/ux/sample/CustomizedWidgetsActivity.java b/sample/app/src/main/java/com/dji/ux/sample/CustomizedWidgetsActivity.java
index aa1a0a1..3288d5e 100644
--- a/sample/app/src/main/java/com/dji/ux/sample/CustomizedWidgetsActivity.java
+++ b/sample/app/src/main/java/com/dji/ux/sample/CustomizedWidgetsActivity.java
@@ -11,6 +11,7 @@
import dji.ux.widget.FPVWidget;
public class CustomizedWidgetsActivity extends Activity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
+ private final static String TAG = "CustomizedWidgetsActivity";
private FPVWidget fpvWidget;
private FPVOverlayWidget fpvOverlayWidget;
private FPVWidget secondaryFpvWidget;
@@ -32,10 +33,13 @@ private void initView() {
((CheckBox) findViewById(R.id.checkbox_secondary_camera_name)).setOnCheckedChangeListener(this);
((CheckBox) findViewById(R.id.checkbox_primary_camera_side)).setOnCheckedChangeListener(this);
((CheckBox) findViewById(R.id.checkbox_secondary_camera_side)).setOnCheckedChangeListener(this);
+ //((CheckBox) findViewById(R.id.checkbox_primary_overexposure_warning)).setOnCheckedChangeListener(this);
+ //((CheckBox) findViewById(R.id.checkbox_secondary_overexposure_warning)).setOnCheckedChangeListener(this);
((CheckBox) findViewById(R.id.checkbox_touch_focus)).setOnCheckedChangeListener(this);
((CheckBox) findViewById(R.id.checkbox_touch_metering)).setOnCheckedChangeListener(this);
((CheckBox) findViewById(R.id.checkbox_gimbal_control)).setOnCheckedChangeListener(this);
((CheckBox) findViewById(R.id.checkbox_display_grid)).setOnCheckedChangeListener(this);
+ //((CheckBox) findViewById(R.id.checkbox_display_center_point)).setOnCheckedChangeListener(this);
findViewById(R.id.primary_video_feed).setOnClickListener(this);
findViewById(R.id.secondary_video_feed).setOnClickListener(this);
@@ -44,6 +48,15 @@ private void initView() {
findViewById(R.id.grid_type_none).setOnClickListener(this);
findViewById(R.id.grid_type_parallel).setOnClickListener(this);
findViewById(R.id.grid_type_parallel_diagonal).setOnClickListener(this);
+ /*findViewById(R.id.center_point_none).setOnClickListener(this);
+ findViewById(R.id.center_point_standard).setOnClickListener(this);
+ findViewById(R.id.center_point_cross).setOnClickListener(this);
+ findViewById(R.id.center_point_narrow_cross).setOnClickListener(this);
+ findViewById(R.id.center_point_frame).setOnClickListener(this);
+ findViewById(R.id.center_point_frame_and_cross).setOnClickListener(this);
+ findViewById(R.id.center_point_square).setOnClickListener(this);
+ findViewById(R.id.center_point_square_and_cross).setOnClickListener(this);
+ findViewById(R.id.center_point_color).setOnClickListener(this);*/
}
@@ -51,7 +64,8 @@ private void initView() {
public void resizeView() {
ViewGroup.LayoutParams params = fpvWidget.getLayoutParams();
- if (!isOriginalSize) {
+ if (!isOriginalSize)
+ {
params.height = 2 * fpvWidget.getHeight();
params.width = 2 * fpvWidget.getWidth();
} else {
@@ -69,10 +83,12 @@ public void onClick(View v) {
switch (v.getId()) {
case R.id.primary_video_feed:
fpvWidget.setVideoSource(FPVWidget.VideoSource.PRIMARY);
+ //fpvOverlayWidget.setOverlayVideoSource(FPVWidget.VideoSource.PRIMARY);
secondaryFpvWidget.setVideoSource(FPVWidget.VideoSource.SECONDARY);
break;
case R.id.secondary_video_feed:
fpvWidget.setVideoSource(FPVWidget.VideoSource.SECONDARY);
+ //fpvOverlayWidget.setOverlayVideoSource(FPVWidget.VideoSource.SECONDARY);
secondaryFpvWidget.setVideoSource(FPVWidget.VideoSource.PRIMARY);
break;
case R.id.auto_video_feed:
@@ -90,6 +106,33 @@ public void onClick(View v) {
case R.id.grid_type_parallel_diagonal:
fpvOverlayWidget.setCurrentGridOverlayType(FPVOverlayWidget.GridOverlayType.PARALLEL_DIAGONAL);
break;
+ /*case R.id.center_point_none:
+ fpvOverlayWidget.setCenterPointType(FPVOverlayWidget.CenterPointType.NONE);
+ break;
+ case R.id.center_point_standard:
+ fpvOverlayWidget.setCenterPointType(FPVOverlayWidget.CenterPointType.STANDARD);
+ break;
+ case R.id.center_point_cross:
+ fpvOverlayWidget.setCenterPointType(FPVOverlayWidget.CenterPointType.CROSS);
+ break;
+ case R.id.center_point_narrow_cross:
+ fpvOverlayWidget.setCenterPointType(FPVOverlayWidget.CenterPointType.NARROW_CROSS);
+ break;
+ case R.id.center_point_frame:
+ fpvOverlayWidget.setCenterPointType(FPVOverlayWidget.CenterPointType.FRAME);
+ break;
+ case R.id.center_point_frame_and_cross:
+ fpvOverlayWidget.setCenterPointType(FPVOverlayWidget.CenterPointType.FRAME_AND_CROSS);
+ break;
+ case R.id.center_point_square:
+ fpvOverlayWidget.setCenterPointType(FPVOverlayWidget.CenterPointType.SQUARE);
+ break;
+ case R.id.center_point_square_and_cross:
+ fpvOverlayWidget.setCenterPointType(FPVOverlayWidget.CenterPointType.SQUARE_AND_CROSS);
+ break;
+ case R.id.center_point_color:
+ setRandomCenterPointColor();
+ break;*/
}
}
@@ -109,6 +152,12 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
case R.id.checkbox_secondary_camera_side:
secondaryFpvWidget.setSourceCameraSideVisibility(isChecked);
break;
+ /*case R.id.checkbox_primary_overexposure_warning:
+ fpvWidget.setOverexposureWarningEnabled(isChecked);
+ break;
+ case R.id.checkbox_secondary_overexposure_warning:
+ secondaryFpvWidget.setOverexposureWarningEnabled(isChecked);
+ break;*/
case R.id.checkbox_touch_focus:
fpvOverlayWidget.setTouchFocusEnabled(isChecked);
break;
@@ -121,7 +170,16 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
case R.id.checkbox_display_grid:
fpvOverlayWidget.setGridOverlayEnabled(isChecked);
break;
+ //case R.id.checkbox_display_center_point:
+ //fpvOverlayWidget.setCenterPointEnabled(isChecked);
+ //break;
}
}
+
+ /*private void setRandomCenterPointColor() {
+ Random rnd = new Random();
+ @ColorInt int randomColor = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
+ fpvOverlayWidget.setCenterPointColor(randomColor);
+ }*/
}
diff --git a/sample/app/src/main/java/com/dji/ux/sample/DensityUtil.java b/sample/app/src/main/java/com/dji/ux/sample/DensityUtil.java
index 9eaa87d..dbead34 100644
--- a/sample/app/src/main/java/com/dji/ux/sample/DensityUtil.java
+++ b/sample/app/src/main/java/com/dji/ux/sample/DensityUtil.java
@@ -4,13 +4,13 @@
public class DensityUtil {
- public static int dip2px(Context context, float dpValue) {
- final float scale = context.getResources().getDisplayMetrics().density;
- return (int) (dpValue * scale + 0.5f);
- }
+ public static int dip2px(Context context, float dpValue) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (dpValue * scale + 0.5f);
+ }
- public static int px2dip(Context context, float pxValue) {
- final float scale = context.getResources().getDisplayMetrics().density;
- return (int) (pxValue / scale + 0.5f);
- }
+ public static int px2dip(Context context, float pxValue) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (pxValue / scale + 0.5f);
+ }
}
diff --git a/sample/app/src/main/java/com/dji/ux/sample/FlyZoneDialogView.java b/sample/app/src/main/java/com/dji/ux/sample/FlyZoneDialogView.java
index 7811148..b24a733 100644
--- a/sample/app/src/main/java/com/dji/ux/sample/FlyZoneDialogView.java
+++ b/sample/app/src/main/java/com/dji/ux/sample/FlyZoneDialogView.java
@@ -20,13 +20,23 @@
public class FlyZoneDialogView extends ScrollView {
- private CheckBox all;
- private CheckBox auth;
- private CheckBox warning;
- private CheckBox enhancedWarning;
- private CheckBox restricted;
- private Button btnCustomUnlockColor;
- private Button btnCustomUnlockSync;
+ CheckBox all;
+ CheckBox auth;
+ CheckBox warning;
+ CheckBox enhancedWarning;
+ CheckBox restricted;
+
+ Switch switchCustomUnlock;
+
+ Button authColor;
+ Button warningColor;
+ Button enhancedWarningColor;
+ Button restrictedColor;
+ Button maxHeightColor;
+ Button selfUnlockColor;
+ Button btnCustomUnlockColor;
+ Button btnCustomUnlockSync;
+
public FlyZoneDialogView(Context context) {
super(context);
@@ -44,14 +54,15 @@ public void init(MapWidget mapWidget) {
}
public void initCheckboxes(final MapWidget mapWidget) {
- all = findViewById(R.id.all);
- auth = findViewById(R.id.auth);
- warning = findViewById(R.id.warning);
- enhancedWarning = findViewById(R.id.enhanced_warning);
- restricted = findViewById(R.id.restricted);
- Switch switchCustomUnlock = findViewById(R.id.custom_unlock_switch);
+ all = (CheckBox) findViewById(R.id.all);
+ auth = (CheckBox) findViewById(R.id.auth);
+ warning = (CheckBox) findViewById(R.id.warning);
+ enhancedWarning = (CheckBox) findViewById(R.id.enhanced_warning);
+ restricted = (CheckBox) findViewById(R.id.restricted);
+ switchCustomUnlock = (Switch) findViewById(R.id.custom_unlock_switch);
switchCustomUnlock.setChecked(mapWidget.isCustomUnlockZonesVisible());
CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener() {
+
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
switch (compoundButton.getId()) {
@@ -99,14 +110,14 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
}
public void initColors(final MapWidget mapWidget) {
- Button authColor = findViewById(R.id.auth_color);
- Button warningColor = findViewById(R.id.warning_color);
- Button enhancedWarningColor = findViewById(R.id.enhanced_warning_color);
- Button restrictedColor = findViewById(R.id.restricted_color);
- Button maxHeightColor = findViewById(R.id.max_height_color);
- Button selfUnlockColor = findViewById(R.id.self_unlock_color);
- btnCustomUnlockColor = findViewById(R.id.custom_unlock_color);
- btnCustomUnlockSync = findViewById(R.id.custom_unlock_sync);
+ authColor = (Button) findViewById(R.id.auth_color);
+ warningColor = (Button) findViewById(R.id.warning_color);
+ enhancedWarningColor = (Button) findViewById(R.id.enhanced_warning_color);
+ restrictedColor = (Button) findViewById(R.id.restricted_color);
+ maxHeightColor = (Button) findViewById(R.id.max_height_color);
+ selfUnlockColor = (Button) findViewById(R.id.self_unlock_color);
+ btnCustomUnlockColor = (Button) findViewById(R.id.custom_unlock_color);
+ btnCustomUnlockSync = (Button) findViewById(R.id.custom_unlock_sync);
btnCustomUnlockColor.setEnabled(mapWidget.isCustomUnlockZonesVisible());
btnCustomUnlockSync.setEnabled(mapWidget.isCustomUnlockZonesVisible());
diff --git a/sample/app/src/main/java/com/dji/ux/sample/MApplication.java b/sample/app/src/main/java/com/dji/ux/sample/MApplication.java
index af8086a..f2ee9f7 100644
--- a/sample/app/src/main/java/com/dji/ux/sample/MApplication.java
+++ b/sample/app/src/main/java/com/dji/ux/sample/MApplication.java
@@ -7,8 +7,6 @@
import com.secneo.sdk.Helper;
-import static com.dji.ux.sample.DJIConnectionControlActivity.ACCESSORY_ATTACHED;
-
public class MApplication extends Application {
@Override
@@ -16,7 +14,7 @@ public void onCreate() {
super.onCreate();
BroadcastReceiver br = new OnDJIUSBAttachedReceiver();
IntentFilter filter = new IntentFilter();
- filter.addAction(ACCESSORY_ATTACHED);
+ filter.addAction(DJIConnectionControlActivity.ACCESSORY_ATTACHED);
registerReceiver(br, filter);
}
diff --git a/sample/app/src/main/java/com/dji/ux/sample/MainActivity.java b/sample/app/src/main/java/com/dji/ux/sample/MainActivity.java
index 6f373c3..4fb032c 100644
--- a/sample/app/src/main/java/com/dji/ux/sample/MainActivity.java
+++ b/sample/app/src/main/java/com/dji/ux/sample/MainActivity.java
@@ -23,10 +23,7 @@
import android.widget.TextView;
import android.widget.Toast;
-import androidx.annotation.NonNull;
-import androidx.core.app.ActivityCompat;
-import androidx.core.content.ContextCompat;
-
+import com.dji.frame.util.V_JsonUtil;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
@@ -34,16 +31,17 @@
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
+import androidx.annotation.NonNull;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
import dji.common.error.DJIError;
import dji.common.error.DJISDKError;
-import dji.common.useraccount.UserAccountState;
-import dji.common.util.CommonCallbacks;
import dji.log.DJILog;
+import dji.log.GlobalConfig;
import dji.sdk.base.BaseComponent;
import dji.sdk.base.BaseProduct;
import dji.sdk.sdkmanager.DJISDKInitEvent;
import dji.sdk.sdkmanager.DJISDKManager;
-import dji.sdk.useraccount.UserAccountManager;
/** Main activity that displays three choices to user */
public class MainActivity extends Activity implements View.OnClickListener, PopupMenu.OnMenuItemClickListener {
@@ -57,15 +55,14 @@ public class MainActivity extends Activity implements View.OnClickListener, Popu
public void onRegister(DJIError error) {
isRegistrationInProgress.set(false);
if (error == DJISDKError.REGISTRATION_SUCCESS) {
- loginAccount();
DJISDKManager.getInstance().startConnectionToProduct();
Toast.makeText(getApplicationContext(), "SDK registration succeeded!", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(),
- "Registration failed: " + error.getDescription(),
- Toast.LENGTH_LONG).show();
+ "SDK registration failed, check network and retry!" + error.getDescription(),
+ Toast.LENGTH_LONG).show();
}
}
@Override
@@ -74,14 +71,13 @@ public void onProductDisconnect() {
"product disconnect!",
Toast.LENGTH_LONG).show();
}
-
@Override
public void onProductConnect(BaseProduct product) {
Toast.makeText(getApplicationContext(),
"product connect!",
Toast.LENGTH_LONG).show();
}
-
+
@Override
public void onProductChanged(BaseProduct product) {
@@ -99,34 +95,19 @@ public void onComponentChange(BaseProduct.ComponentKey key,
@Override
public void onInitProcess(DJISDKInitEvent event, int totalProcess) {
-
+ Toast.makeText(getApplicationContext(),
+ "onInitProcess," + event + "totalProcess," + totalProcess,
+ Toast.LENGTH_LONG).show();
}
@Override
public void onDatabaseDownloadProgress(long current, long total) {
-
+ Toast.makeText(getApplicationContext(),
+ "onDatabaseDownloadProgress" + (int) (100 * current / total),
+ Toast.LENGTH_LONG).show();
}
};
- private void loginAccount(){
- UserAccountManager.getInstance().logIntoDJIUserAccount(this,
- new CommonCallbacks.CompletionCallbackWith() {
- @Override
- public void onSuccess(final UserAccountState userAccountState) {
- Toast.makeText(getApplicationContext(),
- "Login Success!",
- Toast.LENGTH_LONG).show();
- }
- @Override
- public void onFailure(DJIError error) {
- Toast.makeText(getApplicationContext(),
- "Login Error!",
- Toast.LENGTH_LONG).show();
- }
- });
-
- }
-
public static boolean isStarted() {
return isAppStarted;
}
@@ -142,7 +123,6 @@ public static boolean isStarted() {
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;
@@ -158,17 +138,17 @@ protected void onCreate(Bundle savedInstanceState) {
findViewById(R.id.bt_customized_ui_widgets).setOnClickListener(this);
findViewById(R.id.bt_map_widget).setOnClickListener(this);
TextView versionText = (TextView) findViewById(R.id.version);
- versionText.setText(getResources().getString(R.string.sdk_version, DJISDKManager.getInstance().getSDKVersion()));
+ versionText.setText("Debug:" + GlobalConfig.DEBUG + ", " + getResources().getString(R.string.sdk_version, DJISDKManager.getInstance().getSDKVersion()));
bridgeModeEditText = (EditText) findViewById(R.id.edittext_bridge_ip);
bridgeModeEditText.setText(PreferenceManager.getDefaultSharedPreferences(this).getString(LAST_USED_BRIDGE_IP,""));
bridgeModeEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH
- || actionId == EditorInfo.IME_ACTION_DONE
- || event != null
- && event.getAction() == KeyEvent.ACTION_DOWN
- && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
+ || actionId == EditorInfo.IME_ACTION_DONE
+ || event != null
+ && event.getAction() == KeyEvent.ACTION_DOWN
+ && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
if (event != null && event.isShiftPressed()) {
return false;
} else {
@@ -251,7 +231,7 @@ public void onRequestPermissionsResult(int requestCode,
if (missingPermission.isEmpty()) {
startSDKRegistration();
} else {
- Toast.makeText(getApplicationContext(), "Missing permissions! Will not register SDK to connect to aircraft.", Toast.LENGTH_LONG).show();
+ Toast.makeText(getApplicationContext(), "Missing permissions! Will not register SDK to connect to aircraft." + V_JsonUtil.toJson(missingPermission), Toast.LENGTH_LONG).show();
}
}
diff --git a/sample/app/src/main/java/com/dji/ux/sample/MapWidgetActivity.java b/sample/app/src/main/java/com/dji/ux/sample/MapWidgetActivity.java
index 5be7f98..2ef7a68 100644
--- a/sample/app/src/main/java/com/dji/ux/sample/MapWidgetActivity.java
+++ b/sample/app/src/main/java/com/dji/ux/sample/MapWidgetActivity.java
@@ -10,9 +10,6 @@
import android.graphics.Color;
import android.graphics.drawable.VectorDrawable;
import android.os.Bundle;
-import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
@@ -54,6 +51,9 @@
import java.util.List;
import java.util.Random;
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import dji.common.flightcontroller.flyzone.FlyZoneCategory;
import dji.ux.widget.MapWidget;
@@ -70,7 +70,8 @@ public class MapWidgetActivity extends Activity implements CompoundButton.OnChec
private int[] iconIds = {R.id.icon_1, R.id.icon_2, R.id.icon_3, R.id.icon_4, R.id.icon_5};
public static final String MAP_PROVIDER = "MapProvider";
- private Spinner iconSpinner, lineSpinner;
+ private Button flyZoneButton;
+ private Spinner mapSpinner, iconSpinner, lineSpinner;
private SeekBar lineWidthPicker;
private int lineWidthValue;
private TextView lineColor;
@@ -90,11 +91,11 @@ public class MapWidgetActivity extends Activity implements CompoundButton.OnChec
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_widget);
- mapWidget = findViewById(R.id.map_widget);
+ mapWidget = (MapWidget) findViewById(R.id.map_widget);
markerList = new ArrayList<>();
MapWidget.OnMapReadyListener onMapReadyListener = new MapWidget.OnMapReadyListener() {
@Override
- public void onMapReady(@NonNull final DJIMap map) {
+ public void onMapReady(@NonNull DJIMap map) {
map.setMapType(DJIMap.MapType.NORMAL);
map.setOnMarkerDragListener(new DJIMap.OnMarkerDragListener() {
@@ -145,7 +146,7 @@ public void onMapClick(DJILatLng djiLatLng) {
switch (mapProvider) {
case 0:
boolean success = setIsolatedDiskCacheRootPath(
- getExternalFilesDir(null) + File.separator + ".here-maps-cache");
+ getExternalFilesDir(null) + File.separator + ".here-maps");
if (success) {
mapWidget.initHereMap(onMapReadyListener);
}
@@ -156,9 +157,8 @@ public void onMapClick(DJILatLng djiLatLng) {
case 2:
mapWidget.initAMap(onMapReadyListener);
break;
- default:
case 3:
- //TODO: Remove this key before putting on github
+ default:
mapWidget.initMapboxMap(onMapReadyListener, getResources().getString(R.string.mapbox_id));
break;
}
@@ -175,22 +175,22 @@ public void onMapClick(DJILatLng djiLatLng) {
((CheckBox) findViewById(R.id.flyzone_legend)).setOnCheckedChangeListener(this);
((CheckBox) findViewById(R.id.login_state_indicator)).setOnCheckedChangeListener(this);
((RadioGroup) findViewById(R.id.map_center_selector)).setOnCheckedChangeListener(this);
- scrollView = findViewById(R.id.settings_scroll_view);
- btnPanel = findViewById(R.id.btn_settings);
+ scrollView = (ScrollView) findViewById(R.id.settings_scroll_view);
+ btnPanel = (ImageButton) findViewById(R.id.btn_settings);
btnPanel.setOnClickListener(this);
findViewById(R.id.clear_flight_path).setOnClickListener(this);
- iconSpinner = findViewById(R.id.icon_spinner);
+ iconSpinner = (Spinner) findViewById(R.id.icon_spinner);
iconSpinner.setOnItemSelectedListener(this);
- Spinner mapSpinner = findViewById(R.id.map_spinner);
+ mapSpinner = (Spinner) findViewById(R.id.map_spinner);
mapSpinner.setSelection(0, false); // so the listener won't be called before the map is initialized
mapSpinner.setOnItemSelectedListener(this);
findViewById(R.id.replace).setOnClickListener(this);
- selectedIcon = findViewById(R.id.icon_1);
+ selectedIcon = (ImageView) findViewById(R.id.icon_1);
for (int id : iconIds) {
findViewById(id).setOnClickListener(this);
}
findViewById(R.id.icon_1).setSelected(true);
- Button flyZoneButton = findViewById(R.id.btn_fly_zone);
+ flyZoneButton = (Button) findViewById(R.id.btn_fly_zone);
mapWidget.showAllFlyZones();
flyZoneButton.setOnClickListener(new View.OnClickListener() {
@Override
@@ -199,11 +199,11 @@ public void onClick(View v) {
}
});
- lineSpinner = findViewById(R.id.line_spinner);
+ lineSpinner = (Spinner) findViewById(R.id.line_spinner);
lineSpinner.setOnItemSelectedListener(this);
- lineWidthPicker = findViewById(R.id.line_width_picker);
+ lineWidthPicker = (SeekBar) findViewById(R.id.line_width_picker);
lineWidthPicker.setOnSeekBarChangeListener(this);
- lineColor = findViewById(R.id.line_color);
+ lineColor = (TextView) findViewById(R.id.line_color);
lineColor.setOnClickListener(this);
}
@@ -296,8 +296,8 @@ public void onClick(View view) {
}
private void movePanel() {
- int translationStart;
- int translationEnd;
+ int translationStart = 0;
+ int translationEnd = 0;
if (isPanelOpen) {
translationStart = 0;
translationEnd = -scrollView.getWidth();
@@ -308,7 +308,7 @@ private void movePanel() {
translationEnd = 0;
}
TranslateAnimation animate = new TranslateAnimation(
- translationStart, translationEnd, 0, 0);
+ translationStart, translationEnd, 0, 0);
animate.setDuration(300);
animate.setFillAfter(true);
animate.setAnimationListener(new Animation.AnimationListener() {
@@ -501,8 +501,8 @@ private void addOverlay() {
aMap = (AMap) mapWidget.getMap().getMap();
com.amap.api.maps.model.LatLng[] latlngs = new com.amap.api.maps.model.LatLng[500];
for (int i = 0; i < 500; i++) {
- double x_;
- double y_;
+ double x_ = 0;
+ double y_ = 0;
x_ = Math.random() * 0.5 - 0.25;
y_ = Math.random() * 0.5 - 0.25;
latlngs[i] = new com.amap.api.maps.model.LatLng(testLat + x_, testLng + y_);
diff --git a/sample/app/src/main/java/com/dji/ux/sample/custom/CustomizedBatteryWidget.java b/sample/app/src/main/java/com/dji/ux/sample/custom/CustomizedBatteryWidget.java
index 311d3bc..48c6262 100644
--- a/sample/app/src/main/java/com/dji/ux/sample/custom/CustomizedBatteryWidget.java
+++ b/sample/app/src/main/java/com/dji/ux/sample/custom/CustomizedBatteryWidget.java
@@ -1,27 +1,24 @@
package com.dji.ux.sample.custom;
import android.content.Context;
-import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.dji.ux.sample.R;
-
-import dji.ux.model.base.BaseDynamicWidgetAppearances;
-import dji.ux.widget.BatteryWidget;
import dji.common.battery.ConnectionState;
/**
* Override default battery widget with custom UI resources and logic
*/
-public class CustomizedBatteryWidget extends BatteryWidget {
+public class CustomizedBatteryWidget extends dji.ux.widget.BatteryWidget {
private TextView batteryValue;
private ImageView batteryIcon;
private int batteryIconRes;
private int batteryIconErrorRes;
+ private static final String TAG = CustomizedBatteryWidget.class.getSimpleName();
public CustomizedBatteryWidget(Context context) {
this(context, null, 0);
@@ -46,11 +43,6 @@ public void initView(Context context, AttributeSet attrs, int defStyle) {
batteryIcon.setImageResource(R.mipmap.battery_error);
}
- @Override
- protected BaseDynamicWidgetAppearances getWidgetAppearances() {
- return null;
- }
-
/** Called when battery percentage changes */
@Override
public void onBatteryPercentageChange(int percentage) {
@@ -101,4 +93,5 @@ private void updateBatteryIcon() {
batteryIcon.setImageResource(batteryIconRes);
}
}
+
}
diff --git a/sample/app/src/main/res/drawable/selector_icon_bg.xml b/sample/app/src/main/res/drawable/selector_icon_bg.xml
index ceaf0fd..4c68531 100644
--- a/sample/app/src/main/res/drawable/selector_icon_bg.xml
+++ b/sample/app/src/main/res/drawable/selector_icon_bg.xml
@@ -3,14 +3,14 @@
-
-
+
-
-
+
diff --git a/sample/app/src/main/res/layout/activity_customized_widgets.xml b/sample/app/src/main/res/layout/activity_customized_widgets.xml
index 975a0ca..b66bec1 100644
--- a/sample/app/src/main/res/layout/activity_customized_widgets.xml
+++ b/sample/app/src/main/res/layout/activity_customized_widgets.xml
@@ -1,14 +1,20 @@
-
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:custom="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/activity_customized_widgets"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#242d34"
+ android:orientation="horizontal"
+ tools:context="com.dji.ux.sample.CustomizedWidgetsActivity">
+
+
+ android:layout_height="22dp"
+ />
-
+
+
+
+
+
\ No newline at end of file
diff --git a/sample/app/src/main/res/layout/activity_default_widgets.xml b/sample/app/src/main/res/layout/activity_default_widgets.xml
index 7997afc..e2976aa 100644
--- a/sample/app/src/main/res/layout/activity_default_widgets.xml
+++ b/sample/app/src/main/res/layout/activity_default_widgets.xml
@@ -1,24 +1,24 @@
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:custom="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/background_blue"
+ android:id="@+id/root_view"
+ tools:context=".MainActivity">
+ android:layout_height="match_parent"
+ android:gravity = "center">
@@ -26,7 +26,7 @@
+ android:layout_height="match_parent" />
+ custom:videoSource="secondary"
+ custom:automaticHide="true"/>
+ android:layout_height="match_parent" />
+
@@ -148,7 +157,7 @@
@@ -166,12 +175,12 @@
+ tools:ignore="RtlHardcoded" />
+ android:layout_height="25dp"
+ tools:ignore="TouchTargetSizeCheck" />
+ android:layout_height="22dp"
+ tools:ignore="TouchTargetSizeCheck" />
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
+
+
+
diff --git a/sample/app/src/main/res/layout/activity_map_widget.xml b/sample/app/src/main/res/layout/activity_map_widget.xml
index bd6173e..5e77977 100644
--- a/sample/app/src/main/res/layout/activity_map_widget.xml
+++ b/sample/app/src/main/res/layout/activity_map_widget.xml
@@ -8,7 +8,6 @@
android:id="@+id/map_widget"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
@@ -65,7 +64,6 @@
android:background="@drawable/selector_map_type_bg"
android:button="@null"
android:checked="true"
- android:drawableLeft="@drawable/ic_compass_aircraft"
android:drawableStart="@drawable/ic_compass_aircraft"
android:padding="8dp"
android:textColor="@drawable/selector_map_type_text" />
@@ -76,7 +74,6 @@
android:layout_height="40dp"
android:background="@drawable/selector_map_type_bg"
android:button="@null"
- android:drawableLeft="@drawable/ic_compass_home"
android:drawableStart="@drawable/ic_compass_home"
android:padding="8dp"
android:textColor="@drawable/selector_map_type_text" />
@@ -87,7 +84,6 @@
android:layout_height="40dp"
android:background="@drawable/selector_map_type_bg"
android:button="@null"
- android:drawableLeft="@android:drawable/ic_notification_clear_all"
android:drawableStart="@android:drawable/ic_notification_clear_all"
android:padding="8dp"
android:textColor="@drawable/selector_map_type_text" />
diff --git a/sample/app/src/main/res/layout/dialog_fly_zone.xml b/sample/app/src/main/res/layout/dialog_fly_zone.xml
index c2b25e6..1e8cf33 100644
--- a/sample/app/src/main/res/layout/dialog_fly_zone.xml
+++ b/sample/app/src/main/res/layout/dialog_fly_zone.xml
@@ -1,7 +1,7 @@
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ android:layout_height="2dp">
+
+
+ android:layout_height="2dp">
+
+
\ No newline at end of file
diff --git a/sample/app/src/main/res/values-zh-rCN/string.xml b/sample/app/src/main/res/values-zh-rCN/string.xml
new file mode 100644
index 0000000..8089ffd
--- /dev/null
+++ b/sample/app/src/main/res/values-zh-rCN/string.xml
@@ -0,0 +1,68 @@
+
+
+ UXSDK示例代码
+ 选择全部
+ 不选
+ 搜索
+ 运行
+ 主云台名称
+ 副云台名称
+ 主云台位置
+ 副云台位置
+ 主云台过曝警告
+ 副云台过曝警告
+ 对焦点
+ 测光点
+ 云台控制
+ 显示网格线
+ 显示中心点
+ 更改网格线种类:
+ 更改中心点种类:
+ 更改中心点颜色:
+ 更改视频源:
+ 测试不同尺寸的FPV视图:
+ 无
+ 平行
+ 对角线平行
+ 自动
+ 主
+ 副
+ 改变尺寸
+ 版本:%1$s
+ WSBridge IP
+ Google Maps
+ Here Maps
+ AMaps
+ Mapbox
+ 地图尚未初始化
+ 返航点方向
+ 自动帧
+ 解禁飞行区
+ 显示飞行轨迹
+ 显示返航点
+ 显示云台偏航角
+ 清除飞行轨迹
+ 替换图标
+ 飞行区
+ 飞行区图例
+ DJI账号登录器
+ 新颜色
+ 同步
+
+
- 飞行器
+ - 返航点
+ - 云台偏航角
+ - 锁定的飞行区
+ - 解禁的飞行区
+
+
+ - 标准
+ - 卫星
+ - 混合
+
+
+ - 返航点方向
+ - 飞行轨迹
+ - 飞行区边界
+
+
diff --git a/sample/app/src/main/res/values/strings.xml b/sample/app/src/main/res/values/strings.xml
index 61fb571..5f71355 100644
--- a/sample/app/src/main/res/values/strings.xml
+++ b/sample/app/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
- DJI UX Sample
+ DJI Sample App
Select All
Select None
Search
@@ -8,12 +8,16 @@
Secondary Camera Name
Primary Camera Side
Secondary Camera Side
+ Primary Overexposure Warning
+ Secondary Overexposure Warning
Focus Point
Metering Point
Gimbal Control
Display Grid
+ Display Center Point
Change Grid Overlay Type:
Change Center Point Type:
+ Change Center Point Color:
Change Video Source:
Test FPV widget view in different size:
None
@@ -62,4 +66,5 @@
Please enter the map box key here.
+ Please enter the fack book key here.