Anonymous XMPP connection + preparing Ad-Hoc command

This commit is contained in:
chteufleur 2018-10-03 11:41:01 +02:00
parent fd2947d9b8
commit e41c3e9948
34 changed files with 799 additions and 53 deletions

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: com.google.zxing:core:3.2.1@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.zxing/core/3.2.1/2287494d4f5f9f3a9a2bb6980e3f32053721b315/core-3.2.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.zxing/core/3.2.1/e88788f756edecae963417e07b690e88aaaa7c15/core-3.2.1-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: de.measite.minidns:minidns-core:0.2.4@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.measite.minidns/minidns-core/0.2.4/e4a6561fade362814e336c9402b2c4341b6a5189/minidns-core-0.2.4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.measite.minidns/minidns-core/0.2.4/2bfa0923df30a7254ea0110329c9eebce14d507f/minidns-core-0.2.4-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: de.measite.minidns:minidns-dnssec:0.2.4@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.measite.minidns/minidns-dnssec/0.2.4/a379c5dc82d6e9d5d6c3fa3c56a048bfbb89d3b6/minidns-dnssec-0.2.4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.measite.minidns/minidns-dnssec/0.2.4/84d0c25d677b10ff5111a669b05ec678c80b3ec8/minidns-dnssec-0.2.4-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: de.measite.minidns:minidns-hla:0.2.4@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.measite.minidns/minidns-hla/0.2.4/c4b9a2cf4da635c38ebf7982a276a05850eaaf98/minidns-hla-0.2.4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.measite.minidns/minidns-hla/0.2.4/19b7f2edf7b15f619261e9475520ad9c96dcbaa4/minidns-hla-0.2.4-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: de.measite.minidns:minidns-iterative-resolver:0.2.4@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.measite.minidns/minidns-iterative-resolver/0.2.4/bd9864adf15337f87d4ed4b46fd50f395f1cc721/minidns-iterative-resolver-0.2.4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/de.measite.minidns/minidns-iterative-resolver/0.2.4/9874a559dda1d698f745bee9885c0be8ada3638d/minidns-iterative-resolver-0.2.4-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,10 @@
<component name="libraryTable">
<library name="Gradle: me.dm7.barcodescanner:core-1.9">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/core-1.9.aar/35f5bbf1c3c89e4cf8f6be1211d87d50/jars/classes.jar!/" />
<root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/core-1.9.aar/35f5bbf1c3c89e4cf8f6be1211d87d50/res" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -0,0 +1,10 @@
<component name="libraryTable">
<library name="Gradle: me.dm7.barcodescanner:zxing-1.9">
<CLASSES>
<root url="file://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/zxing-1.9.aar/4fe25337b4e8593ab11fc6034f238ff3/res" />
<root url="jar://$USER_HOME$/.gradle/caches/transforms-1/files-1.1/zxing-1.9.aar/4fe25337b4e8593ab11fc6034f238ff3/jars/classes.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.igniterealtime.smack:smack-android:4.2.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-android/4.2.0/1fba3d428a9118497469dd723ae60ab9f44e19ab/smack-android-4.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-android/4.2.0/85500dc0a7abbcce1313431953c47d8bf4728559/smack-android-4.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.igniterealtime.smack:smack-android-extensions:4.2.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-android-extensions/4.2.0/ed0c66a3b414382155b00d08652145ceaed23856/smack-android-extensions-4.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-android-extensions/4.2.0/bafc8db5015e078bd28c7c8531eabc4a1af900d1/smack-android-extensions-4.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.igniterealtime.smack:smack-core:4.2.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-core/4.2.0/b460b28484d6315dfa158af0bb9a050c92ea106f/smack-core-4.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-core/4.2.0/2b049a427e166f79c8b6063a54b9d34f2c376e48/smack-core-4.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.igniterealtime.smack:smack-extensions:4.2.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-extensions/4.2.0/3bffdc845de26ab601ac9a92e53c02f8676609fe/smack-extensions-4.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-extensions/4.2.0/285595c8d6ced29196ea5552148836e69e8d07cc/smack-extensions-4.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.igniterealtime.smack:smack-im:4.2.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-im/4.2.0/c1805ee14fe07ac65683e4b22d796d30a4171fd9/smack-im-4.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-im/4.2.0/781f1a714249b1330d218b242127a8bdba722839/smack-im-4.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.igniterealtime.smack:smack-resolver-minidns:4.2.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-resolver-minidns/4.2.0/f455576bef17e16ff5627fee48586aefe3855026/smack-resolver-minidns-4.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-resolver-minidns/4.2.0/d00c3103c0f479f85e3ec9b0a4685625097b612b/smack-resolver-minidns-4.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.igniterealtime.smack:smack-sasl-provided:4.2.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-sasl-provided/4.2.0/dd5420f029cd3251fd8dfaa3de93ef8a8a607fc8/smack-sasl-provided-4.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-sasl-provided/4.2.0/e5938aef4210cab2b68ef9aa1283fc869cea8537/smack-sasl-provided-4.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.igniterealtime.smack:smack-tcp:4.2.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-tcp/4.2.0/1ebbf8b432a4d154171141dcd5aef800e43ab1cd/smack-tcp-4.2.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.igniterealtime.smack/smack-tcp/4.2.0/84567022565b936ed9d65eb0dceccc8c0e9d6eb3/smack-tcp-4.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.jxmpp:jxmpp-core:0.5.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jxmpp/jxmpp-core/0.5.0/f87f6947d74e7d126965b8a58a5472bbbea5f956/jxmpp-core-0.5.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jxmpp/jxmpp-core/0.5.0/afd7bb9e2de02cd1fd267bbe3b360c1769de726f/jxmpp-core-0.5.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.jxmpp:jxmpp-jid:0.5.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jxmpp/jxmpp-jid/0.5.0/eb66b23d633f6a8c01526a78507dac80afef239c/jxmpp-jid-0.5.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jxmpp/jxmpp-jid/0.5.0/cd9e5d82c11aebf948aed1945c98b7196748b294/jxmpp-jid-0.5.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: org.jxmpp:jxmpp-util-cache:0.5.0@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jxmpp/jxmpp-util-cache/0.5.0/32752e1fdf24320a2363d9b92504abf05f9b6548/jxmpp-util-cache-0.5.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jxmpp/jxmpp-util-cache/0.5.0/dc6cdd925ebeaba7593aa80e377738c431a6f02c/jxmpp-util-cache-0.5.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="Gradle: xpp3:xpp3:1.1.4c@jar">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/xpp3/xpp3/1.1.4c/9b988ea84b9e4e9f1874e390ce099b8ac12cfff5/xpp3-1.1.4c.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/xpp3/xpp3/1.1.4c/8dd0ddee19fe6ed0182b18e0e621d1c8b4d8d56/xpp3-1.1.4c-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -116,6 +116,31 @@
</content>
<orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Gradle: org.igniterealtime.smack:smack-resolver-minidns:4.2.0@jar" level="project" />
<orderEntry type="library" name="Gradle: org.jxmpp:jxmpp-jid:0.5.0@jar" level="project" />
<orderEntry type="library" name="Gradle: org.osmdroid:osmdroid-android-6.0.2" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-1.1.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-media-compat-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: de.measite.minidns:minidns-hla:0.2.4@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-annotations:26.1.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-v4-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: org.igniterealtime.smack:smack-extensions:4.2.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:recyclerview-v7-26.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
<orderEntry type="library" name="Gradle: xpp3:xpp3:1.1.4c@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.0.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-ui-26.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:monitor-1.0.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-utils-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-solver:1.1.2@jar" level="project" />
<orderEntry type="library" name="Gradle: me.dm7.barcodescanner:core-1.9" level="project" />
<orderEntry type="library" name="Gradle: org.igniterealtime.smack:smack-sasl-provided:4.2.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:design-26.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: net.sf.kxml:kxml2:2.3.0@jar" level="project" />
<orderEntry type="library" name="Gradle: de.measite.minidns:minidns-iterative-resolver:0.2.4@jar" level="project" />
<orderEntry type="library" name="Gradle: org.igniterealtime.smack:smack-tcp:4.2.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner-1.0.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-26.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support:support-annotations:27.1.1@jar" level="project" />
@ -123,30 +148,24 @@
<orderEntry type="library" name="Gradle: com.android.support:appcompat-v7-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-fragment-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:common:1.0.0@jar" level="project" />
<orderEntry type="library" name="Gradle: org.osmdroid:osmdroid-android-6.0.2" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-1.1.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-media-compat-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-annotations:26.1.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-v4-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-compat-26.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:recyclerview-v7-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: org.jxmpp:jxmpp-util-cache:0.5.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core-3.0.2" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
<orderEntry type="library" name="Gradle: org.igniterealtime.smack:smack-core:4.2.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.google.zxing:core:3.2.1@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: junit:junit:4.12@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.0.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable-26.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-ui-26.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:monitor-1.0.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-utils-26.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource-3.0.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-solver:1.1.2@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: me.dm7.barcodescanner:zxing-1.9" level="project" />
<orderEntry type="library" name="Gradle: org.jxmpp:jxmpp-core:0.5.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:design-26.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: net.sf.kxml:kxml2:2.3.0@jar" level="project" />
<orderEntry type="library" name="Gradle: org.igniterealtime.smack:smack-im:4.2.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: org.igniterealtime.smack:smack-android:4.2.0@jar" level="project" />
<orderEntry type="library" name="Gradle: de.measite.minidns:minidns-core:0.2.4@jar" level="project" />
<orderEntry type="library" name="Gradle: de.measite.minidns:minidns-dnssec:0.2.4@jar" level="project" />
<orderEntry type="library" name="Gradle: org.igniterealtime.smack:smack-android-extensions:4.2.0@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime-1.0.0" level="project" />
</component>
</module>

