From 01ce496b7aee7e2313d292984cfaf7b8f31f2f00 Mon Sep 17 00:00:00 2001 From: Puneet Prakash Date: Mon, 25 Nov 2024 13:36:42 -0800 Subject: [PATCH 1/8] 200.6.0 Release - merge v.next into main (#680) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enable the publication of artifacts which include the build number in the version. * bump version * add lambda to authenticator * add util methods * add lambda to DialogAuthenticator * cherry pick to v.next (#103) * use launchCustomTabs in OAuthUserSignInActivity * fix issue with pressing cancel button * Merge pull request #104 from Esri/sorenoid/update-auth-readme use updated name of the auth dependency in README * reinstate onWindowFocusChanged in OAuthUserSignInActivity * use didLaunch logic in OAuthAuthenticator for lambda scenario as well * rm context receivers * remove ontopresumedactivitychanged * Trigger onFacilityChanged along with the levelChanged when selectedLevelId is programmatically updated (#111) * reorganize OAuthAuthenticator * update readme * Don't suggest singleInstance * add doc to method * eof newline * move composable to activity scope * mv viewmodel definition to class level * mv Authenticator definition to setContent block * pass vm as argument to auth app * fix readme numbering * add note about redirect uri * update doc for new param * simplify side effect * Address pr comments * rename Extensions file * rework OAuthAuthenticator to move launcher * update readme * Deletes WebView's session if `preferPrivateWebBrowserSession` is enabled (#119) * added geo composable map * Update gradle * Delete SceneComposable.kt * Revert "Delete SceneComposable.kt" This reverts commit 5f9b41ee2ba73ca97f4c937f079239a791ae4d68. * upgrades to match the API's gradle versions so we can easily include the API as a composite build. Also clears some false warnings in gradle files * renamed to module geo-compose * fixes for displaying FloorFilter facilitySelector when Sites are not present in the map (#153) * Create t9nmanifest.txt (#167) * removed module and microapp (#208) * Update gradle.properties (#211) * Update build.gradle.kts (#212) * updates client id and redirect Uri (#216) * Take out build numbers for publishing (#219) * update dependency section of readme for 200.3.0 (#220) * Improve WebView Display (#213) * Update gradle.properties (#238) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * Add version to API ref (#314) * Feature branches/geo compose (#355) * Implements setting and modifying a map/layers (#136) * changes to display a map * remove unnecessary line * add viewmodel to the micro app * Revert "add viewmodel to the micro app" This reverts commit cfc6b0b39aff5cb79d5ef191e6cdd5634415925f. * address code review feedback * remove unused imports * add overlay support (#143) * add overlay support * add doc * remove the fillmaxsize modifier * remove MapState * add viewpointChangedLambda (#159) * add viewpointChangedLambda * address code review feedback * Support LocationDisplay (#160) * add location display micro app * add location permissions * add support for location display * screen to start/stop a location display * fix typo * show error message if location display fails to start * add AppBar and auto pan mode options * fix type of key * improve doc * add readme * adjust screen shot size * adjust screen shot size * set MapView properties in the update callback * use by remember for mutable state * set error message when LDS fails to start when toggling switch * fix doc references to composable Map * Compose Map InteractionOptions (#163) * Rename - Compose MapView (#165) * Compose MapView: Geometry editor (#170) * Compose MapView: SelectionProperties (#173) * add support for WrapAroundMode (#176) * Compose MapView: ViewLabelProperties (#174) * add implementation for gesture events (#172) * add implementation for gesture events * update SDK dependency add Events exposed on GeoView * address code review comment * address code review comments * refactor mapView.viewpointChanged * Compose Map - graphics overlay (#166) * moved GraphicsOverlaysUpdater (#183) * added grid & backgroundGrid impl (#192) * Draw Status (#186) * Geometry editor micro-app (#178) * added invoke (#197) * Update MapView doc pattern (#191) * add support for attribution text (#187) * add support for attribution text * combine attribution bar properties/events in a state object * refactor mapview parameter list * update collect lambda * Update doc * update doc * Add spatialreference changed callback (#193) * invoke currentOnInteractingChanged with initial value of isInteracting * add callback to mapview * rm initial value calls * change ?.let calls to ?.invoke * move parameter above onInteractingChanged * move launch statement above onInteracitngChanged * MapView Rotation & Scale (#195) * Add inset support (#182) * add mapview inset app * add app to settings.gradle * WIP * update formatting * address code review comments * update setViewInset values * add readme * Update README.md * add doc * address code review feedback * rename mapinsets to insets * rename mapinsets * update doc * address code review comments * Add mapview proxy (#190) * create MapViewOperator class * add param to MapView composable * add locationToScreen and doc * more doc * refactor MapView composable to remove unnecessary code * move mapoperator mapview setting to own disposable effect * don't use synchronize for operations * Eof newline * make MapViewOperator derive from a new GeoViewOperator * eof newline * return null if nan from locationToScreen * add copyrights * fix doc * fix doc * rename operator to proxy * rm overlay param again * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/GeoViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapView.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Apply doc fixes from code review Co-authored-by: Puneet Prakash * mv param below geometry editor * fix doc line length * fix param doc * fix param doc --------- Co-authored-by: Gunther Heppner Co-authored-by: Puneet Prakash * update the copyright to the apache License (#203) * add support for onNavigationChanged (#199) * add support for onNavigationChanged * add doc * MapView TimeExtent (#194) * Support for setting Viewpoint on MapView (#202) * support for ViewpointOperation - initial commit * MapViewpointOperation - prototyping * implement await() on MapViewpointOperation, remove onCompleted callbacks * renaming * add execute extension for remaining operations * rename Bounding to SetBoundingGeometry * add set bookmark * add remaining operations to when statement * make execute an abstract fun on MapViewpointOperation * Add set viewpoint app * fix typo * add dependency to microapp on geocompose * add simple app to set viewpoint with different options * add progress indicator to demonstrate await pattern * extract bookmark to remembered val * make abstract fun an extension fun instead * add doc * add readme to microapp * eof newline * fix readme title * rever locationdisplayapp changes * update screenshot * update readme wording * use a simple list instead of reflection * add doc to MainScreen * add dash to project app name * naming and doc changes * mv onViewpointChanged parameter * change dfeautl animate duration to 0.25 * update microapp module namw --------- Co-authored-by: Hudson Miears * Refactor mapview insets app (#206) * update all since tags in geo-compose module (#227) * Geo-compose: add identify methods and microapp (#223) * add methods to geoviewproxy * rename identifyLayer and identifyGraphicsOverlay to identify as overloads * add prototype app * fix recursive bug * refactor app to separate subcomponents * make one source of truth for geoview in geoviewproxy * make one source of truth for geoview in geoviewproxy * mv business logic to view model class * update doc * add doc to microapp * add top bar * add readme and screenshot * adjust readme description * adjust string resources and error messages * modify identify method to be cancellable and consolidate logic * adjust bottom sheet to only expand to half screen height and move map viewpoint * rename EventDetails -> IdentifyDetails * nullGEoViewErrorMessage no longer uses a getter * rework caching of mapview in proxy to match previous implementation * change doc DIPS -> Dp * fix tolerance parameter types -> Dp * use nullable maximumResults to match swift * sanitize max results * rm yield * add doc enhancements * extract maximum results fun * clamp 0 values for maximumResults * rm throws doc * adjust insets on bottom sheet state change * rm insets behavior * fix doc references * fix doc 200.4.0 * update screenshot * rename className prop * make details height a const * Rename MapView-related microapps to have MapView prefix (#226) * Rename MapView-related microapps to have MapView prefix * Rename all other instances with mapview prefix * rename names in readmes * rename files * rename test directories * add onUnitsPerDipChanged callback lambda (#232) * Add exportImage fun to GeoViewProxy (#233) * Add exportImage fun to GeoViewProxy * update doc * update doc * add isWrapAroundEnabled property to GeoViewProxy (#231) * add isWrapAroundEnabled property to GeoViewProxy * update @since * add doc * Geo-compose: add basic SceneView function (#230) * add SceneView function * eof newline * fix doc and copyright * don't use fully qualified sceneview * added compose BOM (#237) * add ViewPointState (#234) * add ViewPointState * address code review feedback * update doc * Hud10837/layer view state (#228) * add methods to geoviewproxy * rename identifyLayer and identifyGraphicsOverlay to identify as overloads * add prototype app * fix recursive bug * refactor app to separate subcomponents * make one source of truth for geoview in geoviewproxy * make one source of truth for geoview in geoviewproxy * mv business logic to view model class * update doc * add doc to microapp * add top bar * add readme and screenshot * adjust readme description * adjust string resources and error messages * modify identify method to be cancellable and consolidate logic * adjust bottom sheet to only expand to half screen height and move map viewpoint * rename EventDetails -> IdentifyDetails * nullGEoViewErrorMessage no longer uses a getter * rework caching of mapview in proxy to match previous implementation * change doc DIPS -> Dp * fix tolerance parameter types -> Dp * use nullable maximumResults to match swift * sanitize max results * rm yield * add doc enhancements * extract maximum results fun * clamp 0 values for maximumResults * rm throws doc * adjust insets on bottom sheet state change * add layerviewstatechanged callback * add getLayerViewState * move getLayerViewState * mv param position and fix identify mainscreen * SceneView: add sceneview gesture events (#241) * add SceneView function * eof newline * fix doc and copyright * add gesture events * fix param doc" * SceneView: create SceneViewProxy (#246) * create initial SceneViewProxy class * add disposal logic to proxy class * add sceneViewProxy to SceneView * add copyright * SceneView: graphics overlays (#245) * extract graphicsoverlayupdater * eof newline * SceneView: add scene viewpoint operation (#240) * create SceneViewpointOperation * add operation to sceneview * add all operations for sceneview * add doc * eof newline * eof newline * Don't use named params on viewpoint updater * use kotlinx cancellation exception * add copyright * use duration in viewpoint operations * doc * rename durationSeconds and fix microapp * Update feature branch with v.next (#243) * add navigationchanged to sceneview (#248) * SceneView: add ViewLabelProperties (#249) * add viewlabelproperties to sceneview' * fix doc --------- Co-authored-by: Gunther Heppner * SceneView: attribution (#247) * mv AttributionStateHandler function to AttributionState.kt * add attributionState param to SceneView * add @since tag --------- Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt (#253) Co-authored-by: Gunther Heppner * shared the ViewpointChangedState with SceneView (#261) * SceneView TimeExtent (#260) * shared the ViewpointChangedState with SceneView * review update * merge with the feature branch * SceneView spatial reference changed (#258) * add spatial ref changed support * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * shared the ViewpointChangedState with SceneView --------- Co-authored-by: Puneet Prakash * shared the ViewpointChangedState with SceneView (#257) * add layerViewStateChanged to SceneView (#262) * The view property needs to be assigned in ViewProxy class (#264) * add cameraController oaram to sceneview (#265) * add onDrawStatusChanged to SceneView (#266) * add FieldOfView (#270) * SceneView: add sunLighting and sunTime (#275) * add sunLighting and sunTime * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * SceneView current viewpoint camera (#256) * add getCurrentViewpointCamera in proxy * expose the currentViewpoint property * impls current view camera * adds a space for lambda * merged with feature branch. * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * add atmosphereEffect (#278) * Add funs for screen coordinate conversion (#272) * Add funs for screen coordinate conversion * update doc * update doc for SceneView Suntime and SunLighting (#282) * SceneView: AnalysisOverlayCollection (#269) * create AnalysisOverlayCollection * mv factory for graphics overlay collection * add analysis to scene view * eof newlines * add doc * Fix doc that mentions graphics overlays Co-authored-by: Puneet Prakash * mv factory function to SceneView file * address doc comments * mv updater to SceneView file * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * Add space effects on the scene view (#281) * add space effects on scene view * update the comment * SceneView: ambient light color (#279) * add sceneview ambientLightColor param * fix doc * rm full stop * SceneView: add manual rendering funs to SceneViewProxy (#280) * add manual rendering funs to SceneViewProxy * Fix doc * fix doc * SceneView: ImageOverlays (#274) * add ImageOverlayCollection and property * mv factory function to SceneView file * fix doc comments * mv updater to sceneview.kt * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * use data object for Cleared event * use data object for cleared even tin AnalysisOverlayCollection * use data object for cleared event in GraphicsOverlayCollection --------- Co-authored-by: Puneet Prakash * SceneView: lighting options microapp (#286) * add sceneview ambientLightColor param * add space effects on scene view * update the comment * fix doc * create lighting options microapp base * set up dropdown menu * add sun time options * add lighting mode options * add Ambient light color options * add atmosphere effect options * add space effect options * change viewpoint and fix sun time picker * clean up code * use sliders instead of textfields for rgb colors * add doc * add readme and screenshot * eof newline * add doc to components * add missing imports * Add doc DropdownMenuAlertDialog * add missing copyright headers * add doc RgbaSlider * add remaining doc * Update microapps/SceneViewLightingOptionsApp/README.md Co-authored-by: Gunther Heppner --------- Co-authored-by: Changan Shi Co-authored-by: Gunther Heppner * bumping sdk to 4122 (#300) Co-authored-by: Soren Roth * add maven publishing to geo-compose (#301) Co-authored-by: Soren Roth * Scene view camera controller app (#288) * init implementation for camera controller * add gitignore * adds comments and remove view model. * update the doc and png image * update the comment * add the extra space line * update the screenshot * review update * update the 2023 comment * update the comment * review update * v next merge to geo compose (#303) * change name of Licesne file in preparation for migration to Esri * revert change to license file name * remove extra license file * Update README.md images (#102) * holder commit * Update README.md update link * upload screenshot image * add images to the micro app * Update README.md * Update README.md * use updated name of the auth dependency in README * Create t9nmanifest.txt (#167) * removed module and microapp (#208) * Update gradle.properties (#211) * Update build.gradle.kts (#212) * updates client id and redirect Uri (#216) * Take out build numbers for publishing (#219) * update dependency section of readme for 200.3.0 (#220) * Improve WebView Display (#213) * Update gradle.properties (#238) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * add kdoc project! --------- Co-authored-by: Soren Roth Co-authored-by: Puneet Prakash Co-authored-by: Rama Chintapalli Co-authored-by: Shubham Sharma Co-authored-by: Erick Lopez Solis Co-authored-by: Gunther Heppner Co-authored-by: hud10837 * Micro app - sceneview viewpoint navigation (#291) * add micro app * update doc * add readme, screenshot. Remove use of spinner * update readme * update doc * update readme * update screenshot * update image, add new location remove unused imports * Geo-Compose: Add module README (#294) * add readme and screenshot to geo-compose module * use table for screenshot * reduce screenshot size * reduce screenshot size * reduce screenshot size * increase screenshot size * reduce screenshot size * Deprecate composable-map (#293) * changes for authentication and compass app * update floorfilter micro app * deprecate composable map * update deprecated annotation * add deprecation annotation to public components * update template-app to use geo-compose module * remove unused import reformat code * Add missing doc to geo-compose classes (#307) * added attribution bar changes (#309) * Geo-compose: Remove ViewpointChangedEvent (#310) * modify mapview with new params * modify sceneview with new params * delete viewpointchangedstate * Geo-compose: Remove ViewpointOperations (#316) * rm MapViewpointOperation * rm SceneViewpointOperation * add mapviewproxy methods * add sceneviewproxy methods * update mapview set viewpoint app * refactor sceneview setviewpointapp * refactor mapview setviewpointapp to match structure of sceneview app * update readmes * rm progress indicator from sceneview app * address pr comments * address pr comments * Compose doc improvements (#315) * Add @Stable annotation #319 * Update SceneViewCameraController app to use SceneViewProxy (#325) * Update SceneViewCameraController app to use SceneViewProxy setViewPointCameraAnimated function * update floorFilterApp * Merge v.next into feature-branches/geo-compose (#327) * change name of Licesne file in preparation for migration to Esri * revert change to license file name * remove extra license file * Update README.md images (#102) * holder commit * Update README.md update link * upload screenshot image * add images to the micro app * Update README.md * Update README.md * use updated name of the auth dependency in README * Create t9nmanifest.txt (#167) * removed module and microapp (#208) * Update gradle.properties (#211) * Update build.gradle.kts (#212) * updates client id and redirect Uri (#216) * Take out build numbers for publishing (#219) * update dependency section of readme for 200.3.0 (#220) * Improve WebView Display (#213) * Update gradle.properties (#238) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * Add version to API ref (#314) --------- Co-authored-by: Soren Roth Co-authored-by: Soren Roth Co-authored-by: Rama Chintapalli Co-authored-by: Shubham Sharma Co-authored-by: Erick Lopez Solis Co-authored-by: Gunther Heppner Co-authored-by: hud10837 * Revisit GraphicsOverlayCollection, AnalysisOverlayCollection and ImageOverlayCollection (#320) * Remove GraphicsOverlaysCollection and its usage Add parameter to MapView to take graphicsOverlays as List * update mapView and SceneView to use arrays for image overlays and analysis overlays update micro app * update geometry editor micro app * remove all graphics overlays, rather than just clear graphics * Update param type to List * remove comma * update doc * update micro app * remember emptylist() * use it instead of mapView * use it instead of sceneView * use it instead of sceneView * use it instead of sceneView --------- Co-authored-by: Gunther Heppner * modify compass microapp to use mapViewProxy for viewpoints (#337) * Composable MapView/SceneView: remember default parameters (#330) * add remember to default parameters in mapview * add remember to default parameters in sceneview * add circular progress indicator to sceneview setviewpoint microapp * fix lighting options app * use defaults for sceneview * add mapviewdefaults * add doc * Update map and scene parameters to be non-nullable (#331) * SceneView: analysis overlay microapp (#306) * add readme and screenshot to geo-compose module * create microapp module * add prototype version * clean up implementation * add readme * update screenshot * revert screenshot for GeoCompose * update GraphicOverlays and AnalysisOverlay to use latest implementation * update ReadMe * fix typo * add description doc for MainScreen() --------- Co-authored-by: Puneet Prakash * Composable GeoViews: Viewpoint Persistence (#343) * prototype persistence enum * move viewpoint related code to separate function * ensure persistence type changes are monitored * persist camera for sceneview * initialize sceneview with default matrix * add doc * always set persisted viewpoint even when null * use when statement * mv visible area changed invocation * rename viewpoint persistence * permit nullable persisted camera on sceneview * Rename viewpoint persistence and make it sealed class with overwritten equals and hashcode. This is needed in case we want to add some property to the class later on. * simplify getting current viewpoint and setting to persisted viewpoint * normalize point on save * only normalize viewpoint if sr is pannable or geographic' git push * use mapviewdefaults for default viewpoint persistence value * use normalized geometry as point or polygon depending on viewpoint type * persist non normalized viewpoint if normalized viewpoint is null * rename value from restore in sceneview * add explanatory comments * refactor extension fun mapview.getviewpointbypersistence * Add comments * fix template app still using viewpoint operation * use expression syntax * add viewpoint persistence doc * mv parameter higher * rm cast to polygon for bounding geometry on restoration * factor out normalize function * use early return style for readability' * rename viewpointtopersist -> normalizedviewpoint * use expression syntax for hashcode and equals * convert tryNormalizeViewpoint to extension fun on Viewpoint --------- Co-authored-by: Puneet Prakash Co-authored-by: Gunther Heppner Co-authored-by: Shubham Sharma Co-authored-by: Changan Shi Co-authored-by: Soren Roth Co-authored-by: Soren Roth Co-authored-by: Rama Chintapalli Co-authored-by: Erick Lopez Solis * merge feature branches/forms -> v.next (#360) * only show date in field when the element's includeTime is false. * feedback and other gradle workarounds * DateTimePicker validation and state update (#78) * hoisted states upto DateTimePickerState and removed visible behavior * added DateTime class * conflict resolution fix * DateTimePicker landscape layout (#83) * consume core * print stack trace when core throws a sigbus * triage core issues * print stack trace when core throws a sigbus * don't change supprting text colors under any circumstances. * run test from json data, not from service data * update to latest core build * FormTextField description focus fix (#87) * add data. avoid expression names * avoid expression names * Form content clipping fix (#89) * added measure and placement constraints for the bottomsheetscaffold * removed transparent top bar :( * remove preview that con no longer be doen without public serialization support. fix some things that broke through merges remove serialization dependency * add some remembers. not sure how to remember a State instance on a state object across pause/resume * add saver for DateTimePickerState * add saver for DateTimePickerState * remove logging * date time fixes wip * date time calcs all working correctly * remove print statements * doc, remove more print statements * better doc * eol at eof * update textfield tests to use core API * remove excess remembrance. refactor a bit for PR feedback. * naming changes * eol at eof * work around lack of recompose of the yearremove input for remembering the date time picker state. add a call to dateTimePickerState.setSelection so that even though the state object is remembered, the selection is re-set on recompose. * remove input for remembering the date time picker state. add a call to dateTimePickerState.setSelection so that even though the state object is remembered, the selection is re-set on recompose. * fix issue with DateTimePicker state saver * address basic issue of enabling the OK button in a way that abides the min and max datetimes * fix min and max comparisons * Update DateTimePicker.kt (#113) * init copy * fixed compilation errors * Featureforms micro-app update to cache portalitems (#107) * Working fetching portals from remote * added icons for portal access type * added room database * working room database for portal cache * moved first fetch into viewmodel * refactored repository-domain structure * updated content visibility once loaded * working update * revert unchanged files * fixed thumbnail loading * added comments * updated fetching portalitems based on their itemid from local cache * added new public webmap and added enabled state to refresh dropdown menu * PR feedback * FeatureformsApp : add thumbnails cache (#110) * added thumbnail caching * updated access info from thumbnails to text * removed itemrepository and moved responsibility into PortalItemRepository * added comments * moved coil dependency to root level * Update PortalItemRepository.kt * added mutex to local cache map * fix return@withContext usage * remove commented out code * pick up latest SDK with mutable elements in the FeatureForm * moved imports * fixed timepicker bugs * added copyright * move TimePickerState into the PickerContent. Remove call to datePicker.setSelection. Remove now and today state object methods. * remove unused code * fix up last commit -- from the wrong source on my machine! * subtract the offset to represent fake picker UTC, don't add it * picker dates is utc plus offset (not minus!). get the date millis after the addition so the timezone doesn't affect the times derived from the millis. * fix now freeze (#123) * remove call to set date picker set selection, no longer needed. * remove double counting * wip with included build * value, editable, and required events working for text fields. * dontuse a coroutine use a LaunchedEffect * respect isRequired in TextFields! * required events support * note * doc * date time expression support * doc * add circular progress indicator * state flow combine * only evaluate expressions based on user edits to text fields, not due to changes from the evaluation of expressions. * text form changes to support use of combine * date time form element input type changes to support use of combine * date time form element input type changes to support use of combine * rollback versioning changes * roll back unrelated code change * remove redundant statefulness * follow up to events API changes * Forms combo box implementation (#127) * init prototype * added bottomsheet for combobox * Update FormTextFieldState.kt * refactored basefieldstate * updated basetextfield * moved combobox to use basetextfield and updated basetextfield * added description * changed combobox bottomsheet to dialog * added clear icon * added no value validation and row * optimized imports * added comments and copyright * Update FormElements.kt * updated basefieldstate to work with expressions * added more comments * combobox expressions update * Update ComboBoxFieldState.kt * fixed text field validation * using codedvalues from api * updated validation for textfield * changed basefieldstate to be a simple class * update string resource * add remembersaveable to comboboxdialog * fix conflict resolution error * numeric text field support. * fix conflict resolution error. * remember to evaluate expressions * Form field states remember saveable (#131) * init refactor * textareainput show done button even if field is empty * introduced classes to wrap common parameters * Update FormElements.kt * working remembersaveable * added remembersaveable outside lazycolumn * added id for formfieldelement * optimized imports * undo changes * optimized more imports * updated field element to not remember datetimefieldstate * updated unique id calc for fieldformelement * mark comboboxfieldstate as stable * add domain, fieldType to BaseFieldProperties. * tests for numeric text box * self review * change identifyLayer to identifyLayers (#137) * move fieldType and domain down to FormTextFieldState. get range from the feature table. * just use number keyboard for integers so negative numbers can be typed by the user. * revert settings.gradle changes * Forms combo box required validation (#134) * added required expression support * added validation on "clear" * hoist up the fieldType so the TextField is just handed a keyboard type. * migrated to use standardbottomsheet instead of a scaffold (#135) * updated sdk build to 4019 (#139) * use numeric keyboard in ComboBoxDialog filter when fieldType is numeric. * filter out layers without forms in results of identify * simplify logic * Forms: DateTimeFieldState refactor (#133) * init refactor * textareainput show done button even if field is empty * introduced classes to wrap common parameters * Update FormElements.kt * working remembersaveable * added remembersaveable outside lazycolumn * added id for formfieldelement * optimized imports * undo changes * optimized more imports * updated field element to not remember datetimefieldstate * migrated DateTimeFieldState to use BaseFieldState * added saver to DateTimeFieldState * update doc * switch input support * address feedback * drop the first isFocused StateFlow emission in the FormTextFieldState init block. * fall back to combo when the initial value doesn't match the on or off coded value. * self review * rewrite validation for FormTextFields * Forms : Refactor `ComboBoxFieldState` into `CodedValueFieldState` (#146) * refactor comboboxfieldstate into codedvaluefieldstate * Update CodedValueFieldState.kt * refactored list of codedvalues to be list of strings * changed comboboxdialog to show codedvalue.name * Forms : Updated `ComboboxField` to display `CodedValue.name` (#148) * updated comboboxfield to display codedvalue.name * optimized imports * SwitchFieldState inherits from CodedValueFieldState * support error validation state in FormTextFieldState.Saver, rememember * clean up, add runtime checks, comments. * further isolate error messaging and validation * updated basetextfield label overflow and added preview (#150) * Forms : introduce `RadioButtonInput` (#149) * init radiobutton field type impl * added no value row handing * added default color support for radio button * refactor comboboxfieldstate into codedvaluefieldstate * Update CodedValueFieldState.kt * refactored list of codedvalues to be list of strings * radiobuttonfieldstate subclasses codedvaluefieldstate * updated merge conflicts * fixed fallback behavior * extracted params from RadioButtonField to support preview * PR feedback * conflict resolution * fix collateral merge build breaker * present the latest emitted value for a text field, regardless of editability. * allow switch to change when text field is tapped. remember if the switch is falling back to a combo. * provide the Switch through the trailingIcon of the OutlinedTextField * remove unnecessary open modifier * add try-catch to featureFormDefinition check (#155) * drop first emitted value from properties.value in favor of the initial value. This preserves edits on config change even if the field is no longer editable. * Forms : Fix orientation changes for Dialogs (#156) * added custom dialog type * updated dialog for ComboBoxField * updated dialog name * added doc * add dialog request callback to switch fallback * Forms: `DateTimeField` changes (#161) * moved to BaseFieldState * added required validation * optimized expr eval ui (#169) * `Forms`: DateTimePicker defaults (#168) * moved to BaseFieldState * added required validation * updated default datetimepicker logic * Update MapScreen.kt (#171) * removed FormElement dependency from FieldElement (#175) * consume update value (#162) * provide a StateFlow for the formattedValue property * update to 4036 SDK * remove release signing logic * Use updateValue to set the attribute value. * Cast the value to the appropriate type before calling updateValue. * fix fallback logic. accept Instant as a supported type for a FieldType of type DateTime. * make the input type of radio a String and base logic around the name of the coded value. * use name instead of code as the value for all elements which use a CodedValueFieldState. * log a warning when applying edits fails * change name of formattedFlow. show a toast when edits cannot be applied --------- Co-authored-by: Soren Roth * update to rtc 4043 (#180) Co-authored-by: Soren Roth * `Forms`: Group Elements Support (#179) * optimized state creation (#181) * update to build 4046 (#185) * use datetime raw value (#184) * expect a formatted value to be UTC * make BaseFieldState generic * make DateTimeFieldState vary with Instant? make DateTimeField work with Instant, not Long. * only support date time text field value changes that clear the text. * PR review suggestions * fuse usage of formattedValue and value into one type safe generic function --------- Co-authored-by: Soren Roth * novaluelabel selection fix (#188) * searchable items map list screen (#189) * make maps searchable by title or item id * hoist search text to the map list view model * filter field consistency between horizontal and vertical layout. rounded corners. --------- Co-authored-by: Soren Roth * bump sdk to 4056 (#196) Co-authored-by: Soren Roth * Forms: DatePickerDialog scaling (#198) * fix ff tests (#201) * update tests for type safe value flow * remove unnecessary modifier --------- Co-authored-by: Soren Roth * `Forms`: Micro-app add enterprise login (#204) * `Forms` : Microapp SideSheet support (#207) * make values focusable (and copyable) when not editable (#200) * make values focusable (and copyable) when isEditable = false. * organize color defaults for BaseTextField --------- Co-authored-by: Soren Roth * Forms: Add ComboBox tests (#141) * `Forms` : GroupElements fixes (#210) * `Forms` microapp : Add network credential store (#215) * `Forms`: GroupElement tests (#214) * `forms:` extract commit transaction to microapp (#209) * extract commit support from public toolkit featureform component. * move commitEdits into MapViewModel --------- Co-authored-by: Soren Roth * `Forms`: Microapp add login url recent history (#222) * `Forms`: Combo Box Dialog sizing (#225) * `Forms`: Microapp optimizations (#239) * removed refresh action * added parallel item loading * removed redundant code * introduced AsyncImage and removed dependency on coil * updated asyncimage params * removed thumbnail loading from portal item repository and from the database * added comments * removed coroutinescope dependency for portal item repo * added remember for imageloader * Update PortalItemRepository.kt * `Forms`: Common base state (#252) * added FormElementState * updated state reading * updated saver type * refactored and removed feature form state (#250) * validation via the SDK (#267) * expect a formatted value to be UTC * make BaseFieldState generic * make DateTimeFieldState vary with Instant? make DateTimeField work with Instant, not Long. * first pass at consuming core validation errors * factor out Validation States to a common file * remove merge detritus * update SDK. * cleanup * remove unused import. simplify syntax. --------- Co-authored-by: Soren Roth * `Forms`: Refactored Dialog Mechanism (#254) * `Forms`: Iterable collection of states (#263) * fix renamed method calls (#271) * fix test compilation errors (#273) Co-authored-by: Soren Roth * `Forms`: Refactor Validation (#276) * `Forms`: Fix failing tests (#283) * `Forms:` date time UI tests (#277) * date time picker interrogation * fix test compilation errors * date time tests * comments * remove debugging code --------- Co-authored-by: Soren Roth * `Forms`: Refactored state flow based Impl into compose state based (#287) * `Forms` : Added discardEdits API and UI (#295) * `Forms`: Submit Form Validation (#292) * bumping sdk to 4122 (#299) Co-authored-by: Soren Roth * `Forms`: Select Feature (#298) * merge v next (#302) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * add back compose navigation and use compose bom in ff app --------- Co-authored-by: hud10837 Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * fix up versions. * make FormElementState internal (#304) * `Forms`: Update readme (#305) * `Forms` : Update disabled fields style (#308) * incorporate breaking API change GroupElement.formElements -> GroupElement.elements (#311) Co-authored-by: Soren Roth * `Forms`: Attachments API (#313) * added mock api * Update AttachmentFormElement.kt * added check for creating bitmaps * updated with latest api design * Update evaluation expression loading animation (#322) * reverted to outlinedtextfield (#323) * `Forms` Fork date picker (#321) * attachment UI functional prototype (#317) * basic attachment element view * AttachmentDetails view * static design complete * use passed in modifier for top level card * ship it * add a choose file button. add cloud icon * add editable state to header * rename file * share interaction source between thumnail and details * remove unused code * set thumbnail image aspect ratio to 1.0f * code review UI changes * minor style sizing * remove hardcoded prototype composable call --------- Co-authored-by: Soren Roth * Add version to API ref (#314) (#328) Co-authored-by: Shubham Sharma * `Forms` : Consume latest sdk (#324) * feature form recomposition when a new Feature is selected (#326) * support changing selected feature without showin discard edits dialog * add dialog when selecting new Feature. * remove comment * feedback --------- Co-authored-by: Soren Roth * remove experimental softwarekeyboardcontroller (#335) * `Forms`: Consume `validationErrors` stateflow (#338) * pick up SDK 4159 (#340) Co-authored-by: Soren Roth * `Forms`: Add basic theming support (#339) * updated tests and removed clear icon for combo fields (#342) * make Attachment prototypes internal for release. (#344) Co-authored-by: Soren Roth * `Forms` : Read only fields re-design (#346) * `Forms`: bump sdk to 4167 (#347) * `Forms` : Revert map state (#348) * `Forms` api backwards compatibility validation (#345) * add api file and bcv support * ignore ComposableSingleton classes * update api file * add todo --------- Co-authored-by: Soren Roth * create an internal subpackage containing all non public packages. (#350) Co-authored-by: Soren Roth * replace clear button on required date time fields (#351) * replace clear button from required date time fields with date time picker dialog button * just use the edit calendar icon. --------- Co-authored-by: Soren Roth * `Forms` : add radio and switch tests (#352) * added radio and switch tests * added comments * remove old view model test from app project. * update since version of the public FeatureForm composable method. * add copyrights * remove kapt from featureforms app * move ksp plugin to end of list * Create README.md * Add files via upload * Update README.md --------- Co-authored-by: Soren Roth Co-authored-by: Kaushik Meesala Co-authored-by: Kaushik Meesala Co-authored-by: hud10837 Co-authored-by: Erick Lopez Solis Co-authored-by: Puneet Prakash Co-authored-by: Shubham Sharma * don't normalize viewpoints before persisting (#357) * Implements setting and modifying a map/layers (#136) * changes to display a map * remove unnecessary line * add viewmodel to the micro app * Revert "add viewmodel to the micro app" This reverts commit cfc6b0b39aff5cb79d5ef191e6cdd5634415925f. * address code review feedback * remove unused imports * add overlay support (#143) * add overlay support * add doc * remove the fillmaxsize modifier * remove MapState * add viewpointChangedLambda (#159) * add viewpointChangedLambda * address code review feedback * Support LocationDisplay (#160) * add location display micro app * add location permissions * add support for location display * screen to start/stop a location display * fix typo * show error message if location display fails to start * add AppBar and auto pan mode options * fix type of key * improve doc * add readme * adjust screen shot size * adjust screen shot size * set MapView properties in the update callback * use by remember for mutable state * set error message when LDS fails to start when toggling switch * fix doc references to composable Map * Compose Map InteractionOptions (#163) * Rename - Compose MapView (#165) * Compose MapView: Geometry editor (#170) * Compose MapView: SelectionProperties (#173) * add support for WrapAroundMode (#176) * Compose MapView: ViewLabelProperties (#174) * add implementation for gesture events (#172) * add implementation for gesture events * update SDK dependency add Events exposed on GeoView * address code review comment * address code review comments * refactor mapView.viewpointChanged * Compose Map - graphics overlay (#166) * moved GraphicsOverlaysUpdater (#183) * added grid & backgroundGrid impl (#192) * Draw Status (#186) * Geometry editor micro-app (#178) * added invoke (#197) * Update MapView doc pattern (#191) * add support for attribution text (#187) * add support for attribution text * combine attribution bar properties/events in a state object * refactor mapview parameter list * update collect lambda * Update doc * update doc * Add spatialreference changed callback (#193) * invoke currentOnInteractingChanged with initial value of isInteracting * add callback to mapview * rm initial value calls * change ?.let calls to ?.invoke * move parameter above onInteractingChanged * move launch statement above onInteracitngChanged * MapView Rotation & Scale (#195) * Add inset support (#182) * add mapview inset app * add app to settings.gradle * WIP * update formatting * address code review comments * update setViewInset values * add readme * Update README.md * add doc * address code review feedback * rename mapinsets to insets * rename mapinsets * update doc * address code review comments * Add mapview proxy (#190) * create MapViewOperator class * add param to MapView composable * add locationToScreen and doc * more doc * refactor MapView composable to remove unnecessary code * move mapoperator mapview setting to own disposable effect * don't use synchronize for operations * Eof newline * make MapViewOperator derive from a new GeoViewOperator * eof newline * return null if nan from locationToScreen * add copyrights * fix doc * fix doc * rename operator to proxy * rm overlay param again * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/GeoViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapView.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Apply doc fixes from code review Co-authored-by: Puneet Prakash * mv param below geometry editor * fix doc line length * fix param doc * fix param doc --------- Co-authored-by: Gunther Heppner Co-authored-by: Puneet Prakash * update the copyright to the apache License (#203) * add support for onNavigationChanged (#199) * add support for onNavigationChanged * add doc * MapView TimeExtent (#194) * Support for setting Viewpoint on MapView (#202) * support for ViewpointOperation - initial commit * MapViewpointOperation - prototyping * implement await() on MapViewpointOperation, remove onCompleted callbacks * renaming * add execute extension for remaining operations * rename Bounding to SetBoundingGeometry * add set bookmark * add remaining operations to when statement * make execute an abstract fun on MapViewpointOperation * Add set viewpoint app * fix typo * add dependency to microapp on geocompose * add simple app to set viewpoint with different options * add progress indicator to demonstrate await pattern * extract bookmark to remembered val * make abstract fun an extension fun instead * add doc * add readme to microapp * eof newline * fix readme title * rever locationdisplayapp changes * update screenshot * update readme wording * use a simple list instead of reflection * add doc to MainScreen * add dash to project app name * naming and doc changes * mv onViewpointChanged parameter * change dfeautl animate duration to 0.25 * update microapp module namw --------- Co-authored-by: Hudson Miears * Refactor mapview insets app (#206) * update all since tags in geo-compose module (#227) * Geo-compose: add identify methods and microapp (#223) * add methods to geoviewproxy * rename identifyLayer and identifyGraphicsOverlay to identify as overloads * add prototype app * fix recursive bug * refactor app to separate subcomponents * make one source of truth for geoview in geoviewproxy * make one source of truth for geoview in geoviewproxy * mv business logic to view model class * update doc * add doc to microapp * add top bar * add readme and screenshot * adjust readme description * adjust string resources and error messages * modify identify method to be cancellable and consolidate logic * adjust bottom sheet to only expand to half screen height and move map viewpoint * rename EventDetails -> IdentifyDetails * nullGEoViewErrorMessage no longer uses a getter * rework caching of mapview in proxy to match previous implementation * change doc DIPS -> Dp * fix tolerance parameter types -> Dp * use nullable maximumResults to match swift * sanitize max results * rm yield * add doc enhancements * extract maximum results fun * clamp 0 values for maximumResults * rm throws doc * adjust insets on bottom sheet state change * rm insets behavior * fix doc references * fix doc 200.4.0 * update screenshot * rename className prop * make details height a const * Rename MapView-related microapps to have MapView prefix (#226) * Rename MapView-related microapps to have MapView prefix * Rename all other instances with mapview prefix * rename names in readmes * rename files * rename test directories * add onUnitsPerDipChanged callback lambda (#232) * Add exportImage fun to GeoViewProxy (#233) * Add exportImage fun to GeoViewProxy * update doc * update doc * add isWrapAroundEnabled property to GeoViewProxy (#231) * add isWrapAroundEnabled property to GeoViewProxy * update @since * add doc * Geo-compose: add basic SceneView function (#230) * add SceneView function * eof newline * fix doc and copyright * don't use fully qualified sceneview * added compose BOM (#237) * add ViewPointState (#234) * add ViewPointState * address code review feedback * update doc * Hud10837/layer view state (#228) * add methods to geoviewproxy * rename identifyLayer and identifyGraphicsOverlay to identify as overloads * add prototype app * fix recursive bug * refactor app to separate subcomponents * make one source of truth for geoview in geoviewproxy * make one source of truth for geoview in geoviewproxy * mv business logic to view model class * update doc * add doc to microapp * add top bar * add readme and screenshot * adjust readme description * adjust string resources and error messages * modify identify method to be cancellable and consolidate logic * adjust bottom sheet to only expand to half screen height and move map viewpoint * rename EventDetails -> IdentifyDetails * nullGEoViewErrorMessage no longer uses a getter * rework caching of mapview in proxy to match previous implementation * change doc DIPS -> Dp * fix tolerance parameter types -> Dp * use nullable maximumResults to match swift * sanitize max results * rm yield * add doc enhancements * extract maximum results fun * clamp 0 values for maximumResults * rm throws doc * adjust insets on bottom sheet state change * add layerviewstatechanged callback * add getLayerViewState * move getLayerViewState * mv param position and fix identify mainscreen * SceneView: add sceneview gesture events (#241) * add SceneView function * eof newline * fix doc and copyright * add gesture events * fix param doc" * SceneView: create SceneViewProxy (#246) * create initial SceneViewProxy class * add disposal logic to proxy class * add sceneViewProxy to SceneView * add copyright * SceneView: graphics overlays (#245) * extract graphicsoverlayupdater * eof newline * SceneView: add scene viewpoint operation (#240) * create SceneViewpointOperation * add operation to sceneview * add all operations for sceneview * add doc * eof newline * eof newline * Don't use named params on viewpoint updater * use kotlinx cancellation exception * add copyright * use duration in viewpoint operations * doc * rename durationSeconds and fix microapp * Update feature branch with v.next (#243) * add navigationchanged to sceneview (#248) * SceneView: add ViewLabelProperties (#249) * add viewlabelproperties to sceneview' * fix doc --------- Co-authored-by: Gunther Heppner * SceneView: attribution (#247) * mv AttributionStateHandler function to AttributionState.kt * add attributionState param to SceneView * add @since tag --------- Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt (#253) Co-authored-by: Gunther Heppner * shared the ViewpointChangedState with SceneView (#261) * SceneView TimeExtent (#260) * shared the ViewpointChangedState with SceneView * review update * merge with the feature branch * SceneView spatial reference changed (#258) * add spatial ref changed support * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * shared the ViewpointChangedState with SceneView --------- Co-authored-by: Puneet Prakash * shared the ViewpointChangedState with SceneView (#257) * add layerViewStateChanged to SceneView (#262) * The view property needs to be assigned in ViewProxy class (#264) * add cameraController oaram to sceneview (#265) * add onDrawStatusChanged to SceneView (#266) * add FieldOfView (#270) * SceneView: add sunLighting and sunTime (#275) * add sunLighting and sunTime * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * SceneView current viewpoint camera (#256) * add getCurrentViewpointCamera in proxy * expose the currentViewpoint property * impls current view camera * adds a space for lambda * merged with feature branch. * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * add atmosphereEffect (#278) * Add funs for screen coordinate conversion (#272) * Add funs for screen coordinate conversion * update doc * update doc for SceneView Suntime and SunLighting (#282) * SceneView: AnalysisOverlayCollection (#269) * create AnalysisOverlayCollection * mv factory for graphics overlay collection * add analysis to scene view * eof newlines * add doc * Fix doc that mentions graphics overlays Co-authored-by: Puneet Prakash * mv factory function to SceneView file * address doc comments * mv updater to SceneView file * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * Add space effects on the scene view (#281) * add space effects on scene view * update the comment * SceneView: ambient light color (#279) * add sceneview ambientLightColor param * fix doc * rm full stop * SceneView: add manual rendering funs to SceneViewProxy (#280) * add manual rendering funs to SceneViewProxy * Fix doc * fix doc * SceneView: ImageOverlays (#274) * add ImageOverlayCollection and property * mv factory function to SceneView file * fix doc comments * mv updater to sceneview.kt * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * use data object for Cleared event * use data object for cleared even tin AnalysisOverlayCollection * use data object for cleared event in GraphicsOverlayCollection --------- Co-authored-by: Puneet Prakash * SceneView: lighting options microapp (#286) * add sceneview ambientLightColor param * add space effects on scene view * update the comment * fix doc * create lighting options microapp base * set up dropdown menu * add sun time options * add lighting mode options * add Ambient light color options * add atmosphere effect options * add space effect options * change viewpoint and fix sun time picker * clean up code * use sliders instead of textfields for rgb colors * add doc * add readme and screenshot * eof newline * add doc to components * add missing imports * Add doc DropdownMenuAlertDialog * add missing copyright headers * add doc RgbaSlider * add remaining doc * Update microapps/SceneViewLightingOptionsApp/README.md Co-authored-by: Gunther Heppner --------- Co-authored-by: Changan Shi Co-authored-by: Gunther Heppner * bumping sdk to 4122 (#300) Co-authored-by: Soren Roth * add maven publishing to geo-compose (#301) Co-authored-by: Soren Roth * Scene view camera controller app (#288) * init implementation for camera controller * add gitignore * adds comments and remove view model. * update the doc and png image * update the comment * add the extra space line * update the screenshot * review update * update the 2023 comment * update the comment * review update * v next merge to geo compose (#303) * change name of Licesne file in preparation for migration to Esri * revert change to license file name * remove extra license file * Update README.md images (#102) * holder commit * Update README.md update link * upload screenshot image * add images to the micro app * Update README.md * Update README.md * use updated name of the auth dependency in README * Create t9nmanifest.txt (#167) * removed module and microapp (#208) * Update gradle.properties (#211) * Update build.gradle.kts (#212) * updates client id and redirect Uri (#216) * Take out build numbers for publishing (#219) * update dependency section of readme for 200.3.0 (#220) * Improve WebView Display (#213) * Update gradle.properties (#238) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * add kdoc project! --------- Co-authored-by: Soren Roth Co-authored-by: Puneet Prakash Co-authored-by: Rama Chintapalli Co-authored-by: Shubham Sharma Co-authored-by: Erick Lopez Solis Co-authored-by: Gunther Heppner Co-authored-by: hud10837 * Micro app - sceneview viewpoint navigation (#291) * add micro app * update doc * add readme, screenshot. Remove use of spinner * update readme * update doc * update readme * update screenshot * update image, add new location remove unused imports * Geo-Compose: Add module README (#294) * add readme and screenshot to geo-compose module * use table for screenshot * reduce screenshot size * reduce screenshot size * reduce screenshot size * increase screenshot size * reduce screenshot size * Deprecate composable-map (#293) * changes for authentication and compass app * update floorfilter micro app * deprecate composable map * update deprecated annotation * add deprecation annotation to public components * update template-app to use geo-compose module * remove unused import reformat code * Add missing doc to geo-compose classes (#307) * added attribution bar changes (#309) * Geo-compose: Remove ViewpointChangedEvent (#310) * modify mapview with new params * modify sceneview with new params * delete viewpointchangedstate * Geo-compose: Remove ViewpointOperations (#316) * rm MapViewpointOperation * rm SceneViewpointOperation * add mapviewproxy methods * add sceneviewproxy methods * update mapview set viewpoint app * refactor sceneview setviewpointapp * refactor mapview setviewpointapp to match structure of sceneview app * update readmes * rm progress indicator from sceneview app * address pr comments * address pr comments * Compose doc improvements (#315) * Add @Stable annotation #319 * Update SceneViewCameraController app to use SceneViewProxy (#325) * Update SceneViewCameraController app to use SceneViewProxy setViewPointCameraAnimated function * update floorFilterApp * Merge v.next into feature-branches/geo-compose (#327) * change name of Licesne file in preparation for migration to Esri * revert change to license file name * remove extra license file * Update README.md images (#102) * holder commit * Update README.md update link * upload screenshot image * add images to the micro app * Update README.md * Update README.md * use updated name of the auth dependency in README * Create t9nmanifest.txt (#167) * removed module and microapp (#208) * Update gradle.properties (#211) * Update build.gradle.kts (#212) * updates client id and redirect Uri (#216) * Take out build numbers for publishing (#219) * update dependency section of readme for 200.3.0 (#220) * Improve WebView Display (#213) * Update gradle.properties (#238) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * Add version to API ref (#314) --------- Co-authored-by: Soren Roth Co-authored-by: Soren Roth Co-authored-by: Rama Chintapalli Co-authored-by: Shubham Sharma Co-authored-by: Erick Lopez Solis Co-authored-by: Gunther Heppner Co-authored-by: hud10837 * Revisit GraphicsOverlayCollection, AnalysisOverlayCollection and ImageOverlayCollection (#320) * Remove GraphicsOverlaysCollection and its usage Add parameter to MapView to take graphicsOverlays as List * update mapView and SceneView to use arrays for image overlays and analysis overlays update micro app * update geometry editor micro app * remove all graphics overlays, rather than just clear graphics * Update param type to List * remove comma * update doc * update micro app * remember emptylist() * use it instead of mapView * use it instead of sceneView * use it instead of sceneView * use it instead of sceneView --------- Co-authored-by: Gunther Heppner * modify compass microapp to use mapViewProxy for viewpoints (#337) * Composable MapView/SceneView: remember default parameters (#330) * add remember to default parameters in mapview * add remember to default parameters in sceneview * add circular progress indicator to sceneview setviewpoint microapp * fix lighting options app * use defaults for sceneview * add mapviewdefaults * add doc * Update map and scene parameters to be non-nullable (#331) * SceneView: analysis overlay microapp (#306) * add readme and screenshot to geo-compose module * create microapp module * add prototype version * clean up implementation * add readme * update screenshot * revert screenshot for GeoCompose * update GraphicOverlays and AnalysisOverlay to use latest implementation * update ReadMe * fix typo * add description doc for MainScreen() --------- Co-authored-by: Puneet Prakash * Composable GeoViews: Viewpoint Persistence (#343) * prototype persistence enum * move viewpoint related code to separate function * ensure persistence type changes are monitored * persist camera for sceneview * initialize sceneview with default matrix * add doc * always set persisted viewpoint even when null * use when statement * mv visible area changed invocation * rename viewpoint persistence * permit nullable persisted camera on sceneview * Rename viewpoint persistence and make it sealed class with overwritten equals and hashcode. This is needed in case we want to add some property to the class later on. * simplify getting current viewpoint and setting to persisted viewpoint * normalize point on save * only normalize viewpoint if sr is pannable or geographic' git push * use mapviewdefaults for default viewpoint persistence value * use normalized geometry as point or polygon depending on viewpoint type * persist non normalized viewpoint if normalized viewpoint is null * rename value from restore in sceneview * add explanatory comments * refactor extension fun mapview.getviewpointbypersistence * Add comments * fix template app still using viewpoint operation * use expression syntax * add viewpoint persistence doc * mv parameter higher * rm cast to polygon for bounding geometry on restoration * factor out normalize function * use early return style for readability' * rename viewpointtopersist -> normalizedviewpoint * use expression syntax for hashcode and equals * convert tryNormalizeViewpoint to extension fun on Viewpoint * don't normalize viewpoints before persisting * update sdk build number --------- Co-authored-by: Puneet Prakash Co-authored-by: Gunther Heppner Co-authored-by: Shubham Sharma Co-authored-by: Changan Shi Co-authored-by: Soren Roth Co-authored-by: Soren Roth Co-authored-by: Rama Chintapalli Co-authored-by: Erick Lopez Solis * don't persist null current viewpoints (#358) * Implements setting and modifying a map/layers (#136) * changes to display a map * remove unnecessary line * add viewmodel to the micro app * Revert "add viewmodel to the micro app" This reverts commit cfc6b0b39aff5cb79d5ef191e6cdd5634415925f. * address code review feedback * remove unused imports * add overlay support (#143) * add overlay support * add doc * remove the fillmaxsize modifier * remove MapState * add viewpointChangedLambda (#159) * add viewpointChangedLambda * address code review feedback * Support LocationDisplay (#160) * add location display micro app * add location permissions * add support for location display * screen to start/stop a location display * fix typo * show error message if location display fails to start * add AppBar and auto pan mode options * fix type of key * improve doc * add readme * adjust screen shot size * adjust screen shot size * set MapView properties in the update callback * use by remember for mutable state * set error message when LDS fails to start when toggling switch * fix doc references to composable Map * Compose Map InteractionOptions (#163) * Rename - Compose MapView (#165) * Compose MapView: Geometry editor (#170) * Compose MapView: SelectionProperties (#173) * add support for WrapAroundMode (#176) * Compose MapView: ViewLabelProperties (#174) * add implementation for gesture events (#172) * add implementation for gesture events * update SDK dependency add Events exposed on GeoView * address code review comment * address code review comments * refactor mapView.viewpointChanged * Compose Map - graphics overlay (#166) * moved GraphicsOverlaysUpdater (#183) * added grid & backgroundGrid impl (#192) * Draw Status (#186) * Geometry editor micro-app (#178) * added invoke (#197) * Update MapView doc pattern (#191) * add support for attribution text (#187) * add support for attribution text * combine attribution bar properties/events in a state object * refactor mapview parameter list * update collect lambda * Update doc * update doc * Add spatialreference changed callback (#193) * invoke currentOnInteractingChanged with initial value of isInteracting * add callback to mapview * rm initial value calls * change ?.let calls to ?.invoke * move parameter above onInteractingChanged * move launch statement above onInteracitngChanged * MapView Rotation & Scale (#195) * Add inset support (#182) * add mapview inset app * add app to settings.gradle * WIP * update formatting * address code review comments * update setViewInset values * add readme * Update README.md * add doc * address code review feedback * rename mapinsets to insets * rename mapinsets * update doc * address code review comments * Add mapview proxy (#190) * create MapViewOperator class * add param to MapView composable * add locationToScreen and doc * more doc * refactor MapView composable to remove unnecessary code * move mapoperator mapview setting to own disposable effect * don't use synchronize for operations * Eof newline * make MapViewOperator derive from a new GeoViewOperator * eof newline * return null if nan from locationToScreen * add copyrights * fix doc * fix doc * rename operator to proxy * rm overlay param again * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/GeoViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapView.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Apply doc fixes from code review Co-authored-by: Puneet Prakash * mv param below geometry editor * fix doc line length * fix param doc * fix param doc --------- Co-authored-by: Gunther Heppner Co-authored-by: Puneet Prakash * update the copyright to the apache License (#203) * add support for onNavigationChanged (#199) * add support for onNavigationChanged * add doc * MapView TimeExtent (#194) * Support for setting Viewpoint on MapView (#202) * support for ViewpointOperation - initial commit * MapViewpointOperation - prototyping * implement await() on MapViewpointOperation, remove onCompleted callbacks * renaming * add execute extension for remaining operations * rename Bounding to SetBoundingGeometry * add set bookmark * add remaining operations to when statement * make execute an abstract fun on MapViewpointOperation * Add set viewpoint app * fix typo * add dependency to microapp on geocompose * add simple app to set viewpoint with different options * add progress indicator to demonstrate await pattern * extract bookmark to remembered val * make abstract fun an extension fun instead * add doc * add readme to microapp * eof newline * fix readme title * rever locationdisplayapp changes * update screenshot * update readme wording * use a simple list instead of reflection * add doc to MainScreen * add dash to project app name * naming and doc changes * mv onViewpointChanged parameter * change dfeautl animate duration to 0.25 * update microapp module namw --------- Co-authored-by: Hudson Miears * Refactor mapview insets app (#206) * update all since tags in geo-compose module (#227) * Geo-compose: add identify methods and microapp (#223) * add methods to geoviewproxy * rename identifyLayer and identifyGraphicsOverlay to identify as overloads * add prototype app * fix recursive bug * refactor app to separate subcomponents * make one source of truth for geoview in geoviewproxy * make one source of truth for geoview in geoviewproxy * mv business logic to view model class * update doc * add doc to microapp * add top bar * add readme and screenshot * adjust readme description * adjust string resources and error messages * modify identify method to be cancellable and consolidate logic * adjust bottom sheet to only expand to half screen height and move map viewpoint * rename EventDetails -> IdentifyDetails * nullGEoViewErrorMessage no longer uses a getter * rework caching of mapview in proxy to match previous implementation * change doc DIPS -> Dp * fix tolerance parameter types -> Dp * use nullable maximumResults to match swift * sanitize max results * rm yield * add doc enhancements * extract maximum results fun * clamp 0 values for maximumResults * rm throws doc * adjust insets on bottom sheet state change * rm insets behavior * fix doc references * fix doc 200.4.0 * update screenshot * rename className prop * make details height a const * Rename MapView-related microapps to have MapView prefix (#226) * Rename MapView-related microapps to have MapView prefix * Rename all other instances with mapview prefix * rename names in readmes * rename files * rename test directories * add onUnitsPerDipChanged callback lambda (#232) * Add exportImage fun to GeoViewProxy (#233) * Add exportImage fun to GeoViewProxy * update doc * update doc * add isWrapAroundEnabled property to GeoViewProxy (#231) * add isWrapAroundEnabled property to GeoViewProxy * update @since * add doc * Geo-compose: add basic SceneView function (#230) * add SceneView function * eof newline * fix doc and copyright * don't use fully qualified sceneview * added compose BOM (#237) * add ViewPointState (#234) * add ViewPointState * address code review feedback * update doc * Hud10837/layer view state (#228) * add methods to geoviewproxy * rename identifyLayer and identifyGraphicsOverlay to identify as overloads * add prototype app * fix recursive bug * refactor app to separate subcomponents * make one source of truth for geoview in geoviewproxy * make one source of truth for geoview in geoviewproxy * mv business logic to view model class * update doc * add doc to microapp * add top bar * add readme and screenshot * adjust readme description * adjust string resources and error messages * modify identify method to be cancellable and consolidate logic * adjust bottom sheet to only expand to half screen height and move map viewpoint * rename EventDetails -> IdentifyDetails * nullGEoViewErrorMessage no longer uses a getter * rework caching of mapview in proxy to match previous implementation * change doc DIPS -> Dp * fix tolerance parameter types -> Dp * use nullable maximumResults to match swift * sanitize max results * rm yield * add doc enhancements * extract maximum results fun * clamp 0 values for maximumResults * rm throws doc * adjust insets on bottom sheet state change * add layerviewstatechanged callback * add getLayerViewState * move getLayerViewState * mv param position and fix identify mainscreen * SceneView: add sceneview gesture events (#241) * add SceneView function * eof newline * fix doc and copyright * add gesture events * fix param doc" * SceneView: create SceneViewProxy (#246) * create initial SceneViewProxy class * add disposal logic to proxy class * add sceneViewProxy to SceneView * add copyright * SceneView: graphics overlays (#245) * extract graphicsoverlayupdater * eof newline * SceneView: add scene viewpoint operation (#240) * create SceneViewpointOperation * add operation to sceneview * add all operations for sceneview * add doc * eof newline * eof newline * Don't use named params on viewpoint updater * use kotlinx cancellation exception * add copyright * use duration in viewpoint operations * doc * rename durationSeconds and fix microapp * Update feature branch with v.next (#243) * add navigationchanged to sceneview (#248) * SceneView: add ViewLabelProperties (#249) * add viewlabelproperties to sceneview' * fix doc --------- Co-authored-by: Gunther Heppner * SceneView: attribution (#247) * mv AttributionStateHandler function to AttributionState.kt * add attributionState param to SceneView * add @since tag --------- Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt (#253) Co-authored-by: Gunther Heppner * shared the ViewpointChangedState with SceneView (#261) * SceneView TimeExtent (#260) * shared the ViewpointChangedState with SceneView * review update * merge with the feature branch * SceneView spatial reference changed (#258) * add spatial ref changed support * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * shared the ViewpointChangedState with SceneView --------- Co-authored-by: Puneet Prakash * shared the ViewpointChangedState with SceneView (#257) * add layerViewStateChanged to SceneView (#262) * The view property needs to be assigned in ViewProxy class (#264) * add cameraController oaram to sceneview (#265) * add onDrawStatusChanged to SceneView (#266) * add FieldOfView (#270) * SceneView: add sunLighting and sunTime (#275) * add sunLighting and sunTime * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * SceneView current viewpoint camera (#256) * add getCurrentViewpointCamera in proxy * expose the currentViewpoint property * impls current view camera * adds a space for lambda * merged with feature branch. * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * add atmosphereEffect (#278) * Add funs for screen coordinate conversion (#272) * Add funs for screen coordinate conversion * update doc * update doc for SceneView Suntime and SunLighting (#282) * SceneView: AnalysisOverlayCollection (#269) * create AnalysisOverlayCollection * mv factory for graphics overlay collection * add analysis to scene view * eof newlines * add doc * Fix doc that mentions graphics overlays Co-authored-by: Puneet Prakash * mv factory function to SceneView file * address doc comments * mv updater to SceneView file * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * Add space effects on the scene view (#281) * add space effects on scene view * update the comment * SceneView: ambient light color (#279) * add sceneview ambientLightColor param * fix doc * rm full stop * SceneView: add manual rendering funs to SceneViewProxy (#280) * add manual rendering funs to SceneViewProxy * Fix doc * fix doc * SceneView: ImageOverlays (#274) * add ImageOverlayCollection and property * mv factory function to SceneView file * fix doc comments * mv updater to sceneview.kt * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * use data object for Cleared event * use data object for cleared even tin AnalysisOverlayCollection * use data object for cleared event in GraphicsOverlayCollection --------- Co-authored-by: Puneet Prakash * SceneView: lighting options microapp (#286) * add sceneview ambientLightColor param * add space effects on scene view * update the comment * fix doc * create lighting options microapp base * set up dropdown menu * add sun time options * add lighting mode options * add Ambient light color options * add atmosphere effect options * add space effect options * change viewpoint and fix sun time picker * clean up code * use sliders instead of textfields for rgb colors * add doc * add readme and screenshot * eof newline * add doc to components * add missing imports * Add doc DropdownMenuAlertDialog * add missing copyright headers * add doc RgbaSlider * add remaining doc * Update microapps/SceneViewLightingOptionsApp/README.md Co-authored-by: Gunther Heppner --------- Co-authored-by: Changan Shi Co-authored-by: Gunther Heppner * bumping sdk to 4122 (#300) Co-authored-by: Soren Roth * add maven publishing to geo-compose (#301) Co-authored-by: Soren Roth * Scene view camera controller app (#288) * init implementation for camera controller * add gitignore * adds comments and remove view model. * update the doc and png image * update the comment * add the extra space line * update the screenshot * review update * update the 2023 comment * update the comment * review update * v next merge to geo compose (#303) * change name of Licesne file in preparation for migration to Esri * revert change to license file name * remove extra license file * Update README.md images (#102) * holder commit * Update README.md update link * upload screenshot image * add images to the micro app * Update README.md * Update README.md * use updated name of the auth dependency in README * Create t9nmanifest.txt (#167) * removed module and microapp (#208) * Update gradle.properties (#211) * Update build.gradle.kts (#212) * updates client id and redirect Uri (#216) * Take out build numbers for publishing (#219) * update dependency section of readme for 200.3.0 (#220) * Improve WebView Display (#213) * Update gradle.properties (#238) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * add kdoc project! --------- Co-authored-by: Soren Roth Co-authored-by: Puneet Prakash Co-authored-by: Rama Chintapalli Co-authored-by: Shubham Sharma Co-authored-by: Erick Lopez Solis Co-authored-by: Gunther Heppner Co-authored-by: hud10837 * Micro app - sceneview viewpoint navigation (#291) * add micro app * update doc * add readme, screenshot. Remove use of spinner * update readme * update doc * update readme * update screenshot * update image, add new location remove unused imports * Geo-Compose: Add module README (#294) * add readme and screenshot to geo-compose module * use table for screenshot * reduce screenshot size * reduce screenshot size * reduce screenshot size * increase screenshot size * reduce screenshot size * Deprecate composable-map (#293) * changes for authentication and compass app * update floorfilter micro app * deprecate composable map * update deprecated annotation * add deprecation annotation to public components * update template-app to use geo-compose module * remove unused import reformat code * Add missing doc to geo-compose classes (#307) * added attribution bar changes (#309) * Geo-compose: Remove ViewpointChangedEvent (#310) * modify mapview with new params * modify sceneview with new params * delete viewpointchangedstate * Geo-compose: Remove ViewpointOperations (#316) * rm MapViewpointOperation * rm SceneViewpointOperation * add mapviewproxy methods * add sceneviewproxy methods * update mapview set viewpoint app * refactor sceneview setviewpointapp * refactor mapview setviewpointapp to match structure of sceneview app * update readmes * rm progress indicator from sceneview app * address pr comments * address pr comments * Compose doc improvements (#315) * Add @Stable annotation #319 * Update SceneViewCameraController app to use SceneViewProxy (#325) * Update SceneViewCameraController app to use SceneViewProxy setViewPointCameraAnimated function * update floorFilterApp * Merge v.next into feature-branches/geo-compose (#327) * change name of Licesne file in preparation for migration to Esri * revert change to license file name * remove extra license file * Update README.md images (#102) * holder commit * Update README.md update link * upload screenshot image * add images to the micro app * Update README.md * Update README.md * use updated name of the auth dependency in README * Create t9nmanifest.txt (#167) * removed module and microapp (#208) * Update gradle.properties (#211) * Update build.gradle.kts (#212) * updates client id and redirect Uri (#216) * Take out build numbers for publishing (#219) * update dependency section of readme for 200.3.0 (#220) * Improve WebView Display (#213) * Update gradle.properties (#238) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * Add version to API ref (#314) --------- Co-authored-by: Soren Roth Co-authored-by: Soren Roth Co-authored-by: Rama Chintapalli Co-authored-by: Shubham Sharma Co-authored-by: Erick Lopez Solis Co-authored-by: Gunther Heppner Co-authored-by: hud10837 * Revisit GraphicsOverlayCollection, AnalysisOverlayCollection and ImageOverlayCollection (#320) * Remove GraphicsOverlaysCollection and its usage Add parameter to MapView to take graphicsOverlays as List * update mapView and SceneView to use arrays for image overlays and analysis overlays update micro app * update geometry editor micro app * remove all graphics overlays, rather than just clear graphics * Update param type to List * remove comma * update doc * update micro app * remember emptylist() * use it instead of mapView * use it instead of sceneView * use it instead of sceneView * use it instead of sceneView --------- Co-authored-by: Gunther Heppner * modify compass microapp to use mapViewProxy for viewpoints (#337) * Composable MapView/SceneView: remember default parameters (#330) * add remember to default parameters in mapview * add remember to default parameters in sceneview * add circular progress indicator to sceneview setviewpoint microapp * fix lighting options app * use defaults for sceneview * add mapviewdefaults * add doc * Update map and scene parameters to be non-nullable (#331) * SceneView: analysis overlay microapp (#306) * add readme and screenshot to geo-compose module * create microapp module * add prototype version * clean up implementation * add readme * update screenshot * revert screenshot for GeoCompose * update GraphicOverlays and AnalysisOverlay to use latest implementation * update ReadMe * fix typo * add description doc for MainScreen() --------- Co-authored-by: Puneet Prakash * Composable GeoViews: Viewpoint Persistence (#343) * prototype persistence enum * move viewpoint related code to separate function * ensure persistence type changes are monitored * persist camera for sceneview * initialize sceneview with default matrix * add doc * always set persisted viewpoint even when null * use when statement * mv visible area changed invocation * rename viewpoint persistence * permit nullable persisted camera on sceneview * Rename viewpoint persistence and make it sealed class with overwritten equals and hashcode. This is needed in case we want to add some property to the class later on. * simplify getting current viewpoint and setting to persisted viewpoint * normalize point on save * only normalize viewpoint if sr is pannable or geographic' git push * use mapviewdefaults for default viewpoint persistence value * use normalized geometry as point or polygon depending on viewpoint type * persist non normalized viewpoint if normalized viewpoint is null * rename value from restore in sceneview * add explanatory comments * refactor extension fun mapview.getviewpointbypersistence * Add comments * fix template app still using viewpoint operation * use expression syntax * add viewpoint persistence doc * mv parameter higher * rm cast to polygon for bounding geometry on restoration * factor out normalize function * use early return style for readability' * rename viewpointtopersist -> normalizedviewpoint * use expression syntax for hashcode and equals * convert tryNormalizeViewpoint to extension fun on Viewpoint * don't persist null current viewpoints --------- Co-authored-by: Puneet Prakash Co-authored-by: Gunther Heppner Co-authored-by: Shubham Sharma Co-authored-by: Changan Shi Co-authored-by: Soren Roth Co-authored-by: Soren Roth Co-authored-by: Rama Chintapalli Co-authored-by: Erick Lopez Solis * merge (#359) * provide public webmap which has forms (#364) Co-authored-by: Soren Roth * rename geo-compose -> geoview-compose (#361) * rename geo-compose -> geoview-compose * update doc * update reference in micro app READMEs * update logger warning, update package name * update namespace in build.gradle * Add parcelable to viewpoint persistence (#356) * Implements setting and modifying a map/layers (#136) * changes to display a map * remove unnecessary line * add viewmodel to the micro app * Revert "add viewmodel to the micro app" This reverts commit cfc6b0b39aff5cb79d5ef191e6cdd5634415925f. * address code review feedback * remove unused imports * add overlay support (#143) * add overlay support * add doc * remove the fillmaxsize modifier * remove MapState * add viewpointChangedLambda (#159) * add viewpointChangedLambda * address code review feedback * Support LocationDisplay (#160) * add location display micro app * add location permissions * add support for location display * screen to start/stop a location display * fix typo * show error message if location display fails to start * add AppBar and auto pan mode options * fix type of key * improve doc * add readme * adjust screen shot size * adjust screen shot size * set MapView properties in the update callback * use by remember for mutable state * set error message when LDS fails to start when toggling switch * fix doc references to composable Map * Compose Map InteractionOptions (#163) * Rename - Compose MapView (#165) * Compose MapView: Geometry editor (#170) * Compose MapView: SelectionProperties (#173) * add support for WrapAroundMode (#176) * Compose MapView: ViewLabelProperties (#174) * add implementation for gesture events (#172) * add implementation for gesture events * update SDK dependency add Events exposed on GeoView * address code review comment * address code review comments * refactor mapView.viewpointChanged * Compose Map - graphics overlay (#166) * moved GraphicsOverlaysUpdater (#183) * added grid & backgroundGrid impl (#192) * Draw Status (#186) * Geometry editor micro-app (#178) * added invoke (#197) * Update MapView doc pattern (#191) * add support for attribution text (#187) * add support for attribution text * combine attribution bar properties/events in a state object * refactor mapview parameter list * update collect lambda * Update doc * update doc * Add spatialreference changed callback (#193) * invoke currentOnInteractingChanged with initial value of isInteracting * add callback to mapview * rm initial value calls * change ?.let calls to ?.invoke * move parameter above onInteractingChanged * move launch statement above onInteracitngChanged * MapView Rotation & Scale (#195) * Add inset support (#182) * add mapview inset app * add app to settings.gradle * WIP * update formatting * address code review comments * update setViewInset values * add readme * Update README.md * add doc * address code review feedback * rename mapinsets to insets * rename mapinsets * update doc * address code review comments * Add mapview proxy (#190) * create MapViewOperator class * add param to MapView composable * add locationToScreen and doc * more doc * refactor MapView composable to remove unnecessary code * move mapoperator mapview setting to own disposable effect * don't use synchronize for operations * Eof newline * make MapViewOperator derive from a new GeoViewOperator * eof newline * return null if nan from locationToScreen * add copyrights * fix doc * fix doc * rename operator to proxy * rm overlay param again * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/GeoViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapView.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/MapViewProxy.kt Co-authored-by: Gunther Heppner * Apply doc fixes from code review Co-authored-by: Puneet Prakash * mv param below geometry editor * fix doc line length * fix param doc * fix param doc --------- Co-authored-by: Gunther Heppner Co-authored-by: Puneet Prakash * update the copyright to the apache License (#203) * add support for onNavigationChanged (#199) * add support for onNavigationChanged * add doc * MapView TimeExtent (#194) * Support for setting Viewpoint on MapView (#202) * support for ViewpointOperation - initial commit * MapViewpointOperation - prototyping * implement await() on MapViewpointOperation, remove onCompleted callbacks * renaming * add execute extension for remaining operations * rename Bounding to SetBoundingGeometry * add set bookmark * add remaining operations to when statement * make execute an abstract fun on MapViewpointOperation * Add set viewpoint app * fix typo * add dependency to microapp on geocompose * add simple app to set viewpoint with different options * add progress indicator to demonstrate await pattern * extract bookmark to remembered val * make abstract fun an extension fun instead * add doc * add readme to microapp * eof newline * fix readme title * rever locationdisplayapp changes * update screenshot * update readme wording * use a simple list instead of reflection * add doc to MainScreen * add dash to project app name * naming and doc changes * mv onViewpointChanged parameter * change dfeautl animate duration to 0.25 * update microapp module namw --------- Co-authored-by: Hudson Miears * Refactor mapview insets app (#206) * update all since tags in geo-compose module (#227) * Geo-compose: add identify methods and microapp (#223) * add methods to geoviewproxy * rename identifyLayer and identifyGraphicsOverlay to identify as overloads * add prototype app * fix recursive bug * refactor app to separate subcomponents * make one source of truth for geoview in geoviewproxy * make one source of truth for geoview in geoviewproxy * mv business logic to view model class * update doc * add doc to microapp * add top bar * add readme and screenshot * adjust readme description * adjust string resources and error messages * modify identify method to be cancellable and consolidate logic * adjust bottom sheet to only expand to half screen height and move map viewpoint * rename EventDetails -> IdentifyDetails * nullGEoViewErrorMessage no longer uses a getter * rework caching of mapview in proxy to match previous implementation * change doc DIPS -> Dp * fix tolerance parameter types -> Dp * use nullable maximumResults to match swift * sanitize max results * rm yield * add doc enhancements * extract maximum results fun * clamp 0 values for maximumResults * rm throws doc * adjust insets on bottom sheet state change * rm insets behavior * fix doc references * fix doc 200.4.0 * update screenshot * rename className prop * make details height a const * Rename MapView-related microapps to have MapView prefix (#226) * Rename MapView-related microapps to have MapView prefix * Rename all other instances with mapview prefix * rename names in readmes * rename files * rename test directories * add onUnitsPerDipChanged callback lambda (#232) * Add exportImage fun to GeoViewProxy (#233) * Add exportImage fun to GeoViewProxy * update doc * update doc * add isWrapAroundEnabled property to GeoViewProxy (#231) * add isWrapAroundEnabled property to GeoViewProxy * update @since * add doc * Geo-compose: add basic SceneView function (#230) * add SceneView function * eof newline * fix doc and copyright * don't use fully qualified sceneview * added compose BOM (#237) * add ViewPointState (#234) * add ViewPointState * address code review feedback * update doc * Hud10837/layer view state (#228) * add methods to geoviewproxy * rename identifyLayer and identifyGraphicsOverlay to identify as overloads * add prototype app * fix recursive bug * refactor app to separate subcomponents * make one source of truth for geoview in geoviewproxy * make one source of truth for geoview in geoviewproxy * mv business logic to view model class * update doc * add doc to microapp * add top bar * add readme and screenshot * adjust readme description * adjust string resources and error messages * modify identify method to be cancellable and consolidate logic * adjust bottom sheet to only expand to half screen height and move map viewpoint * rename EventDetails -> IdentifyDetails * nullGEoViewErrorMessage no longer uses a getter * rework caching of mapview in proxy to match previous implementation * change doc DIPS -> Dp * fix tolerance parameter types -> Dp * use nullable maximumResults to match swift * sanitize max results * rm yield * add doc enhancements * extract maximum results fun * clamp 0 values for maximumResults * rm throws doc * adjust insets on bottom sheet state change * add layerviewstatechanged callback * add getLayerViewState * move getLayerViewState * mv param position and fix identify mainscreen * SceneView: add sceneview gesture events (#241) * add SceneView function * eof newline * fix doc and copyright * add gesture events * fix param doc" * SceneView: create SceneViewProxy (#246) * create initial SceneViewProxy class * add disposal logic to proxy class * add sceneViewProxy to SceneView * add copyright * SceneView: graphics overlays (#245) * extract graphicsoverlayupdater * eof newline * SceneView: add scene viewpoint operation (#240) * create SceneViewpointOperation * add operation to sceneview * add all operations for sceneview * add doc * eof newline * eof newline * Don't use named params on viewpoint updater * use kotlinx cancellation exception * add copyright * use duration in viewpoint operations * doc * rename durationSeconds and fix microapp * Update feature branch with v.next (#243) * add navigationchanged to sceneview (#248) * SceneView: add ViewLabelProperties (#249) * add viewlabelproperties to sceneview' * fix doc --------- Co-authored-by: Gunther Heppner * SceneView: attribution (#247) * mv AttributionStateHandler function to AttributionState.kt * add attributionState param to SceneView * add @since tag --------- Co-authored-by: Gunther Heppner * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt (#253) Co-authored-by: Gunther Heppner * shared the ViewpointChangedState with SceneView (#261) * SceneView TimeExtent (#260) * shared the ViewpointChangedState with SceneView * review update * merge with the feature branch * SceneView spatial reference changed (#258) * add spatial ref changed support * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * shared the ViewpointChangedState with SceneView --------- Co-authored-by: Puneet Prakash * shared the ViewpointChangedState with SceneView (#257) * add layerViewStateChanged to SceneView (#262) * The view property needs to be assigned in ViewProxy class (#264) * add cameraController oaram to sceneview (#265) * add onDrawStatusChanged to SceneView (#266) * add FieldOfView (#270) * SceneView: add sunLighting and sunTime (#275) * add sunLighting and sunTime * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * SceneView current viewpoint camera (#256) * add getCurrentViewpointCamera in proxy * expose the currentViewpoint property * impls current view camera * adds a space for lambda * merged with feature branch. * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * add atmosphereEffect (#278) * Add funs for screen coordinate conversion (#272) * Add funs for screen coordinate conversion * update doc * update doc for SceneView Suntime and SunLighting (#282) * SceneView: AnalysisOverlayCollection (#269) * create AnalysisOverlayCollection * mv factory for graphics overlay collection * add analysis to scene view * eof newlines * add doc * Fix doc that mentions graphics overlays Co-authored-by: Puneet Prakash * mv factory function to SceneView file * address doc comments * mv updater to SceneView file * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash --------- Co-authored-by: Puneet Prakash * Add space effects on the scene view (#281) * add space effects on scene view * update the comment * SceneView: ambient light color (#279) * add sceneview ambientLightColor param * fix doc * rm full stop * SceneView: add manual rendering funs to SceneViewProxy (#280) * add manual rendering funs to SceneViewProxy * Fix doc * fix doc * SceneView: ImageOverlays (#274) * add ImageOverlayCollection and property * mv factory function to SceneView file * fix doc comments * mv updater to sceneview.kt * Update toolkit/geo-compose/src/main/java/com/arcgismaps/toolkit/geocompose/SceneView.kt Co-authored-by: Puneet Prakash * use data object for Cleared event * use data object for cleared even tin AnalysisOverlayCollection * use data object for cleared event in GraphicsOverlayCollection --------- Co-authored-by: Puneet Prakash * SceneView: lighting options microapp (#286) * add sceneview ambientLightColor param * add space effects on scene view * update the comment * fix doc * create lighting options microapp base * set up dropdown menu * add sun time options * add lighting mode options * add Ambient light color options * add atmosphere effect options * add space effect options * change viewpoint and fix sun time picker * clean up code * use sliders instead of textfields for rgb colors * add doc * add readme and screenshot * eof newline * add doc to components * add missing imports * Add doc DropdownMenuAlertDialog * add missing copyright headers * add doc RgbaSlider * add remaining doc * Update microapps/SceneViewLightingOptionsApp/README.md Co-authored-by: Gunther Heppner --------- Co-authored-by: Changan Shi Co-authored-by: Gunther Heppner * bumping sdk to 4122 (#300) Co-authored-by: Soren Roth * add maven publishing to geo-compose (#301) Co-authored-by: Soren Roth * Scene view camera controller app (#288) * init implementation for camera controller * add gitignore * adds comments and remove view model. * update the doc and png image * update the comment * add the extra space line * update the screenshot * review update * update the 2023 comment * update the comment * review update * v next merge to geo compose (#303) * change name of Licesne file in preparation for migration to Esri * revert change to license file name * remove extra license file * Update README.md images (#102) * holder commit * Update README.md update link * upload screenshot image * add images to the micro app * Update README.md * Update README.md * use updated name of the auth dependency in README * Create t9nmanifest.txt (#167) * removed module and microapp (#208) * Update gradle.properties (#211) * Update build.gradle.kts (#212) * updates client id and redirect Uri (#216) * Take out build numbers for publishing (#219) * update dependency section of readme for 200.3.0 (#220) * Improve WebView Display (#213) * Update gradle.properties (#238) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * add kdoc project! --------- Co-authored-by: Soren Roth Co-authored-by: Puneet Prakash Co-authored-by: Rama Chintapalli Co-authored-by: Shubham Sharma Co-authored-by: Erick Lopez Solis Co-authored-by: Gunther Heppner Co-authored-by: hud10837 * Micro app - sceneview viewpoint navigation (#291) * add micro app * update doc * add readme, screenshot. Remove use of spinner * update readme * update doc * update readme * update screenshot * update image, add new location remove unused imports * Geo-Compose: Add module README (#294) * add readme and screenshot to geo-compose module * use table for screenshot * reduce screenshot size * reduce screenshot size * reduce screenshot size * increase screenshot size * reduce screenshot size * Deprecate composable-map (#293) * changes for authentication and compass app * update floorfilter micro app * deprecate composable map * update deprecated annotation * add deprecation annotation to public components * update template-app to use geo-compose module * remove unused import reformat code * Add missing doc to geo-compose classes (#307) * added attribution bar changes (#309) * Geo-compose: Remove ViewpointChangedEvent (#310) * modify mapview with new params * modify sceneview with new params * delete viewpointchangedstate * Geo-compose: Remove ViewpointOperations (#316) * rm MapViewpointOperation * rm SceneViewpointOperation * add mapviewproxy methods * add sceneviewproxy methods * update mapview set viewpoint app * refactor sceneview setviewpointapp * refactor mapview setviewpointapp to match structure of sceneview app * update readmes * rm progress indicator from sceneview app * address pr comments * address pr comments * Compose doc improvements (#315) * Add @Stable annotation #319 * Update SceneViewCameraController app to use SceneViewProxy (#325) * Update SceneViewCameraController app to use SceneViewProxy setViewPointCameraAnimated function * update floorFilterApp * Merge v.next into feature-branches/geo-compose (#327) * change name of Licesne file in preparation for migration to Esri * revert change to license file name * remove extra license file * Update README.md images (#102) * holder commit * Update README.md update link * upload screenshot image * add images to the micro app * Update README.md * Update README.md * use updated name of the auth dependency in README * Create t9nmanifest.txt (#167) * removed module and microapp (#208) * Update gradle.properties (#211) * Update build.gradle.kts (#212) * updates client id and redirect Uri (#216) * Take out build numbers for publishing (#219) * update dependency section of readme for 200.3.0 (#220) * Improve WebView Display (#213) * Update gradle.properties (#238) * Update dependency versions (#235) * kdoc project to doc the released toolkit components. (#284) * kdoc project to doc the released toolkit components. * add dependencies on the dependencies of the released projects. * Update kdoc/build.gradle.kts Co-authored-by: Erick Lopez Solis --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * Add version to API ref (#314) --------- Co-authored-by: Soren Roth Co-authored-by: Soren Roth Co-authored-by: Rama Chintapalli Co-authored-by: Shubham Sharma Co-authored-by: Erick Lopez Solis Co-authored-by: Gunther Heppner Co-authored-by: hud10837 * Revisit GraphicsOverlayCollection, AnalysisOverlayCollection and ImageOverlayCollection (#320) * Remove GraphicsOverlaysCollection and its usage Add parameter to MapView to take graphicsOverlays as List * update mapView and SceneView to use arrays for image overlays and analysis overlays update micro app * update geometry editor micro app * remove all graphics overlays, rather than just clear graphics * Update param type to List * remove comma * update doc * update micro app * remember emptylist() * use it instead of mapView * use it instead of sceneView * use it instead of sceneView * use it instead of sceneView --------- Co-authored-by: Gunther Heppner * modify compass microapp to use mapViewProxy for viewpoints (#337) * Composable MapView/SceneView: remember default parameters (#330) * add remember to default parameters in mapview * add remember to default parameters in sceneview * add circular progress indicator to sceneview setviewpoint microapp * fix lighting options app * use defaults for sceneview * add mapviewdefaults * add doc * Update map and scene parameters to be non-nullable (#331) * SceneView: analysis overlay microapp (#306) * add readme and screenshot to geo-compose module * create microapp module * add prototype version * clean up implementation * add readme * update screenshot * revert screenshot for GeoCompose * update GraphicOverlays and AnalysisOverlay to use latest implementation * update ReadMe * fix typo * add description doc for MainScreen() --------- Co-authored-by: Puneet Prakash * Composable GeoViews: Viewpoint Persistence (#343) * prototype persistence enum * move viewpoint related code to separate function * ensure persistence type changes are monitored * persist camera for sceneview * initialize sceneview with default matrix * add doc * always set persisted viewpoint even when null * use when statement * mv visible area changed invocation * rename viewpoint persistence * permit nullable persisted camera on sceneview * Rename viewpoint persistence and make it sealed class with overwritten equals and hashcode. This is needed in case we want to add some property to the class later on. * simplify getting current viewpoint and setting to persisted viewpoint * normalize point on save * only normalize viewpoint if sr is pannable or geographic' git push * use mapviewdefaults for default viewpoint persistence value * use normalized geometry as point or polygon depending on viewpoint type * persist non normalized viewpoint if normalized viewpoint is null * rename value from restore in sceneview * add explanatory comments * refactor extension fun mapview.getviewpointbypersistence * Add comments * fix template app still using viewpoint operation * use expression syntax * add viewpoint persistence doc * mv parameter higher * rm cast to polygon for bounding geometry on restoration * factor out normalize function * use early return style for readability' * rename viewpointtopersist -> normalizedviewpoint * use expression syntax for hashcode and equals * convert tryNormalizeViewpoint to extension fun on Viewpoint * add parcelable to ViewpointPersistence * use companion object * group parcelable implementation * add unit test * simplify tests * update doc on viewpoint persistence * make contract for parcelables nullable --------- Co-authored-by: Puneet Prakash Co-authored-by: Gunther Heppner Co-authored-by: Shubham Sharma Co-authored-by: Changan Shi Co-authored-by: Soren Roth Co-authored-by: Soren Roth Co-authored-by: Rama Chintapalli Co-authored-by: Erick Lopez Solis * Move ViewpointPersistenceTests from geo-compose to geoview-compose (#372) * Move ViewpointPersistenceTests from geo-compose to geoview-compose * correct package name and path * Update Readmes for geoview-compose (#370) * Add note about maven repo * update developer setup * update design patterns * update release process * add all modules to main readme * fix unnecessary line in indoors readme * update geoview-compose readme * add api ref links to readmes * fix api ref links * rm unnecessary dash * use relative link to geoview compose in composable map readme * update compass and indoors readmes * update geoview compose readme to include link to analysis overlay app" git status " * use double quotes * merge L10n staging to v.next (#365) * feat(localization): update pseudo translation (#205) * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 (#285) * feat(localization): update pseudo translation (#312) * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * feat(localization): update pseudo translation (#318) * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * feat(localization): update translation (#349) * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 (#374) --------- Co-authored-by: Jonathan Turpin * Format screenshots (#373) * Makes UsernamePassword and ServerTrust prompt scrollable so that the content is displayed correctly (#375) * move rememberLauncherForActivityResult outside of conditional (#379) * Fixes configuration change bug when MainActivity is set up to intercept the redirect URI (#383) * specifies key for rememberSavable * update comment * `Forms`: merge latest FeatureForms to v.next (#380) * provide public webmap which has forms * `Forms`: Updated radio button tests (#366) * updated radio button tests * added test doc link * FeatureForm composable KDoc edit (#368) * slight edits to FeatureForm composable function KDoc. * Update toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/FeatureForm.kt Co-authored-by: Gunther Heppner --------- Co-authored-by: Soren Roth Co-authored-by: Gunther Heppner * add groups to final error validation reporting in the app (#367) Co-authored-by: Soren Roth * `Forms` : Optimize FeatureForm (#369) * agree with exception name change (#377) * update exception name for API change * update exception name for API change * pull in the build of the SDK with the name change of IncorrectValueTypeException --------- Co-authored-by: Soren Roth * use geo-compose in FeatureFormsApp (#378) * use geo-compose in FeatureFormsApp. * remove DI providing MapViewProxy. add AndroidViewModel usage --------- Co-authored-by: Soren Roth * `Forms`: do not pass a selected date into date picker if it is out of range. (#376) * do not pass a selected date into date picker if it is out of range. * just expand the year range to incloude out of range field value's date * add an initialError property to the DateTimePickerState, weave it through to the PickerHeader. * use includeTime and adjust spacing. --------- Co-authored-by: Soren Roth * remove gif. add screenshots (#381) Co-authored-by: Soren Roth * `Forms`: fix title padding (#382) * swap out public webmap for a managed public webmap (#384) Co-authored-by: Soren Roth * `Forms` : Update validation behavior for text fields (#385) * fix for breaking API change in dependency (#386) Co-authored-by: Soren Roth --------- Co-authored-by: Soren Roth Co-authored-by: Kaushik Meesala Co-authored-by: Gunther Heppner * Fix layout issues (#387) * Change button size, orientation, and text label padding to fit content of size upto 24 characters * add padding only to the Start to allow for more text to fit in reduce font size to fit large localized text for Select a facility and Site on Facility selector * update character limit * update requirement for text that has stricter bounds * update doc on a string resource * update doc * Prepare toolkit release candidate for one-off build (#390) * fix since typo (#391) * Remove clearMapFilter logic to match javascript api (#396) * update gradle properties for 200.5.0 development (#400) * 200.4.0 post release version updates (#397) * upgrade 3rd party dependencies upgrade Gradle plugin version, upgrade Gradle * update sdk version update 3rd party dependencies * update gradle wrapper * update ksp version * Fixes BackHandler Bug (#389) * Separate creation of component and microapps (#395) * prompt for name * separate new microapp into own script * eof newline * fix plugins block * rm dependency from template app * fix reference to script in readme * update readme * add components and microapps to settings automatically * update help dialogs * update copyright year * update settings.gradle * add back projects omitted in settings.gradle.kts (#403) Co-authored-by: Soren Roth * Changes to abstract strings used for accessibility (#394) * changes to abstract strings used for accessibility * add string resource for not available * update tests * update string * update Site name string * `sprint x`: fix warnings (#412) * pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose) * Address warnings from version upgrades. pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose). * add initialization support to the Popup composable. * workaround for known issue in gradle task graph progress. opt in for experimental coroutine API --------- Co-authored-by: Soren Roth * Update Authenticator.kt (#415) * MicroApp Theming (#405) * `Forms` : Merge Feature branches/forms into v.next (#414) * Automate authenticator test case 4 (#410) * add first test * Add doc * add 4.2 cancel server trust challenge * abstract out common code * add failing 4.4 test tap outside dialog * use state restoration tester * use createandroidcomposerule * rm 4.4 test * rm unneeded gradle secrets plugin * add doc * mv challenge definition to helper fun * refactor util fun * rm test case numbers from fun names * rm unneeded declaration of coroutineContext * make authenticatorState local * update doc * use with scope fun * rm example tests * Configure aggregated local tests (#427) * apply and configure gmazzo test aggregation plugin for local tests * remove redundant empty line * add section about running tests * improve doc Co-authored-by: hud10837 * rename getModules -> getModulesExcept * improve doc Co-authored-by: TADraeseke --------- Co-authored-by: hud10837 Co-authored-by: TADraeseke * Configure connected tests to be output to a centralized location (#433) * for each module, set the output location of test reports for connected tests * update command to run aggregated local tests * add info on running connected tests * specify correct command to run connected tests * git ignore connectedTestReports folder * fix failing test * configure connected test report location from project property * Automate authenticator oauth tests (#432) * backup * use advanceUntilIdle * implement basic oauth sign in test * add remaining test cases * update authenticatorState.handleArcGISAuthenticationChallenge to respond correctly to cancellation errors * use RestorationStateTester * use device rotation instead of staterestorationtester * create test case 2 file * Add remaining OAuthUserLauncherTests * extract util funs to file * use samples redirect url * add more doc * update gradle * fix unexpected changes * update redirect urls and client ids * signout after * assert is OAuth credential * mv authenticatorState to local val * don't declare permission in manifest * revert changes to AuthenticatorState and use Result type for tests * perform successful signin with faked token response on Default Configuration tests * use interceptor strategy on user launcher tests * use 200.5.0 * rename funs and fix doc * add explanatory comment * mv token interceptor configuration to individual tests * fix formatting in various places * rename util funs * fix doc * rm unused util funs * Authenticator: automate username password tests (#448) * backup * use advanceUntilIdle * implement basic oauth sign in test * add remaining test cases * update authenticatorState.handleArcGISAuthenticationChallenge to respond correctly to cancellation errors * use RestorationStateTester * use device rotation instead of staterestorationtester * create test case 2 file * Add remaining OAuthUserLauncherTests * extract util funs to file * use samples redirect url * add more doc * update gradle * fix unexpected changes * implement cancel test case * implement remaining tests * eof newline * update redirect urls and client ids * signout after * assert is OAuth credential * mv authenticatorState to local val * don't declare permission in manifest * revert changes to AuthenticatorState and use Result type for tests * perform successful signin with faked token response on Default Configuration tests * use interceptor strategy on user launcher tests * use 200.5.0 * rename funs and fix doc * add explanatory comment * mv token interceptor configuration to individual tests * fix formatting in various places * rename util funs * create fake server responses for username/password authentication * create test for arcgis token authentication * add doc * `Forms` : Fix FormStateCollection get operator (#457) * add PR template (#458) * Feature branches/forms (#474) * translations (#496) * add featureform resources for l10n * feat(localization): update pseudo translation (#467) * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update translation - @mit10976 @isa13169 @nia13404 (#477) * Update translation - @mit10976 @isa13169 @nia13404 (#495) * remove garbage files from new translation pass. --------- Co-authored-by: Rama Chintapalli Co-authored-by: Jonathan Turpin Co-authored-by: Soren Roth * Merge feature-branches/callout to v.next (#491) * `Forms`: Merge feature-branches/forms into v.next (#501) * Citra update instructions (#493) * merge Popup feature branch into v.next (#502) * `Popup`: component and app (#406) * add Popup component and microapp * add bottom sheet and api file. * add READMEs * address review feedback * change name in android manifest that were changed in previous commit * Update microapps/PopupApp/README.md Co-authored-by: Erick Lopez Solis * Update toolkit/popup/README.md Co-authored-by: Erick Lopez Solis * add initialization support to the Popup composable. --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * `Popup`: Adds TextPopupElement Composable (#413) * `Popup`: state collection (#420) * pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose) * Address warnings from version upgrades. pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose). * preliminary setup of state collection. * add initialization support to the Popup composable. * workaround for known issue in gradle task graph progress. opt in for experimental coroutine API * view model added to the Popup App. * move files around. make state objects Parcelable. * ensure states are not created until expressions are evaluated. * Update toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/Popup.kt Co-authored-by: Erick Lopez Solis * remove Parcelable super class from base state class * remove comment --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * update expandable card (#426) * pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose) * Address warnings from version upgrades. pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose). * preliminary setup of state collection. * add initialization support to the Popup composable. * workaround for known issue in gradle task graph progress. opt in for experimental coroutine API * view model added to the Popup App. * move files around. make state objects Parcelable. * ensure states are not created until expressions are evaluated. * Update toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/Popup.kt Co-authored-by: Erick Lopez Solis * remove Parcelable super class from base state class * make expandable card more like field maps. * add defaults * address PR feedback * fix formatting * default to expandable card expanded --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * `Popup` attachment element (#430) * pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose) * Address warnings from version upgrades. pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose). * preliminary setup of state collection. * add initialization support to the Popup composable. * workaround for known issue in gradle task graph progress. opt in for experimental coroutine API * view model added to the Popup App. * move files around. make state objects Parcelable. * ensure states are not created until expressions are evaluated. * attachment initial support * Revert "attachment initial support" This reverts commit c888b6b4acb2da93d49658f3ce98c5229e24caf4. * attachment initial support * Atachments hooked up to state collection and rendering in the Popup. * remove file from other branch * Update toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/Popup.kt Co-authored-by: Erick Lopez Solis * remove Parcelable super class from base state class * make expandable card more like field maps. * add defaults * address PR feedback * fix formatting * default to expandable card expanded * merge in expandable card refactors * support document and other content types. * add all shapes sizes and color to theme defaults object * remove newlines * remove element count, add toggleable parameter to expandable card --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * `Popup:` Adds FieldsPopupElement composable (#428) * Adds ViewableFile implementation (#445) * popup media element and media image thumbnail support (#449) * Media element images wip * Media element with support for images * use colors from defaults * fix capitalization --------- Co-authored-by: Soren Roth * `Popup`: chart images (#452) * Media element images wip * Media element with support for images * chart image support, dark mode support for media. * update SDK dependency for Popups * tweak padding of charts vs images --------- Co-authored-by: Soren Roth * `Popup:` Fixes TextPopupElement composable shifting in size when coming back into visibility (#461) * `Popup:` Adds a file viewer for image attachments (#455) * `Popup:` Adds support for viewing videos and audio in FileViewer (#464) * Adds support for opening files in the system file viewer (#472) * chart support for AsyncImage from saved files (#475) * chart support for AsyncImage from saved files * remove unused lambda. update comment --------- Co-authored-by: Soren Roth * attachment instance id workaround (#483) * chart support for AsyncImage from saved files * remove unused lambda. update comment * d * copy attachments on first fetch and pass down into the composition --------- Co-authored-by: Soren Roth * `Popup:` Adds support for viewing media in file viewer (#481) * popup dynamic entity (#492) * wip * Basic support for DynamicEntity in Popups * minor formatting * merge in media FileViewer * only animate the fields element when the dynamic entity pulses -- for now. * remove unused named lambda parameter. remove newline --------- Co-authored-by: Soren Roth * dont recreate the media image if it has already been saved to disk (#497) Co-authored-by: Soren Roth * remove space. add gradle stuff for tests * add Popup to t9manifest * update api file * some small fixes (#508) Co-authored-by: Soren Roth * set default map to fourteeners. --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * Callout styling (#503) * animation bug fix (#512) * merge Feature branches/popup to v.next (#517) * `Popup`: component and app (#406) * add Popup component and microapp * add bottom sheet and api file. * add READMEs * address review feedback * change name in android manifest that were changed in previous commit * Update microapps/PopupApp/README.md Co-authored-by: Erick Lopez Solis * Update toolkit/popup/README.md Co-authored-by: Erick Lopez Solis * add initialization support to the Popup composable. --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * `Popup`: Adds TextPopupElement Composable (#413) * `Popup`: state collection (#420) * pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose) * Address warnings from version upgrades. pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose). * preliminary setup of state collection. * add initialization support to the Popup composable. * workaround for known issue in gradle task graph progress. opt in for experimental coroutine API * view model added to the Popup App. * move files around. make state objects Parcelable. * ensure states are not created until expressions are evaluated. * Update toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/Popup.kt Co-authored-by: Erick Lopez Solis * remove Parcelable super class from base state class * remove comment --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * update expandable card (#426) * pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose) * Address warnings from version upgrades. pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose). * preliminary setup of state collection. * add initialization support to the Popup composable. * workaround for known issue in gradle task graph progress. opt in for experimental coroutine API * view model added to the Popup App. * move files around. make state objects Parcelable. * ensure states are not created until expressions are evaluated. * Update toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/Popup.kt Co-authored-by: Erick Lopez Solis * remove Parcelable super class from base state class * make expandable card more like field maps. * add defaults * address PR feedback * fix formatting * default to expandable card expanded --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * `Popup` attachment element (#430) * pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose) * Address warnings from version upgrades. pull compose bom into androidTest and test Implementations when needed. Add missing version for artifact not covered by compose bom (androidx-activity:activity-compose). * preliminary setup of state collection. * add initialization support to the Popup composable. * workaround for known issue in gradle task graph progress. opt in for experimental coroutine API * view model added to the Popup App. * move files around. make state objects Parcelable. * ensure states are not created until expressions are evaluated. * attachment initial support * Revert "attachment initial support" This reverts commit c888b6b4acb2da93d49658f3ce98c5229e24caf4. * attachment initial support * Atachments hooked up to state collection and rendering in the Popup. * remove file from other branch * Update toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/Popup.kt Co-authored-by: Erick Lopez Solis * remove Parcelable super class from base state class * make expandable card more like field maps. * add defaults * address PR feedback * fix formatting * default to expandable card expanded * merge in expandable card refactors * support document and other content types. * add all shapes sizes and color to theme defaults object * remove newlines * remove element count, add toggleable parameter to expandable card --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * `Popup:` Adds FieldsPopupElement composable (#428) * Adds ViewableFile implementation (#445) * popup media element and media image thumbnail support (#449) * Media element images wip * Media element with support for images * use colors from defaults * fix capitalization --------- Co-authored-by: Soren Roth * `Popup`: chart images (#452) * Media element images wip * Media element with support for images * chart image support, dark mode support for media. * update SDK dependency for Popups * tweak padding of charts vs images --------- Co-authored-by: Soren Roth * `Popup:` Fixes TextPopupElement composable shifting in size when coming back into visibility (#461) * `Popup:` Adds a file viewer for image attachments (#455) * `Popup:` Adds support for viewing videos and audio in FileViewer (#464) * Adds support for opening files in the system file viewer (#472) * chart support for AsyncImage from saved files (#475) * chart support for AsyncImage from saved files * remove unused lambda. update comment --------- Co-authored-by: Soren Roth * attachment instance id workaround (#483) * chart support for AsyncImage from saved files * remove unused lambda. update comment * d * copy attachments on first fetch and pass down into the composition --------- Co-authored-by: Soren Roth * `Popup:` Adds support for viewing media in file viewer (#481) * popup dynamic entity (#492) * wip * Basic support for DynamicEntity in Popups * minor formatting * merge in media FileViewer * only animate the fields element when the dynamic entity pulses -- for now. * remove unused named lambda parameter. remove newline --------- Co-authored-by: Soren Roth * dont recreate the media image if it has already been saved to disk (#497) Co-authored-by: Soren Roth * remove space. add gradle stuff for tests * add Popup to t9manifest * update api file * some small fixes (#508) Co-authored-by: Soren Roth * set default map to fourteeners. * popup style completeness (#509) * provide expandable card text color * Set the color of the Popup title text --------- Co-authored-by: Soren Roth * update dynamic charts and images (#515) * consistent animation. todo: push animation down to components * push animation down to components. refactor PopupMediaState creation to use factories. * add refreshInterval support. * reset map to fourteeners * feedback. property name, cleanup --------- Co-authored-by: Soren Roth --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * Merge Feature branches/forms into v.next (#520) * added horizontal scrollbar (#473) * `Forms` : Add attachment tests (#480) * `Forms` : Refactor tests (#488) * Update CorePrototypes.kt (#494) * `Forms` : handle empty attachments (#498) * restrict download and viewing attachments of 0 size * show error along with load * ignore non-default formattachmentelement (#499) * `Forms` : Fix strings (#500) * `Forms` : Micro-app update oauth credentials (#507) * refactor generating new attachment names (#505) * `Form` : Attachment theming (#490) * `Forms` : Consume latest api (#506) * make thumbnails part of the state object (#514) * add attachment size restrictions for loading (#518) * Add SideEffect to Callout (#519) * Readme changes for 200.5 (#513) * Add targetSdk to library modules in the testOptions (#516) * add targetSdk to indoors testOptions * add targetSdk to all gradles * add lint targetsdk * rm targetSdk from testOptions for app modules * add targetSdk to microappsLib and Composable-Map * add intent flag * fix background styling of the FieldsPopupElement (#522) Co-authored-by: Soren Roth * Disable submitting username/password credentials when fields are empty (#523) * Callout: Fix to observe GeoElement changes (#527) * final README updates for 200.5 (#528) * update mapview callout app README * add screenshot * scene view callout app README * add ScneView Callout README * update mapview callout README * update GeoView compose README for final Callout behavior * update link to public Callout function * Update FeatureForms README.md * s/some/a given/ Co-authored-by: Shubham Sharma * fix URL Co-authored-by: Shubham Sharma * Fix URL Co-authored-by: Shubham Sharma * comment: displays a (singular) Callout Co-authored-by: Erick Lopez Solis * comment: displays a (singular) Callout Co-authored-by: Erick Lopez Solis * SceneViewCallout README update Co-authored-by: Erick Lopez Solis * update MapViewCallout README --------- Co-authored-by: Soren Roth Co-authored-by: Shubham Sharma Co-authored-by: Erick Lopez Solis * prepare toolkit for 200.5.0 release build (#529) Co-authored-by: Soren Roth * merge main into v.next * prepare toolkit for 200.6.0 daily builds (#530) Co-authored-by: Soren Roth * drive publication of final toolkit build from FINAL_BUILD (#537) * drive publication of final toolkit build from FINAL_BUILD environment variable * remove buildNumber, versionNumber, and ignoreBuildNumber from gradle.properties. Pick them up from buildnum.txt and/or command line * doc * when finalBuild is set, depend on the major version of the SDK -- no build number. * when finalBuild is set, depend on the major version of the SDK -- no build number. * simplify bash. improve gradle. * revert test code to publish to mavenLocal * doc --------- Co-authored-by: Soren Roth * small template changes (#407) * remove the word app from the app's component name. add binary compatibility support * remove test code from settings.gradle.kts * update template app and component scripts and projects. * broaden gitignore pattern * fix spelling * Update new-microapp-starter.sh Co-authored-by: Puneet Prakash --------- Co-authored-by: Soren Roth Co-authored-by: Puneet Prakash * Upgrades to Kotlin 2.0 and K2 compiler and latest API build (#538) * Callout: Automated tests (#524) * L10n staging (#541) * Update pseudo translation - @mit10976 @isa13169 @nia13404 (#510) * Update pseudo translation - @mit10976 @isa13169 @nia13404 (#511) * Update translation - @mit10976 @isa13169 @nia13404 (#536) --------- Co-authored-by: Jonathan Turpin * Upgrade kotlin and compose compiler plugin version (#555) * Upgrade Kotlin version * update ksp version * Change Design of Dialog Authenticator Catalog (#547) * Added dialog change * Added dialog change * Added dialog change * Added AlertDialog to ServerTrust Challenge * Reflected feedback from reviews: Removed unneeded composable components, passed onDismiss instead of authenticatorState, moved some strings to strings.xml, left aligned all fields. * Reverted to old strings.xml, added padding, add UsernamePasswordAuthenticatorImpl, removed some parameters. * Fixed hostname, removed unnecessary column composables, fixed Authenticator comments, added back modifier to Authenticator * Fixed hostname, removed unnecessary column composables, fixed Authenticator comments, added back modifier to Authenticator * Added modifier back to ServerTrustAuthenticator and UsernamePasswordAuthenticatorImpl * Removed a modifier line, and added modifier comments in top level comments of API functions * Added modifier comment in top level, and passed modifier to AuthenticatorDelegate * Added review feedback, removed some comments, passed modifier to functions * Fixed mock hostname * Replaced url with hostname to be tested * Replaced all instances of original url to hostname for mock testing * Merge main - 200.6.0 (#568) * merge `Feature branches/forms` into v.next (#566) * `Forms`: Add `TextFormElement` (#542) * `Forms`: Add `TextFormElement` tests (#551) * add tests * updated feature form doc * bump sdk version * `Forms` : Add SubTypeFeatureLayer support (#559) * `Forms`: Fix stale `LaunchedEffect`s (#563) * fix stale launched effects * use rememberupdatedstate * update feature form doc (#565) * Remove unnecessary creating the viewmodel in the main activity (#571) * don't use trailing lambda to handle onClick in the Compass micro app (#618) * Merge Feature branches/forms into v.next (#611) * `Forms`: Add `TextFormElement` (#542) * `Forms`: Add `TextFormElement` tests (#551) * add tests * updated feature form doc * bump sdk version * `Forms` : Add SubTypeFeatureLayer support (#559) * `Forms`: Fix stale `LaunchedEffect`s (#563) * fix stale launched effects * use rememberupdatedstate * update feature form doc (#565) * show feature edit results related refactor (#575) * `Forms`: Show value for out of domain CodedValue types (#582) * update microapp api usage (#598) * `Forms` : Barcode support (#593) * `Forms`: Barcode Scanner Enhancements (#603) * `Forms` : Add Barcode input tests (#605) * update test maps (#610) * `Forms`: Barcode enhancements (#612) * add tap to focus * fix #apollo/914 * `Forms` : Update Doc (#616) * `Forms` : More Barcode Scanner Improvements (#620) * bump sdk version * PR feedback * Upgrade compose bom (#631) (#633) * upgrade compose bom to 2024.10.00 * remove unneeded test code * Depend on daily/dev builds of Maps SDK (#647) * For the Maps SDK dependency, give precedence to the version numbers provided via command line over versions from gradle.properties. * fix warnings * update comment * update comment * print the sdk number to the log by default by using logging level warn. --------- Co-authored-by: Soren Roth * merge feature branches/utilitynetworktrace to v.next (#649) * Sor10874/un trace tool (#540) * add UtilityNetwork components and Trace microapp modules * Upgrades to Kotlin 2.0 and K2 compiler and latest API build (#538) * barebones * whitespace * secrets defaults * add README and default Modifier parameter. update API file. * feedback on naming. * update package name * use compose compiler plugin --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis * Barebones implementation (#543) * Changes to perform Trace with hardcoded inputs * refactor * optimize imports * Initial Implementation of UN Trace tool UI(#544) * add theming to ExpandableCard (#548) * add theming to ExpandableCard * add use of composition local shapes to ExpandableCard header * feedback * remove unused typography style. feedback. * add new configurable styles. make theme internal. other feedback --------- Co-authored-by: Soren Roth * Utility network trace design state obj (#554) * Changes to add Trace state * Strip down implementation * UN trace tool config UI (#552) * add theming to ExpandableCard * wip * add use of composition local shapes to ExpandableCard header * wip * UI standardized and functionally complete. * bring experimental compose foundation UI into toolkit. Out of experimental in v1.6.6 (compose BOM 2024.08.00), can undo when we rev. * feedback * add keys to remember. fix concurrent modification of list. * remove print statement * remove print statement * remove unused typography style. feedback. * add new configurable styles. make theme internal. other feedback * comments * add comments to InternalMutatorMutex * PR feedback * whitespace * fix internal ExpandableCardHeader padding by adding it to the customizable theme. * center the add new points button * StartingPointRow -> StartingPoint * whitespace --------- Co-authored-by: Soren Roth * update api file (#558) Co-authored-by: Soren Roth * advanced options ui (#557) * add theming to ExpandableCard * wip * add use of composition local shapes to ExpandableCard header * wip * UI standardized and functionally complete. * bring experimental compose foundation UI into toolkit. Out of experimental in v1.6.6 (compose BOM 2024.08.00), can undo when we rev. * feedback * add keys to remember. fix concurrent modification of list. * remove print statement * remove print statement * remove unused typography style. feedback. * add new configurable styles. make theme internal. other feedback * comments * advanced options WIP * wip * simple color picker * advanced options * feedback * editable text: add done button to keyboard, clear focus on done. --------- Co-authored-by: Soren Roth * trace config loading progress indicator * add UI strings and add utility networks strings.xml to t9nmanifest (#564) * UN Trace Tool: Adds navigation and AddStartingPoingScreen (#560) * UN trace tool compose test framework and cursory test case. (#561) * UN trace tool compose test framework and cursory test case. * change name of test to be more descriptive. remove unnecessary annotation. * use TraceState in tests, not anonymous object * remove unnecessary function --------- Co-authored-by: Soren Roth * Sor10874/remove trace state iface (#567) * Changes to make identify work (#569) * Changes to make identify work * remove tappoint, screencoordinates as properties * optimize imports * Make the functions suspend * update padding * Adds Trace Result screen (#572) * Sor10874/real trace configs (#573) * Changes to make identify work * remove tappoint, screencoordinates as properties * save selected trace config in state obj * optimize imports * Make the functions suspend * wip * support real trace configs and real starting points * self review. formatting. visibility. * fix Symbology in composable PR suggestions * PR suggestions --------- Co-authored-by: Puneet Prakash Co-authored-by: Soren Roth * change peek height so cancel starting point button is displayed (#578) Co-authored-by: Soren Roth * use same instances in saver instantiation as well as restored version of DraggabbleAnchors (#579) Co-authored-by: Soren Roth * Make sure trace works (#577) * WIP * WIP * WIP * WIP * WIP * update WIP * WIP * WIP * address code review comments * Trace state initialization (#574) * WIP * add functionality to initialize trace state * WIP * simplify app logic to initialize the viewmodel add optimization to the initialize method, to initialize only if state is not already initialized * WIP * Revert "simplify app logic to initialize the viewmodel" This reverts commit 3ed8557c84fb25f7e4fd5dfa50c2fa9b17654387. * update formatting remove unused flow * WIP * initialized traceState in app viewmodel check if TraceState is already initialized * address code review comment * Update api file (#581) * Associate graphic with Starting points (#585) * WIP * associate graphic to each starting point * stable trace state (#583) * ensure Trace is skippable and restartable * encapsulate screen state to function * annotate TraceState * remove commented out code * remove unused parameter * get rid of extra initial navigation * dont reinitialize if already initializing or intiialized * PR feedback * remove compose compiler reporting --------- Co-authored-by: Soren Roth * Make sure trace types work (#587) * WIP * WIP * remove check for empty traceResults * update doc * Changes to enable/disable Trace button (#588) * Changes to enable/disable Trace button * address code review comment * remove unused import * redesign trace options (#589) * redesign trace configuration selecter * ensure trace option spacing is uniform * starting points redesign wip * theme changes to support dark mode and light mode * remove unused code --------- Co-authored-by: Soren Roth Co-authored-by: Puneet Prakash * Changes to make advanced options work (#591) * Changes to make advanced options work * refactor variable name * add doc * Update color selection * auto populate the tracename, persist zoom to results * address code review comments * update cancel button text to use string resource string (#596) * merge `l10n-staging` to `feature-branches/utilitynetworks` (#594) * Update pseudo translation - @mit10976 @isa13169 @nia13404 (#570) * feat(localization): update pseudo translation (#584) * Update pseudo translation - @mit10976 @isa13169 @nia13404 * Update translation - @mit10976 @isa13169 @nia13404 --------- Co-authored-by: Jonathan Turpin * StartingPoint detail with Slider port. (#592) * WIP StartingPoint detail with Slider port. * WIP * refactor slider code * update doc * rename StartingPointDetails -> StartingPointDetailsScreen * address code review comments * update package location * update tracetool unit test --------- Co-authored-by: Soren Roth * Update slider functions to be internal (#599) * Add option to navigate to new trace from resultscreen (#597) * WIP * reset current trace * WIP * update padding values * remove newline * address code review comments * refactor tabrow * add newline * address code review comments * remove explicit name * remove unused import * Puneet/4525 multiple results (#601) * WIP * reset current trace * WIP * update padding values * remove newline * WIP * address code review comments * refactor tabrow * add newline * WIP * address code review comments * remove explicit name * revert changes to compass app * WIP * WIP * WIP * remove unused import * address code review comment * WIP * remove unused code * optimize imports * update currentTrace type * Utility Trace Tool: Add error reporting (#600) * revert change to clear starting points (#609) * Starting point details screen (#604) * WIP * WIP * add changes to support zoomto, delete and to select terminal * add newline * address code review comments * add padding * WIP * address Rama's comments * address Erick's comments. * few formatting updates * fix to have the icon always visible * Utility Trace Tool: Adds BackHandler actions (#606) * Make properties internal that don't need to be public (#615) * Puneet/4521 feature results (#608) * WIP * WIP * WIP * WIP * more changes * remove string * don't throw exceptions * add copyright * update formatting * fix to show multiple results * address code review comments * address comments * add backhandler * add string resource * update indentation * UN Trace Tool: Fix exceptions thrown when processing selected points (#614) * Result Screen - Advanced options (#613) * WIP * WIP * WIP * WIP * more changes * remove string * don't throw exceptions * add copyright * update formatting * WIP * WIP * WIP * WIP * fix to show multiple results * address code review comments * address comments * add backhandler * add string resource * WIP * update deletion logic * update logic * changes for color picker * refactor colorpicker * add newline * Save selected color in options screen * remove padding changes * revert changes to navigation * add copyright * update indentation * clear all the starting points * address code review comments * address code review comments * address code review feedback * Adds ExpandableCard State and uses it in TraceOptions (#619) * remove redundant navigation route (#625) * changes to disable the trace button while a trace is in progress (#617) * WIP * WIP * WIP * WIP * more changes * remove string * don't throw exceptions * add copyright * update formatting * WIP * WIP * WIP * WIP * fix to show multiple results * address code review comments * address comments * add backhandler * add string resource * WIP * update deletion logic * update logic * changes for color picker * refactor colorpicker * add newline * Save selected color in options screen * remove padding changes * revert changes to navigation * add copyright * update indentation * clear all the starting points * changes to disable the trace button while a trace is in progress * address code review comments * add progress indicator for add starting point screen * address code review comments * address code review feedback * remove duplicate function * address code review comment * address code review comments * remove task update * remove redundant setting of _isTaskInProgress * add content description strings to strings.xml (#623) * UN Trace Tool: Refactor TabRow (#622) * Show chevron only when traceResults size is greater than 1 (#632) * changes to add starting points as features (#621) * UN Trace Tool: UI Improvements (#626) * Fix for unchecking the TraceConfiguration in the expandable card once… (#637) * Fix for unchecking the TraceConfiguration in the expandable card once trace is done * Sort the trace configurations by name * fix for refreshing Advanced Options Name field everytime a new TraceConfiguration is selected (#636) * Update Result screen UI when the First element in the list is getting deleted (#628) * Update selected state for trace result graphics when 0th element gets deleted * update delete logic * address code review comment * UN Trace Tool: Applies modifier (#638) * Highlight feature results (#627) * WIP * add feature extent * WIP * some refactor * calculate geometries extent only if currentTraceExtent is null due to no feature extent * do memory intensive task on Default thread * group features only when list is not empty * Adds TraceScaffold composable (#641) * Add automated test for trace tool (#640) * UI test changes * WIP * add test * revert unintended changes * optimize imports * update formatting * Update Test * address code review comment * update doc * address code review comments * Merge v next (#645) * Upgrades to Kotlin 2.0 and K2 compiler and latest API build (#538) * Callout: Automated tests (#524) * L10n staging (#541) * Update pseudo translation - @mit10976 @isa13169 @nia13404 (#510) * Update pseudo translation - @mit10976 @isa13169 @nia13404 (#511) * Update translation - @mit10976 @isa13169 @nia13404 (#536) --------- Co-authored-by: Jonathan Turpin * Upgrade kotlin and compose compiler plugin version (#555) * Upgrade Kotlin version * update ksp version * Change Design of Dialog Authenticator Catalog (#547) * Added dialog change * Added dialog change * Added dialog change * Added AlertDialog to ServerTrust Challenge * Reflected feedback from reviews: Removed unneeded composable components, passed onDismiss instead of authenticatorState, moved some strings to strings.xml, left aligned all fields. * Reverted to old strings.xml, added padding, add UsernamePasswordAuthenticatorImpl, removed some parameters. * Fixed hostname, removed unnecessary column composables, fixed Authenticator comments, added back modifier to Authenticator * Fixed hostname, removed unnecessary column composables, fixed Authenticator comments, added back modifier to Authenticator * Added modifier back to ServerTrustAuthenticator and UsernamePasswordAuthenticatorImpl * Removed a modifier line, and added modifier comments in top level comments of API functions * Added modifier comment in top level, and passed modifier to AuthenticatorDelegate * Added review feedback, removed some comments, passed modifier to functions * Fixed mock hostname * Replaced url with hostname to be tested * Replaced all instances of original url to hostname for mock testing * Merge main - 200.6.0 (#568) * merge `Feature branches/forms` into v.next (#566) * `Forms`: Add `TextFormElement` (#542) * `Forms`: Add `TextFormElement` tests (#551) * add tests * updated feature form doc * bump sdk version * `Forms` : Add SubTypeFeatureLayer support (#559) * `Forms`: Fix stale `LaunchedEffect`s (#563) * fix stale launched effects * use rememberupdatedstate * update feature form doc (#565) * Remove unnecessary creating the viewmodel in the main activity (#571) * don't use trailing lambda to handle onClick in the Compass micro app (#618) * Merge Feature branches/forms into v.next (#611) * `Forms`: Add `TextFormElement` (#542) * `Forms`: Add `TextFormElement` tests (#551) * add tests * updated feature form doc * bump sdk version * `Forms` : Add SubTypeFeatureLayer support (#559) * `Forms`: Fix stale `LaunchedEffect`s (#563) * fix stale launched effects * use rememberupdatedstate * update feature form doc (#565) * show feature edit results related refactor (#575) * `Forms`: Show value for out of domain CodedValue types (#582) * update microapp api usage (#598) * `Forms` : Barcode support (#593) * `Forms`: Barcode Scanner Enhancements (#603) * `Forms` : Add Barcode input tests (#605) * update test maps (#610) * `Forms`: Barcode enhancements (#612) * add tap to focus * fix #apollo/914 * `Forms` : Update Doc (#616) * `Forms` : More Barcode Scanner Improvements (#620) * bump sdk version * PR feedback * Upgrade compose bom (#631) (#633) * upgrade compose bom to 2024.10.00 * remove unneeded test code --------- Co-authored-by: Erick Lopez Solis Co-authored-by: Shubham Sharma Co-authored-by: Jonathan Turpin Co-authored-by: Puneet Prakash Co-authored-by: Nour Siwar @ Esri <100004210+NourdotSiwar@users.noreply.github.com> Co-authored-by: Kaushik Meesala Co-authored-by: Gunther Heppner Co-authored-by: Kaushik Meesala Co-authored-by: Soren Roth * Merge v next into feature branch (#650) * Upgrades to Kotlin 2.0 and K2 compiler and latest API build (#538) * Callout: Automated tests (#524) * L10n staging (#541) * Update pseudo translation - @mit10976 @isa13169 @nia13404 (#510) * Update pseudo translation - @mit10976 @isa13169 @nia13404 (#511) * Update translation - @mit10976 @isa13169 @nia13404 (#536) --------- Co-authored-by: Jonathan Turpin * Upgrade kotlin and compose compiler plugin version (#555) * Upgrade Kotlin version * update ksp version * Change Design of Dialog Authenticator Catalog (#547) * Added dialog change * Added dialog change * Added dialog change * Added AlertDialog to ServerTrust Challenge * Reflected feedback from reviews: Removed unneeded composable components, passed onDismiss instead of authenticatorState, moved some strings to strings.xml, left aligned all fields. * Reverted to old strings.xml, added padding, add UsernamePasswordAuthenticatorImpl, removed some parameters. * Fixed hostname, removed unnecessary column composables, fixed Authenticator comments, added back modifier to Authenticator * Fixed hostname, removed unnecessary column composables, fixed Authenticator comments, added back modifier to Authenticator * Added modifier back to ServerTrustAuthenticator and UsernamePasswordAuthenticatorImpl * Removed a modifier line, and added modifier comments in top level comments of API functions * Added modifier comment in top level, and passed modifier to AuthenticatorDelegate * Added review feedback, removed some comments, passed modifier to functions * Fixed mock hostname * Replaced url with hostname to be tested * Replaced all instances of original url to hostname for mock testing * Merge main - 200.6.0 (#568) * merge `Feature branches/forms` into v.next (#566) * `Forms`: Add `TextFormElement` (#542) * `Forms`: Add `TextFormElement` tests (#551) * add tests * updated feature form doc * bump sdk version * `Forms` : Add SubTypeFeatureLayer support (#559) * `Forms`: Fix stale `LaunchedEffect`s (#563) * fix stale launched effects * use rememberupdatedstate * update feature form doc (#565) * Remove unnecessary creating the viewmodel in the main activity (#571) * don't use trailing lambda to handle onClick in the Compass micro app (#618) * Merge Feature branches/forms into v.next (#611) * `Forms`: Add `TextFormElement` (#542) * `Forms`: Add `TextFormElement` tests (#551) * add tests * updated feature form doc * bump sdk version * `Forms` : Add SubTypeFeatureLayer support (#559) * `Forms`: Fix stale `LaunchedEffect`s (#563) * fix stale launched effects * use rememberupdatedstate * update feature form doc (#565) * show feature edit results related refactor (#575) * `Forms`: Show value for out of domain CodedValue types (#582) * update microapp api usage (#598) * `Forms` : Barcode support (#593) * `Forms`: Barcode Scanner Enhancements (#603) * `Forms` : Add Barcode input tests (#605) * update test maps (#610) * `Forms`: Barcode enhancements (#612) * add tap to focus * fix #apollo/914 * `Forms` : Update Doc (#616) * `Forms` : More Barcode Scanner Improvements (#620) * bump sdk version * PR feedback * Upgrade compose bom (#631) (#633) * upgrade compose bom to 2024.10.00 * remove unneeded test code --------- Co-authored-by: Erick Lopez Solis Co-authored-by: Shubham Sharma Co-authored-by: Jonathan Turpin Co-authored-by: Puneet Prakash Co-authored-by: Nour Siwar @ Esri <100004210+NourdotSiwar@users.noreply.github.com> Co-authored-by: Kaushik Meesala Co-authored-by: Gunther Heppner Co-authored-by: Kaushik Meesala Co-authored-by: Soren Roth * Utility Network update api file (#643) * update api file * add BuildConfig to api file ignores --------- Co-authored-by: Soren Roth --------- Co-authored-by: Soren Roth Co-authored-by: Erick Lopez Solis Co-authored-by: Puneet Prakash Co-authored-by: Jonathan Turpin Co-authored-by: Shubham Sharma Co-authored-by: Nour Siwar @ Esri <100004210+NourdotSiwar@users.noreply.github.com> Co-authored-by: Kaushik Meesala Co-authored-by: Gunther Heppner Co-authored-by: Kaushik Meesala * remove shared lib (#661) * get rid of shared lib * eol at eof --------- Co-authored-by: Soren Roth * fix link to SceneViewCalloutApp (#660) * Adds ServerTrust and UsernamePassword Authenticators UI (#659) * Merge TableTop into v.next (#664) * Set up Tabletop AR project (#545) * prototype design options * prototype tabletopSceneView * remove unused implementations * create readme * add tabletopsceneviewproxy * update microapp to use tabletop proxy * add TableTopSceneViewScope * apply Compose gradle plugin * fix warnings * rename microapp * delete tests for microapp * add copyright * fix since years * use swift doc on tabletopsceneview * add proxy doc * add scope doc * fix references in proxy doc * fix references in scope doc * fix references in scope doc * newlines * rm unit test * fix doc and imports * fix doc and imports * revert authentication changes --------- Co-authored-by: Gunther Heppner * Hud10837/import render code (#580) * import necessary files for rendering camera feed * copyright * rm obj dependency * make kotlin classes internal * make java classes non-public * centralize logging and tag * add doc links to hello ar * make planerenderer companion internal * Fix texture name * add newline * Tabletop AR: Add ArSurfaceView (#590) * bring in existing implementation of ArSurfaceView * bring in changes to TabletopSceneView and TableTopSceneViewState * pare down changes to just implement ARSurfaceView and add lifecycle management wrappers for AR Session and GlSurfaceView * rm camera controller line * mv call to box * mv ArSessionWrapper to internal * fix since tags * rename ARSurfaceView -> ArCameraFeed * rename localLifecycleOwner -> lifecycleOwner * mv initialization of sceneViewProxy to TableTopSceneViewProxy * Hud10837/session init and permissions (#595) * mv assets folder to correct location * out of the box permissions request * rename camera permission function * make request permission optional * add initialization status * add availability check * update microapp * extract string resources * rm unnecessary changes * don't use stateflow for microapp * rename string res * rename string resource * don't require camera permission before checking arcore visibility * mv box call * add local function for update status * simplify availability check * rename status * make status constructors internal * use updateState for initial status * mv status doc to member objects * add remaining param doc * fix remaining param doc * add parameter for callback to lambda * revert whitespace in manifest * remove debug delay * add factory rememberTableTopSceneViewStatus * add extension fun to mutable state * add extension fun to mutable state * rename camera feed file * use launchedeffect to ensure initializing status is only sent once * Don't send callback on first status * use side effects for callback * use collectAsStateWithLifecycle * add doc to rememberTableTopSceneViewStatus() * Tabletop AR: scene placement (#602) * merge `Feature branches/forms` into v.next (#566) * `Forms`: Add `TextFormElement` (#542) * `Forms`: Add `TextFormElement` tests (#551) * add tests * updated feature form doc * bump sdk version * `Forms` : Add SubTypeFeatureLayer support (#559) * `Forms`: Fix stale `LaunchedEffect`s (#563) * fix stale launched effects * use rememberupdatedstate * update feature form doc (#565) * Remove unnecessary creating the viewmodel in the main activity (#571) * Set up Tabletop AR project (#545) * prototype design options * prototype tabletopSceneView * remove unused implementations * create readme * add tabletopsceneviewproxy * update microapp to use tabletop proxy * add TableTopSceneViewScope * apply Compose gradle plugin * fix warnings * rename microapp * delete tests for microapp * add copyright * fix since years * use swift doc on tabletopsceneview * add proxy doc * add scope doc * fix references in proxy doc * fix references in scope doc * fix references in scope doc * newlines * rm unit test * fix doc and imports * fix doc and imports * revert authentication changes --------- Co-authored-by: Gunther Heppner * Hud10837/import render code (#580) * import necessary files for rendering camera feed * copyright * rm obj dependency * make kotlin classes internal * make java classes non-public * centralize logging and tag * add doc links to hello ar * make planerenderer companion internal * Fix texture name * add newline * Tabletop AR: Add ArSurfaceView (#590) * bring in existing implementation of ArSurfaceView * bring in changes to TabletopSceneView and TableTopSceneViewState * pare down changes to just implement ARSurfaceView and add lifecycle management wrappers for AR Session and GlSurfaceView * rm camera controller line * mv call to box * mv ArSessionWrapper to internal * fix since tags * rename ARSurfaceView -> ArCameraFeed * rename localLifecycleOwner -> lifecycleOwner * mv initialization of sceneViewProxy to TableTopSceneViewProxy * Hud10837/session init and permissions (#595) * mv assets folder to correct location * out of the box permissions request * rename camera permission function * make request permission optional * add initialization status * add availability check * update microapp * extract string resources * rm unnecessary changes * don't use stateflow for microapp * rename string res * rename string resource * don't require camera permission before checking arcore visibility * mv box call * add local function for update status * simplify availability check * rename status * make status constructors internal * use updateState for initial status * mv status doc to member objects * add remaining param doc * fix remaining param doc * add parameter for callback to lambda * revert whitespace in manifest * remove debug delay * add factory rememberTableTopSceneViewStatus * add extension fun to mutable state * add extension fun to mutable state * rename camera feed file * use launchedeffect to ensure initializing status is only sent once * Don't send callback on first status * use side effects for callback * use collectAsStateWithLifecycle * add doc to rememberTableTopSceneViewStatus() * add new DetectingPlanes status * create callback and set status for first plane detected * add in scene placement logic * add translation factor, anchor point, clipping distance * rm initial viewpoint on scene * display simple helper text while detecting planes * use string res * use string res for lat lon callout content * enhance microapp with status messages * use better data for microapp * rm debug code * use val instead of var for status * cleanup * use display rotation for lens intrinsics * checkout unexpected files from feature branch * checkout unexpected files from feature branch * add doc to TextWithScrim * use when statements and be exhaustive * mv declarations of cameraController and arCoreAnchor * add doc Pose.transformationMatrix * use when (val status = ... * use explicit api mode * fix build warnings --------- Co-authored-by: Kaushik Meesala Co-authored-by: Puneet Prakash Co-authored-by: Gunther Heppner * TableTop improvements (#607) * stop rendering planes as soon as the anchor point is determined * configure ARCore Session to only detect horizontal planes * disable pan/zoom/rotate interaction * make clippingDistance an optional parameter and ensure modifier is first optional param * enhance comment Co-authored-by: hud10837 --------- Co-authored-by: hud10837 * TableTop doc (#644) * expand AR readme * explain translationFactor * update micro app to use simplified dataset * cache arcGISSceneAnchor in the composition * add prerequisites and usage sections * doc fixes * add AR to top level readme * remove basemap and make surface opaque * add screenshot * update README * improve doc on TableTopSceneView parameters * add README for ARTableTop micro app * improve doc on translationFactor Co-authored-by: hud10837 * refine doc for prerequisites * add snippet for AR required manifest * fix spelling Co-authored-by: hud10837 --------- Co-authored-by: hud10837 * Tabletop - disable navigation (#662) * remove interaction options from TableTopSceneView * remove setViewpoint functions from TableTopSceneViewProxy * remove unused imports * Tabletop callout fix & Session config (#663) * cache _isManualRenderingEnabled and sync with SceneView when set * invoke content lambda when SceneView ready or in manual rendering mode * configure AR Session in onResume instead of upon construction * change ArCameraFeed constructor to take a Session instead of ArSessionWrapper * create Session in onResume, expose as StateFlow * observe session state flow in order to render the ArCameraFeed * lock the screen of the TableTop micro app * roll back screen orientation lock * sync manual rendering flag in sceneView property setter * remove `onDrawStatusChanged` from TableTopSceneView * fix link * fix link * fix link --------- Co-authored-by: hud10837 Co-authored-by: Kaushik Meesala Co-authored-by: Puneet Prakash * Update UtilityNetwork README and main README file (#657) * Update UtilityNetwork readme * Update Readme * update comment * add readme for the micro app * ar api file (#666) Co-authored-by: Soren Roth * update screenshot for AR TableTop (#668) * update copyright headers (#667) * `Forms` : Merge Feature branches/forms into v.next for 200.6 (#669) * TableTop microapp improvements (#671) * identify and select buildings * clean up imports * update microapp to identify buildings * add comments * eof newline * use named lambda params * use warning log * rm log message --------- Co-authored-by: Hudson Miears * rm unused import (#672) * ensure build is working when depending on final build in Android Studio (#682) --------- Co-authored-by: Soren Roth Co-authored-by: Soren Roth Co-authored-by: Hudson Miears Co-authored-by: hud10837 Co-authored-by: Erick Lopez Solis Co-authored-by: Shubham Sharma Co-authored-by: Rama Chintapalli Co-authored-by: Gunther Heppner Co-authored-by: Changan Shi Co-authored-by: Kaushik Meesala Co-authored-by: Kaushik Meesala Co-authored-by: Ruiqi Ma <40756115+ruiqima@users.noreply.github.com> Co-authored-by: Jonathan Turpin Co-authored-by: TADraeseke Co-authored-by: Nour Siwar @ Esri <100004210+NourdotSiwar@users.noreply.github.com> --- .gitignore | 2 +- README.md | 7 +- bom/build.gradle.kts | 5 +- build.gradle.kts | 35 + .../main/kotlin/deploy/ArtifactPublisher.kt | 11 +- ci/publish.sh | 3 +- ci/run_gradle_task.sh | 2 +- gradle.properties | 16 +- gradle/libs.versions.toml | 50 +- kdoc/build.gradle.kts | 7 - microapps/ArTabletopApp/.gitignore | 15 + microapps/ArTabletopApp/README.md | 11 + microapps/ArTabletopApp/app/.gitignore | 1 + microapps/ArTabletopApp/app/build.gradle.kts | 98 + .../ArTabletopApp/app/proguard-rules.pro | 21 + .../app/src/main/AndroidManifest.xml | 59 + .../toolkit/artabletopapp/MainActivity.kt | 103 + .../artabletopapp/screens/MainScreen.kt | 204 ++ .../toolkit/artabletopapp/ui/theme/Color.kt | 29 + .../drawable-v24/ic_launcher_foreground.xml | 48 + .../res/drawable/ic_launcher_background.xml | 188 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 24 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 24 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes .../app/src/main/res/values/colors.xml | 28 + .../app/src/main/res/values/strings.xml | 29 + .../app/src/main/res/values/themes.xml | 23 + .../app/src/main/res/xml/backup_rules.xml | 31 + .../main/res/xml/data_extraction_rules.xml | 37 + .../AuthenticationApp/app/build.gradle.kts | 4 +- microapps/CompassApp/app/build.gradle.kts | 4 +- .../toolkit/compassapp/screens/MainScreen.kt | 13 +- .../FeatureFormsApp/app/build.gradle.kts | 4 +- .../featureformsapp/screens/map/MapScreen.kt | 525 ++-- .../screens/map/MapViewModel.kt | 481 ++-- .../app/src/main/res/values/strings.xml | 3 + microapps/FloorFilterApp/app/build.gradle.kts | 4 +- .../MapViewCalloutApp/app/build.gradle.kts | 4 +- .../app/build.gradle.kts | 4 +- .../MapViewIdentifyApp/app/build.gradle.kts | 4 +- .../MapViewInsetsApp/app/build.gradle.kts | 4 +- .../app/build.gradle.kts | 4 +- .../app/build.gradle.kts | 4 +- microapps/MicroappsLib/build.gradle.kts | 4 +- microapps/PopupApp/app/build.gradle.kts | 4 +- .../app/build.gradle.kts | 4 +- .../SceneViewCalloutApp/app/build.gradle.kts | 4 +- .../sceneviewcalloutapp/MainActivity.kt | 7 +- .../sceneviewcalloutapp/screens/MainScreen.kt | 3 +- .../app/build.gradle.kts | 4 +- .../app/build.gradle.kts | 4 +- .../app/build.gradle.kts | 4 +- microapps/TemplateApp/app/build.gradle.kts | 13 +- microapps/UtilityNetworkTraceApp/.gitignore | 15 + microapps/UtilityNetworkTraceApp/README.md | 33 + .../UtilityNetworkTraceApp/app/.gitignore | 1 + .../app/build.gradle.kts | 86 + .../app/proguard-rules.pro | 21 + .../app/src/main/AndroidManifest.xml | 47 + .../utilitynetworktraceapp/MainActivity.kt | 98 + .../screens/MainScreen.kt | 100 + .../screens/TraceViewModel.kt | 36 + .../utilitynetworktraceapp/ui/theme/Color.kt | 29 + .../drawable-v24/ic_launcher_foreground.xml | 48 + .../res/drawable/ic_launcher_background.xml | 188 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 24 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 24 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes .../app/src/main/res/values/colors.xml | 28 + .../app/src/main/res/values/strings.xml | 21 + .../app/src/main/res/values/themes.xml | 23 + .../app/src/main/res/xml/backup_rules.xml | 31 + .../main/res/xml/data_extraction_rules.xml | 37 + .../screenshots/advancedoptions.png | Bin 0 -> 28747 bytes .../screenshots/startingpointproperties.png | Bin 0 -> 220477 bytes .../screenshots/trace.png | Bin 0 -> 217145 bytes .../screenshots/traceconfigs.png | Bin 0 -> 222080 bytes .../screenshots/traceresults.png | Bin 0 -> 170443 bytes new-component-starter.sh | 3 +- new-microapp-starter.sh | 5 +- secrets.defaults.properties | 2 + settings.gradle.kts | 51 +- t9nmanifest.txt | 1 + toolkit/ar/.gitignore | 1 + toolkit/ar/README.md | 147 ++ toolkit/ar/api/ar.api | 74 + toolkit/ar/build.gradle.kts | 93 + toolkit/ar/consumer-rules.pro | 0 toolkit/ar/screenshot.png | Bin 0 -> 862185 bytes .../toolkit/ar/ExampleInstrumentedTest.kt | 40 + toolkit/ar/src/main/AndroidManifest.xml | 22 + .../shaders/background_show_camera.frag | 26 + .../shaders/background_show_camera.vert | 29 + toolkit/ar/src/main/assets/shaders/plane.frag | 35 + toolkit/ar/src/main/assets/shaders/plane.vert | 42 + .../ar/src/main/assets/textures/trigrid.png | Bin 0 -> 37354 bytes .../toolkit/ar/TableTopSceneView.kt | 423 ++++ .../toolkit/ar/TableTopSceneViewProxy.kt | 307 +++ .../toolkit/ar/TableTopSceneViewScope.kt | 99 + .../toolkit/ar/TableTopSceneViewStatus.kt | 77 + .../toolkit/ar/internal/ArCameraFeed.kt | 114 + .../toolkit/ar/internal/ArSessionWrapper.kt | 77 + .../ar/internal/render/CameraFeedRenderer.kt | 278 ++ .../toolkit/ar/internal/render/DebugUtil.kt | 35 + .../render/DisplayRotationHelper.java | 179 ++ .../ar/internal/render/Framebuffer.java | 187 ++ .../toolkit/ar/internal/render/GLError.java | 90 + .../toolkit/ar/internal/render/GpuBuffer.java | 130 + .../ar/internal/render/IndexBuffer.java | 83 + .../toolkit/ar/internal/render/Mesh.java | 160 ++ .../ar/internal/render/PlaneRenderer.kt | 341 +++ .../toolkit/ar/internal/render/Shader.java | 708 ++++++ .../ar/internal/render/SurfaceDrawHandler.kt | 134 + .../toolkit/ar/internal/render/Texture.java | 206 ++ .../ar/internal/render/VertexBuffer.java | 107 + toolkit/ar/src/main/res/values/strings.xml | 5 + toolkit/authentication/build.gradle.kts | 4 +- .../authentication/UsernamePasswordTests.kt | 37 +- .../toolkit/authentication/Authenticator.kt | 62 +- .../ServerTrustAuthenticator.kt | 188 +- .../UsernamePasswordAuthenticator.kt | 254 +- .../UsernamePasswordChallenge.kt | 5 + toolkit/compass/build.gradle.kts | 4 +- toolkit/composable-map/build.gradle.kts | 4 +- toolkit/featureforms/README.md | 151 +- toolkit/featureforms/api/featureforms.api | 26 +- toolkit/featureforms/build.gradle.kts | 17 +- .../screenshots/attachments_form_element.png | Bin 0 -> 20245 bytes .../screenshots/barcode_input.png | Bin 0 -> 16398 bytes .../featureforms/screenshots/combo_input.png | Bin 0 -> 12391 bytes .../featureforms/screenshots/combo_picker.png | Bin 0 -> 45477 bytes .../screenshots/date_time_input.png | Bin 0 -> 15880 bytes .../screenshots/group_element_collapsed.png | Bin 0 -> 8105 bytes .../screenshots/group_element_expanded.png | Bin 0 -> 63276 bytes .../featureforms/screenshots/radio_input.png | Bin 0 -> 21776 bytes .../featureforms/screenshots/read_only.png | Bin 0 -> 13853 bytes .../featureforms/screenshots/switch_input.png | Bin 0 -> 30241 bytes .../screenshots/text_area_input.png | Bin 0 -> 56918 bytes .../screenshots/text_form_element.png | Bin 0 -> 34848 bytes .../featureforms/screenshots/text_input.png | Bin 0 -> 12640 bytes .../toolkit/featureforms/BarcodeTests.kt | 216 ++ .../featureforms/DateTimeFieldTests.kt | 1 - .../featureforms/FeatureFormTestRunner.kt | 5 +- .../featureforms/FormTextFieldNumericTests.kt | 22 +- .../FormTextFieldRangeNumericTests.kt | 22 +- .../toolkit/featureforms/ImageUtil.kt | 20 +- .../featureforms/TestChallengeHandler.kt | 20 +- .../featureforms/TextFormElementTests.kt | 95 + .../toolkit/featureforms/ThemingTests.kt | 2 +- .../toolkit/featureforms/FeatureForm.kt | 208 +- .../attachment/AttachmentFormElement.kt | 2 +- .../barcode/BarcodeImageAnalyzer.kt | 187 ++ .../components/barcode/BarcodeScanner.kt | 491 ++++ .../components/barcode/BarcodeTextField.kt | 154 ++ .../barcode/BarcodeTextFieldDefaults.kt | 38 + .../barcode/BarcodeTextFieldState.kt | 177 ++ .../components/barcode/TransformUtils.kt | 71 + .../components/base/BaseFieldState.kt | 4 +- .../internal/components/base/BaseTextField.kt | 79 +- .../components/base/BaseTextFieldDefaults.kt | 22 + .../components/base/FieldValidation.kt | 25 +- .../internal/components/base/Flows.kt | 30 +- .../codedvalue/CodedValueFieldState.kt | 16 +- .../components/codedvalue/ComboBoxField.kt | 144 +- .../codedvalue/ComboBoxFieldState.kt | 5 +- .../components/codedvalue/RadioButtonField.kt | 2 +- .../codedvalue/RadioButtonFieldState.kt | 11 +- .../components/codedvalue/SwitchField.kt | 32 +- .../components/codedvalue/SwitchFieldState.kt | 5 +- .../components/datetime/DateTimeField.kt | 24 +- .../datetime/picker/date/SnapFlingBehavior.kt | 3 +- .../components/formelement/FieldElement.kt | 24 +- .../components/formelement/GroupElement.kt | 44 +- .../internal/components/text/Markdown.kt | 369 +++ .../components/text/TextFormElement.kt | 75 + .../components/text/TextFormElementState.kt | 89 + .../internal/utils/CorePrototypes.kt | 25 +- .../featureforms/internal/utils/Dialog.kt | 34 +- .../featureforms/internal/utils/Utils.kt | 8 + .../featureforms/theme/FeatureFormTheme.kt | 26 +- .../src/main/res/drawable/barcode_scanner.xml | 26 + .../src/main/res/values-ar/strings.xml | 25 +- .../src/main/res/values-bg/strings.xml | 25 +- .../src/main/res/values-bs/strings.xml | 25 +- .../src/main/res/values-ca/strings.xml | 25 +- .../src/main/res/values-cs/strings.xml | 25 +- .../src/main/res/values-da/strings.xml | 25 +- .../src/main/res/values-de/strings.xml | 25 +- .../src/main/res/values-el/strings.xml | 25 +- .../src/main/res/values-es/strings.xml | 25 +- .../src/main/res/values-et/strings.xml | 25 +- .../src/main/res/values-fi/strings.xml | 25 +- .../src/main/res/values-fr/strings.xml | 25 +- .../src/main/res/values-he/strings.xml | 25 +- .../src/main/res/values-hr/strings.xml | 25 +- .../src/main/res/values-hu/strings.xml | 25 +- .../src/main/res/values-id/strings.xml | 25 +- .../src/main/res/values-in/strings.xml | 25 +- .../src/main/res/values-it/strings.xml | 25 +- .../src/main/res/values-iw/strings.xml | 25 +- .../src/main/res/values-ja/strings.xml | 25 +- .../src/main/res/values-ko/strings.xml | 25 +- .../src/main/res/values-lt/strings.xml | 25 +- .../src/main/res/values-lv/strings.xml | 25 +- .../src/main/res/values-nl/strings.xml | 25 +- .../src/main/res/values-no/strings.xml | 25 +- .../src/main/res/values-pl/strings.xml | 25 +- .../src/main/res/values-pt-rBR/strings.xml | 25 +- .../src/main/res/values-pt-rPT/strings.xml | 25 +- .../src/main/res/values-ro/strings.xml | 25 +- .../src/main/res/values-ru/strings.xml | 25 +- .../src/main/res/values-sk/strings.xml | 25 +- .../src/main/res/values-sl/strings.xml | 25 +- .../src/main/res/values-sr/strings.xml | 25 +- .../src/main/res/values-sv/strings.xml | 25 +- .../src/main/res/values-th/strings.xml | 25 +- .../src/main/res/values-tr/strings.xml | 25 +- .../src/main/res/values-uk/strings.xml | 25 +- .../src/main/res/values-vi/strings.xml | 25 +- .../src/main/res/values-zh-rHK/strings.xml | 25 +- .../src/main/res/values-zh-rTW/strings.xml | 25 +- .../src/main/res/values-zh/strings.xml | 25 +- .../src/main/res/values/strings.xml | 6 + toolkit/geoview-compose/README.md | 2 +- toolkit/geoview-compose/build.gradle.kts | 5 +- .../callout/CalloutScenarios.kt | 228 ++ .../geoviewcompose/callout/CalloutTests.kt | 249 ++ .../toolkit/geoviewcompose/GeoViewScope.kt | 3 + .../toolkit/geoviewcompose/SceneView.kt | 9 +- .../toolkit/geoviewcompose/SceneViewProxy.kt | 12 +- toolkit/indoors/build.gradle.kts | 4 +- toolkit/popup/build.gradle.kts | 7 +- .../attachment/AttachmentsPopupElement.kt | 18 +- .../fieldselement/FieldsPopupElement.kt | 16 +- .../element/media/MediaPopupElement.kt | 18 +- .../element/textelement/TextPopupElement.kt | 2 +- .../popup/internal/ui/ExpandableCard.kt | 186 -- .../internal/ui/ExpandableCardDefaults.kt | 54 - .../toolkit/popup/internal/ui/Modifier.kt | 26 - .../ui/expandablecard/ExpandableCard.kt | 230 ++ .../ui/expandablecard/ExpandableCardState.kt | 68 + .../theme/DefaultThemeTokens.kt | 162 ++ .../theme/ExpandableCardDefaults.kt | 94 + .../theme/ExpandableCardTheme.kt | 167 ++ .../popup/src/main/res/values-ar/strings.xml | 27 + .../popup/src/main/res/values-bg/strings.xml | 27 + .../popup/src/main/res/values-bs/strings.xml | 27 + .../popup/src/main/res/values-ca/strings.xml | 27 + .../popup/src/main/res/values-cs/strings.xml | 27 + .../popup/src/main/res/values-da/strings.xml | 27 + .../popup/src/main/res/values-de/strings.xml | 27 + .../popup/src/main/res/values-el/strings.xml | 27 + .../popup/src/main/res/values-es/strings.xml | 27 + .../popup/src/main/res/values-et/strings.xml | 27 + .../popup/src/main/res/values-fi/strings.xml | 27 + .../popup/src/main/res/values-fr/strings.xml | 27 + .../popup/src/main/res/values-he/strings.xml | 27 + .../popup/src/main/res/values-hr/strings.xml | 27 + .../popup/src/main/res/values-hu/strings.xml | 27 + .../popup/src/main/res/values-id/strings.xml | 27 + .../popup/src/main/res/values-in/strings.xml | 27 + .../popup/src/main/res/values-it/strings.xml | 27 + .../popup/src/main/res/values-iw/strings.xml | 27 + .../popup/src/main/res/values-ja/strings.xml | 27 + .../popup/src/main/res/values-ko/strings.xml | 27 + .../popup/src/main/res/values-lt/strings.xml | 27 + .../popup/src/main/res/values-lv/strings.xml | 27 + .../popup/src/main/res/values-nl/strings.xml | 27 + .../popup/src/main/res/values-no/strings.xml | 27 + .../popup/src/main/res/values-pl/strings.xml | 27 + .../src/main/res/values-pt-rBR/strings.xml | 27 + .../src/main/res/values-pt-rPT/strings.xml | 27 + .../popup/src/main/res/values-ro/strings.xml | 27 + .../popup/src/main/res/values-ru/strings.xml | 27 + .../popup/src/main/res/values-sk/strings.xml | 27 + .../popup/src/main/res/values-sl/strings.xml | 27 + .../popup/src/main/res/values-sr/strings.xml | 27 + .../popup/src/main/res/values-sv/strings.xml | 27 + .../popup/src/main/res/values-th/strings.xml | 27 + .../popup/src/main/res/values-tr/strings.xml | 27 + .../popup/src/main/res/values-uk/strings.xml | 27 + .../popup/src/main/res/values-vi/strings.xml | 27 + .../src/main/res/values-zh-rHK/strings.xml | 27 + .../src/main/res/values-zh-rTW/strings.xml | 27 + .../popup/src/main/res/values-zh/strings.xml | 27 + toolkit/template/build.gradle.kts | 5 +- toolkit/utilitynetworks/.gitignore | 1 + toolkit/utilitynetworks/README.md | 90 + .../utilitynetworks/api/utilitynetworks.api | 89 + toolkit/utilitynetworks/build.gradle.kts | 122 + toolkit/utilitynetworks/consumer-rules.pro | 0 toolkit/utilitynetworks/screenshot.png | Bin 0 -> 275058 bytes .../utilitynetworks/TraceToolTestRunner.kt | 72 + .../toolkit/utilitynetworks/TraceToolTests.kt | 153 ++ .../TraceToolUsageScenarios.kt | 96 + .../src/main/AndroidManifest.xml | 22 + .../toolkit/utilitynetworks/Trace.kt | 160 ++ .../toolkit/utilitynetworks/TraceError.kt | 53 + .../toolkit/utilitynetworks/TraceState.kt | 888 +++++++ .../internal/util/AdvancedOptionsRow.kt | 172 ++ .../internal/util/ExpandableCardWithLabel.kt | 62 + .../utilitynetworks/internal/util/TabRow.kt | 54 + .../utilitynetworks/internal/util/TitleRow.kt | 115 + .../utilitynetworks/internal/util/UpButton.kt | 61 + .../ui/AddStartingPointScreen.kt | 61 + .../ui/ClearAllResultsDialog.kt | 51 + .../ui/FeatureResultsDetailsScreen.kt | 111 + .../ui/StartingPointDetailsScreen.kt | 283 +++ .../utilitynetworks/ui/StartingPointRow.kt | 274 ++ .../toolkit/utilitynetworks/ui/Text.kt | 106 + .../toolkit/utilitynetworks/ui/TraceColors.kt | 101 + .../utilitynetworks/ui/TraceErrorDialog.kt | 48 + .../utilitynetworks/ui/TraceNavigation.kt | 210 ++ .../utilitynetworks/ui/TraceOptionsScreen.kt | 398 +++ .../utilitynetworks/ui/TraceResultScreen.kt | 307 +++ .../ui/expandablecard/ExpandableCard.kt | 230 ++ .../ui/expandablecard/ExpandableCardState.kt | 68 + .../theme/DefaultThemeTokens.kt | 162 ++ .../theme/ExpandableCardDefaults.kt | 94 + .../theme/ExpandableCardTheme.kt | 167 ++ .../ui/gestures/AnchoredDraggable.kt | 870 +++++++ .../ui/gestures/InternalMutatorMutex.kt | 165 ++ .../ui/material3/ColorSchemeKeyTokens.kt | 124 + .../ui/material3/ElevationTokens.kt | 30 + .../ui/material3/ShapeKeyTokens.kt | 73 + .../utilitynetworks/ui/material3/Slider.kt | 2227 +++++++++++++++++ .../ui/material3/SliderTokens.kt | 78 + .../ui/material3/TypographyKeyTokens.kt | 37 + .../src/main/res/values-ar/strings.xml | 31 + .../src/main/res/values-bg/strings.xml | 31 + .../src/main/res/values-bs/strings.xml | 31 + .../src/main/res/values-ca/strings.xml | 31 + .../src/main/res/values-cs/strings.xml | 31 + .../src/main/res/values-da/strings.xml | 31 + .../src/main/res/values-de/strings.xml | 31 + .../src/main/res/values-el/strings.xml | 31 + .../src/main/res/values-es/strings.xml | 31 + .../src/main/res/values-et/strings.xml | 31 + .../src/main/res/values-fi/strings.xml | 31 + .../src/main/res/values-fr/strings.xml | 31 + .../src/main/res/values-he/strings.xml | 31 + .../src/main/res/values-hr/strings.xml | 31 + .../src/main/res/values-hu/strings.xml | 31 + .../src/main/res/values-id/strings.xml | 31 + .../src/main/res/values-in/strings.xml | 31 + .../src/main/res/values-it/strings.xml | 31 + .../src/main/res/values-iw/strings.xml | 31 + .../src/main/res/values-ja/strings.xml | 31 + .../src/main/res/values-ko/strings.xml | 31 + .../src/main/res/values-lt/strings.xml | 31 + .../src/main/res/values-lv/strings.xml | 31 + .../src/main/res/values-nl/strings.xml | 31 + .../src/main/res/values-no/strings.xml | 31 + .../src/main/res/values-pl/strings.xml | 31 + .../src/main/res/values-pt-rBR/strings.xml | 31 + .../src/main/res/values-pt-rPT/strings.xml | 31 + .../src/main/res/values-ro/strings.xml | 31 + .../src/main/res/values-ru/strings.xml | 31 + .../src/main/res/values-sk/strings.xml | 31 + .../src/main/res/values-sl/strings.xml | 31 + .../src/main/res/values-sr/strings.xml | 31 + .../src/main/res/values-sv/strings.xml | 31 + .../src/main/res/values-th/strings.xml | 31 + .../src/main/res/values-tr/strings.xml | 31 + .../src/main/res/values-uk/strings.xml | 31 + .../src/main/res/values-vi/strings.xml | 31 + .../src/main/res/values-zh-rHK/strings.xml | 31 + .../src/main/res/values-zh-rTW/strings.xml | 31 + .../src/main/res/values-zh/strings.xml | 31 + .../src/main/res/values/strings.xml | 65 + 388 files changed, 23278 insertions(+), 1276 deletions(-) create mode 100644 microapps/ArTabletopApp/.gitignore create mode 100644 microapps/ArTabletopApp/README.md create mode 100644 microapps/ArTabletopApp/app/.gitignore create mode 100644 microapps/ArTabletopApp/app/build.gradle.kts create mode 100644 microapps/ArTabletopApp/app/proguard-rules.pro create mode 100644 microapps/ArTabletopApp/app/src/main/AndroidManifest.xml create mode 100644 microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/MainActivity.kt create mode 100644 microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/screens/MainScreen.kt create mode 100644 microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/ui/theme/Color.kt create mode 100644 microapps/ArTabletopApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 microapps/ArTabletopApp/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 microapps/ArTabletopApp/app/src/main/res/values/colors.xml create mode 100644 microapps/ArTabletopApp/app/src/main/res/values/strings.xml create mode 100644 microapps/ArTabletopApp/app/src/main/res/values/themes.xml create mode 100644 microapps/ArTabletopApp/app/src/main/res/xml/backup_rules.xml create mode 100644 microapps/ArTabletopApp/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 microapps/UtilityNetworkTraceApp/.gitignore create mode 100644 microapps/UtilityNetworkTraceApp/README.md create mode 100644 microapps/UtilityNetworkTraceApp/app/.gitignore create mode 100644 microapps/UtilityNetworkTraceApp/app/build.gradle.kts create mode 100644 microapps/UtilityNetworkTraceApp/app/proguard-rules.pro create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/AndroidManifest.xml create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/java/com/arcgismaps/toolkit/utilitynetworktraceapp/MainActivity.kt create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/java/com/arcgismaps/toolkit/utilitynetworktraceapp/screens/MainScreen.kt create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/java/com/arcgismaps/toolkit/utilitynetworktraceapp/screens/TraceViewModel.kt create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/java/com/arcgismaps/toolkit/utilitynetworktraceapp/ui/theme/Color.kt create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/values/colors.xml create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/values/strings.xml create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/values/themes.xml create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/xml/backup_rules.xml create mode 100644 microapps/UtilityNetworkTraceApp/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 microapps/UtilityNetworkTraceApp/screenshots/advancedoptions.png create mode 100644 microapps/UtilityNetworkTraceApp/screenshots/startingpointproperties.png create mode 100644 microapps/UtilityNetworkTraceApp/screenshots/trace.png create mode 100644 microapps/UtilityNetworkTraceApp/screenshots/traceconfigs.png create mode 100644 microapps/UtilityNetworkTraceApp/screenshots/traceresults.png create mode 100644 toolkit/ar/.gitignore create mode 100644 toolkit/ar/README.md create mode 100644 toolkit/ar/api/ar.api create mode 100644 toolkit/ar/build.gradle.kts create mode 100644 toolkit/ar/consumer-rules.pro create mode 100644 toolkit/ar/screenshot.png create mode 100644 toolkit/ar/src/androidTest/java/com/arcgismaps/toolkit/ar/ExampleInstrumentedTest.kt create mode 100644 toolkit/ar/src/main/AndroidManifest.xml create mode 100644 toolkit/ar/src/main/assets/shaders/background_show_camera.frag create mode 100644 toolkit/ar/src/main/assets/shaders/background_show_camera.vert create mode 100644 toolkit/ar/src/main/assets/shaders/plane.frag create mode 100644 toolkit/ar/src/main/assets/shaders/plane.vert create mode 100644 toolkit/ar/src/main/assets/textures/trigrid.png create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/TableTopSceneView.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/TableTopSceneViewProxy.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/TableTopSceneViewScope.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/TableTopSceneViewStatus.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/ArCameraFeed.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/ArSessionWrapper.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/CameraFeedRenderer.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/DebugUtil.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/DisplayRotationHelper.java create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/Framebuffer.java create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/GLError.java create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/GpuBuffer.java create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/IndexBuffer.java create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/Mesh.java create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/PlaneRenderer.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/Shader.java create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/SurfaceDrawHandler.kt create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/Texture.java create mode 100644 toolkit/ar/src/main/java/com/arcgismaps/toolkit/ar/internal/render/VertexBuffer.java create mode 100644 toolkit/ar/src/main/res/values/strings.xml create mode 100644 toolkit/featureforms/screenshots/attachments_form_element.png create mode 100644 toolkit/featureforms/screenshots/barcode_input.png create mode 100644 toolkit/featureforms/screenshots/combo_input.png create mode 100644 toolkit/featureforms/screenshots/combo_picker.png create mode 100644 toolkit/featureforms/screenshots/date_time_input.png create mode 100644 toolkit/featureforms/screenshots/group_element_collapsed.png create mode 100644 toolkit/featureforms/screenshots/group_element_expanded.png create mode 100644 toolkit/featureforms/screenshots/radio_input.png create mode 100644 toolkit/featureforms/screenshots/read_only.png create mode 100644 toolkit/featureforms/screenshots/switch_input.png create mode 100644 toolkit/featureforms/screenshots/text_area_input.png create mode 100644 toolkit/featureforms/screenshots/text_form_element.png create mode 100644 toolkit/featureforms/screenshots/text_input.png create mode 100644 toolkit/featureforms/src/androidTest/java/com/arcgismaps/toolkit/featureforms/BarcodeTests.kt create mode 100644 toolkit/featureforms/src/androidTest/java/com/arcgismaps/toolkit/featureforms/TextFormElementTests.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/barcode/BarcodeImageAnalyzer.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/barcode/BarcodeScanner.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/barcode/BarcodeTextField.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/barcode/BarcodeTextFieldDefaults.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/barcode/BarcodeTextFieldState.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/barcode/TransformUtils.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/base/BaseTextFieldDefaults.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/text/Markdown.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/text/TextFormElement.kt create mode 100644 toolkit/featureforms/src/main/java/com/arcgismaps/toolkit/featureforms/internal/components/text/TextFormElementState.kt create mode 100644 toolkit/featureforms/src/main/res/drawable/barcode_scanner.xml create mode 100644 toolkit/geoview-compose/src/androidTest/java/com/arcgismaps/toolkit/geoviewcompose/callout/CalloutScenarios.kt create mode 100644 toolkit/geoview-compose/src/androidTest/java/com/arcgismaps/toolkit/geoviewcompose/callout/CalloutTests.kt delete mode 100644 toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/internal/ui/ExpandableCard.kt delete mode 100644 toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/internal/ui/ExpandableCardDefaults.kt delete mode 100644 toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/internal/ui/Modifier.kt create mode 100644 toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/internal/ui/expandablecard/ExpandableCard.kt create mode 100644 toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/internal/ui/expandablecard/ExpandableCardState.kt create mode 100644 toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/internal/ui/expandablecard/theme/DefaultThemeTokens.kt create mode 100644 toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/internal/ui/expandablecard/theme/ExpandableCardDefaults.kt create mode 100644 toolkit/popup/src/main/java/com/arcgismaps/toolkit/popup/internal/ui/expandablecard/theme/ExpandableCardTheme.kt create mode 100644 toolkit/popup/src/main/res/values-ar/strings.xml create mode 100644 toolkit/popup/src/main/res/values-bg/strings.xml create mode 100644 toolkit/popup/src/main/res/values-bs/strings.xml create mode 100644 toolkit/popup/src/main/res/values-ca/strings.xml create mode 100644 toolkit/popup/src/main/res/values-cs/strings.xml create mode 100644 toolkit/popup/src/main/res/values-da/strings.xml create mode 100644 toolkit/popup/src/main/res/values-de/strings.xml create mode 100644 toolkit/popup/src/main/res/values-el/strings.xml create mode 100644 toolkit/popup/src/main/res/values-es/strings.xml create mode 100644 toolkit/popup/src/main/res/values-et/strings.xml create mode 100644 toolkit/popup/src/main/res/values-fi/strings.xml create mode 100644 toolkit/popup/src/main/res/values-fr/strings.xml create mode 100644 toolkit/popup/src/main/res/values-he/strings.xml create mode 100644 toolkit/popup/src/main/res/values-hr/strings.xml create mode 100644 toolkit/popup/src/main/res/values-hu/strings.xml create mode 100644 toolkit/popup/src/main/res/values-id/strings.xml create mode 100644 toolkit/popup/src/main/res/values-in/strings.xml create mode 100644 toolkit/popup/src/main/res/values-it/strings.xml create mode 100644 toolkit/popup/src/main/res/values-iw/strings.xml create mode 100644 toolkit/popup/src/main/res/values-ja/strings.xml create mode 100644 toolkit/popup/src/main/res/values-ko/strings.xml create mode 100644 toolkit/popup/src/main/res/values-lt/strings.xml create mode 100644 toolkit/popup/src/main/res/values-lv/strings.xml create mode 100644 toolkit/popup/src/main/res/values-nl/strings.xml create mode 100644 toolkit/popup/src/main/res/values-no/strings.xml create mode 100644 toolkit/popup/src/main/res/values-pl/strings.xml create mode 100644 toolkit/popup/src/main/res/values-pt-rBR/strings.xml create mode 100644 toolkit/popup/src/main/res/values-pt-rPT/strings.xml create mode 100644 toolkit/popup/src/main/res/values-ro/strings.xml create mode 100644 toolkit/popup/src/main/res/values-ru/strings.xml create mode 100644 toolkit/popup/src/main/res/values-sk/strings.xml create mode 100644 toolkit/popup/src/main/res/values-sl/strings.xml create mode 100644 toolkit/popup/src/main/res/values-sr/strings.xml create mode 100644 toolkit/popup/src/main/res/values-sv/strings.xml create mode 100644 toolkit/popup/src/main/res/values-th/strings.xml create mode 100644 toolkit/popup/src/main/res/values-tr/strings.xml create mode 100644 toolkit/popup/src/main/res/values-uk/strings.xml create mode 100644 toolkit/popup/src/main/res/values-vi/strings.xml create mode 100644 toolkit/popup/src/main/res/values-zh-rHK/strings.xml create mode 100644 toolkit/popup/src/main/res/values-zh-rTW/strings.xml create mode 100644 toolkit/popup/src/main/res/values-zh/strings.xml create mode 100644 toolkit/utilitynetworks/.gitignore create mode 100644 toolkit/utilitynetworks/README.md create mode 100644 toolkit/utilitynetworks/api/utilitynetworks.api create mode 100644 toolkit/utilitynetworks/build.gradle.kts create mode 100644 toolkit/utilitynetworks/consumer-rules.pro create mode 100644 toolkit/utilitynetworks/screenshot.png create mode 100644 toolkit/utilitynetworks/src/androidTest/java/com/arcgismaps/toolkit/utilitynetworks/TraceToolTestRunner.kt create mode 100644 toolkit/utilitynetworks/src/androidTest/java/com/arcgismaps/toolkit/utilitynetworks/TraceToolTests.kt create mode 100644 toolkit/utilitynetworks/src/androidTest/java/com/arcgismaps/toolkit/utilitynetworks/TraceToolUsageScenarios.kt create mode 100644 toolkit/utilitynetworks/src/main/AndroidManifest.xml create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/Trace.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/TraceError.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/TraceState.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/internal/util/AdvancedOptionsRow.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/internal/util/ExpandableCardWithLabel.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/internal/util/TabRow.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/internal/util/TitleRow.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/internal/util/UpButton.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/AddStartingPointScreen.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/ClearAllResultsDialog.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/FeatureResultsDetailsScreen.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/StartingPointDetailsScreen.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/StartingPointRow.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/Text.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/TraceColors.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/TraceErrorDialog.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/TraceNavigation.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/TraceOptionsScreen.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/TraceResultScreen.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/expandablecard/ExpandableCard.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/expandablecard/ExpandableCardState.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/expandablecard/theme/DefaultThemeTokens.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/expandablecard/theme/ExpandableCardDefaults.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/expandablecard/theme/ExpandableCardTheme.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/gestures/AnchoredDraggable.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/gestures/InternalMutatorMutex.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/material3/ColorSchemeKeyTokens.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/material3/ElevationTokens.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/material3/ShapeKeyTokens.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/material3/Slider.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/material3/SliderTokens.kt create mode 100644 toolkit/utilitynetworks/src/main/java/com/arcgismaps/toolkit/utilitynetworks/ui/material3/TypographyKeyTokens.kt create mode 100644 toolkit/utilitynetworks/src/main/res/values-ar/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-bg/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-bs/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-ca/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-cs/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-da/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-de/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-el/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-es/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-et/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-fi/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-fr/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-he/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-hr/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-hu/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-id/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-in/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-it/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-iw/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-ja/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-ko/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-lt/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-lv/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-nl/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-no/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-pl/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-pt-rBR/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-pt-rPT/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-ro/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-ru/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-sk/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-sl/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-sr/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-sv/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-th/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-tr/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-uk/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-vi/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-zh-rHK/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-zh-rTW/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values-zh/strings.xml create mode 100644 toolkit/utilitynetworks/src/main/res/values/strings.xml diff --git a/.gitignore b/.gitignore index b67000e7b..127173826 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,7 @@ proguard/ .classpath bin/ gen/ -/.settings +.settings/ .vscode/ # OS generated files # diff --git a/README.md b/README.md index 86ea230e3..2b2b85e1e 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ The ArcGIS Maps SDK for Kotlin Toolkit contains components that will simplify yo * **[GeoView-Compose](toolkit/geoview-compose)** - Compose wrappers for the MapView and SceneView. * **[Callout](toolkit/geoview-compose#display-a-callout)** - Draws a callout on the GeoView to display Composable content. * **[Popup](toolkit/popup)** - View field values of features in a layer using the Popup API. +* **[UtilityNetworkTrace](toolkit/utilitynetworks)** - Configure, run, and visualize UtilityNetworkTraces on a composable MapView. +* **[Augmented Reality](toolkit/ar)** - Provides components to "augment" the physical world with virtual content. ## API Reference @@ -43,12 +45,15 @@ repositories { The *ArcGIS Maps SDK for Kotlin Toolkit* is released with a "bill of materials" (`BOM`). The releasable BOM is versioned and represents a set of versions of the toolkit components which are compatible with one another. You may specify dependencies as follows ``` -implementation(platform("com.esri:arcgis-maps-kotlin-toolkit-bom:200.5.0")) +implementation(platform("com.esri:arcgis-maps-kotlin-toolkit-bom:200.6.0")) implementation("com.esri:arcgis-maps-kotlin-toolkit-authentication") implementation("com.esri:arcgis-maps-kotlin-toolkit-compass") +implementation("com.esri:arcgis-maps-kotlin-toolkit-featureforms") implementation("com.esri:arcgis-maps-kotlin-toolkit-geoview-compose") implementation("com.esri:arcgis-maps-kotlin-toolkit-indoors") implementation("com.esri:arcgis-maps-kotlin-toolkit-popup") +implementation("com.esri:arcgis-maps-kotlin-toolkit-utilitynetworks") +implementation("com.esri:arcgis-maps-kotlin-toolkit-ar") ``` The template and TemplateApp modules are for bootstrapping new modules. diff --git a/bom/build.gradle.kts b/bom/build.gradle.kts index e96a5f922..941902952 100644 --- a/bom/build.gradle.kts +++ b/bom/build.gradle.kts @@ -31,8 +31,9 @@ val artifactoryUsername: String by project val artifactoryPassword: String by project val versionNumber: String by project val buildNumber: String by project -val ignoreBuildNumber: String by project -val artifactVersion: String = if (ignoreBuildNumber == "true") { +val finalBuild: Boolean = (project.properties["finalBuild"] ?: "false") + .run { this == "true" } +val artifactVersion: String = if (finalBuild) { versionNumber } else { "$versionNumber-$buildNumber" diff --git a/build.gradle.kts b/build.gradle.kts index adc31058d..d678be7e9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -28,6 +28,7 @@ plugins { alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.dokka) apply false alias(libs.plugins.gmazzo.test.aggregation) + alias(libs.plugins.compose.compiler) apply false } buildscript { @@ -38,6 +39,38 @@ buildscript { // before any dependent subproject uses its symbols to configure a dokka task. classpath(libs.dokka.versioning) } + val finalBuild: Boolean = (project.properties["finalBuild"] ?: "false") + .run { this == "true" } + + if (finalBuild) { + check(project.hasProperty("versionNumber")) + project.logger.info("release candidate build requested version ${project.properties["versionNumber"]}") + } else if (!project.hasProperty("versionNumber") && !project.hasProperty("buildNum")) { + // both version number and build number must be set + java.util.Properties().run { + try { + File(project.projectDir, "../buildnum/buildnum.txt") + .reader() + .use { + load(it) + } + this["BUILDVER"]?.let { + project.extra.set("versionNumber", it) + } + this["BUILDNUM"]?.let { + project.extra.set("buildNumber", it) + } + check(project.hasProperty("versionNumber")) + check(project.hasProperty("buildNumber")) + project.logger.info("version and build number set from buildnum.txt to ${project.properties["versionNumber"]}-${project.properties["buildNumber"]}") + } catch (t: Throwable) { + // The buildnum file is not there. ignore it and log a warning. + project.logger.warn("the buildnum.txt file is missing or not readable") + project.extra.set("versionNumber", "0.0.0") + project.extra.set("buildNumber", "SNAPSHOT") + } + } + } } // Path to the centralized folder in root directory where test reports for connected tests end up @@ -60,6 +93,7 @@ testAggregation { "microapps-lib", "template", "template-app", + "utility-network-trace-app", "composable-map").forEach { this.modules.include(project(":$it")) } @@ -77,3 +111,4 @@ fun getModulesExcept(vararg modulesToExclude: String): List = } .filter { !modulesToExclude.contains(it) } // exclude specified modules } + diff --git a/buildSrc/src/main/kotlin/deploy/ArtifactPublisher.kt b/buildSrc/src/main/kotlin/deploy/ArtifactPublisher.kt index 5d81a334b..0f1cb0aaf 100644 --- a/buildSrc/src/main/kotlin/deploy/ArtifactPublisher.kt +++ b/buildSrc/src/main/kotlin/deploy/ArtifactPublisher.kt @@ -21,10 +21,12 @@ package deploy import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.plugins.MavenPublishPlugin -import org.gradle.kotlin.dsl.* import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin import org.gradle.configurationcache.extensions.capitalized +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.provideDelegate import java.net.URI /** @@ -45,9 +47,10 @@ class ArtifactPublisher : Plugin { val artifactoryUsername: String by project val artifactoryPassword: String by project val versionNumber: String by project - val ignoreBuildNumber: String by project + val finalBuild: Boolean = (project.properties["finalBuild"] ?: "false") + .run { this == "true" } val buildNumber: String by project - val artifactVersion: String = if (ignoreBuildNumber == "true") { + val artifactVersion: String = if (finalBuild) { versionNumber } else { "$versionNumber-$buildNumber" diff --git a/ci/publish.sh b/ci/publish.sh index cd4a69f19..b35a8f118 100755 --- a/ci/publish.sh +++ b/ci/publish.sh @@ -69,7 +69,8 @@ function _check_options_and_set_variables() { function _publish() { _log "Publish the release build to artifactory" - if ! ${apps_path}/arcgis-maps-sdk-kotlin-toolkit/ci/run_gradle_task.sh -v -t publish -x "-PartifactoryUsername=${ARTIFACTORY_USR} -PartifactoryPassword=${ARTIFACTORY_PSW} -PversionNumber=${BUILDVER} -PbuildNumber=${BUILDNUM}" ; then + + if ! ${apps_path}/arcgis-maps-sdk-kotlin-toolkit/ci/run_gradle_task.sh -t publish -x "-PartifactoryUsername=${ARTIFACTORY_USR} -PartifactoryPassword=${ARTIFACTORY_PSW} -PversionNumber=${BUILDVER} -PbuildNumber=${BUILDNUM} -PfinalBuild=${FINAL_BUILD}" ; then echo "error: Running the publish gradle task failed" exit 1 fi diff --git a/ci/run_gradle_task.sh b/ci/run_gradle_task.sh index 741e31158..3900f4c43 100755 --- a/ci/run_gradle_task.sh +++ b/ci/run_gradle_task.sh @@ -77,7 +77,7 @@ function _run_gradle_task() { if [ "${verbose}" == "true" ]; then gradle_flags+="--info " fi - + if ! ./gradlew ${gradle_flags} ${task} ${extra_gradle_flags}; then echo echo "error: Something went wrong when running gradle" diff --git a/gradle.properties b/gradle.properties index 7561d7b9c..717ed2948 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,14 +44,10 @@ artifactoryGroupId=com.esri artifactoryArtifactBaseId=arcgis-maps-kotlin-toolkit artifactoryUsername="" artifactoryPassword="" -# these numbers will define the artifact version on artifactory -# and are overridden by the jenkins command line in the daily build -versionNumber=200.5.0 -buildNumber=0000-snapshot -#set this flag to `true` to ignore the build number when publishing. This -# will publish an artifact with a build number like "..:200.2.0" as opposed to "...:200.2.0-3963 -ignoreBuildNumber=true -# these versions define the dependency of the ArcGIS Maps SDK for Kotlin dependency -# and are generally not overridden at the command line unless a special build is requested. -sdkVersionNumber=200.5.0 + +# These versions define the dependency of the ArcGIS Maps SDK for Kotlin dependency +# when building the toolkit locally, typically from Android Studio. When building the toolkit +# with CI, these versions are obtained from command line provided properties, see sdkVersionNumber +# in settings.gradle.kts. +sdkVersionNumber=200.6.0 sdkBuildNumber= diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e5c383274..15b113bb8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,8 @@ activityCompose = "1.8.2" androidGradlePlugin = "8.3.2" androidXBrowser = "1.8.0" coilBOM = "2.5.0" -composeBOM = "2024.04.01" +composeBOM = "2024.10.00" +androidxCamera = "1.4.0-rc02" androidxComposeCompiler = "1.5.12" androidxCore = "1.13.0" androidxEspresso = "3.5.1" @@ -11,33 +12,41 @@ androidxHiltNavigationCompose = "1.2.0" androidxLifecycle = "2.7.0" androidxMaterialIcons = "1.6.6" androidxTestExt = "1.1.5" +androidXTestRunner = "1.6.2" +androidXTestRules = "1.6.1" androidxWindow = "1.2.0" binaryCompatibilityValidator = "0.14.0" compileSdk = "34" compose-navigation = "2.7.7" +commonMark = "0.22.0" dokka = "1.9.20" hilt = "2.49" hiltExt = "1.2.0" junit = "4.13.2" -kotlin = "1.9.23" -ksp = "1.9.23-1.0.20" +kotlin = "2.0.20" +ksp = "2.0.20-1.0.24" media3Exoplayer = "1.3.1" minSdk = "26" +mlkitBarcodeScanning = "17.3.0" kotlinxCoroutinesTest = "1.8.0" kotlinxSerializationJson = "1.6.3" mockkAndroid = "1.13.10" room = "2.6.1" truth = "1.4.2" uiautomator = "2.3.0" +arcore = "1.45.0" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose"} androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "androidXBrowser"} +androidx-camera-core = { group = "androidx.camera", name = "camera-core", version.ref = "androidxCamera" } +androidx-camera-camera2 = { group = "androidx.camera", name = "camera-camera2", version.ref = "androidxCamera" } +androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "androidxCamera" } +androidx-camera-view = { group = "androidx.camera", name = "camera-view", version.ref = "androidxCamera" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidxCore" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBOM" } androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } androidx-compose-ui = { group = "androidx.compose.ui", name = "ui"} -androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime"} androidx-compose-material3 = { module = "androidx.compose.material3:material3"} androidx-compose-navigation = { group = "androidx.navigation", name = "navigation-compose", version.ref = "compose-navigation" } androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics"} @@ -56,13 +65,18 @@ androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "medi androidx-media3-exoplayer-dash = { module = "androidx.media3:media3-exoplayer-dash", version.ref = "media3Exoplayer" } androidx-test-ext = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "androidxTestExt" } androidx-test-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidxEspresso" } +androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "androidXTestRunner" } +androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidXTestRules" } androidx-uiautomator = { module = "androidx.test.uiautomator:uiautomator", version.ref = "uiautomator" } androidx-window = { group = "androidx.window", name = "window", version.ref = "androidxWindow" } androidx-window-core = { group = "androidx.window", name = "window-core", version.ref = "androidxWindow" } +mlkit-barcode-scanning = { module = "com.google.mlkit:barcode-scanning", version.ref = "mlkitBarcodeScanning" } coil-bom = { group = "io.coil-kt", name = "coil-bom", version.ref = "coilBOM" } coil = { group = "io.coil-kt", name = "coil" } coil-base = { group = "io.coil-kt", name = "coil-base" } coil-compose = { group = "io.coil-kt", name = "coil-compose" } +commonmark = { group = "org.commonmark", name = "commonmark", version.ref="commonMark" } +commonmark-strikethrough = { group = "org.commonmark", name = "commonmark-ext-gfm-strikethrough", version.ref="commonMark" } hilt-android-core = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" } hilt-ext-compiler = { group = "androidx.hilt", name = "hilt-compiler", version.ref = "hiltExt" } @@ -78,6 +92,7 @@ room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = room-ext = { group = "androidx.room", name = "room-ktx", version.ref = "room" } truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } dokka-versioning = { group = "org.jetbrains.dokka", name = "versioning-plugin", version.ref = "dokka" } +arcore = { group = "com.google.ar", name = "core", version.ref = "arcore" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } @@ -89,13 +104,26 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } gradle-secrets = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin", version = "2.0.1"} kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } gmazzo-test-aggregation = { id = "io.github.gmazzo.test.aggregation.results", version = "2.2.0" } [bundles] +camerax = [ + "androidx-camera-core", + "androidx-camera-camera2", + "androidx-camera-lifecycle", + "androidx-camera-view" +] + core = [ "androidx-core-ktx" ] +commonmark = [ + "commonmark", + "commonmark-strikethrough" +] + composeCore = [ "androidx-compose-material3", "androidx-compose-ui", @@ -107,7 +135,8 @@ composeCore = [ composeTest = [ "androidx-test-ext", "androidx-test-espresso-core", - "androidx-compose-ui-test" + "androidx-compose-ui-test", + "truth" ] debug = [ @@ -115,14 +144,13 @@ debug = [ "androidx-compose-ui-test-manifest" ] -serialization = [ - "kotlinx-serialization-core", - "kotlinx-serialization-json", - "kotlin-reflect" -] - unitTest = [ "junit", "kotlinx-coroutines-test", "truth" ] + +androidXTest = [ + "androidx-test-runner", + "androidx-test-rules" +] diff --git a/kdoc/build.gradle.kts b/kdoc/build.gradle.kts index 64c554d13..13f34fc19 100644 --- a/kdoc/build.gradle.kts +++ b/kdoc/build.gradle.kts @@ -23,13 +23,6 @@ plugins { } val versionNumber: String by project -val buildNumber: String by project -val ignoreBuildNumber: String by project -val artifactVersion: String = if (ignoreBuildNumber == "true") { - versionNumber -} else { - "$versionNumber-$buildNumber" -} // make this project get evaluated after all the other projects // so that we can be sure the logic to determine released components diff --git a/microapps/ArTabletopApp/.gitignore b/microapps/ArTabletopApp/.gitignore new file mode 100644 index 000000000..aa724b770 --- /dev/null +++ b/microapps/ArTabletopApp/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/microapps/ArTabletopApp/README.md b/microapps/ArTabletopApp/README.md new file mode 100644 index 000000000..4740f9e9b --- /dev/null +++ b/microapps/ArTabletopApp/README.md @@ -0,0 +1,11 @@ +# AR TableTop Micro-app + +This micro-app demonstrates the use of the `TableTopSceneView` toolkit component which renders an `ArcGISSceneLayer` with buildings onto a physical surface detected in the device's camera feed. + +![Screenshot](../../toolkit/ar/screenshot.png) + +## Usage + +Launch the app and follow on-screen instructions to point the camera towards a surface while moving the device slightly. When a surface is detected it will appear as a grid of white lines in the camera feed. Tap on the grid to choose an anchor location to place the 3D buildings. Shortly after tapping on the screen, the buildings will appear as shown in the screenshot above. + +For more information on the `TableTopSceneView` component and how it works, see it's [Readme](../../toolkit/ar/README.md). diff --git a/microapps/ArTabletopApp/app/.gitignore b/microapps/ArTabletopApp/app/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/microapps/ArTabletopApp/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/microapps/ArTabletopApp/app/build.gradle.kts b/microapps/ArTabletopApp/app/build.gradle.kts new file mode 100644 index 000000000..592e88f3a --- /dev/null +++ b/microapps/ArTabletopApp/app/build.gradle.kts @@ -0,0 +1,98 @@ +/* + * + * Copyright 2024 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("org.jetbrains.kotlin.plugin.compose") + id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") +} + +secrets { + // this file doesn't contain secrets, it just provides defaults which can be committed into git. + defaultPropertiesFileName = "secrets.defaults.properties" +} + +android { + namespace = "com.arcgismaps.toolkit.artabletopapp" + compileSdk = libs.versions.compileSdk.get().toInt() + + defaultConfig { + applicationId ="com.arcgismaps.toolkit.artabletopapp" + minSdk = libs.versions.minSdk.get().toInt() + targetSdk = libs.versions.compileSdk.get().toInt() + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner ="androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isMinifyEnabled = false + //proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"),("proguard-rules.pro" + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + buildConfig = true + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + + /** + * Configures the test report for connected (instrumented) tests to be copied to a central + * folder in the project's root directory. + */ + testOptions { + val connectedTestReportsPath: String by project + reportDir = "$connectedTestReportsPath/${project.name}" + } +} + +dependencies { + implementation(project(":geoview-compose")) + implementation(project(":microapps-lib")) + implementation(project(":ar")) + implementation(libs.arcore) + implementation(arcgis.mapsSdk) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.bundles.composeCore) + implementation(libs.bundles.core) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.lifecycle.viewmodel.compose) + implementation(libs.androidx.lifecycle.runtime.compose) + testImplementation(libs.bundles.unitTest) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.bundles.composeTest) + debugImplementation(libs.bundles.debug) +} diff --git a/microapps/ArTabletopApp/app/proguard-rules.pro b/microapps/ArTabletopApp/app/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/microapps/ArTabletopApp/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/microapps/ArTabletopApp/app/src/main/AndroidManifest.xml b/microapps/ArTabletopApp/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..26791142d --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/AndroidManifest.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/MainActivity.kt b/microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/MainActivity.kt new file mode 100644 index 000000000..f9cea6477 --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/MainActivity.kt @@ -0,0 +1,103 @@ +/* + * + * Copyright 2024 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.arcgismaps.toolkit.artabletopapp + +import android.os.Bundle +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.arcgismaps.ApiKey +import com.arcgismaps.ArcGISEnvironment +import com.arcgismaps.toolkit.artabletopapp.screens.MainScreen +import com.esri.microappslib.theme.MicroAppTheme +import com.google.ar.core.ArCoreApk +import kotlinx.coroutines.flow.MutableStateFlow + +class MainActivity : ComponentActivity() { + + private var userRequestedInstall: Boolean = true + + // Flow to track if Google Play Services for AR is installed on the device + // By using `collectAsStateWithLifecycle()` in the composable, the UI will recompose when the + // value changes + private val isGooglePlayServicesArInstalled = MutableStateFlow(false) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + ArcGISEnvironment.apiKey = ApiKey.create(BuildConfig.API_KEY) + setContent { + MicroAppTheme { + if (isGooglePlayServicesArInstalled.collectAsStateWithLifecycle().value) { + ArTabletopApp() + } else { + Text(text = stringResource(R.string.arcore_not_installed_screen_message)) + } + } + } + } + + override fun onResume() { + super.onResume() + checkGooglePlayServicesArInstalled() + } + + private fun checkGooglePlayServicesArInstalled() { + // Check if Google Play Services for AR is installed on the device + // If it's not installed, this method should get called twice: once to request the installation + // and once to ensure it was installed when the activity resumes + try { + when (ArCoreApk.getInstance().requestInstall(this, userRequestedInstall)) { + ArCoreApk.InstallStatus.INSTALL_REQUESTED -> { + userRequestedInstall = false + return + } + + ArCoreApk.InstallStatus.INSTALLED -> { + isGooglePlayServicesArInstalled.value = true + return + } + } + } catch (e: Exception) { + Log.e("ArTabletopApp", "Error checking Google Play Services for AR: ${e.message}") + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ArTabletopApp() { + Scaffold( + topBar = { TopAppBar(title = { Text("ArTabletopApp") }) } + ) { + Box(Modifier.padding(it)) { + MainScreen() + } + } +} diff --git a/microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/screens/MainScreen.kt b/microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/screens/MainScreen.kt new file mode 100644 index 000000000..074be6b78 --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/screens/MainScreen.kt @@ -0,0 +1,204 @@ +/* + * + * Copyright 2024 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.arcgismaps.toolkit.artabletopapp.screens + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.arcgismaps.LoadStatus +import com.arcgismaps.data.ArcGISFeature +import com.arcgismaps.geometry.Point +import com.arcgismaps.mapping.ArcGISScene +import com.arcgismaps.mapping.ElevationSource +import com.arcgismaps.mapping.Surface +import com.arcgismaps.mapping.layers.ArcGISSceneLayer +import com.arcgismaps.mapping.view.ScreenCoordinate +import com.arcgismaps.toolkit.ar.TableTopSceneView +import com.arcgismaps.toolkit.ar.TableTopSceneViewProxy +import com.arcgismaps.toolkit.ar.TableTopSceneViewStatus +import com.arcgismaps.toolkit.ar.rememberTableTopSceneViewStatus +import com.arcgismaps.toolkit.artabletopapp.R +import kotlinx.coroutines.launch + +@Composable +fun MainScreen() { + val arcGISSceneLayer = remember { + ArcGISSceneLayer("https://tiles.arcgis.com/tiles/P3ePLMYs2RVChkJx/arcgis/rest/services/DevA_BuildingShells/SceneServer") + } + val arcGISScene = remember { + ArcGISScene().apply { + operationalLayers.add(arcGISSceneLayer) + baseSurface = Surface().apply { + elevationSources.add( + ElevationSource.fromTerrain3dService() + ) + opacity = 0f + } + } + } + val arcGISSceneAnchor = remember { + Point(-122.68350326165559, 45.53257485106716, 0.0, arcGISScene.spatialReference) + } + + // Tracks the currently selected building + var identifiedBuilding by remember { mutableStateOf(null) } + + var initializationStatus: TableTopSceneViewStatus by rememberTableTopSceneViewStatus() + val tableTopSceneViewProxy = remember { TableTopSceneViewProxy() } + val coroutineScope = rememberCoroutineScope() + + Box(modifier = Modifier.fillMaxSize()) { + TableTopSceneView( + arcGISScene = arcGISScene, + arcGISSceneAnchor = arcGISSceneAnchor, + translationFactor = 400.0, + modifier = Modifier.fillMaxSize(), + clippingDistance = 400.0, + tableTopSceneViewProxy = tableTopSceneViewProxy, + onInitializationStatusChanged = { + initializationStatus = it + }, + onSingleTapConfirmed = { tap -> + arcGISSceneLayer.clearSelection() + coroutineScope.launch { + identifiedBuilding = arcGISSceneLayer.identifyBuilding( + tap.screenCoordinate, + tableTopSceneViewProxy + ) + identifiedBuilding?.let { identifiedBuilding -> + arcGISSceneLayer.selectFeature(identifiedBuilding.feature) + } + } + } + ) { + identifiedBuilding?.let { + Callout(it.location) { + Text("Building ID: ${it.feature.attributes["OBJECTID"]}") + } + } + } + } + + // Show an overlay with instructions or progress indicator based on the initialization status + when (val status = initializationStatus) { + is TableTopSceneViewStatus.Initializing -> TextWithScrim(text = stringResource(R.string.initializing_overlay)) + is TableTopSceneViewStatus.DetectingPlanes -> TextWithScrim(text = stringResource(R.string.detect_planes_overlay)) + is TableTopSceneViewStatus.Initialized -> { + val sceneLoadStatus = arcGISScene.loadStatus.collectAsStateWithLifecycle().value + when (sceneLoadStatus) { + is LoadStatus.NotLoaded -> { + // Tell the user to tap the screen if the scene has not started loading + TextWithScrim(text = stringResource(R.string.tap_scene_overlay)) + } + + is LoadStatus.Loading -> { + // The scene may take a while to load, so show a progress indicator + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + CircularProgressIndicator() + } + } + + is LoadStatus.FailedToLoad -> { + TextWithScrim( + text = stringResource( + R.string.failed_to_load_scene, + sceneLoadStatus.error + ) + ) + } + + LoadStatus.Loaded -> {} // Do nothing + } + } + + is TableTopSceneViewStatus.FailedToInitialize -> { + TextWithScrim( + text = stringResource( + R.string.failed_to_initialize_overlay, + status.error.message ?: status.error + ) + ) + } + } +} + +/** + * Displays the provided [text] on top of a half-transparent gray background. + * + * @since 200.6.0 + */ +@Composable +fun TextWithScrim(text: String) { + Column( + modifier = Modifier + .background(Color.Gray.copy(alpha = 0.5f)) + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text(text = text) + } +} + +/** + * Identifies the building at the given [screenCoordinate] and returns the identified building. + * If no feature is identified, or if no location can be found for the given [screenCoordinate], + * this function returns `null`. + * + * @since 200.6.0 + */ +private suspend fun ArcGISSceneLayer.identifyBuilding( + screenCoordinate: ScreenCoordinate, + proxy: TableTopSceneViewProxy +): IdentifiedBuilding? { + val identifyLayerResult = proxy.identify(this, screenCoordinate, 50.dp).getOrElse { + return null + } + val identifiedFeature = + identifyLayerResult.geoElements.firstOrNull() as? ArcGISFeature ?: return null + val identifiedPoint = proxy.screenToLocation(screenCoordinate).getOrNull() ?: return null + return IdentifiedBuilding(identifiedFeature, identifiedPoint) +} + +/** + * Represents a building feature along with the location in the scene where it was identified. + * + * @since 200.6.0 + */ +private data class IdentifiedBuilding(val feature: ArcGISFeature, val location: Point) diff --git a/microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/ui/theme/Color.kt b/microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/ui/theme/Color.kt new file mode 100644 index 000000000..a972158de --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/java/com/arcgismaps/toolkit/artabletopapp/ui/theme/Color.kt @@ -0,0 +1,29 @@ +/* + * + * Copyright 2024 Esri + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.arcgismaps.toolkit.artabletopapp.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) diff --git a/microapps/ArTabletopApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/microapps/ArTabletopApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..92971e871 --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + diff --git a/microapps/ArTabletopApp/app/src/main/res/drawable/ic_launcher_background.xml b/microapps/ArTabletopApp/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..b51b347d8 --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/microapps/ArTabletopApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/microapps/ArTabletopApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..6b4a339aa --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/microapps/ArTabletopApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/microapps/ArTabletopApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..6b4a339aa --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/microapps/ArTabletopApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/microapps/ArTabletopApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..c209e78ecd372343283f4157dcfd918ec5165bb3 GIT binary patch literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG literal 0 HcmV?d00001 diff --git a/microapps/ArTabletopApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/microapps/ArTabletopApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9 GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/microapps/ArTabletopApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/microapps/ArTabletopApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..4f0f1d64e58ba64d180ce43ee13bf9a17835fbca GIT binary patch literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i literal 0 HcmV?d00001 diff --git a/microapps/ArTabletopApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/microapps/ArTabletopApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..948a3070fe34c611c42c0d3ad3013a0dce358be0 GIT binary patch literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? literal 0 HcmV?d00001 diff --git a/microapps/ArTabletopApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/microapps/ArTabletopApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f GIT binary patch literal 3918 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�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp zwO~NVXwXCl;jE<}>%@xz|=8fIJAB?>+E{7)|4l${4ngA3G|=r z2Dyv;VVWSgZx9Wj>qUjleGl3Ei9K4>h!(lPS%8VOG>Xu0%6VDz^O=bjJmuP7>DeUv zrbI}MlHB^^d?{zv6d=@_ZD2lg1&G7UjnVN{1}9WkaM3H~btX0GtSzB+tZ^qRgWo4m z!GmimlG$=wgXCnr6j@m<1gAL46#T~5Bnm=2{^@>|t&`9mkEPddj zAvG~@Tv~TAm2i%VW}R-g(Z0)z-Y|szHr@rk>4MAyG*Ma*7Yh#H7(!-5>DZ@8r;_dx z{prSe<>~099F8vsYd2xff7uAS%7{S)f(|@me3t2$iy&NEc7OUEchp@9A|X;;IA>8!oX+y(BKJ$EzV* znR$z;!L$s7uy@{OT~nG#B!NRraT8(X##Ho!0r_o@gg0CA-9H^;-uE&?$2$nHv_00o z%cbuUc-tCx$Uh&EZ4Nf4Zgqv)Y6>usG3>GeQnxx_Z6+PcbX-+ysbt1hQ`K1LDpOE? zrAhIZhSN9yVIAOa22gn577tbc&i3|3V8NWy&!tw##`}9*x}gtI^h1DzZRA>UuaJG) zaZ7j)dq!O}{?#8Y7~7i6fHh4{`pL?>-18|p!S75Y#^DM>-S3)vuZG+Q7l@ek zQP~#cBpWgg#mApc_sPYjpw8odQuRokmTkzcNl`^CcKB7e&;zViV;{Y{o^Y$%7i0m# z62%#1Lq!RC?}lK>%mp}T!3Xv;L*0v*>USLm``N%>w>@fwC+#T&Tx2bN4w(20JB}oU zuSa6v^kXi0xPs?pbaOHnyiqq6By1EZY9OZ^^QA>{q-Hsd&m`pbQ%8121aWG-F5xf zlZ%;B{;C>X19|`^_?dVyCq>n+41w7|!tUS!{9rHlbhX=SZO5CQ^;!Du_E7*`GiR^Q w)2!4MKjfSAeNo!9>IaV6aUZ*?W>} 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s literal 0 HcmV?d00001 diff --git a/microapps/ArTabletopApp/app/src/main/res/values/colors.xml b/microapps/ArTabletopApp/app/src/main/res/values/colors.xml new file mode 100644 index 000000000..6c58071d0 --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/res/values/colors.xml @@ -0,0 +1,28 @@ + + + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + diff --git a/microapps/ArTabletopApp/app/src/main/res/values/strings.xml b/microapps/ArTabletopApp/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..c3e773f70 --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/res/values/strings.xml @@ -0,0 +1,29 @@ + + + + ArTabletopApp + Google Play Services for AR must be installed to run this app. + Initialization status: %1$s + Move your phone around to detect planes... + Lat: %1$s, Lon: %2$s + Tap on a plane to place the scene + Setting up AR... + Failed to initialize: %1$s + Failed to load scene: %1$s + diff --git a/microapps/ArTabletopApp/app/src/main/res/values/themes.xml b/microapps/ArTabletopApp/app/src/main/res/values/themes.xml new file mode 100644 index 000000000..697911fcf --- /dev/null +++ b/microapps/ArTabletopApp/app/src/main/res/values/themes.xml @@ -0,0 +1,23 @@ + + + + + +