diff --git a/.gitignore b/.gitignore
index dc42d53..5edb4ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,10 @@
-*.iml
-.gradle
-/local.properties
-/.idea/libraries
-/.idea/modules.xml
-/.idea/workspace.xml
-.DS_Store
-/build
-/captures
-.externalNativeBuild
+*.iml
+.gradle
+/local.properties
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml
new file mode 100644
index 0000000..aff33aa
--- /dev/null
+++ b/.idea/assetWizardSettings.xml
@@ -0,0 +1,335 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser
index 1e096bd..938eaeb 100644
Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 4635fa6..db291c6 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,131 +1,131 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- xmlns:android
-
- ^$
-
-
-
-
-
-
-
-
- xmlns:.*
-
- ^$
-
-
- BY_NAME
-
-
-
-
-
-
- .*:id
-
- http://schemas.android.com/apk/res/android
-
-
-
-
-
-
-
-
- .*:name
-
- http://schemas.android.com/apk/res/android
-
-
-
-
-
-
-
-
- name
-
- ^$
-
-
-
-
-
-
-
-
- style
-
- ^$
-
-
-
-
-
-
-
-
- .*
-
- ^$
-
-
- BY_NAME
-
-
-
-
-
-
- .*
-
- http://schemas.android.com/apk/res/android
-
-
- ANDROID_ATTRIBUTE_ORDER
-
-
-
-
-
-
- .*
-
- .*
-
-
- BY_NAME
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..fb7f4a8
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index d1543e7..82a769a 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -1,21 +1,21 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4ddb49f..021ee89 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,48 +1,63 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/render.experimental.xml b/.idea/render.experimental.xml
new file mode 100644
index 0000000..8ec256a
--- /dev/null
+++ b/.idea/render.experimental.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index 9b770a6..0000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_1_21_2021_11_16_PM_[Default_Changelist]/shelved.patch b/.idea/shelf/Uncommitted_changes_before_Update_at_1_21_2021_11_16_PM_[Default_Changelist]/shelved.patch
new file mode 100644
index 0000000..09f6242
--- /dev/null
+++ b/.idea/shelf/Uncommitted_changes_before_Update_at_1_21_2021_11_16_PM_[Default_Changelist]/shelved.patch
@@ -0,0 +1,17 @@
+Index: .idea/gradle.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
+<+>\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+--- .idea/gradle.xml (revision eaeef7439ade40336448f7ffd4d9ba0394b6a91b)
++++ .idea/gradle.xml (date 1611267296385)
+@@ -15,6 +15,7 @@
+
+
+
++
+
+
+
diff --git a/.idea/shelf/Uncommitted_changes_before_Update_at_1_21_2021_11_16_PM__Default_Changelist_.xml b/.idea/shelf/Uncommitted_changes_before_Update_at_1_21_2021_11_16_PM__Default_Changelist_.xml
new file mode 100644
index 0000000..f965422
--- /dev/null
+++ b/.idea/shelf/Uncommitted_changes_before_Update_at_1_21_2021_11_16_PM__Default_Changelist_.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
index 3543521..796b96d 100644
--- a/app/.gitignore
+++ b/app/.gitignore
@@ -1 +1 @@
-/build
+/build
diff --git a/app/build.gradle b/app/build.gradle
index 39c9a41..76a3638 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,65 +1,80 @@
-apply plugin: 'com.android.application'
-
-apply plugin: 'com.google.gms.google-services'
-
-android {
- compileSdkVersion 30
- defaultConfig {
- applicationId "jtheiner.drawingclassification"
- minSdkVersion 24
- targetSdkVersion 30
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
- ndk{
- moduleName "gltf-lib"
- abiFilters "armeabi", "armeabi-v7a", "x86"
- }
- }
- // Sceneform libraries use language constructs from Java 8.
- // Add these compile options if targeting minSdkVersion < 26.
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
-
- aaptOptions {
- noCompress "tflite"
- noCompress "lite"
- }
-}
-
-repositories {
- maven {
- url 'https://google.bintray.com/tensorflow'
- }
- google()
-}
-
-
-
-dependencies {
- implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'com.google.android.material:material:1.2.1'
- implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
-
- testImplementation 'junit:junit:4.13'
- androidTestImplementation 'androidx.test.ext:junit:1.1.2'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
-
- implementation 'org.tensorflow:tensorflow-lite:+'
-
- implementation 'com.google.firebase:firebase-analytics:17.5.0'
- implementation 'com.google.firebase:firebase-storage:19.2.0'
-
- implementation project(':engine')
-
-}
-
+apply plugin: 'com.android.application'
+
+apply plugin: 'com.google.gms.google-services'
+
+
+
+android {
+ signingConfigs {
+ release {
+ storeFile file(RELEASE_STORE_FILE)
+ storePassword RELEASE_STORE_PASSWORD
+ keyAlias RELEASE_KEY_ALIAS
+ keyPassword RELEASE_KEY_PASSWORD
+
+ // Optional, specify signing versions used
+ v1SigningEnabled true
+ v2SigningEnabled true
+ }
+ }
+ compileSdkVersion 30
+ buildToolsVersion "30.0.3"
+ defaultConfig {
+ applicationId "com.s23d"
+ minSdkVersion 24
+ targetSdkVersion 30
+ versionCode 3
+ versionName "Native Penguine"
+ testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
+ ndk{
+ debugSymbolLevel 'FULL'
+ moduleName "gltf-lib"
+ abiFilters "armeabi", "armeabi-v7a", "arm64-v8a"
+ }
+ }
+ // Sceneform libraries use language constructs from Java 8.
+ // Add these compile options if targeting minSdkVersion < 26.
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ aaptOptions {
+ noCompress "tflite"
+ noCompress "lite"
+ }
+}
+
+repositories {
+ maven {
+ url 'https://google.bintray.com/tensorflow'
+ }
+ google()
+}
+
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation 'androidx.appcompat:appcompat:1.3.1'
+ implementation 'com.google.android.material:material:1.4.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
+
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
+
+ implementation 'org.tensorflow:tensorflow-lite:2.6.0'
+
+ implementation 'com.google.firebase:firebase-analytics:19.0.1'
+ implementation 'com.google.firebase:firebase-storage:20.0.0'
+
+ implementation project(':engine')
+
+}
+
diff --git a/app/google-services.json b/app/google-services.json
index 7ea3f13..692e296 100644
--- a/app/google-services.json
+++ b/app/google-services.json
@@ -8,12 +8,20 @@
"client": [
{
"client_info": {
- "mobilesdk_app_id": "1:638820007020:android:7e3f8e4975da7d0d22ac49",
+ "mobilesdk_app_id": "1:638820007020:android:f952229e1a6f0c0222ac49",
"android_client_info": {
- "package_name": "jtheiner.drawingclassification"
+ "package_name": "com.s23d"
}
},
"oauth_client": [
+ {
+ "client_id": "638820007020-6390r5c5puann0kpmsu47vmlmbt6hr7c.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "com.s23d",
+ "certificate_hash": "f1d0259d2233678e9bcf8ef6289e64bc1244d23c"
+ }
+ },
{
"client_id": "638820007020-02cnvq12smju4lkbvhg6036d65f9tqah.apps.googleusercontent.com",
"client_type": 3
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 6e7ffa9..f1b4245 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -1,21 +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
+# 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/app/release/app-release.apk b/app/release/app-release.apk
new file mode 100644
index 0000000..34a2648
Binary files /dev/null and b/app/release/app-release.apk differ
diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json
new file mode 100644
index 0000000..4b68d98
--- /dev/null
+++ b/app/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.s23d",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 1,
+ "versionName": "1.0",
+ "outputFile": "app-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/app/src/androidTest/java/jtheiner/drawingclassification/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/s23d/ExampleInstrumentedTest.java
similarity index 53%
rename from app/src/androidTest/java/jtheiner/drawingclassification/ExampleInstrumentedTest.java
rename to app/src/androidTest/java/com/s23d/ExampleInstrumentedTest.java
index 4382ccf..3660a74 100644
--- a/app/src/androidTest/java/jtheiner/drawingclassification/ExampleInstrumentedTest.java
+++ b/app/src/androidTest/java/com/s23d/ExampleInstrumentedTest.java
@@ -1,26 +1,27 @@
-package jtheiner.drawingclassification;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.*;
-
-/**
- * Instrumented test, which will execute on an Android device.
- *
- * @see Testing documentation
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
- @Test
- public void useAppContext() {
- // Context of the app under test.
- Context appContext = InstrumentationRegistry.getTargetContext();
-
- assertEquals("jtheiner.drawingclassification", appContext.getPackageName());
- }
-}
+package com.s23d;
+
+import android.content.Context;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+ assertEquals("com.s23d", appContext.getPackageName());
+ }
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6371aeb..aa2ca26 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,27 +1,31 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/10/labels.csv b/app/src/main/assets/10/labels.csv
index eff1ceb..350f3d8 100644
--- a/app/src/main/assets/10/labels.csv
+++ b/app/src/main/assets/10/labels.csv
@@ -1,10 +1,10 @@
-0,sailboat
-1,pliers
-2,see saw
-3,garden hose
-4,cactus
-5,eyeglasses
-6,nose
-7,stairs
-8,envelope
-9,bucket
+0,sailboat
+1,pliers
+2,see saw
+3,garden hose
+4,cactus
+5,eyeglasses
+6,nose
+7,stairs
+8,envelope
+9,bucket
diff --git a/app/src/main/assets/100/labels.csv b/app/src/main/assets/100/labels.csv
index 1e6f8c1..52f035c 100644
--- a/app/src/main/assets/100/labels.csv
+++ b/app/src/main/assets/100/labels.csv
@@ -1,100 +1,100 @@
-0,sailboat
-1,pliers
-2,see saw
-3,garden hose
-4,cactus
-5,eyeglasses
-6,nose
-7,stairs
-8,envelope
-9,bucket
-10,fireplace
-11,swing set
-12,lantern
-13,banana
-14,spreadsheet
-15,elephant
-16,fish
-17,helicopter
-18,axe
-19,cell phone
-20,hammer
-21,string bean
-22,donut
-23,star
-24,radio
-25,cat
-26,diamond
-27,frog
-28,broom
-29,coffee cup
-30,speedboat
-31,paper clip
-32,bicycle
-33,map
-34,baseball
-35,tennis racquet
-36,line
-37,dishwasher
-38,paintbrush
-39,fork
-40,teddy-bear
-41,The Mona Lisa
-42,clarinet
-43,flamingo
-44,couch
-45,rainbow
-46,bed
-47,lipstick
-48,parrot
-49,ladder
-50,syringe
-51,violin
-52,megaphone
-53,car
-54,cookie
-55,rollerskates
-56,anvil
-57,goatee
-58,teapot
-59,octagon
-60,hospital
-61,bridge
-62,leg
-63,skull
-64,ear
-65,mushroom
-66,chandelier
-67,pool
-68,crown
-69,apple
-70,golf club
-71,potato
-72,calendar
-73,book
-74,trombone
-75,stove
-76,scorpion
-77,blackberry
-78,circle
-79,sheep
-80,sandwich
-81,bird
-82,bowtie
-83,wine bottle
-84,postcard
-85,power outlet
-86,chair
-87,hedgehog
-88,pants
-89,bread
-90,microwave
-91,t-shirt
-92,rabbit
-93,guitar
-94,dog
-95,bulldozer
-96,bus
-97,light bulb
-98,computer
-99,hexagon
+0,sailboat
+1,pliers
+2,see saw
+3,garden hose
+4,cactus
+5,eyeglasses
+6,nose
+7,stairs
+8,envelope
+9,bucket
+10,fireplace
+11,swing set
+12,lantern
+13,banana
+14,spreadsheet
+15,elephant
+16,fish
+17,helicopter
+18,axe
+19,cell phone
+20,hammer
+21,string bean
+22,donut
+23,star
+24,radio
+25,cat
+26,diamond
+27,frog
+28,broom
+29,coffee cup
+30,speedboat
+31,paper clip
+32,bicycle
+33,map
+34,baseball
+35,tennis racquet
+36,line
+37,dishwasher
+38,paintbrush
+39,fork
+40,teddy-bear
+41,The Mona Lisa
+42,clarinet
+43,flamingo
+44,couch
+45,rainbow
+46,bed
+47,lipstick
+48,parrot
+49,ladder
+50,syringe
+51,violin
+52,megaphone
+53,car
+54,cookie
+55,rollerskates
+56,anvil
+57,goatee
+58,teapot
+59,octagon
+60,hospital
+61,bridge
+62,leg
+63,skull
+64,ear
+65,mushroom
+66,chandelier
+67,pool
+68,crown
+69,apple
+70,golf club
+71,potato
+72,calendar
+73,book
+74,trombone
+75,stove
+76,scorpion
+77,blackberry
+78,circle
+79,sheep
+80,sandwich
+81,bird
+82,bowtie
+83,wine bottle
+84,postcard
+85,power outlet
+86,chair
+87,hedgehog
+88,pants
+89,bread
+90,microwave
+91,t-shirt
+92,rabbit
+93,guitar
+94,dog
+95,bulldozer
+96,bus
+97,light bulb
+98,computer
+99,hexagon
diff --git a/app/src/main/assets/345/labels.csv b/app/src/main/assets/345/labels.csv
index c39b4a5..a071aa0 100644
--- a/app/src/main/assets/345/labels.csv
+++ b/app/src/main/assets/345/labels.csv
@@ -1,345 +1,345 @@
-0,sailboat
-1,pliers
-2,see saw
-3,garden hose
-4,cactus
-5,eyeglasses
-6,nose
-7,stairs
-8,envelope
-9,bucket
-10,fireplace
-11,swing set
-12,lantern
-13,banana
-14,spreadsheet
-15,elephant
-16,fish
-17,helicopter
-18,axe
-19,cell phone
-20,hammer
-21,string bean
-22,donut
-23,star
-24,radio
-25,cat
-26,diamond
-27,frog
-28,broom
-29,coffee cup
-30,speedboat
-31,paper clip
-32,bicycle
-33,map
-34,baseball
-35,tennis racquet
-36,line
-37,dishwasher
-38,paintbrush
-39,fork
-40,teddy-bear
-41,The Mona Lisa
-42,clarinet
-43,flamingo
-44,couch
-45,rainbow
-46,bed
-47,lipstick
-48,parrot
-49,ladder
-50,syringe
-51,violin
-52,megaphone
-53,car
-54,cookie
-55,rollerskates
-56,anvil
-57,goatee
-58,teapot
-59,octagon
-60,hospital
-61,bridge
-62,leg
-63,skull
-64,ear
-65,mushroom
-66,chandelier
-67,pool
-68,crown
-69,apple
-70,golf club
-71,potato
-72,calendar
-73,book
-74,trombone
-75,stove
-76,scorpion
-77,blackberry
-78,circle
-79,sheep
-80,sandwich
-81,bird
-82,bowtie
-83,wine bottle
-84,postcard
-85,power outlet
-86,chair
-87,hedgehog
-88,pants
-89,bread
-90,microwave
-91,t-shirt
-92,rabbit
-93,guitar
-94,dog
-95,bulldozer
-96,bus
-97,light bulb
-98,computer
-99,hexagon
-100,beach
-101,skateboard
-102,barn
-103,jail
-104,waterslide
-105,cooler
-106,traffic light
-107,hand
-108,harp
-109,moon
-110,toe
-111,vase
-112,cello
-113,remote control
-114,truck
-115,microphone
-116,underwear
-117,rifle
-118,drill
-119,square
-120,knee
-121,giraffe
-122,snail
-123,camouflage
-124,table
-125,alarm clock
-126,camel
-127,shorts
-128,lighthouse
-129,suitcase
-130,bottlecap
-131,tractor
-132,carrot
-133,hockey puck
-134,dumbbell
-135,shoe
-136,The Great Wall of China
-137,campfire
-138,foot
-139,flip flops
-140,monkey
-141,helmet
-142,bandage
-143,bench
-144,stethoscope
-145,grass
-146,mermaid
-147,laptop
-148,hot air balloon
-149,floor lamp
-150,cow
-151,dolphin
-152,asparagus
-153,motorbike
-154,skyscraper
-155,strawberry
-156,umbrella
-157,brain
-158,mouth
-159,zebra
-160,jacket
-161,triangle
-162,hurricane
-163,bracelet
-164,pineapple
-165,rake
-166,steak
-167,baseball bat
-168,arm
-169,popsicle
-170,flying saucer
-171,mouse
-172,horse
-173,crab
-174,piano
-175,river
-176,castle
-177,compass
-178,binoculars
-179,ceiling fan
-180,airplane
-181,scissors
-182,garden
-183,bush
-184,bathtub
-185,clock
-186,drums
-187,lobster
-188,flower
-189,diving board
-190,toothbrush
-191,saw
-192,sea turtle
-193,squiggle
-194,tooth
-195,mountain
-196,sword
-197,aircraft carrier
-198,necklace
-199,cup
-200,wine glass
-201,lighter
-202,elbow
-203,blueberry
-204,snowman
-205,broccoli
-206,sun
-207,television
-208,sock
-209,pig
-210,key
-211,parachute
-212,hot tub
-213,shark
-214,washing machine
-215,hat
-216,windmill
-217,frying pan
-218,fire hydrant
-219,toothpaste
-220,belt
-221,beard
-222,rhinoceros
-223,headphones
-224,matches
-225,knife
-226,snorkel
-227,feather
-228,duck
-229,pond
-230,paint can
-231,firetruck
-232,angel
-233,bear
-234,passport
-235,cake
-236,telephone
-237,mosquito
-238,hamburger
-239,pencil
-240,peas
-241,ant
-242,eye
-243,mailbox
-244,grapes
-245,canoe
-246,pillow
-247,The Eiffel Tower
-248,sink
-249,backpack
-250,octopus
-251,finger
-252,snowflake
-253,tent
-254,nail
-255,submarine
-256,wheel
-257,church
-258,toilet
-259,purse
-260,penguin
-261,bee
-262,streetlight
-263,van
-264,boomerang
-265,train
-266,peanut
-267,stop sign
-268,basket
-269,wristwatch
-270,ice cream
-271,pizza
-272,crocodile
-273,lollipop
-274,hockey stick
-275,soccer ball
-276,dragon
-277,camera
-278,cannon
-279,zigzag
-280,spoon
-281,pickup truck
-282,ocean
-283,bat
-284,stitches
-285,shovel
-286,palm tree
-287,mug
-288,hot dog
-289,fan
-290,sweater
-291,cruise ship
-292,cloud
-293,whale
-294,police car
-295,saxophone
-296,squirrel
-297,smiley face
-298,owl
-299,house
-300,school bus
-301,yoga
-302,spider
-303,flashlight
-304,tree
-305,swan
-306,panda
-307,ambulance
-308,calculator
-309,pear
-310,trumpet
-311,lightning
-312,animal migration
-313,dresser
-314,basketball
-315,birthday cake
-316,leaf
-317,oven
-318,house plant
-319,keyboard
-320,eraser
-321,sleeping bag
-322,moustache
-323,door
-324,hourglass
-325,crayon
-326,stereo
-327,fence
-328,roller coaster
-329,onion
-330,marker
-331,tiger
-332,screwdriver
-333,watermelon
-334,lion
-335,butterfly
-336,toaster
-337,raccoon
-338,picture frame
-339,candle
-340,face
-341,kangaroo
-342,snake
-343,tornado
-344,rain
+0,sailboat
+1,pliers
+2,see saw
+3,garden hose
+4,cactus
+5,eyeglasses
+6,nose
+7,stairs
+8,envelope
+9,bucket
+10,fireplace
+11,swing set
+12,lantern
+13,banana
+14,spreadsheet
+15,elephant
+16,fish
+17,helicopter
+18,axe
+19,cell phone
+20,hammer
+21,string bean
+22,donut
+23,star
+24,radio
+25,cat
+26,diamond
+27,frog
+28,broom
+29,coffee cup
+30,speedboat
+31,paper clip
+32,bicycle
+33,map
+34,baseball
+35,tennis racquet
+36,line
+37,dishwasher
+38,paintbrush
+39,fork
+40,teddy-bear
+41,The Mona Lisa
+42,clarinet
+43,flamingo
+44,couch
+45,rainbow
+46,bed
+47,lipstick
+48,parrot
+49,ladder
+50,syringe
+51,violin
+52,megaphone
+53,car
+54,cookie
+55,rollerskates
+56,anvil
+57,goatee
+58,teapot
+59,octagon
+60,hospital
+61,bridge
+62,leg
+63,skull
+64,ear
+65,mushroom
+66,chandelier
+67,pool
+68,crown
+69,apple
+70,golf club
+71,potato
+72,calendar
+73,book
+74,trombone
+75,stove
+76,scorpion
+77,blackberry
+78,circle
+79,sheep
+80,sandwich
+81,bird
+82,bowtie
+83,wine bottle
+84,postcard
+85,power outlet
+86,chair
+87,hedgehog
+88,pants
+89,bread
+90,microwave
+91,t-shirt
+92,rabbit
+93,guitar
+94,dog
+95,bulldozer
+96,bus
+97,light bulb
+98,computer
+99,hexagon
+100,beach
+101,skateboard
+102,barn
+103,jail
+104,waterslide
+105,cooler
+106,traffic light
+107,hand
+108,harp
+109,moon
+110,toe
+111,vase
+112,cello
+113,remote control
+114,truck
+115,microphone
+116,underwear
+117,rifle
+118,drill
+119,square
+120,knee
+121,giraffe
+122,snail
+123,camouflage
+124,table
+125,alarm clock
+126,camel
+127,shorts
+128,lighthouse
+129,suitcase
+130,bottlecap
+131,tractor
+132,carrot
+133,hockey puck
+134,dumbbell
+135,shoe
+136,The Great Wall of China
+137,campfire
+138,foot
+139,flip flops
+140,monkey
+141,helmet
+142,bandage
+143,bench
+144,stethoscope
+145,grass
+146,mermaid
+147,laptop
+148,hot air balloon
+149,floor lamp
+150,cow
+151,dolphin
+152,asparagus
+153,motorbike
+154,skyscraper
+155,strawberry
+156,umbrella
+157,brain
+158,mouth
+159,zebra
+160,jacket
+161,triangle
+162,hurricane
+163,bracelet
+164,pineapple
+165,rake
+166,steak
+167,baseball bat
+168,arm
+169,popsicle
+170,flying saucer
+171,mouse
+172,horse
+173,crab
+174,piano
+175,river
+176,castle
+177,compass
+178,binoculars
+179,ceiling fan
+180,airplane
+181,scissors
+182,garden
+183,bush
+184,bathtub
+185,clock
+186,drums
+187,lobster
+188,flower
+189,diving board
+190,toothbrush
+191,saw
+192,sea turtle
+193,squiggle
+194,tooth
+195,mountain
+196,sword
+197,aircraft carrier
+198,necklace
+199,cup
+200,wine glass
+201,lighter
+202,elbow
+203,blueberry
+204,snowman
+205,broccoli
+206,sun
+207,television
+208,sock
+209,pig
+210,key
+211,parachute
+212,hot tub
+213,shark
+214,washing machine
+215,hat
+216,windmill
+217,frying pan
+218,fire hydrant
+219,toothpaste
+220,belt
+221,beard
+222,rhinoceros
+223,headphones
+224,matches
+225,knife
+226,snorkel
+227,feather
+228,duck
+229,pond
+230,paint can
+231,firetruck
+232,angel
+233,bear
+234,passport
+235,cake
+236,telephone
+237,mosquito
+238,hamburger
+239,pencil
+240,peas
+241,ant
+242,eye
+243,mailbox
+244,grapes
+245,canoe
+246,pillow
+247,The Eiffel Tower
+248,sink
+249,backpack
+250,octopus
+251,finger
+252,snowflake
+253,tent
+254,nail
+255,submarine
+256,wheel
+257,church
+258,toilet
+259,purse
+260,penguin
+261,bee
+262,streetlight
+263,van
+264,boomerang
+265,train
+266,peanut
+267,stop sign
+268,basket
+269,wristwatch
+270,ice cream
+271,pizza
+272,crocodile
+273,lollipop
+274,hockey stick
+275,soccer ball
+276,dragon
+277,camera
+278,cannon
+279,zigzag
+280,spoon
+281,pickup truck
+282,ocean
+283,bat
+284,stitches
+285,shovel
+286,palm tree
+287,mug
+288,hot dog
+289,fan
+290,sweater
+291,cruise ship
+292,cloud
+293,whale
+294,police car
+295,saxophone
+296,squirrel
+297,smiley face
+298,owl
+299,house
+300,school bus
+301,yoga
+302,spider
+303,flashlight
+304,tree
+305,swan
+306,panda
+307,ambulance
+308,calculator
+309,pear
+310,trumpet
+311,lightning
+312,animal migration
+313,dresser
+314,basketball
+315,birthday cake
+316,leaf
+317,oven
+318,house plant
+319,keyboard
+320,eraser
+321,sleeping bag
+322,moustache
+323,door
+324,hourglass
+325,crayon
+326,stereo
+327,fence
+328,roller coaster
+329,onion
+330,marker
+331,tiger
+332,screwdriver
+333,watermelon
+334,lion
+335,butterfly
+336,toaster
+337,raccoon
+338,picture frame
+339,candle
+340,face
+341,kangaroo
+342,snake
+343,tornado
+344,rain
diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png
new file mode 100644
index 0000000..4d616c0
Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ
diff --git a/app/src/main/java/jtheiner/drawingclassification/MainActivity.java b/app/src/main/java/com/s23d/MainActivity.java
similarity index 63%
rename from app/src/main/java/jtheiner/drawingclassification/MainActivity.java
rename to app/src/main/java/com/s23d/MainActivity.java
index 07406a8..ddb8717 100644
--- a/app/src/main/java/jtheiner/drawingclassification/MainActivity.java
+++ b/app/src/main/java/com/s23d/MainActivity.java
@@ -1,9 +1,8 @@
-package jtheiner.drawingclassification;
+package com.s23d;
import android.app.Dialog;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
@@ -18,29 +17,23 @@
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
-import android.widget.Toast;
-import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
-import com.google.android.gms.tasks.OnFailureListener;
-import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.firebase.FirebaseApp;
-import com.google.firebase.storage.FileDownloadTask;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
-
-import org.andresoviedo.util.android.ContentUtils;
+import com.s23d.classification.ImageClassifier;
+import com.s23d.classification.Result;
+import com.s23d.view.ModelActivity;
import java.io.File;
import java.io.IOException;
+import java.util.Locale;
import java.util.Random;
-import jtheiner.drawingclassification.classification.ImageClassifier;
-import jtheiner.drawingclassification.classification.Result;
-import jtheiner.drawingclassification.view.ModelActivity;
-
public class MainActivity extends AppCompatActivity {
@@ -58,22 +51,17 @@ public class MainActivity extends AppCompatActivity {
private boolean isConnected;
private MaterialAlertDialogBuilder builder;
+ private MaterialAlertDialogBuilder progressBuilder;
+ private AlertDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- //Init Firebase
FirebaseApp.initializeApp(this);
-
- paintView = findViewById(R.id.paintView);
- paintView.init(); // initial drawing view
- textViewResult = findViewById(R.id.txt_result_label);
- textViewDraw = findViewById(R.id.txt_draw_label);
-
- storage = FirebaseStorage.getInstance();
+ doInit();
// instantiate classifier
try {
@@ -92,19 +80,13 @@ protected void onCreate(Bundle savedInstanceState) {
builder = new MaterialAlertDialogBuilder(this, R.style.RoundShapeTheme)
.setTitle("No Internet")
- .setMessage("You are currently offline\nCheck you internet to continue")
- .setNegativeButton("Ignore", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- dialogInterface.dismiss();
- }
- })
- .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- dialogInterface.dismiss();
- }
- });
+ .setMessage("You are currently offline\nCheck you internet try again")
+ .setNegativeButton("Ignore", (dialogInterface, i) -> dialogInterface.dismiss())
+ .setPositiveButton("Ok", (dialogInterface, i) -> dialogInterface.dismiss());
+
+ progressBuilder = new MaterialAlertDialogBuilder(this, R.style.RoundShapeTheme)
+ .setView(R.layout.progress);
+ dialog = progressBuilder.create();
this.mainView = this.findViewById(R.id.activity_main).getRootView();
@@ -112,9 +94,18 @@ public void onClick(DialogInterface dialogInterface, int i) {
}
+ private void doInit() {
+ paintView = findViewById(R.id.paintView);
+ paintView.init(); // initial drawing view
+ textViewResult = findViewById(R.id.txt_result_label);
+ textViewDraw = findViewById(R.id.txt_draw_label);
+ storage = FirebaseStorage.getInstance();
+ }
+
+
public void onClearClick(View view) {
Log.i("MainActivity", "Clear sketch event triggers");
- paintView.clear();
+ clearView(); //clear view and let try again
}
public void onDetectClick(View view) {
@@ -131,49 +122,50 @@ public void onDetectClick(View view) {
textViewResult.setText("");
for (int index : result.getTopK()) {
textViewResult.setText(
- String.format("%s\n%s (%s%%)", textViewResult.getText(), classifier.getLabel(index), String.format("%.02f", classifier.getProbability(index) * 100))
+ String.format("%s\n%s (%s%%)", textViewResult.getText(), classifier.getLabel(index),
+ String.format(Locale.getDefault(), "%.02f", classifier.getProbability(index) * 100))
);
- if ((classifier.getProbability(index) * 100) > 50) {
- Toast.makeText(this, "Loading 3D Model for " + classifier.getLabel(index), Toast.LENGTH_SHORT).show();
- downloadFile(classifier.getLabel(index).toLowerCase());
- }
}
int expectedIndex = classifier.getExpectedIndex();
if (result.getTopK().contains(expectedIndex)) {
mainView.setBackgroundColor(Color.rgb(78, 175, 36));
+ load3DObjectWhenClassificationIsCorrect(expectedIndex);
} else {
mainView.setBackgroundColor(Color.rgb(204, 0, 0));
+ dialog.dismiss();
}
}
+ private void load3DObjectWhenClassificationIsCorrect(int index) {
+ if ((classifier.getProbability(index) * 100) > 50) {
+ downloadAndRender3DObject(classifier.getLabel(index).toLowerCase());
+ }
+ }
+
public void onNextClick(View view) {
resetView();
}
- private void downloadFile(String fileName) {
+ private void downloadAndRender3DObject(String fileName) {
if (isConnected) {
+ dialog.show();
modelRef = storage.getReference().child(fileName + ".obj");
final File localFile = new File(getCacheDir(), fileName + ".obj");
- modelRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener() {
- @Override
- public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
- Log.i("Renderer ", ";local tem file created created " + localFile.toString());
- Log.i("Renderer ", ";local tem file dir" + localFile.getAbsolutePath());
- Intent intent = new Intent(MainActivity.this.getApplicationContext(), ModelActivity.class);
- ContentUtils.setCurrentDir(localFile.getParentFile());
- Log.i("Renderer ", ";local tem file dir: file://" + localFile.getAbsolutePath());
- intent.putExtra("uri", "file://" + localFile.getPath());
- intent.putExtra("immersiveMode", "true");
- MainActivity.this.startActivity(intent);
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(@NonNull Exception exception) {
- Log.i("Renderer ", ";local tem file not created created " + exception.toString());
- }
+ modelRef.getFile(localFile).addOnSuccessListener(taskSnapshot -> {
+ Log.i("Renderer ", ";local tem file created created " + localFile.toString());
+ Log.i("Renderer ", ";local tem file dir" + localFile.getAbsolutePath());
+ Intent intent = new Intent(MainActivity.this.getApplicationContext(), ModelActivity.class);
+ // ContentUtils.setCurrentDir(localFile.getParentFile());
+ Log.i("Renderer ", ";local tem file dir: file://" + localFile.getAbsolutePath());
+ intent.putExtra("uri", "file://" + localFile.getPath());
+ intent.putExtra("immersiveMode", "true");
+ MainActivity.this.startActivity(intent);
+ }).addOnFailureListener(exception -> {
+ Log.i("Renderer ", ";local tem file not created created " + exception.toString());
+ dialog.dismiss();
});
} else
builder.show();
@@ -184,7 +176,7 @@ private void showImage(Bitmap bitmap) {
Dialog builder = new Dialog(this);
builder.requestWindowFeature(Window.FEATURE_NO_TITLE);
builder.getWindow().setBackgroundDrawable(
- new ColorDrawable(Color.TRANSPARENT));
+ new ColorDrawable(android.graphics.Color.TRANSPARENT));
builder.setOnDismissListener(dialogInterface -> {
});
@@ -200,9 +192,22 @@ private void resetView() {
mainView.setBackgroundColor(Color.WHITE);
paintView.clear();
textViewResult.setText("");
-
// get a random label and set as expected class
classifier.setExpectedIndex(new Random().nextInt(classifier.getNumberOfClasses()));
- textViewDraw.setText("Draw ... " + classifier.getLabel(classifier.getExpectedIndex()));
+ textViewDraw.setText(String.format("Draw ... %s", classifier.getLabel(classifier.getExpectedIndex())));
+ }
+
+
+ private void clearView() {
+ paintView.clear();
+ textViewResult.setText("");
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (dialog.isShowing()) {
+ dialog.dismiss();
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/jtheiner/drawingclassification/PaintView.java b/app/src/main/java/com/s23d/PaintView.java
similarity index 87%
rename from app/src/main/java/jtheiner/drawingclassification/PaintView.java
rename to app/src/main/java/com/s23d/PaintView.java
index 7a71e7d..35c022a 100644
--- a/app/src/main/java/jtheiner/drawingclassification/PaintView.java
+++ b/app/src/main/java/com/s23d/PaintView.java
@@ -1,154 +1,152 @@
-package jtheiner.drawingclassification;
-
-
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.view.View;
-
-
-import java.util.ArrayList;
-
-import jtheiner.drawingclassification.classification.ImageClassifier;
-
-
-/**
- * Custom view class to draw sketches using bitmaps
- */
-public class PaintView extends View {
-
-
- public static int BRUSH_SIZE = 50;
- public static final int DEFAULT_COLOR = Color.WHITE;
- public static final int DEFAULT_BG_COLOR = Color.BLACK;
- private static final float TOUCH_TOLERANCE = 4;
-
- // original size of PaintView
- public int WIDTH;
- public int HEIGHT;
-
- private float mX, mY;
- private Path mPath;
- private Paint mPaint;
- private ArrayList paths = new ArrayList<>();
- private Bitmap mBitmap;
- private Canvas mCanvas;
- private Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG);
-
- public PaintView(Context context) {
- this(context, null);
- }
-
- public PaintView(Context context, AttributeSet attrs) {
- super(context, attrs);
- mPaint = new Paint();
- mPaint.setAntiAlias(true);
- mPaint.setDither(true);
- mPaint.setColor(DEFAULT_COLOR);
- mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setStrokeJoin(Paint.Join.ROUND);
- mPaint.setStrokeCap(Paint.Cap.ROUND);
- mPaint.setXfermode(null);
- mPaint.setAlpha(0xff);
- }
-
- public void init() {
- this.WIDTH = this.getLayoutParams().width;
- this.HEIGHT = this.getLayoutParams().height;
- mBitmap = Bitmap.createBitmap(WIDTH, HEIGHT , Bitmap.Config.ARGB_8888);
- mCanvas = new Canvas(mBitmap);
- }
-
- public void clear() {
- paths.clear();
- invalidate();
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- canvas.save();
- mCanvas.drawColor(DEFAULT_BG_COLOR);
-
- for (PenPath fp : paths) {
- mPaint.setColor(fp.color);
- mPaint.setStrokeWidth(fp.strokeWidth);
- mPaint.setMaskFilter(null);
- mCanvas.drawPath(fp.path, mPaint);
- }
-
- canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
- canvas.restore();
- }
-
- private void touchStart(float x, float y) {
- mPath = new Path();
- PenPath fp = new PenPath(DEFAULT_COLOR, BRUSH_SIZE, mPath);
- paths.add(fp);
- mPath.reset();
- mPath.moveTo(x, y);
- mX = x;
- mY = y;
- }
-
- private void touchMove(float x, float y) {
- float dx = Math.abs(x - mX);
- float dy = Math.abs(y - mY);
-
- if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
- mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
- mX = x;
- mY = y;
- }
- }
-
- private void touchUp() {
- mPath.lineTo(mX, mY);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- float x = event.getX();
- float y = event.getY();
-
- switch(event.getAction()) {
- case MotionEvent.ACTION_DOWN :
- touchStart(x, y);
- invalidate();
- break;
- case MotionEvent.ACTION_MOVE :
- touchMove(x, y);
- invalidate();
- break;
- case MotionEvent.ACTION_UP :
- touchUp();
- invalidate();
- break;
- }
-
- return true;
- }
-
- public Bitmap getmBitmap() {
- return this.mBitmap;
- }
-
- // scale given bitmap by a factor and return a new bitmap
- public Bitmap scaleBitmap(int scaleFactor, Bitmap bitmap) {
- return Bitmap.createScaledBitmap(bitmap, (int)(bitmap.getWidth()*scaleFactor), (int)(bitmap.getHeight()*scaleFactor), true);
- }
-
- // scale original bitmap down to network size (28x28)
- public Bitmap getNormalizedBitmap() {
- float scaleFactor = ImageClassifier.DIM_IMG_SIZE_HEIGHT / (float) mBitmap.getHeight();
- // todo: cut empty space around sketch
- return Bitmap.createScaledBitmap(mBitmap, (int)(mBitmap.getWidth()*scaleFactor), (int)(mBitmap.getHeight()*scaleFactor), true);
-
- }
-
+package com.s23d;
+
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import com.s23d.classification.ImageClassifier;
+
+import java.util.ArrayList;
+
+
+/**
+ * Custom view class to draw sketches using bitmaps
+ */
+public class PaintView extends View {
+
+
+ public static int BRUSH_SIZE = 50;
+ public static final int DEFAULT_COLOR = Color.WHITE;
+ public static final int DEFAULT_BG_COLOR = Color.BLACK;
+ private static final float TOUCH_TOLERANCE = 4;
+
+ // original size of PaintView
+ public int WIDTH;
+ public int HEIGHT;
+
+ private float mX, mY;
+ private Path mPath;
+ private final Paint mPaint;
+ private final ArrayList paths = new ArrayList<>();
+ private Bitmap mBitmap;
+ private Canvas mCanvas;
+ private final Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG);
+
+ public PaintView(Context context) {
+ this(context, null);
+ }
+
+ public PaintView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mPaint = new Paint();
+ mPaint.setAntiAlias(true);
+ mPaint.setDither(true);
+ mPaint.setColor(DEFAULT_COLOR);
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeJoin(Paint.Join.ROUND);
+ mPaint.setStrokeCap(Paint.Cap.ROUND);
+ mPaint.setXfermode(null);
+ mPaint.setAlpha(0xff);
+ }
+
+ public void init() {
+ this.WIDTH = this.getLayoutParams().width;
+ this.HEIGHT = this.getLayoutParams().height;
+ mBitmap = Bitmap.createBitmap(WIDTH, HEIGHT , Bitmap.Config.ARGB_8888);
+ mCanvas = new Canvas(mBitmap);
+ }
+
+ public void clear() {
+ paths.clear();
+ invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ canvas.save();
+ mCanvas.drawColor(DEFAULT_BG_COLOR);
+
+ for (PenPath fp : paths) {
+ mPaint.setColor(fp.color);
+ mPaint.setStrokeWidth(fp.strokeWidth);
+ mPaint.setMaskFilter(null);
+ mCanvas.drawPath(fp.path, mPaint);
+ }
+
+ canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
+ canvas.restore();
+ }
+
+ private void touchStart(float x, float y) {
+ mPath = new Path();
+ PenPath fp = new PenPath(DEFAULT_COLOR, BRUSH_SIZE, mPath);
+ paths.add(fp);
+ mPath.reset();
+ mPath.moveTo(x, y);
+ mX = x;
+ mY = y;
+ }
+
+ private void touchMove(float x, float y) {
+ float dx = Math.abs(x - mX);
+ float dy = Math.abs(y - mY);
+
+ if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
+ mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
+ mX = x;
+ mY = y;
+ }
+ }
+
+ private void touchUp() {
+ mPath.lineTo(mX, mY);
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ float x = event.getX();
+ float y = event.getY();
+
+ switch(event.getAction()) {
+ case MotionEvent.ACTION_DOWN :
+ touchStart(x, y);
+ invalidate();
+ break;
+ case MotionEvent.ACTION_MOVE :
+ touchMove(x, y);
+ invalidate();
+ break;
+ case MotionEvent.ACTION_UP :
+ touchUp();
+ invalidate();
+ break;
+ }
+
+ return true;
+ }
+
+ public Bitmap getmBitmap() {
+ return this.mBitmap;
+ }
+
+ // scale given bitmap by a factor and return a new bitmap
+ public Bitmap scaleBitmap(int scaleFactor, Bitmap bitmap) {
+ return Bitmap.createScaledBitmap(bitmap, bitmap.getWidth() * scaleFactor, bitmap.getHeight() * scaleFactor, true);
+ }
+
+ // scale original bitmap down to network size (28x28)
+ public Bitmap getNormalizedBitmap() {
+ float scaleFactor = ImageClassifier.DIM_IMG_SIZE_HEIGHT / (float) mBitmap.getHeight();
+ // todo: cut empty space around sketch
+ return Bitmap.createScaledBitmap(mBitmap, (int)(mBitmap.getWidth()*scaleFactor), (int)(mBitmap.getHeight()*scaleFactor), true);
+
+ }
+
}
\ No newline at end of file
diff --git a/app/src/main/java/jtheiner/drawingclassification/PenPath.java b/app/src/main/java/com/s23d/PenPath.java
similarity index 84%
rename from app/src/main/java/jtheiner/drawingclassification/PenPath.java
rename to app/src/main/java/com/s23d/PenPath.java
index 6d94f5d..802bd15 100644
--- a/app/src/main/java/jtheiner/drawingclassification/PenPath.java
+++ b/app/src/main/java/com/s23d/PenPath.java
@@ -1,16 +1,16 @@
-package jtheiner.drawingclassification;
-
-import android.graphics.Path;
-
-public class PenPath {
-
- public int color;
- public int strokeWidth;
- public Path path;
-
- public PenPath(int color, int strokeWidth, Path path) {
- this.color = color;
- this.strokeWidth = strokeWidth;
- this.path = path;
- }
+package com.s23d;
+
+import android.graphics.Path;
+
+public class PenPath {
+
+ public int color;
+ public int strokeWidth;
+ public Path path;
+
+ public PenPath(int color, int strokeWidth, Path path) {
+ this.color = color;
+ this.strokeWidth = strokeWidth;
+ this.path = path;
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/jtheiner/drawingclassification/classification/ImageClassifier.java b/app/src/main/java/com/s23d/classification/ImageClassifier.java
similarity index 86%
rename from app/src/main/java/jtheiner/drawingclassification/classification/ImageClassifier.java
rename to app/src/main/java/com/s23d/classification/ImageClassifier.java
index 5b64cf4..deba4f5 100644
--- a/app/src/main/java/jtheiner/drawingclassification/classification/ImageClassifier.java
+++ b/app/src/main/java/com/s23d/classification/ImageClassifier.java
@@ -1,97 +1,98 @@
-package jtheiner.drawingclassification.classification;
-
-import android.app.Activity;
-import android.graphics.Bitmap;
-import android.util.Log;
-
-import org.tensorflow.lite.Interpreter;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.MappedByteBuffer;
-import java.util.ArrayList;
-
-
-
-public class ImageClassifier {
-
- private static final String MODEL_FILE = "10/model10.tflite";
- private static final String LABELS_FILE = "10/labels.csv";
-
- private static final int DIM_BATCH_SIZE = 1;
- public static final int DIM_IMG_SIZE_HEIGHT = 28;
- public static final int DIM_IMG_SIZE_WIDTH = 28;
- private static final int DIM_PIXEL_SIZE = 1;
-
- private ArrayList labels; // list of all labels
- private ByteBuffer imgData = null; // models input format
- private Interpreter tflite; // the model
- private int[] imagePixels = new int[DIM_IMG_SIZE_HEIGHT * DIM_IMG_SIZE_WIDTH];
- private final float[][] result; // depending on models architecture (possible multiple output)
-
- private int expectedIndex; // random label index which is to be drawn
-
- public ImageClassifier(Activity activity) throws IOException {
-
- // load model
- MappedByteBuffer modelBuffered = ModelInput.loadModelFile(activity, MODEL_FILE);
- Log.i("ImageClassifier", "" + modelBuffered.isLoaded());
- this.tflite = new Interpreter(modelBuffered);
-
- // load labels
- this.labels = ModelInput.readLabels(activity, LABELS_FILE);
- this.result = new float[1][labels.size()];
-
- // allocate memory for model input
- this.imgData = ByteBuffer.allocateDirect(4 * DIM_BATCH_SIZE * DIM_IMG_SIZE_HEIGHT * DIM_IMG_SIZE_WIDTH * DIM_PIXEL_SIZE);
- this.imgData.order(ByteOrder.nativeOrder());
-
- Log.i("ImageClassifier", "Successfully created a Tensorflow Lite sketch classifier.");
- }
-
- public Result classify(Bitmap bitmap) {
- convertBitmapToByteBuffer(bitmap); // flatten bitmap to byte array
- tflite.run(imgData, result); // classify task
- return new Result(result[0], labels); // create the result
- }
-
- private void convertBitmapToByteBuffer(Bitmap bitmap) {
- if (imgData == null) {
- return;
- }
- imgData.rewind();
-
- bitmap.getPixels(imagePixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
-
- int pixel = 0;
- for (int i = 0; i < DIM_IMG_SIZE_WIDTH; ++i) {
- for (int j = 0; j < DIM_IMG_SIZE_HEIGHT; ++j) {
- final int color = imagePixels[pixel++];
- imgData.putFloat((((color >> 16) & 0xFF) + ((color >> 8) & 0xFF) + (color & 0xFF)) / 3.0f / 255.0f);
- }
- }
- }
-
-
- public void setExpectedIndex(int index) {
- this.expectedIndex = index;
- }
-
-
- public int getExpectedIndex() {
- return expectedIndex;
- }
-
- public float getProbability(int index) {
- return result[0][index];
- }
-
- public String getLabel(int index) {
- return labels.get(index);
- }
-
- public int getNumberOfClasses() {
- return labels.size();
- }
-}
+package com.s23d.classification;
+
+import android.graphics.Bitmap;
+import android.util.Log;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import org.tensorflow.lite.Interpreter;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.MappedByteBuffer;
+import java.util.ArrayList;
+
+
+
+public class ImageClassifier {
+
+ private static final String MODEL_FILE = "10/model10.tflite";
+ private static final String LABELS_FILE = "10/labels.csv";
+
+ private static final int DIM_BATCH_SIZE = 1;
+ public static final int DIM_IMG_SIZE_HEIGHT = 28;
+ public static final int DIM_IMG_SIZE_WIDTH = 28;
+ private static final int DIM_PIXEL_SIZE = 1;
+
+ private final ArrayList labels; // list of all labels
+ private ByteBuffer imgData = null; // models input format
+ private final Interpreter tflite; // the model
+ private final int[] imagePixels = new int[DIM_IMG_SIZE_HEIGHT * DIM_IMG_SIZE_WIDTH];
+ private final float[][] result; // depending on models architecture (possible multiple output)
+
+ private int expectedIndex; // random label index which is to be drawn
+
+ public ImageClassifier(AppCompatActivity activity) throws IOException {
+
+ // load model
+ MappedByteBuffer modelBuffered = ModelInput.loadModelFile(activity, MODEL_FILE);
+ Log.i("ImageClassifier", "" + modelBuffered.isLoaded());
+ this.tflite = new Interpreter(modelBuffered);
+
+ // load labels
+ this.labels = ModelInput.readLabels(activity, LABELS_FILE);
+ this.result = new float[1][labels.size()];
+
+ // allocate memory for model input
+ this.imgData = ByteBuffer.allocateDirect(4 * DIM_BATCH_SIZE * DIM_IMG_SIZE_HEIGHT * DIM_IMG_SIZE_WIDTH * DIM_PIXEL_SIZE);
+ this.imgData.order(ByteOrder.nativeOrder());
+
+ Log.i("ImageClassifier", "Successfully created a Tensorflow Lite sketch classifier.");
+ }
+
+ public Result classify(Bitmap bitmap) {
+ convertBitmapToByteBuffer(bitmap); // flatten bitmap to byte array
+ tflite.run(imgData, result); // classify task
+ return new Result(result[0], labels); // create the result
+ }
+
+ private void convertBitmapToByteBuffer(Bitmap bitmap) {
+ if (imgData == null) {
+ return;
+ }
+ imgData.rewind();
+
+ bitmap.getPixels(imagePixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
+
+ int pixel = 0;
+ for (int i = 0; i < DIM_IMG_SIZE_WIDTH; ++i) {
+ for (int j = 0; j < DIM_IMG_SIZE_HEIGHT; ++j) {
+ final int color = imagePixels[pixel++];
+ imgData.putFloat((((color >> 16) & 0xFF) + ((color >> 8) & 0xFF) + (color & 0xFF)) / 3.0f / 255.0f);
+ }
+ }
+ }
+
+
+ public void setExpectedIndex(int index) {
+ this.expectedIndex = index;
+ }
+
+
+ public int getExpectedIndex() {
+ return expectedIndex;
+ }
+
+ public float getProbability(int index) {
+ return result[0][index];
+ }
+
+ public String getLabel(int index) {
+ return labels.get(index);
+ }
+
+ public int getNumberOfClasses() {
+ return labels.size();
+ }
+}
diff --git a/app/src/main/java/jtheiner/drawingclassification/classification/ModelInput.java b/app/src/main/java/com/s23d/classification/ModelInput.java
similarity index 82%
rename from app/src/main/java/jtheiner/drawingclassification/classification/ModelInput.java
rename to app/src/main/java/com/s23d/classification/ModelInput.java
index 5b4d5a9..0a8d45f 100644
--- a/app/src/main/java/jtheiner/drawingclassification/classification/ModelInput.java
+++ b/app/src/main/java/com/s23d/classification/ModelInput.java
@@ -1,58 +1,59 @@
-package jtheiner.drawingclassification.classification;
-
-import android.app.Activity;
-import android.content.res.AssetFileDescriptor;
-import android.content.res.AssetManager;
-
-import java.io.BufferedReader;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.util.ArrayList;
-
-
-/**
- * Helper class to read TensorFlow model and labels from file
- */
-abstract class ModelInput {
-
- /*
- * Reads the compressed model as MappedByteBuffer from file.
- *
- */
- public static MappedByteBuffer loadModelFile(Activity activity, String modelFile) throws IOException {
- AssetManager assetManager = activity.getAssets();
- AssetFileDescriptor fileDescriptor = assetManager.openFd(modelFile);
- FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
- FileChannel fileChannel = inputStream.getChannel();
- long startOffset = fileDescriptor.getStartOffset();
- long declaredLength = fileDescriptor.getDeclaredLength();
- return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
- }
-
- /*
- * Read labels from file to an array list of labels.
- * This list represents the mapping from index position to label.
- *
- */
- public static ArrayList readLabels(Activity activity, String labelsFile) {
- AssetManager assetManager = activity.getAssets();
- ArrayList result = new ArrayList<>();
- try {
- InputStream is = assetManager.open(labelsFile);
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- String line;
- while ((line = br.readLine()) != null) {
- String[] splitted = line.split(",");
- result.add(splitted[1]);
- }
-
- return result;
- } catch (IOException ex) {
- throw new IllegalStateException("Cannot read labels from " + labelsFile + " " + ex);
- }
- }
-}
+package com.s23d.classification;
+
+import android.content.res.AssetFileDescriptor;
+import android.content.res.AssetManager;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+
+
+/**
+ * Helper class to read TensorFlow model and labels from file
+ */
+abstract class ModelInput {
+
+ /*
+ * Reads the compressed model as MappedByteBuffer from file.
+ *
+ */
+ public static MappedByteBuffer loadModelFile(AppCompatActivity activity, String modelFile) throws IOException {
+ AssetManager assetManager = activity.getAssets();
+ AssetFileDescriptor fileDescriptor = assetManager.openFd(modelFile);
+ FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
+ FileChannel fileChannel = inputStream.getChannel();
+ long startOffset = fileDescriptor.getStartOffset();
+ long declaredLength = fileDescriptor.getDeclaredLength();
+ return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
+ }
+
+ /*
+ * Read labels from file to an array list of labels.
+ * This list represents the mapping from index position to label.
+ *
+ */
+ public static ArrayList readLabels(AppCompatActivity activity, String labelsFile) {
+ AssetManager assetManager = activity.getAssets();
+ ArrayList result = new ArrayList<>();
+ try {
+ InputStream is = assetManager.open(labelsFile);
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ String line;
+ while ((line = br.readLine()) != null) {
+ String[] splitted = line.split(",");
+ result.add(splitted[1]);
+ }
+
+ return result;
+ } catch (IOException ex) {
+ throw new IllegalStateException("Cannot read labels from " + labelsFile + " " + ex);
+ }
+ }
+}
diff --git a/app/src/main/java/jtheiner/drawingclassification/classification/Result.java b/app/src/main/java/com/s23d/classification/Result.java
similarity index 85%
rename from app/src/main/java/jtheiner/drawingclassification/classification/Result.java
rename to app/src/main/java/com/s23d/classification/Result.java
index 7587fc4..9de80e1 100644
--- a/app/src/main/java/jtheiner/drawingclassification/classification/Result.java
+++ b/app/src/main/java/com/s23d/classification/Result.java
@@ -1,79 +1,77 @@
-package jtheiner.drawingclassification.classification;
-
-import android.util.ArrayMap;
-import android.util.Log;
-
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Readable representation of the models output vector.
- * Contains label, label position in result vector and probability.
- */
-public class Result {
- private String label;
- private int labelPosition;
- private float probability;
- private List topK; // contains the index
-
- public Result(float[] result, ArrayList labels) {
- this.labelPosition = argmax(result); // set index position
- this.probability = result[labelPosition]; // set probability
- this.label = labels.get(labelPosition); // search for label
- this.topK = getTopkLabels(3, result);
-
- }
-
- // find the index with the maximum probability
- private int argmax(float[] result) {
- float maxProb = 0.0f;
- int maxIndex = -1;
- for (int i = 0; i < result.length; i++) {
- if (result[i] > maxProb) {
- maxProb = result[i];
- maxIndex = i;
- }
- }
- if (maxIndex == -1) {
- Log.e("Result class", "argmax found no maximum");
- }
- return maxIndex;
- }
-
-
- // returns the top k labels with probability
- private List getTopkLabels(int k, float[] result) {
- List topK = new LinkedList<>();
- for (int kk = 0; kk < k; kk++) {
- float maxProb = 0.0f;
- int maxIndex = -1;
- for (int i = 0; i < result.length; i++) {
- if (!topK.contains(i)) {
- if (result[i] > maxProb) {
- maxProb = result[i];
- maxIndex = i;
- }
- }
- }
- topK.add(maxIndex);
- }
-
- return topK;
- }
-
- public String getLabel() { return this.label; }
-
- public float getProbbability() {
- return this.probability;
- }
-
- public List getTopK() {
- return this.topK;
- }
-
- public int getLabelPosition() {
- return this.labelPosition;
- }
-}
+package com.s23d.classification;
+
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Readable representation of the models output vector.
+ * Contains label, label position in result vector and probability.
+ */
+public class Result {
+ private final String label;
+ private final int labelPosition;
+ private final float probability;
+ private final List topK; // contains the index
+
+ public Result(float[] result, ArrayList labels) {
+ this.labelPosition = argmax(result); // set index position
+ this.probability = result[labelPosition]; // set probability
+ this.label = labels.get(labelPosition); // search for label
+ this.topK = getTopkLabels(3, result);
+
+ }
+
+ // find the index with the maximum probability
+ private int argmax(float[] result) {
+ float maxProb = 0.0f;
+ int maxIndex = -1;
+ for (int i = 0; i < result.length; i++) {
+ if (result[i] > maxProb) {
+ maxProb = result[i];
+ maxIndex = i;
+ }
+ }
+ if (maxIndex == -1) {
+ Log.e("Result class", "argmax found no maximum");
+ }
+ return maxIndex;
+ }
+
+
+ // returns the top k labels with probability
+ private List getTopkLabels(int k, float[] result) {
+ List topK = new LinkedList<>();
+ for (int kk = 0; kk < k; kk++) {
+ float maxProb = 0.0f;
+ int maxIndex = -1;
+ for (int i = 0; i < result.length; i++) {
+ if (!topK.contains(i)) {
+ if (result[i] > maxProb) {
+ maxProb = result[i];
+ maxIndex = i;
+ }
+ }
+ }
+ topK.add(maxIndex);
+ }
+
+ return topK;
+ }
+
+ public String getLabel() { return this.label; }
+
+ public float getProbbability() {
+ return this.probability;
+ }
+
+ public List getTopK() {
+ return this.topK;
+ }
+
+ public int getLabelPosition() {
+ return this.labelPosition;
+ }
+}
diff --git a/app/src/main/java/jtheiner/drawingclassification/controller/TouchController.java b/app/src/main/java/com/s23d/controller/TouchController.java
similarity index 96%
rename from app/src/main/java/jtheiner/drawingclassification/controller/TouchController.java
rename to app/src/main/java/com/s23d/controller/TouchController.java
index 5664a79..32d6c0a 100644
--- a/app/src/main/java/jtheiner/drawingclassification/controller/TouchController.java
+++ b/app/src/main/java/com/s23d/controller/TouchController.java
@@ -1,4 +1,4 @@
-package jtheiner.drawingclassification.controller;
+package com.s23d.controller;
import android.graphics.PointF;
import android.opengl.Matrix;
@@ -8,11 +8,11 @@
import android.view.View;
import android.widget.ImageView;
-import org.andresoviedo.android_3d_model_engine.model.Camera;
+import com.s23d.demo.SceneLoader;
+import com.s23d.view.ModelRenderer;
+import com.s23d.view.ModelSurfaceView;
-import jtheiner.drawingclassification.demo.SceneLoader;
-import jtheiner.drawingclassification.view.ModelRenderer;
-import jtheiner.drawingclassification.view.ModelSurfaceView;
+import org.andresoviedo.android_3d_model_engine.model.Camera;
public class TouchController {
@@ -58,9 +58,9 @@ public class TouchController {
private float previousY1;
private float previousX2;
private float previousY2;
- private float[] previousVector = new float[4];
- private float[] vector = new float[4];
- private float[] rotationVector = new float[4];
+ private final float[] previousVector = new float[4];
+ private final float[] vector = new float[4];
+ private final float[] rotationVector = new float[4];
private float previousRotationSquare;
public TouchController(ModelSurfaceView view, ModelRenderer renderer) {
@@ -305,12 +305,12 @@ class TouchScreen {
private static final int DRAG = 1;
private static final int ZOOM = 2;
// these matrices will be used to move and zoom image
- private android.graphics.Matrix matrix = new android.graphics.Matrix();
- private android.graphics.Matrix savedMatrix = new android.graphics.Matrix();
+ private final android.graphics.Matrix matrix = new android.graphics.Matrix();
+ private final android.graphics.Matrix savedMatrix = new android.graphics.Matrix();
private int mode = NONE;
// remember some things for zooming
- private PointF start = new PointF();
- private PointF mid = new PointF();
+ private final PointF start = new PointF();
+ private final PointF mid = new PointF();
private float oldDist = 1f;
private float d = 0f;
private float newRot = 0f;
diff --git a/app/src/main/java/jtheiner/drawingclassification/demo/ExampleSceneLoader.java b/app/src/main/java/com/s23d/demo/ExampleSceneLoader.java
similarity index 97%
rename from app/src/main/java/jtheiner/drawingclassification/demo/ExampleSceneLoader.java
rename to app/src/main/java/com/s23d/demo/ExampleSceneLoader.java
index 5d9e352..2e20390 100644
--- a/app/src/main/java/jtheiner/drawingclassification/demo/ExampleSceneLoader.java
+++ b/app/src/main/java/com/s23d/demo/ExampleSceneLoader.java
@@ -1,4 +1,4 @@
-package jtheiner.drawingclassification.demo;
+package com.s23d.demo;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
@@ -7,6 +7,8 @@
import android.util.Log;
import android.widget.Toast;
+import com.s23d.view.ModelActivity;
+
import org.andresoviedo.android_3d_model_engine.model.Object3DData;
import org.andresoviedo.android_3d_model_engine.services.Object3DBuilder;
import org.andresoviedo.util.android.ContentUtils;
@@ -16,8 +18,6 @@
import java.util.ArrayList;
import java.util.List;
-import jtheiner.drawingclassification.view.ModelActivity;
-
/**
* This class loads a 3D scene as an example of what can be done with the app
*
@@ -35,8 +35,8 @@ public void init() {
super.init();
new AsyncTask() {
- ProgressDialog dialog = new ProgressDialog(parent);
- List errors = new ArrayList<>();
+ final ProgressDialog dialog = new ProgressDialog(parent);
+ final List errors = new ArrayList<>();
@Override
protected void onPreExecute() {
diff --git a/app/src/main/java/jtheiner/drawingclassification/demo/SceneLoader.java b/app/src/main/java/com/s23d/demo/SceneLoader.java
similarity index 98%
rename from app/src/main/java/jtheiner/drawingclassification/demo/SceneLoader.java
rename to app/src/main/java/com/s23d/demo/SceneLoader.java
index 65eee71..e8522de 100644
--- a/app/src/main/java/jtheiner/drawingclassification/demo/SceneLoader.java
+++ b/app/src/main/java/com/s23d/demo/SceneLoader.java
@@ -1,10 +1,13 @@
-package jtheiner.drawingclassification.demo;
+package com.s23d.demo;
import android.net.Uri;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Toast;
+import com.s23d.view.ModelActivity;
+import com.s23d.view.ModelRenderer;
+
import org.andresoviedo.android_3d_model_engine.animation.Animator;
import org.andresoviedo.android_3d_model_engine.collision.CollisionDetection;
import org.andresoviedo.android_3d_model_engine.model.Camera;
@@ -24,9 +27,6 @@
import java.util.Arrays;
import java.util.List;
-import jtheiner.drawingclassification.view.ModelActivity;
-import jtheiner.drawingclassification.view.ModelRenderer;
-
/**
* This class loads a 3D scena as an example of what can be done with the app
*
@@ -37,7 +37,7 @@ public class SceneLoader implements LoaderTask.Callback {
/**
* Default model color: yellow
*/
- private static float[] DEFAULT_COLOR = {1.0f, 1.0f, 0, 1.0f};
+ private static final float[] DEFAULT_COLOR = {1.0f, 1.0f, 0, 1.0f};
/**
* Parent component
*/
@@ -81,7 +81,7 @@ public class SceneLoader implements LoaderTask.Callback {
/**
* Whether to draw face normals. Normally used to debug models
*/
- private boolean drawNormals = false;
+ private final boolean drawNormals = false;
/**
* Whether to draw using textures
*/
@@ -133,7 +133,7 @@ public class SceneLoader implements LoaderTask.Callback {
/**
* Animator
*/
- private Animator animator = new Animator();
+ private final Animator animator = new Animator();
/**
* Did the user touched the model for the first time?
*/
diff --git a/app/src/main/java/jtheiner/drawingclassification/view/ModelActivity.java b/app/src/main/java/com/s23d/view/ModelActivity.java
similarity index 97%
rename from app/src/main/java/jtheiner/drawingclassification/view/ModelActivity.java
rename to app/src/main/java/com/s23d/view/ModelActivity.java
index b6d2c1f..f367bb0 100644
--- a/app/src/main/java/jtheiner/drawingclassification/view/ModelActivity.java
+++ b/app/src/main/java/com/s23d/view/ModelActivity.java
@@ -1,4 +1,4 @@
-package jtheiner.drawingclassification.view;
+package com.s23d.view;
import android.annotation.TargetApi;
import android.content.ContentResolver;
@@ -18,13 +18,12 @@
import com.google.firebase.FirebaseApp;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
+import com.s23d.demo.SceneLoader;
import org.andresoviedo.util.android.ContentUtils;
import java.io.IOException;
-import jtheiner.drawingclassification.demo.SceneLoader;
-
/**
* This activity represents the container for our 3D viewer.
*
@@ -50,7 +49,7 @@ public class ModelActivity extends AppCompatActivity {
/**
* Background GL clear color. Default is light gray
*/
- private float[] backgroundColor = new float[]{0f, 0f, 0f, 1.0f};
+ private final float[] backgroundColor = new float[]{0f, 0f, 0f, 1.0f};
private ModelSurfaceView gLView;
@@ -99,7 +98,7 @@ protected void onCreate(Bundle savedInstanceState) {
// Create our 3D sceneario
if (paramUri == null) {
//scene = new ExampleSceneLoader(this);
- Toast.makeText(this, "Unable to generate 3D model", Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, "Param is Null", Toast.LENGTH_SHORT).show();
} else {
scene = new SceneLoader(this);
}
diff --git a/app/src/main/java/jtheiner/drawingclassification/view/ModelRenderer.java b/app/src/main/java/com/s23d/view/ModelRenderer.java
similarity index 96%
rename from app/src/main/java/jtheiner/drawingclassification/view/ModelRenderer.java
rename to app/src/main/java/com/s23d/view/ModelRenderer.java
index 392a716..123c811 100644
--- a/app/src/main/java/jtheiner/drawingclassification/view/ModelRenderer.java
+++ b/app/src/main/java/com/s23d/view/ModelRenderer.java
@@ -1,10 +1,12 @@
-package jtheiner.drawingclassification.view;
+package com.s23d.view;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;
import android.util.Log;
+import com.s23d.demo.SceneLoader;
+
import org.andresoviedo.android_3d_model_engine.animation.Animator;
import org.andresoviedo.android_3d_model_engine.drawer.DrawerFactory;
import org.andresoviedo.android_3d_model_engine.model.AnimatedModel;
@@ -23,8 +25,6 @@
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
-import jtheiner.drawingclassification.demo.SceneLoader;
-
public class ModelRenderer implements GLSurfaceView.Renderer {
private final static String TAG = ModelRenderer.class.getName();
@@ -35,7 +35,7 @@ public class ModelRenderer implements GLSurfaceView.Renderer {
private static final float[] COLOR_RED = {1.0f, 0.0f, 0.0f, 1f};
private static final float[] COLOR_BLUE = {0.0f, 1.0f, 0.0f, 1f};
// stereoscopic variables
- private static float EYE_DISTANCE = 0.64f;
+ private static final float EYE_DISTANCE = 0.64f;
/**
* 3D Axis (to show if needed)
*/
@@ -54,7 +54,7 @@ public class ModelRenderer implements GLSurfaceView.Renderer {
private final float[] projectionMatrixRight = new float[16];
private final float[] viewProjectionMatrixRight = new float[16];
// 3D window (parent component)
- private ModelSurfaceView main;
+ private final ModelSurfaceView main;
// width of the screen
private int width;
// height of the screen
@@ -62,20 +62,20 @@ public class ModelRenderer implements GLSurfaceView.Renderer {
/**
* Drawer factory to get right renderer/shader based on object attributes
*/
- private DrawerFactory drawer;
+ private final DrawerFactory drawer;
// The wireframe associated shape (it should be made of lines only)
- private Map wireframes = new HashMap<>();
+ private final Map wireframes = new HashMap<>();
// The loaded textures
- private Map textures = new HashMap<>();
+ private final Map textures = new HashMap<>();
// The corresponding opengl bounding boxes and drawer
- private Map boundingBoxes = new HashMap<>();
+ private final Map boundingBoxes = new HashMap<>();
// The corresponding opengl bounding boxes
- private Map normals = new HashMap<>();
- private Map skeleton = new HashMap<>();
+ private final Map normals = new HashMap<>();
+ private final Map skeleton = new HashMap<>();
/**
* Whether the info of the model has been written to console log
*/
- private Map infoLogged = new HashMap<>();
+ private final Map infoLogged = new HashMap<>();
/**
* Switch to akternate drawing of right and left image
*/
@@ -84,7 +84,7 @@ public class ModelRenderer implements GLSurfaceView.Renderer {
/**
* Skeleton Animator
*/
- private Animator animator = new Animator();
+ private final Animator animator = new Animator();
/**
* Did the application explode?
*/
diff --git a/app/src/main/java/jtheiner/drawingclassification/view/ModelSurfaceView.java b/app/src/main/java/com/s23d/view/ModelSurfaceView.java
similarity index 84%
rename from app/src/main/java/jtheiner/drawingclassification/view/ModelSurfaceView.java
rename to app/src/main/java/com/s23d/view/ModelSurfaceView.java
index 79f9e80..5c06c29 100644
--- a/app/src/main/java/jtheiner/drawingclassification/view/ModelSurfaceView.java
+++ b/app/src/main/java/com/s23d/view/ModelSurfaceView.java
@@ -1,12 +1,11 @@
-package jtheiner.drawingclassification.view;
+package com.s23d.view;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;
-import java.io.IOException;
-
-import jtheiner.drawingclassification.controller.TouchController;
+import com.s23d.controller.TouchController;
+import java.io.IOException;
/**
* This is the actual opengl view. From here we can detect touch gestures for example
@@ -15,9 +14,9 @@
*/
public class ModelSurfaceView extends GLSurfaceView {
- private ModelActivity parent;
- private ModelRenderer mRenderer;
- private TouchController touchHandler;
+ private final ModelActivity parent;
+ private final ModelRenderer mRenderer;
+ private final TouchController touchHandler;
public ModelSurfaceView(ModelActivity parent) throws IllegalAccessException, IOException {
super(parent);
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
index ddb26ad..c7bd21d 100644
--- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -1,34 +1,34 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml
index b2a3195..ae6a446 100644
--- a/app/src/main/res/drawable/ic_dashboard_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_dashboard_black_24dp.xml
@@ -1,9 +1,9 @@
-
-
-
+
+
+
diff --git a/app/src/main/res/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable/ic_home_black_24dp.xml
index 78e078f..0c36320 100644
--- a/app/src/main/res/drawable/ic_home_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_home_black_24dp.xml
@@ -1,9 +1,9 @@
-
-
-
+
+
+
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
deleted file mode 100644
index 3a37cf6..0000000
--- a/app/src/main/res/drawable/ic_launcher_background.xml
+++ /dev/null
@@ -1,170 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications_black_24dp.xml
index 1c487d3..0262382 100644
--- a/app/src/main/res/drawable/ic_notifications_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_notifications_black_24dp.xml
@@ -1,9 +1,9 @@
-
-
-
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 86cab37..31754ec 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,67 +1,83 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/progress.xml b/app/src/main/res/layout/progress.xml
new file mode 100644
index 0000000..3ef5b4a
--- /dev/null
+++ b/app/src/main/res/layout/progress.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/navigation.xml b/app/src/main/res/menu/navigation.xml
index 5cec04f..f4de4f8 100644
--- a/app/src/main/res/menu/navigation.xml
+++ b/app/src/main/res/menu/navigation.xml
@@ -1,19 +1,19 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index a26f6fb..c9ad5f9 100644
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,5 +1,5 @@
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
index a26f6fb..c9ad5f9 100644
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -1,5 +1,5 @@
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index a2f5908..0000000
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..8798633
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
deleted file mode 100644
index 1b52399..0000000
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index ff10afd..0000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..f1140e6
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
deleted file mode 100644
index 115a4c7..0000000
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index dcd3cd8..0000000
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..a6faeab
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
deleted file mode 100644
index 459ca60..0000000
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 8ca12fe..0000000
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..aaf6064
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
deleted file mode 100644
index 8e19b41..0000000
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index b824ebd..0000000
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..c90ef3b
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
deleted file mode 100644
index 4c19a13..0000000
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 6ac1e78..bad42f6 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,7 +1,15 @@
-
-
- #3F51B5
- #303F9F
- #FF4081
- #FFFFFF
-
+
+
+ #FFFFFF
+ #000000
+
+ #212121
+ #484848
+ #000000
+ #fafafa
+ #ffffff
+ #c7c7c7
+ #ffffff
+ #000000
+
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 295b5a9..47c8224 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,5 +1,5 @@
-
-
- 16dp
- 16dp
-
+
+
+ 16dp
+ 16dp
+
diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000..c5d5899
--- /dev/null
+++ b/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFF
+
\ No newline at end of file
diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml
index 35c14ff..0d2c4cc 100644
--- a/app/src/main/res/values/ids.xml
+++ b/app/src/main/res/values/ids.xml
@@ -1,4 +1,4 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index fcaf55b..a05dfa9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,6 +1,12 @@
-
- Sketch Recognition
- Home
- Dashboard
- Notifications
-
+
+ Air
+ Sketch Recognition
+ Home
+ Dashboard
+ Notifications
+ Detect
+ Next
+ Clear Canvas
+ Draw
+ Please wait while the model is loading…
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index d6a8ba5..c2e5dfb 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,24 +1,25 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/test/java/jtheiner/drawingclassification/ExampleUnitTest.java b/app/src/test/java/com/s23d/ExampleUnitTest.java
similarity index 77%
rename from app/src/test/java/jtheiner/drawingclassification/ExampleUnitTest.java
rename to app/src/test/java/com/s23d/ExampleUnitTest.java
index 516698b..4e29ac7 100644
--- a/app/src/test/java/jtheiner/drawingclassification/ExampleUnitTest.java
+++ b/app/src/test/java/com/s23d/ExampleUnitTest.java
@@ -1,17 +1,17 @@
-package jtheiner.drawingclassification;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see Testing documentation
- */
-public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() {
- assertEquals(4, 2 + 2);
- }
+package com.s23d;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 44e06ca..04417f8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,29 +1,29 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-buildscript {
-
- repositories {
- google()
- jcenter()
- }
- dependencies {
- classpath 'com.android.tools.build:gradle:4.0.1'
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
- classpath 'com.google.gms:google-services:4.3.3'
- }
-}
-
-
-
-allprojects {
- repositories {
- google()
- jcenter()
- }
-}
-
-
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+
+ ext {
+ kotlin_version = '1.4.0'
+ }
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:4.2.2'
+ classpath 'com.android.tools.build:bundletool:0.9.0'
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ classpath 'com.google.gms:google-services:4.3.10'
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/engine/build.gradle b/engine/build.gradle
index 56a01a8..69cca55 100644
--- a/engine/build.gradle
+++ b/engine/build.gradle
@@ -1,13 +1,13 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 27
+ compileSdkVersion 30
defaultConfig {
minSdkVersion 24
- targetSdkVersion 27
+ targetSdkVersion 30
versionCode 1
versionName "1.0"
@@ -31,11 +31,11 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation 'androidx.core:core:1.0.0'
- implementation 'androidx.appcompat:appcompat:1.0.0'
- testImplementation 'junit:junit:4.13'
- androidTestImplementation 'androidx.test.ext:junit:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
+ implementation 'androidx.core:core:1.3.2'
+ implementation 'androidx.appcompat:appcompat:1.2.0'
+ testImplementation 'junit:junit:4.13.1'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.2'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation 'com.fasterxml.jackson.core:jackson-core:2.11.2'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.2'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.2'
diff --git a/engine/src/androidTest/java/org/andresoviedo/android_3d_model_engine/ExampleInstrumentedTest.java b/engine/src/androidTest/java/org/andresoviedo/android_3d_model_engine/ExampleInstrumentedTest.java
index e0e3136..0784657 100644
--- a/engine/src/androidTest/java/org/andresoviedo/android_3d_model_engine/ExampleInstrumentedTest.java
+++ b/engine/src/androidTest/java/org/andresoviedo/android_3d_model_engine/ExampleInstrumentedTest.java
@@ -1,8 +1,9 @@
package org.andresoviedo.android_3d_model_engine;
import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/animation/Animator.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/animation/Animator.java
index 4c89ea9..d8891a7 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/animation/Animator.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/animation/Animator.java
@@ -36,9 +36,9 @@ public class Animator {
private final float[] IDENTITY_MATRIX = new float[16];
private final Map cache = new HashMap<>();
- private float animationTime = 0;
// TODO: implement slower/faster speed
- private float speed = 1f;
+ private final float speed = 1f;
+ private float animationTime = 0;
public Animator() {
Matrix.setIdentityM(IDENTITY_MATRIX, 0);
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/DrawerFactory.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/DrawerFactory.java
index 54dd920..295feb2 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/DrawerFactory.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/DrawerFactory.java
@@ -20,11 +20,11 @@ public class DrawerFactory {
* shader code loaded from raw resources
* resources are cached on activity thread
*/
- private Map shadersCode = new HashMap<>();
+ private final Map shadersCode = new HashMap<>();
/**
* list of opengl drawers
*/
- private Map drawers = new HashMap<>();
+ private final Map drawers = new HashMap<>();
public DrawerFactory(Context context) throws IllegalAccessException, IOException {
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/DrawerImpl.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/DrawerImpl.java
index c06a559..1b8f911 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/DrawerImpl.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/drawer/DrawerImpl.java
@@ -43,7 +43,7 @@ class DrawerImpl implements Object3D {
private final SparseArray cache1 = new SparseArray<>();
// animation data
// put 0 to draw progressively, -1 to draw at once
- private long counter = -1;
+ private final long counter = -1;
private double shift = -1d;
// does the device support drawElements for GL_UNSIGNED_INT or not?
private boolean drawUsingUnsignedInt = true;
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/model/Camera.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/model/Camera.java
index f040b60..8840a2d 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/model/Camera.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/model/Camera.java
@@ -15,11 +15,11 @@ public class Camera {
-ROOM_CENTER_SIZE, ROOM_CENTER_SIZE, -ROOM_CENTER_SIZE, ROOM_CENTER_SIZE);
private final BoundingBox roomBox = new BoundingBox("scene", -ROOM_SIZE, ROOM_SIZE,
-ROOM_SIZE, ROOM_SIZE, -ROOM_SIZE, ROOM_SIZE);
+ private final float[] buffer = new float[12 + 12 + 16 + 16];
public float xPos, yPos; // Camera position.
public float zPos;
public float xView, yView, zView; // Look at position.
public float xUp, yUp, zUp; // Up direction.
- private float[] buffer = new float[12 + 12 + 16 + 16];
private long animationCounter;
private Object[] lastAction;
private boolean changed = false;
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/model/Object3DData.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/model/Object3DData.java
index 66fcff0..6c41b69 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/model/Object3DData.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/model/Object3DData.java
@@ -32,6 +32,10 @@
*/
public class Object3DData {
+ private final List textureStreams = null;
+ private final HashMap textureCoords = new HashMap<>();
+ // errors detected
+ private final List errors = new ArrayList<>();
// Transformation data
protected float[] translation = new float[]{0f, 0f, 0f};
protected float[] position = new float[]{0f, 0f, 0f};
@@ -43,7 +47,6 @@ public class Object3DData {
protected float[] quadRotation = new float[]{0f, 0f, 0f, 1f};
protected float[] scale = new float[]{1, 1, 1};
protected float[] modelMatrix = new float[16];
-
// Model data for the simplest object
// opengl version to use to draw this object
private int version = 5;
@@ -87,13 +90,11 @@ public class Object3DData {
private List drawModeList = null;
// texture
private byte[] textureData = null;
- private List textureStreams = null;
private int textureWrapS = GLES20.GL_REPEAT;
private int textureWrapT = GLES20.GL_REPEAT;
private int textureMinFilter = GLES20.GL_NEAREST;
private int textureMagFilter = GLES20.GL_NEAREST;
private int isDoubleSided = 0;
- private HashMap textureCoords = new HashMap<>();
private FloatBuffer textureCoordsArrayBuffer = null;
private FloatBuffer emissiveTextureCoordsArrayBuffer = null;
// emissive texture
@@ -112,8 +113,6 @@ public class Object3DData {
private WavefrontLoader loader;
// collision detection
private Octree octree = null;
- // errors detected
- private List errors = new ArrayList<>();
{
Matrix.setIdentityM(modelMatrix, 0);
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/Object3DBuilder.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/Object3DBuilder.java
index 10495fb..10ac35b 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/Object3DBuilder.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/Object3DBuilder.java
@@ -340,7 +340,7 @@ public final class Object3DBuilder {
/**
* Default vertices colors
*/
- private static float[] DEFAULT_COLOR = {1.0f, 1.0f, 0, 1.0f};
+ private static final float[] DEFAULT_COLOR = {1.0f, 1.0f, 0, 1.0f};
//@formatter:on
public static Object3DData buildPoint(float[] point) {
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/MeshData.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/MeshData.java
index 271ee28..9fafe64 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/MeshData.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/MeshData.java
@@ -11,16 +11,16 @@ public class MeshData {
private static final int DIMENSIONS = 3;
- private String id;
- private float[] vertices;
- private float[] textureCoords;
- private float[] normals;
- private float[] color;
- private FloatBuffer colorsBuffer;
- private String texture;
- private int[] indices;
- private int[] jointIds;
- private float[] vertexWeights;
+ private final String id;
+ private final float[] vertices;
+ private final float[] textureCoords;
+ private final float[] normals;
+ private final float[] color;
+ private final FloatBuffer colorsBuffer;
+ private final String texture;
+ private final int[] indices;
+ private final int[] jointIds;
+ private final float[] vertexWeights;
public MeshData(String id, float[] vertices, float[] textureCoords, float[] normals, float[] color, FloatBuffer colorsBuffer, String texture, int[] indices,
int[] jointIds, float[] vertexWeights) {
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/Vertex.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/Vertex.java
index 1fca5af..959a710 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/Vertex.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/Vertex.java
@@ -3,14 +3,11 @@
public class Vertex {
private static final int NO_INDEX = -1;
-
+ private final float length;
private float[] position;
private int textureIndex = NO_INDEX;
private int normalIndex = NO_INDEX;
private int colorIndex = NO_INDEX;
- private float length;
-
-
private VertexSkinData weightsData;
public Vertex(float[] position) {
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/VertexSkinData.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/VertexSkinData.java
index 0b2cce1..0e94b86 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/VertexSkinData.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/entities/VertexSkinData.java
@@ -5,8 +5,8 @@
public class VertexSkinData {
- public final List jointIds = new ArrayList();
- public final List weights = new ArrayList();
+ public final List jointIds = new ArrayList<>();
+ public final List weights = new ArrayList<>();
public void addJointEffect(int jointId, float weight) {
for (int i = 0; i < weights.size(); i++) {
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/AnimationLoader.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/AnimationLoader.java
index 4f976ee..a3b5405 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/AnimationLoader.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/AnimationLoader.java
@@ -15,8 +15,8 @@
public class AnimationLoader {
- private XmlNode animationData;
- private XmlNode jointHierarchy;
+ private final XmlNode animationData;
+ private final XmlNode jointHierarchy;
public AnimationLoader(XmlNode animationData, XmlNode jointHierarchy) {
this.animationData = animationData;
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/GeometryLoader.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/GeometryLoader.java
index 96ea00b..5229010 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/GeometryLoader.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/GeometryLoader.java
@@ -29,14 +29,14 @@ public class GeometryLoader {
private final XmlNode materialsData;
private final XmlNode effectsData;
private final XmlNode imagesNode;
+ private final Map skinningDataMap;
+ private final SkeletonData skeletonData;
List vertices = new ArrayList<>();
List vertex = new ArrayList<>();
List textures = new ArrayList<>();
List normals = new ArrayList<>();
List indices = new ArrayList<>();
List colors = new ArrayList<>();
- private Map skinningDataMap;
- private SkeletonData skeletonData;
private float[] verticesArray;
private float[] normalsArray;
private float[] texturesArray;
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/SkeletonLoader.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/SkeletonLoader.java
index 96899f4..7bba58c 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/SkeletonLoader.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/collada/loader/SkeletonLoader.java
@@ -18,7 +18,7 @@ public class SkeletonLoader {
private final SkinningData skinningData;
- private List boneOrder;
+ private final List boneOrder;
private int jointCount = 0;
private boolean jointFound = false;
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/GltfLoader.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/GltfLoader.java
index 22f4c76..9f6ca3e 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/GltfLoader.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/GltfLoader.java
@@ -35,13 +35,13 @@
*/
public class GltfLoader {
- private static Map keyHandleMap = new HashMap<>();
- private static String[] textureKeys = {"baseColorTexture"
+ private static final Map keyHandleMap = new HashMap<>();
+ private static final String[] textureKeys = {"baseColorTexture"
, "emissiveTexture"
, "occlusionTexture"
, "normalTexture"};
- private static Map> nodeMap = new HashMap<>();
+ private static final Map> nodeMap = new HashMap<>();
// read model data and fill in data in Object3DData structure
public static Object[] buildAnimatedModel(URI uri) throws IOException {
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/GltfModelData.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/GltfModelData.java
index 3e19db6..4437036 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/GltfModelData.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/GltfModelData.java
@@ -12,16 +12,16 @@ public class GltfModelData {
private static final int DIMENSIONS = 3;
- private String id;
- private float[] vertices;
- private float[] textureCoords;
- private float[] normals;
- private float[] color;
- private FloatBuffer colorsBuffer;
- private String texture;
- private int[] indices;
- private int[] jointIds;
- private float[] vertexWeights;
+ private final String id;
+ private final float[] vertices;
+ private final float[] textureCoords;
+ private final float[] normals;
+ private final float[] color;
+ private final FloatBuffer colorsBuffer;
+ private final String texture;
+ private final int[] indices;
+ private final int[] jointIds;
+ private final float[] vertexWeights;
public GltfModelData(String id, float[] vertices, float[] textureCoords, float[] normals,
float[] color, FloatBuffer colorsBuffer, String texture, int[] indices,
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/jgltf_model/io/v2/GltfAssetWriterV2.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/jgltf_model/io/v2/GltfAssetWriterV2.java
index 8a63878..d47cd3f 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/jgltf_model/io/v2/GltfAssetWriterV2.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/gltf/jgltf_model/io/v2/GltfAssetWriterV2.java
@@ -163,7 +163,7 @@ private static class ChunkData {
/**
* The stream that will collect the data
*/
- private ByteArrayOutputStream baos;
+ private final ByteArrayOutputStream baos;
/**
* Default constructor
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/stl/STLBinaryParser.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/stl/STLBinaryParser.java
index 4e0ee88..9fd0b63 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/stl/STLBinaryParser.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/stl/STLBinaryParser.java
@@ -37,32 +37,29 @@ class STLBinaryParser extends STLParser {
/**
* size of binary header
*/
- private static int HEADER_SIZE = 84;
+ private static final int HEADER_SIZE = 84;
/**
* size of one facet record in binary format
*/
- private static int RECORD_SIZE = 50;
+ private static final int RECORD_SIZE = 50;
/**
* size of comments in header
*/
- private static int COMMENT_SIZE = 80;
-
- /**
- * The stream that is being read from
- */
- private BufferedInputStream itsStream;
-
+ private static final int COMMENT_SIZE = 80;
/**
* Common buffer for reading
*/
- private byte[] itsReadBuffer;
-
+ private final byte[] itsReadBuffer;
/**
* Common buffer for reading the converted data from bytes
*/
- private int[] itsDataBuffer;
+ private final int[] itsDataBuffer;
+ /**
+ * The stream that is being read from
+ */
+ private BufferedInputStream itsStream;
public STLBinaryParser() {
itsReadBuffer = new byte[48];
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/stl/STLFileReader.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/stl/STLFileReader.java
index 0fca764..a5f6ea7 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/stl/STLFileReader.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/stl/STLFileReader.java
@@ -36,7 +36,7 @@
* @version $Revision: 1.3 $
*/
public class STLFileReader {
- private STLParser itsParser;
+ private final STLParser itsParser;
/**
* Creates a STLFileReader object to read a STL file from a
diff --git a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/wavefront/WavefrontLoader.java b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/wavefront/WavefrontLoader.java
index a01dedf..dc227f5 100644
--- a/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/wavefront/WavefrontLoader.java
+++ b/engine/src/main/java/org/andresoviedo/android_3d_model_engine/services/wavefront/WavefrontLoader.java
@@ -60,6 +60,11 @@ public class WavefrontLoader {
private static final float DUMMY_Z_TC = -5.0f;
// flags
private static final int triangleMode = GLES20.GL_TRIANGLE_FAN;
+ private final ArrayList texCoords;
+ private final FaceMaterials faceMats; // materials used by faces
+ private final ModelDimensions modelDims; // model dimensions
+ private final String modelNm; // without path or ".OBJ" extension
+ private final float maxSize; // for scaling the model
// metadata
int numVerts = 0;
// whether the model uses 3D or 2D tex coords
@@ -71,13 +76,8 @@ public class WavefrontLoader {
int numTriangles = 0;
int numVertsReferences = 0;
private boolean hasTCs3D = false;
- private ArrayList texCoords;
private Faces faces; // model faces
- private FaceMaterials faceMats; // materials used by faces
private Materials materials; // materials defined in MTL file
- private ModelDimensions modelDims; // model dimensions
- private String modelNm; // without path or ".OBJ" extension
- private float maxSize; // for scaling the model
// buffers
private FloatBuffer vertsBuffer;
private FloatBuffer normalsBuffer;
@@ -481,14 +481,13 @@ public void setZ(float zc) {
} // end of Tuple3 class
public static class ModelDimensions {
+ // for reporting
+ private final DecimalFormat df = new DecimalFormat("0.##"); // 2 dp
// edge coordinates
public float leftPt, rightPt; // on x-axis
public float topPt, bottomPt; // on y-axis
public float farPt, nearPt; // on z-axis
- // for reporting
- private DecimalFormat df = new DecimalFormat("0.##"); // 2 dp
-
public ModelDimensions() {
leftPt = 0.0f;
rightPt = 0.0f;
@@ -694,15 +693,13 @@ public Material getMaterial(String name) {
} // end of Materials class
public static class Material {
- private String name;
-
+ private final String name;
+ // texture info
+ private final String texFnm;
// colour info
private Tuple3 ka, kd, ks; // ambient, diffuse, specular colours
private float ns; // shininess
private float d; // alpha
-
- // texture info
- private String texFnm;
private String texture;
public Material(String nm) {
@@ -1004,10 +1001,10 @@ public IntBuffer getIndexBuffer() {
public static class FaceMaterials {
// the face index (integer) where a material is first used
- private HashMap faceMats;
+ private final HashMap faceMats;
// for reporting
- private HashMap matCount;
+ private final HashMap matCount;
// how many times a material (string) is used
diff --git a/engine/src/main/java/org/andresoviedo/util/android/ContentUtils.java b/engine/src/main/java/org/andresoviedo/util/android/ContentUtils.java
index 3a4fce0..cc4c41a 100644
--- a/engine/src/main/java/org/andresoviedo/util/android/ContentUtils.java
+++ b/engine/src/main/java/org/andresoviedo/util/android/ContentUtils.java
@@ -28,9 +28,9 @@ public class ContentUtils {
/**
* Documents opened by the user. This list helps finding the relative filenames found in the model
*/
- private static Map documentsProvided = new HashMap<>();
+ private static final Map documentsProvided = new HashMap<>();
- private static ThreadLocal currentActivity = new ThreadLocal<>();
+ private static final ThreadLocal currentActivity = new ThreadLocal<>();
private static File currentDir = null;
diff --git a/engine/src/main/java/org/andresoviedo/util/android/SystemUiHider.java b/engine/src/main/java/org/andresoviedo/util/android/SystemUiHider.java
index b1243ed..3c33d87 100644
--- a/engine/src/main/java/org/andresoviedo/util/android/SystemUiHider.java
+++ b/engine/src/main/java/org/andresoviedo/util/android/SystemUiHider.java
@@ -55,7 +55,7 @@ public abstract class SystemUiHider {
/**
* A dummy no-op callback for use when there is no other listener set.
*/
- private static OnVisibilityChangeListener sDummyListener = new OnVisibilityChangeListener() {
+ private static final OnVisibilityChangeListener sDummyListener = new OnVisibilityChangeListener() {
@Override
public void onVisibilityChange(boolean visible) {
}
diff --git a/engine/src/main/java/org/andresoviedo/util/android/SystemUiHiderHoneycomb.java b/engine/src/main/java/org/andresoviedo/util/android/SystemUiHiderHoneycomb.java
index ce8e3e2..2307cfa 100644
--- a/engine/src/main/java/org/andresoviedo/util/android/SystemUiHiderHoneycomb.java
+++ b/engine/src/main/java/org/andresoviedo/util/android/SystemUiHiderHoneycomb.java
@@ -37,7 +37,7 @@ public class SystemUiHiderHoneycomb extends SystemUiHiderBase {
* {@link android.view.View.OnSystemUiVisibilityChangeListener}.
*/
private boolean mVisible = true;
- private View.OnSystemUiVisibilityChangeListener mSystemUiVisibilityChangeListener = new View.OnSystemUiVisibilityChangeListener() {
+ private final View.OnSystemUiVisibilityChangeListener mSystemUiVisibilityChangeListener = new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int vis) {
// Test against mTestFlags to see if the system UI is visible.
diff --git a/engine/src/main/java/org/andresoviedo/util/xml/XmlNode.java b/engine/src/main/java/org/andresoviedo/util/xml/XmlNode.java
index 124e92a..8ed96f0 100644
--- a/engine/src/main/java/org/andresoviedo/util/xml/XmlNode.java
+++ b/engine/src/main/java/org/andresoviedo/util/xml/XmlNode.java
@@ -14,7 +14,7 @@
*/
public class XmlNode {
- private String name;
+ private final String name;
private Map attributes;
private String data;
private Map> childNodes;
diff --git a/gradle.properties b/gradle.properties
index 06966a0..589339a 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,15 +1,20 @@
-# Project-wide Gradle settings.
-# IDE (e.g. Android Studio) users:
-# Gradle settings configured through the IDE *will override*
-# any settings specified in this file.
-# For more details on how to configure your build environment visit
-# http://www.gradle.org/docs/current/userguide/build_environment.html
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-android.enableJetifier=true
-android.useAndroidX=true
-org.gradle.jvmargs=-Xmx1536m
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+android.enableJetifier=true
+android.useAndroidX=true
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# Release info
+RELEASE_STORE_FILE=C\:\\Users\\xxxxx\\StudioProjects\\Skrind\\SkrindKeyStore.jks
+RELEASE_STORE_PASSWORD=Skrind54321
+RELEASE_KEY_ALIAS=keySkrindPrediagn
+RELEASE_KEY_PASSWORD=Skrind54321
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 0e62ad2..7a21819 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sat Sep 05 14:02:15 WAT 2020
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
+#Sun Aug 29 01:19:43 WAT 2021
+distributionBase=GRADLE_USER_HOME
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
+distributionPath=wrapper/dists
+zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/gradlew b/gradlew
index 518efff..cccdd3d 100644
--- a/gradlew
+++ b/gradlew
@@ -1,172 +1,172 @@
-#!/usr/bin/env sh
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn () {
- echo "$*"
-}
-
-die () {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=$(save "$@")
-
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
- cd "$(dirname "$0")"
-fi
-
-exec "$JAVACMD" "$@"
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index e95643d..f955316 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,84 +1,84 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
index 6608692..a1781b6 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':app', ':engine'
+include ':app', ':engine'