package com.appboy.ui.inappmessage.views; import android.app.Activity; import android.content.Context; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.appboy.Constants; import com.appboy.enums.inappmessage.ImageStyle; import com.appboy.models.IInAppMessageImmersive; import com.appboy.support.AppboyLogger; import com.appboy.ui.R; import com.appboy.ui.inappmessage.AppboyInAppMessageImageView; import com.appboy.ui.inappmessage.AppboyInAppMessageSimpleDraweeView; import com.appboy.ui.inappmessage.IInAppMessageImageView; import com.appboy.ui.inappmessage.config.AppboyInAppMessageParams; import com.appboy.ui.support.FrescoLibraryUtils; import com.appboy.ui.support.ViewUtils; import com.facebook.drawee.controller.BaseControllerListener; import com.facebook.drawee.controller.ControllerListener; import com.facebook.imagepipeline.image.ImageInfo; import java.util.ArrayList; import java.util.List; public class AppboyInAppMessageModalView extends AppboyInAppMessageImmersiveBaseView { private static final String TAG = String.format("%s.%s", Constants.APPBOY_LOG_TAG_PREFIX, AppboyInAppMessageModalView.class.getName()); private AppboyInAppMessageImageView mAppboyInAppMessageImageView; /** * @see AppboyInAppMessageBaseView#getMessageSimpleDraweeView() */ private View mSimpleDraweeView; public AppboyInAppMessageModalView(Context context, AttributeSet attrs) { super(context, attrs); } public void inflateStubViews(Activity activity, IInAppMessageImmersive inAppMessage) { if (mCanUseFresco) { mSimpleDraweeView = getProperViewFromInflatedStub(R.id.com_appboy_inappmessage_modal_drawee_stub); AppboyInAppMessageSimpleDraweeView castedSimpleDraweeView = (AppboyInAppMessageSimpleDraweeView) mSimpleDraweeView; setInAppMessageImageViewAttributes(activity, inAppMessage, castedSimpleDraweeView); } else { mAppboyInAppMessageImageView = (AppboyInAppMessageImageView) getProperViewFromInflatedStub(R.id.com_appboy_inappmessage_modal_imageview_stub); setInAppMessageImageViewAttributes(activity, inAppMessage, mAppboyInAppMessageImageView); if (inAppMessage.getImageStyle().equals(ImageStyle.GRAPHIC) && inAppMessage.getBitmap() != null) { double aspectRatio = (double) inAppMessage.getBitmap().getWidth() / inAppMessage.getBitmap().getHeight(); resizeGraphicFrameIfAppropriate(activity, inAppMessage, aspectRatio); } } } public View getFrameView() { return findViewById(R.id.com_appboy_inappmessage_modal_frame); } @Override public void resetMessageMargins(boolean imageRetrievalSuccessful) { super.resetMessageMargins(imageRetrievalSuccessful); // If the in-app message contains an image or icon, reset the image layout's margins to 0. // When there is no image or icon present, the layout has a top margin of 20 to create 20dp // of padding between the text content and the top of the message. RelativeLayout imageLayout = (RelativeLayout) findViewById(R.id.com_appboy_inappmessage_modal_image_layout); if (imageRetrievalSuccessful || getMessageIconView() != null) { if (imageLayout != null) { RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(0, 0, 0, 0); imageLayout.setLayoutParams(layoutParams); } } // Make scrollView pass click events to message clickable view, so that clicking on the scrollView // dismisses the in-app message. View scrollViewChild = findViewById(R.id.com_appboy_inappmessage_modal_text_layout); scrollViewChild.setOnClickListener(new OnClickListener() { @Override public void onClick(View scrollView) { AppboyLogger.d(TAG, "Passing scrollView click event to message clickable view."); getMessageClickableView().performClick(); } }); } @Override public void setMessageBackgroundColor(int color) { InAppMessageViewUtils.setViewBackgroundColorFilter(findViewById(R.id.com_appboy_inappmessage_modal), color, getContext().getResources().getColor(R.color.com_appboy_inappmessage_background_light)); } @Override public List<View> getMessageButtonViews() { List<View> buttonViews = new ArrayList<View>(); if (findViewById(R.id.com_appboy_inappmessage_modal_button_one) != null) { buttonViews.add(findViewById(R.id.com_appboy_inappmessage_modal_button_one)); } if (findViewById(R.id.com_appboy_inappmessage_modal_button_two) != null) { buttonViews.add(findViewById(R.id.com_appboy_inappmessage_modal_button_two)); } return buttonViews; } @Override public View getMessageButtonsView() { return findViewById(R.id.com_appboy_inappmessage_modal_button_layout); } @Override public TextView getMessageTextView() { return (TextView) findViewById(R.id.com_appboy_inappmessage_modal_message); } @Override public TextView getMessageHeaderTextView() { return (TextView) findViewById(R.id.com_appboy_inappmessage_modal_header_text); } @Override public View getMessageClickableView() { return findViewById(R.id.com_appboy_inappmessage_modal); } @Override public View getMessageCloseButtonView() { return findViewById(R.id.com_appboy_inappmessage_modal_close_button); } @Override public TextView getMessageIconView() { return (TextView) findViewById(R.id.com_appboy_inappmessage_modal_icon); } @Override public Drawable getMessageBackgroundObject() { return getMessageClickableView().getBackground(); } @Override public ImageView getMessageImageView() { return mAppboyInAppMessageImageView; } @Override public View getMessageSimpleDraweeView() { return mSimpleDraweeView; } public void setMessageSimpleDrawee(final IInAppMessageImmersive inAppMessage, final Activity activity) { if (inAppMessage.getImageStyle().equals(ImageStyle.GRAPHIC)) { ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() { @Override public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { if (imageInfo == null) { return; } final double imageAspectRatio = (double) imageInfo.getWidth() / imageInfo.getHeight(); // If necessary, resize the graphic modal frame once the image aspect ratio is known. mSimpleDraweeView.post(new Runnable() { @Override public void run() { resizeGraphicFrameIfAppropriate(activity, inAppMessage, imageAspectRatio); } }); } }; FrescoLibraryUtils.setDraweeControllerHelper((AppboyInAppMessageSimpleDraweeView) getMessageSimpleDraweeView(), getAppropriateImageUrl(inAppMessage), 0f, false, controllerListener); } else { setMessageSimpleDrawee(inAppMessage); } } /** * Programmatically set attributes on the image view classes inside the image ViewStubs in a * fresco/native-agnostic manner. * * @param activity * @param inAppMessage * @param inAppMessageImageView */ private void setInAppMessageImageViewAttributes(Activity activity, IInAppMessageImmersive inAppMessage, IInAppMessageImageView inAppMessageImageView) { float pixelRadius = (float) ViewUtils.convertDpToPixels(activity, AppboyInAppMessageParams.getModalizedImageRadiusDp()); if (inAppMessage.getImageStyle().equals(ImageStyle.GRAPHIC)) { inAppMessageImageView.setCornersRadiusPx(pixelRadius); } else { inAppMessageImageView.setCornersRadiiPx(pixelRadius, pixelRadius, 0.0f, 0.0f); } inAppMessageImageView.setInAppMessageImageCropType(inAppMessage.getCropType()); } /** * If displaying a graphic modal, resize its bounds based on the aspect ratio of the input image * and its maximum size. * * @param activity * @param inAppMessage * @param imageAspectRatio the aspect ratio of the image to be displayed in the graphic modal. */ private void resizeGraphicFrameIfAppropriate(Activity activity, IInAppMessageImmersive inAppMessage, double imageAspectRatio) { if (!inAppMessage.getImageStyle().equals(ImageStyle.GRAPHIC)) { return; } double maxWidthDp = AppboyInAppMessageParams.getGraphicModalMaxWidthDp(); double maxHeightDp = AppboyInAppMessageParams.getGraphicModalMaxHeightDp(); double maxSizeAspectRatio = maxWidthDp / maxHeightDp; RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) findViewById(R.id.com_appboy_inappmessage_modal_graphic_bound).getLayoutParams(); if (imageAspectRatio >= maxSizeAspectRatio) { params.width = (int) ViewUtils.convertDpToPixels(activity, maxWidthDp); params.height = (int) (ViewUtils.convertDpToPixels(activity, maxWidthDp) / imageAspectRatio); } else { params.width = (int) (ViewUtils.convertDpToPixels(activity, maxHeightDp) * imageAspectRatio); params.height = (int) ViewUtils.convertDpToPixels(activity, maxHeightDp); } findViewById(R.id.com_appboy_inappmessage_modal_graphic_bound).setLayoutParams(params); } }