View File

@ -28,4 +28,13 @@ dependencies {
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'org.osmdroid:osmdroid-android:6.0.2'
// XMPP (Smack)
//implementation "org.igniterealtime.smack:smack-android:4.2.0"
implementation "org.igniterealtime.smack:smack-android-extensions:4.2.0"
implementation "org.igniterealtime.smack:smack-tcp:4.2.0"
// QR Code (Zxing)
implementation 'com.google.zxing:core:3.2.1'
implementation 'me.dm7.barcodescanner:zxing:1.9'
//implementation 'com.journeyapps:zxing-android-embedded:3.4.0'
}

View File

@ -22,6 +22,9 @@
</activity>
<activity android:name=".FilePicker"></activity>
<activity android:name=".QRCodeGeneratorActivity"></activity>
<activity android:name=".QRCodeReaderActivity"></activity>
</application>
@ -32,4 +35,5 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.CAMERA" />
</manifest>

View File

@ -18,6 +18,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
@ -28,6 +29,9 @@ import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jxmpp.stringprep.XmppStringprepException;
import org.osmdroid.api.IMapController;
import org.osmdroid.config.Configuration;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
@ -44,6 +48,7 @@ import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider;
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
@ -53,16 +58,22 @@ import fr.chteufleur.mytrackingdog.models.beans.MyLocation;
import fr.chteufleur.mytrackingdog.models.beans.MyLocationArray;
import fr.chteufleur.mytrackingdog.models.beans.WayPointLocation;
import fr.chteufleur.mytrackingdog.services.ServiceGps;
import fr.chteufleur.mytrackingdog.services.ServiceXmpp;
public class MainActivity extends AppCompatActivity implements IOrientationConsumer, Observer {
public static final String TAG = MainActivity.class.getName();
private static final int ACTIVITY_REQUEST_PICK_FILE = 1;
private static final int ACTIVITY_QR_CODE_GENERATOR = 2;
private static final int ACTIVITY_QR_CODE_READER = 3;
public static String appName = "";
private MyLocationNewOverlay mLocationOverlay;
private IOrientationProvider compass = null;
private ServiceGps serviceGps = null;
private ServiceXmpp serviceXmpp = null;
private Context ctx = null;
private MapView map = null;
@ -188,6 +199,22 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
);
serviceGps.addObserver(this);
}
if (serviceXmpp == null) {
try {
serviceXmpp = new ServiceXmpp(getResources());
serviceXmpp.addObserver(this);
serviceXmpp.connect();
} catch (InterruptedException e) {
Toast.makeText(ctx, "Échec du service XMPP.", Toast.LENGTH_LONG).show();
} catch (XMPPException e) {
Toast.makeText(ctx, "Échec du service XMPP.", Toast.LENGTH_LONG).show();
} catch (SmackException e) {
Toast.makeText(ctx, "Échec du service XMPP.", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(ctx, "Échec du service XMPP.", Toast.LENGTH_LONG).show();
}
}
}
private void changeStatusTrace() {
@ -365,6 +392,9 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
if (serviceGps != null) {
serviceGps.stop();
}
if (serviceXmpp != null) {
serviceXmpp.close();
}
zoomed = false;
}
@ -389,9 +419,17 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
if (id == R.id.action_import_gpx) {
Intent intent = new Intent(this, FilePicker.class);
intent.putExtra(FilePicker.EXTRA_FILE_PATH, Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + appName);
startActivityForResult(intent, REQUEST_PICK_FILE);
startActivityForResult(intent, ACTIVITY_REQUEST_PICK_FILE);
return true;
} else if (id == R.id.action_qr_code_generator) {
Intent intent = new Intent(this, QRCodeGeneratorActivity.class);
startActivityForResult(intent, ACTIVITY_QR_CODE_GENERATOR);
} else if (id == R.id.action_qr_code_reader) {
Intent intent = new Intent(this, QRCodeReaderActivity.class);
startActivityForResult(intent, ACTIVITY_QR_CODE_READER);
} else if (id == R.id.action_send_gpx_trail) {
File trailFile = serviceGps.getLastExportedTrailFile();
if (trailFile != null) {
@ -415,13 +453,12 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
return super.onOptionsItemSelected(item);
}
private static final int REQUEST_PICK_FILE = 1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_PICK_FILE:
case ACTIVITY_REQUEST_PICK_FILE:
if (data.hasExtra(FilePicker.EXTRA_FILE_PATH)) {
serviceGps.importGpxTrace(new File(data.getStringExtra(FilePicker.EXTRA_FILE_PATH)));
updateDogTrace();
@ -444,6 +481,23 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
}
}
break;
case ACTIVITY_QR_CODE_READER:
if (data.hasExtra(QRCodeReaderActivity.EXTRA_SCANNED_TEXT)) {
String text = data.getStringExtra(QRCodeReaderActivity.EXTRA_SCANNED_TEXT);
try {
serviceXmpp.setOtherJid(text);
serviceXmpp.sendPresenceAvailable();
Log.i(TAG, "TEXT: "+text);
} catch (SmackException.NotConnectedException e) {
Log.e(TAG, "Fail send presence", e);
} catch (InterruptedException e) {
Log.e(TAG, "Fail send presence", e);
} catch (XmppStringprepException e) {
Log.e(TAG, "Fail send presence", e);
}
}
break;
}
}
}
@ -557,6 +611,13 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
@Override
public void update(Observable observable, Object o) {
if (observable == serviceGps) {
updateServiceGps(o);
} else if (observable == serviceXmpp) {
updateServiceXmpp(o);
}
}
public void updateServiceGps(Object o) {
if (o instanceof String && o.equals(ServiceGps.NOTIF_NEW_LOCATION)) {
MyLocation loc = serviceGps.getCurrentLocation();
if (loc != null) {
@ -593,6 +654,8 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
}
}
}
public void updateServiceXmpp(Object o) {
}
private List<GeoPoint> convertListLocation(MyLocationArray list) {

View File

@ -0,0 +1,60 @@
package fr.chteufleur.mytrackingdog;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
public class QRCodeGeneratorActivity extends Activity {
public static final String TAG = QRCodeGeneratorActivity.class.getName();
public final static int QRcodeWidth = 500 ;
private ImageView imageView;
private static Bitmap image = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.qr_code_generator);
imageView = findViewById(R.id.qr_code_image);
if (image != null) {
imageView.setImageBitmap(image);
}
}
public static void textToImageEncode(String value, Resources resources) throws WriterException {
Log.i(TAG, "QR CODE "+value);
BitMatrix bitMatrix;
try {
bitMatrix = new MultiFormatWriter().encode(
value,
BarcodeFormat.DATA_MATRIX.QR_CODE,
QRcodeWidth, QRcodeWidth, null
);
} catch (IllegalArgumentException Illegalargumentexception) {
return;
}
int bitMatrixWidth = bitMatrix.getWidth();
int bitMatrixHeight = bitMatrix.getHeight();
int[] pixels = new int[bitMatrixWidth * bitMatrixHeight];
for (int y = 0; y < bitMatrixHeight; y++) {
int offset = y * bitMatrixWidth;
for (int x = 0; x < bitMatrixWidth; x++) {
pixels[offset + x] = bitMatrix.get(x, y) ?
resources.getColor(R.color.black):resources.getColor(R.color.white);
}
}
image = Bitmap.createBitmap(bitMatrixWidth, bitMatrixHeight, Bitmap.Config.ARGB_4444);
image.setPixels(pixels, 0, 500, 0, 0, bitMatrixWidth, bitMatrixHeight);
Log.i(TAG, "FIN GENERATION QR CODE");
}
}

