diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8e033ffba..1cc6377e2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,26 +15,26 @@ androidxTestExt = "1.2.1" androidXTestRunner = "1.6.2" androidXTestRules = "1.6.1" androidxWindow = "1.3.0" -binaryCompatibilityValidator = "0.14.0" +binaryCompatibilityValidator = "0.17.0" compileSdk = "35" compose-navigation = "2.8.4" commonMark = "0.22.0" dokka = "1.9.20" -hilt = "2.49" +hilt = "2.55" hiltExt = "1.2.0" junit = "4.13.2" -kotlin = "2.0.20" +kotlin = "2.1.0" ksp = "2.0.20-1.0.24" media3Exoplayer = "1.5.0" minSdk = "26" mlkitBarcodeScanning = "17.3.0" kotlinxCoroutinesTest = "1.8.0" -kotlinxSerializationJson = "1.6.3" +kotlinxSerializationJson = "1.8.0" mockkAndroid = "1.13.12" room = "2.6.1" truth = "1.4.4" uiautomator = "2.3.0" -arcore = "1.46.0" +arcore = "1.47.0" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose"} diff --git a/microapps/ArWorldScaleApp/.gitignore b/microapps/ArWorldScaleApp/.gitignore new file mode 100644 index 000000000..aa724b770 --- /dev/null +++ b/microapps/ArWorldScaleApp/.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/ArWorldScaleApp/app/.gitignore b/microapps/ArWorldScaleApp/app/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/microapps/ArWorldScaleApp/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/microapps/ArWorldScaleApp/app/build.gradle.kts b/microapps/ArWorldScaleApp/app/build.gradle.kts new file mode 100644 index 000000000..fd4404dce --- /dev/null +++ b/microapps/ArWorldScaleApp/app/build.gradle.kts @@ -0,0 +1,96 @@ +/* + * + * Copyright 2025 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.arworldscaleapp" + compileSdk = libs.versions.compileSdk.get().toInt() + + defaultConfig { + applicationId ="com.arcgismaps.toolkit.arworldscaleapp" + 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}" + } + } + + // Avoids an empty test report showing up in the CI integration test report. + // Remove this if tests will be added. + tasks.withType { + enabled = false + } +} + +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) + testImplementation(libs.bundles.unitTest) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.bundles.composeTest) + debugImplementation(libs.bundles.debug) +} diff --git a/microapps/ArWorldScaleApp/app/proguard-rules.pro b/microapps/ArWorldScaleApp/app/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/microapps/ArWorldScaleApp/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/ArWorldScaleApp/app/src/main/AndroidManifest.xml b/microapps/ArWorldScaleApp/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..c79d6614d --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/AndroidManifest.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/microapps/ArWorldScaleApp/app/src/main/java/com/arcgismaps/toolkit/arworldscaleapp/MainActivity.kt b/microapps/ArWorldScaleApp/app/src/main/java/com/arcgismaps/toolkit/arworldscaleapp/MainActivity.kt new file mode 100644 index 000000000..01afb6d40 --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/java/com/arcgismaps/toolkit/arworldscaleapp/MainActivity.kt @@ -0,0 +1,103 @@ +/* + * + * Copyright 2025 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.arworldscaleapp + +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.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.arworldscaleapp.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) + ArcGISEnvironment.applicationContext = applicationContext + setContent { + MicroAppTheme { + if (isGooglePlayServicesArInstalled.collectAsStateWithLifecycle().value) { + ArWorldScaleApp() + } 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("ArWorldScaleApp", "Error checking Google Play Services for AR: ${e.message}") + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ArWorldScaleApp() { + Scaffold( + topBar = { TopAppBar(title = { Text("ArWorldScaleApp") }) } + ) { + Box(Modifier.padding(it)) { + MainScreen() + } + } +} diff --git a/microapps/ArWorldScaleApp/app/src/main/java/com/arcgismaps/toolkit/arworldscaleapp/screens/MainScreen.kt b/microapps/ArWorldScaleApp/app/src/main/java/com/arcgismaps/toolkit/arworldscaleapp/screens/MainScreen.kt new file mode 100644 index 000000000..85712675b --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/java/com/arcgismaps/toolkit/arworldscaleapp/screens/MainScreen.kt @@ -0,0 +1,191 @@ +/* + * + * Copyright 2025 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.arworldscaleapp.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.foundation.layout.padding +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +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.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.arcgismaps.Color +import com.arcgismaps.LoadStatus +import com.arcgismaps.mapping.ArcGISScene +import com.arcgismaps.mapping.Basemap +import com.arcgismaps.mapping.BasemapStyle +import com.arcgismaps.mapping.ElevationSource +import com.arcgismaps.mapping.Viewpoint +import com.arcgismaps.mapping.layers.ArcGISSceneLayer +import com.arcgismaps.mapping.symbology.SimpleMarkerSceneSymbol +import com.arcgismaps.mapping.symbology.SimpleMarkerSceneSymbolStyle +import com.arcgismaps.mapping.view.Graphic +import com.arcgismaps.mapping.view.GraphicsOverlay +import com.arcgismaps.toolkit.ar.WorldScaleSceneView +import com.arcgismaps.toolkit.ar.WorldScaleSceneViewProxy +import com.arcgismaps.toolkit.ar.WorldScaleSceneViewStatus +import com.arcgismaps.toolkit.ar.rememberWorldScaleSceneViewStatus +import com.arcgismaps.toolkit.arworldscaleapp.R + +@Composable +fun MainScreen() { + val arcGISScene = remember { + val basemap = Basemap(BasemapStyle.ArcGISHumanGeography).apply { + // Clear the base layer so we only see the street and building outlines and labels + baseLayers.clear() + } + ArcGISScene(basemap).apply { + initialViewpoint = Viewpoint( + latitude = 39.8, + longitude = -98.6, + scale = 10e7 + ) + // an elevation source is required for the scene to be placed at the correct elevation + // if not used, the scene may appear far below the device position because the device position + // is calculated with elevation + baseSurface.elevationSources.add(ElevationSource.fromTerrain3dService()) + baseSurface.backgroundGrid.isVisible = false + baseSurface.opacity = 0.3f + // add the Esri 3D Buildings layer + operationalLayers.add( + ArcGISSceneLayer("https://www.arcgis.com/home/item.html?id=b8fec5af7dfe4866b1b8ac2d2800f282") + ) + } + } + var displayCalibrationView by remember { mutableStateOf(false) } + val graphicsOverlays = remember { listOf(GraphicsOverlay()) } + val proxy = remember { WorldScaleSceneViewProxy() } + var initializationStatus by rememberWorldScaleSceneViewStatus() + + Box(modifier = Modifier.fillMaxSize()) { + WorldScaleSceneView( + arcGISScene = arcGISScene, + modifier = Modifier.fillMaxSize(), + onInitializationStatusChanged = { + initializationStatus = it + }, + worldScaleSceneViewProxy = proxy, + onSingleTapConfirmed = { singleTapConfirmedEvent -> + proxy.screenToBaseSurface(singleTapConfirmedEvent.screenCoordinate)?.let { point -> + graphicsOverlays.first().graphics.add( + Graphic( + point, + SimpleMarkerSceneSymbol( + SimpleMarkerSceneSymbolStyle.Diamond, + Color.green, + height = 1.0, + width = 1.0, + depth = 1.0 + ) + ) + ) + } + }, + graphicsOverlays = graphicsOverlays + ) { + Box(modifier = Modifier.fillMaxSize()) { + if (displayCalibrationView) { + CalibrationView( + onDismiss = { displayCalibrationView = false }, + modifier = Modifier.align(Alignment.BottomCenter), + ) + } else { + FloatingActionButton( + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(32.dp), + onClick = { displayCalibrationView = true }) { + Icon( + painter = painterResource(R.drawable.baseline_straighten_24), + contentDescription = stringResource(R.string.calibration_view_button_description) + ) + } + } + } + } + + when (val status = initializationStatus) { + is WorldScaleSceneViewStatus.Initializing -> { + TextWithScrim(text = stringResource(R.string.ar_initializing)) + } + + is WorldScaleSceneViewStatus.Initialized -> { + val sceneLoadStatus = arcGISScene.loadStatus.collectAsStateWithLifecycle().value + when (sceneLoadStatus) { + is LoadStatus.Loading, LoadStatus.NotLoaded -> { + // The scene may take a while to load, so show a progress indicator + CircularProgressIndicator(modifier = Modifier.align(Alignment.Center)) + } + + is LoadStatus.FailedToLoad -> { + TextWithScrim( + text = stringResource( + R.string.failed_to_load_scene, + sceneLoadStatus.error + ) + ) + } + + else -> {} + } + } + + is WorldScaleSceneViewStatus.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(androidx.compose.ui.graphics.Color.Gray.copy(alpha = 0.5f)) + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text(text = text) + } +} diff --git a/microapps/ArWorldScaleApp/app/src/main/java/com/arcgismaps/toolkit/arworldscaleapp/ui/theme/Color.kt b/microapps/ArWorldScaleApp/app/src/main/java/com/arcgismaps/toolkit/arworldscaleapp/ui/theme/Color.kt new file mode 100644 index 000000000..05fa90e5d --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/java/com/arcgismaps/toolkit/arworldscaleapp/ui/theme/Color.kt @@ -0,0 +1,29 @@ +/* + * + * Copyright 2025 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.arworldscaleapp.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/ArWorldScaleApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/microapps/ArWorldScaleApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..68c82a860 --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + diff --git a/microapps/ArWorldScaleApp/app/src/main/res/drawable/baseline_straighten_24.xml b/microapps/ArWorldScaleApp/app/src/main/res/drawable/baseline_straighten_24.xml new file mode 100644 index 000000000..235bc3e9f --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/res/drawable/baseline_straighten_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/microapps/ArWorldScaleApp/app/src/main/res/drawable/ic_launcher_background.xml b/microapps/ArWorldScaleApp/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..9455d6d31 --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..96082265f --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..96082265f --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 000000000..c209e78ec Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 000000000..b2dfe3d1b Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 000000000..4f0f1d64e Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 000000000..62b611da0 Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 000000000..948a3070f Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 000000000..1b9a6956b Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 000000000..28d4b77f9 Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 000000000..9287f5083 Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 000000000..aa7d6427e Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 000000000..9126ae37c Binary files /dev/null and b/microapps/ArWorldScaleApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/microapps/ArWorldScaleApp/app/src/main/res/values/colors.xml b/microapps/ArWorldScaleApp/app/src/main/res/values/colors.xml new file mode 100644 index 000000000..1e8023b93 --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/res/values/colors.xml @@ -0,0 +1,28 @@ + + + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + diff --git a/microapps/ArWorldScaleApp/app/src/main/res/values/strings.xml b/microapps/ArWorldScaleApp/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..f424bc5f7 --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/res/values/strings.xml @@ -0,0 +1,26 @@ + + + + ArWorldScaleApp + Google Play Services for AR must be installed to run this app. + Show Calibration View + Setting up AR… + Failed to load scene: %1$s + Failed to initialize: %1$s + diff --git a/microapps/ArWorldScaleApp/app/src/main/res/values/themes.xml b/microapps/ArWorldScaleApp/app/src/main/res/values/themes.xml new file mode 100644 index 000000000..ec2536ea9 --- /dev/null +++ b/microapps/ArWorldScaleApp/app/src/main/res/values/themes.xml @@ -0,0 +1,23 @@ + + + + + +