From 7d14c189888934b379100e332664cb75bbe732db Mon Sep 17 00:00:00 2001 From: Jonathan Sudibya <13512093@std.stei.itb.ac.id> Date: Mon, 7 Mar 2016 11:21:56 +0700 Subject: [PATCH 01/21] Initial commit --- README.md | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..5eeefe4 --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +# Tugas Besar 1 IF3111 Pengembangan Aplikasi pada Platform Khusus + +## Latar Belakang + +Dalam tugas ini, peserta diminta untuk menemukan beberapa tempat di lingkungan ITB dengan bantuan tools yang dibangun di atas platform Android. Aplikasi tersebut dapat memandu peserta dengan menampilkan peta (Google Maps) dan arah tujuannya. Peserta diminta menemukan 3 lokasi (akan diberikan dari server). Pada setiap lokasi peserta akan diminta untuk foto-diri di lokasinya dan mengirimkan nama lokasi tempat peserta berada. + +Daftar kemungkinan jawaban lokasi diberikan oleh asisten. Pastikan anda tidak typo saat mengirimkan jawaban ke server. + +Daftar kemungkinan jawaban lokasi adalah +1. gku_barat +2. gku_timur +3. intel +4. cc_barat +5. cc_timur +6. dpr +7. sunken +8. perpustakaan +9. pau +10. kubus + +Sever uji coba akan disediakan pada 167.205.24.132 akan dapat diuji coba mulai tanggal 21 Maret 2016 Pukul 07.00. +Prosedur uji coba akan dibertahukan lebih lanjut. + +## Spesifikasi Aplikasi + +Spesifikasi dari aplikasi yang dibangun sebagai berikut + +• Aplikasi mampu menerima pesan dari server dengan format JSON berisi lokasi dan token. +• Aplikasi mampu mengolah data berupa location point (longitude, latitude) dan menampilkan indicator pada peta lokasi yang dimaksud. Peta lokasi menggunakan Google Map API. (Tampilan silahkan lihat Spesifikasi Tampilan). +• Terdapat sebuah panah navigasi yang berada diatas peta (letak bebas), yang menunjukan arah utara. Anda diminta menggunakan sensor yang ada pada android API (Tampilan silahkan lihat Spesifikasi Tampilan). +• Aplikasi mampu mengirim intent kamera. +• Aplikasi mampu mengambil gambar melalui kamera. Gambar tidak perlu diunggah ke server (silakan lihat spesifikasi tanya jawab asisten) +• Aplikasi mampu mengirimkan pesan ke sever dengan format JSON berisi lokasi (longitude, latitude), nim serta token. +• Pastikan SDK anda mendukung pengerjaan tugas ini. +• Perhatikan tata letak tombol. Ketika orientasi layar portrait, tombol berada pada bawah layar. Ketika landscape, tombol berada pada samping kanan layar (lihat contoh tampilan seperti pada mock-up spesifikasi tampilan). Anda dapat menggunakan fragment untuk masalah ini. +• Tampilan warna, font, style tidak dinilai. Namun tata letak tombol akan dinilai. +• Hasil reply dari server harus ditampilkan dalam bentuk *toast* atau *alert dialog* (pilih satu). +• Ketika anda menggunakan activity yang memanggil sensor, sensor tersebut harus dilepas ketika anda berpindah activity agar tidak boros baterai. + +## Spesifikasi Tanya-Jawab oleh Asisten +Pada akhir eksplorasi lokasi oleh peserta, akan ada tanya-jawab dengan asisten. Anda juga diminta memberikan hasil foto yang anda dapat (tidak perlu lewat aplikasi yang dibuat pada tugas ini, dapat melalui gallery bawaan android anda). Asisten akan melakukan cross-check dengan data yang anda kirimkan. + + +## Spesifikasi Pertukaran Pesan +Keterangan : *Client* pada dokumen ini adalah aplikasi Anda dan *Server* merupakan server milik asisten. +### Request Location +Permintaan lokasi (pertama). + +**Client Request** +```sh +{“com”:”req_loc”,”nim”:”13512999”} +``` +**Server Response** +```sh +{“status”:”ok”,”nim”:”13512999”,”longitude”:”6.234123132”,”latitude”:”0.1234123412”,”token”:”21nu2f2n3rh23diefef23hr23ew”} +``` +### Send Answer +Mengirimkan jawaban dan menerima lokasi berikutnya + +**Client Request** +```sh +{“com”:”answer”,”nim”:”13512999”,”answer”:”labtek_v”, ”longitude”:”6.234123132”,”latitude”:”0.1234123412”,”token”:”21nu2f2n3rh23diefef23hr23ew”} +``` +**Server Response** +Jika jawaban Anda **benar**, maka: +```sh +{“status”:”ok”,”nim”:”13512999”,”longitude”:”8.13215123214”,”latitude”:”9.1234123412”,”token”:”124fewfm32r32ifmwder42”} +``` +Jika jawaban Anda **salah**, maka: +```sh +{“status”:”wrong_answer”,”nim”:”13512999”,”token”:”124fewfm32r32ifmwder42”} +``` +Jika jawaban Anda **benar dan sudah berada dilokasi ketiga**, maka: +```sh +{“status”:”finish”,”nim”:”13512999”,”token”:”124fewfm32r32ifmwder42”,”check”:1} +``` +## Spesifikasi Tampilan +**Tampilan horizontal** +![alt text](http://i.imgur.com/Q1ZhAvb.png) +**Tampilan vertikal** +![alt text](http://i.imgur.com/L7RnXCm.png) +**Tampilan *submit* jawaban** +![alt text](http://i.imgur.com/TlaiEs9.png) +## Deliverables + +Silahkan ikuti langkah pengumpulan berikut : + +- Lakukan **fork** terhadap repository ini. +- Edit file readme ini semenarik mungkin (gunakan panduan [Markdown] langguage), diperbolehkan untuk merubah struktur dari readme ini. (Soal tidak perlu dipertahankan). +- Pada Readme terdapat tampilan aplikasi. +- Cantumkan lokasi *source code* dan *binary* dari aplikasi pada Readme. + +## Deadline +Deadline pull request terakhir (termasuk commit) adalah 27 Maret 2016 pukul 23.55. + + +## Keterangan Tambahan +Bila ada pertanyaan, mengenai tugas ini silahkan lakukan melalui milis IF3111. + +[Markdown]: From 4a96ab4dac1ef9e68a5673545c2d850a91e8fb9e Mon Sep 17 00:00:00 2001 From: Jonathan Sudibya <13512093@std.stei.itb.ac.id> Date: Mon, 7 Mar 2016 04:28:54 +0000 Subject: [PATCH 02/21] README.md edited online with Bitbucket --- README.md | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 5eeefe4..10f7f87 100644 --- a/README.md +++ b/README.md @@ -7,16 +7,17 @@ Dalam tugas ini, peserta diminta untuk menemukan beberapa tempat di lingkungan I Daftar kemungkinan jawaban lokasi diberikan oleh asisten. Pastikan anda tidak typo saat mengirimkan jawaban ke server. Daftar kemungkinan jawaban lokasi adalah -1. gku_barat -2. gku_timur -3. intel -4. cc_barat -5. cc_timur -6. dpr -7. sunken -8. perpustakaan -9. pau -10. kubus + +* gku_barat +* gku_timur +* intel +* cc_barat +* cc_timur +* dpr +* sunken +* perpustakaan +* pau +* kubus Sever uji coba akan disediakan pada 167.205.24.132 akan dapat diuji coba mulai tanggal 21 Maret 2016 Pukul 07.00. Prosedur uji coba akan dibertahukan lebih lanjut. @@ -25,17 +26,17 @@ Prosedur uji coba akan dibertahukan lebih lanjut. Spesifikasi dari aplikasi yang dibangun sebagai berikut -• Aplikasi mampu menerima pesan dari server dengan format JSON berisi lokasi dan token. -• Aplikasi mampu mengolah data berupa location point (longitude, latitude) dan menampilkan indicator pada peta lokasi yang dimaksud. Peta lokasi menggunakan Google Map API. (Tampilan silahkan lihat Spesifikasi Tampilan). -• Terdapat sebuah panah navigasi yang berada diatas peta (letak bebas), yang menunjukan arah utara. Anda diminta menggunakan sensor yang ada pada android API (Tampilan silahkan lihat Spesifikasi Tampilan). -• Aplikasi mampu mengirim intent kamera. -• Aplikasi mampu mengambil gambar melalui kamera. Gambar tidak perlu diunggah ke server (silakan lihat spesifikasi tanya jawab asisten) -• Aplikasi mampu mengirimkan pesan ke sever dengan format JSON berisi lokasi (longitude, latitude), nim serta token. -• Pastikan SDK anda mendukung pengerjaan tugas ini. -• Perhatikan tata letak tombol. Ketika orientasi layar portrait, tombol berada pada bawah layar. Ketika landscape, tombol berada pada samping kanan layar (lihat contoh tampilan seperti pada mock-up spesifikasi tampilan). Anda dapat menggunakan fragment untuk masalah ini. -• Tampilan warna, font, style tidak dinilai. Namun tata letak tombol akan dinilai. -• Hasil reply dari server harus ditampilkan dalam bentuk *toast* atau *alert dialog* (pilih satu). -• Ketika anda menggunakan activity yang memanggil sensor, sensor tersebut harus dilepas ketika anda berpindah activity agar tidak boros baterai. +* Aplikasi mampu menerima pesan dari server dengan format JSON berisi lokasi dan token. +* Aplikasi mampu mengolah data berupa location point (longitude, latitude) dan menampilkan indicator pada peta lokasi yang dimaksud. Peta lokasi menggunakan Google Map API. (Tampilan silahkan lihat Spesifikasi Tampilan). +* Terdapat sebuah panah navigasi yang berada diatas peta (letak bebas), yang menunjukan arah utara. Anda diminta menggunakan sensor yang ada pada android API (Tampilan silahkan lihat Spesifikasi Tampilan). +* Aplikasi mampu mengirim intent kamera. +* Aplikasi mampu mengambil gambar melalui kamera. Gambar tidak perlu diunggah ke server (silakan lihat spesifikasi tanya jawab asisten) +* Aplikasi mampu mengirimkan pesan ke sever dengan format JSON berisi lokasi (longitude, latitude), nim serta token. +* Pastikan SDK anda mendukung pengerjaan tugas ini. +* Perhatikan tata letak tombol. Ketika orientasi layar portrait, tombol berada pada bawah layar. Ketika landscape, tombol berada pada samping kanan layar (lihat contoh tampilan seperti pada mock-up spesifikasi tampilan). Anda dapat menggunakan fragment untuk masalah ini. +* Tampilan warna, font, style tidak dinilai. Namun tata letak tombol akan dinilai. +* Hasil reply dari server harus ditampilkan dalam bentuk *toast* atau *alert dialog* (pilih satu). +* Ketika anda menggunakan activity yang memanggil sensor, sensor tersebut harus dilepas ketika anda berpindah activity agar tidak boros baterai. ## Spesifikasi Tanya-Jawab oleh Asisten Pada akhir eksplorasi lokasi oleh peserta, akan ada tanya-jawab dengan asisten. Anda juga diminta memberikan hasil foto yang anda dapat (tidak perlu lewat aplikasi yang dibuat pada tugas ini, dapat melalui gallery bawaan android anda). Asisten akan melakukan cross-check dengan data yang anda kirimkan. @@ -97,4 +98,4 @@ Deadline pull request terakhir (termasuk commit) adalah 27 Maret 2016 pukul 23.5 ## Keterangan Tambahan Bila ada pertanyaan, mengenai tugas ini silahkan lakukan melalui milis IF3111. -[Markdown]: +[Markdown]: \ No newline at end of file From 6da19fdc6cfe19eb229d79184674a3545fc4e380 Mon Sep 17 00:00:00 2001 From: Jonathan Sudibya <13512093@std.stei.itb.ac.id> Date: Mon, 21 Mar 2016 09:32:13 +0700 Subject: [PATCH 03/21] Update Readme.md --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 10f7f87..d3cd63a 100644 --- a/README.md +++ b/README.md @@ -52,16 +52,28 @@ Permintaan lokasi (pertama). {“com”:”req_loc”,”nim”:”13512999”} ``` **Server Response** +Before : ```sh {“status”:”ok”,”nim”:”13512999”,”longitude”:”6.234123132”,”latitude”:”0.1234123412”,”token”:”21nu2f2n3rh23diefef23hr23ew”} ``` +After : +Longitude dan Latitude menggunakan tipe Long. +```sh +{“status”:”ok”,”nim”:”13512999”,”longitude”:6.234123132,”latitude”:0.1234123412,”token”:”21nu2f2n3rh23diefef23hr23ew”} +``` ### Send Answer Mengirimkan jawaban dan menerima lokasi berikutnya **Client Request** +Before : ```sh {“com”:”answer”,”nim”:”13512999”,”answer”:”labtek_v”, ”longitude”:”6.234123132”,”latitude”:”0.1234123412”,”token”:”21nu2f2n3rh23diefef23hr23ew”} ``` +After : +Longitude dan Latitude menggunakan tipe Long. +```sh +{“com”:”answer”,”nim”:”13512999”,”answer”:”labtek_v”, ”longitude”:6.234123132,”latitude”:0.1234123412,”token”:”21nu2f2n3rh23diefef23hr23ew”} +``` **Server Response** Jika jawaban Anda **benar**, maka: ```sh @@ -75,6 +87,16 @@ Jika jawaban Anda **benar dan sudah berada dilokasi ketiga**, maka: ```sh {“status”:”finish”,”nim”:”13512999”,”token”:”124fewfm32r32ifmwder42”,”check”:1} ``` + +### Extra +**No NIM** +```sh +{“status”:”err”,”nim”:””,”token”:”124fewfm32r32ifmwder42”} +``` +**No Com command** +```sh +{“status”:”err”,”nim”:”13512999”,”token”:”124fewfm32r32ifmwder42”} +``` ## Spesifikasi Tampilan **Tampilan horizontal** ![alt text](http://i.imgur.com/Q1ZhAvb.png) From 3dc9f95727126dd88ba24b82f18ac5695954595d Mon Sep 17 00:00:00 2001 From: Calvin Aditya Jonathan Date: Mon, 21 Mar 2016 15:05:13 +0700 Subject: [PATCH 04/21] Basic layout --- .gitignore | 8 + .idea/.name | 1 + .idea/compiler.xml | 22 ++ .idea/copyright/profiles_settings.xml | 3 + .idea/encodings.xml | 6 + .idea/gradle.xml | 19 ++ .idea/misc.xml | 46 +++++ .idea/modules.xml | 9 + .idea/runConfigurations.xml | 12 ++ .idea/vcs.xml | 6 + app/.gitignore | 1 + app/build.gradle | 28 +++ app/proguard-rules.pro | 17 ++ .../example/calvin/pbd/ApplicationTest.java | 13 ++ app/src/debug/res/values/google_maps_api.xml | 19 ++ app/src/main/AndroidManifest.xml | 55 +++++ .../example/calvin/pbd/AnswerActivity.java | 33 +++ .../com/example/calvin/pbd/MapsActivity.java | 188 ++++++++++++++++++ app/src/main/res/drawable/answer.png | Bin 0 -> 2365 bytes app/src/main/res/drawable/camera.png | Bin 0 -> 6252 bytes .../main/res/layout-land/activity_maps.xml | 42 ++++ app/src/main/res/layout/activity_answer.xml | 25 +++ app/src/main/res/layout/activity_maps.xml | 50 +++++ app/src/main/res/layout/content_answer.xml | 43 ++++ app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes app/src/main/res/values-v21/styles.xml | 9 + app/src/main/res/values-w820dp/dimens.xml | 6 + app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/dimens.xml | 6 + app/src/main/res/values/strings.xml | 20 ++ app/src/main/res/values/styles.xml | 20 ++ .../release/res/values/google_maps_api.xml | 22 ++ .../example/calvin/pbd/ExampleUnitTest.java | 15 ++ build.gradle | 23 +++ gradle.properties | 18 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53637 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 160 +++++++++++++++ gradlew.bat | 90 +++++++++ settings.gradle | 1 + 44 files changed, 1048 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/example/calvin/pbd/ApplicationTest.java create mode 100644 app/src/debug/res/values/google_maps_api.xml create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/example/calvin/pbd/AnswerActivity.java create mode 100644 app/src/main/java/com/example/calvin/pbd/MapsActivity.java create mode 100644 app/src/main/res/drawable/answer.png create mode 100644 app/src/main/res/drawable/camera.png create mode 100644 app/src/main/res/layout-land/activity_maps.xml create mode 100644 app/src/main/res/layout/activity_answer.xml create mode 100644 app/src/main/res/layout/activity_maps.xml create mode 100644 app/src/main/res/layout/content_answer.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-v21/styles.xml create mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/release/res/values/google_maps_api.xml create mode 100644 app/src/test/java/com/example/calvin/pbd/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6cbe56 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..79ff8cd --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +PBD \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..fc132b2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..5d19981 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9f5e227 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..6564d52 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..2bdb5f0 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,28 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 23 + buildToolsVersion "23.0.2" + + defaultConfig { + applicationId "com.example.calvin.pbd" + minSdkVersion 21 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + testCompile 'junit:junit:4.12' + compile 'com.android.support:appcompat-v7:23.2.1' + compile 'com.google.android.gms:play-services:8.4.0' + compile 'com.android.support:design:23.2.1' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..4fb0e5a --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\Users\Calvin\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# 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 *; +#} diff --git a/app/src/androidTest/java/com/example/calvin/pbd/ApplicationTest.java b/app/src/androidTest/java/com/example/calvin/pbd/ApplicationTest.java new file mode 100644 index 0000000..74f73de --- /dev/null +++ b/app/src/androidTest/java/com/example/calvin/pbd/ApplicationTest.java @@ -0,0 +1,13 @@ +package com.example.calvin.pbd; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/app/src/debug/res/values/google_maps_api.xml b/app/src/debug/res/values/google_maps_api.xml new file mode 100644 index 0000000..6b275e5 --- /dev/null +++ b/app/src/debug/res/values/google_maps_api.xml @@ -0,0 +1,19 @@ + + + AIzaSyCxJWcNKZqNKxbq4sQffmBaxHogZSaapCQ + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d4cad26 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/example/calvin/pbd/AnswerActivity.java b/app/src/main/java/com/example/calvin/pbd/AnswerActivity.java new file mode 100644 index 0000000..728053e --- /dev/null +++ b/app/src/main/java/com/example/calvin/pbd/AnswerActivity.java @@ -0,0 +1,33 @@ +package com.example.calvin.pbd; + +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.Spinner; + +public class AnswerActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_answer); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + Spinner spinner = (Spinner) findViewById(R.id.spinner); + // Create an ArrayAdapter using the string array and a default spinner layout + ArrayAdapter adapter = ArrayAdapter.createFromResource(this, + R.array.answer_array, android.R.layout.simple_spinner_item); + // Specify the layout to use when the list of choices appears + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + // Apply the adapter to the spinner + spinner.setAdapter(adapter); + + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + +} diff --git a/app/src/main/java/com/example/calvin/pbd/MapsActivity.java b/app/src/main/java/com/example/calvin/pbd/MapsActivity.java new file mode 100644 index 0000000..94287b0 --- /dev/null +++ b/app/src/main/java/com/example/calvin/pbd/MapsActivity.java @@ -0,0 +1,188 @@ +package com.example.calvin.pbd; + +import android.content.Intent; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Environment; +import android.provider.MediaStore; +import android.support.v4.app.FragmentActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.android.gms.maps.CameraUpdate; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.MarkerOptions; + +import org.json.JSONException; +import org.json.JSONObject; +import org.w3c.dom.Text; + +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.Socket; +import java.net.UnknownHostException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { + + private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; + public static final int MEDIA_TYPE_IMAGE = 1; + private GoogleMap mMap; + private Uri fileUri; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_maps); + // Obtain the SupportMapFragment and get notified when the map is ready to be used. + SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() + .findFragmentById(R.id.map); + mapFragment.getMapAsync(this); + new SocketTask().execute(); + + /* + ((Button)findViewById(R.id.requestButton)).setOnClickListener( + new Button.OnClickListener() { + @Override + public void onClick(View view) { + Log.d("MyApp", "requesting"); + } + } + ); + */ + + ((ImageButton)findViewById(R.id.cameraButton)).setOnClickListener( + new ImageButton.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); + fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); + + startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); + } + } + ); + + ((ImageButton)findViewById(R.id.answerButton)).setOnClickListener( + new ImageButton.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(MapsActivity.this, AnswerActivity.class); + startActivity(intent); + } + } + ); + } + + private class SocketTask extends AsyncTask { + protected String doInBackground(Void... args) { + try { + Socket socket = new Socket("167.205.34.132", 3111); + + JSONObject request = new JSONObject(); + request.put("com", "req_loc"); + request.put("nim", "13513077"); + + InputStream inputStream = socket.getInputStream(); + OutputStream outputStream = socket.getOutputStream(); + + PrintWriter out = new PrintWriter(outputStream); + BufferedReader in = new BufferedReader(new InputStreamReader(inputStream)); + + out.println(request.toString()); + out.flush(); + String response = in.readLine(); + return response; + } + catch (UnknownHostException e) { + Log.d("MyApp", e.toString()); + } + catch (IOException e) { + Log.d("MyApp", e.toString()); + } + catch (JSONException e) { + Log.d("MyApp", e.toString()); + } + return null; + } + + protected void onPostExecute(String response) { + try { + JSONObject responseJSON = new JSONObject(response); + } + catch (JSONException e) { + Log.d("MyApp", e.toString()); + } + } + } + + private static Uri getOutputMediaFileUri(int type){ + return Uri.fromFile(getOutputMediaFile(type)); + } + + private static File getOutputMediaFile(int type) { + File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( + Environment.DIRECTORY_PICTURES), "PBD"); + + if (!mediaStorageDir.exists()) { + if (!mediaStorageDir.mkdirs()) { + Log.d("PBD", "failed to create directory"); + return null; + } + } + + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + File mediaFile; + if (type == MEDIA_TYPE_IMAGE) { + mediaFile = new File(mediaStorageDir.getPath() + File.separator + + "IMG_" + timeStamp + ".jpg"); + } else { + return null; + } + + return mediaFile; + } + + @Override + public void onMapReady(GoogleMap googleMap) { + mMap = googleMap; + + LatLng itb = new LatLng(-6.8899, 107.6100); + mMap.addMarker(new MarkerOptions().position(itb).title("Institut Teknologi Bandung")); + mMap.moveCamera(CameraUpdateFactory.newLatLng(itb)); + mMap.moveCamera(CameraUpdateFactory.zoomTo(17)); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { + if (resultCode == RESULT_OK) { + Toast.makeText(this, "Image saved\n", Toast.LENGTH_SHORT).show(); + } else if (resultCode == RESULT_CANCELED) { + // + } else { + Toast.makeText(this, "Image capture failed\n", Toast.LENGTH_SHORT).show(); + } + } + } +} diff --git a/app/src/main/res/drawable/answer.png b/app/src/main/res/drawable/answer.png new file mode 100644 index 0000000000000000000000000000000000000000..792269032ace63bd1b41e17351df7651ed58204a GIT binary patch literal 2365 zcmai0dpMNq7Jp}kTyh(fLK>7DWg6Gq(qM$PP)auA7L$!(MuW(0#+D3qTndd_sO%y} zD!Gk&h%l!u?W4gox$K?G)TrD!pIuKq=XuWF=Xt*8UB9*7cfG&0zTf)er8_y;NQx_p z0{|rLY;h+6fI$!jM1>&pIof*`GD7|q$1MPOkhXQzM;P)^zP2Zi18`9T0BRxt%TS2= zI{@Jr0N!~6U~&Th1#*7<2{UK|e)b0&8~|lk)pY?7`NIxpaVm0ncEmB+!+%%j2mVT7 zo{^pY(X+w&DXtkMw1n-q^RkB&B~B5=0u{oGO;hWUXYO!&E^V`JWubAWPQBpm#%$Nl z{^^nCu^$wMxut5>S2V8qotujqd-ar|6R&Y?G>@?|8r?r1GZ)zAH&?K9cVpnnv!hn<+^7wW z8f}LC9)Ve!U}jPj?>>s8x36Be(UezAi)JYd{ZeNYlQN%QU&A{SZ(K65wwj>+2)#}v zO3=C@MUJQ=4_=_{zW|e@uNbw)Wh!leZL;bP0#uHu60%mAn$)qfxR*p;5+OcE7mll{ z-AQdZdQY9vzM9yM-Y7D-5+xmNY)1(Ppm5y5?dW{mRYPYGH+2hq!4$>W&QK{>#twN02;^d^IO! zu#=uNMjq&tc(2*|y7_ui+lcar(dx<$^C_kVA}wqeSM_sx<60`c`AHbew3*E)cmI#m9mJ zg#M`D17HA|6+r$r<2-sqfKsb+Hg&QYIVT5Td%^t zcu=dyvz~CbCn7#QvHM1Bc=l}BAtB3>ijTzDS0i(GQgUxGo~#Rx%USSZ$QoZtorZIb zvDufgp`*f^Wg7#YG6+?HKdnRj5BFu`$wSK}Rbs+rEGyHpkGP$h>-d&Lwe)vH^kb72 z6)AGnP*x>N!S(Hso8u=l8!e7eT;GC5{z;#EonH4{MD7Yy_vLxARM`mbqq4B)ZdOH1 zQ@oS8^!LBCG=dGC1H2d&@6gjG(wMtmU8Sd|acsr%f40brXRxfI4i*tQo-9g;u#U15 z)%J5b1G3L;7Q>Te-E8AtTgiANNDJuI# zo2V@^f2GB|1gd`*_M4F9#zGf4c#t?BZ)cq2HN3?j^5E~QGT{<`znR)T1gaFj0(g7Zu8+mjS;S-Ed=iw3$i6Lu;SkD|FYlgU|&MVHxtSZ3iN6ai}`N#!DITu{jd#_9SpygBlF4nc( zeIu-m9kQGM_Ufha>dnDfVu4K|p;>|&7QyC21NO}w06Y%t>!cOJ{=P=Gi!umq)uYyI zodfl<p{)UMh*xpTpF_S8s-7IIVBr;P=G1#2ze92 zhhKkm#i-q8QKYZ4r$UOFV%eLlVAL~K&x-GYvD3S+L?%TWQwU43$BPnhC9tOM6YJKE z)vE>ysWr>ublW}eP0hO~`W-=Mf|&|n>_BO$eW~gTnZ>PMJexg=f=R7GF>G<<@ZGXv zSpNt4u{Qy3yqD4Iy@4D|$^K?jtRy45W3R(J{Flh2huGiB7M*S({NM~nN^WdZQ1|nz zKTbB|y`$EqlR`urX_V_b&1LD&Z9c&KJ!r_jJtMI-yHE&P+PqanhBED#_(;G_u>xk* zCw}h2SVxUvIjCJdtdj?=ES=O%TsHdiW4VUW)eLhu{hp*uptpuN{P2CiwRX z#HhVv?xskP)7*uwUmdPdg3wfr0<!BBh4a;ZEr2 zgI;Du_|oIY5FDC#H3ZRT_A<30zOSYl@~(Nr5$H35{rev&cRfkVJiRD1x=dJ;b`<4( zDj76?3q1k$hFQCY`T2wqOnlE1AOmzUItJPpU2PrxQ#yJky3nVujWIOAU|O~r^ZzR$ znB*65F6yrn9@x^Hp#MP&R}R!g-%C(s>hM92H Vpiq~!>pnqrz|PtMS83^;@E_UiC|v*m literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/camera.png b/app/src/main/res/drawable/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..36e3bedadc8d8cd0161c8aba988f5c7a74e2239d GIT binary patch literal 6252 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout-land/activity_maps.xml b/app/src/main/res/layout-land/activity_maps.xml new file mode 100644 index 0000000..abc4dfb --- /dev/null +++ b/app/src/main/res/layout-land/activity_maps.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_answer.xml b/app/src/main/res/layout/activity_answer.xml new file mode 100644 index 0000000..fd01122 --- /dev/null +++ b/app/src/main/res/layout/activity_answer.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_maps.xml b/app/src/main/res/layout/activity_maps.xml new file mode 100644 index 0000000..3146ed1 --- /dev/null +++ b/app/src/main/res/layout/activity_maps.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + +