From 23998996139edf356490a0a6e8e46b4c100a7eb8 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 4 Apr 2019 19:37:43 -0300 Subject: [PATCH 1/6] migrate GCM to FCM --- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 62 ++------------ .../auth0/guardian/sample/EnrollActivity.java | 20 ++--- .../auth0/guardian/sample/MainActivity.java | 41 +++++---- .../FcmListenerService.java} | 30 ++++--- .../auth0/guardian/sample/fcm/FcmUtils.java | 57 +++++++++++++ .../gcm/GcmInstanceIDListenerService.java | 41 --------- .../auth0/guardian/sample/gcm/GcmUtils.java | 85 ------------------- app/src/main/res/layout/activity_main.xml | 10 ++- app/src/main/res/values/google_gcm.xml | 3 - app/src/main/res/values/guardian.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- build.gradle | 1 + 13 files changed, 131 insertions(+), 229 deletions(-) rename app/src/main/java/com/auth0/guardian/sample/{gcm/GcmListenerService.java => fcm/FcmListenerService.java} (77%) create mode 100644 app/src/main/java/com/auth0/guardian/sample/fcm/FcmUtils.java delete mode 100644 app/src/main/java/com/auth0/guardian/sample/gcm/GcmInstanceIDListenerService.java delete mode 100644 app/src/main/java/com/auth0/guardian/sample/gcm/GcmUtils.java delete mode 100644 app/src/main/res/values/google_gcm.xml diff --git a/app/build.gradle b/app/build.gradle index c78912f..8602100 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.application' +apply plugin: 'com.google.gms.google-services' android { compileSdkVersion 28 @@ -29,8 +30,9 @@ dependencies { implementation 'com.android.support:design:28.0.0' //GSON implementation 'com.google.code.gson:gson:2.8.5' - //GCM - implementation 'com.google.android.gms:play-services-gcm:16.1.0' + //FCM + implementation 'com.google.firebase:firebase-core:16.0.8' + implementation 'com.google.firebase:firebase-messaging:17.5.0' //EventBus implementation 'org.greenrobot:eventbus:3.0.0' //ZXing QR decoder deps diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a000eb2..c7ee1ce 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,40 +1,18 @@ - - - - - - - - - - - - - - + android:theme="@style/AppTheme" + tools:ignore="AllowBackup,GoogleAppIndexingWarning"> - - - - - - + - - - - - - + - + - - - - - - + diff --git a/app/src/main/java/com/auth0/guardian/sample/EnrollActivity.java b/app/src/main/java/com/auth0/guardian/sample/EnrollActivity.java index 655dca9..e01a09d 100644 --- a/app/src/main/java/com/auth0/guardian/sample/EnrollActivity.java +++ b/app/src/main/java/com/auth0/guardian/sample/EnrollActivity.java @@ -51,13 +51,13 @@ public class EnrollActivity extends AppCompatActivity implements CaptureView.Lis private static final String TAG = EnrollActivity.class.getName(); private static final String DEVICE_NAME = "com.auth0.guardian.sample.EnrollActivity.DEVICE_NAME"; - private static final String GCM_TOKEN = "com.auth0.guardian.sample.EnrollActivity.GCM_TOKEN"; + private static final String FCM_TOKEN = "com.auth0.guardian.sample.EnrollActivity.FCM_TOKEN"; private static final int REQUEST_CAMERA = 55; private Guardian guardian; private String deviceName; - private String gcmToken; + private String fcmToken; private View permissionLayout; private View scannerLayout; @@ -65,10 +65,10 @@ public class EnrollActivity extends AppCompatActivity implements CaptureView.Lis static Intent getStartIntent(@NonNull Context context, @NonNull String deviceName, - @NonNull String gcmToken) { + @NonNull String fcmToken) { Intent intent = new Intent(context, EnrollActivity.class); intent.putExtra(DEVICE_NAME, deviceName); - intent.putExtra(GCM_TOKEN, gcmToken); + intent.putExtra(FCM_TOKEN, fcmToken); return intent; } @@ -132,7 +132,7 @@ public void onRequestPermissionsResult(int requestCode, public void onCodeScanned(String enrollmentData) { try { KeyPair keyPair = generateKeyPair(); - CurrentDevice device = new CurrentDevice(this, gcmToken, deviceName); + CurrentDevice device = new CurrentDevice(this, fcmToken, deviceName); guardian.enroll(enrollmentData, device, keyPair) .start(new DialogCallback<>(this, R.string.progress_title_please_wait, @@ -141,7 +141,7 @@ public void onCodeScanned(String enrollmentData) { @Override public void onSuccess(Enrollment enrollment) { Log.d(TAG, "enroll success"); - onEnrollSucess(enrollment); + onEnrollSuccess(enrollment); } @Override @@ -158,10 +158,10 @@ public void onFailure(Throwable exception) { private void setupGuardian() { Intent intent = getIntent(); deviceName = intent.getStringExtra(DEVICE_NAME); - gcmToken = intent.getStringExtra(GCM_TOKEN); + fcmToken = intent.getStringExtra(FCM_TOKEN); - if (deviceName == null || gcmToken == null) { - throw new IllegalStateException("Missing deviceName or gcmToken"); + if (deviceName == null || fcmToken == null) { + throw new IllegalStateException("Missing deviceName or fcmToken"); } guardian = new Guardian.Builder() @@ -231,7 +231,7 @@ private void resumeScanning() { scanner.resume(); } - private void onEnrollSucess(Enrollment enrollment) { + private void onEnrollSuccess(Enrollment enrollment) { Intent data = new Intent(); ParcelableEnrollment parcelableEnrollment = new ParcelableEnrollment(enrollment); data.putExtra(Constants.ENROLLMENT, parcelableEnrollment); diff --git a/app/src/main/java/com/auth0/guardian/sample/MainActivity.java b/app/src/main/java/com/auth0/guardian/sample/MainActivity.java index acc39d3..d2c56c4 100644 --- a/app/src/main/java/com/auth0/guardian/sample/MainActivity.java +++ b/app/src/main/java/com/auth0/guardian/sample/MainActivity.java @@ -43,14 +43,14 @@ import com.auth0.android.guardian.sdk.ParcelableNotification; import com.auth0.android.guardian.sdk.networking.Callback; import com.auth0.guardian.sample.events.GuardianNotificationReceivedEvent; -import com.auth0.guardian.sample.gcm.GcmUtils; +import com.auth0.guardian.sample.fcm.FcmUtils; import com.auth0.guardian.sample.views.TOTPCodeView; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -public class MainActivity extends AppCompatActivity implements GcmUtils.GcmTokenListener { +public class MainActivity extends AppCompatActivity implements FcmUtils.FcmTokenListener { private static final String TAG = MainActivity.class.getName(); @@ -60,14 +60,14 @@ public class MainActivity extends AppCompatActivity implements GcmUtils.GcmToken private View enrollView; private View accountView; private TextView deviceNameText; - private TextView gcmTokenText; + private TextView fcmTokenText; private TextView userText; private TOTPCodeView otpView; private EventBus eventBus; private Guardian guardian; private ParcelableEnrollment enrollment; - private String gcmToken; + private String fcmToken; public static Intent getStartIntent(@NonNull Context context, @NonNull ParcelableNotification notification) { @@ -91,8 +91,15 @@ protected void onCreate(Bundle savedInstanceState) { .enableLogging() .build(); - GcmUtils gcmUtils = new GcmUtils(this, getString(R.string.google_app_id)); - gcmUtils.fetchGcmToken(this); + /* + * The following fetch token call is NOT required in a production app + * as the registration token is generated automatically by the Firebase SDK. + * This is just here for display purposes on this Activity's layout. + * + * See: https://developers.google.com/cloud-messaging/android/android-migrate-iid-service + */ + FcmUtils fcmUtils = new FcmUtils(); + fcmUtils.fetchFcmToken(this); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); String enrollmentJSON = sharedPreferences.getString(Constants.ENROLLMENT, null); @@ -130,7 +137,7 @@ private void setupUI() { enrollView = findViewById(R.id.enrollLayout); accountView = findViewById(R.id.accountLayout); deviceNameText = (TextView) findViewById(R.id.deviceNameText); - gcmTokenText = (TextView) findViewById(R.id.gcmTokenText); + fcmTokenText = (TextView) findViewById(R.id.fcmTokenText); userText = (TextView) findViewById(R.id.userText); otpView = (TOTPCodeView) findViewById(R.id.otpView); @@ -159,16 +166,16 @@ private void updateUI() { runOnUiThread(new Runnable() { @Override public void run() { - loadingView.setVisibility(gcmToken != null ? View.GONE : View.VISIBLE); + loadingView.setVisibility(fcmToken != null ? View.GONE : View.VISIBLE); if (enrollment == null) { - gcmTokenText.setText(gcmToken != null ? gcmToken : null); + fcmTokenText.setText(fcmToken); accountView.setVisibility(View.GONE); - enrollView.setVisibility(gcmToken != null ? View.VISIBLE : View.GONE); + enrollView.setVisibility(fcmToken != null ? View.VISIBLE : View.GONE); } else { userText.setText(enrollment.getUserId()); otpView.setEnrollment(enrollment); enrollView.setVisibility(View.GONE); - accountView.setVisibility(gcmToken != null ? View.VISIBLE : View.GONE); + accountView.setVisibility(fcmToken != null ? View.VISIBLE : View.GONE); } } }); @@ -176,7 +183,7 @@ public void run() { private void onEnrollRequested() { Intent enrollIntent = EnrollActivity - .getStartIntent(this, deviceNameText.getText().toString(), gcmToken); + .getStartIntent(this, deviceNameText.getText().toString(), fcmToken); startActivityForResult(enrollIntent, ENROLL_REQUEST); } @@ -222,18 +229,18 @@ private void onPushNotificationReceived(ParcelableNotification notification) { } @Override - public void onGcmTokenObtained(String gcmToken) { - this.gcmToken = gcmToken; + public void onFcmTokenObtained(String fcmToken) { + this.fcmToken = fcmToken; updateUI(); } @Override - public void onGcmFailure(Throwable exception) { - Log.e(TAG, "Error obtaining GCM token", exception); + public void onFcmFailure(Throwable exception) { + Log.e(TAG, "Error obtaining FCM token", exception); new AlertDialog.Builder(this) .setTitle(R.string.alert_title_error) - .setMessage(getString(R.string.alert_message_gcm_error)) + .setMessage(getString(R.string.alert_message_fcm_error)) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { diff --git a/app/src/main/java/com/auth0/guardian/sample/gcm/GcmListenerService.java b/app/src/main/java/com/auth0/guardian/sample/fcm/FcmListenerService.java similarity index 77% rename from app/src/main/java/com/auth0/guardian/sample/gcm/GcmListenerService.java rename to app/src/main/java/com/auth0/guardian/sample/fcm/FcmListenerService.java index 1f49483..dd2f6a9 100644 --- a/app/src/main/java/com/auth0/guardian/sample/gcm/GcmListenerService.java +++ b/app/src/main/java/com/auth0/guardian/sample/fcm/FcmListenerService.java @@ -20,12 +20,11 @@ * THE SOFTWARE. */ -package com.auth0.guardian.sample.gcm; +package com.auth0.guardian.sample.fcm; import android.app.PendingIntent; import android.content.Intent; import android.graphics.Color; -import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; import android.util.Log; @@ -36,28 +35,28 @@ import com.auth0.guardian.sample.MainActivity; import com.auth0.guardian.sample.R; import com.auth0.guardian.sample.events.GuardianNotificationReceivedEvent; +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; import org.greenrobot.eventbus.EventBus; -public class GcmListenerService extends com.google.android.gms.gcm.GcmListenerService { +public class FcmListenerService extends FirebaseMessagingService { - private static final String TAG = GcmListenerService.class.getName(); + private static final String TAG = FcmListenerService.class.getName(); /** * Called when message is received. * - * @param from SenderID of the sender. - * @param data Data bundle containing message data as key/value pairs. - * For Set of keys use data.keySet(). + * @param message The message instance */ @Override - public void onMessageReceived(String from, Bundle data) { + public void onMessageReceived(RemoteMessage message) { if (BuildConfig.DEBUG) { - Log.d(TAG, String.format("Received GCM message from: %s with data: %s", from, data)); + Log.d(TAG, String.format("Received FCM message from: %s with data: %s", message.getFrom(), message.getData())); } try { - ParcelableNotification notification = Guardian.parseNotification(data); + ParcelableNotification notification = Guardian.parseNotification(message.getData()); EventBus eventBus = EventBus.getDefault(); if (eventBus.hasSubscriberForEvent(GuardianNotificationReceivedEvent.class)) { eventBus.post(new GuardianNotificationReceivedEvent(notification)); @@ -79,4 +78,15 @@ public void onMessageReceived(String from, Bundle data) { Log.e(TAG, "Received a notification that is not a Guardian Notification", e); } } + + /** + * Called if InstanceID token is updated. This may occur if the security of + * the previous token had been compromised. This call is initiated by the + * InstanceID provider. + */ + @Override + public void onNewToken(String token) { + // Use updated token and notify our app's server of any changes (if applicable). + Log.w(TAG, "Should refresh token!"); + } } diff --git a/app/src/main/java/com/auth0/guardian/sample/fcm/FcmUtils.java b/app/src/main/java/com/auth0/guardian/sample/fcm/FcmUtils.java new file mode 100644 index 0000000..fc2bf13 --- /dev/null +++ b/app/src/main/java/com/auth0/guardian/sample/fcm/FcmUtils.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016 Auth0 (http://auth0.com) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.auth0.guardian.sample.fcm; + +import android.support.annotation.NonNull; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.iid.InstanceIdResult; + +public class FcmUtils { + + public void fetchFcmToken(FcmTokenListener listener) { + FirebaseInstanceId.getInstance().getInstanceId() + .addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + String token = task.getResult().getToken(); + listener.onFcmTokenObtained(token); + } + }) + .addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { + listener.onFcmFailure(e); + } + }); + } + + public interface FcmTokenListener { + void onFcmTokenObtained(String fcmToken); + + void onFcmFailure(Throwable exception); + } +} diff --git a/app/src/main/java/com/auth0/guardian/sample/gcm/GcmInstanceIDListenerService.java b/app/src/main/java/com/auth0/guardian/sample/gcm/GcmInstanceIDListenerService.java deleted file mode 100644 index cf05f65..0000000 --- a/app/src/main/java/com/auth0/guardian/sample/gcm/GcmInstanceIDListenerService.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2016 Auth0 (http://auth0.com) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.auth0.guardian.sample.gcm; - -import android.util.Log; - -/** - * Called if InstanceID token is updated. This may occur if the security of - * the previous token had been compromised. This call is initiated by the - * InstanceID provider. - */ -public class GcmInstanceIDListenerService extends com.google.android.gms.iid.InstanceIDListenerService { - - private static final String TAG = GcmInstanceIDListenerService.class.getName(); - - @Override - public void onTokenRefresh() { - // Fetch updated Instance ID token and notify our app's server of any changes (if applicable). - Log.w(TAG, "Should refresh token!"); - } -} diff --git a/app/src/main/java/com/auth0/guardian/sample/gcm/GcmUtils.java b/app/src/main/java/com/auth0/guardian/sample/gcm/GcmUtils.java deleted file mode 100644 index 8b3724e..0000000 --- a/app/src/main/java/com/auth0/guardian/sample/gcm/GcmUtils.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2016 Auth0 (http://auth0.com) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.auth0.guardian.sample.gcm; - -import android.content.Context; -import android.os.AsyncTask; - -import com.google.android.gms.gcm.GoogleCloudMessaging; -import com.google.android.gms.iid.InstanceID; - -import java.io.IOException; - -public class GcmUtils { - - private final Context context; - private final String googleAppId; - - public GcmUtils(Context context, String googleAppId) { - this.context = context; - this.googleAppId = googleAppId; - } - - public void fetchGcmToken(GcmTokenListener listener) { - new FetchAsyncTask(listener) - .execute(); - } - - public interface GcmTokenListener { - void onGcmTokenObtained(String gcmToken); - - void onGcmFailure(Throwable exception); - } - - class FetchAsyncTask extends AsyncTask { - - private final GcmTokenListener listener; - private String token; - - FetchAsyncTask(GcmTokenListener listener) { - this.listener = listener; - } - - @Override - protected Throwable doInBackground(Void... params) { - // Initially this call goes out to the network to retrieve the token, subsequent calls - // are local. - InstanceID instanceID = InstanceID.getInstance(context); - try { - token = instanceID.getToken(googleAppId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); - return null; - } catch (IOException e) { - return e; - } - } - - @Override - protected void onPostExecute(Throwable error) { - if (error != null) { - listener.onGcmFailure(error); - } else { - listener.onGcmTokenObtained(token); - } - } - } -} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 559beda..618f2b3 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -25,10 +25,10 @@ diff --git a/app/src/main/res/values/google_gcm.xml b/app/src/main/res/values/google_gcm.xml deleted file mode 100644 index 55741bf..0000000 --- a/app/src/main/res/values/google_gcm.xml +++ /dev/null @@ -1,3 +0,0 @@ - - YOUR_GOOGLE_APP_ID_HERE - \ No newline at end of file diff --git a/app/src/main/res/values/guardian.xml b/app/src/main/res/values/guardian.xml index cef7fa3..466615c 100644 --- a/app/src/main/res/values/guardian.xml +++ b/app/src/main/res/values/guardian.xml @@ -1,3 +1,3 @@ - YOUR_GUARDIAN_URL_HERE + https://custom-sns-app-test.guardian.auth0.com diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 95ed7bd..e240ab4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,7 +9,7 @@ Trying to allow the authentication request… Trying to enroll your account… Error - Could not obtain GCM token.\nCheck your GCM configuration and internet connection and try again later + Could not obtain FCM token.\nCheck your FCM configuration and internet connection and try again later Guardian notification received Click to see details diff --git a/build.gradle b/build.gradle index acb7009..843507b 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.3.2' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' + classpath 'com.google.gms:google-services:4.2.0' } } From 8fe93556b307e6f5509f637150a22b5ad729dc46 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 4 Apr 2019 20:00:06 -0300 Subject: [PATCH 2/6] add sample google-services file --- app/README.md | 6 +++--- app/google-services.json | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 app/google-services.json diff --git a/app/README.md b/app/README.md index 78519f9..bababba 100644 --- a/app/README.md +++ b/app/README.md @@ -2,9 +2,9 @@ ## Running -Before running the sample app please configure your google app id and Guardian url properly. +Before running the sample app please configure your Firebase app and Guardian URL properly. -You should change your google app id (required for GCM push notifications) at `src/main/res/values/google_gcm.xml`. +You should place the `google-services.json` file (required for FCM push notifications) inside your Android app module root. Typically at` at `MyApplication/app/google-services.json`. -The Guardian url can be changed at `src/main/res/values/guardian.xml`. It should look like +The Guardian URL can be changed at `src/main/res/values/guardian.xml`. It should look like `https://.guardian.auth0.com`. \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..fe3124f --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,9 @@ +/* +** Replace this file with an actual google-services.json +** downloaded from the Firebase Console. +** See: https://console.firebase.google.com +*/ + +{ + //Not a valid configuration file +} \ No newline at end of file From 3f1790fc23529a60a5dce3720810ea5601379e3f Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 4 Apr 2019 20:10:46 -0300 Subject: [PATCH 3/6] run lint on app module --- .../java/com/auth0/guardian/sample/EnrollActivity.java | 3 +-- .../auth0/guardian/sample/scanner/BarcodeGraphic.java | 6 +++--- .../guardian/sample/scanner/BarcodeGraphicTracker.java | 4 ++-- .../guardian/sample/scanner/BarcodeTrackerFactory.java | 4 ++-- .../com/auth0/guardian/sample/scanner/CaptureView.java | 9 ++++----- .../guardian/sample/scanner/camera/CameraSource.java | 8 ++++---- .../sample/scanner/camera/CameraSourceCropPreview.java | 4 ++-- .../guardian/sample/scanner/camera/GraphicOverlay.java | 9 ++++----- .../auth0/guardian/sample/scanner/utils/Detector.java | 8 ++++---- .../com/auth0/guardian/sample/scanner/utils/Frame.java | 4 ++-- .../guardian/sample/scanner/utils/MultiProcessor.java | 4 ++-- .../java/com/auth0/guardian/sample/ExampleUnitTest.java | 2 +- 12 files changed, 31 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/auth0/guardian/sample/EnrollActivity.java b/app/src/main/java/com/auth0/guardian/sample/EnrollActivity.java index e01a09d..cbf2b9b 100644 --- a/app/src/main/java/com/auth0/guardian/sample/EnrollActivity.java +++ b/app/src/main/java/com/auth0/guardian/sample/EnrollActivity.java @@ -270,8 +270,7 @@ private KeyPair generateKeyPair() { try { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); // at least 2048 bits! - KeyPair keyPair = keyPairGenerator.generateKeyPair(); - return keyPair; + return keyPairGenerator.generateKeyPair(); } catch (NoSuchAlgorithmException e) { Log.e(TAG, "Error generating keys", e); } diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeGraphic.java b/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeGraphic.java index be1bb23..02c0f15 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeGraphic.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeGraphic.java @@ -46,10 +46,10 @@ class BarcodeGraphic extends GraphicOverlay.Graphic { private int id; private volatile Barcode barcode; - private Paint paint; - private AnimatorSet animatorSet; + private final Paint paint; + private final AnimatorSet animatorSet; private ArrayList animatorList; - private ArrayList rippleViewList = new ArrayList<>(); + private final ArrayList rippleViewList = new ArrayList<>(); private boolean shouldStartAnimation = true; BarcodeGraphic(GraphicOverlay overlay) { diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeGraphicTracker.java b/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeGraphicTracker.java index 6f6c038..bb602f9 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeGraphicTracker.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeGraphicTracker.java @@ -28,8 +28,8 @@ */ class BarcodeGraphicTracker extends Tracker { - private GraphicOverlay overlay; - private BarcodeGraphic graphic; + private final GraphicOverlay overlay; + private final BarcodeGraphic graphic; BarcodeGraphicTracker(GraphicOverlay overlay, BarcodeGraphic graphic) { this.overlay = overlay; diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeTrackerFactory.java b/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeTrackerFactory.java index 0c34280..0208123 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeTrackerFactory.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/BarcodeTrackerFactory.java @@ -34,8 +34,8 @@ */ class BarcodeTrackerFactory implements MultiProcessor.Factory { - private GraphicOverlay barcodeGraphicOverlay; - private BarcodeTrackerListener listener; + private final GraphicOverlay barcodeGraphicOverlay; + private final BarcodeTrackerListener listener; BarcodeTrackerFactory(GraphicOverlay barcodeGraphicOverlay, BarcodeTrackerListener listener) { diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/CaptureView.java b/app/src/main/java/com/auth0/guardian/sample/scanner/CaptureView.java index 6d1c666..539fa7a 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/CaptureView.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/CaptureView.java @@ -25,7 +25,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.hardware.Camera; -import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; @@ -97,7 +96,7 @@ private void init(Context context, AttributeSet attrs, int defStyle) { * the constant. */ @SuppressLint("InlinedApi") - private void createCameraSource(boolean autoFocus, boolean useFlash) { + private void createCameraSource() { Context context = getContext().getApplicationContext(); // A barcode detector is created to track barcodes. An associated multi-processor instance @@ -123,17 +122,17 @@ private void createCameraSource(boolean autoFocus, boolean useFlash) { .setFacing(CameraSource.CAMERA_FACING_BACK) .setRequestedPreviewSize(1024, 600) .setRequestedFps(15.0f) - .setFocusMode(autoFocus ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null); + .setFocusMode(true ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null); cameraSource = builder - .setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null) + .setFlashMode(false ? Camera.Parameters.FLASH_MODE_TORCH : null) .build(); } public void start(Listener listener) { Log.d(TAG, "start"); this.listener = listener; - createCameraSource(true, false); + createCameraSource(); } /** diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/camera/CameraSource.java b/app/src/main/java/com/auth0/guardian/sample/scanner/camera/CameraSource.java index 2f3ee39..c7b58ca 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/camera/CameraSource.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/camera/CameraSource.java @@ -158,7 +158,7 @@ public class CameraSource { * buffer. We use byte buffers internally because this is a more efficient way to call into * native code later (avoids a potential copy). */ - private Map mBytesToByteBuffer = new HashMap<>(); + private final Map mBytesToByteBuffer = new HashMap<>(); //============================================================================================== // Builder @@ -169,7 +169,7 @@ public class CameraSource { */ public static class Builder { private final Detector mDetector; - private CameraSource mCameraSource = new CameraSource(); + private final CameraSource mCameraSource = new CameraSource(); /** * Creates a camera source builder with the supplied context and detector. Camera preview @@ -863,7 +863,7 @@ private static SizePair selectSizePair(Camera camera, int desiredWidth, int desi * size is null, then there is no picture size with the same aspect ratio as the preview size. */ private static class SizePair { - private Size mPreview; + private final Size mPreview; private Size mPicture; public SizePair(Camera.Size previewSize, @@ -1066,7 +1066,7 @@ public void onPreviewFrame(byte[] data, Camera camera) { */ private class FrameProcessingRunnable implements Runnable { private Detector mDetector; - private long mStartTimeMillis = SystemClock.elapsedRealtime(); + private final long mStartTimeMillis = SystemClock.elapsedRealtime(); // This lock guards all of the member variables below. private final Object mLock = new Object(); diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/camera/CameraSourceCropPreview.java b/app/src/main/java/com/auth0/guardian/sample/scanner/camera/CameraSourceCropPreview.java index 8537a34..ace8b0c 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/camera/CameraSourceCropPreview.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/camera/CameraSourceCropPreview.java @@ -40,8 +40,8 @@ public class CameraSourceCropPreview extends ViewGroup { private static final String TAG = CameraSourceCropPreview.class.getName(); - private Context mContext; - private SurfaceView mSurfaceView; + private final Context mContext; + private final SurfaceView mSurfaceView; private boolean mStartRequested; private boolean mSurfaceAvailable; private CameraSource mCameraSource; diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/camera/GraphicOverlay.java b/app/src/main/java/com/auth0/guardian/sample/scanner/camera/GraphicOverlay.java index c3067fa..63073eb 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/camera/GraphicOverlay.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/camera/GraphicOverlay.java @@ -21,7 +21,6 @@ import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import java.util.HashSet; @@ -53,11 +52,11 @@ public class GraphicOverlay extends View { private int mPreviewHeight; private float mHeightScaleFactor = 1.0f; private int mFacing = CameraSource.CAMERA_FACING_BACK; - private Set mGraphics = new HashSet<>(); + private final Set mGraphics = new HashSet<>(); private T mFirstGraphic; - private Paint paint = new Paint(); - private Rect rect = new Rect(); + private final Paint paint = new Paint(); + private final Rect rect = new Rect(); /** * Base class for a custom graphics object to be rendered within the graphic overlay. Subclass @@ -68,7 +67,7 @@ public static abstract class Graphic { private static final String TAG = Graphic.class.getName(); - private GraphicOverlay mOverlay; + private final GraphicOverlay mOverlay; public Graphic(GraphicOverlay overlay) { mOverlay = overlay; diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/utils/Detector.java b/app/src/main/java/com/auth0/guardian/sample/scanner/utils/Detector.java index 9c8e8ad..f882403 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/utils/Detector.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/utils/Detector.java @@ -26,7 +26,7 @@ public abstract class Detector { - private Object lock = new Object(); + private final Object lock = new Object(); private Detector.Processor processor; public Detector() { @@ -82,9 +82,9 @@ public interface Processor { public static class Detections { - private SparseArray detectedItems; - private Frame.Metadata frameMetadata; - private boolean isOperational; + private final SparseArray detectedItems; + private final Frame.Metadata frameMetadata; + private final boolean isOperational; public Detections(SparseArray detectedItems, Frame.Metadata frameMetadata, boolean isOperational) { this.detectedItems = detectedItems; diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/utils/Frame.java b/app/src/main/java/com/auth0/guardian/sample/scanner/utils/Frame.java index b1633db..674a5b7 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/utils/Frame.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/utils/Frame.java @@ -33,7 +33,7 @@ public class Frame { public static final int ROTATION_180 = 2; public static final int ROTATION_270 = 3; - private Frame.Metadata metadata; + private final Frame.Metadata metadata; private ByteBuffer data; public Frame.Metadata getMetadata() { @@ -111,7 +111,7 @@ public String toString() { } public static class Builder { - private Frame frame = new Frame(); + private final Frame frame = new Frame(); public Builder() { } diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/utils/MultiProcessor.java b/app/src/main/java/com/auth0/guardian/sample/scanner/utils/MultiProcessor.java index 8c9f40c..8adfa78 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/utils/MultiProcessor.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/utils/MultiProcessor.java @@ -30,7 +30,7 @@ public class MultiProcessor implements Detector.Processor { private MultiProcessor.Factory factory; - private SparseArray trackers; + private final SparseArray trackers; private int maxGapFrames; public void release() { @@ -123,7 +123,7 @@ private TrackerCounter() { public static class Builder { - private MultiProcessor multiProcessor = new MultiProcessor(); + private final MultiProcessor multiProcessor = new MultiProcessor(); public Builder(MultiProcessor.Factory factory) { if (factory == null) { diff --git a/app/src/test/java/com/auth0/guardian/sample/ExampleUnitTest.java b/app/src/test/java/com/auth0/guardian/sample/ExampleUnitTest.java index c46e17e..e438478 100644 --- a/app/src/test/java/com/auth0/guardian/sample/ExampleUnitTest.java +++ b/app/src/test/java/com/auth0/guardian/sample/ExampleUnitTest.java @@ -9,7 +9,7 @@ */ public class ExampleUnitTest { @Test - public void addition_isCorrect() throws Exception { + public void addition_isCorrect() { assertEquals(4, 2 + 2); } } \ No newline at end of file From 141ca7624559c8921efc08e8a327f977b52531bb Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 4 Apr 2019 21:01:41 -0300 Subject: [PATCH 4/6] do not specify the BC provider --- .../com/auth0/android/guardian/sdk/GuardianAPIClient.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/guardian/src/main/java/com/auth0/android/guardian/sdk/GuardianAPIClient.java b/guardian/src/main/java/com/auth0/android/guardian/sdk/GuardianAPIClient.java index b51e9c2..4b563c1 100644 --- a/guardian/src/main/java/com/auth0/android/guardian/sdk/GuardianAPIClient.java +++ b/guardian/src/main/java/com/auth0/android/guardian/sdk/GuardianAPIClient.java @@ -37,7 +37,6 @@ import java.lang.reflect.Type; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; @@ -96,7 +95,8 @@ public GuardianAPIRequest> enroll(@NonNull String enrollment @NonNull String deviceName, @NonNull String gcmToken, @NonNull PublicKey publicKey) { - Type type = new TypeToken>() {}.getType(); + Type type = new TypeToken>() { + }.getType(); return requestFactory .>newRequest("POST", baseUrl.resolve("api/enroll"), type) .setHeader("Authorization", String.format("Ticket id=\"%s\"", enrollmentTicket)) @@ -224,12 +224,12 @@ private String createJWT(@NonNull PrivateKey privateKey, String headerAndPayload = base64UrlSafeEncode(gson.toJson(headers).getBytes()) + "." + base64UrlSafeEncode(gson.toJson(claims).getBytes()); final byte[] messageBytes = headerAndPayload.getBytes(); - final Signature signer = Signature.getInstance("SHA256withRSA", "BC"); + final Signature signer = Signature.getInstance("SHA256withRSA"); signer.initSign(privateKey); signer.update(messageBytes); byte[] signature = signer.sign(); return headerAndPayload + "." + base64UrlSafeEncode(signature); - } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | NoSuchProviderException e) { + } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) { throw new GuardianException("Unable to generate the signed JWT", e); } } From a5f5758c89a538b0f0028b80056de0efec38954d Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 4 Apr 2019 21:04:56 -0300 Subject: [PATCH 5/6] chore comments --- .../java/com/auth0/guardian/sample/scanner/CaptureView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/auth0/guardian/sample/scanner/CaptureView.java b/app/src/main/java/com/auth0/guardian/sample/scanner/CaptureView.java index 539fa7a..9efadaf 100644 --- a/app/src/main/java/com/auth0/guardian/sample/scanner/CaptureView.java +++ b/app/src/main/java/com/auth0/guardian/sample/scanner/CaptureView.java @@ -122,10 +122,10 @@ private void createCameraSource() { .setFacing(CameraSource.CAMERA_FACING_BACK) .setRequestedPreviewSize(1024, 600) .setRequestedFps(15.0f) - .setFocusMode(true ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null); + .setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); cameraSource = builder - .setFlashMode(false ? Camera.Parameters.FLASH_MODE_TORCH : null) + .setFlashMode(null) .build(); } From 06797a0d679ae651b61b6184dc2935e9f3399364 Mon Sep 17 00:00:00 2001 From: Luciano Balmaceda Date: Thu, 4 Apr 2019 21:19:38 -0300 Subject: [PATCH 6/6] fix CI by using a valid JSON structure on the google-services.json file --- app/google-services.json | 49 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/app/google-services.json b/app/google-services.json index fe3124f..ab7fcce 100644 --- a/app/google-services.json +++ b/app/google-services.json @@ -1,9 +1,52 @@ /* -** Replace this file with an actual google-services.json -** downloaded from the Firebase Console. +** THIS IS A SAMPLE CONFIGURATIONFILE WITH DUMMY DATA +** +** Replace this file with a valid google-services.json +** downloaded from the Firebase Console with your project details. ** See: https://console.firebase.google.com */ { - //Not a valid configuration file + "project_info": { + "project_number": "9999999999", + "firebase_url": "https://guardian.firebaseio.com", + "project_id": "guardian-fcm", + "storage_bucket": "guardian-fcm.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:9999999999:android:9999999999", + "android_client_info": { + "package_name": "com.auth0.guardian.sample" + } + }, + "oauth_client": [ + { + "client_id": "9999999999-j1oj123joojdsmnasdi123.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.auth0.guardian.sample", + "certificate_hash": "n123n132o132noi1n3nnodon123" + } + } + ], + "api_key": [ + { + "current_key": "ANskdaSNDOsdno-ASKdknasdnsdKSD" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "9999999999-j1oj123joojdsmnasdi123.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" } \ No newline at end of file