public override void SetUpCell()
        {
            UIImage frontImage = CardType.CreditCardImage();

            CALayer layer = EntryEnclosingView.Layer;

            layer.CornerRadius  = 4.0f;
            layer.MasksToBounds = true;
            layer.BorderColor   = ColourHelper.GetColour("0xC3C3C3FF").CGColor;
            layer.BorderWidth   = 1;

            cardImage.Image = frontImage;

            PreviousCardNumber.Text = "xxxx " + LastFour;
            LengthForType           = CardType == CardType.AMEX ? 4 : 3;

            entryField.ShouldChangeCharacters = (UITextField textView, NSRange NSRange, string replace) => {
                CSRange range = new CSRange((int)NSRange.Location, (int)NSRange.Length);
                Complete = false;

                if (range.Length > 1)
                {
                    return(false);
                }
                if (replace.Length > 1)
                {
                    return(false);
                }
                if (replace.Length == 1 && !char.IsDigit(replace.ToCharArray() [0]))
                {
                    return(false);
                }
                if (textView.Text.Length + replace.Length - range.Length > LengthForType)
                {
                    return(false);
                }
                if (replace != "" && textView.Text.Length + replace.Length == LengthForType)
                {
                    var aStringBuilder = new StringBuilder(textView.Text);
                    aStringBuilder.Remove(range.Location, range.Length);
                    aStringBuilder.Insert(range.Location, replace);
                    string newTextOrig = aStringBuilder.ToString();
                    CCV      = newTextOrig;
                    Complete = true;
                }
                DispatchQueue.MainQueue.DispatchAsync(() => {
                    UpdateUI();
                });
                return(true);
            };
            entryField.BecomeFirstResponder();
        }
        void SetupCVTwo()
        {
            cvTwoText.ShouldChangeText = (UITextView textView, NSRange NSRange, string replace) => {
                if (replace != "" && !Char.IsDigit(replace.ToCharArray() [0]))
                {
                    return(false);
                }
                CSRange range = new CSRange((int)NSRange.Location, (int)NSRange.Length);
                if (replace.Length == 0)
                {
                    if (textView.Text.Length == 0 || range.Location == 0)       // handle case of delete when there are no characters left to delete
                    {
                        expiryText.BecomeFirstResponder();

                        if (expiryText.Text.Length == 5)
                        {
                            expiryText.Text = expiryText.Text.Remove(expiryText.Text.Length - 1);
                        }
                    }
                }

                if (cvTwoText.Text.Length == (Type == CardType.AMEX ? 4 : 3) && replace.Length != 0)
                {
                    return(false);
                }


                scrollForward = false;

                string newTextOrig = ReplaceInPlace(range.Location, range.Length, textView.Text, replace);

                int newTextLen = newTextOrig.Length;

                if (newTextLen == cvTwoPlaceHolder.Text.Length)
                {
                    var     cIndex   = cvTwoPlaceHolder.Text.IndexOf("C");
                    CSRange ccvRange = new CSRange(cIndex, cvTwoPlaceHolder.Text.Substring(cIndex).Length);
                    ccvRange.Length = Type == CardType.AMEX ? 4 : 3;
                    ccv             = newTextOrig.Substring(ccvRange.Location, ccvRange.Length);
                }

                updateText = true;
                if (newTextOrig.Length == (Type == CardType.AMEX ? 4 : 3))
                {
                    DismissKeyboardAction();
                }
                return(EndDelegate(cvTwoPlaceHolder, cvTwoText, newTextOrig));
            };
        }