View File

@ -0,0 +1,64 @@
package fr.chteufleur.mytrackingdog;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import com.google.zxing.Result;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
public class QRCodeReaderActivity extends Activity implements ZXingScannerView.ResultHandler {
private final int REQUEST_CODE_ASK_PERMISSION = 123;
public static final String EXTRA_SCANNED_TEXT = "scanned_text";
public static final String TAG = QRCodeReaderActivity.class.getName();
private ZXingScannerView mScannerView;
@RequiresApi(api = Build.VERSION_CODES.M)
protected void checkPermissions() {
int hasCameraPermission = checkSelfPermission(Manifest.permission.CAMERA);
if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_ASK_PERMISSION);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkPermissions();
}
setContentView(R.layout.qr_code_reader);
mScannerView = new ZXingScannerView(this);
setContentView(mScannerView);
}
@Override
public void onResume() {
super.onResume();
mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
mScannerView.startCamera(); // Start camera on resume
}
@Override
public void onPause() {
super.onPause();
mScannerView.stopCamera(); // Stop camera on pause
}
@Override
public void handleResult(Result rawResult) {
Intent extra = new Intent();
extra.putExtra(EXTRA_SCANNED_TEXT, rawResult.getText());
setResult(RESULT_OK, extra);
finish();
}
}

