186c892dc892c256d567371aef087ff6758546140Jakub Gielzak/*
286c892dc892c256d567371aef087ff6758546140Jakub Gielzak * Copyright (C) 2017 The Android Open Source Project
386c892dc892c256d567371aef087ff6758546140Jakub Gielzak *
486c892dc892c256d567371aef087ff6758546140Jakub Gielzak * Licensed under the Apache License, Version 2.0 (the "License");
586c892dc892c256d567371aef087ff6758546140Jakub Gielzak * you may not use this file except in compliance with the License.
686c892dc892c256d567371aef087ff6758546140Jakub Gielzak * You may obtain a copy of the License at
786c892dc892c256d567371aef087ff6758546140Jakub Gielzak *
886c892dc892c256d567371aef087ff6758546140Jakub Gielzak *      http://www.apache.org/licenses/LICENSE-2.0
986c892dc892c256d567371aef087ff6758546140Jakub Gielzak *
1086c892dc892c256d567371aef087ff6758546140Jakub Gielzak * Unless required by applicable law or agreed to in writing, software
1186c892dc892c256d567371aef087ff6758546140Jakub Gielzak * distributed under the License is distributed on an "AS IS" BASIS,
1286c892dc892c256d567371aef087ff6758546140Jakub Gielzak * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1386c892dc892c256d567371aef087ff6758546140Jakub Gielzak * See the License for the specific language governing permissions and
1486c892dc892c256d567371aef087ff6758546140Jakub Gielzak * limitations under the License.
1586c892dc892c256d567371aef087ff6758546140Jakub Gielzak */
1686c892dc892c256d567371aef087ff6758546140Jakub Gielzak
17c32f00f751eb2fa4dfaab313fa6ea4d34ccc1d83Aurimas Liutikaspackage com.example.androidx.viewpager2.cards;
1886c892dc892c256d567371aef087ff6758546140Jakub Gielzak
1986c892dc892c256d567371aef087ff6758546140Jakub Gielzakimport static java.util.Arrays.asList;
2086c892dc892c256d567371aef087ff6758546140Jakub Gielzakimport static java.util.Collections.unmodifiableSet;
2186c892dc892c256d567371aef087ff6758546140Jakub Gielzak
220de643cb2649f48ef544f467709cf0467556d15cJakub Gielzakimport android.os.Bundle;
230de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak
240de643cb2649f48ef544f467709cf0467556d15cJakub Gielzakimport java.util.ArrayList;
2586c892dc892c256d567371aef087ff6758546140Jakub Gielzakimport java.util.LinkedHashSet;
260de643cb2649f48ef544f467709cf0467556d15cJakub Gielzakimport java.util.List;
2786c892dc892c256d567371aef087ff6758546140Jakub Gielzakimport java.util.Set;
2886c892dc892c256d567371aef087ff6758546140Jakub Gielzak
2986c892dc892c256d567371aef087ff6758546140Jakub Gielzak/**
3086c892dc892c256d567371aef087ff6758546140Jakub Gielzak * Playing card
3186c892dc892c256d567371aef087ff6758546140Jakub Gielzak */
3286c892dc892c256d567371aef087ff6758546140Jakub Gielzakpublic class Card {
330de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    private static final String ARGS_BUNDLE = Card.class.getName() + ":Bundle";
340de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak
3586c892dc892c256d567371aef087ff6758546140Jakub Gielzak    private static final Set<Character> SUITS = unmodifiableSet(new LinkedHashSet<>(
360de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak            asList('♣' /* clubs*/, '♦' /* diamonds*/, '♥' /* hearts*/, '♠' /*spades*/)));
3786c892dc892c256d567371aef087ff6758546140Jakub Gielzak    private static final Set<Character> VALUES = unmodifiableSet(new LinkedHashSet<>(
3886c892dc892c256d567371aef087ff6758546140Jakub Gielzak            asList('2', '3', '4', '5', '6', '7', '8', '9', '⒑', 'J', 'Q', 'K', 'A')));
3986c892dc892c256d567371aef087ff6758546140Jakub Gielzak
4086c892dc892c256d567371aef087ff6758546140Jakub Gielzak    private final char mSuit;
4186c892dc892c256d567371aef087ff6758546140Jakub Gielzak    private final char mValue;
4286c892dc892c256d567371aef087ff6758546140Jakub Gielzak
4386c892dc892c256d567371aef087ff6758546140Jakub Gielzak    public Card(char suit, char value) {
4486c892dc892c256d567371aef087ff6758546140Jakub Gielzak        this.mSuit = checkValidValue(suit, SUITS);
4586c892dc892c256d567371aef087ff6758546140Jakub Gielzak        this.mValue = checkValidValue(value, VALUES);
4686c892dc892c256d567371aef087ff6758546140Jakub Gielzak    }
4786c892dc892c256d567371aef087ff6758546140Jakub Gielzak
480de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    char getSuit() {
4986c892dc892c256d567371aef087ff6758546140Jakub Gielzak        return mSuit;
5086c892dc892c256d567371aef087ff6758546140Jakub Gielzak    }
5186c892dc892c256d567371aef087ff6758546140Jakub Gielzak
520de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    String getCornerLabel() {
5386c892dc892c256d567371aef087ff6758546140Jakub Gielzak        return mValue + "\n" + mSuit;
5486c892dc892c256d567371aef087ff6758546140Jakub Gielzak    }
5586c892dc892c256d567371aef087ff6758546140Jakub Gielzak
560de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    /** Use in conjunction with {@link Card#fromBundle(Bundle)} */
570de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    public Bundle toBundle() {
580de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        Bundle args = new Bundle(1);
590de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        args.putCharArray(ARGS_BUNDLE, new char[]{mSuit, mValue});
600de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        return args;
610de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    }
620de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak
630de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    /** Use in conjunction with {@link Card#toBundle()} */
640de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    public static Card fromBundle(Bundle bundle) {
650de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        char[] spec = bundle.getCharArray(ARGS_BUNDLE);
660de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        return new Card(spec[0], spec[1]);
670de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    }
680de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak
6986c892dc892c256d567371aef087ff6758546140Jakub Gielzak    private static char checkValidValue(char value, Set<Character> allowed) {
7086c892dc892c256d567371aef087ff6758546140Jakub Gielzak        if (allowed.contains(value)) {
7186c892dc892c256d567371aef087ff6758546140Jakub Gielzak            return value;
7286c892dc892c256d567371aef087ff6758546140Jakub Gielzak        }
7386c892dc892c256d567371aef087ff6758546140Jakub Gielzak        throw new IllegalArgumentException("Illegal argument: " + value);
7486c892dc892c256d567371aef087ff6758546140Jakub Gielzak    }
750de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak
760de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    /**
770de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak     * Creates a deck of all allowed cards
780de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak     */
790de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    public static List<Card> createDeck52() {
800de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        List<Card> result = new ArrayList<>(52);
810de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        for (Character suit : SUITS) {
820de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak            for (Character value : VALUES) {
830de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak                result.add(new Card(suit, value));
840de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak            }
850de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        }
860de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        if (result.size() != 52) {
870de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak            throw new IllegalStateException();
880de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        }
890de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak        return result;
900de643cb2649f48ef544f467709cf0467556d15cJakub Gielzak    }
9186c892dc892c256d567371aef087ff6758546140Jakub Gielzak}
92