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