View File

@ -0,0 +1,102 @@
package fr.chteufleur.mytrackingdog.models.xmpp.commands;
import android.util.Log;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smackx.commands.AdHocCommandNote;
import org.jivesoftware.smackx.commands.LocalCommand;
import org.jivesoftware.smackx.xdata.Form;
import org.jivesoftware.smackx.xdata.FormField;
import org.jivesoftware.smackx.xdata.packet.DataForm;
import org.jxmpp.jid.Jid;
import java.util.List;
public class TrailGeolocCommand extends LocalCommand {
public static final String TAG = TrailGeolocCommand.class.getName();
public static final String FIELD_PARAM_LATITUDE = "latitude";
public static final String FIELD_PARAM_LONGITUDE = "longitude";
public static final String FIELD_PARAM_TIME = "time";
private long latitude;
private long longitude;
private int time;
@Override
public boolean isLastStage() {
return getCurrentStage() == 1;
}
@Override
public boolean hasPermission(Jid jid) {
// TODO
return true;
}
@Override
public void execute() throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException {
Form result = new Form(DataForm.Type.form);
setExecuteAction(Action.next);
FormField resultFieldLatitude = new FormField(FIELD_PARAM_LATITUDE);
resultFieldLatitude.setLabel(FIELD_PARAM_LATITUDE);
resultFieldLatitude.setType(FormField.Type.text_single);
result.addField(resultFieldLatitude);
FormField resultFieldLongitude = new FormField(FIELD_PARAM_LONGITUDE);
resultFieldLongitude.setLabel(FIELD_PARAM_LONGITUDE);
resultFieldLongitude.setType(FormField.Type.text_single);
result.addField(resultFieldLongitude);
FormField resultFieldTime = new FormField(FIELD_PARAM_TIME);
resultFieldTime.setLabel(FIELD_PARAM_TIME);
resultFieldTime.setType(FormField.Type.text_single);
result.addField(resultFieldTime);
this.addActionAvailable(Action.next);
setForm(result);
}
@Override
public void next(Form response) throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException {
FormField formLatitude = response.getField(FIELD_PARAM_LATITUDE);
FormField formLongitude = response.getField(FIELD_PARAM_LONGITUDE);
FormField formTime = response.getField(FIELD_PARAM_TIME);
if (formLatitude != null && formLongitude != null && formTime != null) {
List<String> latitudeStrs = formLatitude.getValues();
List<String> longitudeStrs = response.getField(FIELD_PARAM_LONGITUDE).getValues();
List<String> timeStrs = response.getField(FIELD_PARAM_TIME).getValues();
for (String latitudeStr : latitudeStrs) {
Log.i(TAG, "Next latitude: " + latitudeStr);
}
for (String longitudeStr : longitudeStrs) {
Log.i(TAG, "Next longitude: " + longitudeStr);
}
for (String timeStr : timeStrs) {
Log.i(TAG, "Next time: " + timeStr);
}
this.addNote(new AdHocCommandNote(AdHocCommandNote.Type.info, "SUCCESS"));
} else {
this.addNote((new AdHocCommandNote(AdHocCommandNote.Type.error, "FAIL")));
}
}
@Override
public void complete(Form response) throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException {
}
@Override
public void prev() throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException {
}
@Override
public void cancel() throws SmackException.NoResponseException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, InterruptedException {
}
}

