diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8b49bf0e..0ff29eb6 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -182,11 +182,6 @@ jobs: with: lane: build options: '{ "flavor": "safaridoctors_kenya" }' - - name: Assemble simprints - uses: maierj/fastlane-action@v1.4.0 - with: - lane: build - options: '{ "flavor": "simprints" }' - name: Assemble surveillance_covid19_kenya uses: maierj/fastlane-action@v1.4.0 with: diff --git a/build.gradle b/build.gradle index 987785fb..6baf06b9 100644 --- a/build.gradle +++ b/build.gradle @@ -30,8 +30,6 @@ repositories { } } -def simprintsApiKey, simprintsModuleId, simprintsUserId - def getVersionCode = { int versionCode = 2 if (System.env.CI == 'true' && System.env.RELEASE_VERSION && System.env.RELEASE_VERSION.startsWith('v')) { @@ -97,30 +95,6 @@ android { buildConfigField "String", "LOG_TAG", '"MedicMobile"' buildConfigField "Long", "TTL_LAST_URL", '24l * 60 * 60 * 1000' // 24 hs max time last URL loaded is remembered - if (System.env.SIMPRINTS_API_KEY) { - buildConfigField "String", "SIMPRINTS_API_KEY", /"${System.env.SIMPRINTS_API_KEY}"/ - } else if (simprintsApiKey) { - buildConfigField "String", "SIMPRINTS_API_KEY", /"${simprintsApiKey}"/ - } else { - buildConfigField "String", "SIMPRINTS_API_KEY", /"Medic's API Key"/ - } - - if (System.env.SIMPRINTS_USER_ID) { - buildConfigField "String", "SIMPRINTS_USER_ID", /"${System.env.SIMPRINTS_USER_ID}"/ - } else if (simprintsUserId) { - buildConfigField "String", "SIMPRINTS_USER_ID", /"${simprintsUserId}"/ - } else { - buildConfigField "String", "SIMPRINTS_USER_ID", '"some-user-id"' - } - - if (System.env.SIMPRINTS_MODULE_ID) { - buildConfigField "String", "SIMPRINTS_MODULE_ID", /"${System.env.SIMPRINTS_MODULE_ID}"/ - } else if (simprintsModuleId) { - buildConfigField "String", "SIMPRINTS_MODULE_ID", /"${simprintsModuleId}"/ - } else { - buildConfigField "String", "SIMPRINTS_MODULE_ID", '"Medic Module ID"' - } - // Every APK requires a unique version code. // So when compiling multiple APKS for the different ABIs, use the first digit variant.outputs.each { output -> @@ -144,7 +118,7 @@ android { } release { minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'config/libsimprints.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') shrinkResources true signingConfig signingConfigs.release } @@ -188,9 +162,6 @@ android { // for `unbranded` - it will use the defaults in // src/main dimension = 'brand' - simprintsApiKey = 'f4c47c4e-d6ee-444f-b16e-22a4761b1f3c' - simprintsModuleId = 'simprints.app' - simprintsUserId = 'test@simprints.app' } medicmobiledemo { @@ -308,15 +279,6 @@ android { applicationId = 'org.medicmobile.webapp.mobile.safaridoctors_kenya' } - simprints { - dimension = 'brand' - applicationId = 'org.medicmobile.webapp.mobile.simprints' - - simprintsApiKey = 'f4c47c4e-d6ee-444f-b16e-22a4761b1f3c' - simprintsModuleId = 'simprints.app' - simprintsUserId = 'test@simprints.app' - } - vhw_burundi { dimension = 'brand' applicationId = 'org.medicmobile.webapp.mobile.vhw_burundi' @@ -396,7 +358,6 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.simprints:LibSimprints:1.0.11' implementation 'com.github.Mariovc:ImagePicker:1.2.2' // Latest version of androidx.core requires Android 12+ // noinspection GradleDependency diff --git a/config/libsimprints.pro b/config/libsimprints.pro deleted file mode 100644 index d334fee2..00000000 --- a/config/libsimprints.pro +++ /dev/null @@ -1,3 +0,0 @@ --keep class com.simprints.libsimprints.* implements android.os.Parcelable { - *; -} diff --git a/gradle.properties b/gradle.properties index 8a3062f7..07f6f783 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ android.useAndroidX=true -# Remove 'android.enableJetifier=true' when dropping the libraries: com.simprints:LibSimprints and com.github.Mariovc:ImagePicker. +# Remove 'android.enableJetifier=true' when dropping the library: com.github.Mariovc:ImagePicker. android.enableJetifier=true org.gradle.jvmargs=-Xmx2048m diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 1fa8a3f6..232efd8e 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -69,9 +69,6 @@ - - - diff --git a/src/main/java/org/medicmobile/webapp/mobile/ChtExternalAppHandler.java b/src/main/java/org/medicmobile/webapp/mobile/ChtExternalAppHandler.java index 07239190..5cad0911 100644 --- a/src/main/java/org/medicmobile/webapp/mobile/ChtExternalAppHandler.java +++ b/src/main/java/org/medicmobile/webapp/mobile/ChtExternalAppHandler.java @@ -3,8 +3,7 @@ import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.app.Activity.RESULT_OK; import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.ACCESS_STORAGE_PERMISSION_REQUEST_CODE; -import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE; +import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.RequestCode; import static org.medicmobile.webapp.mobile.JavascriptUtils.safeFormat; import static org.medicmobile.webapp.mobile.MedicLog.error; import static org.medicmobile.webapp.mobile.MedicLog.trace; @@ -59,7 +58,11 @@ void startIntent(ChtExternalApp chtExternalApp) { if (ContextCompat.checkSelfPermission(this.context, READ_EXTERNAL_STORAGE) != PERMISSION_GRANTED) { trace(this, "ChtExternalAppHandler :: Requesting storage permissions to process image files taken from external apps"); this.lastIntent = intent; // Saving intent to start it when permission is granted. - ActivityCompat.requestPermissions(this.context, PERMISSIONS_STORAGE, ACCESS_STORAGE_PERMISSION_REQUEST_CODE); + ActivityCompat.requestPermissions( + this.context, + PERMISSIONS_STORAGE, + RequestCode.ACCESS_STORAGE_PERMISSION.getCode() + ); return; } @@ -80,7 +83,7 @@ void resumeActivity() { private void startActivity(Intent intent) { try { trace(this, "ChtExternalAppHandler :: Starting activity %s %s", intent, intent.getExtras()); - this.context.startActivityForResult(intent, CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE); + this.context.startActivityForResult(intent, RequestCode.CHT_EXTERNAL_APP_ACTIVITY.getCode()); } catch (Exception exception) { error(exception, "ChtExternalAppHandler :: Error when starting the activity %s %s", intent, intent.getExtras()); diff --git a/src/main/java/org/medicmobile/webapp/mobile/EmbeddedBrowserActivity.java b/src/main/java/org/medicmobile/webapp/mobile/EmbeddedBrowserActivity.java index 8a8c06a4..d8557c03 100644 --- a/src/main/java/org/medicmobile/webapp/mobile/EmbeddedBrowserActivity.java +++ b/src/main/java/org/medicmobile/webapp/mobile/EmbeddedBrowserActivity.java @@ -37,31 +37,25 @@ import androidx.core.content.ContextCompat; import java.util.Arrays; +import java.util.Optional; @SuppressWarnings({ "PMD.GodClass", "PMD.TooManyMethods" }) public class EmbeddedBrowserActivity extends LockableActivity { - /** - * Any activity result with all 3 low bits set is _not_ a simprints result. - * - * The following block of bit-shifted integers are intended for use in the subsystem seen - * in the onActivityResult below. These integers respect the reserved block of integers - * which are used by simprints. Simprint intents are started in the webapp where a matching - * bitmask is used to respect the scheme on that side of things. - * */ - private static final int NON_SIMPRINTS_FLAGS = 0x7; - static final int GRAB_PHOTO_ACTIVITY_REQUEST_CODE = (0 << 3) | NON_SIMPRINTS_FLAGS; - static final int GRAB_MRDT_PHOTO_ACTIVITY_REQUEST_CODE = (1 << 3) | NON_SIMPRINTS_FLAGS; - static final int DISCLOSURE_LOCATION_ACTIVITY_REQUEST_CODE = (2 << 3) | NON_SIMPRINTS_FLAGS; - static final int ACCESS_STORAGE_PERMISSION_REQUEST_CODE = (3 << 3) | NON_SIMPRINTS_FLAGS; - static final int CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE = (4 << 3) | NON_SIMPRINTS_FLAGS; - static final int ACCESS_LOCATION_PERMISSION_REQUEST_CODE = (5 << 3) | NON_SIMPRINTS_FLAGS; + + private WebView container; + private SettingsStore settings; + private String appUrl; + private MrdtSupport mrdt; + private PhotoGrabber photoGrabber; + private SmsSender smsSender; + private ChtExternalAppHandler chtExternalAppHandler; + private boolean isMigrationRunning = false; static final String[] LOCATION_PERMISSIONS = { ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION }; private static final ValueCallback IGNORE_RESULT = new ValueCallback() { public void onReceiveValue(String result) { /* ignore */ } }; - private final ValueCallback backButtonHandler = new ValueCallback() { public void onReceiveValue(String result) { if(!"true".equals(result)) { @@ -70,16 +64,6 @@ public void onReceiveValue(String result) { } }; - private WebView container; - private SettingsStore settings; - private String appUrl; - private SimprintsSupport simprints; - private MrdtSupport mrdt; - private PhotoGrabber photoGrabber; - private SmsSender smsSender; - private ChtExternalAppHandler chtExternalAppHandler; - - private boolean isMigrationRunning = false; //> ACTIVITY LIFECYCLE METHODS @Override public void onCreate(Bundle savedInstanceState) { @@ -87,7 +71,6 @@ public void onReceiveValue(String result) { trace(this, "Starting webview..."); - this.simprints = new SimprintsSupport(this); this.photoGrabber = new PhotoGrabber(this); this.mrdt = new MrdtSupport(this); this.chtExternalAppHandler = new ChtExternalAppHandler(this); @@ -210,48 +193,56 @@ protected void onStop() { backButtonHandler); } - @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { - try { - trace(this, "onActivityResult() :: requestCode=%s, resultCode=%s", - requestCodeToString(requestCode), resultCode); + @Override protected void onActivityResult(int requestCd, int resultCode, Intent intent) { + Optional requestCodeOpt = RequestCode.valueOf(requestCd); - if((requestCode & NON_SIMPRINTS_FLAGS) != NON_SIMPRINTS_FLAGS) { - String js = simprints.process(requestCode, intent); - trace(this, "Executing JavaScript: %s", js); - evaluateJavascript(js); - return; - } + if (!requestCodeOpt.isPresent()) { + trace(this, "onActivityResult() :: no handling for requestCode=%s", requestCd); + return; + } - switch(requestCode) { - case GRAB_PHOTO_ACTIVITY_REQUEST_CODE: + RequestCode requestCode = requestCodeOpt.get(); + + try { + trace(this, "onActivityResult() :: requestCode=%s, resultCode=%s", requestCode.name(), resultCode); + + switch (requestCode) { + case GRAB_PHOTO_ACTIVITY: photoGrabber.process(requestCode, resultCode, intent); return; - case GRAB_MRDT_PHOTO_ACTIVITY_REQUEST_CODE: + case GRAB_MRDT_PHOTO_ACTIVITY: processMrdtResult(requestCode, resultCode, intent); return; - case DISCLOSURE_LOCATION_ACTIVITY_REQUEST_CODE: + case DISCLOSURE_LOCATION_ACTIVITY: processLocationPermissionResult(resultCode); return; - case CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE: + case CHT_EXTERNAL_APP_ACTIVITY: processChtExternalAppResult(resultCode, intent); return; default: - trace(this, "onActivityResult() :: no handling for requestCode=%s", - requestCodeToString(requestCode)); + trace(this, "onActivityResult() :: no handling for requestCode=%s", requestCode.name()); } - } catch(Exception ex) { + } catch (Exception ex) { String action = intent == null ? null : intent.getAction(); warn(ex, "Problem handling intent %s (%s) with requestCode=%s & resultCode=%s", - intent, action, requestCodeToString(requestCode), resultCode); + intent, action, requestCode.name(), resultCode); } } @Override - public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); + public void onRequestPermissionsResult(int requestCd, String[] permissions, int[] grantResults) { + Optional requestCodeOpt = RequestCode.valueOf(requestCd); + + if (!requestCodeOpt.isPresent()) { + trace(this, "onRequestPermissionsResult() :: no handling for requestCode=%s", requestCd); + return; + } + + RequestCode requestCode = requestCodeOpt.get(); + super.onRequestPermissionsResult(requestCd, permissions, grantResults); boolean granted = grantResults.length > 0 && grantResults[0] == PERMISSION_GRANTED; - if (requestCode == ACCESS_LOCATION_PERMISSION_REQUEST_CODE) { + if (requestCode == RequestCode.ACCESS_LOCATION_PERMISSION) { if (granted) { locationRequestResolved(); return; @@ -260,7 +251,7 @@ public void onRequestPermissionsResult(int requestCode, String[] permissions, in return; } - if (requestCode == ACCESS_STORAGE_PERMISSION_REQUEST_CODE) { + if (requestCode == RequestCode.ACCESS_STORAGE_PERMISSION) { if (granted) { this.chtExternalAppHandler.resumeActivity(); return; @@ -271,10 +262,6 @@ public void onRequestPermissionsResult(int requestCode, String[] permissions, in } //> ACCESSORS - SimprintsSupport getSimprintsSupport() { - return this.simprints; - } - MrdtSupport getMrdtSupport() { return this.mrdt; } @@ -334,7 +321,7 @@ public boolean getLocationPermissions() { trace(this, "getLocationPermissions() :: location not granted before, requesting access..."); Intent intent = new Intent(this, RequestPermissionActivity.class); - startActivityForResult(intent, DISCLOSURE_LOCATION_ACTIVITY_REQUEST_CODE); + startActivityForResult(intent, RequestCode.DISCLOSURE_LOCATION_ACTIVITY.getCode()); return false; } @@ -343,38 +330,25 @@ public void locationRequestResolved() { } //> PRIVATE HELPERS - private String requestCodeToString(int requestCode) { - switch (requestCode) { - case ACCESS_LOCATION_PERMISSION_REQUEST_CODE: - return "ACCESS_LOCATION_PERMISSION_REQUEST_CODE"; - case DISCLOSURE_LOCATION_ACTIVITY_REQUEST_CODE: - return "DISCLOSURE_LOCATION_ACTIVITY_REQUEST_CODE"; - case GRAB_PHOTO_ACTIVITY_REQUEST_CODE: - return "GRAB_PHOTO_ACTIVITY_REQUEST_CODE"; - case GRAB_MRDT_PHOTO_ACTIVITY_REQUEST_CODE: - return "GRAB_MRDT_PHOTO_ACTIVITY_REQUEST_CODE"; - case CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE: - return "CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE"; - default: - return String.valueOf(requestCode); - } - } - private void processChtExternalAppResult(int resultCode, Intent intentData) { String script = this.chtExternalAppHandler.processResult(resultCode, intentData); trace(this, "ChtExternalAppHandler :: Executing JavaScript: %s", script); evaluateJavascript(script); } - private void processMrdtResult(int requestCode, int resultCode, Intent intent) { - String js = mrdt.process(requestCode, resultCode, intent); + private void processMrdtResult(RequestCode requestCode, int resultCode, Intent intent) { + String js = mrdt.process(requestCode, intent); trace(this, "Executing JavaScript: %s", js); evaluateJavascript(js); } private void processLocationPermissionResult(int resultCode) { if (resultCode == RESULT_OK) { - ActivityCompat.requestPermissions(this, LOCATION_PERMISSIONS, ACCESS_LOCATION_PERMISSION_REQUEST_CODE); + ActivityCompat.requestPermissions( + this, + LOCATION_PERMISSIONS, + RequestCode.ACCESS_LOCATION_PERMISSION.getCode() + ); } else if (resultCode == RESULT_CANCELED) { processGeolocationDeniedStatus(); } @@ -488,4 +462,32 @@ private void registerRetryConnectionBroadcastReceiver() { }; registerReceiver(broadcastReceiver, new IntentFilter("retryConnection")); } + +//> ENUMS + public enum RequestCode { + ACCESS_LOCATION_PERMISSION(100), + ACCESS_STORAGE_PERMISSION(101), + CHT_EXTERNAL_APP_ACTIVITY(102), + DISCLOSURE_LOCATION_ACTIVITY(103), + GRAB_MRDT_PHOTO_ACTIVITY(104), + GRAB_PHOTO_ACTIVITY(105); + + private final int requestCode; + + RequestCode(int requestCode) { + this.requestCode = requestCode; + } + + public static Optional valueOf(int code) { + return Arrays + .stream(RequestCode.values()) + .filter(e -> e.getCode() == code) + .findFirst(); + } + + public int getCode() { + return requestCode; + } + } + } diff --git a/src/main/java/org/medicmobile/webapp/mobile/MedicAndroidJavascript.java b/src/main/java/org/medicmobile/webapp/mobile/MedicAndroidJavascript.java index 5994b1d6..cc839b34 100644 --- a/src/main/java/org/medicmobile/webapp/mobile/MedicAndroidJavascript.java +++ b/src/main/java/org/medicmobile/webapp/mobile/MedicAndroidJavascript.java @@ -42,7 +42,6 @@ public class MedicAndroidJavascript { private static final String DATE_FORMAT = "yyyy-MM-dd"; private final EmbeddedBrowserActivity parent; - private final SimprintsSupport simprints; private final MrdtSupport mrdt; private final SmsSender smsSender; private final ChtExternalAppHandler chtExternalAppHandler; @@ -53,7 +52,6 @@ public class MedicAndroidJavascript { public MedicAndroidJavascript(EmbeddedBrowserActivity parent) { this.parent = parent; - this.simprints = parent.getSimprintsSupport(); this.mrdt = parent.getMrdtSupport(); this.smsSender = parent.getSmsSender(); this.chtExternalAppHandler = parent.getChtExternalAppLauncherActivity(); @@ -162,38 +160,6 @@ public void mrdt_verify() { } } - /** - * @return {@code true} iff an app is available to handle supported simprints {@code Intent}s - */ - @android.webkit.JavascriptInterface - public boolean simprints_available() { - try { - return simprints.isAppInstalled(); - } catch(Exception ex) { - logException(ex); - return false; - } - } - - @android.webkit.JavascriptInterface - public void simprints_ident(int targetInputId) { - try { - simprints.startIdent(targetInputId); - } catch(Exception ex) { - logException(ex); - } - } - - @android.webkit.JavascriptInterface - public void simprints_reg(int targetInputId) { - try { - simprints.startReg(targetInputId); - } catch(Exception ex) { - logException(ex); - } - } - - @android.webkit.JavascriptInterface public boolean sms_available() { return smsSender != null; diff --git a/src/main/java/org/medicmobile/webapp/mobile/MrdtSupport.java b/src/main/java/org/medicmobile/webapp/mobile/MrdtSupport.java index b3553ec8..bc603a49 100644 --- a/src/main/java/org/medicmobile/webapp/mobile/MrdtSupport.java +++ b/src/main/java/org/medicmobile/webapp/mobile/MrdtSupport.java @@ -6,7 +6,7 @@ //import org.json.JSONException; -import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.GRAB_MRDT_PHOTO_ACTIVITY_REQUEST_CODE; +import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.RequestCode; import static org.medicmobile.webapp.mobile.JavascriptUtils.safeFormat; import static org.medicmobile.webapp.mobile.MedicLog.trace; import static org.medicmobile.webapp.mobile.MedicLog.warn; @@ -26,14 +26,14 @@ boolean isAppInstalled() { } void startVerify() { - ctx.startActivityForResult(verifyIntent(), GRAB_MRDT_PHOTO_ACTIVITY_REQUEST_CODE); + ctx.startActivityForResult(verifyIntent(), RequestCode.GRAB_MRDT_PHOTO_ACTIVITY.getCode()); } - String process(int requestCode, int resultCode, Intent i) { - trace(this, "process() :: requestCode=%s", requestCode); + String process(RequestCode requestCode, Intent i) { + trace(this, "process() :: requestCode=%s", requestCode.name()); - switch(requestCode) { - case GRAB_MRDT_PHOTO_ACTIVITY_REQUEST_CODE: { + switch (requestCode) { + case GRAB_MRDT_PHOTO_ACTIVITY: { try { byte[] data = i.getByteArrayExtra("data"); String base64data = Base64.encodeToString(data, Base64.NO_WRAP); @@ -51,7 +51,7 @@ String process(int requestCode, int resultCode, Intent i) { } } - default: throw new RuntimeException("Bad request type: " + requestCode); + default: throw new RuntimeException("Bad request type: " + requestCode.name()); } } diff --git a/src/main/java/org/medicmobile/webapp/mobile/PhotoGrabber.java b/src/main/java/org/medicmobile/webapp/mobile/PhotoGrabber.java index 34d4b893..72cebd8b 100644 --- a/src/main/java/org/medicmobile/webapp/mobile/PhotoGrabber.java +++ b/src/main/java/org/medicmobile/webapp/mobile/PhotoGrabber.java @@ -17,7 +17,7 @@ import static android.provider.MediaStore.ACTION_IMAGE_CAPTURE; import static com.mvc.imagepicker.ImagePicker.getImageFromResult; import static com.mvc.imagepicker.ImagePicker.getPickImageIntent; -import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.GRAB_PHOTO_ACTIVITY_REQUEST_CODE; +import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.RequestCode; import static org.medicmobile.webapp.mobile.MedicLog.log; import static org.medicmobile.webapp.mobile.MedicLog.trace; import static org.medicmobile.webapp.mobile.MedicLog.warn; @@ -64,9 +64,9 @@ void chooser(ValueCallback callback, boolean capture) { else pickImage(); } - void process(int requestCode, int resultCode, Intent i) { + void process(RequestCode requestCode, int resultCode, Intent i) { if(uploadCallback == null) { - warn(this, "uploadCallback is null for requestCode %s", requestCode); + warn(this, "uploadCallback is null for requestCode %s", requestCode.name()); return; } @@ -112,14 +112,14 @@ public void run() { } private void takePhoto() { - a.startActivityForResult(cameraIntent(), GRAB_PHOTO_ACTIVITY_REQUEST_CODE); + a.startActivityForResult(cameraIntent(), RequestCode.GRAB_PHOTO_ACTIVITY.getCode()); } private void pickImage() { trace(this, "picking image intent"); Intent i = getPickImageIntent(a, a.getString(R.string.promptChooseImage)); trace(this, "starting activity :: %s", i); - a.startActivityForResult(i, GRAB_PHOTO_ACTIVITY_REQUEST_CODE); + a.startActivityForResult(i, RequestCode.GRAB_PHOTO_ACTIVITY.getCode()); } private boolean canStartCamera() { diff --git a/src/main/java/org/medicmobile/webapp/mobile/SimprintsSupport.java b/src/main/java/org/medicmobile/webapp/mobile/SimprintsSupport.java deleted file mode 100644 index be79efef..00000000 --- a/src/main/java/org/medicmobile/webapp/mobile/SimprintsSupport.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.medicmobile.webapp.mobile; - -import android.app.Activity; -import android.content.Intent; - -import com.simprints.libsimprints.Identification; -import com.simprints.libsimprints.Registration; -import com.simprints.libsimprints.SimHelper; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONException; - -import static com.simprints.libsimprints.Constants.SIMPRINTS_IDENTIFICATIONS; -import static com.simprints.libsimprints.Constants.SIMPRINTS_REGISTRATION; -import static org.medicmobile.webapp.mobile.BuildConfig.SIMPRINTS_API_KEY; -import static org.medicmobile.webapp.mobile.BuildConfig.SIMPRINTS_MODULE_ID; -import static org.medicmobile.webapp.mobile.BuildConfig.SIMPRINTS_USER_ID; -import static org.medicmobile.webapp.mobile.JavascriptUtils.safeFormat; -import static org.medicmobile.webapp.mobile.MedicLog.log; -import static org.medicmobile.webapp.mobile.MedicLog.trace; -import static org.medicmobile.webapp.mobile.MedicLog.warn; -import static org.medicmobile.webapp.mobile.Utils.intentHandlerAvailableFor; -import static org.medicmobile.webapp.mobile.Utils.json; - -final class SimprintsSupport { - private static final int INTENT_TYPE_MASK = 0x7; - private static final int INTENT_ID_MASK = 0xFFFFF8; - - // future: private static final int INTENT_CONFIRM_IDENTITY = 1; - private static final int INTENT_IDENTIFY = 2; - private static final int INTENT_REGISTER = 3; - // future: private static final int INTENT_UPDATE = 4; - // future: private static final int INTENT_VERIFY = 5; - - private final Activity ctx; - - SimprintsSupport(Activity ctx) { - this.ctx = ctx; - } - - boolean isAppInstalled() { - return - intentHandlerAvailableFor(ctx, regIntent()) && - intentHandlerAvailableFor(ctx, identIntent()); - } - - void startIdent(int targetInputId) { - checkValid(targetInputId); - ctx.startActivityForResult(identIntent(), targetInputId | INTENT_IDENTIFY); - } - - void startReg(int targetInputId) { - checkValid(targetInputId); - ctx.startActivityForResult(regIntent(), targetInputId | INTENT_REGISTER); - } - - String process(int requestCode, Intent i) { - int requestType = requestCode & INTENT_TYPE_MASK; - int requestId = requestCode & INTENT_ID_MASK; - - trace(this, "process() :: requestType=%s, requestCode=%s", requestType, requestCode); - - switch(requestType) { - case INTENT_IDENTIFY: { - try { - JSONArray result = new JSONArray(); - if(i != null && i.hasExtra(SIMPRINTS_IDENTIFICATIONS)) { - List ids = i.getParcelableArrayListExtra(SIMPRINTS_IDENTIFICATIONS); - for(Identification id : ids) { - result.put(json( - "id", id.getGuid(), - "confidence", id.getConfidence(), - "tier", id.getTier() - )); - } - } - - log(this, "Simprints ident returned IDs: " + result + "; requestId=" + requestId); - - return jsResponse("identify", requestId, result); - } catch(JSONException ex) { - warn(ex, "Problem serialising simprints identifications."); - return safeFormat("console.log('Problem serialising simprints identifications: %s')", ex); - } - } - - case INTENT_REGISTER: { - try { - if(i == null || !i.hasExtra(SIMPRINTS_REGISTRATION)) return "console.log('No registration data returned from simprints app.')"; - Registration registration = i.getParcelableExtra(SIMPRINTS_REGISTRATION); - String id = registration.getGuid(); - log(this, "Simprints registration returned ID: " + id + "; requestId=" + requestCode); - return jsResponse("register", requestId, json("id", id)); - } catch(JSONException ex) { - warn(ex, "Problem serialising simprints registration result."); - return safeFormat("console.log('Problem serialising simprints registration result: %s')", ex); - } - } - - default: throw new RuntimeException("Bad request type: " + requestType); - } - } - -//> PRIVATE HELPERS - private Intent identIntent() { - return simHelper().identify(SIMPRINTS_MODULE_ID); - } - - private Intent regIntent() { - return simHelper().register(SIMPRINTS_MODULE_ID); - } - - private String jsResponse(String requestType, int requestId, Object result) { - return safeFormat("angular.element(document.body).injector().get('AndroidApi').v1.simprintsResponse('%s', '%s', '%s')", requestType, requestId, result); - } - -//> STATIC HELPERS - private static SimHelper simHelper() { - return new SimHelper(SIMPRINTS_API_KEY, SIMPRINTS_USER_ID); - } - - private static void checkValid(int targetInputId) { - if(targetInputId != (targetInputId & INTENT_ID_MASK)) throw new RuntimeException("Bad targetInputId: " + targetInputId); - } -} diff --git a/src/simprints/res/values/strings.xml b/src/simprints/res/values/strings.xml deleted file mode 100644 index 1a3793a8..00000000 --- a/src/simprints/res/values/strings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - Medic - Simprints - simprints.app.medicmobile.org - diff --git a/src/test/java/org/medicmobile/webapp/mobile/ChtExternalAppHandlerTest.java b/src/test/java/org/medicmobile/webapp/mobile/ChtExternalAppHandlerTest.java index 8c0a2ac0..0e88681b 100644 --- a/src/test/java/org/medicmobile/webapp/mobile/ChtExternalAppHandlerTest.java +++ b/src/test/java/org/medicmobile/webapp/mobile/ChtExternalAppHandlerTest.java @@ -15,8 +15,7 @@ import androidx.core.app.ActivityCompat; import static org.junit.Assert.assertEquals; -import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.ACCESS_STORAGE_PERMISSION_REQUEST_CODE; -import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE; +import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.RequestCode; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -175,7 +174,7 @@ public void startIntent_withValidIntent_startsIntentCorrectly() { //> THEN verify(chtExternalApp).createIntent(); - verify(mockContext).startActivityForResult(eq(intent), eq(CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE)); + verify(mockContext).startActivityForResult(eq(intent), eq(RequestCode.CHT_EXTERNAL_APP_ACTIVITY.getCode())); } @Test @@ -198,7 +197,7 @@ public void startIntent_withException_catchesException() { //> THEN verify(chtExternalApp).createIntent(); - verify(mockContext).startActivityForResult(eq(intent), eq(CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE)); + verify(mockContext).startActivityForResult(eq(intent), eq(RequestCode.CHT_EXTERNAL_APP_ACTIVITY.getCode())); medicLogMock.verify(() -> MedicLog.error( any(), eq("ChtExternalAppHandler :: Error when starting the activity %s %s"), @@ -228,7 +227,11 @@ public void startIntent_withoutStoragePermissions_requestsPermissions() { //> THEN verify(chtExternalApp).createIntent(); contextCompatMock.verify(() -> ContextCompat.checkSelfPermission(mockContext, READ_EXTERNAL_STORAGE)); - activityCompatMock.verify(() -> ActivityCompat.requestPermissions(mockContext, new String[]{READ_EXTERNAL_STORAGE}, ACCESS_STORAGE_PERMISSION_REQUEST_CODE)); + activityCompatMock.verify(() -> ActivityCompat.requestPermissions( + mockContext, + new String[]{READ_EXTERNAL_STORAGE}, + RequestCode.ACCESS_STORAGE_PERMISSION.getCode() + )); verify(mockContext, never()).startActivityForResult(any(), anyInt()); } @@ -261,8 +264,12 @@ public void resumeActivity_withLastIntent_startsIntentCorrectly() { //> THEN verify(chtExternalApp).createIntent(); contextCompatMock.verify(() -> ContextCompat.checkSelfPermission(mockContext, READ_EXTERNAL_STORAGE)); - activityCompatMock.verify(() -> ActivityCompat.requestPermissions(mockContext, new String[]{READ_EXTERNAL_STORAGE}, ACCESS_STORAGE_PERMISSION_REQUEST_CODE)); - verify(mockContext).startActivityForResult(eq(intent), eq(CHT_EXTERNAL_APP_ACTIVITY_REQUEST_CODE)); + activityCompatMock.verify(() -> ActivityCompat.requestPermissions( + mockContext, + new String[]{READ_EXTERNAL_STORAGE}, + RequestCode.ACCESS_STORAGE_PERMISSION.getCode() + )); + verify(mockContext).startActivityForResult(eq(intent), eq(RequestCode.CHT_EXTERNAL_APP_ACTIVITY.getCode())); } } diff --git a/src/test/java/org/medicmobile/webapp/mobile/EmbeddedBrowserActivityTest.java b/src/test/java/org/medicmobile/webapp/mobile/EmbeddedBrowserActivityTest.java index 2a4d87db..2e2357e2 100644 --- a/src/test/java/org/medicmobile/webapp/mobile/EmbeddedBrowserActivityTest.java +++ b/src/test/java/org/medicmobile/webapp/mobile/EmbeddedBrowserActivityTest.java @@ -8,7 +8,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.ACCESS_LOCATION_PERMISSION_REQUEST_CODE; +import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.RequestCode; import static org.medicmobile.webapp.mobile.EmbeddedBrowserActivity.LOCATION_PERMISSIONS; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -125,7 +125,7 @@ public void getLocationPermissions_withPermissionsDenied_requestPermissions() { activityCompatMock.verify(() -> ActivityCompat.requestPermissions( embeddedBrowserActivity, LOCATION_PERMISSIONS, - ACCESS_LOCATION_PERMISSION_REQUEST_CODE + RequestCode.ACCESS_LOCATION_PERMISSION.getCode() )); Intents.release();