diff --git a/.travis.yml b/.travis.yml
index 544e9295..fda62a81 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,10 +9,10 @@ android:
components:
- tools
- tools
- - android-25
+ - android-26
- android-22
- sys-img-armeabi-v7a-android-22
- - build-tools-25.0.2
+ - build-tools-26.0.2
- platform-tools
- extra-android-support
- extra-android-m2repository
diff --git a/SampleApp/build.gradle b/SampleApp/build.gradle
index 01d4c570..ba4f95fb 100644
--- a/SampleApp/build.gradle
+++ b/SampleApp/build.gradle
@@ -3,7 +3,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.0'
+ classpath 'com.android.tools.build:gradle:3.0.0'
}
}
@@ -17,13 +17,13 @@ repositories {
apply plugin: 'com.android.application'
android {
- compileSdkVersion 25
- buildToolsVersion "25.0.2"
+ compileSdkVersion 26
+ buildToolsVersion "26.0.2"
defaultConfig {
applicationId "io.card.development"
minSdkVersion 18
- targetSdkVersion 25
+ targetSdkVersion 26
versionCode 1
versionName "1.0.0"
testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
diff --git a/SampleApp/src/main/java/io/card/development/SampleActivity.java b/SampleApp/src/main/java/io/card/development/SampleActivity.java
index ac3a5120..0e457985 100644
--- a/SampleApp/src/main/java/io/card/development/SampleActivity.java
+++ b/SampleApp/src/main/java/io/card/development/SampleActivity.java
@@ -30,7 +30,6 @@
import io.card.payment.i18n.locales.LocalizedStringsList;
public class SampleActivity extends Activity {
-
protected static final String TAG = SampleActivity.class.getSimpleName();
private static final int REQUEST_SCAN = 100;
@@ -56,6 +55,7 @@ public class SampleActivity extends Activity {
private CheckBox mUseCardIOLogoToggle;
private CheckBox mShowPayPalActionBarIconToggle;
private CheckBox mKeepApplicationThemeToggle;
+ private CheckBox mHideTorchButtonToggle;
private Spinner mLanguageSpinner;
private EditText mUnblurEdit;
@@ -64,32 +64,29 @@ public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample_activity);
- mManualToggle = (CheckBox) findViewById(R.id.force_manual);
- mEnableExpiryToggle = (CheckBox) findViewById(R.id.gather_expiry);
- mScanExpiryToggle = (CheckBox) findViewById(R.id.scan_expiry);
- mCvvToggle = (CheckBox) findViewById(R.id.gather_cvv);
- mPostalCodeToggle = (CheckBox) findViewById(R.id.gather_postal_code);
- mPostalCodeNumericOnlyToggle = (CheckBox) findViewById(R.id.postal_code_numeric_only);
- mCardholderNameToggle = (CheckBox) findViewById(R.id.gather_cardholder_name);
- mSuppressManualToggle = (CheckBox) findViewById(R.id.suppress_manual);
- mSuppressConfirmationToggle = (CheckBox) findViewById(R.id.suppress_confirmation);
- mSuppressScanToggle = (CheckBox) findViewById(R.id.detect_only);
-
- mUseCardIOLogoToggle = (CheckBox) findViewById(R.id.use_card_io_logo);
- mShowPayPalActionBarIconToggle = (CheckBox) findViewById(R.id.show_paypal_action_bar_icon);
- mKeepApplicationThemeToggle = (CheckBox) findViewById(R.id.keep_application_theme);
-
- mLanguageSpinner = (Spinner) findViewById(R.id.language);
- mUnblurEdit = (EditText) findViewById(R.id.unblur);
-
- mResultLabel = (TextView) findViewById(R.id.result);
- mResultImage = (ImageView) findViewById(R.id.result_image);
- mResultCardTypeImage = (ImageView) findViewById(R.id.result_card_type_image);
-
- TextView version = (TextView) findViewById(R.id.version);
+ mManualToggle = findViewById(R.id.force_manual);
+ mEnableExpiryToggle = findViewById(R.id.gather_expiry);
+ mScanExpiryToggle = findViewById(R.id.scan_expiry);
+ mCvvToggle = findViewById(R.id.gather_cvv);
+ mPostalCodeToggle = findViewById(R.id.gather_postal_code);
+ mPostalCodeNumericOnlyToggle = findViewById(R.id.postal_code_numeric_only);
+ mCardholderNameToggle = findViewById(R.id.gather_cardholder_name);
+ mSuppressManualToggle = findViewById(R.id.suppress_manual);
+ mSuppressConfirmationToggle = findViewById(R.id.suppress_confirmation);
+ mSuppressScanToggle = findViewById(R.id.detect_only);
+ mUseCardIOLogoToggle = findViewById(R.id.use_card_io_logo);
+ mShowPayPalActionBarIconToggle = findViewById(R.id.show_paypal_action_bar_icon);
+ mKeepApplicationThemeToggle = findViewById(R.id.keep_application_theme);
+ mHideTorchButtonToggle = findViewById(R.id.hide_torch_button);
+ mLanguageSpinner = findViewById(R.id.language);
+ mUnblurEdit = findViewById(R.id.unblur);
+ mResultLabel = findViewById(R.id.result);
+ mResultImage = findViewById(R.id.result_image);
+ mResultCardTypeImage = findViewById(R.id.result_card_type_image);
+
+ TextView version = findViewById(R.id.version);
version.setText("card.io library: " + CardIOActivity.sdkVersion() + "\n" +
"Build date: " + CardIOActivity.sdkBuildDate());
-
setScanExpiryEnabled();
setupLanguageList();
}
@@ -116,39 +113,35 @@ public void onScan(View pressed) {
.putExtra(CardIOActivity.EXTRA_LANGUAGE_OR_LOCALE, (String) mLanguageSpinner.getSelectedItem())
.putExtra(CardIOActivity.EXTRA_USE_PAYPAL_ACTIONBAR_ICON, mShowPayPalActionBarIconToggle.isChecked())
.putExtra(CardIOActivity.EXTRA_KEEP_APPLICATION_THEME, mKeepApplicationThemeToggle.isChecked())
+ .putExtra(CardIOActivity.EXTRA_HIDE_TORCH_BUTTON, mHideTorchButtonToggle.isChecked())
.putExtra(CardIOActivity.EXTRA_GUIDE_COLOR, Color.GREEN)
.putExtra(CardIOActivity.EXTRA_SUPPRESS_CONFIRMATION, mSuppressConfirmationToggle.isChecked())
.putExtra(CardIOActivity.EXTRA_SUPPRESS_SCAN, mSuppressScanToggle.isChecked())
.putExtra(CardIOActivity.EXTRA_RETURN_CARD_IMAGE, true);
-
try {
int unblurDigits = Integer.parseInt(mUnblurEdit.getText().toString());
intent.putExtra(CardIOActivity.EXTRA_UNBLUR_DIGITS, unblurDigits);
- } catch(NumberFormatException ignored) {}
-
+ } catch (NumberFormatException ignored) {
+ }
startActivityForResult(intent, REQUEST_SCAN);
}
public void onAutotest(View v) {
Log.i(TAG, "\n\n\n ============================== \n" + "successfully completed "
+ numAutotestsPassed + " tests\n" + "beginning new test run\n");
-
Intent intent = new Intent(this, CardIOActivity.class)
.putExtra(CardIOActivity.EXTRA_REQUIRE_EXPIRY, false)
.putExtra(CardIOActivity.EXTRA_REQUIRE_CVV, false)
.putExtra(CardIOActivity.EXTRA_REQUIRE_POSTAL_CODE, false)
.putExtra(CardIOActivity.EXTRA_REQUIRE_CARDHOLDER_NAME, false)
.putExtra("debug_autoAcceptResult", true);
-
startActivityForResult(intent, REQUEST_AUTOTEST);
-
autotestMode = true;
}
@Override
public void onStop() {
super.onStop();
-
mResultLabel.setText("");
}
@@ -157,7 +150,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.v(TAG, "onActivityResult(" + requestCode + ", " + resultCode + ", " + data + ")");
- String outStr = new String();
+ String outStr = "";
Bitmap cardTypeImage = null;
if ((requestCode == REQUEST_SCAN || requestCode == REQUEST_AUTOTEST) && data != null
@@ -204,9 +197,7 @@ public void run() {
Bitmap card = CardIOActivity.getCapturedCardImage(data);
mResultImage.setImageBitmap(card);
mResultCardTypeImage.setImageBitmap(cardTypeImage);
-
Log.i(TAG, "Set result: " + outStr);
-
mResultLabel.setText(outStr);
}
diff --git a/SampleApp/src/main/res/layout/sample_activity.xml b/SampleApp/src/main/res/layout/sample_activity.xml
index 5444e783..7d93713b 100644
--- a/SampleApp/src/main/res/layout/sample_activity.xml
+++ b/SampleApp/src/main/res/layout/sample_activity.xml
@@ -15,7 +15,7 @@
android:id="@+id/version"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingBottom="8dp"/>
+ android:paddingBottom="8dp" />
+ android:onClick="onExpiryToggle"
+ android:text="Expiry" />
+ android:text="CVV" />
+ android:text="Postal Code" />
@@ -53,95 +53,101 @@
android:id="@+id/gather_cardholder_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Cardholder Name"/>
+ android:text="Cardholder Name" />
+ android:text="Restrict Postal Code to Numeric Only" />
+ android:checked="true"
+ android:text="Scan Expiry" />
+ android:text="Force keyboard entry (bypass scan)" />
+ android:text="Suppress keyboard number entry" />
+ android:text="Suppress confirmation" />
+ android:text="Detect card-ish rectangle only" />
+ android:text="Use card.io logo" />
+ android:text="PayPal icon in action bar" />
+ android:text="Keep application theme" />
+
+
+ android:focusableInTouchMode="true"
+ android:orientation="horizontal">
+ android:text="Language:" />
+ android:gravity="center" />
+ android:text="Digits not blurred:" />
+ android:inputType="number"
+ android:text="4" />
@@ -155,8 +161,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.4"
- android:text="Scan Credit Card using Card.io"
- android:onClick="onScan"/>
+ android:onClick="onScan"
+ android:text="Scan Credit Card using Card.io" />
+ android:text="Auto-test loop" />
@@ -172,22 +178,22 @@
android:id="@+id/recordings"
android:layout_width="match_parent"
android:layout_height="50dp"
- android:visibility="gone"/>
+ android:visibility="gone" />
+ android:layout_height="wrap_content" />
+ android:layout_height="wrap_content" />
+ android:layout_height="wrap_content" />
diff --git a/build.gradle b/build.gradle
index 415f8368..490a8edd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,7 +3,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.0'
+ classpath 'com.android.tools.build:gradle:3.0.0'
classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.5.3"
}
}
@@ -11,6 +11,6 @@ buildscript {
task assemble {}
ext {
- sdkVersion = 25
- buildToolsVersion = '25.0.2'
+ sdkVersion = 26
+ buildToolsVersion = '26.0.2'
}
diff --git a/card.io/src/main/java/io/card/payment/CardIOActivity.java b/card.io/src/main/java/io/card/payment/CardIOActivity.java
index 961eb522..41f897cf 100644
--- a/card.io/src/main/java/io/card/payment/CardIOActivity.java
+++ b/card.io/src/main/java/io/card/payment/CardIOActivity.java
@@ -175,6 +175,12 @@ public final class CardIOActivity extends Activity {
*/
public static final String EXTRA_HIDE_CARDIO_LOGO = "io.card.payment.hideLogo";
+ /**
+ * Boolean extra. Optional. Defaults to false. When set to true the
+ * flash camera toggle button will not be shown overlaid on the camera.
+ */
+ public static final String EXTRA_HIDE_TORCH_BUTTON = "io.card.payment.hideCameraFlashButton";
+
/**
* String extra. Optional. Used to display instructions to the user while they are scanning
* their card.
@@ -275,7 +281,7 @@ public final class CardIOActivity extends Activity {
private static final float UIBAR_VERTICAL_MARGIN_DP = 15.0f;
- private static final long[] VIBRATE_PATTERN = { 0, 70, 10, 40 };
+ private static final long[] VIBRATE_PATTERN = {0, 70, 10, 40};
private static final int TOAST_OFFSET_Y = -75;
@@ -290,19 +296,18 @@ public final class CardIOActivity extends Activity {
private CreditCard mDetectedCard;
private Rect mGuideFrame;
+ private LinearLayout customOverlayLayout;
+ private RelativeLayout mUIBar;
+ private FrameLayout mMainLayout;
+ private CardScanner mCardScanner;
+
private int mLastDegrees;
private int mFrameOrientation;
private boolean suppressManualEntry;
private boolean mDetectOnly;
- private LinearLayout customOverlayLayout;
+ private boolean mHideTorchButton;
private boolean waitingForPermission;
-
- private RelativeLayout mUIBar;
- private FrameLayout mMainLayout;
private boolean useApplicationTheme;
-
- private CardScanner mCardScanner;
-
private boolean manualEntryFallbackOrForced = false;
/**
@@ -337,6 +342,8 @@ protected void onCreate(Bundle savedInstanceState) {
ResolveInfo resolveInfo;
String errorMsg;
+ mHideTorchButton = clientData.getBooleanExtra(EXTRA_HIDE_TORCH_BUTTON, false);
+
// Check for DataEntryActivity's portrait orientation
// Check for CardIOActivity's orientation config in manifest
@@ -357,7 +364,7 @@ protected void onCreate(Bundle savedInstanceState) {
if (clientData.getBooleanExtra(EXTRA_NO_CAMERA, false)) {
manualEntryFallbackOrForced = true;
- } else if (!CardScanner.processorSupported()){
+ } else if (!CardScanner.processorSupported()) {
manualEntryFallbackOrForced = true;
} else {
try {
@@ -381,7 +388,27 @@ protected void onCreate(Bundle savedInstanceState) {
handleGeneralExceptionError(e);
}
}
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+// suppressManualEntry = savedInstanceState.getBoolean(EXTRA_SUPPRESS_MANUAL_ENTRY);
+// mDetectOnly = savedInstanceState.getBoolean(EXTRA_SUPPRESS_SCAN);
+// mHideTorchButton = savedInstanceState.getBoolean(EXTRA_HIDE_TORCH_BUTTON);
+// useApplicationTheme = savedInstanceState.getBoolean(EXTRA_KEEP_APPLICATION_THEME);
+// manualEntryFallbackOrForced = savedInstanceState.getBoolean(EXTRA_MANUAL_ENTRY_RESULT);
+ }
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(BUNDLE_WAITING_FOR_PERMISSION, waitingForPermission);
+// outState.putBoolean(EXTRA_SUPPRESS_MANUAL_ENTRY, suppressManualEntry);
+// outState.putBoolean(EXTRA_SUPPRESS_SCAN, mDetectOnly);
+// outState.putBoolean(EXTRA_HIDE_TORCH_BUTTON, mHideTorchButton);
+// outState.putBoolean(EXTRA_KEEP_APPLICATION_THEME, useApplicationTheme);
+// outState.putBoolean(EXTRA_MANUAL_ENTRY_RESULT, manualEntryFallbackOrForced);
}
private void android23AndAboveHandleCamera() {
@@ -393,7 +420,6 @@ private void android23AndAboveHandleCamera() {
}
}
-
private void android22AndBelowHandleCamera() {
if (manualEntryFallbackOrForced) {
finishIfSuppressManualEntry();
@@ -459,8 +485,8 @@ private void showCameraScannerOverlay() {
Class> testScannerClass = Class.forName("io.card.payment.CardScannerTester");
Constructor> cons = testScannerClass.getConstructor(this.getClass(),
Integer.TYPE);
- mCardScanner = (CardScanner) cons.newInstance(new Object[] { this,
- mFrameOrientation });
+ mCardScanner = (CardScanner) cons.newInstance(new Object[]{this,
+ mFrameOrientation});
} else {
mCardScanner = new CardScanner(this, mFrameOrientation);
}
@@ -575,13 +601,6 @@ protected void onResume() {
}
}
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
-
- outState.putBoolean(BUNDLE_WAITING_FOR_PERMISSION, waitingForPermission);
- }
-
@Override
protected void onPause() {
super.onPause();
@@ -759,9 +778,9 @@ void onCardDetected(Bitmap detectedBitmap, DetectionInfo dInfo) {
float sf;
if (mFrameOrientation == ORIENTATION_PORTRAIT
|| mFrameOrientation == ORIENTATION_PORTRAIT_UPSIDE_DOWN) {
- sf = mGuideFrame.right / (float)CardScanner.CREDIT_CARD_TARGET_WIDTH * .95f;
+ sf = mGuideFrame.right / (float) CardScanner.CREDIT_CARD_TARGET_WIDTH * .95f;
} else {
- sf = mGuideFrame.right / (float)CardScanner.CREDIT_CARD_TARGET_WIDTH * 1.15f;
+ sf = mGuideFrame.right / (float) CardScanner.CREDIT_CARD_TARGET_WIDTH * 1.15f;
}
Matrix m = new Matrix();
@@ -908,7 +927,8 @@ private void setPreviewLayout() {
LayoutParams.MATCH_PARENT, Gravity.TOP));
previewFrame.addView(mPreview);
- mOverlay = new OverlayView(this, null, Util.deviceSupportsTorch(this));
+ boolean showTorch = Util.deviceSupportsTorch(this) && !mHideTorchButton;
+ mOverlay = new OverlayView(this, null, showTorch);
mOverlay.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
if (getIntent() != null) {
@@ -968,7 +988,7 @@ public void onClick(View v) {
});
mUIBar.addView(keyboardBtn);
ViewUtil.styleAsButton(keyboardBtn, false, this, useApplicationTheme);
- if(!useApplicationTheme){
+ if (!useApplicationTheme) {
keyboardBtn.setTextSize(Appearance.TEXT_SIZE_SMALL_BUTTON);
}
keyboardBtn.setMinimumHeight(ViewUtil.typedDimensionValueToPixelsInt(
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 0a48d7d6..d09d2ec7 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip