public void display() {
    // Create autorelease pool per frame to avoid possible deadlock
    // situations
    // because there are 3 CAMetalDrawables sitting in an autorelease pool.

    try (NSAutoreleasePool pool = new NSAutoreleasePool()) {
      // handle display changes here
      if (layerSizeDidUpdate) {
        // set the metal layer to the drawable size in case orientation
        // or size changes
        CGSize drawableSize = getBounds().getSize();
        drawableSize.setWidth(drawableSize.getWidth() * this.getContentScaleFactor());
        drawableSize.setHeight(drawableSize.getHeight() * this.getContentScaleFactor());

        metalLayer.setDrawableSize(drawableSize);

        // renderer delegate method so renderer can resize anything if
        // needed
        delegate.reshape(this);

        layerSizeDidUpdate = false;
      }

      // rendering delegate method to ask renderer to draw this frame's
      // content
      delegate.render(this);

      // do not retain current drawable beyond the frame.
      // There should be no strong references to this object outside of
      // this view class
      ((NSObject) currentDrawable).dispose();
      currentDrawable = null;
    }
  }
  @Override
  public void viewDidLoad() {
    super.viewDidLoad();

    getTableView().setSeparatorStyle(UITableViewCellSeparatorStyle.None);
    getTableView().setBackgroundColor(UIColor.black());

    getNavigationItem().setTitleView(new UIImageView(UIImage.getImage("TitleFindFriends")));

    if (getNavigationController().getViewControllers().first() == this) {
      UIBarButtonItem dismissLeftBarButtonItem =
          new UIBarButtonItem(
              "Back",
              UIBarButtonItemStyle.Plain,
              new UIBarButtonItem.OnClickListener() {
                @Override
                public void onClick(UIBarButtonItem barButtonItem) {
                  getNavigationController().dismissViewController(true, null);
                }
              });
      getNavigationItem().setLeftBarButtonItem(dismissLeftBarButtonItem);
    } else {
      getNavigationItem().setLeftBarButtonItem(null);
    }

    if (MFMailComposeViewController.canSendMail() || MFMessageComposeViewController.canSendText()) {
      headerView = new UIView(new CGRect(0, 0, 320, 67));
      headerView.setBackgroundColor(UIColor.black());
      UIButton clearButton = new UIButton(UIButtonType.Custom);
      clearButton.setBackgroundColor(UIColor.clear());
      clearButton.addOnTouchUpInsideListener(inviteFriendsButtonAction);
      clearButton.setFrame(headerView.getFrame());
      headerView.addSubview(clearButton);
      String inviteString = "Invite friends";
      CGRect boundingRect =
          NSString.getBoundingRect(
              inviteString,
              new CGSize(310, Float.MAX_VALUE),
              NSStringDrawingOptions.with(
                  NSStringDrawingOptions.TruncatesLastVisibleLine,
                  NSStringDrawingOptions.UsesLineFragmentOrigin),
              new NSAttributedStringAttributes().setFont(UIFont.getBoldSystemFont(18)),
              null);
      CGSize inviteStringSize = boundingRect.getSize();

      UILabel inviteLabel =
          new UILabel(
              new CGRect(
                  10,
                  (headerView.getFrame().getSize().getHeight() - inviteStringSize.getHeight()) / 2,
                  inviteStringSize.getWidth(),
                  inviteStringSize.getHeight()));
      inviteLabel.setText(inviteString);
      inviteLabel.setFont(UIFont.getBoldSystemFont(18));
      inviteLabel.setTextColor(UIColor.white());
      inviteLabel.setBackgroundColor(UIColor.clear());
      headerView.addSubview(inviteLabel);
      getTableView().setTableHeaderView(headerView);
    }
  }
  private void animateView(UIView view, CGPoint targetPosition, Runnable completion) {
    CGSize size = view.getFrame().getSize();
    CGSize grow = new CGSize(size.getWidth() * 1.7, size.getHeight() * 1.7);
    CGSize shrink = new CGSize(size.getWidth() * .4, size.getHeight() * .4);

    CAKeyframeAnimation pathAnimation = new CAKeyframeAnimation("position");
    pathAnimation.setCalculationMode(CAAnimationCalculationMode.Paced);
    pathAnimation.setFillMode(CAFillMode.Forwards);
    pathAnimation.setRemovedOnCompletion(false);
    pathAnimation.setDuration(.5);

    UIBezierPath path = new UIBezierPath();
    path.move(view.getCenter());
    path.addQuadCurve(
        targetPosition, new CGPoint(view.getCenter().getX(), view.getCenter().getY()));
    pathAnimation.setPath(path.getCGPath());

    CABasicAnimation growAnimation = new CABasicAnimation("bounds.size");
    growAnimation.setToValue(NSValue.valueOf(grow));
    growAnimation.setFillMode(CAFillMode.Forwards);
    growAnimation.setRemovedOnCompletion(false);
    growAnimation.setDuration(.1);

    CABasicAnimation shrinkAnimation = new CABasicAnimation("bounds.size");
    shrinkAnimation.setToValue(NSValue.valueOf(shrink));
    shrinkAnimation.setFillMode(CAFillMode.Forwards);
    shrinkAnimation.setRemovedOnCompletion(false);
    shrinkAnimation.setDuration(.4);
    shrinkAnimation.setBeginTime(.1);

    CAAnimationGroup animations = new CAAnimationGroup();
    animations.setAnimations(new NSArray<>(pathAnimation, growAnimation, shrinkAnimation));
    animations.setFillMode(CAFillMode.Forwards);
    animations.setRemovedOnCompletion(false);
    animations.setDuration(.5);
    animations.setDelegate(
        new CAAnimationDelegateAdapter() {
          @Override
          public void didStop(CAAnimation anim, boolean flag) {
            view.removeFromSuperview();

            if (completion != null) {
              completion.run();
            }
          }
        });
    view.getLayer().addAnimation(animations, "movetocart");
  }
  public void computeConstantSize() {
    CGSize minSize = CGSize.Zero();
    CGSize intrinsicSize = CGSize.Zero();

    for (Drawable drawable : drawables) {
      CGSize min = drawable.getMinimumSize();
      CGSize intrinsic = drawable.getIntrinsicSize();

      if (min.getWidth() > minSize.getWidth()) minSize.setWidth(min.getWidth());
      if (min.getHeight() > minSize.getHeight()) minSize.setHeight(min.getHeight());

      if (intrinsic.getWidth() > intrinsicSize.getWidth())
        intrinsicSize.setWidth(intrinsic.getWidth());
      if (intrinsic.getHeight() > intrinsicSize.getHeight())
        intrinsicSize.setHeight(intrinsic.getHeight());
    }

    this.constantIntrinsicSize = intrinsicSize;
    this.constantMinimumSize = minSize;
    this.constantSizeComputed = true;
  }