diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser new file mode 100644 index 0000000..71d2f1f Binary files /dev/null and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..30aa626 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 3963879..99202cc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,33 +1,34 @@ \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/app/.gitignore b/app/.gitignore old mode 100644 new mode 100755 diff --git a/app/build.gradle b/app/build.gradle old mode 100644 new mode 100755 index 6991af9..13aabde --- a/app/build.gradle +++ b/app/build.gradle @@ -1,32 +1,32 @@ apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultConfig { applicationId "org.dslul.ticketreader" minSdkVersion 15 targetSdkVersion 26 - versionCode 5 - versionName "1.4" + versionCode 8 + versionName "1.7" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:26.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' - compile 'com.google.android.gms:play-services-ads:11.8.0' - compile 'com.android.support:cardview-v7:26.1.0' + implementation 'com.google.android.gms:play-services-ads:12.0.1' + implementation 'com.android.support:cardview-v7:26.1.0' } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro old mode 100644 new mode 100755 diff --git a/app/release/app-release.apk b/app/release/app-release.apk deleted file mode 100644 index 4824b04..0000000 Binary files a/app/release/app-release.apk and /dev/null differ diff --git a/app/release/output.json b/app/release/output.json old mode 100644 new mode 100755 index bc7bb51..0b8b5d9 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":5},"path":"app-release.apk","properties":{"packageId":"org.dslul.ticketreader","split":"","minSdkVersion":"15"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":7,"versionName":"1.6","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/org/dslul/ticketreader/ExampleInstrumentedTest.java b/app/src/androidTest/java/org/dslul/ticketreader/ExampleInstrumentedTest.java old mode 100644 new mode 100755 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml old mode 100644 new mode 100755 diff --git a/app/src/main/java/org/dslul/ticketreader/MainActivity.java b/app/src/main/java/org/dslul/ticketreader/MainActivity.java old mode 100644 new mode 100755 index 024579f..42377b8 --- a/app/src/main/java/org/dslul/ticketreader/MainActivity.java +++ b/app/src/main/java/org/dslul/ticketreader/MainActivity.java @@ -1,304 +1,302 @@ package org.dslul.ticketreader; import android.os.Bundle; import android.os.CountDownTimer; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.CardView; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.Button; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TableLayout; import android.widget.TextView; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.concurrent.TimeUnit; import android.content.ClipboardManager; import android.content.ClipData; import android.content.Context; import android.nfc.NfcAdapter; import android.nfc.tech.NfcA; import android.widget.Toast; import android.content.Intent; import android.content.IntentFilter; import android.app.PendingIntent; import android.os.Handler; import android.os.Message; import android.app.AlertDialog; import android.content.DialogInterface; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdView; import com.google.android.gms.ads.MobileAds; public class MainActivity extends AppCompatActivity { private NfcAdapter mNfcAdapter; private IntentFilter tech; private IntentFilter[] intentFiltersArray; private PendingIntent pendingIntent; private Intent intent; private AlertDialog alertDialog; private Toast currentToast; private String pages = "ERROR"; private AdView adview; private ImageView imageNfc; private CardView ticketCard; private CardView statusCard; private ImageView statusImg; private TextView statoBiglietto; private TextView infoLabel; private TableLayout infoTable; private TextView dataObliterazione; private TextView corseRimanenti; private CountDownTimer timer; private static final int ACTION_NONE = 0; private static final int ACTION_READ = 1; private int scanAction; // list of NFC technologies detected: private final String[][] techListsArray = new String[][] { new String[] { //MifareUltralight.class.getName(), NfcA.class.getName() } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); adview = (AdView) findViewById(R.id.adView); imageNfc = (ImageView) findViewById(R.id.imagenfcView); ticketCard = (CardView) findViewById(R.id.ticketCardView); statusCard = (CardView) findViewById(R.id.statusCardView); statusImg = (ImageView) findViewById(R.id.statusImg); statoBiglietto = (TextView) findViewById(R.id.stato_biglietto); infoLabel = (TextView) findViewById(R.id.infolabel); infoTable = (TableLayout) findViewById(R.id.info_table); dataObliterazione = (TextView) findViewById(R.id.data_obliterazione); corseRimanenti = (TextView) findViewById(R.id.corse_rimaste); - MobileAds.initialize(this, ""); + MobileAds.initialize(this, "ca-app-pub-3940256099942544/6300978111"); AdRequest adRequest = new AdRequest.Builder().build(); adview.loadAd(adRequest); mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { - Toast.makeText(this, "Questo dispositivo non supporta la tecnologia NFC.", Toast.LENGTH_LONG).show(); + Toast.makeText(this, R.string.nfc_not_supported, Toast.LENGTH_LONG).show(); finish(); return; } if (!mNfcAdapter.isEnabled()) { - Toast.makeText(this, "NFC disabilitato. Attiva l'NFC e premi il tasto indietro.", Toast.LENGTH_LONG).show(); + Toast.makeText(this, R.string.nfc_disabled, Toast.LENGTH_LONG).show(); startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS)); } tech = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); intentFiltersArray = new IntentFilter[] {tech}; intent = new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); //FLAG_ACTIVITY_REORDER_TO_FRONT FLAG_RECEIVER_REPLACE_PENDING pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); scanAction = ACTION_READ; onNewIntent(getIntent()); } @Override protected void onResume() { super.onResume(); mNfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, this.techListsArray); } @Override protected void onPause() { // disabling foreground dispatch: //NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); mNfcAdapter.disableForegroundDispatch(this); super.onPause(); } @Override protected void onNewIntent(Intent intent) { if (intent.getAction().equals(NfcAdapter.ACTION_TECH_DISCOVERED)) { String mTextBufferText = "aa"; - NfcThread nfcThread = new NfcThread(intent, scanAction, mTextBufferText, mTextBufferHandler, mToastShortHandler, mToastLongHandler, mShowInfoDialogHandler); + NfcThread nfcThread = new NfcThread(getBaseContext(), intent, scanAction, mTextBufferText, mTextBufferHandler, mToastShortHandler, mToastLongHandler, mShowInfoDialogHandler); nfcThread.start(); scanAction = ACTION_READ; } } private Handler mTextBufferHandler = new Handler() { public void handleMessage(Message msg) { pages = (String)msg.obj; if(timer != null) timer.cancel(); if(pages != "ERROR") { Parser parser = new Parser(pages); dataObliterazione.setText(parser.getDate()); corseRimanenti.setText(Integer.toString(parser.getRemainingRides())); if(parser.getRemainingMinutes() != 0) { statoBiglietto.setText(R.string.in_corso); statusImg.setImageResource(R.drawable.ic_restore_grey_800_36dp); statusCard.setCardBackgroundColor(0xFF90CAF9); Calendar calendar = Calendar.getInstance(); int sec = calendar.get(Calendar.SECOND); timer = new CountDownTimer((parser.getRemainingMinutes()*60 - sec)*1000, 1000) { public void onTick(long millis) { statoBiglietto.setText(String.format(getResources().getString(R.string.in_corso), TimeUnit.MILLISECONDS.toMinutes(millis), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)))); } public void onFinish() { statoBiglietto.setText(R.string.corse_esaurite); statusImg.setImageResource(R.drawable.ic_error_grey_800_36dp); statusCard.setCardBackgroundColor(0xFFEF9A9A); - timer.cancel(); + if(timer != null) + timer.cancel(); } }.start(); } else if(parser.getRemainingRides() == 0 && parser.getRemainingMinutes() == 0) { statoBiglietto.setText(R.string.corse_esaurite); statusImg.setImageResource(R.drawable.ic_error_grey_800_36dp); statusCard.setCardBackgroundColor(0xFFEF9A9A); } else if(parser.getRemainingRides() != 0 && parser.getRemainingMinutes() == 0) { statoBiglietto.setText(String.format(getResources().getString(R.string.corse_disponibili), parser.getRemainingRides())); statusImg.setImageResource(R.drawable.ic_check_circle_grey_800_36dp); statusCard.setCardBackgroundColor(0xFFA5D6A7); } statusCard.setVisibility(View.VISIBLE); ticketCard.setVisibility(View.VISIBLE); infoLabel.setText(R.string.read_another_ticket); imageNfc.setVisibility(View.GONE); } else { statusCard.setVisibility(View.GONE); ticketCard.setVisibility(View.GONE); infoLabel.setText(R.string.info_instructions); imageNfc.setVisibility(View.VISIBLE); } } }; private Handler mToastShortHandler = new Handler() { public void handleMessage(Message msg) { String text = (String)msg.obj; if(currentToast != null) currentToast.cancel(); currentToast = Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT); currentToast.show(); } }; private Handler mToastLongHandler = new Handler() { public void handleMessage(Message msg) { String text = (String)msg.obj; if(currentToast != null) currentToast.cancel(); currentToast = Toast.makeText(MainActivity.this, text, Toast.LENGTH_LONG); currentToast.show(); } }; private Handler mShowInfoDialogHandler = new Handler() { public void handleMessage(Message msg) { String text = (String)msg.obj; //infoDialog = showInfoDialog(text); //infoDialog.show(); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_info) { - alertDialog = showAlertDialog("Semplice applicazione opensource per visualizzare le " + - "corse rimanenti nei biglietti GTT. \n\nhttps://github.com/dslul/ticketreader\n\n" + - "Icone: Card Paypass by Viktor Vorobyev from the Noun Project;\n" + - "samsung galaxy by Setyo Ari Wibowo from the Noun Project"); + alertDialog = showAlertDialog(getString(R.string.info_message)); alertDialog.show(); return true; } return super.onOptionsItemSelected(item); } private AlertDialog showAlertDialog(String message) { DialogInterface.OnClickListener dialogInterfaceListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { alertDialog.cancel(); scanAction = ACTION_READ; } }; alertDialog = new AlertDialog.Builder(this) - .setTitle("Informazioni") + .setTitle(R.string.information) .setIcon(android.R.drawable.ic_dialog_info) .setMessage(message) - .setPositiveButton("Chiudi", null) + .setPositiveButton(R.string.close_dialog, null) .create(); alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { scanAction = ACTION_READ; } }); return alertDialog; } } diff --git a/app/src/main/java/org/dslul/ticketreader/NfcThread.java b/app/src/main/java/org/dslul/ticketreader/NfcThread.java old mode 100644 new mode 100755 index 240e321..f8fa4f2 --- a/app/src/main/java/org/dslul/ticketreader/NfcThread.java +++ b/app/src/main/java/org/dslul/ticketreader/NfcThread.java @@ -1,269 +1,273 @@ package org.dslul.ticketreader; import java.io.IOException; +import android.content.Context; import android.content.Intent; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.NfcA; import android.os.Handler; import android.os.Message; //import android.util.Log; //code from http://www.emutag.com/soft.php public class NfcThread extends Thread { private static final int ACTION_NONE = 0; private static final int ACTION_READ = 1; private static final int ACTION_WRITE = 2; - + + private Context context; private Intent intent; private int scanAction; private String mTextBufferText; private Handler mTextBufferHandler, mToastShortHandler, mToastLongHandler, mShowInfoDialogHandler; private byte[] readBuffer = new byte[1024]; // maximum theoretical capacity of MIFARE Ultralight private byte[] toWriteBuffer = new byte[1024]; NfcThread( + Context context, Intent intent, int scanAction, String mTextBufferText, Handler mTextBufferHandler, Handler mToastShortHandler, Handler mToastLongHandler, Handler mShowInfoDialogHandler ) { + this.context = context; this.intent = intent; this.scanAction = scanAction; this.mTextBufferText = mTextBufferText; this.mTextBufferHandler = mTextBufferHandler; this.mToastShortHandler = mToastShortHandler; this.mToastLongHandler = mToastLongHandler; this.mShowInfoDialogHandler = mShowInfoDialogHandler; } public void run() { final Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (scanAction == ACTION_NONE) { showToastLong("Please select READ or WRITE before scanning tag"); return; } final NfcA mfu = NfcA.get(tagFromIntent); if (mfu == null) { - showToastLong("Tag does not support ISO 14443-A!"); + showToastLong(context.getString(R.string.ticket_not_supported)); return; } byte[] ATQA = mfu.getAtqa(); if (mfu.getSak() != 0x00 || ATQA.length != 2 || ATQA[0] != 0x44 || ATQA[1] != 0x00) { - showToastLong("Tag is not MIFARE Ultralight® - compatible!"); + showToastLong(context.getString(R.string.ticket_not_supported)); return; } int pagesRead; try { //Log.i("position", "read data"); if (scanAction == ACTION_READ) { mfu.connect(); pagesRead = rdNumPages(mfu, 0); // 0 for no limit (until error) mfu.close(); String content = ""; byte[] mfuPage = new byte[4]; for (int i = 0; i < pagesRead * 4; i += 4) { System.arraycopy(readBuffer, i, mfuPage, 0, 4); content = content + ByteArrayToHexString(mfuPage) + System.getProperty("line.separator"); } if(pagesRead >= 16) { - showToastShort("Biglietto letto correttamente."); + showToastShort(context.getString(R.string.ticket_correctly_read)); setTextBuffer(content); } else { - showToastShort("Lettura fallita, riprovare"); + showToastShort(context.getString(R.string.read_failure)); setTextBuffer("ERROR"); } } } catch (Exception e) { - showToastLong("Errore di comunicazione. Riprova"); + showToastLong(context.getString(R.string.communication_error)); } } private void setTextBuffer(String text) { Message msg = new Message(); msg.obj = text; mTextBufferHandler.sendMessage(msg); } private void showToastShort(String text) { Message msg = new Message(); msg.obj = text; mToastShortHandler.sendMessage(msg); } private void showToastLong(String text) { Message msg = new Message(); msg.obj = text; mToastLongHandler.sendMessage(msg); } private void showInfoDialog(String text) { Message msg = new Message(); msg.obj = text; mShowInfoDialogHandler.sendMessage(msg); } /* private int rdAllPages(NfcA mfu) { int pagesRead = 0; while (rdPages(mfu, pagesRead) == 0) { pagesRead += 4; if (pagesRead == 256) break; } return pagesRead; } */ private int rdNumPages(NfcA mfu, int num) { int pagesRead = 0; while (rdPages(mfu, pagesRead) == 0) { pagesRead++; if (pagesRead == num || pagesRead == 256) break; } return pagesRead; } /* private int rdNumPages(NfcA mfu, int num) { int pagesRead = 0; // align number of pages to a multiple of 4 num += 3; num >>>= 2; // unsigned shift num <<= 2; while (rdPages(mfu, pagesRead) == 0) { pagesRead += 4; if (pagesRead == num || pagesRead == 256) break; } return pagesRead; } */ // first failure (NAK) causes response 0x00 (or possibly other 1-byte values) // second failure (NAK) causes transceive() to throw IOException private byte rdPages(NfcA tag, int pageOffset) { byte[] cmd = {0x30, (byte)pageOffset}; byte[] response = new byte[16]; try { response = tag.transceive(cmd); } catch (IOException e) { return 1; } if (response.length != 16) return 1; //System.arraycopy(response, 0, readBuffer, pageOffset * 4, 16); System.arraycopy(response, 0, readBuffer, pageOffset * 4, 4); return 0; } // first failure (NAK) causes transceive() to throw IOException /* private byte wrPage(NfcA tag, int pageOffset) { byte[] cmd = {(byte)0xA2, (byte)pageOffset, 0x00, 0x00, 0x00, 0x00}; System.arraycopy(toWriteBuffer, pageOffset * 4, cmd, 2, 4); try { Log.i("TRANS START", Integer.toString(pageOffset)); tag.transceive(cmd); Log.i("TRANS END", Integer.toString(pageOffset)); } catch (IOException e) { return 1; } return 0; } */ private byte wrPage(NfcA mfu, int pageOffset) { byte[] cmd = {(byte)0xA2, (byte)pageOffset, 0x00, 0x00, 0x00, 0x00}; System.arraycopy(toWriteBuffer, pageOffset * 4, cmd, 2, 4); //byte[] data = {0x00, 0x00, 0x00, 0x00}; //System.arraycopy(toWriteBuffer, pageOffset * 4, data, 0, 4); //byte errors = 0; //final MifareUltralight mfu = MifareUltralight.get(tag); try { //mfu.connect(); //Log.i("TRANS START", Integer.toString(pageOffset)); //mfu.writePage(pageOffset, data); mfu.transceive(cmd); //Log.i("TRANS END", Integer.toString(pageOffset)); //mfu.close(); } catch (final IOException e) { return 1; } /* finally { try { mfu.close(); } catch (final Exception e) {} } */ return 0; } // first failure (NAK) causes transceive() to throw IOException private byte wrPageCompat(NfcA tag, int pageOffset) { byte[] cmd1 = {(byte)0xA0, (byte)pageOffset}; byte[] cmd2 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; System.arraycopy(toWriteBuffer, pageOffset * 4, cmd2, 0, 4); try { tag.transceive(cmd1); tag.transceive(cmd2); } catch (IOException e) { return 1; } return 0; } private String ByteArrayToHexString(byte[] inarray) { int i, j, in; String [] hex = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; String out= ""; for(j = 0 ; j < inarray.length ; ++j) { in = (int) inarray[j] & 0xff; i = (in >> 4) & 0x0f; out += hex[i]; i = in & 0x0f; out += hex[i]; } return out; } private int HexStringToByteArray(String instring, byte[] outarray, int outoffset) { int errors = 0; byte[] nibbles = new byte[2]; for (int i = 0; i < instring.length(); i += 2) { nibbles[0] = (byte)instring.charAt(i+0); nibbles[1] = (byte)instring.charAt(i+1); if (notHex(nibbles[0])) errors = 1; if (notHex(nibbles[1])) errors = 1; outarray[outoffset] = (byte)((hex2bin(nibbles[0]) << 4) | hex2bin(nibbles[1])); outoffset++; } return errors; } private boolean notHex(byte inchar) { if (inchar >= '0' && inchar <= '9') return false; if (inchar >= 'a' && inchar <= 'f') return false; if (inchar >= 'A' && inchar <= 'F') return false; return true; } private byte hex2bin(byte inchar) { if (inchar > 'Z') inchar -= ' '; if (inchar > '9') inchar -= 7; inchar &= 0x0f; return inchar; } } diff --git a/app/src/main/java/org/dslul/ticketreader/Parser.java b/app/src/main/java/org/dslul/ticketreader/Parser.java old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-hdpi/ic_check_circle_grey_800_24dp.png b/app/src/main/res/drawable-hdpi/ic_check_circle_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-hdpi/ic_check_circle_grey_800_36dp.png b/app/src/main/res/drawable-hdpi/ic_check_circle_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-hdpi/ic_error_grey_800_24dp.png b/app/src/main/res/drawable-hdpi/ic_error_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-hdpi/ic_error_grey_800_36dp.png b/app/src/main/res/drawable-hdpi/ic_error_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-hdpi/ic_restore_grey_800_24dp.png b/app/src/main/res/drawable-hdpi/ic_restore_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-hdpi/ic_restore_grey_800_36dp.png b/app/src/main/res/drawable-hdpi/ic_restore_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-mdpi/ic_check_circle_grey_800_24dp.png b/app/src/main/res/drawable-mdpi/ic_check_circle_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-mdpi/ic_check_circle_grey_800_36dp.png b/app/src/main/res/drawable-mdpi/ic_check_circle_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-mdpi/ic_error_grey_800_24dp.png b/app/src/main/res/drawable-mdpi/ic_error_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-mdpi/ic_error_grey_800_36dp.png b/app/src/main/res/drawable-mdpi/ic_error_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-mdpi/ic_restore_grey_800_24dp.png b/app/src/main/res/drawable-mdpi/ic_restore_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-mdpi/ic_restore_grey_800_36dp.png b/app/src/main/res/drawable-mdpi/ic_restore_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xhdpi/ic_check_circle_grey_800_24dp.png b/app/src/main/res/drawable-xhdpi/ic_check_circle_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xhdpi/ic_check_circle_grey_800_36dp.png b/app/src/main/res/drawable-xhdpi/ic_check_circle_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xhdpi/ic_error_grey_800_24dp.png b/app/src/main/res/drawable-xhdpi/ic_error_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xhdpi/ic_error_grey_800_36dp.png b/app/src/main/res/drawable-xhdpi/ic_error_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xhdpi/ic_restore_grey_800_24dp.png b/app/src/main/res/drawable-xhdpi/ic_restore_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xhdpi/ic_restore_grey_800_36dp.png b/app/src/main/res/drawable-xhdpi/ic_restore_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxhdpi/ic_check_circle_grey_800_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_check_circle_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxhdpi/ic_check_circle_grey_800_36dp.png b/app/src/main/res/drawable-xxhdpi/ic_check_circle_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxhdpi/ic_error_grey_800_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_error_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxhdpi/ic_error_grey_800_36dp.png b/app/src/main/res/drawable-xxhdpi/ic_error_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxhdpi/ic_restore_grey_800_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_restore_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxhdpi/ic_restore_grey_800_36dp.png b/app/src/main/res/drawable-xxhdpi/ic_restore_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_check_circle_grey_800_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_check_circle_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_check_circle_grey_800_36dp.png b/app/src/main/res/drawable-xxxhdpi/ic_check_circle_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_error_grey_800_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_error_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_error_grey_800_36dp.png b/app/src/main/res/drawable-xxxhdpi/ic_error_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_restore_grey_800_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_restore_grey_800_24dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_restore_grey_800_36dp.png b/app/src/main/res/drawable-xxxhdpi/ic_restore_grey_800_36dp.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/ic_nfc.xml b/app/src/main/res/drawable/ic_nfc.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml old mode 100644 new mode 100755 index 9952cda..413cc24 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -1,200 +1,199 @@ - - + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ 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 deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ 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 old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png old mode 100644 new mode 100755 diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml new file mode 100644 index 0000000..43c66e4 --- /dev/null +++ b/app/src/main/res/values-it/strings.xml @@ -0,0 +1,24 @@ + + + Lettore Biglietti GTT + Info + Data obliterazione: + Minuti rimanenti: + Corse rimaste: + Avvicina un biglietto alla parte posteriore del dispositivo per effettuare la scansione + Immagine biglietto nfc + Per leggere un altro biglietto, avvicinalo nuovamente al sensore NFC + %d corse disponibili + In corso %d:%d + Corse esaurite + Dettagli biglietto + Questo dispositivo non supporta la tecnologia NFC. + NFC disabilitato. Attiva l\'NFC e premi il tasto indietro. + Informazioni + Chiudi + Semplice applicazione opensource per visualizzare le corse rimanenti nei biglietti GTT. https://github.com/dslul/ticketreader Icone: Card Paypass by Viktor Vorobyev from the Noun Project; samsung galaxy by Setyo Ari Wibowo from the Noun Project + Biglietto non valido! + Biglietto letto correttamente. + Lettura fallita, riprovare + Errore di comunicazione. Riprova + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml old mode 100644 new mode 100755 index 39f8a3f..0ecba8f --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,14 +1,23 @@ GTT Ticket Reader Info Data obliterazione: Minuti rimanenti: Corse rimaste: Avvicina un biglietto alla parte posteriore del dispositivo per effettuare la scansione Immagine biglietto nfc Per leggere un altro biglietto, avvicinalo nuovamente al sensore NFC %d corse disponibili In corso %d:%d Corse esaurite - Dettagli biglietto + Ticket info + Questo dispositivo non supporta la tecnologia NFC. + NFC disabilitato. Attiva l\'NFC e premi il tasto indietro. + Information + Close + Semplice applicazione opensource per visualizzare le corse rimanenti nei biglietti GTT. https://github.com/dslul/ticketreader Icone: Card Paypass by Viktor Vorobyev from the Noun Project; samsung galaxy by Setyo Ari Wibowo from the Noun Project + Invalid ticket! + Biglietto letto correttamente. + Lettura fallita, riprovare + Errore di comunicazione. Riprova diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/xml/filter_nfc.xml b/app/src/main/res/xml/filter_nfc.xml old mode 100644 new mode 100755 diff --git a/app/src/test/java/org/dslul/ticketreader/ExampleUnitTest.java b/app/src/test/java/org/dslul/ticketreader/ExampleUnitTest.java old mode 100644 new mode 100755 diff --git a/banner.xcf b/banner.xcf old mode 100644 new mode 100755 diff --git a/build.gradle b/build.gradle old mode 100644 new mode 100755 index dc11641..206d303 --- a/build.gradle +++ b/build.gradle @@ -1,30 +1,30 @@ // 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.0.1' + classpath 'com.android.tools.build:gradle:3.1.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() maven { url "https://maven.google.com" } } } task clean(type: Delete) { delete rootProject.buildDir } diff --git a/gradle.properties b/gradle.properties old mode 100644 new mode 100755 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar old mode 100644 new mode 100755 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties old mode 100644 new mode 100755 index 23996fc..4b9ed6e --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jan 15 17:39:22 CET 2018 +#Thu Apr 12 12:46:27 CEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/gradlew.bat b/gradlew.bat old mode 100644 new mode 100755 diff --git a/nfc.svg b/nfc.svg old mode 100644 new mode 100755 diff --git a/settings.gradle b/settings.gradle old mode 100644 new mode 100755 diff --git a/ticket.svg b/ticket.svg old mode 100644 new mode 100755 diff --git a/web_hi_res_512.png b/web_hi_res_512.png old mode 100644 new mode 100755