示例#3
0
        public override void Draw(RectangleF rect)
        {
            RectangleF r = Offset;

            string clearText = Text.Substring(0, ShowTextOffset);
            string grayText  = Text.Substring(ShowTextOffset, Text.Length - ShowTextOffset);

            CGContext context = UIGraphics.GetCurrentContext();

            CGColor clearColor = UIColor.Clear.CGColor;

            context.SetStrokeColor(clearColor);
            context.SetFillColor(clearColor);
            context.FillRect(rect);

            if (clearText.Length != 0)
            {
                r.Location = new PointF(r.Location.X + clearText.DrawString(Offset.Location, Font).Width, r.Location.Y);
            }

            CSRange charsToDraw = new CSRange(0, grayText.Length);

            if (charsToDraw.Length != 0)
            {
                CGColor grayColor = UIColor.LightGray.CGColor;

                context.SetStrokeColor(grayColor);
                context.SetFillColor(grayColor);

                var chars = grayText.ToCharArray();
                int i;
                for (i = 0; i < chars.Length; i++)
                {
                    char character = chars [i];
                    if (character == ' ')
                    {
                        r.Location = new PointF(r.Location.X + Offset.Size.Width, r.Location.Y);
                        continue;
                    }
                    if (character == 'X')
                    {
                        #if LED_FONT
                        RectangleF box = rect.Inset(2, 1);
                        #else
                        CGRect box = rect.Inset(3, 3);
                        #endif
                        nfloat radius = 3;
                        context.BeginPath();
                        context.MoveTo(box.GetMinX() + radius, box.GetMinY());
                        var    mask     = "0";
                        UIFont drawFont = JudoSDKManager.FIXED_WIDTH_FONT_SIZE_20;
                        mask.DrawString(box, drawFont);
                        r.Location = new PointF(r.Location.X + Offset.Size.Width, r.Location.Y);
                        continue;
                    }
                    break;
                }

                charsToDraw.Location += i;
                charsToDraw.Length   -= i;
                if (charsToDraw.Length != 0)
                {
                    grayText.Substring((int)charsToDraw.Location, (int)charsToDraw.Length).DrawString(r.Location, JudoSDKManager.FIXED_WIDTH_FONT_SIZE_20);
                }
            }
        }
