From d1e5d43db92d40909232e3584edf46da0f40e6c9 Mon Sep 17 00:00:00 2001 From: Serhii <97525749+serhii-koreniuk-cko@users.noreply.github.com> Date: Mon, 25 Apr 2022 15:21:38 +0300 Subject: [PATCH] POINT-229: Android SDK - Fill in device data automatically (#33) --- app/src/main/AndroidManifest.xml | 1 + .../main/res/xml/network_security_config.xml | 6 +++ .../processout/processout_sdk/ProcessOut.java | 44 +++++++++++++++++-- 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/xml/network_security_config.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f64dd8c6..3e153c18 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:networkSecurityConfig="@xml/network_security_config" android:theme="@style/AppTheme" > + + + 10.0.2.2 + + \ No newline at end of file diff --git a/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java b/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java index b7af1132..8176e716 100644 --- a/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java +++ b/processout-sdk/src/main/java/com/processout/processout_sdk/ProcessOut.java @@ -5,10 +5,13 @@ import android.content.Context; import android.content.DialogInterface; import android.net.Uri; -import androidx.annotation.NonNull; +import android.os.Build; +import android.util.DisplayMetrics; import android.view.ViewGroup; import android.widget.FrameLayout; +import androidx.annotation.NonNull; + import com.android.volley.Request; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -24,7 +27,9 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; +import java.util.Calendar; import java.util.HashMap; +import java.util.Locale; import java.util.Map; /** @@ -33,7 +38,7 @@ public class ProcessOut { - public static final String SDK_VERSION = "v2.16.0"; + public static final String SDK_VERSION = "v2.17.0"; private String projectId; private Context context; @@ -69,10 +74,14 @@ public void tokenize(@NonNull Card card, JSONObject metadata, @NonNull final Tok private void tokenizeBase(@NonNull Card card, JSONObject metadata, @NonNull final TokenCallback callback) { JSONObject body = null; + try { body = new JSONObject(gson.toJson(card)); if (metadata != null) body.put("metadata", metadata); + + body.put("device", new JSONObject(getDeviceInfo())); + Network.getInstance(this.context, this.projectId).CallProcessOut("/cards", Request.Method.POST, body, new Network.NetworkResult() { @Override public void onError(Exception error) { @@ -94,6 +103,30 @@ public void onSuccess(JSONObject json) { } } + private Map getDeviceInfo() { + Map deviceInfo = new HashMap<>(); + + Calendar calendar = Calendar.getInstance(); + int tzOffsetMin = -(calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET))/(1000*60); + + DisplayMetrics metrics = this.context.getResources().getDisplayMetrics(); + + Locale locale = this.context.getResources().getConfiguration().locale; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + deviceInfo.put("app_language", locale.toLanguageTag()); + } else { + deviceInfo.put("app_language", locale.getLanguage()); + } + + deviceInfo.put("app_language", locale.getLanguage()); + deviceInfo.put("app_screen_width", metrics.widthPixels); + deviceInfo.put("app_screen_height", metrics.heightPixels); + deviceInfo.put("app_timezone_offset", tzOffsetMin); + + return deviceInfo; + } + /** * Updates the CVC of a previously stored card * @@ -105,6 +138,9 @@ public void updateCvc(@NonNull Card card, @NonNull final CvcUpdateCallback callb try { body = new JSONObject(gson.toJson(card)); + + body.put("device", new JSONObject(getDeviceInfo())); + Network.getInstance( this.context, this.projectId).CallProcessOut( "/cards/" + card.getId(), @@ -482,6 +518,7 @@ public void makeCardToken(@NonNull final String source, @NonNull final String cu try { TokenRequest request = new TokenRequest(source); final JSONObject body = new JSONObject(gson.toJson(request)); + body.put("device", new JSONObject(getDeviceInfo())); Network.getInstance(this.context, this.projectId).CallProcessOut("/customers/" + customerId + "/tokens/" + tokenId, Request.Method.PUT, body, new Network.NetworkResult() { @Override @@ -666,7 +703,8 @@ private String generateAdditionalDataString(@NonNull Map additio * @param body the request body * @param callback callback for handling customer action */ - private void requestAuthorization(@NonNull final String invoiceId, @NonNull final JSONObject body, @NonNull final RequestAuthorizationCallback callback) { + private void requestAuthorization(@NonNull final String invoiceId, @NonNull final JSONObject body, @NonNull final RequestAuthorizationCallback callback) throws JSONException { + body.put("device", new JSONObject(getDeviceInfo())); Network.getInstance(this.context /* Using the same context as other network calls */, this.projectId).CallProcessOut( "/invoices/" + invoiceId + "/authorize", Request.Method.POST, body, new Network.NetworkResult() {