Skip to content

Commit 0331e31

Browse files
authored
Merge pull request #1422 from OneSignal/Feature/IAM_size_percentages
Feature no margin IAMs
2 parents 740b39c + 67b3f92 commit 0331e31

File tree

6 files changed

+130
-68
lines changed

6 files changed

+130
-68
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/InAppMessageView.java

Lines changed: 55 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import android.view.WindowManager;
2020
import android.view.animation.Animation;
2121
import android.webkit.WebView;
22-
import android.widget.LinearLayout;
2322
import android.widget.PopupWindow;
2423
import android.widget.RelativeLayout;
2524

@@ -55,7 +54,6 @@ class InAppMessageView {
5554

5655
private static final int ACTIVITY_FINISH_AFTER_DISMISS_DELAY_MS = 600;
5756
private static final int ACTIVITY_INIT_DELAY = 200;
58-
private static final int MARGIN_PX_SIZE = dpToPx(24);
5957
private static final int DRAG_THRESHOLD_PX_SIZE = dpToPx(4);
6058
private PopupWindow popupWindow;
6159

@@ -69,7 +67,11 @@ interface InAppMessageViewListener {
6967
private final Handler handler = new Handler();
7068
private int pageWidth;
7169
private int pageHeight;
72-
private double dismissDuration;
70+
private int marginPxSizeLeft = dpToPx(24);
71+
private int marginPxSizeRight = dpToPx(24);
72+
private int marginPxSizeTop = dpToPx(24);
73+
private int marginPxSizeBottom = dpToPx(24);
74+
private double displayDuration;
7375
private boolean hasBackground;
7476
private boolean shouldDismissWhenActive = false;
7577
private boolean isDragging = false;
@@ -81,14 +83,27 @@ interface InAppMessageViewListener {
8183
private InAppMessageViewListener messageController;
8284
private Runnable scheduleDismissRunnable;
8385

84-
InAppMessageView(@NonNull WebView webView, @NonNull WebViewManager.Position displayLocation, int pageHeight, double dismissDuration, boolean disableDragDismiss) {
86+
InAppMessageView(@NonNull WebView webView, @NonNull OSInAppMessageContent content, boolean disableDragDismiss) {
8587
this.webView = webView;
86-
this.displayLocation = displayLocation;
87-
this.pageHeight = pageHeight;
88+
this.displayLocation = content.getDisplayLocation();
89+
this.pageHeight = content.getPageHeight();
8890
this.pageWidth = ViewGroup.LayoutParams.MATCH_PARENT;
89-
this.dismissDuration = Double.isNaN(dismissDuration) ? 0 : dismissDuration;
91+
this.displayDuration = content.getDisplayDuration() == null ? 0 : content.getDisplayDuration();
9092
this.hasBackground = !displayLocation.isBanner();
9193
this.disableDragDismiss = disableDragDismiss;
94+
setMarginsFromContent(content);
95+
}
96+
97+
/**
98+
* For now we only support default margin or no margin.
99+
* Any non-zero value will be treated as default margin
100+
* @param content in app message content and style
101+
*/
102+
private void setMarginsFromContent(OSInAppMessageContent content) {
103+
this.marginPxSizeTop = content.getUseHeightMargin() ? dpToPx(24) : 0;
104+
this.marginPxSizeBottom = content.getUseHeightMargin() ? dpToPx(24) : 0;
105+
this.marginPxSizeLeft = content.getUseWidthMargin() ? dpToPx(24) : 0;
106+
this.marginPxSizeRight = content.getUseWidthMargin() ? dpToPx(24) : 0;
92107
}
93108

94109
void setWebView(WebView webView) {
@@ -114,7 +129,7 @@ void checkIfShouldDismiss() {
114129
finishAfterDelay(null);
115130
}
116131
}
117-
132+
118133
/**
119134
* This will fired when the device is rotated for example with a new provided height for the WebView
120135
* Called to shrink or grow the WebView when it receives a JS resize event with a new height.
@@ -160,12 +175,12 @@ void showInAppMessageView(Activity currentActivity) {
160175
);
161176
webViewLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
162177

163-
LinearLayout.LayoutParams linearLayoutParams = hasBackground ? createParentLinearLayoutParams() : null;
178+
RelativeLayout.LayoutParams relativeLayoutParams = hasBackground ? createParentRelativeLayoutParams() : null;
164179

165180
showDraggableView(
166181
displayLocation,
167182
webViewLayoutParams,
168-
linearLayoutParams,
183+
relativeLayoutParams,
169184
createDraggableLayoutParams(pageHeight, displayLocation, disableDragDismiss)
170185
);
171186
}
@@ -174,42 +189,43 @@ private int getDisplayYSize() {
174189
return OSViewUtils.getWindowHeight(currentActivity);
175190
}
176191

177-
private LinearLayout.LayoutParams createParentLinearLayoutParams() {
178-
LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams(pageWidth, LinearLayout.LayoutParams.MATCH_PARENT);
179-
192+
private RelativeLayout.LayoutParams createParentRelativeLayoutParams() {
193+
RelativeLayout.LayoutParams relativeLayoutParams = new RelativeLayout.LayoutParams(pageWidth, RelativeLayout.LayoutParams.MATCH_PARENT);
180194
switch (displayLocation) {
181195
case TOP_BANNER:
182-
linearLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
196+
relativeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
197+
relativeLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
183198
break;
184199
case BOTTOM_BANNER:
185-
linearLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
200+
relativeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
201+
relativeLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
186202
break;
187203
case CENTER_MODAL:
188204
case FULL_SCREEN:
189-
linearLayoutParams.gravity = Gravity.CENTER;
205+
relativeLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
190206
}
191207

192-
return linearLayoutParams;
208+
return relativeLayoutParams;
193209
}
194210

195211
private DraggableRelativeLayout.Params createDraggableLayoutParams(int pageHeight, WebViewManager.Position displayLocation, boolean disableDragging) {
196212
DraggableRelativeLayout.Params draggableParams = new DraggableRelativeLayout.Params();
197-
draggableParams.maxXPos = MARGIN_PX_SIZE;
198-
draggableParams.maxYPos = MARGIN_PX_SIZE;
213+
draggableParams.maxXPos = marginPxSizeRight;
214+
draggableParams.maxYPos = marginPxSizeTop;
199215
draggableParams.draggingDisabled = disableDragging;
200216
draggableParams.messageHeight = pageHeight;
201217
draggableParams.height = getDisplayYSize();
202218

203219
switch (displayLocation) {
204220
case TOP_BANNER:
205-
draggableParams.dragThresholdY = MARGIN_PX_SIZE - DRAG_THRESHOLD_PX_SIZE;
221+
draggableParams.dragThresholdY = marginPxSizeTop - DRAG_THRESHOLD_PX_SIZE;
206222
break;
207223
case BOTTOM_BANNER:
208224
draggableParams.posY = getDisplayYSize() - pageHeight;
209-
draggableParams.dragThresholdY = MARGIN_PX_SIZE + DRAG_THRESHOLD_PX_SIZE;
225+
draggableParams.dragThresholdY = marginPxSizeBottom + DRAG_THRESHOLD_PX_SIZE;
210226
break;
211227
case FULL_SCREEN:
212-
draggableParams.messageHeight = pageHeight = getDisplayYSize() - (MARGIN_PX_SIZE * 2);
228+
draggableParams.messageHeight = pageHeight = getDisplayYSize() - (marginPxSizeBottom + marginPxSizeTop);
213229
// fall through for FULL_SCREEN since it shares similar params to CENTER_MODAL
214230
case CENTER_MODAL:
215231
int y = (getDisplayYSize() / 2) - (pageHeight / 2);
@@ -228,7 +244,7 @@ private DraggableRelativeLayout.Params createDraggableLayoutParams(int pageHeigh
228244

229245
private void showDraggableView(final WebViewManager.Position displayLocation,
230246
final RelativeLayout.LayoutParams relativeLayoutParams,
231-
final LinearLayout.LayoutParams linearLayoutParams,
247+
final RelativeLayout.LayoutParams draggableRelativeLayoutParams,
232248
final DraggableRelativeLayout.Params webViewLayoutParams) {
233249
OSUtils.runOnMainUIThread(new Runnable() {
234250
@Override
@@ -239,8 +255,8 @@ public void run() {
239255
webView.setLayoutParams(relativeLayoutParams);
240256

241257
Context context = currentActivity.getApplicationContext();
242-
setUpDraggableLayout(context, linearLayoutParams, webViewLayoutParams);
243-
setUpParentLinearLayout(context);
258+
setUpDraggableLayout(context, draggableRelativeLayoutParams, webViewLayoutParams);
259+
setUpParentRelativeLayout(context);
244260
createPopupWindow(parentRelativeLayout);
245261

246262
if (messageController != null) {
@@ -275,6 +291,10 @@ private void createPopupWindow(@NonNull RelativeLayout parentRelativeLayout) {
275291
case BOTTOM_BANNER:
276292
gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
277293
break;
294+
case CENTER_MODAL:
295+
case FULL_SCREEN:
296+
gravity = Gravity.CENTER_HORIZONTAL;
297+
break;
278298
}
279299
}
280300

@@ -293,7 +313,7 @@ private void createPopupWindow(@NonNull RelativeLayout parentRelativeLayout) {
293313
);
294314
}
295315

296-
private void setUpParentLinearLayout(Context context) {
316+
private void setUpParentRelativeLayout(Context context) {
297317
parentRelativeLayout = new RelativeLayout(context);
298318
parentRelativeLayout.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
299319
parentRelativeLayout.setClipChildren(false);
@@ -302,11 +322,11 @@ private void setUpParentLinearLayout(Context context) {
302322
}
303323

304324
private void setUpDraggableLayout(final Context context,
305-
LinearLayout.LayoutParams linearLayoutParams,
325+
RelativeLayout.LayoutParams relativeLayoutParams,
306326
DraggableRelativeLayout.Params draggableParams) {
307327
draggableRelativeLayout = new DraggableRelativeLayout(context);
308-
if (linearLayoutParams != null)
309-
draggableRelativeLayout.setLayoutParams(linearLayoutParams);
328+
if (relativeLayoutParams != null)
329+
draggableRelativeLayout.setLayoutParams(relativeLayoutParams);
310330
draggableRelativeLayout.setParams(draggableParams);
311331
draggableRelativeLayout.setListener(new DraggableRelativeLayout.DraggableListener() {
312332
@Override
@@ -335,7 +355,7 @@ public void onDragEnd() {
335355
cardView.setTag(IN_APP_MESSAGE_CARD_VIEW_TAG);
336356
cardView.addView(webView);
337357

338-
draggableRelativeLayout.setPadding(MARGIN_PX_SIZE, MARGIN_PX_SIZE, MARGIN_PX_SIZE, MARGIN_PX_SIZE);
358+
draggableRelativeLayout.setPadding(marginPxSizeLeft, marginPxSizeTop, marginPxSizeRight, marginPxSizeBottom);
339359
draggableRelativeLayout.setClipChildren(false);
340360
draggableRelativeLayout.setClipToPadding(false);
341361
draggableRelativeLayout.addView(cardView);
@@ -385,7 +405,7 @@ private CardView createCardView(Context context) {
385405
* Schedule dismiss behavior, if IAM has a dismiss after X number of seconds timer.
386406
*/
387407
private void startDismissTimerIfNeeded() {
388-
if (dismissDuration <= 0)
408+
if (displayDuration <= 0)
389409
return;
390410

391411
if (scheduleDismissRunnable != null)
@@ -405,7 +425,7 @@ public void run() {
405425
}
406426
}
407427
};
408-
handler.postDelayed(scheduleDismissRunnable, (long) dismissDuration * 1_000);
428+
handler.postDelayed(scheduleDismissRunnable, (long) displayDuration * 1_000);
409429
}
410430

411431
// Do not add view until activity is ready
@@ -543,7 +563,7 @@ private void animateTop(View messageView, int height, Animation.AnimationListene
543563
// Animate the message view from above the screen downward to the top
544564
OneSignalAnimate.animateViewByTranslation(
545565
messageView,
546-
-height - MARGIN_PX_SIZE,
566+
-height - marginPxSizeTop,
547567
0f,
548568
IN_APP_BANNER_ANIMATION_DURATION_MS,
549569
new OneSignalBounceInterpolator(0.1, 8.0),
@@ -555,7 +575,7 @@ private void animateBottom(View messageView, int height, Animation.AnimationList
555575
// Animate the message view from under the screen upward to the bottom
556576
OneSignalAnimate.animateViewByTranslation(
557577
messageView,
558-
height + MARGIN_PX_SIZE,
578+
height + marginPxSizeBottom,
559579
0f,
560580
IN_APP_BANNER_ANIMATION_DURATION_MS,
561581
new OneSignalBounceInterpolator(0.1, 8.0),
@@ -618,7 +638,7 @@ public String toString() {
618638
"currentActivity=" + currentActivity +
619639
", pageWidth=" + pageWidth +
620640
", pageHeight=" + pageHeight +
621-
", dismissDuration=" + dismissDuration +
641+
", displayDuration=" + displayDuration +
622642
", hasBackground=" + hasBackground +
623643
", shouldDismissWhenActive=" + shouldDismissWhenActive +
624644
", isDragging=" + isDragging +
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.onesignal
2+
3+
import org.json.JSONObject
4+
5+
const val HTML = "html"
6+
const val STYLES = "styles"
7+
const val DISPLAY_DURATION = "display_duration"
8+
const val REMOVE_HEIGHT_MARGIN = "remove_height_margin"
9+
const val REMOVE_WIDTH_MARGIN = "remove_width_margin"
10+
11+
internal open class OSInAppMessageContent constructor(jsonObject: JSONObject) {
12+
var contentHtml: String? = null
13+
var useHeightMargin: Boolean = true
14+
var useWidthMargin: Boolean = true
15+
// The following properties are populated from Javascript events
16+
var displayLocation: WebViewManager.Position? = null
17+
var displayDuration: Double? = null
18+
var pageHeight: Int = 0
19+
20+
init {
21+
contentHtml = jsonObject.optString(HTML)
22+
displayDuration = jsonObject.optDouble(DISPLAY_DURATION)
23+
var styles: JSONObject? = jsonObject.optJSONObject(STYLES)
24+
useHeightMargin = !(styles?.optBoolean(REMOVE_HEIGHT_MARGIN, false) ?: false)
25+
useWidthMargin = !(styles?.optBoolean(REMOVE_WIDTH_MARGIN, false) ?: false)
26+
}
27+
}

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSInAppMessageController.java

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class OSInAppMessageController extends OSBackgroundManager implements OSDynamicT
8383
private String userTagsString = null;
8484

8585
@Nullable
86-
private String pendingHTMLContent = null;
86+
private OSInAppMessageContent pendingMessageContent = null;
8787

8888
private boolean waitForTags = false;
8989

@@ -775,18 +775,25 @@ public void tagsAvailable(JSONObject tags) {
775775
if (tags != null) {
776776
userTagsString = tags.toString();
777777
}
778-
if (pendingHTMLContent != null) {
778+
if (pendingMessageContent != null) {
779779
if (!isPreview) {
780780
OneSignal.getSessionManager().onInAppMessageReceived(message.messageId);
781781
}
782-
WebViewManager.showHTMLString(message, taggedHTMLString(pendingHTMLContent));
783-
pendingHTMLContent = null;
782+
pendingMessageContent.setContentHtml(taggedHTMLString(pendingMessageContent.getContentHtml()));
783+
WebViewManager.showMessageContent(message, pendingMessageContent);
784+
pendingMessageContent = null;
784785
}
785786
}
786787
});
787788
}
788789
}
789790

791+
private OSInAppMessageContent parseMessageContentData(JSONObject data, OSInAppMessageInternal message) {
792+
OSInAppMessageContent content = new OSInAppMessageContent(data);
793+
message.setDisplayDuration(content.getDisplayDuration());
794+
return content;
795+
}
796+
790797
private void displayMessage(@NonNull final OSInAppMessageInternal message) {
791798
if (!inAppMessagingEnabled) {
792799
logger.verbose("In app messaging is currently paused, in app messages will not be shown!");
@@ -803,17 +810,19 @@ private void displayMessage(@NonNull final OSInAppMessageInternal message) {
803810
public void onSuccess(String response) {
804811
try {
805812
JSONObject jsonResponse = new JSONObject(response);
806-
String htmlStr = jsonResponse.getString("html");
807-
808-
double displayDuration = jsonResponse.optDouble("display_duration");
809-
message.setDisplayDuration(displayDuration);
813+
OSInAppMessageContent content = parseMessageContentData(jsonResponse, message);
814+
if (content.getContentHtml() == null) {
815+
logger.debug("displayMessage:OnSuccess: No HTML retrieved from loadMessageContent");
816+
return;
817+
}
810818
if (waitForTags) {
811-
pendingHTMLContent = htmlStr;
819+
pendingMessageContent = content;
812820
return;
813821
}
814822
OneSignal.getSessionManager().onInAppMessageReceived(message.messageId);
815823
onMessageWillDisplay(message);
816-
WebViewManager.showHTMLString(message, taggedHTMLString(htmlStr));
824+
content.setContentHtml(taggedHTMLString(content.getContentHtml()));
825+
WebViewManager.showMessageContent(message, content);
817826
} catch (JSONException e) {
818827
e.printStackTrace();
819828
}
@@ -858,16 +867,18 @@ void displayPreviewMessage(@NonNull String previewUUID) {
858867
public void onSuccess(String response) {
859868
try {
860869
JSONObject jsonResponse = new JSONObject(response);
861-
String htmlStr = jsonResponse.getString("html");
862-
863-
double displayDuration = jsonResponse.optDouble("display_duration");
864-
message.setDisplayDuration(displayDuration);
870+
OSInAppMessageContent content = parseMessageContentData(jsonResponse, message);
871+
if (content.getContentHtml() == null) {
872+
logger.debug("displayPreviewMessage:OnSuccess: No HTML retrieved from loadMessageContent");
873+
return;
874+
}
865875
if (waitForTags) {
866-
pendingHTMLContent = htmlStr;
876+
pendingMessageContent = content;
867877
return;
868878
}
869879
onMessageWillDisplay(message);
870-
WebViewManager.showHTMLString(message, taggedHTMLString(htmlStr));
880+
content.setContentHtml(taggedHTMLString(content.getContentHtml()));
881+
WebViewManager.showMessageContent(message, content);
871882
} catch (JSONException e) {
872883
e.printStackTrace();
873884
}

OneSignalSDK/onesignal/src/main/java/com/onesignal/OSInAppMessagePage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import org.json.JSONObject
77
const val PAGE_ID = "pageId"
88
const val PAGE_INDEX = "pageIndex"
99

10-
class OSInAppMessagePage constructor(jsonObject: JSONObject) {
10+
internal open class OSInAppMessagePage constructor(jsonObject: JSONObject) {
1111
var pageId: String? = null
1212
var pageIndex: String? = null
1313

0 commit comments

Comments
 (0)