diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 000000000..ab9d4a2a1 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,27 @@ +name: Android CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build + run: ./gradlew assembleRelease + - name: Check lint + run: ./gradlew lintRelease + - name: Run unit tests + run: ./gradlew testReleaseUnitTest + - name: FindBugs + run: ./gradlew findbugs diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ebb79ee47..000000000 --- a/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: android -sudo: true - -install: -- echo y | android update sdk -u -a -t tools -- echo y | android update sdk -u -a -t platform-tools -- echo y | android update sdk -u -a -t build-tools-26.0.2 -- yes | sdkmanager "platforms;android-27" -- echo y | android update sdk -u -a -t extra-google-m2repository -- echo y | android update sdk -u -a -t extra-android-m2repository - -script: ./gradlew assembleRelease testReleaseUnitTest lintRelease findbugs - -after_failure: -- cat app/build/reports/findbugs/findbugs.html -- cat app/build/reports/tests/debug/index.html diff --git a/CHANGELOG.md b/CHANGELOG.md index b6e361651..adffa64ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## v0.28 (2020-03-09) + +Changes: +- Fix barcode centering when exiting full screen ([#351](https://github.com/brarcher/loyalty-card-locker/pull/351)) +- Allow backup export location to be selected ([#352](https://github.com/brarcher/loyalty-card-locker/pull/352)) +- Update translations ([#357](https://github.com/brarcher/loyalty-card-locker/pull/357)) & ([#362](https://github.com/brarcher/loyalty-card-locker/pull/362)) + ## v0.27 (2020-01-26) Changes: diff --git a/app/build.gradle b/app/build.gradle index 53930d650..cb7af7ce2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,17 +10,20 @@ android { compileSdkVersion 29 defaultConfig { - applicationId "protect.card_locker" + applicationId "me.hackerchick.catima" minSdkVersion 16 targetSdkVersion 29 - versionCode 38 - versionName "0.27" + versionCode 39 + versionName "0.28" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } + debug { + applicationIdSuffix ".debug" + } } lintOptions { disable "GoogleAppIndexingWarning" @@ -46,7 +49,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'androidx.appcompat:appcompat:1.2.0-alpha01' + compile 'androidx.appcompat:appcompat:1.2.0' compile 'com.google.android.material:material:1.2.0-alpha03' compile 'androidx.legacy:legacy-support-v4:1.0.0' compile 'com.journeyapps:zxing-android-embedded:3.5.0@aar' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 034df728c..7fc81164a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -45,7 +45,7 @@ android:configChanges="orientation|screenSize" android:windowSoftInputMode="stateHidden" android:exported="true"> - + @@ -53,8 +53,11 @@ + - + @@ -83,11 +86,6 @@ android:label="@string/importExport" android:configChanges="orientation|screenSize" android:theme="@style/AppTheme.NoActionBar"/> - { - private static final String TAG = "LoyaltyCardLocker"; + private static final String TAG = "Catima"; // When drawn in a smaller window 1D barcodes for some reason end up // squished, whereas 2D barcodes look fine. @@ -28,16 +29,18 @@ class BarcodeImageWriterTask extends AsyncTask private static final int MAX_WIDTH_2D = 500; private final WeakReference imageViewReference; + private final WeakReference textViewReference; private final String cardId; private final BarcodeFormat format; private final int imageHeight; private final int imageWidth; BarcodeImageWriterTask(ImageView imageView, String cardIdString, - BarcodeFormat barcodeFormat) + BarcodeFormat barcodeFormat, TextView textView) { // Use a WeakReference to ensure the ImageView can be garbage collected imageViewReference = new WeakReference<>(imageView); + textViewReference = new WeakReference<>(textView); cardId = cardIdString; format = barcodeFormat; @@ -58,6 +61,11 @@ class BarcodeImageWriterTask extends AsyncTask } } + BarcodeImageWriterTask(ImageView imageView, String cardIdString, BarcodeFormat barcodeFormat) + { + this(imageView, cardIdString, barcodeFormat, null); + } + private int getMaxWidth(BarcodeFormat format) { switch(format) @@ -175,16 +183,25 @@ class BarcodeImageWriterTask extends AsyncTask } imageView.setImageBitmap(result); + TextView textView = textViewReference.get(); if(result != null) { Log.i(TAG, "Displaying barcode"); imageView.setVisibility(View.VISIBLE); + + if (textView != null) { + textView.setVisibility(View.VISIBLE); + textView.setText(format.name()); + } } else { Log.i(TAG, "Barcode generation failed, removing image from display"); imageView.setVisibility(View.GONE); + if (textView != null) { + textView.setVisibility(View.GONE); + } } } } diff --git a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java index 18becdcc6..9e1c29830 100644 --- a/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java +++ b/app/src/main/java/protect/card_locker/BarcodeSelectorActivity.java @@ -11,11 +11,13 @@ import androidx.appcompat.widget.Toolbar; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; +import android.util.Pair; import android.view.MenuItem; import android.view.View; import android.view.ViewTreeObserver; import android.widget.EditText; import android.widget.ImageView; +import android.widget.TextView; import com.google.common.collect.ImmutableMap; import com.google.zxing.BarcodeFormat; @@ -34,7 +36,7 @@ import java.util.Map; */ public class BarcodeSelectorActivity extends AppCompatActivity { - private static final String TAG = "LoyaltyCardLocker"; + private static final String TAG = "Catima"; // Result this activity will return public static final String BARCODE_CONTENTS = "contents"; @@ -58,7 +60,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity BarcodeFormat.UPC_A.name() )); - private Map barcodeViewMap; + private Map> barcodeViewMap; private LinkedList barcodeGeneratorTasks = new LinkedList<>(); @Override @@ -75,18 +77,18 @@ public class BarcodeSelectorActivity extends AppCompatActivity actionBar.setDisplayHomeAsUpEnabled(true); } - barcodeViewMap = ImmutableMap.builder() - .put(BarcodeFormat.AZTEC.name(), R.id.aztecBarcode) - .put(BarcodeFormat.CODE_39.name(), R.id.code39Barcode) - .put(BarcodeFormat.CODE_128.name(), R.id.code128Barcode) - .put(BarcodeFormat.CODABAR.name(), R.id.codabarBarcode) - .put(BarcodeFormat.DATA_MATRIX.name(), R.id.datamatrixBarcode) - .put(BarcodeFormat.EAN_8.name(), R.id.ean8Barcode) - .put(BarcodeFormat.EAN_13.name(), R.id.ean13Barcode) - .put(BarcodeFormat.ITF.name(), R.id.itfBarcode) - .put(BarcodeFormat.PDF_417.name(), R.id.pdf417Barcode) - .put(BarcodeFormat.QR_CODE.name(), R.id.qrcodeBarcode) - .put(BarcodeFormat.UPC_A.name(), R.id.upcaBarcode) + barcodeViewMap = ImmutableMap.>builder() + .put(BarcodeFormat.AZTEC.name(), new Pair<>(R.id.aztecBarcode, R.id.aztecBarcodeText)) + .put(BarcodeFormat.CODE_39.name(), new Pair<>(R.id.code39Barcode, R.id.code39BarcodeText)) + .put(BarcodeFormat.CODE_128.name(), new Pair<>(R.id.code128Barcode, R.id.code128BarcodeText)) + .put(BarcodeFormat.CODABAR.name(), new Pair<>(R.id.codabarBarcode, R.id.codabarBarcodeText)) + .put(BarcodeFormat.DATA_MATRIX.name(), new Pair<>(R.id.datamatrixBarcode, R.id.datamatrixBarcodeText)) + .put(BarcodeFormat.EAN_8.name(), new Pair<>(R.id.ean8Barcode, R.id.ean8BarcodeText)) + .put(BarcodeFormat.EAN_13.name(), new Pair<>(R.id.ean13Barcode, R.id.ean13BarcodeText)) + .put(BarcodeFormat.ITF.name(), new Pair<>(R.id.itfBarcode, R.id.itfBarcodeText)) + .put(BarcodeFormat.PDF_417.name(), new Pair<>(R.id.pdf417Barcode, R.id.pdf417BarcodeText)) + .put(BarcodeFormat.QR_CODE.name(), new Pair<>(R.id.qrcodeBarcode, R.id.qrcodeBarcodeText)) + .put(BarcodeFormat.UPC_A.name(), new Pair<>(R.id.upcaBarcode, R.id.upcaBarcodeText)) .build(); EditText cardId = findViewById(R.id.cardId); @@ -113,8 +115,9 @@ public class BarcodeSelectorActivity extends AppCompatActivity // Update barcodes for(String key : barcodeViewMap.keySet()) { - ImageView image = findViewById(barcodeViewMap.get(key)); - createBarcodeOption(image, key, s.toString()); + ImageView image = findViewById(barcodeViewMap.get(key).first); + TextView text = findViewById(barcodeViewMap.get(key).second); + createBarcodeOption(image, key, s.toString(), text); } View noBarcodeButtonView = findViewById(R.id.noBarcode); @@ -153,7 +156,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity }); } - private void createBarcodeOption(final ImageView image, final String formatType, final String cardId) + private void createBarcodeOption(final ImageView image, final String formatType, final String cardId, final TextView text) { final BarcodeFormat format = BarcodeFormat.valueOf(formatType); if(format == null) @@ -198,7 +201,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity } Log.d(TAG, "Generating barcode for type " + formatType); - BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format); + BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format, text); barcodeGeneratorTasks.add(task); task.execute(); } @@ -207,7 +210,7 @@ public class BarcodeSelectorActivity extends AppCompatActivity else { Log.d(TAG, "Generating barcode for type " + formatType); - BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format); + BarcodeImageWriterTask task = new BarcodeImageWriterTask(image, cardId, format, text); barcodeGeneratorTasks.add(task); task.execute(); } diff --git a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java index 2917d703d..212f435a7 100644 --- a/app/src/main/java/protect/card_locker/CardShortcutConfigure.java +++ b/app/src/main/java/protect/card_locker/CardShortcutConfigure.java @@ -17,7 +17,7 @@ import android.widget.Toast; */ public class CardShortcutConfigure extends AppCompatActivity { - static final String TAG = "LoyaltyCardLocker"; + static final String TAG = "Catima"; @Override public void onCreate(Bundle bundle) diff --git a/app/src/main/java/protect/card_locker/DBHelper.java b/app/src/main/java/protect/card_locker/DBHelper.java index f84471342..1a9eae595 100644 --- a/app/src/main/java/protect/card_locker/DBHelper.java +++ b/app/src/main/java/protect/card_locker/DBHelper.java @@ -17,7 +17,7 @@ import java.nio.ByteBuffer; public class DBHelper extends SQLiteOpenHelper { - public static final String DATABASE_NAME = "LoyaltyCards.db"; + public static final String DATABASE_NAME = "Catima.db"; public static final int ORIGINAL_DATABASE_VERSION = 1; public static final int DATABASE_VERSION = 4; diff --git a/app/src/main/java/protect/card_locker/ImportExportActivity.java b/app/src/main/java/protect/card_locker/ImportExportActivity.java index bbd4eba9a..73ea4d19e 100644 --- a/app/src/main/java/protect/card_locker/ImportExportActivity.java +++ b/app/src/main/java/protect/card_locker/ImportExportActivity.java @@ -10,15 +10,14 @@ import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; -import android.os.Environment; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; -import androidx.core.content.FileProvider; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; + import android.util.Log; import android.view.MenuItem; import android.view.View; @@ -28,21 +27,21 @@ import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.InputStream; +import java.io.OutputStream; import java.util.List; public class ImportExportActivity extends AppCompatActivity { - private static final String TAG = "LoyaltyCardLocker"; + private static final String TAG = "Catima"; private static final int PERMISSIONS_EXTERNAL_STORAGE = 1; - private static final int CHOOSE_EXPORT_FILE = 2; + private static final int CHOOSE_EXPORT_LOCATION = 2; + private static final int CHOOSE_EXPORTED_FILE = 3; private ImportExportTask importExporter; - private final File sdcardDir = Environment.getExternalStorageDirectory(); - private final File exportFile = new File(sdcardDir, "LoyaltyCardKeychain.csv"); - @Override protected void onCreate(Bundle savedInstanceState) { @@ -70,6 +69,11 @@ public class ImportExportActivity extends AppCompatActivity PERMISSIONS_EXTERNAL_STORAGE); } + // Check that there is a file manager available + final Intent intentCreateDocumentAction = new Intent(Intent.ACTION_CREATE_DOCUMENT); + intentCreateDocumentAction.addCategory(Intent.CATEGORY_OPENABLE); + intentCreateDocumentAction.setType("text/csv"); + intentCreateDocumentAction.putExtra(Intent.EXTRA_TITLE, "Catima.csv"); Button exportButton = findViewById(R.id.exportButton); exportButton.setOnClickListener(new View.OnClickListener() @@ -77,7 +81,7 @@ public class ImportExportActivity extends AppCompatActivity @Override public void onClick(View v) { - startExport(); + chooseFileWithIntent(intentCreateDocumentAction, CHOOSE_EXPORT_LOCATION); } }); @@ -86,14 +90,13 @@ public class ImportExportActivity extends AppCompatActivity intentGetContentAction.addCategory(Intent.CATEGORY_OPENABLE); intentGetContentAction.setType("*/*"); - Button importFilesystem = findViewById(R.id.importOptionFilesystemButton); importFilesystem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - chooseFileWithIntent(intentGetContentAction); + chooseFileWithIntent(intentGetContentAction, CHOOSE_EXPORTED_FILE); } }); @@ -114,7 +117,7 @@ public class ImportExportActivity extends AppCompatActivity @Override public void onClick(View v) { - chooseFileWithIntent(intentPickAction); + chooseFileWithIntent(intentPickAction, CHOOSE_EXPORTED_FILE); } }); @@ -125,28 +128,6 @@ public class ImportExportActivity extends AppCompatActivity findViewById(R.id.importOptionApplicationExplanation).setVisibility(View.GONE); importApplication.setVisibility(View.GONE); } - - // This option, to import from the fixed location, should always be present - - Button importButton = findViewById(R.id.importOptionFixedButton); - importButton.setOnClickListener(new View.OnClickListener() - { - @Override - public void onClick(View v) - { - Uri uri = Uri.fromFile(exportFile); - try - { - FileInputStream stream = new FileInputStream(exportFile); - startImport(stream, uri); - } - catch(FileNotFoundException e) - { - Log.e(TAG, "Could not import file " + exportFile.getAbsolutePath(), e); - onImportComplete(false, uri); - } - } - }); } private void startImport(final InputStream target, final Uri targetUri) @@ -165,19 +146,19 @@ public class ImportExportActivity extends AppCompatActivity importExporter.execute(); } - private void startExport() + private void startExport(final OutputStream target, final Uri targetUri) { ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() { @Override public void onTaskComplete(boolean success) { - onExportComplete(success, exportFile); + onExportComplete(success, targetUri); } }; importExporter = new ImportExportTask(ImportExportActivity.this, - DataFormat.CSV, exportFile, listener); + DataFormat.CSV, target, listener); importExporter.execute(); } @@ -245,13 +226,9 @@ public class ImportExportActivity extends AppCompatActivity builder.setTitle(R.string.importFailedTitle); } - int messageId = success ? R.string.importedFrom : R.string.importFailed; - final String template = getResources().getString(messageId); + int messageId = success ? R.string.importSuccessful : R.string.importFailed; + final String message = getResources().getString(messageId); - // Get the filename of the file being imported - String filename = path.toString(); - - final String message = String.format(template, filename); builder.setMessage(message); builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { @@ -265,7 +242,7 @@ public class ImportExportActivity extends AppCompatActivity builder.create().show(); } - private void onExportComplete(boolean success, final File path) + private void onExportComplete(boolean success, final Uri path) { AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -278,10 +255,9 @@ public class ImportExportActivity extends AppCompatActivity builder.setTitle(R.string.exportFailedTitle); } - int messageId = success ? R.string.exportedTo : R.string.exportFailed; + int messageId = success ? R.string.exportSuccessful : R.string.exportFailed; + final String message = getResources().getString(messageId); - final String template = getResources().getString(messageId); - final String message = String.format(template, path.getAbsolutePath()); builder.setMessage(message); builder.setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { @@ -301,9 +277,8 @@ public class ImportExportActivity extends AppCompatActivity @Override public void onClick(DialogInterface dialog, int which) { - Uri outputUri = FileProvider.getUriForFile(ImportExportActivity.this, BuildConfig.APPLICATION_ID, path); Intent sendIntent = new Intent(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_STREAM, outputUri); + sendIntent.putExtra(Intent.EXTRA_STREAM, path); sendIntent.setType("text/csv"); // set flag to give temporary permission to external app to use the FileProvider @@ -345,11 +320,11 @@ public class ImportExportActivity extends AppCompatActivity return false; } - private void chooseFileWithIntent(Intent intent) + private void chooseFileWithIntent(Intent intent, int requestCode) { try { - startActivityForResult(intent, CHOOSE_EXPORT_FILE); + startActivityForResult(intent, requestCode); } catch (ActivityNotFoundException e) { @@ -362,7 +337,7 @@ public class ImportExportActivity extends AppCompatActivity { super.onActivityResult(requestCode, resultCode, data); - if (resultCode != RESULT_OK || requestCode != CHOOSE_EXPORT_FILE) + if (resultCode != RESULT_OK || (requestCode != CHOOSE_EXPORT_LOCATION && requestCode != CHOOSE_EXPORTED_FILE)) { Log.w(TAG, "Failed onActivityResult(), result=" + resultCode); return; @@ -377,24 +352,48 @@ public class ImportExportActivity extends AppCompatActivity try { - InputStream reader; - - if(uri.getScheme() != null) + if (requestCode == CHOOSE_EXPORT_LOCATION) { - reader = getContentResolver().openInputStream(uri); + OutputStream writer; + if (uri.getScheme() != null) + { + writer = getContentResolver().openOutputStream(uri); + } + else + { + writer = new FileOutputStream(new File(uri.toString())); + } + + Log.e(TAG, "Starting file export with: " + uri.toString()); + startExport(writer, uri); } else { - reader = new FileInputStream(new File(uri.toString())); - } + InputStream reader; + if(uri.getScheme() != null) + { + reader = getContentResolver().openInputStream(uri); + } + else + { + reader = new FileInputStream(new File(uri.toString())); + } - Log.e(TAG, "Starting file import with: " + uri.toString()); - startImport(reader, uri); + Log.e(TAG, "Starting file export with: " + uri.toString()); + startImport(reader, uri); + } } catch(FileNotFoundException e) { - Log.e(TAG, "Failed to import file: " + uri.toString(), e); - onImportComplete(false, uri); + Log.e(TAG, "Failed to import/export file: " + uri.toString(), e); + if (requestCode == CHOOSE_EXPORT_LOCATION) + { + onExportComplete(false, uri); + } + else + { + onImportComplete(false, uri); + } } } } \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/ImportExportTask.java b/app/src/main/java/protect/card_locker/ImportExportTask.java index 839e7c36d..8537fbe99 100644 --- a/app/src/main/java/protect/card_locker/ImportExportTask.java +++ b/app/src/main/java/protect/card_locker/ImportExportTask.java @@ -4,27 +4,23 @@ import android.app.Activity; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.AsyncTask; -import android.os.Environment; import android.util.Log; -import android.widget.Toast; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; class ImportExportTask extends AsyncTask { - private static final String TAG = "LoyaltyCardLocker"; + private static final String TAG = "Catima"; private Activity activity; private boolean doImport; private DataFormat format; - private File target; + private OutputStream outputStream; private InputStream inputStream; private TaskCompleteListener listener; @@ -33,14 +29,14 @@ class ImportExportTask extends AsyncTask /** * Constructor which will setup a task for exporting to the given file */ - ImportExportTask(Activity activity, DataFormat format, File target, + ImportExportTask(Activity activity, DataFormat format, OutputStream output, TaskCompleteListener listener) { super(); this.activity = activity; this.doImport = false; this.format = format; - this.target = target; + this.outputStream = output; this.listener = listener; } @@ -78,14 +74,13 @@ class ImportExportTask extends AsyncTask return result; } - private boolean performExport(File exportFile, DBHelper db) + private boolean performExport(OutputStream stream, DBHelper db) { boolean result = false; try { - FileOutputStream fileWriter = new FileOutputStream(exportFile); - OutputStreamWriter writer = new OutputStreamWriter(fileWriter, Charset.forName("UTF-8")); + OutputStreamWriter writer = new OutputStreamWriter(stream, Charset.forName("UTF-8")); result = MultiFormatExporter.exportData(db, writer, format); writer.close(); } @@ -94,7 +89,7 @@ class ImportExportTask extends AsyncTask Log.e(TAG, "Unable to export file", e); } - Log.i(TAG, "Export of '" + exportFile.getAbsolutePath() + "' result: " + result); + Log.i(TAG, "Export result: " + result); return result; } @@ -127,7 +122,7 @@ class ImportExportTask extends AsyncTask } else { - result = performExport(target, db); + result = performExport(outputStream, db); } return result; diff --git a/app/src/main/java/protect/card_locker/ImportURIHelper.java b/app/src/main/java/protect/card_locker/ImportURIHelper.java index f513a55ac..53ec4c081 100644 --- a/app/src/main/java/protect/card_locker/ImportURIHelper.java +++ b/app/src/main/java/protect/card_locker/ImportURIHelper.java @@ -24,17 +24,21 @@ public class ImportURIHelper { private final Context context; private final String host; private final String path; + private final String oldHost; + private final String oldPath; private final String shareText; public ImportURIHelper(Context context) { this.context = context; host = context.getResources().getString(R.string.intent_import_card_from_url_host); path = context.getResources().getString(R.string.intent_import_card_from_url_path_prefix); + oldHost = context.getResources().getString(R.string.intent_import_card_from_url_host_old); + oldPath = context.getResources().getString(R.string.intent_import_card_from_url_path_prefix_old); shareText = context.getResources().getString(R.string.intent_import_card_from_url_share_text); } public boolean isImportUri(Uri uri) { - return uri.getHost().equals(host) && uri.getPath().equals(path); + return (uri.getHost().equals(host) && uri.getPath().equals(path)) || (uri.getHost().equals(oldHost) && uri.getPath().equals(oldPath)); } public LoyaltyCard parse(Uri uri) throws InvalidObjectException { @@ -64,12 +68,19 @@ public class ImportURIHelper { String iconData = uri.getQueryParameter(ICON); Bitmap icon = null; - if(!iconData.isEmpty()) + if(iconData != null && !iconData.isEmpty()) { byte[] iconBytes = Base64.decode(iconData, Base64.URL_SAFE); icon = DBHelper.convertBitmapBlobToBitmap(iconBytes); } - ExtrasHelper extras = new ExtrasHelper().fromJSON(new JSONObject(uri.getQueryParameter(EXTRAS))); + + String extrasData = uri.getQueryParameter(EXTRAS); + ExtrasHelper extras = new ExtrasHelper(); + if(extrasData != null && !extrasData.isEmpty()) + { + extras.fromJSON(new JSONObject(uri.getQueryParameter(EXTRAS))); + } + return new LoyaltyCard(-1, store, note, cardId, barcodeType, headerColor, headerTextColor, icon, extras); } catch (NullPointerException | NumberFormatException | JSONException ex) { throw new InvalidObjectException("Not a valid import URI"); diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java index c72045a15..54edd74e3 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardEditActivity.java @@ -9,6 +9,8 @@ import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Bundle; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; @@ -39,7 +41,7 @@ import java.io.InvalidObjectException; public class LoyaltyCardEditActivity extends AppCompatActivity { - private static final String TAG = "CardLocker"; + private static final String TAG = "Catima"; protected static final String NO_BARCODE = "_NO_BARCODE_"; protected static final int SELECT_BARCODE_REQUEST = 1; @@ -140,7 +142,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity cardIdFieldView = findViewById(R.id.cardIdView); cardIdDivider = findViewById(R.id.cardIdDivider); cardIdTableRow = findViewById(R.id.cardIdTableRow); - barcodeTypeField = findViewById(R.id.barcodeType); + barcodeTypeField = findViewById(R.id.barcodeTypeView); barcodeImage = findViewById(R.id.barcode); barcodeImageLayout = findViewById(R.id.barcodeLayout); barcodeCaptureLayout = findViewById(R.id.barcodeCaptureLayout); @@ -199,7 +201,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity if(barcodeTypeField.getText().length() == 0) { - barcodeTypeField.setText(loyaltyCard.barcodeType); + barcodeTypeField.setText(loyaltyCard.barcodeType.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : loyaltyCard.barcodeType); } if(headingColorValue == null) @@ -248,6 +250,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity else { setTitle(R.string.addCardTitle); + hideBarcode(); } if(headingColorValue == null) @@ -270,9 +273,9 @@ public class LoyaltyCardEditActivity extends AppCompatActivity if(cardIdFieldView.getText().length() > 0 && barcodeTypeField.getText().length() > 0) { - if(barcodeTypeField.getText().equals(NO_BARCODE)) + if(barcodeTypeField.getText().toString().equals(NO_BARCODE)) { - barcodeImageLayout.setVisibility(View.GONE); + hideBarcode(); } else { @@ -311,7 +314,7 @@ public class LoyaltyCardEditActivity extends AppCompatActivity new BarcodeImageWriterTask(barcodeImage, cardIdString, format).execute(); } - barcodeImageLayout.setVisibility(View.VISIBLE); + showBarcode(); } } @@ -363,6 +366,18 @@ public class LoyaltyCardEditActivity extends AppCompatActivity cardIdTableRow.setVisibility(View.GONE); enterButton.setText(R.string.enterCard); } + + FloatingActionButton saveButton = findViewById(R.id.fabSave); + saveButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + try { + doSave(); + } catch (JSONException ex) { + Toast.makeText(getApplicationContext(), R.string.failedSavingCard, Toast.LENGTH_LONG).show(); + } + } + }); } class ColorSelectListener implements View.OnClickListener @@ -504,17 +519,6 @@ public class LoyaltyCardEditActivity extends AppCompatActivity dialog.show(); return true; - - case R.id.action_save: - try { - doSave(); - } - catch (JSONException ex) - { - Toast.makeText(this, R.string.failedSavingCard, Toast.LENGTH_LONG).show(); - return false; - } - return true; } return super.onOptionsItemSelected(item); @@ -554,10 +558,21 @@ public class LoyaltyCardEditActivity extends AppCompatActivity TextView cardIdView = findViewById(R.id.cardIdView); cardIdView.setText(contents); - final TextView barcodeTypeField = findViewById(R.id.barcodeType); // Set special NO_BARCODE value to prevent onResume from overwriting it barcodeTypeField.setText(format.isEmpty() ? LoyaltyCardEditActivity.NO_BARCODE : format); onResume(); } } + + private void showBarcode() { + barcodeImageLayout.setVisibility(View.VISIBLE); + findViewById(R.id.barcodeTypeDivider).setVisibility(View.VISIBLE); + findViewById(R.id.barcodeTypeTableRow).setVisibility(View.VISIBLE); + } + + private void hideBarcode() { + barcodeImageLayout.setVisibility(View.GONE); + findViewById(R.id.barcodeTypeDivider).setVisibility(View.GONE); + findViewById(R.id.barcodeTypeTableRow).setVisibility(View.GONE); + } } diff --git a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java index d64b5f2e7..4250b1fd4 100644 --- a/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java +++ b/app/src/main/java/protect/card_locker/LoyaltyCardViewActivity.java @@ -31,6 +31,7 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.zxing.BarcodeFormat; import org.json.JSONException; @@ -44,7 +45,7 @@ import protect.card_locker.preferences.Settings; public class LoyaltyCardViewActivity extends AppCompatActivity { - private static final String TAG = "CardLocker"; + private static final String TAG = "Catima"; private static final double LUMINANCE_MIDPOINT = 0.5; TextView cardIdFieldView; @@ -282,6 +283,20 @@ public class LoyaltyCardViewActivity extends AppCompatActivity { findViewById(R.id.barcode).setVisibility(View.GONE); } + + FloatingActionButton editButton = findViewById(R.id.fabEdit); + editButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); + Bundle bundle = new Bundle(); + bundle.putInt("id", loyaltyCardId); + bundle.putBoolean("update", true); + intent.putExtras(bundle); + startActivity(intent); + finish(); + } + }); } @Override @@ -318,7 +333,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity } menu.findItem(R.id.action_share).setIcon(getIcon(R.drawable.ic_share_white, backgroundNeedsDarkIcons)); - menu.findItem(R.id.action_edit).setIcon(getIcon(R.drawable.ic_mode_edit_white_24dp, backgroundNeedsDarkIcons)); return super.onCreateOptionsMenu(menu); } @@ -338,16 +352,6 @@ public class LoyaltyCardViewActivity extends AppCompatActivity importURIHelper.startShareIntent(loyaltyCard); return true; - case R.id.action_edit: - Intent intent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); - Bundle bundle = new Bundle(); - bundle.putInt("id", loyaltyCardId); - bundle.putBoolean("update", true); - intent.putExtras(bundle); - startActivity(intent); - finish(); - return true; - case R.id.action_lock_unlock: if(rotationEnabled) { @@ -455,6 +459,9 @@ public class LoyaltyCardViewActivity extends AppCompatActivity // Move barcode to top barcodeImage.setScaleType(ImageView.ScaleType.FIT_START); + // Prevent centering + barcodeImage.setAdjustViewBounds(false); + // Set current state barcodeIsFullscreen = true; } @@ -479,6 +486,9 @@ public class LoyaltyCardViewActivity extends AppCompatActivity // Turn barcode back to normal barcodeImage.setLayoutParams(barcodeImageState); + // Fix barcode centering + barcodeImage.setAdjustViewBounds(true); + // Set current state barcodeIsFullscreen = false; } diff --git a/app/src/main/java/protect/card_locker/MainActivity.java b/app/src/main/java/protect/card_locker/MainActivity.java index 60d702063..3e24abd87 100644 --- a/app/src/main/java/protect/card_locker/MainActivity.java +++ b/app/src/main/java/protect/card_locker/MainActivity.java @@ -28,17 +28,17 @@ import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.common.collect.ImmutableMap; import java.util.Calendar; import java.util.Map; -import protect.card_locker.intro.IntroActivity; import protect.card_locker.preferences.SettingsActivity; public class MainActivity extends AppCompatActivity { - private static final String TAG = "LoyaltyCardLocker"; + private static final String TAG = "Catima"; private static final int MAIN_REQUEST_CODE = 1; private Menu menu; @@ -53,12 +53,6 @@ public class MainActivity extends AppCompatActivity setSupportActionBar(toolbar); updateLoyaltyCardList(""); - - SharedPreferences prefs = getSharedPreferences("protect.card_locker", MODE_PRIVATE); - if (prefs.getBoolean("firstrun", true)) { - startIntro(); - prefs.edit().putBoolean("firstrun", false).commit(); - } } @Override @@ -75,6 +69,15 @@ public class MainActivity extends AppCompatActivity } updateLoyaltyCardList(filter); + + FloatingActionButton addButton = findViewById(R.id.fabAdd); + addButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent i = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); + startActivityForResult(i, MAIN_REQUEST_CODE); + } + }); } @Override @@ -261,13 +264,6 @@ public class MainActivity extends AppCompatActivity { int id = item.getItemId(); - if (id == R.id.action_add) - { - Intent i = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class); - startActivityForResult(i, MAIN_REQUEST_CODE); - return true; - } - if(id == R.id.action_import_export) { Intent i = new Intent(getApplicationContext(), ImportExportActivity.class); @@ -282,12 +278,6 @@ public class MainActivity extends AppCompatActivity return true; } - if(id == R.id.action_intro) - { - startIntro(); - return true; - } - if(id == R.id.action_about) { displayAboutDialog(); @@ -356,7 +346,6 @@ public class MainActivity extends AppCompatActivity String html = "" + css + - "\""" + "

