From 1417e82edeb57e54747c9ebad1ef7ac30f93a995 Mon Sep 17 00:00:00 2001 From: DJI UX SDK Core Team Date: Fri, 18 Oct 2019 16:17:55 -0700 Subject: [PATCH 1/2] Adding beta 2 code --- LICENSE.txt | 7 + README.md | 10 +- android-uxsdk-beta-sample/.gitignore | 2 +- android-uxsdk-beta-sample/build.gradle | 56 +- .../src/main/AndroidManifest.xml | 39 +- .../ux/beta/sample/DefaultLayoutActivity.java | 272 ++++ .../dji/ux/beta/sample/FlyZoneDialogView.java | 14 +- .../com/dji/ux/beta/sample/MainActivity.java | 217 +-- .../dji/ux/beta/sample/MapWidgetActivity.java | 58 +- .../beta/sample/OnDJIUSBAttachedReceiver.java | 6 + .../dji/ux/beta/sample/SampleApplication.java | 17 + .../com/dji/ux/beta/sample/util/MapUtil.java | 77 ++ .../sample/widgetlist/WidgetFragment.java | 7 +- .../sample/widgetlist/WidgetListFragment.java | 11 +- .../sample/widgetlist/WidgetListItem.java | 2 +- .../widgetlist/WidgetListItemAdapter.java | 3 +- .../ux/beta/sample/widgetlist/WidgetView.java | 24 +- .../sample/widgetlist/WidgetViewHolder.java | 8 +- .../sample/widgetlist/WidgetsActivity.java | 62 +- .../src/main/res/drawable/bg_spinner.xml | 2 + .../drawable/ic_arrow_drop_down_blue_24dp.xml | 2 + .../src/main/res/drawable/ic_bird.xml | 2 + .../src/main/res/drawable/ic_butterfly.xml | 2 + .../src/main/res/drawable/ic_cat.xml | 2 + .../src/main/res/drawable/ic_dog.xml | 2 + .../src/main/res/drawable/ic_drone.xml | 2 + .../src/main/res/drawable/ic_house.xml | 2 + .../res/drawable/ic_settings_white_24dp.xml | 2 + .../main/res/drawable/selector_icon_bg.xml | 2 + .../res/drawable/selector_map_type_bg.xml | 2 + .../res/drawable/selector_map_type_text.xml | 2 + .../res/layout-large/activity_widgets.xml | 6 +- .../res/layout/activity_default_layout.xml | 292 ++++ .../src/main/res/layout/activity_main.xml | 33 +- .../main/res/layout/activity_map_widget.xml | 420 +++--- .../src/main/res/layout/activity_widgets.xml | 4 +- .../src/main/res/layout/dialog_fly_zone.xml | 116 +- .../src/main/res/layout/fragment_widget.xml | 2 + .../main/res/layout/fragment_widget_list.xml | 8 +- .../src/main/res/layout/view_widget.xml | 6 +- .../src/main/res/layout/widget_list_item.xml | 2 + .../src/main/res/menu/map_select_menu.xml | 2 + .../src/main/res/values-sw600dp/dimens.xml | 34 + .../src/main/res/values/colors.xml | 2 + .../src/main/res/values/dimens.xml | 13 + .../src/main/res/values/strings.xml | 33 +- .../src/main/res/values/styles.xml | 6 + .../src/main/res/xml/accessory_filter.xml | 2 + android-uxsdk-beta/build.gradle | 32 +- android-uxsdk-beta/proguard-rules.pro | 21 - .../dji/ux/beta/ExampleInstrumentedTest.java | 5 +- .../ux/beta/base/ConstraintLayoutWidget.java | 7 +- .../java/dji/ux/beta/base/DJISDKModel.java | 11 +- .../beta/base/DefaultGlobalPreferences.java | 71 +- .../dji/ux/beta/base/FrameLayoutWidget.java | 5 +- .../beta/base/GlobalPreferencesInterface.java | 82 +- .../beta/base/GlobalPreferencesManager.java | 2 +- .../ux/beta/base/OnStateChangeCallback.java | 2 +- .../beta/base/SchedulerProviderInterface.java | 4 +- .../java/dji/ux/beta/base/UXSDKError.java | 2 +- .../ux/beta/base/UXSDKErrorDescription.java | 8 +- .../java/dji/ux/beta/base/WidgetModel.java | 26 +- .../beta/base/uxsdkkeys/BroadcastValues.java | 5 +- .../ux/beta/base/uxsdkkeys/CameraKeys.java | 2 +- .../dji/ux/beta/base/uxsdkkeys/FlatStore.java | 8 +- .../base/uxsdkkeys/GlobalPreferenceKeys.java | 9 +- .../ux/beta/base/uxsdkkeys/ModelValue.java | 40 +- .../ObservableInMemoryKeyedStore.java | 35 +- .../base/uxsdkkeys/ObservableKeyedStore.java | 15 +- .../dji/ux/beta/base/uxsdkkeys/UXKey.java | 17 +- .../dji/ux/beta/base/uxsdkkeys/UXKeys.java | 53 +- .../java/dji/ux/beta/ui/ProgressRingView.java | 161 +++ .../java/dji/ux/beta/util/CameraResource.java | 117 ++ .../java/dji/ux/beta/util/CameraUtil.java | 274 ++++ .../java/dji/ux/beta/util/DataProcessor.java | 2 +- .../java/dji/ux/beta/util/DisplayUtil.java | 3 +- .../java/dji/ux/beta/util/LocationUtil.java | 9 +- .../java/dji/ux/beta/util/ProductUtil.java | 46 + .../main/java/dji/ux/beta/util/RxUtil.java | 4 +- .../dji/ux/beta/util/SettingDefinitions.java | 255 +++- .../ux/beta/util/SimulatorPresetUtils.java | 3 +- .../dji/ux/beta/util/UnitConversionUtil.java | 5 + .../main/java/dji/ux/beta/util/ViewUtil.java | 7 +- .../beta/widget/altitude/AltitudeWidget.java | 57 +- .../widget/altitude/AltitudeWidgetModel.java | 8 +- .../AutoExposureLockWidget.java | 391 ++++++ .../AutoExposureLockWidgetModel.java | 125 ++ .../cameracapture/CameraCaptureWidget.java | 197 +++ .../CameraCaptureWidgetModel.java | 83 ++ .../CameraSDVideoStorageState.java | 63 + .../CameraSSDVideoStorageState.java | 62 + .../recordvideo/CameraVideoStorageState.java | 74 ++ .../recordvideo/RecordVideoWidget.java | 671 ++++++++++ .../recordvideo/RecordVideoWidgetModel.java | 319 +++++ .../shootphoto/CameraAEBPhotoState.java | 68 + .../shootphoto/CameraBurstPhotoState.java | 70 + .../shootphoto/CameraIntervalPhotoState.java | 83 ++ .../shootphoto/CameraPanoramaPhotoState.java | 69 + .../shootphoto/CameraPhotoState.java | 61 + .../shootphoto/CameraPhotoStorageState.java | 75 ++ .../shootphoto/CameraSDPhotoStorageState.java | 67 + .../CameraSSDPhotoStorageState.java | 61 + .../shootphoto/ShootPhotoWidget.java | 686 ++++++++++ .../shootphoto/ShootPhotoWidgetModel.java | 442 +++++++ .../aperture/CameraConfigApertureWidget.java | 396 ++++++ .../CameraConfigApertureWidgetModel.java | 116 ++ .../cameraconfig/ev/CameraConfigEVWidget.java | 405 ++++++ .../ev/CameraConfigEVWidgetModel.java | 155 +++ .../iso/CameraConfigISOAndEIWidget.java | 422 ++++++ .../iso/CameraConfigISOAndEIWidgetModel.java | 168 +++ .../shutter/CameraConfigShutterWidget.java | 396 ++++++ .../CameraConfigShutterWidgetModel.java | 116 ++ .../ssd/CameraConfigSSDWidget.java | 1169 +++++++++++++++++ .../ssd/CameraConfigSSDWidgetModel.java | 231 ++++ .../storage/CameraConfigStorageWidget.java | 957 ++++++++++++++ .../CameraConfigStorageWidgetModel.java | 429 ++++++ .../cameraconfig/wb/CameraConfigWBWidget.java | 407 ++++++ .../wb/CameraConfigWBWidgetModel.java | 106 ++ .../cameracontrols/CameraControlsWidget.java | 204 +++ .../CameraSettingsMenuIndicatorWidget.java | 221 ++++ .../ExposureSettingsIndicatorWidget.java | 294 +++++ .../ExposureSettingsIndicatorWidgetModel.java | 105 ++ .../PhotoVideoSwitchWidget.java | 287 ++++ .../PhotoVideoSwitchWidgetModel.java | 176 +++ .../ux/beta/widget/compass/CompassWidget.java | 204 +-- .../widget/compass/CompassWidgetModel.java | 57 +- .../ux/beta/widget/compass/GimbalYawView.java | 7 +- .../widget/compass/VisualCompassView.java | 10 +- .../widget/dashboard/DashboardWidget.java | 12 +- .../distancehome/DistanceHomeWidget.java | 65 +- .../distancehome/DistanceHomeWidgetModel.java | 22 +- .../widget/distancerc/DistanceRCWidget.java | 66 +- .../distancerc/DistanceRCWidgetModel.java | 22 +- .../FocusExposureSwitchWidget.java | 306 +++++ .../FocusExposureSwitchWidgetModel.java | 210 +++ .../widget/focusmode/FocusModeWidget.java | 323 +++++ .../focusmode/FocusModeWidgetModel.java | 216 +++ .../ux/beta/widget/fpv/CenterPointView.java | 223 ++++ .../dji/ux/beta/widget/fpv/FPVWidget.java | 813 ++++++++++++ .../ux/beta/widget/fpv/FPVWidgetModel.java | 382 ++++++ .../dji/ux/beta/widget/fpv/GridLineView.java | 300 +++++ .../fpv/interaction/ExposureMeterView.java | 240 ++++ .../fpv/interaction/FPVInteractionWidget.java | 896 +++++++++++++ .../FPVInteractionWidgetModel.java | 353 +++++ .../fpv/interaction/FocusTargetView.java | 222 ++++ .../fpv/interaction/GimbalControlView.java | 295 +++++ .../HorizontalVelocityWidget.java | 85 +- .../HorizontalVelocityWidgetModel.java | 6 +- .../widget/map/FlyZoneActionListener.java | 2 +- .../dji/ux/beta/widget/map/FlyZoneHelper.java | 368 +++--- .../dji/ux/beta/widget/map/MapWidget.java | 350 +++-- .../ux/beta/widget/map/MapWidgetModel.java | 88 +- .../PreFlightStatusWidget.java | 100 +- .../PreFlightStatusWidgetModel.java | 4 +- .../RemoteControlSignalWidget.java | 38 +- .../RemoteControlSignalWidgetModel.java | 4 +- .../simulator/SimulatorControlWidget.java | 170 +-- .../SimulatorControlWidgetModel.java | 24 +- .../simulator/SimulatorIndicatorWidget.java | 28 +- .../SimulatorIndicatorWidgetModel.java | 4 +- .../preset/OnLoadPresetListener.java | 9 + .../simulator/preset/PresetListDialog.java | 31 +- .../simulator/preset/SavePresetDialog.java | 38 +- .../simulator/preset/SimulatorPresetData.java | 27 + .../useraccount/UserAccountLoginWidget.java | 115 +- .../UserAccountLoginWidgetModel.java | 33 +- .../VerticalVelocityWidget.java | 87 +- .../VerticalVelocityWidgetModel.java | 10 +- .../ux/beta/widget/vision/VisionWidget.java | 45 +- .../beta/widget/vision/VisionWidgetModel.java | 74 +- .../dji/ux/beta/widget/vps/VPSWidget.java | 74 +- .../ux/beta/widget/vps/VPSWidgetModel.java | 16 +- .../src/main/res/anim/uxsdk_anim_rotate.xml | 34 + .../res/animator/uxsdk_animator_scale.xml | 66 + ...xsdk_color_selector_auto_exposure_lock.xml | 27 + .../drawable/uxsdk_ic_auto_exposure_lock.xml | 34 + .../uxsdk_ic_auto_exposure_unlock.xml | 41 + .../drawable/uxsdk_ic_camera_mode_photo.xml | 34 + .../drawable/uxsdk_ic_camera_mode_video.xml | 35 + .../uxsdk_ic_center_metering_target.xml | 41 + .../drawable/uxsdk_ic_centerpoint_cross.xml | 34 + .../drawable/uxsdk_ic_centerpoint_frame.xml | 34 + .../uxsdk_ic_centerpoint_frame_and_cross.xml | 34 + .../uxsdk_ic_centerpoint_narrow_cross.xml | 34 + .../drawable/uxsdk_ic_centerpoint_square.xml | 34 + .../uxsdk_ic_centerpoint_square_and_cross.xml | 34 + .../uxsdk_ic_centerpoint_standard.xml | 34 + .../uxsdk_ic_config_internal_none.xml | 41 + .../uxsdk_ic_config_internal_normal.xml | 35 + .../uxsdk_ic_config_internal_warning.xml | 47 + .../res/drawable/uxsdk_ic_config_sd_none.xml | 41 + .../drawable/uxsdk_ic_config_sd_normal.xml | 35 + .../drawable/uxsdk_ic_config_sd_warning.xml | 47 + .../uxsdk_ic_exposure_settings_aperture.xml | 100 ++ .../uxsdk_ic_exposure_settings_manual.xml | 106 ++ .../uxsdk_ic_exposure_settings_normal.xml | 32 + .../uxsdk_ic_exposure_settings_program.xml | 100 ++ .../uxsdk_ic_exposure_settings_shutter.xml | 100 ++ .../drawable/uxsdk_ic_focus_switch_auto.xml | 34 + .../drawable/uxsdk_ic_focus_switch_manual.xml | 34 + .../drawable/uxsdk_ic_focus_target_auto.xml | 34 + .../drawable/uxsdk_ic_focus_target_manual.xml | 34 + .../uxsdk_ic_gimbal_control_arrow.xml | 34 + .../drawable/uxsdk_ic_gimbal_control_move.xml | 37 + .../uxsdk_ic_gimbal_control_point.xml | 49 + .../uxsdk_ic_hasselblad_shutter_start.xml | 46 + ...dk_ic_hasselblad_shutter_start_pressed.xml | 46 + .../uxsdk_ic_hasselblad_shutter_stop.xml | 58 + .../uxsdk_ic_internal_storage_full.xml | 47 + ...uxsdk_ic_internal_storage_not_inserted.xml | 40 + .../uxsdk_ic_internal_storage_slow.xml | 47 + .../res/drawable/uxsdk_ic_metering_switch.xml | 34 + .../uxsdk_ic_photo_mode_aeb_continuous_3.xml | 38 + .../uxsdk_ic_photo_mode_aeb_continuous_5.xml | 39 + .../uxsdk_ic_photo_mode_aeb_continuous_7.xml | 38 + .../uxsdk_ic_photo_mode_continuous_10.xml | 40 + .../uxsdk_ic_photo_mode_continuous_14.xml | 38 + .../uxsdk_ic_photo_mode_continuous_3.xml | 39 + .../uxsdk_ic_photo_mode_continuous_5.xml | 38 + .../uxsdk_ic_photo_mode_continuous_7.xml | 39 + .../res/drawable/uxsdk_ic_photo_mode_hdr.xml | 38 + .../res/drawable/uxsdk_ic_photo_mode_nor.xml | 38 + .../drawable/uxsdk_ic_photo_mode_pano_180.xml | 34 + .../drawable/uxsdk_ic_photo_mode_pano_3x1.xml | 39 + .../drawable/uxsdk_ic_photo_mode_pano_3x3.xml | 37 + .../uxsdk_ic_photo_mode_pano_sphere.xml | 39 + .../uxsdk_ic_photo_mode_raw_burst_10.xml | 39 + .../uxsdk_ic_photo_mode_raw_burst_14.xml | 38 + .../uxsdk_ic_photo_mode_raw_burst_3.xml | 38 + .../uxsdk_ic_photo_mode_raw_burst_5.xml | 38 + .../uxsdk_ic_photo_mode_raw_burst_7.xml | 40 + ...uxsdk_ic_photo_mode_raw_burst_infinity.xml | 40 + .../uxsdk_ic_photo_mode_shallow_focus.xml | 40 + .../uxsdk_ic_photo_mode_timepause_10s.xml | 38 + .../uxsdk_ic_photo_mode_timepause_15s.xml | 39 + .../uxsdk_ic_photo_mode_timepause_1s.xml | 40 + .../uxsdk_ic_photo_mode_timepause_20s.xml | 39 + .../uxsdk_ic_photo_mode_timepause_2s.xml | 40 + .../uxsdk_ic_photo_mode_timepause_30s.xml | 39 + .../uxsdk_ic_photo_mode_timepause_3s.xml | 40 + .../uxsdk_ic_photo_mode_timepause_40s.xml | 40 + .../uxsdk_ic_photo_mode_timepause_4s.xml | 39 + .../uxsdk_ic_photo_mode_timepause_5s.xml | 40 + .../uxsdk_ic_photo_mode_timepause_60s.xml | 38 + .../uxsdk_ic_photo_mode_timepause_7s.xml | 39 + .../res/drawable/uxsdk_ic_record_video.xml | 34 + .../uxsdk_ic_record_video_pressed.xml | 41 + .../res/drawable/uxsdk_ic_sdcard_full.xml | 47 + .../drawable/uxsdk_ic_sdcard_not_inserted.xml | 41 + .../res/drawable/uxsdk_ic_sdcard_slow.xml | 47 + .../res/drawable/uxsdk_ic_shoot_photo_raw.xml | 28 + .../res/drawable/uxsdk_ic_shutter_stop.xml | 40 + .../uxsdk_ic_spot_metering_target.xml | 34 + .../main/res/drawable/uxsdk_ic_ssd_full.xml | 47 + .../main/res/drawable/uxsdk_ic_ssd_icon.xml | 35 + .../drawable/uxsdk_ic_ssd_not_inserted.xml | 41 + .../uxsdk_ic_ssd_not_inserted_gray.xml | 41 + .../res/drawable/uxsdk_ic_ssd_status_icon.xml | 28 + .../res/drawable/uxsdk_ic_ssd_warning.xml | 40 + .../drawable/uxsdk_ic_stop_record_video.xml | 40 + .../uxsdk_ic_stop_record_video_pressed.xml | 47 + .../uxsdk_selector_hasselblad_shoot_photo.xml | 28 + .../uxsdk_selector_start_record_video.xml | 28 + .../uxsdk_selector_stop_record_video.xml | 29 + .../main/res/drawable/uxsdk_shape_circle.xml | 32 + .../uxsdk_dialog_simulator_load_preset.xml | 4 +- .../uxsdk_dialog_simulator_save_preset.xml | 4 +- .../uxsdk_layout_simulator_preset_row.xml | 11 +- .../res/layout/uxsdk_view_gimbal_control.xml | 50 + .../uxsdk_widget_auto_exposure_lock.xml | 58 + .../layout/uxsdk_widget_base_camera_info.xml | 60 + ...k_widget_base_dashboard_image_and_text.xml | 44 +- .../layout/uxsdk_widget_camera_config_ssd.xml | 134 ++ .../uxsdk_widget_camera_config_storage.xml | 104 ++ .../layout/uxsdk_widget_camera_controls.xml | 75 ++ ..._widget_camera_settings_menu_indicator.xml | 41 + .../main/res/layout/uxsdk_widget_compass.xml | 70 +- .../res/layout/uxsdk_widget_dashboard.xml | 52 +- ...sdk_widget_exposure_settings_indicator.xml | 39 + .../uxsdk_widget_focus_exposure_switch.xml | 38 + .../layout/uxsdk_widget_focus_mode_switch.xml | 40 + .../src/main/res/layout/uxsdk_widget_fpv.xml | 98 ++ .../layout/uxsdk_widget_fpv_interaction.xml | 52 + .../src/main/res/layout/uxsdk_widget_map.xml | 4 +- .../uxsdk_widget_photo_video_switch.xml | 38 + .../layout/uxsdk_widget_preflight_status.xml | 32 +- .../res/layout/uxsdk_widget_record_video.xml | 80 ++ .../uxsdk_widget_remote_control_signal.xml | 31 +- .../res/layout/uxsdk_widget_shoot_photo.xml | 67 + .../layout/uxsdk_widget_simulator_control.xml | 30 +- .../uxsdk_widget_simulator_indicator.xml | 12 +- .../uxsdk_widget_user_account_login.xml | 4 +- .../src/main/res/values/arrays.xml | 143 ++ .../src/main/res/values/attrs.xml | 372 +++++- .../src/main/res/values/colors.xml | 15 +- .../src/main/res/values/strings.xml | 188 ++- .../res/values/strings_dimension_ratios.xml | 23 +- .../src/main/res/values/styles.xml | 8 - dependencyLicenses.txt | 442 +++++++ gradle.properties | 3 +- 300 files changed, 25231 insertions(+), 1880 deletions(-) create mode 100644 android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/DefaultLayoutActivity.java create mode 100644 android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/util/MapUtil.java create mode 100644 android-uxsdk-beta-sample/src/main/res/layout/activity_default_layout.xml create mode 100644 android-uxsdk-beta-sample/src/main/res/values-sw600dp/dimens.xml delete mode 100644 android-uxsdk-beta/proguard-rules.pro create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/ui/ProgressRingView.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/util/CameraResource.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/util/CameraUtil.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/autoexposurelock/AutoExposureLockWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/autoexposurelock/AutoExposureLockWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/CameraCaptureWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/CameraCaptureWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/recordvideo/CameraSDVideoStorageState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/recordvideo/CameraSSDVideoStorageState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/recordvideo/CameraVideoStorageState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/recordvideo/RecordVideoWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/recordvideo/RecordVideoWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/CameraAEBPhotoState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/CameraBurstPhotoState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/CameraIntervalPhotoState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/CameraPanoramaPhotoState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/CameraPhotoState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/CameraPhotoStorageState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/CameraSDPhotoStorageState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/CameraSSDPhotoStorageState.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/ShootPhotoWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracapture/shootphoto/ShootPhotoWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/aperture/CameraConfigApertureWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/aperture/CameraConfigApertureWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/ev/CameraConfigEVWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/ev/CameraConfigEVWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/iso/CameraConfigISOAndEIWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/iso/CameraConfigISOAndEIWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/shutter/CameraConfigShutterWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/shutter/CameraConfigShutterWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/ssd/CameraConfigSSDWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/ssd/CameraConfigSSDWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/storage/CameraConfigStorageWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/storage/CameraConfigStorageWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/wb/CameraConfigWBWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameraconfig/wb/CameraConfigWBWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracontrols/CameraControlsWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracontrols/camerasettingsindicator/CameraSettingsMenuIndicatorWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracontrols/exposuresettingsindicator/ExposureSettingsIndicatorWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracontrols/exposuresettingsindicator/ExposureSettingsIndicatorWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracontrols/photovideoswitch/PhotoVideoSwitchWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/cameracontrols/photovideoswitch/PhotoVideoSwitchWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/focusexposureswitch/FocusExposureSwitchWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/focusexposureswitch/FocusExposureSwitchWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/focusmode/FocusModeWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/focusmode/FocusModeWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/fpv/CenterPointView.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/fpv/FPVWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/fpv/FPVWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/fpv/GridLineView.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/fpv/interaction/ExposureMeterView.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/fpv/interaction/FPVInteractionWidget.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/fpv/interaction/FPVInteractionWidgetModel.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/fpv/interaction/FocusTargetView.java create mode 100644 android-uxsdk-beta/src/main/java/dji/ux/beta/widget/fpv/interaction/GimbalControlView.java create mode 100644 android-uxsdk-beta/src/main/res/anim/uxsdk_anim_rotate.xml create mode 100644 android-uxsdk-beta/src/main/res/animator/uxsdk_animator_scale.xml create mode 100644 android-uxsdk-beta/src/main/res/color/uxsdk_color_selector_auto_exposure_lock.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_auto_exposure_lock.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_auto_exposure_unlock.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_camera_mode_photo.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_camera_mode_video.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_center_metering_target.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_centerpoint_cross.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_centerpoint_frame.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_centerpoint_frame_and_cross.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_centerpoint_narrow_cross.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_centerpoint_square.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_centerpoint_square_and_cross.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_centerpoint_standard.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_config_internal_none.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_config_internal_normal.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_config_internal_warning.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_config_sd_none.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_config_sd_normal.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_config_sd_warning.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_exposure_settings_aperture.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_exposure_settings_manual.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_exposure_settings_normal.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_exposure_settings_program.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_exposure_settings_shutter.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_focus_switch_auto.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_focus_switch_manual.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_focus_target_auto.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_focus_target_manual.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_gimbal_control_arrow.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_gimbal_control_move.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_gimbal_control_point.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_hasselblad_shutter_start.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_hasselblad_shutter_start_pressed.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_hasselblad_shutter_stop.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_internal_storage_full.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_internal_storage_not_inserted.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_internal_storage_slow.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_metering_switch.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_aeb_continuous_3.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_aeb_continuous_5.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_aeb_continuous_7.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_continuous_10.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_continuous_14.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_continuous_3.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_continuous_5.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_continuous_7.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_hdr.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_nor.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_pano_180.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_pano_3x1.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_pano_3x3.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_pano_sphere.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_raw_burst_10.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_raw_burst_14.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_raw_burst_3.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_raw_burst_5.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_raw_burst_7.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_raw_burst_infinity.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_shallow_focus.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_10s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_15s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_1s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_20s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_2s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_30s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_3s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_40s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_4s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_5s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_60s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_photo_mode_timepause_7s.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_record_video.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_record_video_pressed.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_sdcard_full.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_sdcard_not_inserted.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_sdcard_slow.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_shoot_photo_raw.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_shutter_stop.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_spot_metering_target.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_ssd_full.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_ssd_icon.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_ssd_not_inserted.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_ssd_not_inserted_gray.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_ssd_status_icon.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_ssd_warning.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_stop_record_video.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_ic_stop_record_video_pressed.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_selector_hasselblad_shoot_photo.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_selector_start_record_video.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_selector_stop_record_video.xml create mode 100644 android-uxsdk-beta/src/main/res/drawable/uxsdk_shape_circle.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_view_gimbal_control.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_auto_exposure_lock.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_base_camera_info.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_camera_config_ssd.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_camera_config_storage.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_camera_controls.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_camera_settings_menu_indicator.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_exposure_settings_indicator.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_focus_exposure_switch.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_focus_mode_switch.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_fpv.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_fpv_interaction.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_photo_video_switch.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_record_video.xml create mode 100644 android-uxsdk-beta/src/main/res/layout/uxsdk_widget_shoot_photo.xml create mode 100644 android-uxsdk-beta/src/main/res/values/arrays.xml create mode 100644 dependencyLicenses.txt diff --git a/LICENSE.txt b/LICENSE.txt index c9488632..f9029b9a 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -19,3 +19,10 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==================================================================================== + +Mobile-UXSDK-Beta-Android uses several unmodified libraries which are listed along +with their licenses in the `dependencyLicenses.txt` file. + +==================================================================================== diff --git a/README.md b/README.md index 659a6dea..d77f150f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ The DJI UX SDK speeds up development time by providing UI elements for all core functionalities, and by using it in conjunction with the [DJI Mobile SDK](https://developer.dji.com/mobile-sdk/) you can create a customized mobile app to unlock the full potential of your DJI aerial platform. Using the default UX SDK, an application can be created with no additional lines of code; you can also pick and choose which elements you want to use for maximum UI flexibility. -With the UX SDK 5 Beta 1 version we are introducing an easy way to customize all the UI elements, as well as extend the base classes to build your own custom widgets. For more details, see the [UX SDK 5.0 overview](https://github.com/dji-sdk/Mobile-UXSDK-Beta-Android/wiki/UX-SDK-5.0-Overview). +With the UX SDK 5.0 version we are introducing an easy way to customize all the UI elements, as well as extend the base classes to build your own custom widgets. For more details, see the [UX SDK 5.0 overview](https://github.com/dji-sdk/Mobile-UXSDK-Beta-Android/wiki/UX-SDK-5.0-Overview). Check out our sample app code in this repository with instructions on how to get started [here](https://github.com/dji-sdk/Mobile-UXSDK-Beta-Android/wiki/Sample-Application-Tutorial). @@ -23,12 +23,14 @@ You can find the UX SDK documentation on the [wiki](https://github.com/dji-sdk/M ## How to Contribute -As always, the DJI Dev Team is committed to improving your developer experience. Please follow our guidelines on the [How to Contribute](https://github.com/dji-sdk/Mobile-UXSDK-Beta-Android/wiki/How-to-Contribute) page on our wiki for filling out any bugs or feature requests, or contributing to the code base. If you have any other questions, please send an email to dev@dji.com. We recommend frequently checking the Github repositories for changes and new releases. +As always, the DJI Dev Team is committed to improving your developer experience. Please follow our guidelines on the [How to Contribute](https://github.com/dji-sdk/Mobile-UXSDK-Beta-Android/wiki/How-to-Contribute) page on our wiki for filling out any bugs or feature requests, or contributing to the code base. +If you have any other questions, please send an email to dev@dji.com. We recommend frequently checking the Github repositories for changes and new releases. ## License + Mobile-UXSDK-Beta-Android is available under the the MIT license. Please see the `LICENSE.txt` file for more info. ## Future Plans -This Beta 1 release only contains a small subset of UX SDK elements. We are eager to give you a sneak peek, and are very interested in receiving your feedback and suggestions. Please refer to the wiki or the release notes for the full list of elements that the Beta 1 version makes available. -Our long-term plan is for this framework to reach feature parity with the UX SDK 4.10 release. The core team is currently working on porting the remaining widgets and other APIs to the new architecture and we will open source them in additional future Beta releases as they are completed. We welcome your feedback on the architecture and your ideas for addional widgets, including those not included in prior UX SDK releases, as well as your contributions and PRs for any ***currently open-sourced features***. +We are eager to give you a sneak peek, and are very interested in receiving your feedback and suggestions. Please refer to the wiki or the release notes for the full list of elements that the Beta 2 version makes available. +Our long-term plan is for this framework to reach feature parity with the UX SDK 4.11 release. The core team is currently working on porting the remaining widgets and other APIs to the new architecture and we will open source them in additional future Beta releases as they are completed. We welcome your feedback on the architecture and your ideas for additional widgets, including those not included in prior UX SDK releases, as well as your contributions and PRs for any ***currently open-sourced features***. \ No newline at end of file diff --git a/android-uxsdk-beta-sample/.gitignore b/android-uxsdk-beta-sample/.gitignore index a7747886..58654de0 100644 --- a/android-uxsdk-beta-sample/.gitignore +++ b/android-uxsdk-beta-sample/.gitignore @@ -1,2 +1,2 @@ /build - +/src/main/res/values/keystrings.xml diff --git a/android-uxsdk-beta-sample/build.gradle b/android-uxsdk-beta-sample/build.gradle index 98a90eb4..ee42a189 100644 --- a/android-uxsdk-beta-sample/build.gradle +++ b/android-uxsdk-beta-sample/build.gradle @@ -23,11 +23,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 27 + compileSdkVersion 28 + useLibrary 'org.apache.http.legacy' defaultConfig { applicationId "com.dji.ux.beta.sample" minSdkVersion 16 - targetSdkVersion 27 + targetSdkVersion 28 multiDexEnabled true vectorDrawables.useSupportLibrary = true ndk { @@ -61,6 +62,10 @@ android { doNotStrip "*/*/libDJIFlySafeCore.so" doNotStrip "*/*/libdjifs_jni.so" doNotStrip "*/*/libsfjni.so" + doNotStrip "*/*/libDJICommonJNI.so" + doNotStrip "*/*/libDJICSDKCommon.so" + doNotStrip "*/*/libDJIUpgradeCore.so" + doNotStrip "*/*/libDJIUpgradeJNI.so" pickFirst 'lib/*/libstlport_shared.so' pickFirst 'lib/*/libRoadLineRebuildAPI.so' @@ -78,35 +83,46 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + buildToolsVersion = '28.0.3' configurations.all { resolutionStrategy.force 'com.android.support:support-annotations:27.0.0' } } dependencies { - implementation ('com.dji:dji-uxsdk:4.10') - implementation ('com.dji:dji-sdk:4.10', { - // Uncomment the following line if your app does not need Anti Distortion for - // Mavic 2 Pro and Mavic 2 Zoom. It will greatly reducing the size of the APK: - // exclude module: 'library-anti-distortion' + implementation ('com.dji:dji-uxsdk:4.11') + implementation ('com.dji:dji-sdk:4.11', { + /** + * 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 your need smaller apk for release, we will download it when DJISDKManager.getInstance().registerApp + * is called, and it won't register success without fly-safe-database. + * Both will greatly reducing the size of the APK. + */ + exclude module: 'library-anti-distortion' + exclude module: 'fly-safe-database' }) - compileOnly ('com.dji:dji-sdk-provided:4.10') + compileOnly ('com.dji:dji-sdk-provided:4.11') - implementation 'com.android.support:appcompat-v7:27.0.0' - implementation 'com.android.support:support-v4:27.0.0' - implementation 'com.android.support:recyclerview-v7:27.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.2' - implementation 'com.android.support:support-annotations:27.0.0' + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.recyclerview:recyclerview:1.0.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.annotation:annotation:1.0.0' + implementation 'androidx.core:core:1.0.0' - implementation 'com.jakewharton:butterknife:8.8.1' - annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' - implementation 'com.amap.api:map2d:5.2.0' + implementation 'com.jakewharton:butterknife:10.0.0' + annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0' + + //AMaps implementation 'com.amap.api:3dmap:5.5.0' implementation 'com.amap.api:search:5.5.0' implementation 'com.amap.api:location:3.6.1' + //HERE maps implementation files('libs/HERE-sdk-3.8.0.aar') + implementation project(":android-uxsdk-beta") - implementation 'android.arch.lifecycle:extensions:1.1.0' + + implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0-rc01' api 'com.google.android.gms:play-services-base:16.0.0' api 'com.google.android.gms:play-services-maps:16.0.0' api 'com.mapbox.mapboxsdk:mapbox-android-sdk:5.5.1' @@ -117,8 +133,8 @@ dependencies { testImplementation 'junit:junit:4.12' testImplementation 'org.mockito:mockito-core:2.18.3' androidTestImplementation 'org.mockito:mockito-android:2.6.2' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' - androidTestImplementation 'com.android.support.test:rules:1.0.2' + androidTestImplementation 'androidx.test:runner:1.1.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' + androidTestImplementation 'androidx.test:rules:1.1.0' testImplementation 'org.robolectric:robolectric:3.8' } diff --git a/android-uxsdk-beta-sample/src/main/AndroidManifest.xml b/android-uxsdk-beta-sample/src/main/AndroidManifest.xml index d0d29eeb..ee42d5d5 100644 --- a/android-uxsdk-beta-sample/src/main/AndroidManifest.xml +++ b/android-uxsdk-beta-sample/src/main/AndroidManifest.xml @@ -19,32 +19,28 @@ ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ~ SOFTWARE. + ~ + ~ --> + package="com.dji.ux.beta.sample"> - - - - - @@ -59,9 +55,13 @@ android:label="@string/dji_ux_sample_app_name" tools:replace="android:label" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + tools:ignore="AllowBackup,GoogleAppIndexingWarning"> + + + @@ -97,7 +97,7 @@ android:value="@string/dji_ux_sample_amaps_api_key" /> @@ -108,17 +108,23 @@ + + + @@ -128,15 +134,6 @@ android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/accessory_filter" /> - - - - - - \ No newline at end of file diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/DefaultLayoutActivity.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/DefaultLayoutActivity.java new file mode 100644 index 00000000..0d3448b6 --- /dev/null +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/DefaultLayoutActivity.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2018-2019 DJI + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * + */ + +package com.dji.ux.beta.sample; + +import android.os.Bundle; +import android.os.PersistableBundle; +import android.util.DisplayMetrics; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.Transformation; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import dji.common.airlink.PhysicalSource; +import dji.thirdparty.io.reactivex.android.schedulers.AndroidSchedulers; +import dji.thirdparty.io.reactivex.disposables.CompositeDisposable; +import dji.ux.beta.base.DefaultGlobalPreferences; +import dji.ux.beta.base.GlobalPreferencesManager; +import dji.ux.beta.util.SettingDefinitions; +import dji.ux.beta.widget.fpv.FPVWidget; +import dji.ux.beta.widget.map.MapWidget; + +/** + * Displays a sample layout of widgets similar to that of the various DJI apps. + */ +public class DefaultLayoutActivity extends AppCompatActivity { + + //region Fields + private final static String TAG = "DefaultLayoutActivity"; + + @BindView(R.id.widget_fpv) + protected FPVWidget fpvWidget; + @BindView(R.id.widget_map) + protected MapWidget mapWidget; + @BindView(R.id.widget_secondary_fpv) + protected FPVWidget secondaryFPVWidget; + @BindView(R.id.root_view) + protected ConstraintLayout parentView; + + private boolean isMapMini = true; + private int widgetHeight; + private int widgetWidth; + private int widgetMargin; + private int deviceWidth; + private int deviceHeight; + private CompositeDisposable compositeDisposable; + //endregion + + //region Lifecycle + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //For the global preferences to take effect, this must be done before the widgets are initialized + //If this is not done, no global preferences will take effect or persist across app restarts + GlobalPreferencesManager.initialize(new DefaultGlobalPreferences(this)); + setContentView(R.layout.activity_default_layout); + + widgetHeight = (int) getResources().getDimension(R.dimen.mini_map_height); + widgetWidth = (int) getResources().getDimension(R.dimen.mini_map_width); + widgetMargin = (int) getResources().getDimension(R.dimen.mini_map_margin); + + DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); + deviceHeight = displayMetrics.heightPixels; + deviceWidth = displayMetrics.widthPixels; + + ButterKnife.bind(this); + mapWidget.initAMap(map -> map.setOnMapClickListener(latLng -> onViewClick(mapWidget))); + mapWidget.getUserAccountLoginWidget().setVisibility(View.GONE); + mapWidget.onCreate(savedInstanceState); + } + + @Override + protected void onDestroy() { + mapWidget.onDestroy(); + super.onDestroy(); + } + + @Override + public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { + super.onSaveInstanceState(outState, outPersistentState); + mapWidget.onSaveInstanceState(outState); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mapWidget.onLowMemory(); + + } + + @Override + protected void onResume() { + super.onResume(); + mapWidget.onResume(); + compositeDisposable = new CompositeDisposable(); + compositeDisposable.add(secondaryFPVWidget.getCameraName() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(this::updateSecondaryVideoVisibility)); + } + + @Override + protected void onPause() { + if (compositeDisposable != null) { + compositeDisposable.dispose(); + compositeDisposable = null; + } + mapWidget.onPause(); + super.onPause(); + } + //endregion + + //region Utils + + /** + * Handles a click event on the FPV widget + */ + @OnClick(R.id.widget_fpv) + public void onFPVClick() { + onViewClick(fpvWidget); + } + + /** + * Handles a click event on the secondary FPV widget + */ + @OnClick(R.id.widget_secondary_fpv) + public void onSecondaryFPVClick() { + swapVideoSource(); + } + + /** + * Swaps the FPV and Map Widgets. + * + * @param view The thumbnail view that was clicked. + */ + private void onViewClick(View view) { + if (view == fpvWidget && !isMapMini) { + //reorder widgets + parentView.removeView(fpvWidget); + parentView.addView(fpvWidget, 0); + + //resize widgets + resizeViews(fpvWidget, mapWidget); + + //enable interaction on FPV + fpvWidget.setInteractionEnabled(true); + //disable user login widget on map + mapWidget.getUserAccountLoginWidget().setVisibility(View.GONE); + isMapMini = true; + } else if (view == mapWidget && isMapMini) { + //reorder widgets + parentView.removeView(fpvWidget); + parentView.addView(fpvWidget, parentView.indexOfChild(mapWidget) + 1); + + //resize widgets + resizeViews(mapWidget, fpvWidget); + //disable interaction on FPV + fpvWidget.setInteractionEnabled(false); + //enable user login widget on map + mapWidget.getUserAccountLoginWidget().setVisibility(View.VISIBLE); + isMapMini = false; + } + } + + /** + * Helper method to resize the FPV and Map Widgets. + * + * @param viewToEnlarge The view that needs to be enlarged to full screen. + * @param viewToShrink The view that needs to be shrunk to a thumbnail. + */ + private void resizeViews(View viewToEnlarge, View viewToShrink) { + //enlarge first widget + ResizeAnimation enlargeAnimation = new ResizeAnimation(viewToEnlarge, widgetWidth, widgetHeight, deviceWidth, deviceHeight, 0); + viewToEnlarge.startAnimation(enlargeAnimation); + + //shrink second widget + ResizeAnimation shrinkAnimation = new ResizeAnimation(viewToShrink, deviceWidth, deviceHeight, widgetWidth, widgetHeight, widgetMargin); + viewToShrink.startAnimation(shrinkAnimation); + } + + /** + * Swap the video sources of the FPV and secondary FPV widgets. + */ + private void swapVideoSource() { + if (secondaryFPVWidget.getVideoSource() == SettingDefinitions.VideoSource.SECONDARY) { + fpvWidget.setVideoSource(SettingDefinitions.VideoSource.SECONDARY); + secondaryFPVWidget.setVideoSource(SettingDefinitions.VideoSource.PRIMARY); + } else { + fpvWidget.setVideoSource(SettingDefinitions.VideoSource.PRIMARY); + secondaryFPVWidget.setVideoSource(SettingDefinitions.VideoSource.SECONDARY); + } + } + + /** + * Hide the secondary FPV widget when there is no secondary camera. + * + * @param cameraName The name of the secondary camera. + */ + private void updateSecondaryVideoVisibility(String cameraName) { + if (cameraName.equals(PhysicalSource.UNKNOWN.name())) { + secondaryFPVWidget.setVisibility(View.GONE); + } else { + secondaryFPVWidget.setVisibility(View.VISIBLE); + } + } + //endregion + + //region classes + + /** + * Animation to change the size of a view. + */ + private static class ResizeAnimation extends Animation { + + private static final int DURATION = 300; + + private View view; + private int toHeight; + private int fromHeight; + private int toWidth; + private int fromWidth; + private int margin; + + private ResizeAnimation(View v, int fromWidth, int fromHeight, int toWidth, int toHeight, int margin) { + this.toHeight = toHeight; + this.toWidth = toWidth; + this.fromHeight = fromHeight; + this.fromWidth = fromWidth; + view = v; + this.margin = margin; + setDuration(DURATION); + } + + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + float height = (toHeight - fromHeight) * interpolatedTime + fromHeight; + float width = (toWidth - fromWidth) * interpolatedTime + fromWidth; + ConstraintLayout.LayoutParams p = (ConstraintLayout.LayoutParams) view.getLayoutParams(); + p.height = (int) height; + p.width = (int) width; + p.rightMargin = margin; + p.bottomMargin = margin; + view.requestLayout(); + } + } + //endregion +} diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/FlyZoneDialogView.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/FlyZoneDialogView.java index a5a56bb9..07c756c7 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/FlyZoneDialogView.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/FlyZoneDialogView.java @@ -27,8 +27,6 @@ import android.content.Context; import android.graphics.Color; import android.graphics.drawable.GradientDrawable; -import android.support.annotation.ColorInt; -import android.support.v4.graphics.ColorUtils; import android.util.AttributeSet; import android.widget.Button; import android.widget.CheckBox; @@ -36,11 +34,11 @@ import android.widget.ScrollView; import android.widget.Switch; +import androidx.annotation.ColorInt; +import androidx.core.graphics.ColorUtils; + import java.util.Random; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnCheckedChanged; import dji.common.flightcontroller.flyzone.FlyZoneCategory; import dji.ux.beta.widget.map.MapWidget; @@ -105,6 +103,7 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { restricted.setChecked(isChecked); break; case R.id.custom_unlock_switch: + mapWidget.requestCustomUnlockZonesFromServer(); btnCustomUnlockColor.setEnabled(isChecked); btnCustomUnlockSync.setEnabled(isChecked); if (isChecked) { @@ -218,6 +217,8 @@ private void initColors(final MapWidget mapWidget) { case R.id.custom_unlock_sync: mapWidget.syncCustomUnlockZonesToAircraft(); return; + default: + return; } view.setBackground(getBackground(randomColor, alpha, strokeWidth)); }; @@ -264,7 +265,8 @@ public boolean isFlyZoneEnabled(FlyZoneCategory category) { return enhancedWarning.isChecked(); case RESTRICTED: return restricted.isChecked(); + default: + return false; } - return false; } } diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/MainActivity.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/MainActivity.java index d4c075b0..a74216eb 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/MainActivity.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/MainActivity.java @@ -25,16 +25,10 @@ package com.dji.ux.beta.sample; import android.Manifest; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.AsyncTask; -import android.os.Build; import android.preference.PreferenceManager; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.Editable; import android.text.TextUtils; @@ -49,9 +43,13 @@ import android.widget.PopupMenu; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import com.dji.ux.beta.sample.util.MapUtil; import com.dji.ux.beta.sample.widgetlist.WidgetsActivity; -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.GoogleApiAvailability; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -65,11 +63,12 @@ import butterknife.OnClick; import dji.common.error.DJIError; import dji.common.error.DJISDKError; -import dji.log.DJILog; import dji.sdk.base.BaseComponent; import dji.sdk.base.BaseProduct; +import dji.sdk.products.Aircraft; import dji.sdk.sdkmanager.DJISDKInitEvent; import dji.sdk.sdkmanager.DJISDKManager; +import dji.ux.beta.util.SettingDefinitions; /** * Handles the connection to the product and provides links to the different test activities. Also @@ -81,20 +80,19 @@ public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuI //region Constants private static final String LAST_USED_BRIDGE_IP = "bridgeip"; private static final String[] REQUIRED_PERMISSION_LIST = new String[]{ - Manifest.permission.VIBRATE, - Manifest.permission.INTERNET, - Manifest.permission.ACCESS_WIFI_STATE, - Manifest.permission.WAKE_LOCK, - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_NETWORK_STATE, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CHANGE_WIFI_STATE, - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN, - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, - Manifest.permission.RECORD_AUDIO + 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 static final String TIME_FORMAT = "MMM dd, yyyy 'at' h:mm:ss a"; @@ -104,6 +102,7 @@ public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuI //region Fields private AtomicBoolean isRegistrationInProgress = new AtomicBoolean(false); private static boolean isAppStarted = false; + private int lastProgress = -1; private DJISDKManager.SDKManagerCallback registrationCallback = new DJISDKManager.SDKManagerCallback() { @Override @@ -134,7 +133,14 @@ public void onProductConnect(BaseProduct product) { if (product != null) { runOnUiThread(() -> { addLog("Connected to product"); - productNameTextView.setText(getString(R.string.product_name, product.getModel().getDisplayName())); + if (product.getModel() != null) { + productNameTextView.setText(getString(R.string.product_name, product.getModel().getDisplayName())); + } else if (product instanceof Aircraft) { + Aircraft aircraft = (Aircraft) product; + if (aircraft.getRemoteController() != null) { + productNameTextView.setText(getString(R.string.remote_controller)); + } + } }); } } @@ -151,6 +157,18 @@ public void onComponentChange(BaseProduct.ComponentKey key, public void onInitProcess(DJISDKInitEvent djisdkInitEvent, int totalProcess) { runOnUiThread(() -> addLog(djisdkInitEvent.getInitializationState().toString())); } + + @Override + public void onDatabaseDownloadProgress(long current, long total) { + runOnUiThread(() -> { + int progress = (int) (100 * current / total); + if (progress == lastProgress) { + return; + } + lastProgress = progress; + addLog("Fly safe database download progress: " + progress); + }); + } }; private List missingPermission = new ArrayList<>(); @BindView(R.id.text_view_version) @@ -175,51 +193,18 @@ protected void onCreate(Bundle savedInstanceState) { getSupportActionBar().setTitle(R.string.dji_ux_sample_app_name_long); } isAppStarted = true; - versionTextView.setText(getResources().getString(R.string.sdk_version, DJISDKManager.getInstance().getSDKVersion())); - bridgeModeEditText.setText(PreferenceManager.getDefaultSharedPreferences(this).getString(LAST_USED_BRIDGE_IP, "")); - bridgeModeEditText.setOnEditorActionListener((v, actionId, event) -> { - if (actionId == EditorInfo.IME_ACTION_SEARCH - || 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 { - // the user is done typing. - handleBridgeIPTextChange(); - } - } - return false; // pass on to other listeners. - }); - bridgeModeEditText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - // do nothing - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - // do nothing - } - - @Override - public void afterTextChanged(Editable s) { - if (s != null && s.toString().contains("\n")) { - // the user is done typing. - // remove new line characcter - final String currentText = bridgeModeEditText.getText().toString(); - bridgeModeEditText.setText(currentText.substring(0, currentText.indexOf('\n'))); - handleBridgeIPTextChange(); - } - } - }); checkAndRequestPermissions(); + setBridgeModeEditText(); + versionTextView.setText(getResources().getString(R.string.sdk_version, + DJISDKManager.getInstance().getSDKVersion())); } @Override protected void onDestroy() { - DJISDKManager.getInstance().destroy(); + // Prevent memory leak by releasing DJISDKManager's references to this activity + if (DJISDKManager.getInstance() != null) { + DJISDKManager.getInstance().destroy(); + } isAppStarted = false; super.onDestroy(); } @@ -280,6 +265,51 @@ private void startSDKRegistration() { } } + /** + * Initialize the bridge mode edit text + */ + private void setBridgeModeEditText() { + bridgeModeEditText.setText(PreferenceManager.getDefaultSharedPreferences(this) + .getString(LAST_USED_BRIDGE_IP, "")); + bridgeModeEditText.setOnEditorActionListener((v, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_SEARCH + || 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 { + // the user is done typing. + handleBridgeIPTextChange(); + } + } + return false; // pass on to other listeners. + }); + bridgeModeEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // Nothing to do + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + // Nothing to do + } + + @Override + public void afterTextChanged(Editable s) { + if (s != null && s.toString().contains("\n")) { + // the user is done typing. + // remove new line character + final String currentText = bridgeModeEditText.getText().toString(); + bridgeModeEditText.setText(currentText.substring(0, currentText.indexOf('\n'))); + handleBridgeIPTextChange(); + } + } + }); + } + /** * React to changes in the Bridge IP text view. If the text view is non-empty, attempts to * start a connection over the bridge. @@ -297,6 +327,7 @@ private void handleBridgeIPTextChange() { /** * Adds the given text to the logs along with a timestamp of the current time. + * * @param description The line of text to add to the logs. */ private void addLog(String description) { @@ -322,6 +353,15 @@ public void onWidgetClick() { startActivity(intent); } + /** + * Starts the {@link DefaultLayoutActivity}. + */ + @OnClick(R.id.default_layout_button) + public void onDefaultLayoutClick() { + Intent intent = new Intent(this, DefaultLayoutActivity.class); + startActivity(intent); + } + /** * Displays a menu of map providers before launching the {@link MapWidgetActivity}. Disables * providers that are not supported by this device. @@ -335,8 +375,8 @@ public void onMapClick(View view) { Menu popupMenu = popup.getMenu(); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.map_select_menu, popupMenu); - popupMenu.findItem(R.id.here_map).setEnabled(isHereMapsSupported()); - popupMenu.findItem(R.id.google_map).setEnabled(isGoogleMapsSupported(this)); + popupMenu.findItem(R.id.here_map).setEnabled(MapUtil.isHereMapsSupported()); + popupMenu.findItem(R.id.google_map).setEnabled(MapUtil.isGoogleMapsSupported(this)); popup.show(); } @@ -350,55 +390,24 @@ public void onMapClick(View view) { @Override public boolean onMenuItemClick(MenuItem menuItem) { Intent intent = new Intent(this, MapWidgetActivity.class); - int mapBrand = 0; + SettingDefinitions.MapProvider mapBrand; switch (menuItem.getItemId()) { case R.id.here_map: - mapBrand = 0; + mapBrand = SettingDefinitions.MapProvider.HERE; break; case R.id.google_map: - mapBrand = 1; + mapBrand = SettingDefinitions.MapProvider.GOOGLE; break; case R.id.amap: - mapBrand = 2; + mapBrand = SettingDefinitions.MapProvider.AMAP; break; case R.id.mapbox: - mapBrand = 3; + default: + mapBrand = SettingDefinitions.MapProvider.MAPBOX; break; } - intent.putExtra(MapWidgetActivity.MAP_PROVIDER, mapBrand); + intent.putExtra(MapWidgetActivity.MAP_PROVIDER_KEY, mapBrand.getIndex()); startActivity(intent); return false; } - - /** - * HERE Maps are supported by ARM V7 and AMR V8 devices. They are not supported by x86 or mips - * devices. - * - * @return `true` if HERE Maps are supported by this device. - */ - public static boolean isHereMapsSupported() { - String abi; - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - abi = Build.CPU_ABI; - } else { - abi = Build.SUPPORTED_ABIS[0]; - } - DJILog.d(TAG, "abi=" + abi); - - //The possible values are armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64. - return abi.contains("arm"); - } - - /** - * Google maps are supported only if Google Play Services are available on this device. - * - * @param context An instance of {@link Context}. - * @return `true` if Google Maps are supported by this device. - */ - public static boolean isGoogleMapsSupported(Context context) { - GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); - int resultCode = googleApiAvailability.isGooglePlayServicesAvailable(context); - return resultCode == ConnectionResult.SUCCESS; - } } diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/MapWidgetActivity.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/MapWidgetActivity.java index a851e45e..45dbf185 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/MapWidgetActivity.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/MapWidgetActivity.java @@ -30,9 +30,6 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.support.annotation.ColorInt; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; @@ -43,6 +40,10 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.ColorInt; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + import com.amap.api.maps.AMap; import com.amap.api.maps.model.HeatmapTileProvider; import com.amap.api.maps.model.TileOverlay; @@ -76,13 +77,14 @@ import butterknife.OnClick; import butterknife.OnItemSelected; import dji.common.flightcontroller.flyzone.FlyZoneCategory; +import dji.ux.beta.util.SettingDefinitions; import dji.ux.beta.util.ViewUtil; import dji.ux.beta.widget.map.MapWidget; import static com.here.android.mpa.common.MapSettings.setIsolatedDiskCacheRootPath; /** - * Displays the a {@link dji.ux.beta.widget.map.MapWidget} and controls to customize the look of + * Displays a {@link dji.ux.beta.widget.map.MapWidget} and controls to customize the look of * each of the components. */ public class MapWidgetActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { @@ -92,7 +94,7 @@ public class MapWidgetActivity extends AppCompatActivity implements SeekBar.OnSe /** * The key for passing a map provider through the intent. */ - public static final String MAP_PROVIDER = "MapProvider"; + public static final String MAP_PROVIDER_KEY = "MapProvider"; //endregion //region fields @@ -116,7 +118,7 @@ public class MapWidgetActivity extends AppCompatActivity implements SeekBar.OnSe private MapOverlay mapOverlay; private GroundOverlay groundOverlay; private TileOverlay tileOverlay; - private int mapProvider; + private SettingDefinitions.MapProvider mapProvider; private Map hereMap; private GoogleMap googleMap; private AMap aMap; @@ -134,7 +136,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { ButterKnife.bind(this); markerList = new ArrayList<>(); MapWidget.OnMapReadyListener onMapReadyListener = map -> { - map.setMapType(DJIMap.MapType.Normal); + map.setMapType(DJIMap.MapType.NORMAL); //Add toasts when a marker is dragged map.setOnMarkerDragListener(new DJIMap.OnMarkerDragListener() { @@ -142,7 +144,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { public void onMarkerDragStart(DJIMarker djiMarker) { if (markerList.contains(djiMarker)) { Toast.makeText(MapWidgetActivity.this, - "Marker " + markerList.indexOf(djiMarker) + " drag started", + getString(R.string.marker_drag_started, markerList.indexOf(djiMarker)), Toast.LENGTH_SHORT).show(); } } @@ -156,14 +158,14 @@ public void onMarkerDrag(DJIMarker djiMarker) { public void onMarkerDragEnd(DJIMarker djiMarker) { if (markerList.contains(djiMarker)) { Toast.makeText(MapWidgetActivity.this, - "Marker " + markerList.indexOf(djiMarker) + " drag ended", + getString(R.string.marker_drag_ended, markerList.indexOf(djiMarker)), Toast.LENGTH_SHORT).show(); } } }); //Add toasts when a marker is clicked - mapWidget.setOnMarkerClickListener((DJIMap.OnMarkerClickListener) djiMarker -> { - Toast.makeText(MapWidgetActivity.this, "Marker " + markerList.indexOf(djiMarker) + " clicked", + mapWidget.setOnMarkerClickListener(djiMarker -> { + Toast.makeText(MapWidgetActivity.this, getString(R.string.marker_clicked, markerList.indexOf(djiMarker)), Toast.LENGTH_SHORT).show(); return true; }); @@ -175,9 +177,9 @@ public void onMarkerDragEnd(DJIMarker djiMarker) { }; Intent intent = getIntent(); - mapProvider = intent.getIntExtra(MAP_PROVIDER, 0); + mapProvider = SettingDefinitions.MapProvider.find(intent.getIntExtra(MAP_PROVIDER_KEY, 0)); switch (mapProvider) { - case 0: + case HERE: boolean success = setIsolatedDiskCacheRootPath( getExternalFilesDir(null) + File.separator + ".here-maps", "HereMapServiceIntent"); @@ -185,13 +187,13 @@ public void onMarkerDragEnd(DJIMarker djiMarker) { mapWidget.initHereMap(onMapReadyListener); } break; - case 1: + case GOOGLE: mapWidget.initGoogleMap(onMapReadyListener); break; - case 2: + case AMAP: mapWidget.initAMap(onMapReadyListener); break; - case 3: + case MAPBOX: default: mapWidget.initMapboxMap(onMapReadyListener, getResources().getString(R.string.dji_ux_sample_mapbox_token)); break; @@ -435,13 +437,14 @@ public void onMapItemSelected(int position) { if (mapWidget.getMap() != null) { switch (position) { case 0: - mapWidget.getMap().setMapType(DJIMap.MapType.Normal); + mapWidget.getMap().setMapType(DJIMap.MapType.NORMAL); break; case 1: - mapWidget.getMap().setMapType(DJIMap.MapType.Satellite); + mapWidget.getMap().setMapType(DJIMap.MapType.SATELLITE); break; + case 2: default: - mapWidget.getMap().setMapType(DJIMap.MapType.Hybrid); + mapWidget.getMap().setMapType(DJIMap.MapType.HYBRID); break; } } else { @@ -464,6 +467,7 @@ public void onLineItemSelected(int position) { lineColor.setTextColor(mapWidget.getFlightPathColor()); break; case 2: + default: width = (int) mapWidget.getFlyZoneHelper().getFlyZoneBorderWidth(); lineColor.setVisibility(View.GONE); break; @@ -485,7 +489,7 @@ private void addOverlay() { float testLat = 37.4419f; float testLng = -122.1430f; switch (mapProvider) { - case 0: + case HERE: if (mapOverlay == null) { hereMap = (Map) mapWidget.getMap().getMap(); ImageView overlayView = new ImageView(MapWidgetActivity.this); @@ -498,7 +502,7 @@ private void addOverlay() { mapOverlay = null; } break; - case 1: + case GOOGLE: if (groundOverlay == null) { googleMap = (GoogleMap) mapWidget.getMap().getMap(); LatLng latLng1 = new LatLng(testLat, testLng); @@ -518,7 +522,7 @@ private void addOverlay() { groundOverlay = null; } break; - case 2: + case AMAP: if (tileOverlay == null) { aMap = (AMap) mapWidget.getMap().getMap(); com.amap.api.maps.model.LatLng[] latlngs = new com.amap.api.maps.model.LatLng[500]; @@ -538,32 +542,28 @@ private void addOverlay() { tileOverlay = null; } break; + case MAPBOX: default: - case 3: Random rnd = new Random(); mapboxMap = (MapboxMap) mapWidget.getMap().getMap(); mapboxMap.getLayer("water").setProperties(PropertyFactory.fillColor(Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)))); - break; - } } @Override protected void onStart() { super.onStart(); - if (mapProvider == 0) { + if (mapProvider == SettingDefinitions.MapProvider.HERE) { startService(new Intent(getBaseContext(), MapService.class)); } - } @Override protected void onStop() { - if (mapProvider == 0) { + if (mapProvider == SettingDefinitions.MapProvider.HERE) { stopService(new Intent(getBaseContext(), MapService.class)); } - super.onStop(); } diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/OnDJIUSBAttachedReceiver.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/OnDJIUSBAttachedReceiver.java index 22a9b8d8..90be3da8 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/OnDJIUSBAttachedReceiver.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/OnDJIUSBAttachedReceiver.java @@ -28,6 +28,8 @@ import android.content.Context; import android.content.Intent; +import dji.sdk.sdkmanager.DJISDKManager; + /** * This receiver will detect the USB attached event. * It will check if the app has been previously started. @@ -46,6 +48,10 @@ public void onReceive(Context context, Intent intent) { | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); startIntent.addCategory(Intent.CATEGORY_LAUNCHER); context.startActivity(startIntent); + } else { + Intent attachedIntent = new Intent(); + attachedIntent.setAction(DJISDKManager.USB_ACCESSORY_ATTACHED); + context.sendBroadcast(attachedIntent); } } } diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/SampleApplication.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/SampleApplication.java index 87151409..495dc813 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/SampleApplication.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/SampleApplication.java @@ -25,19 +25,36 @@ package com.dji.ux.beta.sample; import android.app.Application; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.IntentFilter; + +import androidx.multidex.MultiDex; import com.secneo.sdk.Helper; +import static com.dji.ux.beta.sample.DJIConnectionControlActivity.ACCESSORY_ATTACHED; + /** * An application that loads the SDK classes. */ public class SampleApplication extends Application { + @Override + public void onCreate() { + super.onCreate(); + + BroadcastReceiver br = new OnDJIUSBAttachedReceiver(); + IntentFilter filter = new IntentFilter(); + filter.addAction(ACCESSORY_ATTACHED); + registerReceiver(br, filter); + } + @Override protected void attachBaseContext(Context paramContext) { super.attachBaseContext(paramContext); Helper.install(SampleApplication.this); + MultiDex.install(this); } } diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/util/MapUtil.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/util/MapUtil.java new file mode 100644 index 00000000..a3e4f5a8 --- /dev/null +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/util/MapUtil.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2018-2019 DJI + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * + */ + +package com.dji.ux.beta.sample.util; + +import android.content.Context; +import android.os.Build; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; + +import dji.log.DJILog; + +/** + * Utility class for maps. + */ +public final class MapUtil { + + private static final String TAG = "MapUtil"; + + private MapUtil() { + // Util class + } + + /** + * HERE Maps are supported by ARM V7 and AMR V8 devices. They are not supported by x86 or mips + * devices. + * + * @return `true` if HERE Maps are supported by this device. + */ + public static boolean isHereMapsSupported() { + String abi; + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + abi = Build.CPU_ABI; + } else { + abi = Build.SUPPORTED_ABIS[0]; + } + DJILog.d(TAG, "abi=" + abi); + + //The possible values are armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64. + return abi.contains("arm"); + } + + /** + * Google maps are supported only if Google Play Services are available on this device. + * + * @param context An instance of {@link Context}. + * @return `true` if Google Maps are supported by this device. + */ + public static boolean isGoogleMapsSupported(Context context) { + GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); + int resultCode = googleApiAvailability.isGooglePlayServicesAvailable(context); + return resultCode == ConnectionResult.SUCCESS; + } +} diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetFragment.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetFragment.java index 9deaa839..2bd870d3 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetFragment.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetFragment.java @@ -25,14 +25,15 @@ package com.dji.ux.beta.sample.widgetlist; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + import com.dji.ux.beta.sample.R; import dji.ux.beta.widget.simulator.SimulatorControlWidget; diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListFragment.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListFragment.java index 7711a4d7..f8d51879 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListFragment.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListFragment.java @@ -26,15 +26,16 @@ import android.content.Context; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.dji.ux.beta.sample.R; import butterknife.BindView; diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListItem.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListItem.java index 962cab20..4de40362 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListItem.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListItem.java @@ -24,7 +24,7 @@ package com.dji.ux.beta.sample.widgetlist; -import android.support.annotation.StringRes; +import androidx.annotation.StringRes; /** * An item within the widget list. diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListItemAdapter.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListItemAdapter.java index 2dc635d5..e6e5d642 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListItemAdapter.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetListItemAdapter.java @@ -25,12 +25,13 @@ package com.dji.ux.beta.sample.widgetlist; import android.content.res.Resources; -import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; + import com.dji.ux.beta.sample.R; import java.util.ArrayList; diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetView.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetView.java index 99d35d06..4a92ffde 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetView.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetView.java @@ -25,19 +25,22 @@ package com.dji.ux.beta.sample.widgetlist; import android.content.Context; -import android.support.constraint.ConstraintLayout; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.constraintlayout.widget.ConstraintLayout; + import com.dji.ux.beta.sample.R; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnTouch; +import dji.ux.beta.widget.fpv.interaction.FPVInteractionWidget; /** * A view with a single widget and an indicator of the current size of the widget. This widget @@ -49,6 +52,8 @@ public class WidgetView extends ConstraintLayout { //region fields private WidgetViewHolder widgetViewHolder; private ScaleGestureDetector scaleGestureDetector; + private int originalHeight; + private int originalWidth; private float scaleFactor = 1.0f; //endregion @@ -94,6 +99,14 @@ public ViewGroup init(WidgetViewHolder widgetViewHolder) { widget = widgetViewHolder.getWidget(getContext()); if (widget != null) { containerView.addView(widget); + final ViewTreeObserver obs = widget.getViewTreeObserver(); + obs.addOnPreDrawListener(() -> { + if (originalHeight == 0 && originalWidth == 0) { + originalHeight = widget.getHeight(); + originalWidth = widget.getWidth(); + } + return true; + }); } aspectRatioTextView.setText(widgetViewHolder.getIdealDimensionRatioString()); @@ -122,8 +135,13 @@ public boolean onScale(ScaleGestureDetector scaleGestureDetector) { scaleFactor *= scaleGestureDetector.getScaleFactor(); scaleFactor = Math.max(0.1f, Math.min(scaleFactor, 10.0f)); if (widget != null) { - widget.setScaleX(scaleFactor); - widget.setScaleY(scaleFactor); + ViewGroup.LayoutParams layoutParams = widget.getLayoutParams(); + layoutParams.height = originalHeight * (int) scaleFactor; + layoutParams.width = originalWidth * (int) scaleFactor; + widget.setLayoutParams(layoutParams); + if (widget instanceof FPVInteractionWidget) { + ((FPVInteractionWidget) widget).adjustAspectRatio(layoutParams.width, layoutParams.height); + } currentSizeTextView.setText(widgetViewHolder.getWidgetSize()); } return true; diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetViewHolder.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetViewHolder.java index 5ab03b42..e3c7640d 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetViewHolder.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetViewHolder.java @@ -25,11 +25,12 @@ package com.dji.ux.beta.sample.widgetlist; import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.view.ViewGroup; import android.widget.LinearLayout; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -128,7 +129,6 @@ public String getWidgetSize() { if (widget == null) { return "[0,0]"; } - return "[" + (int) (widget.getMeasuredWidth() * widget.getScaleX()) + "," + - (int) (widget.getMeasuredHeight() * widget.getScaleY()) + "]"; + return "[" + (widget.getMeasuredWidth()) + "," + (widget.getMeasuredHeight()) + "]"; } } diff --git a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetsActivity.java b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetsActivity.java index b0885339..edbc7e09 100644 --- a/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetsActivity.java +++ b/android-uxsdk-beta-sample/src/main/java/com/dji/ux/beta/sample/widgetlist/WidgetsActivity.java @@ -25,19 +25,39 @@ package com.dji.ux.beta.sample.widgetlist; import android.os.Bundle; -import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AppCompatActivity; import android.view.ViewGroup; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.FragmentTransaction; + import com.dji.ux.beta.sample.R; import java.util.ArrayList; import dji.ux.beta.widget.altitude.AltitudeWidget; +import dji.ux.beta.widget.autoexposurelock.AutoExposureLockWidget; +import dji.ux.beta.widget.cameracapture.CameraCaptureWidget; +import dji.ux.beta.widget.cameracapture.recordvideo.RecordVideoWidget; +import dji.ux.beta.widget.cameracapture.shootphoto.ShootPhotoWidget; +import dji.ux.beta.widget.cameraconfig.aperture.CameraConfigApertureWidget; +import dji.ux.beta.widget.cameraconfig.ev.CameraConfigEVWidget; +import dji.ux.beta.widget.cameraconfig.iso.CameraConfigISOAndEIWidget; +import dji.ux.beta.widget.cameraconfig.shutter.CameraConfigShutterWidget; +import dji.ux.beta.widget.cameraconfig.ssd.CameraConfigSSDWidget; +import dji.ux.beta.widget.cameraconfig.storage.CameraConfigStorageWidget; +import dji.ux.beta.widget.cameraconfig.wb.CameraConfigWBWidget; +import dji.ux.beta.widget.cameracontrols.CameraControlsWidget; +import dji.ux.beta.widget.cameracontrols.camerasettingsindicator.CameraSettingsMenuIndicatorWidget; +import dji.ux.beta.widget.cameracontrols.exposuresettingsindicator.ExposureSettingsIndicatorWidget; +import dji.ux.beta.widget.cameracontrols.photovideoswitch.PhotoVideoSwitchWidget; import dji.ux.beta.widget.compass.CompassWidget; import dji.ux.beta.widget.dashboard.DashboardWidget; import dji.ux.beta.widget.distancehome.DistanceHomeWidget; import dji.ux.beta.widget.distancerc.DistanceRCWidget; +import dji.ux.beta.widget.focusexposureswitch.FocusExposureSwitchWidget; +import dji.ux.beta.widget.focusmode.FocusModeWidget; +import dji.ux.beta.widget.fpv.FPVWidget; +import dji.ux.beta.widget.fpv.interaction.FPVInteractionWidget; import dji.ux.beta.widget.horizontalvelocity.HorizontalVelocityWidget; import dji.ux.beta.widget.preflightstatus.PreFlightStatusWidget; import dji.ux.beta.widget.remotecontrolsignal.RemoteControlSignalWidget; @@ -91,6 +111,28 @@ private void populateList() { widgetListItems = new ArrayList<>(); widgetListItems.add(new WidgetListItem(R.string.altitude_widget_title, new WidgetViewHolder(AltitudeWidget.class))); + widgetListItems.add(new WidgetListItem(R.string.auto_exposure_lock_widget_title, + new WidgetViewHolder(AutoExposureLockWidget.class, 35, 35))); + widgetListItems.add(new WidgetListItem(R.string.camera_capture_widget_title, + new WidgetViewHolder(CameraCaptureWidget.class, 50, 50))); + widgetListItems.add(new WidgetListItem(R.string.camera_config_aperture_widget_title, + new WidgetViewHolder(CameraConfigApertureWidget.class))); + widgetListItems.add(new WidgetListItem(R.string.camera_config_ev_widget_title, + new WidgetViewHolder(CameraConfigEVWidget.class))); + widgetListItems.add(new WidgetListItem(R.string.camera_config_iso_widget_title, + new WidgetViewHolder(CameraConfigISOAndEIWidget.class))); + widgetListItems.add(new WidgetListItem(R.string.camera_config_shutter_widget_title, + new WidgetViewHolder(CameraConfigShutterWidget.class))); + widgetListItems.add(new WidgetListItem(R.string.camera_config_ssd_widget_title, + new WidgetViewHolder(CameraConfigSSDWidget.class, ViewGroup.LayoutParams.WRAP_CONTENT, 28))); + widgetListItems.add(new WidgetListItem(R.string.camera_config_storage_widget_title, + new WidgetViewHolder(CameraConfigStorageWidget.class, ViewGroup.LayoutParams.WRAP_CONTENT, 28))); + widgetListItems.add(new WidgetListItem(R.string.camera_config_wb_widget_title, + new WidgetViewHolder(CameraConfigWBWidget.class))); + widgetListItems.add(new WidgetListItem(R.string.camera_controls_widget_title, + new WidgetViewHolder(CameraControlsWidget.class, 50, 213))); + widgetListItems.add(new WidgetListItem(R.string.camera_settings_menu_indicator_widget_title, + new WidgetViewHolder(CameraSettingsMenuIndicatorWidget.class))); widgetListItems.add(new WidgetListItem(R.string.compass_widget_title, new WidgetViewHolder(CompassWidget.class, ViewGroup.LayoutParams.WRAP_CONTENT, 91))); widgetListItems.add(new WidgetListItem(R.string.dashboard_widget_title, @@ -99,12 +141,28 @@ private void populateList() { new WidgetViewHolder(DistanceHomeWidget.class))); widgetListItems.add(new WidgetListItem(R.string.distance_rc_widget_title, new WidgetViewHolder(DistanceRCWidget.class))); + widgetListItems.add(new WidgetListItem(R.string.exposure_settings_indicator_widget_title, + new WidgetViewHolder(ExposureSettingsIndicatorWidget.class))); + widgetListItems.add(new WidgetListItem(R.string.focus_exposure_switch_widget_title, + new WidgetViewHolder(FocusExposureSwitchWidget.class, 35, 35))); + widgetListItems.add(new WidgetListItem(R.string.focus_mode_widget_title, + new WidgetViewHolder(FocusModeWidget.class, 35, 35))); + widgetListItems.add(new WidgetListItem(R.string.fpv_widget_title, + new WidgetViewHolder(FPVWidget.class, 150, 100))); + widgetListItems.add(new WidgetListItem(R.string.fpv_interaction_widget_title, + new WidgetViewHolder(FPVInteractionWidget.class, 150, 100))); widgetListItems.add(new WidgetListItem(R.string.horizontal_velocity_widget_title, new WidgetViewHolder(HorizontalVelocityWidget.class))); + widgetListItems.add(new WidgetListItem(R.string.photo_video_switch_widget_title, + new WidgetViewHolder(PhotoVideoSwitchWidget.class))); widgetListItems.add(new WidgetListItem(R.string.pre_flight_status_widget_title, new WidgetViewHolder(PreFlightStatusWidget.class, 238, 33))); + widgetListItems.add(new WidgetListItem(R.string.record_video_widget_title, + new WidgetViewHolder(RecordVideoWidget.class, 50, 50))); widgetListItems.add(new WidgetListItem(R.string.remote_control_signal_widget_title, new WidgetViewHolder(RemoteControlSignalWidget.class, 38, 22))); + widgetListItems.add(new WidgetListItem(R.string.shoot_photo_widget_title, + new WidgetViewHolder(ShootPhotoWidget.class, 50, 50))); widgetListItems.add(new WidgetListItem(R.string.simulator_indicator_control_widgets_title, new WidgetViewHolder(SimulatorIndicatorWidget.class, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT), new WidgetViewHolder(SimulatorControlWidget.class, 300, ViewGroup.LayoutParams.MATCH_PARENT))); diff --git a/android-uxsdk-beta-sample/src/main/res/drawable/bg_spinner.xml b/android-uxsdk-beta-sample/src/main/res/drawable/bg_spinner.xml index 08c76280..66e0cc45 100644 --- a/android-uxsdk-beta-sample/src/main/res/drawable/bg_spinner.xml +++ b/android-uxsdk-beta-sample/src/main/res/drawable/bg_spinner.xml @@ -19,6 +19,8 @@ ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ~ SOFTWARE. + ~ + ~ --> diff --git a/android-uxsdk-beta-sample/src/main/res/drawable/ic_arrow_drop_down_blue_24dp.xml b/android-uxsdk-beta-sample/src/main/res/drawable/ic_arrow_drop_down_blue_24dp.xml index 6ceceb1b..4372d1ec 100644 --- a/android-uxsdk-beta-sample/src/main/res/drawable/ic_arrow_drop_down_blue_24dp.xml +++ b/android-uxsdk-beta-sample/src/main/res/drawable/ic_arrow_drop_down_blue_24dp.xml @@ -18,6 +18,8 @@ ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ~ SOFTWARE. + ~ + ~ --> diff --git a/android-uxsdk-beta-sample/src/main/res/drawable/selector_map_type_bg.xml b/android-uxsdk-beta-sample/src/main/res/drawable/selector_map_type_bg.xml index d8adb56d..f80d66a2 100644 --- a/android-uxsdk-beta-sample/src/main/res/drawable/selector_map_type_bg.xml +++ b/android-uxsdk-beta-sample/src/main/res/drawable/selector_map_type_bg.xml @@ -19,6 +19,8 @@ ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ~ SOFTWARE. + ~ + ~ --> diff --git a/android-uxsdk-beta-sample/src/main/res/drawable/selector_map_type_text.xml b/android-uxsdk-beta-sample/src/main/res/drawable/selector_map_type_text.xml index 5f860da6..dd6445e0 100644 --- a/android-uxsdk-beta-sample/src/main/res/drawable/selector_map_type_text.xml +++ b/android-uxsdk-beta-sample/src/main/res/drawable/selector_map_type_text.xml @@ -19,6 +19,8 @@ ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ~ SOFTWARE. + ~ + ~ --> diff --git a/android-uxsdk-beta-sample/src/main/res/layout-large/activity_widgets.xml b/android-uxsdk-beta-sample/src/main/res/layout-large/activity_widgets.xml index b8985df4..b61f4a7e 100644 --- a/android-uxsdk-beta-sample/src/main/res/layout-large/activity_widgets.xml +++ b/android-uxsdk-beta-sample/src/main/res/layout-large/activity_widgets.xml @@ -19,9 +19,11 @@ ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ~ SOFTWARE. + ~ + ~ --> - @@ -44,4 +46,4 @@ app:layout_constraintHorizontal_weight="2" app:layout_constraintRight_toRightOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/android-uxsdk-beta-sample/src/main/res/layout/activity_default_layout.xml b/android-uxsdk-beta-sample/src/main/res/layout/activity_default_layout.xml new file mode 100644 index 00000000..1638372e --- /dev/null +++ b/android-uxsdk-beta-sample/src/main/res/layout/activity_default_layout.xml @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android-uxsdk-beta-sample/src/main/res/layout/activity_main.xml b/android-uxsdk-beta-sample/src/main/res/layout/activity_main.xml index 682094c3..72884ddb 100644 --- a/android-uxsdk-beta-sample/src/main/res/layout/activity_main.xml +++ b/android-uxsdk-beta-sample/src/main/res/layout/activity_main.xml @@ -19,9 +19,11 @@ ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ~ SOFTWARE. + ~ + ~ --> - + app:layout_constraintTop_toTopOf="@+id/button_panel" /> + + + app:layout_constraintLeft_toLeftOf="@+id/button_panel" + app:layout_constraintRight_toRightOf="@+id/button_panel" + app:layout_constraintTop_toBottomOf="@+id/default_layout_button" /> @@ -168,8 +184,9 @@ android:id="@+id/text_view_logs" android:layout_width="match_parent" android:layout_height="wrap_content" + android:textColor="@color/white" tools:text="Registering product" /> - \ No newline at end of file + \ No newline at end of file diff --git a/android-uxsdk-beta-sample/src/main/res/layout/activity_map_widget.xml b/android-uxsdk-beta-sample/src/main/res/layout/activity_map_widget.xml index b0998e52..1a43729e 100644 --- a/android-uxsdk-beta-sample/src/main/res/layout/activity_map_widget.xml +++ b/android-uxsdk-beta-sample/src/main/res/layout/activity_map_widget.xml @@ -19,35 +19,44 @@ ~ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ~ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ~ SOFTWARE. + ~ + ~ --> - + android:layout_width="0dp" + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - + + + android:textStyle="bold" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:background="@color/colorAccent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@+id/settings_text" /> + + - - + android:orientation="horizontal" + app:layout_constraintLeft_toRightOf="@+id/center_selector_label" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@+id/settings_separator"> @@ -97,8 +122,8 @@ android:layout_height="40dp" android:background="@drawable/selector_map_type_bg" android:button="@null" - android:drawableLeft="@drawable/uxsdk_ic_compass_home" android:drawableStart="@drawable/uxsdk_ic_compass_home" + android:drawableLeft="@drawable/uxsdk_ic_compass_home" android:padding="8dp" android:textColor="@drawable/selector_map_type_text" /> @@ -108,8 +133,8 @@ 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:drawableLeft="@android:drawable/ic_notification_clear_all" android:padding="8dp" android:textColor="@drawable/selector_map_type_text" /> @@ -122,7 +147,9 @@ android:layout_marginTop="@dimen/map_settings_item_separator" android:checked="true" android:text="@string/show_home_point" - android:textColor="@color/white" /> + android:textColor="@color/white" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/map_center_selector" /> + android:textColor="@color/white" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/home_point" /> + android:paddingRight="30dp" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/login_state_indicator" />