commit 0122004f3414338fc5ee7de049fa204b2a7257b5
Author: wangh <123456>
Date: Thu Oct 12 15:18:51 2023 +0800
5103 用 长度位置
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2b75303
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..681f41a
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..fb7f4a8
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..15a15b2
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..674414f
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..a5f05cd
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..860da66
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/render.experimental.xml b/.idea/render.experimental.xml
new file mode 100644
index 0000000..8ec256a
--- /dev/null
+++ b/.idea/render.experimental.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..e497da9
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /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..6edb363
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,38 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 29
+ buildToolsVersion "29.0.0"
+ defaultConfig {
+ applicationId "com.example.sancode"
+ minSdkVersion 21
+ targetSdkVersion 29
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ ndk {
+ // 设置支持的SO库架构
+ abiFilters 'armeabi'
+ }
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation 'androidx.appcompat:appcompat:1.0.2'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test:runner:1.2.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+// implementation files('libs\\pdasdk_v2.25_20190328.jar')
+ implementation 'org.litepal.android:java:3.0.0'
+ implementation 'net.sourceforge.jexcelapi:jxl:2.6.12'
+ implementation files('libs\\uhf_r_v1.0.jar')
+
+}
diff --git a/app/debug/output.json b/app/debug/output.json
new file mode 100644
index 0000000..92a0784
--- /dev/null
+++ b/app/debug/output.json
@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}]
\ No newline at end of file
diff --git a/app/debug/扫码写标签.apk b/app/debug/扫码写标签.apk
new file mode 100644
index 0000000..8c96e96
Binary files /dev/null and b/app/debug/扫码写标签.apk differ
diff --git a/app/libs/uhf_r_v1.0.jar b/app/libs/uhf_r_v1.0.jar
new file mode 100644
index 0000000..e69de29
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/app/release/app-release.apk b/app/release/app-release.apk
new file mode 100644
index 0000000..7fa1f82
Binary files /dev/null and b/app/release/app-release.apk differ
diff --git a/app/release/output.json b/app/release/output.json
new file mode 100644
index 0000000..c429e31
--- /dev/null
+++ b/app/release/output.json
@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/example/sancode/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/sancode/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..fbfab9e
--- /dev/null
+++ b/app/src/androidTest/java/com/example/sancode/ExampleInstrumentedTest.java
@@ -0,0 +1,27 @@
+package com.example.sancode;
+
+import android.content.Context;
+
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("com.example.sancode", appContext.getPackageName());
+ }
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..4a5bd76
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/litepal.xml b/app/src/main/assets/litepal.xml
new file mode 100644
index 0000000..6ee49f7
--- /dev/null
+++ b/app/src/main/assets/litepal.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/sancode/ASCIIUtil.java b/app/src/main/java/com/example/sancode/ASCIIUtil.java
new file mode 100644
index 0000000..52ec1ea
--- /dev/null
+++ b/app/src/main/java/com/example/sancode/ASCIIUtil.java
@@ -0,0 +1,36 @@
+package com.example.sancode;
+
+/**
+ * @author: wangh
+ * @description: Ass
+ * @date: 2019/06/20-15:18
+ */
+public class ASCIIUtil {
+
+ // String明文转ASCII码hex字符串,一个明文字符生成两个字符表示的16进制ASCII码
+ public static String str2Hex(String str) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < str.length(); i++) {
+ char c = str.charAt(i);
+ // 这里的第二个参数16表示十六进制
+ sb.append(Integer.toString(c, 16));
+ // 或用toHexString方法直接转成16进制
+ // sb.append(Integer.toHexString(c));
+ }
+ return sb.toString();
+ }
+
+ // ASCII码hex字符串转String明文
+ public static String hex2Str(String hex) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < hex.length() - 1; i += 2) {
+ String h = hex.substring(i, (i + 2));
+ int decimal = Integer.parseInt(h, 16);
+ sb.append((char) decimal);
+ }
+ return sb.toString();
+
+ }
+
+
+}
diff --git a/app/src/main/java/com/example/sancode/BaseActivity.java b/app/src/main/java/com/example/sancode/BaseActivity.java
new file mode 100644
index 0000000..279efb7
--- /dev/null
+++ b/app/src/main/java/com/example/sancode/BaseActivity.java
@@ -0,0 +1,115 @@
+package com.example.sancode;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.BRMicro.Tools;
+import com.handheld.uhfr.UHFRManager;
+import com.uhf.api.cls.Reader;
+
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+
+/**
+ * Created by wangh on 2020/11/3-9:48。
+ */
+public abstract class BaseActivity extends AppCompatActivity {
+ //c5106
+ public UHFRManager mUhfrManager;//uhf
+ public MediaPlayer music;
+ public byte[] accessBytes = Tools.HexString2Bytes("00000000") ;
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ music=MediaPlayer.create(this, R.raw.msg);
+
+ }
+ public void san_epc() {
+ byte[] readBytes = new byte[16];
+ Reader.READER_ERR reader_err = mUhfrManager.getTagData(1,2,8,readBytes,accessBytes,(short)1000) ;
+
+ Log.e("TAG", "san_epc:" + reader_err);
+ if (reader_err.toString().equals("MT_OK_ERR")){
+ music.start();
+ Log.e("TAG", "san_epc:" + Tools.Bytes2HexString(readBytes, readBytes.length)) ;
+// san_epc_( Tools.Bytes2HexString(readBytes, readBytes.length));
+ san_epc_(readBytes);
+ }
+
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (myReceiver!=null){
+ unregisterReceiver(myReceiver);
+ }
+ if (mUhfrManager != null) {//close uhf module
+ mUhfrManager.close();
+ mUhfrManager = null;
+ }
+ }
+ private BroadcastReceiver myReceiver= new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ byte[] data = intent.getByteArrayExtra("data");
+ try {
+ String san_text_info = new String(data, "utf-8");
+ onReceiverCall(san_text_info);
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ }
+
+ };
+ @Override
+ protected void onResume() {
+ super.onResume();
+ IntentFilter filter = new IntentFilter();
+ filter.addAction("com.rfid.SCAN");
+ registerReceiver(myReceiver, filter);
+ mUhfrManager=UHFRManager.getIntance();
+
+ }
+ //扫描条码
+ public abstract void onReceiverCall(String text);
+ public abstract void san_epc_(byte[] text);
+// @Override
+// protected void onResume() {
+// super.onResume();
+// scanReader.open();
+//
+// tag6C = new Tag6C(CLReader);//6c标签
+// uhfConifg = new UHFConifg(CLReader);
+// //打开电源
+// uhfConifg.OpenConnect(false, MainActivity.this);
+// if (uhfConifg.GetANTPowerParam() != 24) {
+// if (uhfConifg.SetANTPowerParam(2, 24) == 0) {
+// Log.e("test","设置天线功率成功"+UHFReader._Config.GetANTPowerParam());
+// } else {
+// uhfConifg.Stop();
+// uhfConifg.SetANTPowerParam(2, 24);
+// }
+// }
+// }
+}
+//
+// @Override
+// public void OutPutEPC(EPCModel epcModel) {
+// uhfConifg.Stop();//停止
+// String epc =epcModel._EPC.trim();
+// tid=epcModel._TID;
+// Message msg =Message.obtain();
+// msg.obj =epc;
+// msg.what=1; //标志消息的标志
+// myHandler.sendMessage(msg);
+// }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/sancode/C5103Activity.java b/app/src/main/java/com/example/sancode/C5103Activity.java
new file mode 100644
index 0000000..a767624
--- /dev/null
+++ b/app/src/main/java/com/example/sancode/C5103Activity.java
@@ -0,0 +1,156 @@
+package com.example.sancode;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.SharedPreferences;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.util.MonthDisplayHelper;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.BRMicro.Tools;
+import com.handheld.uhfr.UHFRManager;
+import com.uhf.api.cls.Reader;
+
+import java.util.Date;
+
+public class C5103Activity extends AppCompatActivity implements View.OnClickListener, TextWatcher {
+ TextView ASCIIText;
+ TextView EPCText;
+ EditText writheText;
+ TextView writheAsciiText;
+ EditText read_lenth;
+ Button writhe, clan, san,setting;
+ private MediaPlayer music;
+ public UHFRManager mUhfrManager;//uhf
+ public byte[] accessBytes = Tools.HexString2Bytes("00000000") ;
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_c5103);
+ init_view();
+ music=MediaPlayer.create(this, R.raw.msg);
+
+ }
+
+ private void init_view() {
+ ASCIIText=findViewById(R.id.ASCII_text);
+ EPCText=findViewById(R.id.EPC_text);
+ writheText=findViewById(R.id.writhe_text);
+ writheText.addTextChangedListener(this);
+ writheAsciiText=findViewById(R.id.writhe_ascii_text);
+ read_lenth=findViewById(R.id.rind_lenth);
+ read_lenth.setText(SharedPreferencesUtils.getstring("reed_length","7"));
+ writhe=findViewById(R.id.writhe);
+ clan=findViewById( R.id.clan);
+ san=findViewById( R.id.san);
+ setting=findViewById(R.id.setting);
+ writhe.setOnClickListener(this);
+ clan.setOnClickListener(this);
+ san.setOnClickListener(this);
+ setting.setOnClickListener(this);
+
+ }
+
+
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.writhe:
+ //输入框
+ String writhe_code=writheText.getText().toString();
+ if (writhe_code.isEmpty())
+ return;
+ //转ASCII
+ String code=ASCIIUtil.str2Hex(writhe_code);
+ int lenth=code.length()*2;
+ String conntor=Integer.toHexString(lenth);
+ Log.e("TAG", lenth+"onClick:" + conntor);
+
+ byte[] write= Tools.HexString2Bytes(conntor+"00"+code);
+ char i=1;
+ Reader.READER_ERR reader_err = mUhfrManager. writeTagData(i,1,
+ write, write.length, accessBytes, (short)1000);
+ Log.e("TAG", "write:" + reader_err);
+ if (reader_err.toString().equals("MT_OK_ERR")){
+ Toast.makeText(this, "写入成功"+code, Toast.LENGTH_SHORT).show();
+ ASCIIText.setText(null);
+ EPCText.setText(null);
+ writheText.setText(null);
+ writheAsciiText.setText(null);
+ }else {
+ Toast.makeText(this, "写入失败", Toast.LENGTH_SHORT).show();
+ }
+ break;
+ case R.id.clan:
+ ASCIIText.setText(null);
+ EPCText.setText(null);
+ writheText.setText(null);
+ writheAsciiText.setText(null);
+ break;
+ case R.id.san:
+ int lenth_text= Integer.parseInt(read_lenth.getText().toString());
+ byte[] readBytes = new byte[lenth_text*2];
+ Reader.READER_ERR reader_err1 = mUhfrManager
+ .getTagData(1,2,lenth_text,readBytes,accessBytes,(short)1000) ;
+ Log.e("TAG", "san_epc:" + reader_err1);
+ if (reader_err1.toString().equals("MT_OK_ERR")) {
+ music.start();
+ String epc=Tools.Bytes2HexString(readBytes, readBytes.length);
+ ASCIIText.setText(epc);
+ EPCText.setText(ASCIIUtil.hex2Str(epc));
+ }
+ break;
+ case R.id.setting:
+ String trim = read_lenth.getText().toString().trim();
+ if (trim.isEmpty()) return;
+ SharedPreferencesUtils.putstring("reed_length",trim);
+ Toast.makeText(this, "本次应用成功", Toast.LENGTH_SHORT).show();
+ break;
+ }
+ }
+
+// @Override
+// public boolean onKeyDown(int keyCode, KeyEvent event) {
+// Toast.makeText(this, ""+keyCode, Toast.LENGTH_SHORT).show();
+// return true;
+// }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mUhfrManager=UHFRManager.getIntance();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mUhfrManager!=null){
+ mUhfrManager.close();
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+ }
+
+ @Override
+ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable editable) {
+ writheAsciiText.setText(ASCIIUtil.str2Hex(editable.toString()));
+ }
+}
diff --git a/app/src/main/java/com/example/sancode/MainActivity.java b/app/src/main/java/com/example/sancode/MainActivity.java
new file mode 100644
index 0000000..1375ca1
--- /dev/null
+++ b/app/src/main/java/com/example/sancode/MainActivity.java
@@ -0,0 +1,279 @@
+package com.example.sancode;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+//import com.pda.rfid.EPCModel;
+//import com.pda.rfid.IAsynchronousMessage;
+//import com.pda.rfid.uhf.Tag6C;
+//import com.pda.rfid.uhf.UHF;
+//import com.pda.rfid.uhf.UHFConifg;
+//import com.pda.rfid.uhf.UHFReader;
+//import com.pda.scanner.ScanReader;
+//import com.pda.scanner.Scanner;
+
+import com.BRMicro.Tools;
+import com.uhf.api.cls.Reader;
+
+import org.litepal.LitePal;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.ref.WeakReference;
+import java.nio.charset.Charset;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+import jxl.Workbook;
+import jxl.write.Label;
+import jxl.write.WritableSheet;
+import jxl.write.WritableWorkbook;
+import jxl.write.WriteException;
+
+public class MainActivity extends BaseActivity implements View.OnClickListener
+{
+ TextView text2;
+ EditText text1;
+
+ Button button,bu1,but2,but12;
+
+
+ private long exitTime = 0;
+ private byte[] tid=null;
+ private AlertDialog.Builder dialog;
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ init();
+ dialog = new AlertDialog.Builder(MainActivity.this);
+ }
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()){
+ case R.id.but:
+ String barCode=text1.getText().toString();
+// if (barCode.equals("")||tid==null){
+// Toast.makeText(this, "还未扫描标签&条码", Toast.LENGTH_SHORT).show();
+// }else {
+ String epc=text2.getText().toString();
+ code_rule(barCode);
+// }
+
+ break;
+
+ case R.id.but2:
+ san_epc();
+ break;
+ case R.id.but1:
+ text1.setText("");
+ text2.setText("");
+ break;
+
+
+
+ }
+
+
+ }
+ //规则
+ private void code_rule(String barCode){
+ barCode.trim();
+// int codelenth=barCode.length();
+// if (codelenth>12){
+// Log.e("test","大于12");
+// barCode=barCode.substring(0,12);
+// }else if (codelenth<12){
+// int needLenth=12-codelenth;
+// for (int i=0;i 2000) {
+ Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
+ exitTime = System.currentTimeMillis();
+ return true;
+ } else {
+ finish();
+ }
+ }
+ return false;
+ }
+
+
+
+
+ //初始化ui
+ private void init(){
+ text1=findViewById(R.id.textView2);
+ text2=findViewById(R.id.text1);
+ button=findViewById(R.id.but);
+ but2=findViewById(R.id.but2);
+ but2.setOnClickListener(this);
+ bu1=findViewById(R.id.but1);
+ bu1.setOnClickListener(this);
+
+ button.setOnClickListener(this);
+
+ }
+
+
+ //扫描条码
+ @Override
+ public void onReceiverCall(String text) {
+ text1.setText(text);
+ }
+
+ @Override
+ public void san_epc_(byte[] text) {
+ tid=text;
+ text2.setText(ASCIIUtil.hex2Str(Tools.Bytes2HexString(tid, tid.length)));
+ }
+
+ //导出数据到excel表
+ private void craetExcel() {
+ try {
+ File file=new File("/storage/emulated/0/RfidFile");
+ if (!file.exists()){
+ file.mkdirs();
+ }
+ File file1=new File(file,"RFIDRecrd.xls");
+ if (!file1.exists()){
+ file1.createNewFile();
+ }
+ WritableWorkbook book = Workbook.createWorkbook(file1);
+ // 参数0表示这是第一页
+ WritableSheet sheet_wirthe = book.createSheet("EPC写入记录", 0);
+ sheet_wirthe.setColumnView(0,5);
+ sheet_wirthe.setColumnView(1,35);
+ sheet_wirthe.setColumnView(2,35);
+ sheet_wirthe.setColumnView(3,35);
+ // 在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
+ Label epc_writhe1 = new Label(0, 0, "id");
+
+ sheet_wirthe.addCell(epc_writhe1);
+ Label barcode = new Label(1, 0, "BarCode");
+ sheet_wirthe.addCell(barcode);
+ Label epc_writhe = new Label(2, 0, "EPC");
+ sheet_wirthe.addCell(epc_writhe);
+ Label tid_writhe = new Label(3, 0, "时间");
+ sheet_wirthe.addCell(tid_writhe);
+ // 以及单元格内容为baby
+ List rfids= LitePal.findAll(RFID.class);
+ Log.e("TAG", "craetExcel:" + rfids.toString());
+ if (rfids.size()!=0) {
+ for (int i = 0; i < rfids.size(); i++) {
+ RFID rfid = rfids.get(i);
+ Label id_writhe_1 = new Label(0, i+1, rfid.getId()+"");
+ sheet_wirthe.addCell(id_writhe_1);
+
+ Label bar_writhe_1 = new Label(1, i+1, rfid.getBarcode());
+ sheet_wirthe.addCell(bar_writhe_1);
+ Label epc_writhe_1 = new Label(2, i+1, rfid.getEpc());
+ sheet_wirthe.addCell(epc_writhe_1);
+ Label tid_writhe_1 = new Label(3, i+1, rfid.getTime());
+ sheet_wirthe.addCell(tid_writhe_1);
+ }
+ }
+ //写入数据并关闭
+ book.write();
+ book.close();
+ Toast.makeText(this, "导出成功", Toast.LENGTH_SHORT).show();
+ } catch (Exception e) {
+ e.printStackTrace();
+ Toast.makeText(this, "导出失败", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ }
+
+ @Override
+ public boolean onCreatePanelMenu(int featureId, Menu menu) {
+ MenuInflater menuInflater=new MenuInflater(this);
+ menuInflater.inflate(R.menu.mymenu,menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ switch (item.getItemId()){
+ case R.id.qingkong:
+ text1.setText("");
+ text2.setText("");
+ tid=null;
+ break;
+
+ case R.id.daochu:
+ craetExcel();
+ break;
+ case R.id.qingkongsql:
+ dialog.setMessage("确定要删除所有数据库记录!")
+ .setTitle("提示")
+ .setCancelable(false)
+ .setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ LitePal.deleteAll(RFID.class);
+ }
+ }).setNegativeButton("取消",null);
+ dialog.show();
+ break;
+
+ }
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/app/src/main/java/com/example/sancode/MyApplication.java b/app/src/main/java/com/example/sancode/MyApplication.java
new file mode 100644
index 0000000..291883c
--- /dev/null
+++ b/app/src/main/java/com/example/sancode/MyApplication.java
@@ -0,0 +1,20 @@
+package com.example.sancode;
+
+import android.app.Application;
+
+import org.litepal.LitePal;
+
+/**
+ * @author: wangh
+ * @description:
+ * @date: 2019/06/19-11:24
+ */
+public class MyApplication extends Application {
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ LitePal.initialize(this);
+
+ }
+}
diff --git a/app/src/main/java/com/example/sancode/RFID.java b/app/src/main/java/com/example/sancode/RFID.java
new file mode 100644
index 0000000..9b044ec
--- /dev/null
+++ b/app/src/main/java/com/example/sancode/RFID.java
@@ -0,0 +1,58 @@
+package com.example.sancode;
+
+import org.litepal.crud.LitePalSupport;
+
+/**
+ * @author: wangh
+ * @description:
+ * @date: 2019/09/10-16:51
+ */
+public class RFID extends LitePalSupport {
+ private int id;
+ private String barcode;
+ private String epc;
+ private String time;
+
+ public String getBarcode() {
+ return barcode;
+ }
+
+ public void setBarcode(String barcode) {
+ this.barcode = barcode;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getEpc() {
+ return epc;
+ }
+
+ public void setEpc(String epc) {
+ this.epc = epc;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ public void setTime(String time) {
+ this.time = time;
+ }
+
+
+ @Override
+ public String toString() {
+ return "RFID{" +
+ "id=" + id +
+ ", barcode='" + barcode + '\'' +
+ ", epc='" + epc + '\'' +
+ ", time='" + time + '\'' +
+ '}';
+ }
+}
diff --git a/app/src/main/java/com/example/sancode/SharedPreferencesUtils.java b/app/src/main/java/com/example/sancode/SharedPreferencesUtils.java
new file mode 100644
index 0000000..7bf456c
--- /dev/null
+++ b/app/src/main/java/com/example/sancode/SharedPreferencesUtils.java
@@ -0,0 +1,86 @@
+package com.example.sancode;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+/**
+ * Created by wang 18/7/5
+ */
+
+public class SharedPreferencesUtils {
+ private static SharedPreferences sharedPreferences;
+ private static SharedPreferences.Editor edit;
+
+ public static void init(Context context, String name) {
+ sharedPreferences = context.getSharedPreferences(name, context.MODE_PRIVATE);
+ edit = sharedPreferences.edit();
+ edit.commit();
+ }
+
+ public static void putstring(String key, String value) {
+ if (edit != null) {
+ edit.putString(key, value);
+ edit.commit();
+ }
+ }
+ public static void putInt(String key, int value) {
+ if (edit != null) {
+ edit.putInt(key, value);
+ edit.commit();
+ }
+ }
+
+ public static int getInt(String key, int value) {
+ if (sharedPreferences != null) {
+ return sharedPreferences.getInt(key,value);
+ }
+ return 0;
+ }
+
+
+ public static void putboolean(String key, boolean value) {
+ if (edit != null) {
+ edit.putBoolean(key, value);
+ edit.commit();
+ }
+ }
+
+ /**
+ * 取得方法
+ */
+
+ public static String getstring(String key, String deaflut) {
+ if (sharedPreferences != null) {
+ return sharedPreferences.getString(key, deaflut);
+ }
+ return "";
+ }
+
+ public static boolean getboolean(String key, boolean aaa) {
+ if (sharedPreferences != null) {
+ boolean aBoolean = sharedPreferences.getBoolean(key, aaa);
+ return aBoolean;
+ }
+ return false;
+ }
+
+ /**
+ * remo
+ */
+ public static void removeKey(String key) {
+ if (edit != null) {
+ edit.remove(key);
+ edit.commit();
+ }
+ }
+ public static void Clean() {
+ //清空数据
+ try {
+ edit.clear();
+ edit.commit();
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/app/src/main/jniLibs/arm64-v8a/libModuleAPIJni.so b/app/src/main/jniLibs/arm64-v8a/libModuleAPIJni.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/arm64-v8a/libdevapi.so b/app/src/main/jniLibs/arm64-v8a/libdevapi.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/arm64-v8a/libirdaSerialPort.so b/app/src/main/jniLibs/arm64-v8a/libirdaSerialPort.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/armeabi-v7a/libModuleAPIJni.so b/app/src/main/jniLibs/armeabi-v7a/libModuleAPIJni.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/armeabi-v7a/libdevapi.so b/app/src/main/jniLibs/armeabi-v7a/libdevapi.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/armeabi-v7a/libirdaSerialPort.so b/app/src/main/jniLibs/armeabi-v7a/libirdaSerialPort.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/armeabi/libModuleAPIJni.so b/app/src/main/jniLibs/armeabi/libModuleAPIJni.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/armeabi/libModuleAPI_Android.so b/app/src/main/jniLibs/armeabi/libModuleAPI_Android.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/armeabi/libSerialPort.so b/app/src/main/jniLibs/armeabi/libSerialPort.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/armeabi/libdevapi.so b/app/src/main/jniLibs/armeabi/libdevapi.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/jniLibs/armeabi/libirdaSerialPort.so b/app/src/main/jniLibs/armeabi/libirdaSerialPort.so
new file mode 100644
index 0000000..e69de29
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..1f6bb29
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..0d025f9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/rectangle_box.xml b/app/src/main/res/drawable/rectangle_box.xml
new file mode 100644
index 0000000..48402f4
--- /dev/null
+++ b/app/src/main/res/drawable/rectangle_box.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_c5103.xml b/app/src/main/res/layout/activity_c5103.xml
new file mode 100644
index 0000000..1b37c62
--- /dev/null
+++ b/app/src/main/res/layout/activity_c5103.xml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
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..687a2e5
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/mymenu.xml b/app/src/main/res/menu/mymenu.xml
new file mode 100644
index 0000000..c6a9562
--- /dev/null
+++ b/app/src/main/res/menu/mymenu.xml
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..898f3ed
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dffca36
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..64ba76f
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dae5e08
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/biaoqian.png b/app/src/main/res/mipmap-xhdpi/biaoqian.png
new file mode 100644
index 0000000..3ac357b
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/biaoqian.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..e5ed465
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..14ed0af
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b0907ca
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..d8ae031
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..2c18de9
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..beed3cd
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/raw/msg.mp3 b/app/src/main/res/raw/msg.mp3
new file mode 100644
index 0000000..0d1d5cb
Binary files /dev/null and b/app/src/main/res/raw/msg.mp3 differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..104f364
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,12 @@
+
+
+ #008577
+ #00574B
+ #D81B60
+ #FFFFFF
+ #000000
+ #C4C4C4
+ #769aff
+ #F44336
+ #4CAF50
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..bead973
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ 扫码写标签
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..08cbc50
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/app/src/test/java/com/example/sancode/ExampleUnitTest.java b/app/src/test/java/com/example/sancode/ExampleUnitTest.java
new file mode 100644
index 0000000..7437a10
--- /dev/null
+++ b/app/src/test/java/com/example/sancode/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.sancode;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..02199bb
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,27 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.4.1'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..199d16e
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,20 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Automatically convert third-party libraries to use AndroidX
+android.enableJetifier=true
+
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
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..14364a7
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Thu Sep 05 11:04:41 CST 2019
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..cccdd3d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..f955316
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
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'