" + String.format(getString(R.string.about_title_fmt), "" + @@ -369,10 +358,12 @@ public class MainActivity extends AppCompatActivity "

" + String.format(getString(R.string.app_revision_fmt), "" + - getString(R.string.app_revision_url) + + "GitHub" + "") + "


" + String.format(getString(R.string.app_copyright_fmt), year) + + "

" + + getString(R.string.app_copyright_old) + "


" + getString(R.string.app_license) + "


" + @@ -393,10 +384,4 @@ public class MainActivity extends AppCompatActivity }) .show(); } - - private void startIntro() - { - Intent intent = new Intent(this, IntroActivity.class); - startActivityForResult(intent, MAIN_REQUEST_CODE); - } -} +} \ No newline at end of file diff --git a/app/src/main/java/protect/card_locker/MultiFormatExporter.java b/app/src/main/java/protect/card_locker/MultiFormatExporter.java index 68b01e761..5298e2ad7 100644 --- a/app/src/main/java/protect/card_locker/MultiFormatExporter.java +++ b/app/src/main/java/protect/card_locker/MultiFormatExporter.java @@ -7,7 +7,7 @@ import java.io.OutputStreamWriter; public class MultiFormatExporter { - private static final String TAG = "LoyaltyCardLocker"; + private static final String TAG = "Catima"; /** * Attempts to export data to the output stream in the diff --git a/app/src/main/java/protect/card_locker/MultiFormatImporter.java b/app/src/main/java/protect/card_locker/MultiFormatImporter.java index 3d5593868..a4ab4c83c 100644 --- a/app/src/main/java/protect/card_locker/MultiFormatImporter.java +++ b/app/src/main/java/protect/card_locker/MultiFormatImporter.java @@ -7,7 +7,7 @@ import java.io.InputStreamReader; public class MultiFormatImporter { - private static final String TAG = "LoyaltyCardLocker"; + private static final String TAG = "Catima"; /** * Attempts to import data from the input stream of the diff --git a/app/src/main/java/protect/card_locker/intro/IntroActivity.java b/app/src/main/java/protect/card_locker/intro/IntroActivity.java deleted file mode 100644 index 37a699ed8..000000000 --- a/app/src/main/java/protect/card_locker/intro/IntroActivity.java +++ /dev/null @@ -1,33 +0,0 @@ -package protect.card_locker.intro; - -import android.os.Bundle; -import androidx.fragment.app.Fragment; - -import com.github.paolorotolo.appintro.AppIntro; - - -public class IntroActivity extends AppIntro -{ - @Override - public void init(Bundle savedInstanceState) - { - addSlide(new IntroSlide1()); - addSlide(new IntroSlide2()); - addSlide(new IntroSlide3()); - addSlide(new IntroSlide4()); - addSlide(new IntroSlide5()); - addSlide(new IntroSlide6()); - } - - @Override - public void onSkipPressed(Fragment fragment) { - finish(); - } - - @Override - public void onDonePressed(Fragment fragment) { - finish(); - } -} - - diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide1.java b/app/src/main/java/protect/card_locker/intro/IntroSlide1.java deleted file mode 100644 index beecb43c3..000000000 --- a/app/src/main/java/protect/card_locker/intro/IntroSlide1.java +++ /dev/null @@ -1,19 +0,0 @@ -package protect.card_locker.intro; - -import android.os.Bundle; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import protect.card_locker.R; - -public class IntroSlide1 extends Fragment -{ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - View v = inflater.inflate(R.layout.intro1_layout, container, false); - return v; - } -} diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide2.java b/app/src/main/java/protect/card_locker/intro/IntroSlide2.java deleted file mode 100644 index a1e652c51..000000000 --- a/app/src/main/java/protect/card_locker/intro/IntroSlide2.java +++ /dev/null @@ -1,20 +0,0 @@ -package protect.card_locker.intro; - -import android.os.Bundle; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import protect.card_locker.R; - -public class IntroSlide2 extends Fragment -{ - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - View v = inflater.inflate(R.layout.intro2_layout, container, false); - return v; - } -} diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide3.java b/app/src/main/java/protect/card_locker/intro/IntroSlide3.java deleted file mode 100644 index 5acc83e7b..000000000 --- a/app/src/main/java/protect/card_locker/intro/IntroSlide3.java +++ /dev/null @@ -1,19 +0,0 @@ -package protect.card_locker.intro; - -import android.os.Bundle; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import protect.card_locker.R; - -public class IntroSlide3 extends Fragment -{ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - View v = inflater.inflate(R.layout.intro3_layout, container, false); - return v; - } -} diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide4.java b/app/src/main/java/protect/card_locker/intro/IntroSlide4.java deleted file mode 100644 index 1a7ad6e69..000000000 --- a/app/src/main/java/protect/card_locker/intro/IntroSlide4.java +++ /dev/null @@ -1,19 +0,0 @@ -package protect.card_locker.intro; - -import android.os.Bundle; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import protect.card_locker.R; - -public class IntroSlide4 extends Fragment -{ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - View v = inflater.inflate(R.layout.intro4_layout, container, false); - return v; - } -} diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide5.java b/app/src/main/java/protect/card_locker/intro/IntroSlide5.java deleted file mode 100644 index ab3b5b757..000000000 --- a/app/src/main/java/protect/card_locker/intro/IntroSlide5.java +++ /dev/null @@ -1,19 +0,0 @@ -package protect.card_locker.intro; - -import android.os.Bundle; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import protect.card_locker.R; - -public class IntroSlide5 extends Fragment -{ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - View v = inflater.inflate(R.layout.intro5_layout, container, false); - return v; - } -} diff --git a/app/src/main/java/protect/card_locker/intro/IntroSlide6.java b/app/src/main/java/protect/card_locker/intro/IntroSlide6.java deleted file mode 100644 index 217967844..000000000 --- a/app/src/main/java/protect/card_locker/intro/IntroSlide6.java +++ /dev/null @@ -1,19 +0,0 @@ -package protect.card_locker.intro; - -import android.os.Bundle; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import protect.card_locker.R; - -public class IntroSlide6 extends Fragment -{ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - View v = inflater.inflate(R.layout.intro6_layout, container, false); - return v; - } -} diff --git a/app/src/main/res/drawable-hdpi/app_icon_intro.png b/app/src/main/res/drawable-hdpi/app_icon_intro.png deleted file mode 100755 index 11c0465c6..000000000 Binary files a/app/src/main/res/drawable-hdpi/app_icon_intro.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/intro2_image.png b/app/src/main/res/drawable-hdpi/intro2_image.png deleted file mode 100644 index 6a718057d..000000000 Binary files a/app/src/main/res/drawable-hdpi/intro2_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/intro3_image.png b/app/src/main/res/drawable-hdpi/intro3_image.png deleted file mode 100644 index 529e99c12..000000000 Binary files a/app/src/main/res/drawable-hdpi/intro3_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/intro4_image.png b/app/src/main/res/drawable-hdpi/intro4_image.png deleted file mode 100644 index d81adbf47..000000000 Binary files a/app/src/main/res/drawable-hdpi/intro4_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/intro5_image.png b/app/src/main/res/drawable-hdpi/intro5_image.png deleted file mode 100644 index b508ce888..000000000 Binary files a/app/src/main/res/drawable-hdpi/intro5_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/app_icon_intro.png b/app/src/main/res/drawable-mdpi/app_icon_intro.png deleted file mode 100755 index 1336339d8..000000000 Binary files a/app/src/main/res/drawable-mdpi/app_icon_intro.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/intro2_image.png b/app/src/main/res/drawable-mdpi/intro2_image.png deleted file mode 100644 index ec3dd8c9f..000000000 Binary files a/app/src/main/res/drawable-mdpi/intro2_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/intro3_image.png b/app/src/main/res/drawable-mdpi/intro3_image.png deleted file mode 100644 index 69b1136ce..000000000 Binary files a/app/src/main/res/drawable-mdpi/intro3_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/intro4_image.png b/app/src/main/res/drawable-mdpi/intro4_image.png deleted file mode 100644 index 48094b799..000000000 Binary files a/app/src/main/res/drawable-mdpi/intro4_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/intro5_image.png b/app/src/main/res/drawable-mdpi/intro5_image.png deleted file mode 100644 index 561de1d24..000000000 Binary files a/app/src/main/res/drawable-mdpi/intro5_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/app_icon_intro.png b/app/src/main/res/drawable-xhdpi/app_icon_intro.png deleted file mode 100755 index 21b1cbdcf..000000000 Binary files a/app/src/main/res/drawable-xhdpi/app_icon_intro.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/intro2_image.png b/app/src/main/res/drawable-xhdpi/intro2_image.png deleted file mode 100644 index 3fc205679..000000000 Binary files a/app/src/main/res/drawable-xhdpi/intro2_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/intro3_image.png b/app/src/main/res/drawable-xhdpi/intro3_image.png deleted file mode 100644 index 452ff2232..000000000 Binary files a/app/src/main/res/drawable-xhdpi/intro3_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/intro4_image.png b/app/src/main/res/drawable-xhdpi/intro4_image.png deleted file mode 100644 index 0f6bb3c49..000000000 Binary files a/app/src/main/res/drawable-xhdpi/intro4_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/intro5_image.png b/app/src/main/res/drawable-xhdpi/intro5_image.png deleted file mode 100644 index e5424a264..000000000 Binary files a/app/src/main/res/drawable-xhdpi/intro5_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/app_icon_intro.png b/app/src/main/res/drawable-xxhdpi/app_icon_intro.png deleted file mode 100755 index 37d6ee852..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/app_icon_intro.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/intro2_image.png b/app/src/main/res/drawable-xxhdpi/intro2_image.png deleted file mode 100644 index 4d007849b..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/intro2_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/intro3_image.png b/app/src/main/res/drawable-xxhdpi/intro3_image.png deleted file mode 100644 index d96045d4c..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/intro3_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/intro4_image.png b/app/src/main/res/drawable-xxhdpi/intro4_image.png deleted file mode 100644 index 52addc5b8..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/intro4_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/intro5_image.png b/app/src/main/res/drawable-xxhdpi/intro5_image.png deleted file mode 100644 index 9907b40c9..000000000 Binary files a/app/src/main/res/drawable-xxhdpi/intro5_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/app_icon_intro.png b/app/src/main/res/drawable-xxxhdpi/app_icon_intro.png deleted file mode 100755 index 9385319fb..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/app_icon_intro.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/intro2_image.png b/app/src/main/res/drawable-xxxhdpi/intro2_image.png deleted file mode 100644 index 0380b6056..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/intro2_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/intro3_image.png b/app/src/main/res/drawable-xxxhdpi/intro3_image.png deleted file mode 100644 index 1bfcde5e2..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/intro3_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/intro4_image.png b/app/src/main/res/drawable-xxxhdpi/intro4_image.png deleted file mode 100644 index 3dbaed62d..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/intro4_image.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/intro5_image.png b/app/src/main/res/drawable-xxxhdpi/intro5_image.png deleted file mode 100644 index 2a929fec2..000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/intro5_image.png and /dev/null differ diff --git a/app/src/main/res/layout/barcode_selector_activity.xml b/app/src/main/res/layout/barcode_selector_activity.xml index 8edd3374f..4e164d389 100644 --- a/app/src/main/res/layout/barcode_selector_activity.xml +++ b/app/src/main/res/layout/barcode_selector_activity.xml @@ -70,137 +70,236 @@ android:layout_height="wrap_content" android:text="@string/barcodeNoBarcode" android:enabled="false" /> - + - + - + - + - + - + - + - + - + - + - + diff --git a/app/src/main/res/layout/import_export_activity.xml b/app/src/main/res/layout/import_export_activity.xml index 464b3657e..5d4d7fdf5 100644 --- a/app/src/main/res/layout/import_export_activity.xml +++ b/app/src/main/res/layout/import_export_activity.xml @@ -99,7 +99,6 @@ android:layout_marginTop="8dp" android:text="@string/importOptionFilesystemButton" /> - - - - - - - - -