Skip to content

Commit

Permalink
[Android] Log warning if card element has a ShowCard select action (m…
Browse files Browse the repository at this point in the history
…icrosoft#2717)

* Add warning for showcard action in select action

* Reverse the inheritance between SelectAction and regular action
  • Loading branch information
almedina-ms committed Apr 27, 2019
1 parent c57f704 commit 88d915a
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 117 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public class AdaptiveWarning {
public static final int INTERACTIVITY_DISALLOWED = 3;
public static final int MAX_ACTIONS_EXCEEDED = 4;
public static final int TOGGLE_MISSING_VALUE = 5;
public static final int SELECT_SHOW_CARD_ACTION = 6;

private int code;
private String message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import io.adaptivecards.objectmodel.ToggleVisibilityAction;
import io.adaptivecards.objectmodel.ToggleVisibilityTarget;
import io.adaptivecards.objectmodel.ToggleVisibilityTargetVector;
import io.adaptivecards.objectmodel.WarningStatusCode;
import io.adaptivecards.renderer.actionhandler.ICardActionHandler;

public abstract class BaseActionElementRenderer implements IBaseActionElementRenderer
Expand Down Expand Up @@ -76,113 +77,35 @@ protected static int getColor(String colorCode)
/**
* Callback to be invoked when an select action for a card element is clicked
*/
public static class SelectActionOnClickListener implements View.OnClickListener
public static class SelectActionOnClickListener extends ActionOnClickListener
{

public SelectActionOnClickListener(RenderedAdaptiveCard renderedCard, BaseActionElement action, ICardActionHandler cardActionHandler)
{
m_action = action;
m_renderedAdaptiveCard = renderedCard;
m_cardActionHandler = cardActionHandler;

if(m_action.GetElementType() == ActionType.ToggleVisibility)
{
m_toggleVisibilityAction = null;
if (m_action instanceof ToggleVisibilityAction)
{
m_toggleVisibilityAction = (ToggleVisibilityAction) m_action;
}
else if ((m_toggleVisibilityAction = ToggleVisibilityAction.dynamic_cast(m_action)) == null)
{
throw new InternalError("Unable to convert BaseActionElement to ToggleVisibilityAction object model.");
}
}
}

private void populateViewsDictionary()
{
m_viewDictionary = new HashMap<>();

ToggleVisibilityTargetVector toggleVisibilityTargetVector = m_toggleVisibilityAction.GetTargetElements();
View rootView = m_renderedAdaptiveCard.getView();
super(renderedCard, action, cardActionHandler);

for (int i = 0; i < toggleVisibilityTargetVector.size(); ++i)
if (m_action.GetElementType() == ActionType.ShowCard)
{
ToggleVisibilityTarget target = toggleVisibilityTargetVector.get(i);
String elementId = target.GetElementId();

View foundView = rootView.findViewWithTag(new TagContent(elementId));
if(foundView != null)
{
m_viewDictionary.put(elementId, foundView);
}
renderedCard.addWarning(new AdaptiveWarning(AdaptiveWarning.SELECT_SHOW_CARD_ACTION, "ShowCard not supported for SelectAction"));
}
}

@Override
public void onClick(View v)
{
if(m_action.GetElementType() == ActionType.ToggleVisibility)
// As we don't support show card actions for select action, then avoid triggering the event
if (m_action.GetElementType() != ActionType.ShowCard)
{
ToggleVisibilityTargetVector toggleVisibilityTargetVector = m_toggleVisibilityAction.GetTargetElements();

// Populate the dictionary only once so multiple clicks don't perform the search operation every time
if (m_viewDictionary == null)
{
populateViewsDictionary();
}

for (int i = 0; i < toggleVisibilityTargetVector.size(); ++i)
{
ToggleVisibilityTarget target = toggleVisibilityTargetVector.get(i);
String elementId = target.GetElementId();

if (m_viewDictionary.containsKey(elementId))
{
View foundView = m_viewDictionary.get(elementId);
IsVisible isVisible = target.GetIsVisible();

if (isVisible == IsVisible.IsVisibleFalse)
{
foundView.setVisibility(View.GONE);
}
else if (isVisible == IsVisible.IsVisibleTrue)
{
foundView.setVisibility(View.VISIBLE);
}
else
{
// Toggle
if (foundView.getVisibility() == View.GONE)
{
foundView.setVisibility(View.VISIBLE);
}
else
{
foundView.setVisibility(View.GONE);
}
}
}
}
}
else
{
m_cardActionHandler.onAction(m_action, m_renderedAdaptiveCard);
super.onClick(v);
}
}

protected BaseActionElement m_action;
protected RenderedAdaptiveCard m_renderedAdaptiveCard;
protected ICardActionHandler m_cardActionHandler;

private ToggleVisibilityAction m_toggleVisibilityAction = null;
private HashMap<String, View> m_viewDictionary = null;
}

/**
* Callback to be invoked when an action is clicked
*/
public static class ActionOnClickListener extends SelectActionOnClickListener
public static class ActionOnClickListener implements View.OnClickListener
{

/**
Expand All @@ -203,8 +126,11 @@ public ActionOnClickListener(RenderedAdaptiveCard renderedCard,
ICardActionHandler cardActionHandler,
HostConfig hostConfig)
{
super(renderedCard, baseActionElement, cardActionHandler);
this(renderedCard, baseActionElement, cardActionHandler);

m_isInlineShowCardAction = (baseActionElement.GetElementType() == ActionType.ShowCard) && (hostConfig.GetActions().getShowCard().getActionMode() == ActionMode.Inline);

// As SelectAction doesn't support ShowCard actions, then this line won't be executed
if (m_isInlineShowCardAction)
{
renderHiddenCard(context, fragmentManager, viewGroup, hostConfig);
Expand All @@ -219,8 +145,23 @@ public ActionOnClickListener(RenderedAdaptiveCard renderedCard,
*/
public ActionOnClickListener(RenderedAdaptiveCard renderedCard, BaseActionElement baseActionElement, ICardActionHandler cardActionHandler)
{
super(renderedCard, baseActionElement, cardActionHandler);
m_isInlineShowCardAction = false;
m_action = baseActionElement;
m_renderedAdaptiveCard = renderedCard;
m_cardActionHandler = cardActionHandler;

// In case of the action being a ToggleVisibility action, store the action as ToggleVisibility action so no recasting must be made
if (m_action.GetElementType() == ActionType.ToggleVisibility)
{
m_toggleVisibilityAction = null;
if (m_action instanceof ToggleVisibilityAction)
{
m_toggleVisibilityAction = (ToggleVisibilityAction) m_action;
}
else if ((m_toggleVisibilityAction = ToggleVisibilityAction.dynamic_cast(m_action)) == null)
{
throw new InternalError("Unable to convert BaseActionElement to ToggleVisibilityAction object model.");
}
}
}

private void renderHiddenCard(Context context, FragmentManager fragmentManager, ViewGroup viewGroup, HostConfig hostConfig)
Expand Down Expand Up @@ -268,47 +209,136 @@ private Activity getActivity(Context context)
return null;
}

@Override
public void onClick(View v) {
if (m_isInlineShowCardAction)
private void populateViewsDictionary()
{
m_viewDictionary = new HashMap<>();

ToggleVisibilityTargetVector toggleVisibilityTargetVector = m_toggleVisibilityAction.GetTargetElements();
View rootView = m_renderedAdaptiveCard.getView();

for (int i = 0; i < toggleVisibilityTargetVector.size(); ++i)
{
Activity hostingActivity = getActivity(v.getContext());
if (hostingActivity != null) {
View currentFocusedView = hostingActivity.getCurrentFocus();
if (currentFocusedView != null) {
currentFocusedView.clearFocus();
}
ToggleVisibilityTarget target = toggleVisibilityTargetVector.get(i);
String elementId = target.GetElementId();

View foundView = rootView.findViewWithTag(new TagContent(elementId));
if (foundView != null)
{
m_viewDictionary.put(elementId, foundView);
}
}
}

v.setPressed(m_invisibleCard.getVisibility() != View.VISIBLE);
for (int i = 0; i < m_hiddenCardsLayout.getChildCount(); ++i) {
View child = m_hiddenCardsLayout.getChildAt(i);
if (child != m_invisibleCard) {
child.setVisibility(View.GONE);
}
private void handleInlineShowCardAction(View v)
{
Activity hostingActivity = getActivity(v.getContext());
if (hostingActivity != null)
{
View currentFocusedView = hostingActivity.getCurrentFocus();
if (currentFocusedView != null)
{
currentFocusedView.clearFocus();
}
}

v.setPressed(m_invisibleCard.getVisibility() != View.VISIBLE);
for (int i = 0; i < m_hiddenCardsLayout.getChildCount(); ++i)
{
View child = m_hiddenCardsLayout.getChildAt(i);
if (child != m_invisibleCard)
{
child.setVisibility(View.GONE);
}
}

m_invisibleCard.setVisibility(m_invisibleCard.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);

View mainCardView = ((ViewGroup) m_hiddenCardsLayout.getParent()).getChildAt(0);
int padding = mainCardView.getPaddingTop();

//remove bottom padding from top linear layout
if (m_invisibleCard.getVisibility() == View.VISIBLE)
{
mainCardView.setPadding(padding, padding, padding, 0);
m_invisibleCard.requestFocus();
}
else
{
mainCardView.setPadding(padding, padding, padding, padding);
}
}

private void handleToggleVisibilityAction(View v)
{
ToggleVisibilityTargetVector toggleVisibilityTargetVector = m_toggleVisibilityAction.GetTargetElements();

m_invisibleCard.setVisibility(m_invisibleCard.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);
// Populate the dictionary only once so multiple clicks don't perform the search operation every time
if (m_viewDictionary == null)
{
populateViewsDictionary();
}

for (int i = 0; i < toggleVisibilityTargetVector.size(); ++i)
{
ToggleVisibilityTarget target = toggleVisibilityTargetVector.get(i);
String elementId = target.GetElementId();

View mainCardView = ((ViewGroup) m_hiddenCardsLayout.getParent()).getChildAt(0);
int padding = mainCardView.getPaddingTop();
if (m_viewDictionary.containsKey(elementId))
{
View foundView = m_viewDictionary.get(elementId);
IsVisible isVisible = target.GetIsVisible();

//remove bottom padding from top linear layout
if (m_invisibleCard.getVisibility() == View.VISIBLE) {
mainCardView.setPadding(padding, padding, padding, 0);
m_invisibleCard.requestFocus();
} else {
mainCardView.setPadding(padding, padding, padding, padding);
if (isVisible == IsVisible.IsVisibleFalse)
{
foundView.setVisibility(View.GONE);
}
else if (isVisible == IsVisible.IsVisibleTrue)
{
foundView.setVisibility(View.VISIBLE);
}
else
{
// Toggle
if (foundView.getVisibility() == View.GONE)
{
foundView.setVisibility(View.VISIBLE);
}
else
{
foundView.setVisibility(View.GONE);
}
}
}
}
}

@Override
public void onClick(View v) {
if (m_isInlineShowCardAction)
{
handleInlineShowCardAction(v);
}
else if (m_action.GetElementType() == ActionType.ToggleVisibility)
{
handleToggleVisibilityAction(v);
}
else
{
super.onClick(v);
m_cardActionHandler.onAction(m_action, m_renderedAdaptiveCard);
}
}

private View m_invisibleCard;
private ViewGroup m_hiddenCardsLayout;
private boolean m_isInlineShowCardAction;
protected BaseActionElement m_action;
protected RenderedAdaptiveCard m_renderedAdaptiveCard;
protected ICardActionHandler m_cardActionHandler;

// Information for handling ShowCard actions
private View m_invisibleCard = null;
private ViewGroup m_hiddenCardsLayout = null;
private boolean m_isInlineShowCardAction = false;

// Information for handling ToggleVisibility actions
private HashMap<String, View> m_viewDictionary = null;
private ToggleVisibilityAction m_toggleVisibilityAction = null;
}
}

0 comments on commit 88d915a

Please sign in to comment.