Skip to content

Commit

Permalink
[Android] Change null returns for exceptions to avoid ambiguity (micr…
Browse files Browse the repository at this point in the history
…osoft#2715)

* Fallback with exceptions v1

* Fix bugs in previous version and add more descriptive details to exception

* Update comment
  • Loading branch information
almedina-ms committed Apr 18, 2019
1 parent 1b628a5 commit 05b1f50
Show file tree
Hide file tree
Showing 12 changed files with 171 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ public View renderActions(
BaseActionElementVector baseActionElementList,
ICardActionHandler cardActionHandler,
HostConfig hostConfig,
RenderArgs renderArgs) {
RenderArgs renderArgs) throws AdaptiveFallbackException
{
long size;
if (baseActionElementList == null || (size = baseActionElementList.size()) <= 0)
{
Expand Down Expand Up @@ -126,56 +127,74 @@ else if (alignment == ActionAlignment.Center.swigValue())
BaseActionElement actionElement = baseActionElementList.get(i);

IBaseActionElementRenderer actionRenderer = CardRendererRegistration.getInstance().getActionRenderer(actionElement.GetElementTypeString());
View returnedView = null;
if (actionRenderer != null)

try
{
returnedView = actionRenderer.render(renderedCard, context, fragmentManager, actionButtonsLayout, actionElement, cardActionHandler, hostConfig, renderArgs);
}
if (actionRenderer == null)
{
throw new AdaptiveFallbackException(actionElement);
}

boolean elementHasFallback = (actionElement.GetFallbackType() != FallbackType.None);
if (actionRenderer == null || returnedView == null)
actionRenderer.render(renderedCard, context, fragmentManager, actionButtonsLayout, actionElement, cardActionHandler, hostConfig, renderArgs);
}
catch (AdaptiveFallbackException e)
{
boolean elementHasFallback = (actionElement.GetFallbackType() != FallbackType.None);

if (elementHasFallback)
{
if(actionElement.GetFallbackType() == FallbackType.Content)
if (actionElement.GetFallbackType() == FallbackType.Content)
{
BaseElement fallbackElement = actionElement.GetFallbackContent();

while (fallbackElement != null)
{
BaseActionElement fallbackActionElement = null;
if (fallbackElement instanceof BaseActionElement)
{
fallbackActionElement = (BaseActionElement) fallbackElement;
}
else if ((fallbackActionElement = BaseActionElement.dynamic_cast(fallbackElement)) == null)
try
{
throw new InternalError("Unable to convert BaseElement to BaseActionElement object model.");
}

IBaseActionElementRenderer fallbackActionRenderer = CardRendererRegistration.getInstance().getActionRenderer(fallbackActionElement.GetElementTypeString());;
BaseActionElement fallbackActionElement = null;
if (fallbackElement instanceof BaseActionElement)
{
fallbackActionElement = (BaseActionElement) fallbackElement;
}
else if ((fallbackActionElement = BaseActionElement.dynamic_cast(fallbackElement)) == null)
{
throw new InternalError("Unable to convert BaseElement to BaseActionElement object model.");
}

IBaseActionElementRenderer fallbackActionRenderer = CardRendererRegistration.getInstance().getActionRenderer(fallbackActionElement.GetElementTypeString());

if (fallbackActionRenderer == null)
{
throw new AdaptiveFallbackException(fallbackElement);
}

if (fallbackActionRenderer != null)
{
fallbackActionRenderer.render(renderedCard, context, fragmentManager, actionButtonsLayout, fallbackActionElement, cardActionHandler, hostConfig, renderArgs);
break;
}

if (fallbackActionElement.GetFallbackType() == FallbackType.Content)
catch (AdaptiveFallbackException e2)
{
fallbackElement = fallbackActionElement.GetFallbackContent();
}
else
{
// Either fallback is "drop" or not defined, in that case, stop trying
break;
// As the fallback element didn't exist, go back to trying
if (fallbackElement.GetFallbackType() == FallbackType.Content)
{
fallbackElement = fallbackElement.GetFallbackContent();
}
else
{
// The element has no fallback, just clear the element so the cycle ends
fallbackElement = null;
}
}
}
}
}
else if (renderArgs.getAncestorHasFallback())
{
// There's an ancestor with fallback so we throw to trigger it
throw e;
}
else
{
renderedCard.addWarning(new AdaptiveWarning(AdaptiveWarning.UNKNOWN_ELEMENT_TYPE,"Unsupported card element type: " + actionElement.GetElementTypeString()));
renderedCard.addWarning(new AdaptiveWarning(AdaptiveWarning.UNKNOWN_ELEMENT_TYPE, "Unsupported card element type: " + actionElement.GetElementTypeString()));
continue;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,13 @@ public View internalRender(RenderedAdaptiveCard renderedCard,

RenderArgs renderArgs = new RenderArgs();
renderArgs.setContainerStyle(style);
CardRendererRegistration.getInstance().render(renderedCard, context, fragmentManager, layout, adaptiveCard, baseCardElementList, cardActionHandler, hostConfig, renderArgs);
try
{
CardRendererRegistration.getInstance().render(renderedCard, context, fragmentManager, layout, adaptiveCard, baseCardElementList, cardActionHandler, hostConfig, renderArgs);
}
// Catches the exception as the method throws it for performing fallback with elements inside the card,
// no fallback should be performed here so we just catch the exception
catch (AdaptiveFallbackException e){}

if (hostConfig.GetSupportsInteractivity())
{
Expand All @@ -163,8 +169,15 @@ public View internalRender(RenderedAdaptiveCard renderedCard,
rootLayout.addView(showCardsLayout);

IActionLayoutRenderer actionLayoutRenderer = CardRendererRegistration.getInstance().getActionLayoutRenderer();
if(actionLayoutRenderer != null) {
actionLayoutRenderer.renderActions(renderedCard, context, fragmentManager, layout, baseActionElementList, cardActionHandler, hostConfig, renderArgs);
if(actionLayoutRenderer != null)
{
try
{
actionLayoutRenderer.renderActions(renderedCard, context, fragmentManager, layout, baseActionElementList, cardActionHandler, hostConfig, renderArgs);
}
// Catches the exception as the method throws it for performing fallback with elements inside the card,
// no fallback should be performed here so we just catch the exception
catch (AdaptiveFallbackException e) {}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.adaptivecards.renderer;

import io.adaptivecards.objectmodel.BaseElement;

/***
* Exception for signalizing that an element could not be rendered and fallback should be performed
*/
public class AdaptiveFallbackException extends Exception
{
public AdaptiveFallbackException(BaseElement element)
{
super("No renderer exists for element type: " + element.GetElementTypeString());
m_element = element;
}

// I'm saving this object in case I ever need to debug this
// No getters or setters are provided as outside developers shouldn't have
// to find this Exception (unless overriding the action layout renderer)
private BaseElement m_element = null;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@ public View renderActions(RenderedAdaptiveCard renderedCard,
BaseActionElementVector baseActionElementList,
ICardActionHandler cardActionHandler,
HostConfig hostConfig,
RenderArgs renderArgs);
RenderArgs renderArgs) throws AdaptiveFallbackException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,5 @@ Button render(
BaseActionElement baseActionElement,
ICardActionHandler cardActionHandler,
HostConfig hostConfig,
RenderArgs renderArgs);
RenderArgs renderArgs) throws AdaptiveFallbackException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@ View render(
BaseCardElement baseCardElement,
ICardActionHandler cardActionHandler,
HostConfig hostConfig,
RenderArgs renderArgs);
RenderArgs renderArgs) throws AdaptiveFallbackException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,11 @@ else if ((actionSet = ActionSet.dynamic_cast(baseCardElement)) == null)

BaseActionElementVector baseActionElementList = actionSet.GetActions();

ActionLayoutRenderer.getInstance().renderActions(renderedCard, context, fragmentManager, actionsLayout, baseActionElementList, cardActionHandler, hostConfig, renderArgs);
try
{
ActionLayoutRenderer.getInstance().renderActions(renderedCard, context, fragmentManager, actionsLayout, baseActionElementList, cardActionHandler, hostConfig, renderArgs);
}
catch (Exception e) {}

viewGroup.addView(rootLayout);
return rootLayout;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import io.adaptivecards.objectmodel.BackgroundImage;
import io.adaptivecards.objectmodel.ContainerStyle;
import io.adaptivecards.objectmodel.VerticalContentAlignment;
import io.adaptivecards.renderer.AdaptiveFallbackException;
import io.adaptivecards.renderer.BackgroundImageLoaderAsync;
import io.adaptivecards.renderer.BaseActionElementRenderer;
import io.adaptivecards.renderer.RenderArgs;
Expand Down Expand Up @@ -63,7 +64,7 @@ public View render(
BaseCardElement baseCardElement,
ICardActionHandler cardActionHandler,
HostConfig hostConfig,
RenderArgs renderArgs)
RenderArgs renderArgs) throws AdaptiveFallbackException
{
Column column;
if (baseCardElement instanceof Column)
Expand All @@ -87,7 +88,7 @@ else if ((column = Column.dynamic_cast(baseCardElement)) == null)
returnedView.setClipChildren(false);
returnedView.setClipToPadding(false);

if(!baseCardElement.GetIsVisible())
if (!baseCardElement.GetIsVisible())
{
returnedView.setVisibility(View.GONE);
}
Expand Down Expand Up @@ -116,7 +117,7 @@ else if ((column = Column.dynamic_cast(baseCardElement)) == null)
renderArgs1.setContainerStyle(styleForThis);
if (!column.GetItems().isEmpty())
{
View v = CardRendererRegistration.getInstance().render(renderedCard,
CardRendererRegistration.getInstance().render(renderedCard,
context,
fragmentManager,
verticalContentAlignmentLayout,
Expand All @@ -125,12 +126,6 @@ else if ((column = Column.dynamic_cast(baseCardElement)) == null)
cardActionHandler,
hostConfig,
renderArgs1);

// This failed to render, so return null
if (v == null)
{
return null;
}
}

if (styleForThis != renderArgs.getContainerStyle())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,20 @@

import android.content.Context;
import android.graphics.Color;
import android.nfc.Tag;
import android.support.v4.app.FragmentManager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import io.adaptivecards.objectmodel.ContainerStyle;
import io.adaptivecards.objectmodel.HeightType;
import io.adaptivecards.renderer.AdaptiveFallbackException;
import io.adaptivecards.renderer.BaseActionElementRenderer;
import io.adaptivecards.renderer.RenderArgs;
import io.adaptivecards.renderer.RenderedAdaptiveCard;
import io.adaptivecards.renderer.TagContent;
import io.adaptivecards.renderer.Util;
import io.adaptivecards.renderer.action.ActionElementRenderer;
import io.adaptivecards.renderer.actionhandler.ICardActionHandler;
import io.adaptivecards.renderer.inputhandler.IInputHandler;
import io.adaptivecards.objectmodel.BaseCardElement;
import io.adaptivecards.objectmodel.CardElementType;
import io.adaptivecards.objectmodel.Column;
Expand All @@ -28,8 +26,6 @@
import io.adaptivecards.renderer.registration.CardRendererRegistration;
import io.adaptivecards.renderer.IBaseCardElementRenderer;

import java.util.Vector;


public class ColumnSetRenderer extends BaseCardElementRenderer
{
Expand All @@ -56,7 +52,7 @@ public View render(
BaseCardElement baseCardElement,
ICardActionHandler cardActionHandler,
HostConfig hostConfig,
RenderArgs renderArgs)
RenderArgs renderArgs) throws AdaptiveFallbackException
{
ColumnSet columnSet = null;
if (baseCardElement instanceof ColumnSet)
Expand Down Expand Up @@ -93,25 +89,23 @@ else if ((columnSet = ColumnSet.dynamic_cast(baseCardElement)) == null)
}

ContainerStyle containerStyle = renderArgs.getContainerStyle();
for (int i = 0; i < columnVectorSize; i++) {
for (int i = 0; i < columnVectorSize; i++)
{
Column column = columnVector.get(i);

ColumnRenderer rendererAsColumnRenderer = null;
if (columnRenderer instanceof ColumnRenderer)
{
rendererAsColumnRenderer = (ColumnRenderer)columnRenderer;
rendererAsColumnRenderer = (ColumnRenderer) columnRenderer;
rendererAsColumnRenderer.setIsRenderingFirstColumn(i == 0);
rendererAsColumnRenderer.setIsRenderingLastColumn(i == (columnVectorSize - 1));
}

View v = columnRenderer.render(renderedCard, context, fragmentManager, layout, column, cardActionHandler, hostConfig, renderArgs);
if (v == null)
{
return null;
}
columnRenderer.render(renderedCard, context, fragmentManager, layout, column, cardActionHandler, hostConfig, renderArgs);
}

if (columnSet.GetSelectAction() != null) {
if (columnSet.GetSelectAction() != null)
{
layout.setClickable(true);
layout.setOnClickListener(new BaseActionElementRenderer.SelectActionOnClickListener(renderedCard, columnSet.GetSelectAction(), cardActionHandler));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import io.adaptivecards.objectmodel.ContainerStyle;
import io.adaptivecards.objectmodel.HeightType;
import io.adaptivecards.objectmodel.VerticalContentAlignment;
import io.adaptivecards.renderer.AdaptiveFallbackException;
import io.adaptivecards.renderer.BackgroundImageLoaderAsync;
import io.adaptivecards.renderer.BaseActionElementRenderer;
import io.adaptivecards.renderer.RenderArgs;
Expand Down Expand Up @@ -52,7 +53,7 @@ public View render(
BaseCardElement baseCardElement,
ICardActionHandler cardActionHandler,
HostConfig hostConfig,
RenderArgs renderArgs)
RenderArgs renderArgs) throws AdaptiveFallbackException
{
Container container = null;
if (baseCardElement instanceof Container)
Expand Down Expand Up @@ -106,20 +107,15 @@ else if ((container = Container.dynamic_cast(baseCardElement)) == null)

if (!container.GetItems().isEmpty())
{
View v = CardRendererRegistration.getInstance().render(renderedCard,
context,
fragmentManager,
containerView,
container,
container.GetItems(),
cardActionHandler,
hostConfig,
renderArgs);

if (v == null)
{
return null;
}
CardRendererRegistration.getInstance().render(renderedCard,
context,
fragmentManager,
containerView,
container,
container.GetItems(),
cardActionHandler,
hostConfig,
renderArgs);
}

if (styleForThis != containerStyle)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import io.adaptivecards.objectmodel.ContainerStyle;
import io.adaptivecards.objectmodel.HeightType;
import io.adaptivecards.renderer.AdaptiveFallbackException;
import io.adaptivecards.renderer.BaseCardElementRenderer;
import io.adaptivecards.renderer.IBaseCardElementRenderer;
import io.adaptivecards.renderer.RenderArgs;
Expand Down Expand Up @@ -90,8 +91,16 @@ else if ((imageSet = ImageSet.dynamic_cast(baseCardElement)) == null)

// TODO: temporary - this will be handled in the object model
image.SetImageSize(imageSize);
View imageView = imageRenderer.render(renderedCard, context, fragmentManager, horizFlowLayout, image, cardActionHandler, hostConfig, renderArgs);
((ImageView) imageView).setMaxHeight(Util.dpToPixels(context, hostConfig.GetImageSet().getMaxImageHeight()));

try
{
View imageView = imageRenderer.render(renderedCard, context, fragmentManager, horizFlowLayout, image, cardActionHandler, hostConfig, renderArgs);
((ImageView) imageView).setMaxHeight(Util.dpToPixels(context, hostConfig.GetImageSet().getMaxImageHeight()));
}
catch (AdaptiveFallbackException e)
{
continue;
}
}

if (imageSet.GetHeight() == HeightType.Stretch)
Expand Down
Loading

0 comments on commit 05b1f50

Please sign in to comment.