Panagiotis Triantafyllou

uat fixes and changes

...@@ -42,7 +42,7 @@ public class SplashActivity extends BaseActivity { ...@@ -42,7 +42,7 @@ public class SplashActivity extends BaseActivity {
42 // ); 42 // );
43 43
44 WarplyManager.getCosmoteUser(new WarplyCosmoteUserRequest() 44 WarplyManager.getCosmoteUser(new WarplyCosmoteUserRequest()
45 - .setGuid("6012049323"), //6012049321, 6012049322, 6012049323 45 + .setGuid("6012049321"), //6012049321, 6012049322, 6012049323
46 mLoginReceiver); 46 mLoginReceiver);
47 47
48 // WarplyManager.verifyTicket(new WarplyVerifyTicketRequest() 48 // WarplyManager.verifyTicket(new WarplyVerifyTicketRequest()
......
...@@ -157,6 +157,11 @@ ...@@ -157,6 +157,11 @@
157 android:permission="android.permission.BIND_JOB_SERVICE" /> 157 android:permission="android.permission.BIND_JOB_SERVICE" />
158 158
159 <service 159 <service
160 + android:name="ly.warp.sdk.services.WarplyHealthService"
161 + android:exported="false"
162 + android:permission="android.permission.BIND_JOB_SERVICE" />
163 +
164 + <service
160 android:name="ly.warp.sdk.services.WarplyBeaconsRangingService" 165 android:name="ly.warp.sdk.services.WarplyBeaconsRangingService"
161 android:exported="false" /> 166 android:exported="false" />
162 167
......
...@@ -45,7 +45,7 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener { ...@@ -45,7 +45,7 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener {
45 private ImageView mIvBack, mIvDealsLogo, mIvProfilePhoto; 45 private ImageView mIvBack, mIvDealsLogo, mIvProfilePhoto;
46 private TextView mTvUsername, mTvDealsValue, mTvDealsValueAll, 46 private TextView mTvUsername, mTvDealsValue, mTvDealsValueAll,
47 mTvUserBadge, mTvGiftsValue, mTvGiftsValueAll, mTvActiveCode, mTvActiveDate, 47 mTvUserBadge, mTvGiftsValue, mTvGiftsValueAll, mTvActiveCode, mTvActiveDate,
48 - mTvActiveTitle; 48 + mTvActiveTitle, mTvActiveCouponsHeader;
49 private ConstraintLayout mClDealsBanner, mClDealsView, 49 private ConstraintLayout mClDealsBanner, mClDealsView,
50 mClGiftsBanner; 50 mClGiftsBanner;
51 private LinearLayout mLlQuestionnaire, mLlUserBadge; 51 private LinearLayout mLlQuestionnaire, mLlUserBadge;
...@@ -79,6 +79,7 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener { ...@@ -79,6 +79,7 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener {
79 mClDealsView = findViewById(R.id.cl_mygifts); 79 mClDealsView = findViewById(R.id.cl_mygifts);
80 mIvProfilePhoto = findViewById(R.id.iv_profile_photo); 80 mIvProfilePhoto = findViewById(R.id.iv_profile_photo);
81 mTvActiveTitle = findViewById(R.id.tv_active_gifts); 81 mTvActiveTitle = findViewById(R.id.tv_active_gifts);
82 + mTvActiveCouponsHeader = findViewById(R.id.tv_active_coupons_header);
82 83
83 if (WarplyManagerHelper.getActiveDFYCoupons() != null) { 84 if (WarplyManagerHelper.getActiveDFYCoupons() != null) {
84 Collections.sort(WarplyManagerHelper.getActiveDFYCoupons(), new Comparator<ActiveDFYCouponModel>() { 85 Collections.sort(WarplyManagerHelper.getActiveDFYCoupons(), new Comparator<ActiveDFYCouponModel>() {
...@@ -116,6 +117,7 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener { ...@@ -116,6 +117,7 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener {
116 } 117 }
117 if (view.getId() == R.id.ll_user_questionnaire || view.getId() == R.id.ll_user_badge) { 118 if (view.getId() == R.id.ll_user_questionnaire || view.getId() == R.id.ll_user_badge) {
118 startActivityForResult(WarpViewActivity.createIntentFromURL(LoyaltyWallet.this, WarplyManagerHelper.openQuestionnaire()), 1000); 119 startActivityForResult(WarpViewActivity.createIntentFromURL(LoyaltyWallet.this, WarplyManagerHelper.openQuestionnaire()), 1000);
120 +// startActivity(WarpViewActivity.createIntentFromURL(LoyaltyWallet.this, WarplyManagerHelper.openPacing()));
119 return; 121 return;
120 } 122 }
121 if (view.getId() == R.id.cl_deals_cos) { 123 if (view.getId() == R.id.cl_deals_cos) {
...@@ -171,15 +173,24 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener { ...@@ -171,15 +173,24 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener {
171 .subscribe(); 173 .subscribe();
172 } 174 }
173 175
176 + if (WarplyManagerHelper.getDealsCouponsSum() > 0) {
177 + mTvDealsValue.setText(String.format(getString(R.string.cos_value), String.valueOf(/*couponDfyValue*/ WarplyManagerHelper.getDealsCouponsSum())));
178 + mTvDealsValueAll.setText(String.format(getString(R.string.cos_deals_win_title_cos), String.valueOf(/*couponDfyValue*/WarplyManagerHelper.getDealsCouponsSum())));
179 + } else {
180 + mClDealsBanner.setVisibility(View.GONE);
181 + }
182 +
174 if (WarplyManagerHelper.getLoyaltyBadge() != null) { 183 if (WarplyManagerHelper.getLoyaltyBadge() != null) {
175 - WarpUtils.log("LOYALTY_BADGE_COUNT: " + String.valueOf(WarplyManagerHelper.getLoyaltyBadge().getCouponCount())); 184 + if (WarplyManagerHelper.getLoyaltyBadge().getCouponCount() > 0) {
176 - WarpUtils.log("LOYALTY_BADGE_SUM: " + String.valueOf(WarplyManagerHelper.getLoyaltyBadge().getValue())); 185 + mTvGiftsValue.setText(String.format(getString(R.string.cos_value), String.valueOf(WarplyManagerHelper.getLoyaltyBadge().getValue())));
186 + mTvGiftsValueAll.setText(String.format(getString(R.string.cos_deals_win_title), String.valueOf(WarplyManagerHelper.getLoyaltyBadge().getValue()), String.valueOf(WarplyManagerHelper.getLoyaltyBadge().getCouponCount())));
187 + } else {
188 + mClGiftsBanner.setVisibility(View.GONE);
189 + }
190 + } else {
191 + mClGiftsBanner.setVisibility(View.GONE);
177 } 192 }
178 193
179 - mTvGiftsValue.setText(String.format(getString(R.string.cos_value), String.valueOf(WarplyManagerHelper.getLoyaltyBadge().getValue())));
180 - mTvGiftsValueAll.setText(String.format(getString(R.string.cos_deals_win_title), String.valueOf(WarplyManagerHelper.getLoyaltyBadge().getValue()), String.valueOf(WarplyManagerHelper.getLoyaltyBadge().getCouponCount())));
181 - mTvDealsValue.setText(String.format(getString(R.string.cos_value), String.valueOf(/*couponDfyValue*/ WarplyManagerHelper.getDealsCouponsSum())));
182 - mTvDealsValueAll.setText(String.format(getString(R.string.cos_deals_win_title_cos), String.valueOf(/*couponDfyValue*/WarplyManagerHelper.getDealsCouponsSum())));
183 if (WarplyManagerHelper.getActiveDFYCoupons() != null && WarplyManagerHelper.getActiveDFYCoupons().size() > 0) { 194 if (WarplyManagerHelper.getActiveDFYCoupons() != null && WarplyManagerHelper.getActiveDFYCoupons().size() > 0) {
184 String codes = ""; 195 String codes = "";
185 if (WarplyManagerHelper.getActiveDFYCoupons().size() == 1) { 196 if (WarplyManagerHelper.getActiveDFYCoupons().size() == 1) {
...@@ -208,6 +219,7 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener { ...@@ -208,6 +219,7 @@ public class LoyaltyWallet extends Activity implements View.OnClickListener {
208 // e.printStackTrace(); 219 // e.printStackTrace();
209 // } 220 // }
210 } else { 221 } else {
222 + mTvActiveCouponsHeader.setVisibility(View.GONE);
211 mIvDealsLogo.setVisibility(View.GONE); 223 mIvDealsLogo.setVisibility(View.GONE);
212 mClDealsView.setVisibility(View.GONE); 224 mClDealsView.setVisibility(View.GONE);
213 } 225 }
......
...@@ -183,7 +183,15 @@ public class TelcoActivity extends Activity implements View.OnClickListener { ...@@ -183,7 +183,15 @@ public class TelcoActivity extends Activity implements View.OnClickListener {
183 .setDataCategory(mCCMS.getDataCategory()) 183 .setDataCategory(mCCMS.getDataCategory())
184 .setMinsValue(mCCMS.getMinsValue()) 184 .setMinsValue(mCCMS.getMinsValue())
185 .setDataValue(mCCMS.getDataValue()) 185 .setDataValue(mCCMS.getDataValue())
186 - .setProvStepValueMins(mCCMS.getProvStepValueMins()), 186 + .setProvStepValueMins(mCCMS.getProvStepValueMins())
187 + .setOfferAudienceLevel(mCCMS.getOfferAudienceLevel())
188 + .setUACIOfferTrackingCode(mCCMS.getUACIOfferTrackingCode())
189 + .setOfferCode1(mCCMS.getOfferCode1())
190 + .setScore(mCCMS.getScore())
191 + .setZone(mCCMS.getZone())
192 + .setWave(mCCMS.getWave())
193 + .setValidity(mCCMS.getValidity())
194 + .setTreatmentCode(mCCMS.getTreatmentCode()),
187 mSubmitCallback); 195 mSubmitCallback);
188 } 196 }
189 Thread.currentThread().interrupt(); 197 Thread.currentThread().interrupt();
...@@ -250,25 +258,25 @@ public class TelcoActivity extends Activity implements View.OnClickListener { ...@@ -250,25 +258,25 @@ public class TelcoActivity extends Activity implements View.OnClickListener {
250 errorActivatingDialog(); 258 errorActivatingDialog();
251 }); 259 });
252 260
253 - if (status == 1) { 261 +// if (status == 1) {
254 - new Thread(() -> { 262 +// new Thread(() -> {
255 - if (!Thread.currentThread().isInterrupted()) { 263 +// if (!Thread.currentThread().isInterrupted()) {
256 - WarplyManager.postEvent(new CosmotePostEventRequest() 264 +// WarplyManager.postEvent(new CosmotePostEventRequest()
257 - .setCommunicationUuid(mLoyalty.getSessionUUID()) 265 +// .setCommunicationUuid(mLoyalty.getSessionUUID())
258 - .setUserMsisdn(mSender) 266 +// .setUserMsisdn(mSender)
259 - .setOfferAudienceLevel(mCCMS.getOfferAudienceLevel()) 267 +// .setOfferAudienceLevel(mCCMS.getOfferAudienceLevel())
260 - .setUACIOfferTrackingCode(mCCMS.getUACIOfferTrackingCode()) 268 +// .setUACIOfferTrackingCode(mCCMS.getUACIOfferTrackingCode())
261 - .setOfferCode1(mCCMS.getOfferCode1()) 269 +// .setOfferCode1(mCCMS.getOfferCode1())
262 - .setScore(mCCMS.getScore()) 270 +// .setScore(mCCMS.getScore())
263 - .setZone(mCCMS.getZone()) 271 +// .setZone(mCCMS.getZone())
264 - .setWave(mCCMS.getWave()) 272 +// .setWave(mCCMS.getWave())
265 - .setValidity(mCCMS.getValidity()) 273 +// .setValidity(mCCMS.getValidity())
266 - .setTreatmentCode(mCCMS.getTreatmentCode()), 274 +// .setTreatmentCode(mCCMS.getTreatmentCode()),
267 - mPostCallback); 275 +// mPostCallback);
268 - } 276 +// }
269 - Thread.currentThread().interrupt(); 277 +// Thread.currentThread().interrupt();
270 - }).start(); 278 +// }).start();
271 - } 279 +// }
272 } 280 }
273 281
274 @Override 282 @Override
...@@ -277,16 +285,16 @@ public class TelcoActivity extends Activity implements View.OnClickListener { ...@@ -277,16 +285,16 @@ public class TelcoActivity extends Activity implements View.OnClickListener {
277 } 285 }
278 }; 286 };
279 287
280 - private CallbackReceiver<JSONObject> mPostCallback = new CallbackReceiver<JSONObject>() { 288 +// private CallbackReceiver<JSONObject> mPostCallback = new CallbackReceiver<JSONObject>() {
281 - @Override 289 +// @Override
282 - public void onSuccess(JSONObject result) { 290 +// public void onSuccess(JSONObject result) {
283 - Thread.currentThread().interrupt(); 291 +// Thread.currentThread().interrupt();
284 - } 292 +// }
285 - 293 +//
286 - @Override 294 +// @Override
287 - public void onFailure(int errorCode) { 295 +// public void onFailure(int errorCode) {
288 - WarpUtils.log("POST_EVENT_ERROR " + String.valueOf(errorCode)); 296 +// WarpUtils.log("POST_EVENT_ERROR " + String.valueOf(errorCode));
289 - Thread.currentThread().interrupt(); 297 +// Thread.currentThread().interrupt();
290 - } 298 +// }
291 - }; 299 +// };
292 } 300 }
......
...@@ -49,6 +49,7 @@ import androidx.work.WorkManager; ...@@ -49,6 +49,7 @@ import androidx.work.WorkManager;
49 49
50 import org.greenrobot.eventbus.EventBus; 50 import org.greenrobot.eventbus.EventBus;
51 import org.greenrobot.eventbus.Subscribe; 51 import org.greenrobot.eventbus.Subscribe;
52 +import org.json.JSONObject;
52 53
53 import java.security.SecureRandom; 54 import java.security.SecureRandom;
54 import java.util.concurrent.ThreadLocalRandom; 55 import java.util.concurrent.ThreadLocalRandom;
...@@ -113,6 +114,12 @@ public class WarpViewActivity extends WarpBaseActivity { ...@@ -113,6 +114,12 @@ public class WarpViewActivity extends WarpBaseActivity {
113 } 114 }
114 115
115 @Override 116 @Override
117 + protected void onDestroy() {
118 + super.onDestroy();
119 + WarpUtils.setWebviewParams(this, new JSONObject());
120 + }
121 +
122 + @Override
116 public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) { 123 public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) {
117 if (keyCode == KeyEvent.KEYCODE_BACK) { 124 if (keyCode == KeyEvent.KEYCODE_BACK) {
118 if (mWarpView.canGoBack()) { 125 if (mWarpView.canGoBack()) {
......
...@@ -155,7 +155,7 @@ public class CosmotePostEventRequest { ...@@ -155,7 +155,7 @@ public class CosmotePostEventRequest {
155 * Call this to set how often the cached data will be updated. 155 * Call this to set how often the cached data will be updated.
156 * 156 *
157 * @param updateInterval The time that data will be cached 157 * @param updateInterval The time that data will be cached
158 - * @return WarplyConsumerRequest 158 + * @return CosmotePostEventRequest
159 */ 159 */
160 public CosmotePostEventRequest setCacheUpdateInterval(long updateInterval) { 160 public CosmotePostEventRequest setCacheUpdateInterval(long updateInterval) {
161 161
...@@ -181,7 +181,7 @@ public class CosmotePostEventRequest { ...@@ -181,7 +181,7 @@ public class CosmotePostEventRequest {
181 * 181 *
182 * @param useCache <p>true - the Application is using Cache</p> 182 * @param useCache <p>true - the Application is using Cache</p>
183 * <p>false - the Application is not using Cache</p> 183 * <p>false - the Application is not using Cache</p>
184 - * @return WarplyConsumerRequest 184 + * @return CosmotePostEventRequest
185 */ 185 */
186 public CosmotePostEventRequest setUseCache(boolean useCache) { 186 public CosmotePostEventRequest setUseCache(boolean useCache) {
187 187
...@@ -335,7 +335,7 @@ public class CosmotePostEventRequest { ...@@ -335,7 +335,7 @@ public class CosmotePostEventRequest {
335 } 335 }
336 336
337 public String getSignature() { 337 public String getSignature() {
338 - String signature = mFilters != null && mFilters.size() > 0 ? String.valueOf(mFilters.hashCode()) : "default_consumer_request"; 338 + String signature = mFilters != null && mFilters.size() > 0 ? String.valueOf(mFilters.hashCode()) : "default_cosmote_post_event_request";
339 try { 339 try {
340 byte[] hash = MessageDigest.getInstance("SHA-256").digest(signature.getBytes("UTF-8")); 340 byte[] hash = MessageDigest.getInstance("SHA-256").digest(signature.getBytes("UTF-8"));
341 signature = Base64.encodeToString(hash, Base64.NO_WRAP); 341 signature = Base64.encodeToString(hash, Base64.NO_WRAP);
......
...@@ -2,6 +2,7 @@ package ly.warp.sdk.io.request; ...@@ -2,6 +2,7 @@ package ly.warp.sdk.io.request;
2 2
3 import android.util.Base64; 3 import android.util.Base64;
4 4
5 +import org.json.JSONArray;
5 import org.json.JSONException; 6 import org.json.JSONException;
6 import org.json.JSONObject; 7 import org.json.JSONObject;
7 8
...@@ -42,6 +43,7 @@ public class CosmoteSubmitOrderRequest { ...@@ -42,6 +43,7 @@ public class CosmoteSubmitOrderRequest {
42 private final String KEY_MINS_VALUE = "minsValue"; 43 private final String KEY_MINS_VALUE = "minsValue";
43 private final String KEY_DATA_VALUE = "dataValue"; 44 private final String KEY_DATA_VALUE = "dataValue";
44 private final String KEY_PROV_STEP_VALUE_MINS = "provStepValueMins"; 45 private final String KEY_PROV_STEP_VALUE_MINS = "provStepValueMins";
46 + private final String KEY_PARAMETERS = "parameters";
45 47
46 // =========================================================== 48 // ===========================================================
47 // Fields 49 // Fields
...@@ -63,6 +65,14 @@ public class CosmoteSubmitOrderRequest { ...@@ -63,6 +65,14 @@ public class CosmoteSubmitOrderRequest {
63 private String mMinsValue = ""; 65 private String mMinsValue = "";
64 private String mDataValue = ""; 66 private String mDataValue = "";
65 private String mProvStepValueMins = ""; 67 private String mProvStepValueMins = "";
68 + private String mOfferAudienceLevel = "";
69 + private String mUACIOfferTrackingCode = "";
70 + private String mOfferCode1 = "";
71 + private String mScore = "";
72 + private String mZone = "";
73 + private String mWave = "";
74 + private String mValidity = "";
75 + private String mTreatmentCode = "";
66 76
67 // =========================================================== 77 // ===========================================================
68 // Constructor 78 // Constructor
...@@ -178,6 +188,46 @@ public class CosmoteSubmitOrderRequest { ...@@ -178,6 +188,46 @@ public class CosmoteSubmitOrderRequest {
178 return this; 188 return this;
179 } 189 }
180 190
191 + public CosmoteSubmitOrderRequest setOfferAudienceLevel(String offerAudienceLevel) {
192 + this.mOfferAudienceLevel = offerAudienceLevel;
193 + return this;
194 + }
195 +
196 + public CosmoteSubmitOrderRequest setUACIOfferTrackingCode(String uaciOfferTrackingCode) {
197 + this.mUACIOfferTrackingCode = uaciOfferTrackingCode;
198 + return this;
199 + }
200 +
201 + public CosmoteSubmitOrderRequest setOfferCode1(String offerCode1) {
202 + this.mOfferCode1 = offerCode1;
203 + return this;
204 + }
205 +
206 + public CosmoteSubmitOrderRequest setScore(String score) {
207 + this.mScore = score;
208 + return this;
209 + }
210 +
211 + public CosmoteSubmitOrderRequest setZone(String zone) {
212 + this.mZone = zone;
213 + return this;
214 + }
215 +
216 + public CosmoteSubmitOrderRequest setWave(String wave) {
217 + this.mWave = wave;
218 + return this;
219 + }
220 +
221 + public CosmoteSubmitOrderRequest setValidity(String validity) {
222 + this.mValidity = validity;
223 + return this;
224 + }
225 +
226 + public CosmoteSubmitOrderRequest setTreatmentCode(String treatmentCode) {
227 + this.mTreatmentCode = treatmentCode;
228 + return this;
229 + }
230 +
181 /** 231 /**
182 * Call this to get how often the cached data will be updated. 232 * Call this to get how often the cached data will be updated.
183 * 233 *
...@@ -191,7 +241,7 @@ public class CosmoteSubmitOrderRequest { ...@@ -191,7 +241,7 @@ public class CosmoteSubmitOrderRequest {
191 * Call this to set how often the cached data will be updated. 241 * Call this to set how often the cached data will be updated.
192 * 242 *
193 * @param updateInterval The time that data will be cached 243 * @param updateInterval The time that data will be cached
194 - * @return CosmoteSharingRequest 244 + * @return CosmoteSubmitOrderRequest
195 */ 245 */
196 public CosmoteSubmitOrderRequest setCacheUpdateInterval(long updateInterval) { 246 public CosmoteSubmitOrderRequest setCacheUpdateInterval(long updateInterval) {
197 247
...@@ -217,7 +267,7 @@ public class CosmoteSubmitOrderRequest { ...@@ -217,7 +267,7 @@ public class CosmoteSubmitOrderRequest {
217 * 267 *
218 * @param useCache <p>true - the Application is using Cache</p> 268 * @param useCache <p>true - the Application is using Cache</p>
219 * <p>false - the Application is not using Cache</p> 269 * <p>false - the Application is not using Cache</p>
220 - * @return CosmoteSharingRequest 270 + * @return CosmoteSubmitOrderRequest
221 */ 271 */
222 public CosmoteSubmitOrderRequest setUseCache(boolean useCache) { 272 public CosmoteSubmitOrderRequest setUseCache(boolean useCache) {
223 273
...@@ -257,6 +307,123 @@ public class CosmoteSubmitOrderRequest { ...@@ -257,6 +307,123 @@ public class CosmoteSubmitOrderRequest {
257 extraData.putOpt(KEY_MINS_VALUE, mMinsValue); 307 extraData.putOpt(KEY_MINS_VALUE, mMinsValue);
258 extraData.putOpt(KEY_DATA_VALUE, mDataValue); 308 extraData.putOpt(KEY_DATA_VALUE, mDataValue);
259 extraData.putOpt(KEY_PROV_STEP_VALUE_MINS, mProvStepValueMins); 309 extraData.putOpt(KEY_PROV_STEP_VALUE_MINS, mProvStepValueMins);
310 + extraData.putOpt("InteractiveChannel", "COSMOTE_OMNI");
311 + extraData.putOpt("InteractionPoint", mZone);
312 + extraData.putOpt("Session_ID", mCommunicationUuid);
313 + extraData.putOpt("OfferAudienceLevel", mOfferAudienceLevel);
314 + extraData.putOpt("MSISDN", mOfferAudienceLevel.equals("msisdn") ? mUserMsisdn : "");
315 + extraData.putOpt("GUID", "");
316 +
317 + JSONArray parameters = new JSONArray();
318 + JSONObject param1 = new JSONObject();
319 + param1.putOpt("Name", "UACIOfferTrackingCode");
320 + param1.putOpt("Value", mUACIOfferTrackingCode);
321 + param1.putOpt("Type", "string");
322 + parameters.put(param1);
323 +
324 + JSONObject param2 = new JSONObject();
325 + param2.putOpt("Name", "UACICustomLoggerTableName");
326 + param2.putOpt("Value", "VW_WHITELIST");
327 + param2.putOpt("Type", "string");
328 + parameters.put(param2);
329 +
330 + JSONObject param3 = new JSONObject();
331 + param3.putOpt("Name", "MSISDN");
332 + param3.putOpt("Value", mUserMsisdn);
333 + param3.putOpt("Type", "string");
334 + parameters.put(param3);
335 +
336 + JSONObject param4 = new JSONObject();
337 + param4.putOpt("Name", "OFFERCODE1");
338 + param4.putOpt("Value", mOfferCode1);
339 + param4.putOpt("Type", "string");
340 + parameters.put(param4);
341 +
342 + JSONObject param5 = new JSONObject();
343 + param5.putOpt("Name", "SCORE");
344 + param5.putOpt("Value", mScore);
345 + param5.putOpt("Type", "INT");
346 + parameters.put(param5);
347 +
348 + JSONObject param6 = new JSONObject();
349 + param6.putOpt("Name", "PREDICATE");
350 + param6.putOpt("Value", "0");
351 + param6.putOpt("Type", "string");
352 + parameters.put(param6);
353 +
354 + JSONObject param7 = new JSONObject();
355 + param7.putOpt("Name", "ZONE");
356 + param7.putOpt("Value", mZone);
357 + param7.putOpt("Type", "string");
358 + parameters.put(param7);
359 +
360 + JSONObject param8 = new JSONObject();
361 + param8.putOpt("Name", "APPLICATIONNAME");
362 + param8.putOpt("Value", mZone);
363 + param8.putOpt("Type", "string");
364 + parameters.put(param8);
365 +
366 + JSONObject param9 = new JSONObject();
367 + param9.putOpt("Name", "Session_ID");
368 + param9.putOpt("Value", mCommunicationUuid);
369 + param9.putOpt("Type", "string");
370 + parameters.put(param9);
371 +
372 + JSONObject param10 = new JSONObject();
373 + param10.putOpt("Name", "CAMPAIGN_CODE");
374 + param10.putOpt("Value", "MCC_00006");
375 + param10.putOpt("Type", "string");
376 + parameters.put(param10);
377 +
378 + JSONObject param11 = new JSONObject();
379 + param11.putOpt("Name", "CAMPAIGN_TYPE");
380 + param11.putOpt("Value", "Inbound");
381 + param11.putOpt("Type", "string");
382 + parameters.put(param11);
383 +
384 + JSONObject param12 = new JSONObject();
385 + param12.putOpt("Name", "UACIResponseTypeCode");
386 + param12.putOpt("Value", "CON");
387 + param12.putOpt("Type", "string");
388 + parameters.put(param12);
389 +
390 + JSONObject param13 = new JSONObject();
391 + param13.putOpt("Name", "CHANNEL");
392 + param13.putOpt("Value", "ONE_APP");
393 + param13.putOpt("Type", "string");
394 + parameters.put(param13);
395 +
396 + JSONObject param14 = new JSONObject();
397 + param14.putOpt("Name", "WAVE");
398 + param14.putOpt("Value", mWave);
399 + param14.putOpt("Type", "string");
400 + parameters.put(param14);
401 +
402 + JSONObject param15 = new JSONObject();
403 + param15.putOpt("Name", "RESPONSECHANNEL");
404 + param15.putOpt("Value", "ONE_APP");
405 + param15.putOpt("Type", "string");
406 + parameters.put(param15);
407 +
408 + JSONObject param16 = new JSONObject();
409 + param16.putOpt("Name", "VALIDITY");
410 + param16.putOpt("Value", mValidity);
411 + param16.putOpt("Type", "INT");
412 + parameters.put(param16);
413 +
414 + JSONObject param17 = new JSONObject();
415 + param17.putOpt("Name", "TREATMENT_CODE");
416 + param17.putOpt("Value", mTreatmentCode);
417 + param17.putOpt("Type", "string");
418 + parameters.put(param17);
419 +
420 + JSONObject param18 = new JSONObject();
421 + param18.putOpt("Name", "EventName");
422 + param18.putOpt("Value", "INTEREST_P");
423 + param18.putOpt("Type", "string");
424 + parameters.put(param18);
425 +
426 + extraData.putOpt(KEY_PARAMETERS, parameters);
260 427
261 extraJson.putOpt(KEY_EXTRA_DATA, extraData); 428 extraJson.putOpt(KEY_EXTRA_DATA, extraData);
262 bodyJsonObject.putOpt(KEY_MAPP, extraJson); 429 bodyJsonObject.putOpt(KEY_MAPP, extraJson);
...@@ -268,7 +435,7 @@ public class CosmoteSubmitOrderRequest { ...@@ -268,7 +435,7 @@ public class CosmoteSubmitOrderRequest {
268 } 435 }
269 436
270 public String getSignature() { 437 public String getSignature() {
271 - String signature = mFilters != null && mFilters.size() > 0 ? String.valueOf(mFilters.hashCode()) : "default_cosmote_sharing_request"; 438 + String signature = mFilters != null && mFilters.size() > 0 ? String.valueOf(mFilters.hashCode()) : "default_cosmote_submit_order_request";
272 try { 439 try {
273 byte[] hash = MessageDigest.getInstance("SHA-256").digest(signature.getBytes("UTF-8")); 440 byte[] hash = MessageDigest.getInstance("SHA-256").digest(signature.getBytes("UTF-8"));
274 signature = Base64.encodeToString(hash, Base64.NO_WRAP); 441 signature = Base64.encodeToString(hash, Base64.NO_WRAP);
......
1 +package ly.warp.sdk.io.request;
2 +
3 +import android.util.Base64;
4 +
5 +import org.json.JSONException;
6 +import org.json.JSONObject;
7 +
8 +import java.io.UnsupportedEncodingException;
9 +import java.security.MessageDigest;
10 +import java.security.NoSuchAlgorithmException;
11 +import java.util.HashMap;
12 +
13 +import ly.warp.sdk.utils.constants.WarpConstants;
14 +
15 +/**
16 + * Created by Panagiotis Triantafyllou on 02-Aug-22.
17 + */
18 +
19 +public class PacingCalculateRequest {
20 +
21 + // ===========================================================
22 + // Constants
23 + // ===========================================================
24 +
25 + private final String KEY_MAPP = "consumer_data";
26 + private final String KEY_ACTION = "action";
27 + private final String KEY_ACTION_VALUE = "integration";
28 + private final String KEY_METHOD = "method";
29 + private final String KEY_METHOD_VALUE = "steps";
30 + private final String KEY_OPERATION = "operation";
31 + private final String KEY_OPERATION_VALUE = "add";
32 + private final String KEY_DATA = "data";
33 +
34 + // ===========================================================
35 + // Fields
36 + // ===========================================================
37 +
38 + private HashMap<String, String> mFilters;
39 + private long mCacheUpdateInterval = 0;
40 + private String mDate = "";
41 + private int mCounter = 0;
42 +
43 + // ===========================================================
44 + // Constructor
45 + // ===========================================================
46 +
47 + /**
48 + * Default constructor of WarplyConsumerRequest, initializes an empty filters HashMap
49 + */
50 + public PacingCalculateRequest() {
51 + mFilters = new HashMap<>();
52 + }
53 +
54 + public PacingCalculateRequest(PacingCalculateRequest copy) {
55 + if (copy != null) {
56 + this.mFilters = copy.mFilters;
57 + this.mCacheUpdateInterval = copy.mCacheUpdateInterval;
58 + }
59 + }
60 +
61 + // ===========================================================
62 + // Methods for/from SuperClass/Interfaces
63 + // ===========================================================
64 +
65 + @Override
66 + public boolean equals(Object object) {
67 + if (object instanceof PacingCalculateRequest) {
68 + PacingCalculateRequest other = (PacingCalculateRequest) object;
69 + return other == this || (this.mFilters == other.mFilters || (this.mFilters != null && this.mFilters.equals(other.mFilters)));
70 + }
71 + return false;
72 + }
73 +
74 + @Override
75 + public int hashCode() {
76 + return mFilters.hashCode();
77 + }
78 +
79 + // ===========================================================
80 + // Methods
81 + // ===========================================================
82 +
83 + // ===========================================================
84 + // Getter & Setter
85 + // ===========================================================
86 +
87 + public PacingCalculateRequest setDate(String date) {
88 + this.mDate = date;
89 + return this;
90 + }
91 +
92 + public PacingCalculateRequest setCounter(int counter) {
93 + this.mCounter = counter;
94 + return this;
95 + }
96 +
97 + /**
98 + * Call this to get how often the cached data will be updated.
99 + *
100 + * @return mCacheUpdateInterval
101 + */
102 + public long getCacheUpdateInterval() {
103 + return mCacheUpdateInterval;
104 + }
105 +
106 + /**
107 + * Call this to set how often the cached data will be updated.
108 + *
109 + * @param updateInterval The time that data will be cached
110 + * @return PacingCalculateRequest
111 + */
112 + public PacingCalculateRequest setCacheUpdateInterval(long updateInterval) {
113 +
114 + this.mCacheUpdateInterval = updateInterval;
115 + if (mCacheUpdateInterval < 0) {
116 + mCacheUpdateInterval = 0;
117 + }
118 + return this;
119 + }
120 +
121 + /**
122 + * Call this to check if the Application uses Cache
123 + *
124 + * @return <p>true - the Application is using Cache</p>
125 + * <p>false - the Application is not using Cache</p>
126 + */
127 + public boolean isUseCache() {
128 + return mCacheUpdateInterval > 0;
129 + }
130 +
131 + /**
132 + * Call this to check whether the cached data need to be updated
133 + *
134 + * @param useCache <p>true - the Application is using Cache</p>
135 + * <p>false - the Application is not using Cache</p>
136 + * @return PacingCalculateRequest
137 + */
138 + public PacingCalculateRequest setUseCache(boolean useCache) {
139 +
140 + if (useCache) {
141 + mCacheUpdateInterval = mCacheUpdateInterval > 0 ? mCacheUpdateInterval
142 + : WarpConstants.INBOX_UPDATE_INTERVAL;
143 + } else {
144 + mCacheUpdateInterval = 0;
145 + }
146 + return this;
147 + }
148 +
149 + /**
150 + * Call this to build the offers Json object
151 + *
152 + * @return bodyJsonObject
153 + */
154 + public JSONObject toJson() {
155 + JSONObject bodyJsonObject = new JSONObject();
156 + try {
157 + JSONObject extraJson = new JSONObject();
158 + extraJson.putOpt(KEY_ACTION, KEY_ACTION_VALUE);
159 + extraJson.putOpt(KEY_METHOD, KEY_METHOD_VALUE);
160 + extraJson.putOpt(KEY_OPERATION, KEY_OPERATION_VALUE);
161 +
162 + JSONObject data = new JSONObject();
163 + data.putOpt("event", "steps");
164 + data.putOpt("type", "counter");
165 + data.putOpt("counter", mCounter);
166 + data.putOpt("date", mDate);
167 +
168 + extraJson.putOpt(KEY_DATA, data);
169 + bodyJsonObject.putOpt(KEY_MAPP, extraJson);
170 + } catch (JSONException e) {
171 + if (WarpConstants.DEBUG)
172 + e.printStackTrace();
173 + }
174 + return bodyJsonObject;
175 + }
176 +
177 + public String getSignature() {
178 + String signature = mFilters != null && mFilters.size() > 0 ? String.valueOf(mFilters.hashCode()) : "default_pacing_calculate_request";
179 + try {
180 + byte[] hash = MessageDigest.getInstance("SHA-256").digest(signature.getBytes("UTF-8"));
181 + signature = Base64.encodeToString(hash, Base64.NO_WRAP);
182 + } catch (NullPointerException | NoSuchAlgorithmException
183 + | UnsupportedEncodingException e) {
184 + e.printStackTrace();
185 + }
186 + return signature;
187 + }
188 +}
1 +package ly.warp.sdk.services;
2 +
3 +import android.app.Service;
4 +import android.content.Context;
5 +import android.content.Intent;
6 +import android.hardware.Sensor;
7 +import android.hardware.SensorEvent;
8 +import android.hardware.SensorEventListener;
9 +import android.hardware.SensorManager;
10 +import android.os.IBinder;
11 +
12 +import androidx.annotation.NonNull;
13 +import androidx.annotation.Nullable;
14 +import androidx.work.Worker;
15 +import androidx.work.WorkerParameters;
16 +
17 +import org.greenrobot.eventbus.EventBus;
18 +import org.json.JSONObject;
19 +
20 +import java.text.ParseException;
21 +import java.text.SimpleDateFormat;
22 +import java.util.Date;
23 +import java.util.Locale;
24 +
25 +import ly.warp.sdk.io.callbacks.CallbackReceiver;
26 +import ly.warp.sdk.io.callbacks.WarplyHealthCallback;
27 +import ly.warp.sdk.io.models.ContexualEventModel;
28 +import ly.warp.sdk.io.request.PacingCalculateRequest;
29 +import ly.warp.sdk.utils.WarpUtils;
30 +import ly.warp.sdk.utils.managers.WarplyEventBusManager;
31 +import ly.warp.sdk.utils.managers.WarplyHealthManager;
32 +import ly.warp.sdk.utils.managers.WarplyManager;
33 +
34 +/**
35 + * Created by Panagiotis Triantafyllou on 03/Aug/2022.
36 + */
37 +public class WarplyHealthService extends /*Worker*/ Service implements SensorEventListener {
38 +
39 + // ===========================================================
40 + // Constants
41 + // ===========================================================
42 +
43 + // ===========================================================
44 + // Fields
45 + // ===========================================================
46 +
47 + private Context mContext;
48 + private SensorManager mSensorManager;
49 + private Sensor mSensor;
50 + private int mSteps = 0;
51 + private final int ACCEL_RING_SIZE = 50;
52 + private final int VEL_RING_SIZE = 10;
53 + // change this threshold according to your sensitivity preferences
54 + private final float STEP_THRESHOLD = 20f;
55 + private final int STEP_DELAY_NS = 250000000;
56 + private int accelRingCounter = 0;
57 + private float[] accelRingX = new float[ACCEL_RING_SIZE];
58 + private float[] accelRingY = new float[ACCEL_RING_SIZE];
59 + private float[] accelRingZ = new float[ACCEL_RING_SIZE];
60 + private int velRingCounter = 0;
61 + private float[] velRing = new float[VEL_RING_SIZE];
62 + private long lastStepTimeNs = 0;
63 + private float oldVelocityEstimate = 0;
64 + // if we want to send the steps back to an activity/fragment/service etc
65 +// private static WarplyHealthCallback mHealthCallback;
66 +
67 + // ===========================================================
68 + // Contructors
69 + // ===========================================================
70 +
71 +// public WarplyHealthService(@NonNull Context context, @NonNull WorkerParameters workerParams) {
72 +// super(context, workerParams);
73 +//
74 +// mContext = context;
75 +// mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
76 +// mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
77 +// registerStepSensor();
78 +// }
79 +
80 + // ===========================================================
81 + // Methods for/from SuperClass/Interfaces
82 + // ===========================================================
83 +
84 +
85 + @Override
86 + public void onCreate() {
87 + super.onCreate();
88 +
89 + mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
90 + mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
91 + registerStepSensor();
92 + }
93 +
94 + @Override
95 + public int onStartCommand(Intent intent, int flags, int startId) {
96 + new Thread(
97 + () -> {
98 + while (true) {
99 + sendSteps();
100 + try {
101 + Thread.sleep(10000);
102 + } catch (InterruptedException e) {
103 + e.printStackTrace();
104 + }
105 + }
106 + }
107 + ).start();
108 +
109 + return super.onStartCommand(intent, flags, startId);
110 + }
111 +
112 + @Override
113 + public void onDestroy() {
114 + super.onDestroy();
115 +
116 + unregisterStepSensor();
117 + }
118 +
119 + @Nullable
120 + @Override
121 + public IBinder onBind(Intent intent) {
122 + return null;
123 + }
124 +
125 +// @NonNull
126 +// @Override
127 +// public Result doWork() {
128 +// sendSteps();
129 +// return Result.success();
130 +// }
131 +
132 +// @Override
133 +// public void onStopped() {
134 +// super.onStopped();
135 +//
136 +// unregisterStepSensor();
137 +//
138 +// if (WarpUtils.getStepsCounter(mContext) > 0) {
139 +// sendSteps();
140 +// }
141 +// }
142 +
143 + @Override
144 + public void onSensorChanged(SensorEvent sensorEvent) {
145 + if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
146 + updateSteps(
147 + sensorEvent.timestamp,
148 + sensorEvent.values[0],
149 + sensorEvent.values[1],
150 + sensorEvent.values[2]);
151 + }
152 + }
153 +
154 + @Override
155 + public void onAccuracyChanged(Sensor sensor, int i) {
156 +
157 + }
158 +
159 + // ===========================================================
160 + // Methods
161 + // ===========================================================
162 +
163 + public void registerStepSensor() {
164 + mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
165 + }
166 +
167 + public void unregisterStepSensor() {
168 + mSensorManager.unregisterListener(this);
169 + }
170 +
171 + private void updateSteps(long timeNs, float x, float y, float z) {
172 + float[] currentAccel = new float[3];
173 + currentAccel[0] = x;
174 + currentAccel[1] = y;
175 + currentAccel[2] = z;
176 +
177 + // First step is to update our guess of where the global z vector is.
178 + accelRingCounter++;
179 + accelRingX[accelRingCounter % ACCEL_RING_SIZE] = currentAccel[0];
180 + accelRingY[accelRingCounter % ACCEL_RING_SIZE] = currentAccel[1];
181 + accelRingZ[accelRingCounter % ACCEL_RING_SIZE] = currentAccel[2];
182 +
183 + float[] worldZ = new float[3];
184 + worldZ[0] = sum(accelRingX) / Math.min(accelRingCounter, ACCEL_RING_SIZE);
185 + worldZ[1] = sum(accelRingY) / Math.min(accelRingCounter, ACCEL_RING_SIZE);
186 + worldZ[2] = sum(accelRingZ) / Math.min(accelRingCounter, ACCEL_RING_SIZE);
187 +
188 + float normalization_factor = norm(worldZ);
189 +
190 + worldZ[0] = worldZ[0] / normalization_factor;
191 + worldZ[1] = worldZ[1] / normalization_factor;
192 + worldZ[2] = worldZ[2] / normalization_factor;
193 +
194 + float currentZ = dot(worldZ, currentAccel) - normalization_factor;
195 + velRingCounter++;
196 + velRing[velRingCounter % VEL_RING_SIZE] = currentZ;
197 +
198 + float velocityEstimate = sum(velRing);
199 +
200 + if (velocityEstimate > STEP_THRESHOLD
201 + && oldVelocityEstimate <= STEP_THRESHOLD
202 + && (timeNs - lastStepTimeNs > STEP_DELAY_NS)) {
203 + mSteps++;
204 + WarpUtils.setStepsCounter(mContext, mSteps);
205 +
206 + // if we want to send the steps back to an activity/fragment/service etc
207 +// mHealthCallback.onStepCount(mSteps);
208 + lastStepTimeNs = timeNs;
209 + }
210 + oldVelocityEstimate = velocityEstimate;
211 + }
212 +
213 + private float sum(float[] array) {
214 + float retval = 0;
215 + for (float v : array) {
216 + retval += v;
217 + }
218 + return retval;
219 + }
220 +
221 + private float[] cross(float[] arrayA, float[] arrayB) {
222 + float[] retArray = new float[3];
223 + retArray[0] = arrayA[1] * arrayB[2] - arrayA[2] * arrayB[1];
224 + retArray[1] = arrayA[2] * arrayB[0] - arrayA[0] * arrayB[2];
225 + retArray[2] = arrayA[0] * arrayB[1] - arrayA[1] * arrayB[0];
226 + return retArray;
227 + }
228 +
229 + private float norm(float[] array) {
230 + float retval = 0;
231 + for (float v : array) {
232 + retval += v * v;
233 + }
234 + return (float) Math.sqrt(retval);
235 + }
236 +
237 + private float dot(float[] a, float[] b) {
238 + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
239 + }
240 +
241 + private float[] normalize(float[] a) {
242 + float[] retval = new float[a.length];
243 + float norm = norm(a);
244 + for (int i = 0; i < a.length; i++) {
245 + retval[i] = a[i] / norm;
246 + }
247 + return retval;
248 + }
249 +
250 + private void sendSteps() {
251 + String date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefault()).format(new Date());
252 +
253 + WarplyManager.setPacingDetails(new PacingCalculateRequest()
254 + .setCounter(WarpUtils.getStepsCounter(mContext))
255 + .setDate(date),
256 + new CallbackReceiver<JSONObject>() {
257 + @Override
258 + public void onSuccess(JSONObject result) {
259 + WarpUtils.log("Warply Health Service success");
260 + int status = result.optInt("status", 2);
261 + if (status == 1) {
262 + mSteps = 0;
263 + WarpUtils.setStepsCounter(mContext, 0);
264 + }
265 + }
266 +
267 + @Override
268 + public void onFailure(int errorCode) {
269 + WarpUtils.log("Warply Health Service error: " + String.valueOf(errorCode));
270 + }
271 + });
272 + }
273 +}
...@@ -133,6 +133,10 @@ public class WarpUtils { ...@@ -133,6 +133,10 @@ public class WarpUtils {
133 + "more_popup"; 133 + "more_popup";
134 private static final String PREFERENCES_KEY_USER_TAG = PREFERENCES_PREFIX 134 private static final String PREFERENCES_KEY_USER_TAG = PREFERENCES_PREFIX
135 + "user_badge"; 135 + "user_badge";
136 + private static final String PREFERENCES_KEY_WEBVIEW_PARAMS = PREFERENCES_PREFIX
137 + + "webview_params";
138 + private static final String PREFERENCES_STEPS_COUNTER = PREFERENCES_PREFIX
139 + + "steps_counter";
136 140
137 private static SharedPreferences _prefs; 141 private static SharedPreferences _prefs;
138 142
...@@ -586,6 +590,28 @@ public class WarpUtils { ...@@ -586,6 +590,28 @@ public class WarpUtils {
586 editor.apply(); 590 editor.apply();
587 } 591 }
588 592
593 + public static void setWebviewParams(Context context, JSONObject params) {
594 + SharedPreferences.Editor editor = getPreferences(context).edit();
595 + editor.putString(PREFERENCES_KEY_WEBVIEW_PARAMS, params.toString());
596 + editor.apply();
597 + }
598 +
599 + public static String getWebviewParams(Context context) {
600 + SharedPreferences prefs = getPreferences(context);
601 + return prefs.getString(PREFERENCES_KEY_WEBVIEW_PARAMS, "");
602 + }
603 +
604 + public static void setStepsCounter(Context context, int counter) {
605 + SharedPreferences.Editor editor = getPreferences(context).edit();
606 + editor.putInt(PREFERENCES_STEPS_COUNTER, counter);
607 + editor.apply();
608 + }
609 +
610 + public static int getStepsCounter(Context context) {
611 + SharedPreferences prefs = getPreferences(context);
612 + return prefs.getInt(PREFERENCES_STEPS_COUNTER, 0);
613 + }
614 +
589 public static JSONObject getDeviceInfoObject(Context context) { 615 public static JSONObject getDeviceInfoObject(Context context) {
590 SharedPreferences prefs = getPreferences(context); 616 SharedPreferences prefs = getPreferences(context);
591 try { 617 try {
......
...@@ -127,8 +127,8 @@ public class WarplyHealthManager implements SensorEventListener { ...@@ -127,8 +127,8 @@ public class WarplyHealthManager implements SensorEventListener {
127 if (velocityEstimate > STEP_THRESHOLD 127 if (velocityEstimate > STEP_THRESHOLD
128 && oldVelocityEstimate <= STEP_THRESHOLD 128 && oldVelocityEstimate <= STEP_THRESHOLD
129 && (timeNs - lastStepTimeNs > STEP_DELAY_NS)) { 129 && (timeNs - lastStepTimeNs > STEP_DELAY_NS)) {
130 - //TODO: if we want to send the steps back to an activity/fragment/service etc
131 mSteps++; 130 mSteps++;
131 + // if we want to send the steps back to an activity/fragment/service etc
132 mHealthCallback.onStepCount(mSteps); 132 mHealthCallback.onStepCount(mSteps);
133 lastStepTimeNs = timeNs; 133 lastStepTimeNs = timeNs;
134 } 134 }
......
...@@ -30,6 +30,8 @@ import org.json.JSONException; ...@@ -30,6 +30,8 @@ import org.json.JSONException;
30 import org.json.JSONObject; 30 import org.json.JSONObject;
31 31
32 import java.util.ArrayList; 32 import java.util.ArrayList;
33 +import java.util.Collections;
34 +import java.util.Comparator;
33 35
34 import ly.warp.sdk.Warply; 36 import ly.warp.sdk.Warply;
35 import ly.warp.sdk.db.WarplyDBHelper; 37 import ly.warp.sdk.db.WarplyDBHelper;
...@@ -78,6 +80,7 @@ import ly.warp.sdk.io.request.CosmotePostEventRequest; ...@@ -78,6 +80,7 @@ import ly.warp.sdk.io.request.CosmotePostEventRequest;
78 import ly.warp.sdk.io.request.CosmoteRetrieveSharingRequest; 80 import ly.warp.sdk.io.request.CosmoteRetrieveSharingRequest;
79 import ly.warp.sdk.io.request.CosmoteSharingRequest; 81 import ly.warp.sdk.io.request.CosmoteSharingRequest;
80 import ly.warp.sdk.io.request.CosmoteSubmitOrderRequest; 82 import ly.warp.sdk.io.request.CosmoteSubmitOrderRequest;
83 +import ly.warp.sdk.io.request.PacingCalculateRequest;
81 import ly.warp.sdk.io.request.PacingDetailsRequest; 84 import ly.warp.sdk.io.request.PacingDetailsRequest;
82 import ly.warp.sdk.io.request.WarplyAddAddressRequest; 85 import ly.warp.sdk.io.request.WarplyAddAddressRequest;
83 import ly.warp.sdk.io.request.WarplyAddCardRequest; 86 import ly.warp.sdk.io.request.WarplyAddCardRequest;
...@@ -1371,6 +1374,7 @@ public class WarplyManager { ...@@ -1371,6 +1374,7 @@ public class WarplyManager {
1371 @Override 1374 @Override
1372 public void onSuccess(CampaignList result) { 1375 public void onSuccess(CampaignList result) {
1373 mNewCampaignList.addAll(result); 1376 mNewCampaignList.addAll(result);
1377 + Collections.sort(mNewCampaignList, (obj1, obj2) -> Integer.compare(obj1.getSorting(), obj2.getSorting()));
1374 CampaignList campaignLoyaltyList = new CampaignList(); 1378 CampaignList campaignLoyaltyList = new CampaignList();
1375 campaignLoyaltyList.clear(); 1379 campaignLoyaltyList.clear();
1376 for (Campaign camp : mNewCampaignList) { 1380 for (Campaign camp : mNewCampaignList) {
...@@ -2301,7 +2305,24 @@ public class WarplyManager { ...@@ -2301,7 +2305,24 @@ public class WarplyManager {
2301 2305
2302 @Override 2306 @Override
2303 public void onFailure(int errorCode) { 2307 public void onFailure(int errorCode) {
2304 - receiver.onFailure(errorCode); 2308 + if (errorCode == 401) {
2309 + refreshToken(new WarplyRefreshTokenRequest(), new CallbackReceiver<JSONObject>() {
2310 + @Override
2311 + public void onSuccess(JSONObject result) {
2312 + int status = result.optInt("status", 2);
2313 + if (status == 1)
2314 + submitOrder(request, receiver);
2315 + else
2316 + receiver.onFailure(status);
2317 + }
2318 +
2319 + @Override
2320 + public void onFailure(int errorCode) {
2321 + receiver.onFailure(errorCode);
2322 + }
2323 + });
2324 + } else
2325 + receiver.onFailure(errorCode);
2305 } 2326 }
2306 }); 2327 });
2307 } 2328 }
...@@ -2359,7 +2380,63 @@ public class WarplyManager { ...@@ -2359,7 +2380,63 @@ public class WarplyManager {
2359 2380
2360 @Override 2381 @Override
2361 public void onFailure(int errorCode) { 2382 public void onFailure(int errorCode) {
2362 - receiver.onFailure(errorCode); 2383 + if (errorCode == 401) {
2384 + refreshToken(new WarplyRefreshTokenRequest(), new CallbackReceiver<JSONObject>() {
2385 + @Override
2386 + public void onSuccess(JSONObject result) {
2387 + int status = result.optInt("status", 2);
2388 + if (status == 1)
2389 + postEvent(request, receiver);
2390 + else
2391 + receiver.onFailure(status);
2392 + }
2393 +
2394 + @Override
2395 + public void onFailure(int errorCode) {
2396 + receiver.onFailure(errorCode);
2397 + }
2398 + });
2399 + } else
2400 + receiver.onFailure(errorCode);
2401 + }
2402 + });
2403 + }
2404 +
2405 + public static void setPacingDetails(PacingCalculateRequest request, final CallbackReceiver<JSONObject> receiver) {
2406 + WarpUtils.log("************* WARPLY Post Event Request ********************");
2407 + WarpUtils.log("[WARP Trace] WARPLY Post Event Request is active");
2408 + WarpUtils.log("**************************************************");
2409 +
2410 + Warply.postReceiveMicroappData(true, "context", request.toJson(), new CallbackReceiver<JSONObject>() {
2411 + @Override
2412 + public void onSuccess(JSONObject result) {
2413 + int status = result.optInt("status", 2);
2414 + if (status == 1) {
2415 + receiver.onSuccess(result);
2416 + } else
2417 + receiver.onFailure(status);
2418 + }
2419 +
2420 + @Override
2421 + public void onFailure(int errorCode) {
2422 + if (errorCode == 401) {
2423 + refreshToken(new WarplyRefreshTokenRequest(), new CallbackReceiver<JSONObject>() {
2424 + @Override
2425 + public void onSuccess(JSONObject result) {
2426 + int status = result.optInt("status", 2);
2427 + if (status == 1)
2428 + setPacingDetails(request, receiver);
2429 + else
2430 + receiver.onFailure(status);
2431 + }
2432 +
2433 + @Override
2434 + public void onFailure(int errorCode) {
2435 + receiver.onFailure(errorCode);
2436 + }
2437 + });
2438 + } else
2439 + receiver.onFailure(errorCode);
2363 } 2440 }
2364 }); 2441 });
2365 } 2442 }
......
...@@ -35,13 +35,8 @@ import android.content.pm.ApplicationInfo; ...@@ -35,13 +35,8 @@ import android.content.pm.ApplicationInfo;
35 import android.net.Uri; 35 import android.net.Uri;
36 import android.net.http.SslError; 36 import android.net.http.SslError;
37 import android.os.Build; 37 import android.os.Build;
38 -
39 -import androidx.core.content.ContextCompat;
40 -import androidx.work.WorkManager;
41 -
42 import android.text.TextUtils; 38 import android.text.TextUtils;
43 import android.util.AttributeSet; 39 import android.util.AttributeSet;
44 -import android.util.Log;
45 import android.webkit.GeolocationPermissions.Callback; 40 import android.webkit.GeolocationPermissions.Callback;
46 import android.webkit.JavascriptInterface; 41 import android.webkit.JavascriptInterface;
47 import android.webkit.SslErrorHandler; 42 import android.webkit.SslErrorHandler;
...@@ -51,6 +46,10 @@ import android.webkit.WebView; ...@@ -51,6 +46,10 @@ import android.webkit.WebView;
51 import android.webkit.WebViewClient; 46 import android.webkit.WebViewClient;
52 import android.widget.Toast; 47 import android.widget.Toast;
53 48
49 +import androidx.core.content.ContextCompat;
50 +import androidx.work.PeriodicWorkRequest;
51 +import androidx.work.WorkManager;
52 +
54 import org.greenrobot.eventbus.EventBus; 53 import org.greenrobot.eventbus.EventBus;
55 import org.json.JSONArray; 54 import org.json.JSONArray;
56 import org.json.JSONException; 55 import org.json.JSONException;
...@@ -61,14 +60,13 @@ import java.net.URLDecoder; ...@@ -61,14 +60,13 @@ import java.net.URLDecoder;
61 import java.util.HashMap; 60 import java.util.HashMap;
62 import java.util.LinkedHashMap; 61 import java.util.LinkedHashMap;
63 import java.util.Map; 62 import java.util.Map;
63 +import java.util.concurrent.TimeUnit;
64 64
65 import ly.warp.sdk.Warply; 65 import ly.warp.sdk.Warply;
66 import ly.warp.sdk.io.models.CouponEventModel; 66 import ly.warp.sdk.io.models.CouponEventModel;
67 import ly.warp.sdk.io.models.QuestionnaireEventModel; 67 import ly.warp.sdk.io.models.QuestionnaireEventModel;
68 -import ly.warp.sdk.io.models.WarplyPacingCardEventModel;
69 -import ly.warp.sdk.io.models.WarplyPacingCardServiceEnabledModel;
70 import ly.warp.sdk.io.models.WarplyPacingEventModel; 68 import ly.warp.sdk.io.models.WarplyPacingEventModel;
71 -import ly.warp.sdk.services.UpdateUserLocationService; 69 +import ly.warp.sdk.services.WarplyHealthService;
72 import ly.warp.sdk.utils.WarpUtils; 70 import ly.warp.sdk.utils.WarpUtils;
73 import ly.warp.sdk.utils.WarplyProperty; 71 import ly.warp.sdk.utils.WarplyProperty;
74 import ly.warp.sdk.utils.WarplyUrlHandler; 72 import ly.warp.sdk.utils.WarplyUrlHandler;
...@@ -84,6 +82,7 @@ public class WarpView extends WebView { ...@@ -84,6 +82,7 @@ public class WarpView extends WebView {
84 private static final String URL_ACTION_MAIL = "mailto"; 82 private static final String URL_ACTION_MAIL = "mailto";
85 private static final String URL_ACTION_MARKET = "market"; 83 private static final String URL_ACTION_MARKET = "market";
86 private static final String URL_ACTION_MARKET_AUTHORITY = "play.google.com"; 84 private static final String URL_ACTION_MARKET_AUTHORITY = "play.google.com";
85 + private static final String TAG_STEPS_WORKER = "ly.warp.sdk.services.WarplyHealthService";
87 86
88 // =========================================================== 87 // ===========================================================
89 // Fields 88 // Fields
...@@ -371,11 +370,6 @@ public class WarpView extends WebView { ...@@ -371,11 +370,6 @@ public class WarpView extends WebView {
371 public class JSInterface { 370 public class JSInterface {
372 @JavascriptInterface 371 @JavascriptInterface
373 public void sendMessage(String message) { 372 public void sendMessage(String message) {
374 -// Intent intent = new Intent(android.content.Intent.ACTION_SEND);
375 -// intent.setType("text/plain");
376 -// intent.putExtra(android.content.Intent.EXTRA_TEXT, message);
377 -// getContext().startActivity(Intent.createChooser(intent, "Άνοιγμα με"));
378 -
379 if (message.contains("event")) { 373 if (message.contains("event")) {
380 String[] parts = message.split(":"); 374 String[] parts = message.split(":");
381 if (parts[1].equals("closeArtwork")) { 375 if (parts[1].equals("closeArtwork")) {
...@@ -423,10 +417,20 @@ public class WarpView extends WebView { ...@@ -423,10 +417,20 @@ public class WarpView extends WebView {
423 pacingService.setEnabled(true); 417 pacingService.setEnabled(true);
424 EventBus.getDefault().post(new WarplyEventBusManager(pacingService)); 418 EventBus.getDefault().post(new WarplyEventBusManager(pacingService));
425 }*/ else if (parts[1].equals("steps") && parts[2].equals("shortcutEnabled")) { 419 }*/ else if (parts[1].equals("steps") && parts[2].equals("shortcutEnabled")) {
420 +// PeriodicWorkRequest stepsWorker = new PeriodicWorkRequest.Builder(WarplyHealthService.class, 15, TimeUnit.MINUTES)
421 +// .build();
422 +// WorkManager.getInstance(Warply.getWarplyContext()).enqueue(stepsWorker);
423 + Intent stepsServiceIntent = new Intent(Warply.getWarplyContext(), WarplyHealthService.class);
424 + Warply.getWarplyContext().startService(stepsServiceIntent);
425 +
426 WarplyPacingEventModel pacingVisible = new WarplyPacingEventModel(); 426 WarplyPacingEventModel pacingVisible = new WarplyPacingEventModel();
427 pacingVisible.setVisible(true); 427 pacingVisible.setVisible(true);
428 EventBus.getDefault().post(new WarplyEventBusManager(pacingVisible)); 428 EventBus.getDefault().post(new WarplyEventBusManager(pacingVisible));
429 } else if (parts[1].equals("steps") && parts[2].equals("shortcutDisabled")) { 429 } else if (parts[1].equals("steps") && parts[2].equals("shortcutDisabled")) {
430 +// WorkManager.getInstance(Warply.getWarplyContext()).cancelAllWork();
431 + Intent stepsServiceIntent = new Intent(Warply.getWarplyContext(), WarplyHealthService.class);
432 + Warply.getWarplyContext().stopService(stepsServiceIntent);
433 +
430 WarplyPacingEventModel pacingVisible = new WarplyPacingEventModel(); 434 WarplyPacingEventModel pacingVisible = new WarplyPacingEventModel();
431 pacingVisible.setVisible(false); 435 pacingVisible.setVisible(false);
432 EventBus.getDefault().post(new WarplyEventBusManager(pacingVisible)); 436 EventBus.getDefault().post(new WarplyEventBusManager(pacingVisible));
...@@ -500,7 +504,10 @@ public class WarpView extends WebView { ...@@ -500,7 +504,10 @@ public class WarpView extends WebView {
500 504
501 @Override 505 @Override
502 public void onPageFinished(WebView view, String url) { 506 public void onPageFinished(WebView view, String url) {
507 + String scriptSource = "passParams(" + WarpUtils.getWebviewParams(getContext()) + ");";
508 + view.evaluateJavascript(scriptSource, s -> {
503 509
510 + });
504 if (url.contains("about:blank")) { 511 if (url.contains("about:blank")) {
505 WarpView.this.clearHistory(); 512 WarpView.this.clearHistory();
506 } 513 }
......
...@@ -386,6 +386,7 @@ ...@@ -386,6 +386,7 @@
386 </androidx.constraintlayout.widget.ConstraintLayout> 386 </androidx.constraintlayout.widget.ConstraintLayout>
387 387
388 <TextView 388 <TextView
389 + android:id="@+id/tv_active_coupons_header"
389 android:layout_width="wrap_content" 390 android:layout_width="wrap_content"
390 android:layout_height="wrap_content" 391 android:layout_height="wrap_content"
391 android:layout_gravity="start" 392 android:layout_gravity="start"
......