View File

@ -34,7 +34,7 @@ import fr.chteufleur.mytrackingdog.models.beans.WayPointLocation;
public class ServiceGps extends Observable implements IServiceGps, LocationListener {
private static final String TAG = ServiceGps.class.getName();
public static final String NOTIF_NEW_LOCATION = "fr.chteufleur.mytrackingdog.services.servicegps.newlocation";
public static final String NOTIF_NEW_LOCATION = ServiceGps.class.getName()+".newlocation";
private static final String PREF_VIBRATION_NEAR_OBJECT_ENABLED = "PREF_VIBRATION_NEAR_OBJECT_ENABLED";

View File

@ -0,0 +1,177 @@
package fr.chteufleur.mytrackingdog.services;
import android.content.res.Resources;
import android.os.StrictMode;
import android.util.Log;
import com.google.zxing.WriterException;
import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.roster.PresenceEventListener;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jivesoftware.smackx.commands.AdHocCommandManager;
import org.jivesoftware.smackx.commands.LocalCommand;
import org.jxmpp.jid.BareJid;
import org.jxmpp.jid.FullJid;
import org.jxmpp.jid.Jid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.jid.impl.LocalAndDomainpartJid;
import org.jxmpp.jid.impl.LocalDomainAndResourcepartJid;
import org.jxmpp.stringprep.XmppStringprepException;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.Observable;
import fr.chteufleur.mytrackingdog.QRCodeGeneratorActivity;
import fr.chteufleur.mytrackingdog.models.xmpp.commands.TrailGeolocCommand;
public class ServiceXmpp extends Observable implements PresenceEventListener {
public static final String TAG = ServiceXmpp.class.getName();
private static final String XMPP_NODE_TRAIL_GEOLOC = "trail_geoloc";
private static final String XMPP_IP_SERVER = "51.254.205.203";
private static final String XMPP_DOMAIN_SERVER = "anon.xmpp.kingpenguin.tk";
//private static final String XMPP_DOMAIN_SERVER = "kingpenguin.tk";
private static final int XMPP_PORT = 5222;
private final Resources resources;
private final XMPPTCPConnectionConfiguration configuration;
private AdHocCommandManager commandManager;
private AbstractXMPPConnection connection;
private String jid;
private String otherJid;
private Roster roster;
public ServiceXmpp(Resources resources) throws UnknownHostException, XmppStringprepException {
this.resources = resources;
this.configuration = XMPPTCPConnectionConfiguration.builder()
.setSecurityMode(ConnectionConfiguration.SecurityMode.ifpossible)
.setHostAddress(Inet4Address.getByName(XMPP_IP_SERVER))
.setPort(XMPP_PORT)
.setXmppDomain(XMPP_DOMAIN_SERVER)
.setDebuggerEnabled(true)
.performSaslAnonymousAuthentication()
.setKeystoreType(null)
.build();
}
public boolean connect() throws InterruptedException, XMPPException, SmackException, IOException {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
boolean isConnected;
connection = new XMPPTCPConnection(configuration);
commandManager = AdHocCommandManager.getAddHocCommandsManager(connection);
connection.connect();
connection.login();
commandManager.registerCommand(XMPP_NODE_TRAIL_GEOLOC, XMPP_NODE_TRAIL_GEOLOC, TrailGeolocCommand.class);
roster = Roster.getInstanceFor(connection);
roster.addPresenceEventListener(this);
isConnected = connection.isConnected();
if (isConnected) {
jid = connection.getUser().asEntityBareJidString();
Log.i(TAG, "JID: "+jid);
try {
QRCodeGeneratorActivity.textToImageEncode(jid, resources);
} catch (WriterException ex) {
Log.e(TAG, "Failed to generate QR Code");
}
}
return isConnected;
}
public void close() {
if (otherJid != null) {
try {
sendPresenceUnavailable(otherJid);
} catch (SmackException.NotConnectedException ex) {
} catch (InterruptedException ex) {
} catch (XmppStringprepException ex) {
}
}
if (connection != null) {
connection.disconnect();
}
}
//<editor-fold defaultstate="collapsed" desc="Presence">
public void sendPresenceAvailable() throws SmackException.NotConnectedException, InterruptedException, XmppStringprepException {
if (otherJid != null) {
sendPresence(JidCreate.bareFrom(otherJid), Presence.Type.available);
}
}
public void sendPresenceAvailable(String to) throws SmackException.NotConnectedException, InterruptedException, XmppStringprepException {
sendPresence(JidCreate.bareFrom(to), Presence.Type.available);
}
public void sendPresenceUnavailable(String to) throws SmackException.NotConnectedException, InterruptedException, XmppStringprepException {
sendPresence(JidCreate.bareFrom(to), Presence.Type.unavailable);
}
private void sendPresence(Jid to, Presence.Type type) throws SmackException.NotConnectedException, InterruptedException {
if (connection != null) {
Presence presence = new Presence(to, type);
presence.setStatus("");
connection.sendStanza(presence);
}
}
@Override
public void presenceAvailable(FullJid address, Presence availablePresence) {
String bareJid = address.asBareJid().toString();
if (!bareJid.equals(jid) && (otherJid == null || !bareJid.equals(otherJid))) {
Log.i(TAG, "PRESENCE AVAILABLE RECEIVED FROM "+bareJid);
otherJid = bareJid;
try {
sendPresenceAvailable(bareJid);
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (XmppStringprepException e) {
e.printStackTrace();
}
}
}
@Override
public void presenceUnavailable(FullJid address, Presence presence) {
}
@Override
public void presenceError(Jid address, Presence errorPresence) {
}
@Override
public void presenceSubscribed(BareJid address, Presence subscribedPresence) {
}
@Override
public void presenceUnsubscribed(BareJid address, Presence unsubscribedPresence) {
}
//</editor-fold>
public void setOtherJid(String otherJid) {
this.otherJid = otherJid;
}
public boolean isOtherJidSet() {
return this.otherJid != null;
}
}

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="fr.chteufleur.mytrackingdog.QRCodeGeneratorActivity">
<ImageView
android:id="@+id/qr_code_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp" />
</LinearLayout>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="fr.chteufleur.mytrackingdog.QRCodeReaderActivity">
</RelativeLayout>

View File

@ -18,6 +18,14 @@
android:orderInCategory="100"
android:title="@string/action_active_vibration_object"
app:showAsAction="never" />
<item
android:id="@+id/action_qr_code_generator"
android:orderInCategory="100"
android:title="@string/action_qr_code_generator"
app:showAsAction="never" />
<item
android:id="@+id/action_qr_code_reader"
android:orderInCategory="100"
android:title="@string/action_qr_code_reader"
app:showAsAction="never" />
</menu>

View File

@ -3,4 +3,6 @@
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="black">#000000</color>
<color name="white">#ffffff</color>
</resources>

View File

@ -1,3 +1,5 @@
<resources>
<dimen name="fab_margin">16dp</dimen>
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>

View File

@ -11,4 +11,6 @@
<string name="action_send_gpx_trail">Envoyer trace du traceur</string>
<string name="action_send_to">Envoyer par</string>
<string name="action_active_vibration_object">Active vibration objets</string>
<string name="action_qr_code_generator">Affiche identifiant</string>
<string name="action_qr_code_reader">Lecture identifiant</string>
</resources>