diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..afbdab3
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..064a724
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+QRCode
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..217af47
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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..e206d70
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..2cbb09b
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..59436c9
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..9995100
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml
new file mode 100644
index 0000000..922003b
--- /dev/null
+++ b/.idea/scopes/scope_settings.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..37ec4ae
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/QRCode.iml b/QRCode.iml
new file mode 100644
index 0000000..da291df
--- /dev/null
+++ b/QRCode.iml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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/app.iml b/app/app.iml
new file mode 100644
index 0000000..09ab9d9
--- /dev/null
+++ b/app/app.iml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..b506694
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,26 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 21
+ buildToolsVersion "21.1.2"
+
+ defaultConfig {
+ applicationId "com.example.blank.qrcode"
+ minSdkVersion 9
+ targetSdkVersion 21
+ versionCode 1
+ versionName "1.0"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ compile 'com.android.support:appcompat-v7:21.0.3'
+ compile 'com.google.android.gms:play-services:6.5.87'
+}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..b76b5a0
--- /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\Blank\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/blank/trackjerry/ApplicationTest.java b/app/src/androidTest/java/com/example/blank/trackjerry/ApplicationTest.java
new file mode 100644
index 0000000..41d4031
--- /dev/null
+++ b/app/src/androidTest/java/com/example/blank/trackjerry/ApplicationTest.java
@@ -0,0 +1,13 @@
+package com.example.blank.trackjerry;
+
+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..b80f935
--- /dev/null
+++ b/app/src/debug/res/values/google_maps_api.xml
@@ -0,0 +1,18 @@
+
+
+
+ AIzaSyBzDFs0E_07QHfwGsHSDVCpYNAiDeZQ2FE
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..44b9679
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/img_kompas-web.png b/app/src/main/img_kompas-web.png
new file mode 100644
index 0000000..9b94fb4
Binary files /dev/null and b/app/src/main/img_kompas-web.png differ
diff --git a/app/src/main/java/com/example/blank/trackjerry/MainActivity.java b/app/src/main/java/com/example/blank/trackjerry/MainActivity.java
new file mode 100644
index 0000000..423d64d
--- /dev/null
+++ b/app/src/main/java/com/example/blank/trackjerry/MainActivity.java
@@ -0,0 +1,348 @@
+package com.example.blank.trackjerry;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.RotateAnimation;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+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 android.support.v4.app.FragmentActivity;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicNameValuePair;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+public class MainActivity extends FragmentActivity implements SensorEventListener,OnMapReadyCallback {
+
+ static final String ACTION_SCAN = "com.google.zxing.client.android.SCAN";
+
+ private GoogleMap mMap; // Might be null if Google Play services APK is not available.
+ private float angle;
+ private ImageView image;
+ private SensorManager s_manager;
+ private Sensor g_sens;
+ private Sensor m_sens;
+ private Context ctxt = this;
+ private float[] g = new float[3];
+ private float[] m = new float[3];
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ setUpMapIfNeeded();
+ image = (ImageView) findViewById(R.id.kompas);
+ s_manager = (SensorManager) getSystemService(SENSOR_SERVICE);
+ g_sens = s_manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+ m_sens = s_manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ setUpMapIfNeeded();
+ s_manager.registerListener(this, g_sens, SensorManager.SENSOR_DELAY_GAME);
+ s_manager.registerListener(this, m_sens, SensorManager.SENSOR_DELAY_GAME);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ s_manager.unregisterListener(this);
+ }
+
+ private void setUpMapIfNeeded() {
+ // Do a null check to confirm that we have not already instantiated the map.
+ if (mMap == null) {
+ // Try to obtain the map from the SupportMapFragment.
+ mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map_place))
+ .getMap();
+ // Check if we were successful in obtaining the map.
+ if (mMap != null) {
+ setUpMap();
+ }
+ }
+ }
+
+ private void setUpMap() {
+ mMap.setMyLocationEnabled(true);
+ mMap.moveCamera(CameraUpdateFactory.zoomTo(15));
+ mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(-6.893271, 107.610266)));
+ getLoc();
+ }
+ @Override
+ public void onMapReady(GoogleMap m) {
+ //mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(m.getMyLocation().getLatitude(),m.getMyLocation().getLongitude())));
+ }
+ public void setLoc(double lati, double longi, long wakt) {
+ Toast toast = Toast.makeText(ctxt,"Lati:"+lati+" Longi:"+longi,Toast.LENGTH_LONG);
+ toast.show();
+ mMap.addMarker(new MarkerOptions().position(new LatLng(lati, longi)).title("Jerry"));
+ mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(lati, longi)));
+
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ //format.setTimeZone(TimeZone.getTimeZone("UTC"));
+ Date date1 = new Date();
+ Date date2 = new Date(wakt*1000);
+ String time = format.format(date1);
+ String time2 = format.format(date2);
+ final int days = (int)(date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24);
+ long timeDiff = date2.getTime() - date1.getTime();
+ new CountDownTimer(timeDiff, 1000){
+ @Override
+ public void onTick(long millisUntilFinished) {
+ String seconds = String.valueOf((millisUntilFinished/1000)%60);
+ String minutes = String.valueOf((millisUntilFinished/1000)/60%60);
+ String hours = String.valueOf((millisUntilFinished/1000)/60/60%24);
+ String dayString = String.valueOf(millisUntilFinished / (1000 * 60 * 60 * 24));
+ if(seconds.length() == 1) seconds = "0" + seconds;
+ if(minutes.length() == 1) minutes = "0" + minutes;
+ if(hours.length() == 1) hours = "0" + hours;
+ if(days <= 1) dayString = dayString + " day\n";
+ else dayString = "\n";
+ ((TextView) findViewById(R.id.limit)).setText("Next: " + dayString + hours + ":" + minutes + ":" + seconds);
+ }
+ @Override
+ public void onFinish() {
+ getLoc();
+ }
+ }.start();
+
+ Log.d("test","Lati:"+lati+" Longi:"+longi);
+ }
+
+ public void getLoc(View v){
+ getLoc();
+ }
+ public void getLoc(){
+ new ParaGet().execute();
+ }
+
+ class ParaGet extends AsyncTask {
+ @Override
+ protected String doInBackground(String... params) {
+ String response = "";
+ DefaultHttpClient client = new DefaultHttpClient();
+ HttpGet httpGet = new HttpGet("http://167.205.32.46/pbd/api/track?nim=13512048");
+ try {
+ HttpResponse execute = client.execute(httpGet);
+ InputStream content = execute.getEntity().getContent();
+ BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
+ String s = "";
+ while ((s = buffer.readLine())!= null) {
+ response += s;
+ }
+ } catch (ClientProtocolException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return response;
+ }
+
+ @Override
+ protected void onPostExecute(String s) {
+ s = s.substring(s.indexOf('{'),s.lastIndexOf('}')+1);
+ JSONObject jsonObject;
+ double lati,longi;
+ long wakt;
+ try {
+ jsonObject = new JSONObject(s);
+ lati=jsonObject.getDouble("lat");
+ longi=jsonObject.getDouble("long");
+ wakt=jsonObject.getLong("valid_until");
+ setLoc(lati, longi,wakt);
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ //product qr code mode
+ public void scanQR(View v) {
+ try {
+ //start the scanning activity from the com.google.zxing.client.android.SCAN intent
+ Intent intent = new Intent(ACTION_SCAN);
+ intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
+ startActivityForResult(intent, 0);
+ } catch (ActivityNotFoundException anfe) {
+ //on catch, show the download dialog
+ showDialog(MainActivity.this, "No Scanner Found", "Download a scanner code activity?", "Yes", "No").show();
+ }
+ }
+ //alert dialog for downloadDialog
+ private static AlertDialog showDialog(final Activity act, CharSequence title, CharSequence message, CharSequence buttonYes, CharSequence buttonNo) {
+ AlertDialog.Builder downloadDialog = new AlertDialog.Builder(act);
+ downloadDialog.setTitle(title);
+ downloadDialog.setMessage(message);
+ downloadDialog.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialogInterface, int i) {
+ Uri uri = Uri.parse("market://search?q=pname:" + "com.google.zxing.client.android");
+ Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ try {
+ act.startActivity(intent);
+ } catch (ActivityNotFoundException anfe) {
+
+ }
+ }
+ });
+ downloadDialog.setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialogInterface, int i) {
+ }
+ });
+ return downloadDialog.show();
+ }
+ //on ActivityResult method
+ public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ if (requestCode == 0) {
+ if (resultCode == RESULT_OK) {
+ //get the extras that are returned from the intent
+ String contents = intent.getStringExtra("SCAN_RESULT");
+ new ParaPost().execute(contents);
+ }
+ }
+ }
+
+ public void updateHasil(String msg, int status){
+ if (status==200) {
+ Log.d("msg",msg);
+ Toast.makeText(ctxt,"Jerry has been caught!",Toast.LENGTH_LONG).show();
+ } else if (status==400){
+ Toast.makeText(ctxt,"ERROR 400 MISSING PARAMETER",Toast.LENGTH_LONG).show();
+ } else if (status==403){
+ Toast.makeText(ctxt,"ERROR 403 FORBIDDEN",Toast.LENGTH_LONG).show();
+ }
+ }
+
+ class ParaPost extends AsyncTask {
+ private int status;
+ @Override
+ protected String doInBackground(String... params) {
+ HttpClient httpClient = new DefaultHttpClient();
+ String response = "";
+ for(String token: params) {
+ HttpResponse httpResponse = null;
+ HttpPost httpPost = new HttpPost("http://167.205.32.46/pbd/api/catch");
+ try {
+ List Parameters = new ArrayList();
+ Parameters.add(new BasicNameValuePair("nim","13512048"));
+ Parameters.add(new BasicNameValuePair("token",token));
+ httpPost.setEntity(new UrlEncodedFormEntity(Parameters));
+ httpResponse = httpClient.execute(httpPost);
+ InputStream content = httpResponse.getEntity().getContent();
+ BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
+ String s = "";
+ while ((s = buffer.readLine())!= null) {
+ response += s;
+ }
+ status=httpResponse.getStatusLine().getStatusCode();
+ } catch (ClientProtocolException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return response;
+ }
+
+ @Override
+ protected void onPostExecute(String s) {
+ super.onPostExecute(s);
+ JSONObject jsonObject;
+ String msg=new String("");
+ int code=400;
+ try {
+ s=s.substring(s.indexOf('{'), s.lastIndexOf('}') + 1);
+ jsonObject = new JSONObject(s);
+ msg=jsonObject.getString("message");
+ code=jsonObject.getInt("code");
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ updateHasil(msg,code);
+ }
+ }
+
+ public void rotateKompas(float cur_ang) {
+ RotateAnimation r = new RotateAnimation(-angle, -cur_ang, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
+ r.setDuration(500);
+ r.setFillAfter(true);
+ image.startAnimation(r);
+ angle = cur_ang;
+ }
+
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ final float alpha = 0.97f;
+ synchronized (this) {
+ if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
+ g[0] = alpha * g[0] + (1 - alpha) * event.values[0];
+ g[1] = alpha * g[1] + (1 - alpha) * event.values[1];
+ g[2] = alpha * g[2] + (1 - alpha) * event.values[2];
+ //Log.d("test","acc");
+ }
+ if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
+ m[0] = alpha * m[0] + (1 - alpha) * event.values[0];
+ m[1] = alpha * m[1] + (1 - alpha) * event.values[1];
+ m[2] = alpha * m[2] + (1 - alpha) * event.values[2];
+ //Log.d("test","magn");
+ }
+ float R[] = new float[9];
+ float I[] = new float[9];
+ boolean success = SensorManager.getRotationMatrix(R, I, g, m);
+ if (success) {
+ float orientation[] = new float[3];
+ SensorManager.getOrientation(R, orientation);
+ float x;
+ x = (float) Math.toDegrees(orientation[0]);
+ x = (x + 360) % 360;
+ //Log.d("test","rotate");
+ rotateKompas(x);
+ }
+ }
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ }
+}
diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-hdpi/img_kompas.png b/app/src/main/res/drawable-hdpi/img_kompas.png
new file mode 100644
index 0000000..783873f
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/img_kompas.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_launcher.png b/app/src/main/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-mdpi/img_kompas.png b/app/src/main/res/drawable-mdpi/img_kompas.png
new file mode 100644
index 0000000..f7212d6
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/img_kompas.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-xhdpi/img_kompas.png b/app/src/main/res/drawable-xhdpi/img_kompas.png
new file mode 100644
index 0000000..cbb1de4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/img_kompas.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..4df1894
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/img_kompas.png b/app/src/main/res/drawable-xxhdpi/img_kompas.png
new file mode 100644
index 0000000..101254d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/img_kompas.png differ
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..2ed3e78
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/menu_qrcode_example.xml b/app/src/main/res/menu/menu_qrcode_example.xml
new file mode 100644
index 0000000..d9314c3
--- /dev/null
+++ b/app/src/main/res/menu/menu_qrcode_example.xml
@@ -0,0 +1,6 @@
+
diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..6a25364
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,9 @@
+
+
+
+ QRCode
+ Hello world!
+ Settings
+ Map
+
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..766ab99
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
diff --git a/app/src/release/res/values/google_maps_api.xml b/app/src/release/res/values/google_maps_api.xml
new file mode 100644
index 0000000..fd9071d
--- /dev/null
+++ b/app/src/release/res/values/google_maps_api.xml
@@ -0,0 +1,18 @@
+
+
+
+ YOUR_KEY_HERE
+
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..6356aab
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,19 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:1.0.0'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..1d3591c
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,18 @@
+# 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.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# 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
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..0c71e76
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..91a7e26
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# 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
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# 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\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+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" ] ; 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"`
+
+ # 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
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,90 @@
+@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
+
+@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=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@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 Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_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=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+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
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'