Skip to content

Commit

Permalink
Update samples to Azure Spatial Anchors 2.0.0 (#85)
Browse files Browse the repository at this point in the history
  • Loading branch information
mschofie committed Nov 14, 2019
1 parent bb6802e commit a4e5e3a
Show file tree
Hide file tree
Showing 333 changed files with 18,813 additions and 7,101 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@
*.gz filter=lfs diff=lfs merge=lfs -text
*.7z filter=lfs diff=lfs merge=lfs -text
*.tar filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
6 changes: 3 additions & 3 deletions Android/Java/app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
apply plugin: 'com.android.application'

def azureSpatialAnchorsSdkVersion = '1.3.3'
def azureSpatialAnchorsSdkVersion = '2.0.0'

android {
compileSdkVersion 27
Expand Down Expand Up @@ -35,9 +35,9 @@ dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
//noinspection GradleDependency
implementation 'com.google.ar:core:1.8.0'
implementation 'com.google.ar:core:1.11.0'
//noinspection GradleDependency
implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.8.0'
implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.11.0'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation "com.microsoft.azure.spatialanchors:spatialanchors_jni:[${azureSpatialAnchorsSdkVersion}]"
implementation "com.microsoft.azure.spatialanchors:spatialanchors_java:[${azureSpatialAnchorsSdkVersion}]"
Expand Down
31 changes: 25 additions & 6 deletions Android/Java/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,17 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- Required for relocalization based on geolocation -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- Required for relocalization based on Wi-Fi -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<!-- Required for relocalization based on Bluetooth -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

<application
android:name=".SampleApplication"
android:allowBackup="true"
Expand All @@ -21,12 +32,6 @@
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".SharedActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:configChanges="orientation|screenSize"
android:screenOrientation="locked"
/>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand All @@ -46,6 +51,20 @@
android:configChanges="orientation|screenSize"
android:screenOrientation="locked"
/>
<activity
android:name=".SharedActivity"
android:label="SharedActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:configChanges="orientation|screenSize"
android:screenOrientation="locked"
/>
<activity
android:name=".CoarseRelocActivity"
android:label="CoarseRelocActivity"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:configChanges="orientation|screenSize"
android:screenOrientation="locked"
/>
</application>

</manifest>
Binary file modified Android/Java/app/src/main/assets/models/trigrid.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Android/Java/app/src/main/ic_launcher-web.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
package com.microsoft.sampleandroid;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ActionSelectionFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.coarse_reloc_action_selection, container, false);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
package com.microsoft.sampleandroid;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;

import com.microsoft.azure.spatialanchors.CloudSpatialAnchor;
import com.microsoft.azure.spatialanchors.CloudSpatialException;
import com.microsoft.azure.spatialanchors.SessionUpdatedEvent;

public class AnchorCreationFragment extends Fragment {
private AzureSpatialAnchorsManager cloudAnchorManager;
private AnchorCreationListener listener;
private boolean isCreatingAnchor = false;
private AnchorVisual placedVisual;

private Button createAnchorButton;
private ProgressBar requiredScanProgress;
private ProgressBar recommendedScanProgress;

public void setCloudAnchorManager(AzureSpatialAnchorsManager cloudAnchorManager) {
this.cloudAnchorManager = cloudAnchorManager;
}

public void setPlacement(AnchorVisual placedVisual) {
this.placedVisual = placedVisual;
}

public void setListener(AnchorCreationListener listener) {
this.listener = listener;
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.coarse_reloc_anchor_creation, container, false);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
createAnchorButton = (Button)view.findViewById(R.id.create_anchor);
requiredScanProgress = (ProgressBar)view.findViewById(R.id.required_scan_progress);
recommendedScanProgress = (ProgressBar)view.findViewById(R.id.recommended_scan_progress);
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (cloudAnchorManager == null) {
FragmentHelper.backToPreviousFragment(getActivity());
}
}

@Override
public void onStart() {
super.onStart();

createAnchorButton.setEnabled(false);
createAnchorButton.setOnClickListener(this::onCreateAnchorClicked);
cloudAnchorManager.addSessionUpdatedListener(this::onSessionUpdated);
}

@Override
public void onStop() {
if (cloudAnchorManager != null) {
cloudAnchorManager.removeSessionUpdatedListener(this::onSessionUpdated);
}

if (placedVisual != null) {
placedVisual.destroy();
placedVisual = null;
}

super.onStop();
}

private boolean canCreateAnchor() {
return !isCreatingAnchor && placedVisual != null;
}

private void onSessionUpdated(SessionUpdatedEvent sessionUpdatedEvent) {
float requiredForCreateProgress = sessionUpdatedEvent.getStatus().getReadyForCreateProgress();
float recommendedForCreateProgress = sessionUpdatedEvent.getStatus().getRecommendedForCreateProgress();
MainThreadContext.runOnUiThread(() -> {
requiredScanProgress.setProgress((int)(100 * requiredForCreateProgress));
recommendedScanProgress.setProgress((int)(100 * recommendedForCreateProgress));
boolean allowCreation = canCreateAnchor() && requiredForCreateProgress >= 1.0f;
createAnchorButton.setEnabled(allowCreation);
});
}

private void onCreateAnchorClicked(View view) {
if (!canCreateAnchor()) {
return;
}

createAnchorButton.setEnabled(false);
CloudSpatialAnchor cloudAnchor = new CloudSpatialAnchor();
cloudAnchor.setLocalAnchor(placedVisual.getLocalAnchor());
cloudAnchor.getAppProperties().put("Shape", placedVisual.getShape().toString());

isCreatingAnchor = true;
cloudAnchorManager
.createAnchorAsync(cloudAnchor)
.whenComplete((anchor, thrown) -> {
MainThreadContext.runOnUiThread(() -> {
isCreatingAnchor = false;
if (placedVisual == null) {
return;
}

if (thrown != null) {
if (listener != null) {
String errorMessage = getErrorMessageFromThrowable(thrown);
listener.onAnchorCreationFailed(placedVisual, errorMessage);
}
return;
}

AnchorVisual createdAnchor = placedVisual;
placedVisual = null;
if (listener != null) {
listener.onAnchorCreated(createdAnchor);
}
});
});
}

private String getErrorMessageFromThrowable(Throwable thrown) {
Throwable originalException = thrown;
while (originalException != null && !(originalException instanceof CloudSpatialException)) {
originalException = originalException.getCause();
}
if (originalException != null) {
CloudSpatialException azureSpatialAnchorsException = (CloudSpatialException) originalException;
return azureSpatialAnchorsException.getErrorCode().toString();
} else {
return thrown.toString();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
package com.microsoft.sampleandroid;

interface AnchorCreationListener {
void onAnchorCreated(AnchorVisual createdAnchor);
void onAnchorCreationFailed(AnchorVisual placedAnchor, String errorMessage);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
package com.microsoft.sampleandroid;

import com.microsoft.azure.spatialanchors.CloudSpatialAnchor;

interface AnchorDiscoveryListener {
void onAnchorDiscovered(CloudSpatialAnchor cloudAnchor);
}
Loading

0 comments on commit a4e5e3a

Please sign in to comment.