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