Skip to content

Commit f548508

Browse files
PingOneVerify Android SDK v1.0.2
1 parent 9960602 commit f548508

27 files changed

+356
-154
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
The PingOne Verify Mobile SDK provides the ability to integrate PingOne ID Verification capabilities into your mobile applications. The SDK facilitates communication with the PingOne Verify service, handling incoming messages or requests from the service, and sending ID information for verification or other requests to the service. The SDK also persists the user keys and transaction information using the encrypted storage on the device.
44

5-
For setup instructions and documentation, you can refer to [this guide](https://apidocs.pingidentity.com/pingone/platform/v1/api/#pingone-verify-mobile-sdk-for-android).
5+
For setup instructions and documentation, you can refer to [this guide](https://apidocs.pingidentity.com/pingone/mobile-sdks/v1/api/#pingone-verify-mobile-sdk-for-android).

SDK/P1Verify-1.0.0.aar

-139 KB
Binary file not shown.

SDK/P1Verify-1.0.2.aar

155 KB
Binary file not shown.

Sample Code/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# Android PingOne Verify Sample App
22

3-
Make sure you add `google-services.json` to the project to be able to build the app. You can refer to [this guide](https://apidocs.pingidentity.com/pingone/platform/v1/api/#installation-and-configuration-1) for instructions.
3+
Make sure you add `google-services.json` to the project to be able to build the app. You can refer to [this guide](https://apidocs.pingidentity.com/pingone/mobile-sdks/v1/api/#installation-and-configuration-1) for instructions.

Sample Code/app/build.gradle

+43-10
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,59 @@ apply plugin: 'com.android.application'
22

33
android {
44
compileSdkVersion 30
5+
6+
signingConfigs {
7+
config {
8+
if (signingKeyAlias != null && signingKeyPassword != null && signingStoreFile != null && signingStorePassword) {
9+
keyAlias signingKeyAlias
10+
keyPassword signingKeyPassword
11+
storeFile file(signingStoreFile)
12+
storePassword signingStorePassword
13+
} else {
14+
throw new IllegalArgumentException("Missing signing config parameters. Add following properties to project properties file: signingKeyAlias, signingKeyPassword, signingStoreFile & signingStorePassword")
15+
}
16+
}
17+
}
18+
519
defaultConfig {
620
applicationId "com.pingidentity.sample.P1VerifyApp"
721
minSdkVersion 24
822
targetSdkVersion 30
9-
versionCode 8
10-
versionName "1.0.1"
23+
multiDexEnabled true
24+
signingConfig signingConfigs.config
25+
versionCode 6
26+
versionName "1.0.2(3)"
1127
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1228
}
29+
1330
buildTypes {
14-
release {
31+
debug{
32+
debuggable true
33+
minifyEnabled false
34+
shrinkResources false
35+
}
36+
playStore {
37+
debuggable false
1538
minifyEnabled false
39+
shrinkResources false
1640
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
1741
}
1842
}
43+
1944
compileOptions {
2045
sourceCompatibility JavaVersion.VERSION_1_8
2146
targetCompatibility JavaVersion.VERSION_1_8
2247
}
2348
buildFeatures {
24-
viewBinding true
49+
viewBinding true
50+
}
51+
52+
applicationVariants.all { variant ->
53+
variant.outputs.all {
54+
outputFileName = "P1VerifyApp-${variant.buildType.name}-${variant.versionName}.apk"
55+
}
2556
}
57+
2658
}
2759

2860
dependencies {
@@ -40,6 +72,10 @@ dependencies {
4072
implementation 'com.google.firebase:firebase-messaging:21.0.1'
4173

4274
implementation 'io.fotoapparat:fotoapparat:2.7.0'
75+
implementation "androidx.annotation:annotation:1.1.0"
76+
implementation "androidx.exifinterface:exifinterface:1.3.2"
77+
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.20"
78+
4379
implementation 'com.shawnlin:number-picker:2.4.9'
4480
implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
4581

@@ -48,11 +84,11 @@ dependencies {
4884
annotationProcessor 'com.google.dagger:dagger-android-processor:2.31.2'
4985
annotationProcessor 'com.google.dagger:dagger-compiler:2.31.2'
5086
implementation 'com.google.android.material:material:1.3.0'
51-
implementation 'androidx.navigation:navigation-fragment:2.3.3'
52-
implementation 'androidx.navigation:navigation-ui:2.3.3'
87+
implementation 'androidx.navigation:navigation-fragment:2.3.4'
88+
implementation 'androidx.navigation:navigation-ui:2.3.4'
5389
implementation 'androidx.appcompat:appcompat:1.2.0'
5490
implementation 'androidx.security:security-crypto:1.1.0-alpha03'
55-
implementation 'androidx.security:security-identity-credential:1.0.0-alpha01'
91+
implementation 'androidx.security:security-identity-credential:1.0.0-alpha02'
5692
implementation 'androidx.biometric:biometric:1.1.0'
5793

5894
implementation 'me.relex:circleindicator:2.1.4'
@@ -69,9 +105,6 @@ dependencies {
69105
implementation 'com.squareup.okio:okio:1.16.0'
70106
implementation 'com.squareup.okhttp3:okhttp:3.14.7'
71107

72-
implementation "com.microsoft.appcenter:appcenter-analytics:4.1.0"
73-
implementation "com.microsoft.appcenter:appcenter-crashes:4.1.0"
74-
75108
testImplementation 'junit:junit:4.13.1'
76109
androidTestImplementation 'com.android.support.test:runner:1.0.2'
77110
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
-147 KB
Binary file not shown.
155 KB
Binary file not shown.
-6.49 KB
Binary file not shown.

Sample Code/app/src/main/java/com/pingidentity/sample/P1VerifyApp/activities/HomeActivity.java

+3-9
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,14 @@
22

33
import android.os.Bundle;
44

5-
import com.microsoft.appcenter.AppCenter;
6-
import com.microsoft.appcenter.analytics.Analytics;
7-
import com.microsoft.appcenter.crashes.Crashes;
5+
import androidx.appcompat.app.AppCompatActivity;
6+
import androidx.fragment.app.FragmentManager;
7+
88
import com.pingidentity.sample.P1VerifyApp.R;
99
import com.pingidentity.sample.P1VerifyApp.databinding.ActivityHomeBinding;
1010
import com.pingidentity.sample.P1VerifyApp.fragments.home.HomeFragment;
1111
import com.pingidentity.sample.P1VerifyApp.utils.IdvHelper;
1212

13-
import androidx.fragment.app.FragmentManager;
14-
import androidx.appcompat.app.AppCompatActivity;
15-
1613
public class HomeActivity extends AppCompatActivity {
1714

1815
ActivityHomeBinding mBinding;
@@ -24,9 +21,6 @@ protected void onCreate(Bundle savedInstanceState) {
2421
mBinding = ActivityHomeBinding.inflate(getLayoutInflater());
2522
setContentView(mBinding.getRoot());
2623

27-
AppCenter.start(getApplication(), "c1ca8e1a-cf98-4caa-9836-6256c5fb2b3b",
28-
Analytics.class, Crashes.class);
29-
3024
IdvHelper.getInstance().updateLifeCycleOwner(this);
3125

3226
FragmentManager fragmentManager = getSupportFragmentManager();

Sample Code/app/src/main/java/com/pingidentity/sample/P1VerifyApp/fragments/details/DetailsPresenter.java

+33-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import android.graphics.Bitmap;
44

5+
import androidx.annotation.Nullable;
6+
57
import com.pingidentity.p1verifyidschema.DriverLicense;
68
import com.pingidentity.p1verifyidschema.Passport;
79
import com.pingidentity.p1verifyidschema.Selfie;
@@ -48,9 +50,12 @@ public void initScreen(DocumentType type) {
4850
title = R.string.document_driver_license;
4951
images.add(driverLicense.getFrontImage());
5052
images.add(driverLicense.getBackImage());
51-
details.add(new DetailItem("Name", driverLicense.getFirstName() + " " + driverLicense.getMiddleName() + " " + driverLicense.getLastName(), true));
53+
driverLicense = driverLicense.getFormattedDriverLicense();
54+
details.add(new DetailItem("Name", getFullName(driverLicense.getFirstName(), driverLicense.getLastName()), true));
5255
details.add(new DetailItem("Address", driverLicense.getAddressStreet() + " " + driverLicense.getAddressCity() + " " + driverLicense.getAddressState() + " " + driverLicense.getAddressZip(), true));
5356
details.add(new DetailItem("ID number", driverLicense.getIdNumber(), true));
57+
details.add(new DetailItem("Expiration Date", driverLicense.getExpirationDate(), false));
58+
details.add(new DetailItem("Birth Date", driverLicense.getBirthDate(), false));
5459
details.add(new DetailItem("Country", driverLicense.getCountry(), false));
5560
details.add(new DetailItem("Gender", driverLicense.getGender(), false));
5661
details.add(new DetailItem("Hair color", driverLicense.getHairColor(), false));
@@ -62,6 +67,22 @@ public void initScreen(DocumentType type) {
6267
Passport passport = mRepository.getPassport();
6368
title = R.string.document_passport;
6469
images.add(passport.getFrontImage());
70+
if (passport.getFirstName() != null || passport.getLastName() != null)
71+
details.add(new DetailItem("Name", getFullName(passport.getFirstName(), passport.getLastName()), true));
72+
if (passport.getIdNumber() != null)
73+
details.add(new DetailItem("ID number", passport.getIdNumber(), true));
74+
if (passport.getCountry() != null)
75+
details.add(new DetailItem("Country", passport.getCountry(), false));
76+
if (passport.getGender() != null)
77+
details.add(new DetailItem("Gender", passport.getGender(), false));
78+
if (passport.getBirthDate() != null)
79+
details.add(new DetailItem("Birth date", passport.getBirthDate(), false));
80+
if (passport.getNationality() != null)
81+
details.add(new DetailItem("Nationality", passport.getNationality(), false));
82+
if (passport.getPersonalNumber() != null)
83+
details.add(new DetailItem("Personal Number", passport.getPersonalNumber(), false));
84+
if (passport.getExpirationDate() != null)
85+
details.add(new DetailItem("Expiration Date", passport.getExpirationDate(), false));
6586
break;
6687
}
6788

@@ -70,6 +91,17 @@ public void initScreen(DocumentType type) {
7091
mView.showInfo(details);
7192
}
7293

94+
private String getFullName(@Nullable final String firstName, @Nullable final String lastName) {
95+
final StringBuilder sb = new StringBuilder();
96+
if (firstName != null && !firstName.isEmpty()) {
97+
sb.append(firstName).append(" ");
98+
}
99+
if (lastName != null && !lastName.isEmpty()) {
100+
sb.append(lastName);
101+
}
102+
return sb.toString();
103+
}
104+
73105
@Override
74106
public void deleteCard() {
75107
switch (mDocumentType) {

Sample Code/app/src/main/java/com/pingidentity/sample/P1VerifyApp/fragments/home/HomeContract.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,9 @@ interface View {
2222

2323
void navigateToQR();
2424

25-
void showAlert(int title, int message);
26-
27-
void showAlert(String message);
25+
void showError(String errorTitle, String errorMessage);
2826

27+
void showError(int errorTitle, int errorMessage);
2928
}
3029

3130
interface Presenter {

Sample Code/app/src/main/java/com/pingidentity/sample/P1VerifyApp/fragments/home/HomeFragment.java

+16-29
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import com.pingidentity.sample.P1VerifyApp.fragments.details.DetailsFragment;
2222
import com.pingidentity.sample.P1VerifyApp.fragments.qrscanner.ScannerFragment;
2323
import com.pingidentity.sample.P1VerifyApp.models.CardItem;
24+
import com.pingidentity.sample.P1VerifyApp.utils.AlertUtil;
25+
import com.shocard.sholib.utils.AlertUtils;
2426

2527
import org.jetbrains.annotations.NotNull;
2628

@@ -93,25 +95,25 @@ private void setupDrawerListener() {
9395
});
9496
mBinding.btnAddSelfie.setOnClickListener(v -> {
9597
mBinding.drawerLayout.closeDrawers();
96-
showAlert(
97-
getString(R.string.settings_alert_selfie_title),
98-
getString(R.string.settings_alert_selfie_message),
98+
AlertUtil.showAlert(getContext(),
99+
R.string.settings_alert_selfie_title,
100+
R.string.settings_alert_selfie_message,
99101
() -> mPresenter.updateSelfie(getActivity())
100102
);
101103
});
102104
mBinding.btnAddLicense.setOnClickListener(v -> {
103105
mBinding.drawerLayout.closeDrawers();
104-
showAlert(
105-
getString(R.string.settings_alert_license_title),
106-
getString(R.string.settings_alert_license_message),
106+
AlertUtil.showAlert(getContext(),
107+
R.string.settings_alert_license_title,
108+
R.string.settings_alert_license_message,
107109
() -> mPresenter.updateLicense(getActivity())
108110
);
109111
});
110112
mBinding.btnAddPassport.setOnClickListener(v -> {
111113
mBinding.drawerLayout.closeDrawers();
112-
showAlert(
113-
getString(R.string.settings_alert_passport_title),
114-
getString(R.string.settings_alert_passport_message),
114+
AlertUtil.showAlert(getContext(),
115+
R.string.settings_alert_passport_title,
116+
R.string.settings_alert_passport_message,
115117
() -> mPresenter.updatePassport(getActivity())
116118
);
117119
});
@@ -156,7 +158,7 @@ public void showValidationSuccess() {
156158

157159
@Override
158160
public void showValidationError() {
159-
mBinding.app.viewValidationStatus.showValidationError(() -> showAlert(R.string.validation_failed_title, R.string.validation_failed_description));
161+
mBinding.app.viewValidationStatus.showValidationError(() -> showError(R.string.validation_failed_title, R.string.validation_failed_description));
160162
}
161163

162164
@Override
@@ -205,27 +207,12 @@ private void navigateTo(Fragment fragment) {
205207
//////////////////////////////////////////
206208

207209
@Override
208-
public void showAlert(int title, int message) {
209-
showAlert(getString(title), getString(message), null);
210+
public void showError(String errorTitle, String errorMessage) {
211+
AlertUtils.showErrorAlert(getActivity(), errorTitle, errorMessage, null);
210212
}
211213

212214
@Override
213-
public void showAlert(String message) {
214-
showAlert(getString(R.string.error_title), message, null);
215+
public void showError(int errorTitle, int errorMessage) {
216+
AlertUtils.showErrorAlert(getActivity(), errorTitle, errorMessage, null);
215217
}
216-
217-
private void showAlert(String title, String message, final Runnable positiveAnswer) {
218-
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
219-
.setTitle(title)
220-
.setMessage(message)
221-
.setNegativeButton(R.string.home_cancel, (dialog, which) -> dialog.dismiss());
222-
if (positiveAnswer != null) {
223-
builder.setPositiveButton(R.string.home_continue, (dialog, which) -> {
224-
positiveAnswer.run();
225-
dialog.dismiss();
226-
});
227-
}
228-
builder.show();
229-
}
230-
231218
}

0 commit comments

Comments
 (0)