示例#4
0
        public override void  SetUpCell()
        {
            countrySheet           = new UIActionSheet("Select Country");
            countrySheet.TintColor = UIColor.Black;
            selectedCountry        = BillingCountryOptions.BillingCountryOptionUK;


            HomeButton.TouchUpInside += (sender, ev) => {
                DismissKeyboardAction();
            };
            countrySheet.Clicked += delegate(object sender, UIButtonEventArgs button) {
                switch (button.ButtonIndex)
                {
                case (int)BillingCountryOptions.BillingCountryOptionUK:
                    selectedCountry = BillingCountryOptions.BillingCountryOptionUK;

                    break;

                case (int)BillingCountryOptions.BillingCountryOptionUSA:
                    selectedCountry = BillingCountryOptions.BillingCountryOptionUSA;

                    break;

                case (int)BillingCountryOptions.BillingCountryOptionCanada:
                    selectedCountry = BillingCountryOptions.BillingCountryOptionCanada;

                    break;

                case (int)BillingCountryOptions.BillingCountryOptionOther:
                    selectedCountry = BillingCountryOptions.BillingCountryOptionOther;

                    break;

                default:
                    selectedCountry = BillingCountryOptions.BillingCountryOptionUK;
                    break;
                }
                CountryLabel.Text = selectedCountry.ToDescriptionString();
            };

            foreach (BillingCountryOptions option in Enum.GetValues(typeof(BillingCountryOptions)))
            {
                countrySheet.AddButton(option.ToDescriptionString());
            }
            CountryButton.TouchUpInside += (sender, ev) => {
                if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad)
                {
                    countrySheet.ShowInView(this.Superview);
                }
                else
                {
                    countrySheet.ShowInView(UIApplication.SharedApplication.KeyWindow);
                }
            };
            PostcodeTextField.Text = "";
            PostcodeTextField.Font = JudoSDKManager.FIXED_WIDTH_FONT_SIZE_20;
            ;
            PostcodeTextField.TextColor = UIColor.Black;

            PostcodeTextField.ShouldChangeCharacters = (UITextField textField, NSRange nsRange, string replacementString) => {
                CSRange range = new CSRange((int)nsRange.Location, (int)nsRange.Length);
                DispatchQueue.MainQueue.DispatchAsync(() => {
                });
                int textLengthAfter = textField.Text.Length + replacementString.Length - range.Length;
                if (textLengthAfter > 10)
                {
                    return(false);
                }
                return(true);
            };
        }
        void SetupExpire()
        {
            expiryText.ShouldChangeText = (UITextView textView, NSRange NSRange, string replace) => {
                if (replace != "" && !Char.IsDigit(replace.ToCharArray() [0]))
                {
                    return(false);
                }
                CSRange range = new CSRange((int)NSRange.Location, (int)NSRange.Length);
                flashForError = false;
                updateText    = false;
                scrollForward = false;
                deleting      = false;
                ret           = false;
                deletedSpace  = false;

                if (replace.Length == 0)
                {
                    updateText = true;
                    deleting   = true;


                    if (textView.Text.Length != 0 && (range.Length != 0))       // handle case of delete when there are no characters left to delete

                    {
                        char c = textView.Text.Substring(range.Location, 1).ToCharArray() [0];
                        if (range.Location != 0 && range.Length == 1 && (c == ' ' || c == '/'))
                        {
                            range.Location--;
                            range.Length++;
                            deletedSpace = true;
                        }
                    }
                    else
                    {
                        ccText.BecomeFirstResponder();

                        if (ccText.Text.Length == (cardHelper.LengthOfFormattedStringForType(Type)))
                        {
                            ccText.Text = ccText.Text.Remove(ccText.Text.Length - 1);
                        }


                        return(EndDelegate(ccPlaceHolder, ccText, ccText.Text));
                    }
                }

                var formattedText = "";
                scrollForward = false;

                string newTextOrig = ReplaceInPlace(range.Location, range.Length, textView.Text, replace);

                int newTextLen = newTextOrig.Length;

                // Test for delete of a space or /
                if (deleting)
                {
                    formattedText = newTextOrig.Substring(0, range.Location);
                    updateText    = true;
                    return(EndDelegate(expiryPlaceHolder, expiryText, formattedText));
                }

                if (newTextLen > expiryPlaceHolder.Text.Length)
                {
                    flashForError = true;
                    return(EndDelegate(expiryPlaceHolder, expiryText, formattedText));
                }

                formattedText = newTextOrig;

                CSRange monthRange = new CSRange(expiryPlaceHolder.Text.IndexOf("MM"), 2);
                if (newTextLen > monthRange.Location)
                {
                    if (newTextOrig.Substring(monthRange.Location, 1).ToCharArray() [0] > '1')
                    {
                        // support short cut - we prepend a '0' for them


                        formattedText = ReplaceInPlace(range.Location, range.Length, textView.Text, "0" + replace);

                        newTextLen = newTextOrig.Length;
                    }
                    if (newTextLen >= (monthRange.Location + monthRange.Length))
                    {
                        cardMonth = Int32.Parse(newTextOrig.Substring(monthRange.Location, monthRange.Length));
                        if (cardMonth < 1 || cardMonth > 12)
                        {
                            flashRecheckExpiryDateMessage();
                            return(EndDelegate(expiryPlaceHolder, expiryText, formattedText));
                        }
                    }
                }

                CSRange yearRange = new CSRange(expiryPlaceHolder.Text.IndexOf("YY"), 2);
                if (newTextLen > yearRange.Location)
                {
                    int proposedDecade = (newTextOrig.Substring(yearRange.Location, 1).ToCharArray() [0] - '0') * 10;
                    int yearDecade     = currentYear - (currentYear % 10);
                    if (proposedDecade < yearDecade)
                    {
                        flashRecheckExpiryDateMessage();
                        return(EndDelegate(expiryPlaceHolder, expiryText, formattedText));
                    }
                    if (newTextLen >= (yearRange.Location + yearRange.Length))
                    {
                        year = Int32.Parse(newTextOrig.Substring(yearRange.Location, yearRange.Length));
                        int diff = year - currentYear;
                        if (diff < 0 || diff > 10)
                        {
                            flashRecheckExpiryDateMessage();
                            return(EndDelegate(expiryPlaceHolder, expiryText, formattedText));
                        }
                        if (diff == 0)
                        {
                            var todaysDate   = DateTime.Today;
                            int currentMonth = todaysDate.Month;

                            if (cardMonth < currentMonth)
                            {
                                flashRecheckExpiryDateMessage();
                                return(EndDelegate(expiryPlaceHolder, expiryText, formattedText));
                            }
                        }
                        if (creditCardImage != ccBackImage)
                        {
                            UIViewAnimationOptions transType = (Type == CardType.AMEX) ? UIViewAnimationOptions.TransitionCrossDissolve : UIViewAnimationOptions.TransitionFlipFromBottom;

                            UIImageView.Animate(
                                duration: 0.25f,
                                delay: 0,
                                options: transType,
                                animation: () => {
                                creditCardImage = ccBackImage;
                            },
                                completion: () => {
                                StatusHelpLabel.Text = "Please enter CV2";
                            });
                        }
                    }
                }
                updateText = true;
                if (formattedText.Length == 5)
                {
                    cvTwoText.BecomeFirstResponder();
                }
                return(EndDelegate(expiryPlaceHolder, expiryText, formattedText));
            };
        }
        void SetupCC()
        {
            ccText.ShouldChangeText = (UITextView textView, NSRange NSRange, string replace) => {
                if (replace != "" && !Char.IsDigit(replace.ToCharArray() [0]))
                {
                    return(false);
                }
                CSRange range         = new CSRange((int)NSRange.Location, (int)NSRange.Length);
                var     formattedText = "";
                flashForError = false;
                updateText    = false;
                scrollForward = false;
                deleting      = false;
                ret           = false;
                deletedSpace  = false;
                cardMonth     = 0;

                if (replace.Length == 0)
                {
                    updateText = true;
                    deleting   = true;
                    if (textView.Text.Length != 0)      // handle case of delete when there are no characters left to delete

                    {
                        char c = textView.Text.Substring(range.Location, 1).ToCharArray() [0];
                        if (range.Location != 0 && range.Length == 1 && (c == ' ' || c == '/'))
                        {
                            range.Location--;
                            range.Length++;
                            deletedSpace = true;
                        }
                    }
                    else
                    {
                        return(false);
                    }
                }

                string newTextOrig = ReplaceInPlace(range.Location, range.Length, textView.Text, replace);

                int newTextLen = newTextOrig.Length;

                // causes the cc entry field to scroll back if the user deletes back beyond the end of the cc number
                if (range.Location <= numberLength)
                {
                    hasFullNumber = false;
                }

                if (textScroller.ContentOffset.X < 10f)
                {
                    ccPlaceHolderWidthConstraint.Constant = 198f;
                }
                if (!hasFullNumber)
                {
                    // scrolls backward
                    int textViewLen  = ccText.Text.Length;
                    int formattedLen = ccPlaceHolder.Text.Length;


                    if (textScroller.ContentOffset.X != 0)
                    {
                        textScroller.SetContentOffset(new PointF(0, 0), true);
                    }

                    UpdateCCimageWithTransitionTime(0, false, true);

                    StatusHelpLabel.Text = "Enter Card Details";

                    string newText = newTextOrig.Replace(" ", String.Empty);
                    int    len     = newText.Length;
                    if (len < JudoDotNetXamarin.Card.CC_LEN_FOR_TYPE)
                    {
                        updateText    = true;
                        formattedText = newTextOrig;

                        Type = CardType.UNKNOWN;
                    }
                    else
                    {
                        Type = cardHelper.GetCCType(newText);
                        switch (Type)
                        {
                        case CardType.UNKNOWN:
                            flashForError = true;
                            break;

                        case CardType.MAESTRO:
                            if (!JudoSDKManager.Instance.MaestroAccepted)
                            {
                                flashForError = true;
                                return(EndDelegate(ccPlaceHolder, ccText, formattedText));
                            }
                            break;

                        case CardType.AMEX:
                            if (!JudoSDKManager.Instance.AmExAccepted)
                            {
                                flashForError = true;
                                return(EndDelegate(ccPlaceHolder, ccText, formattedText));
                            }
                            break;
                        }

                        if (len == JudoDotNetXamarin.Card.CC_LEN_FOR_TYPE)
                        {
                            ccPlaceHolder.Text    = cardHelper.PromptStringForType(Type, true);
                            cvTwoPlaceHolder.Text = cardHelper.CVTwoPromptForType(Type, true);
                            cvTwoPlaceHolder.SetShowTextOffSet(Math.Min(0, 0));
                        }

                        formattedText = cardHelper.FormatForViewing(newText);
                        int lenForCard = cardHelper.LengthOfStringForType(Type);

                        if (len < lenForCard)
                        {
                            updateText = true;
                        }
                        else if (len == lenForCard)
                        {
                            if (cardHelper.isValidNumber(newText))
                            {
                                if (newText.IsLuhnValid())
                                {
                                    numberLength  = cardHelper.LengthOfFormattedStringForType(Type);
                                    creditCardNum = newText;

                                    updateText    = true;
                                    scrollForward = true;
                                    hasFullNumber = true;
                                }
                                else
                                {
                                    FlashRecheckNumberMessage();
                                }
                            }
                            else
                            {
                                FlashRecheckNumberMessage();
                            }
                        }
                    }
                    UpdateCCimageWithTransitionTime(0.25f);
                }

                return(EndDelegate(ccPlaceHolder, ccText, formattedText));
            };
        }
        public override void SetUpCell()
        {
            StartDateTextField.ShouldChangeCharacters = (UITextField textField, NSRange nsRange, string replacementString) => {
                if (replacementString != "" && !Char.IsDigit(replacementString.ToCharArray() [0]))
                {
                    return(false);
                }
                CSRange range = new CSRange((int)nsRange.Location, (int)nsRange.Length);
                DispatchQueue.MainQueue.DispatchAsync(() => {
                    UpdateUI();
                });
                bool changeText = true;

                if (range.Length > 1)
                {
                    return(false);
                }
                if (replacementString.Length > 1)
                {
                    return(false);
                }
                if (replacementString.Length == 1 && !char.IsDigit(replacementString.ToCharArray() [0]))
                {
                    return(false);
                }
                if (textField.Text.Length + replacementString.Length - range.Length > 5)
                {
                    return(false);
                }

                int textLengthAfter = (int)(textField.Text.Length + replacementString.Length - range.Length);

                if (replacementString.Length == 0 && range.Location < 2 && textField.Text.Contains("/"))
                {
                    textField.Text = textField.Text.Replace(@"/", @"");
                    textLengthAfter--;
                }
                if (range.Length == 1 && textField.Text.Substring(range.Location, 1) == "/")
                {
                    textField.Text  = textField.Text.Substring(0, 1);
                    textLengthAfter = 1;
                    changeText      = false;
                }

                if (range.Location == 1 && textField.Text.Length == 1)
                {
                    var aStringBuilder = new StringBuilder(textField.Text);
                    aStringBuilder.Remove(range.Location, range.Length);
                    aStringBuilder.Insert(range.Location, replacementString);
                    string newTextOrig = aStringBuilder.ToString();

                    string text = newTextOrig;
                    if (Int32.Parse(text) > 12 || Int32.Parse(text) == 0)
                    {
                        FlashCheckDateLabel();
                        return(false);
                    }

                    textField.Text = text;
                    textField.Text = textField.Text + @"/";
                    textLengthAfter++;
                    changeText = false;
                }
                else if (range.Location == 0 && textField.Text.Length == 0)
                {
                    if (replacementString.Substring(0, 1).ToCharArray() [0] > '1')
                    {
                        var formatedString = string.Format(@"0{0}/", replacementString);

                        var aStringBuilder = new StringBuilder(textField.Text);
                        aStringBuilder.Remove(range.Location, range.Length);
                        aStringBuilder.Insert(range.Location, formatedString);

                        textField.Text   = aStringBuilder.ToString();
                        textLengthAfter += 2;
                        changeText       = false;
                    }
                }

                if (textLengthAfter >= 4)
                {
                    var aStringBuilder = new StringBuilder(textField.Text);
                    aStringBuilder.Remove(range.Location, range.Length);
                    aStringBuilder.Insert(range.Location, replacementString);

                    string textAfter = aStringBuilder.ToString();


                    int proposedDecade = (textAfter.ToCharArray() [3] - '0') * 10;
                    int yearDecade     = currentYear - (currentYear % 10);

                    if (proposedDecade > yearDecade)
                    {
                        FlashCheckDateLabel();
                        return(false);
                    }

                    if (textLengthAfter == 5)
                    {
                        if (!cardHelper.IsStartDateValid(textAfter))
                        {
                            FlashCheckDateLabel();
                            return(false);
                        }


                        var bStringBuilder = new StringBuilder(textField.Text);
                        bStringBuilder.Remove(range.Location, range.Length);
                        bStringBuilder.Insert(range.Location, replacementString);


                        textField.Text = bStringBuilder.ToString();
                        DispatchQueue.MainQueue.DispatchAsync(() => {
                            IssueNumberTextField.BecomeFirstResponder();
                        });
                        changeText = false;
                    }
                }

                char[] placeHolder = "MM/YY".ToCharArray();
                for (int iii = 0; iii < textLengthAfter; iii++)
                {
                    placeHolder [iii] = ' ';
                }

                StartDatePlaceHolder.Text = new string (placeHolder);
                return(changeText);
            };


            IssueNumberTextField.ShouldChangeCharacters = (UITextField textField, NSRange nsRange, string replacementString) => {
                if (replacementString != "" && !Char.IsDigit(replacementString.ToCharArray() [0]))
                {
                    return(false);
                }
                CSRange range = new CSRange((int)nsRange.Location, (int)nsRange.Length);
                DispatchQueue.MainQueue.DispatchAsync(() => {
                    UpdateUI();
                });
                if (range.Length > 1)
                {
                    return(false);
                }
                if (replacementString.Length > 1)
                {
                    return(false);
                }
                if (replacementString.Length == 1 && !char.IsDigit(replacementString.ToCharArray() [0]))
                {
                    return(false);
                }
                if (textField.Text.Length + replacementString.Length - range.Length > 3)
                {
                    return(false);
                }
                if (textField.Text.Length + replacementString.Length == 3 && replacementString != "")
                {
                    var aStringBuilder = new StringBuilder(textField.Text);
                    aStringBuilder.Remove(range.Location, range.Length);
                    aStringBuilder.Insert(range.Location, replacementString);
                    textField.Text = aStringBuilder.ToString();
                    DismissKeyboardAction();
                    return(true);
                }
                return(true);
            };
        }