14afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung/*
24afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * Copyright (C) 2013 The Android Open Source Project
34afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung *
44afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * Licensed under the Apache License, Version 2.0 (the "License");
54afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * you may not use this file except in compliance with the License.
64afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * You may obtain a copy of the License at
74afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung *
84afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung *      http://www.apache.org/licenses/LICENSE-2.0
94afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung *
104afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * Unless required by applicable law or agreed to in writing, software
114afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * distributed under the License is distributed on an "AS IS" BASIS,
124afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * See the License for the specific language governing permissions and
144afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * limitations under the License.
154afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung */
164afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
174afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungpackage com.android.calendar.event;
184afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
19e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kungimport java.io.Serializable;
204afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport java.util.ArrayList;
214afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport java.util.Arrays;
224afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport java.util.Comparator;
234afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport java.util.HashMap;
244afba187f8990ae2b3afaf8fcdb6039f231f4914James Kungimport java.util.Map;
254afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
264afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung/**
274afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung * A cache for event colors and event color keys stored based upon calendar account name and type.
284afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung */
29e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kungpublic class EventColorCache implements Serializable {
30e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung
31e134cd5c96507107048a50b55fe2fee85fe8e2e7James Kung    private static final long serialVersionUID = 2L;
324afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
334afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private static final String SEPARATOR = "::";
344afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
354afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private Map<String, ArrayList<Integer>> mColorPaletteMap;
364afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private Map<String, Integer> mColorKeyMap;
374afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
384afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    public EventColorCache() {
394afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        mColorPaletteMap = new HashMap<String, ArrayList<Integer>>();
404afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        mColorKeyMap = new HashMap<String, Integer>();
414afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
424afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
434afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    /**
444afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung     * Inserts a color into the cache.
454afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung     */
464afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    public void insertColor(String accountName, String accountType, int displayColor,
474afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            int colorKey) {
484afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        mColorKeyMap.put(createKey(accountName, accountType, displayColor), colorKey);
494afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        String key = createKey(accountName, accountType);
504afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        ArrayList<Integer> colorPalette;
514afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        if ((colorPalette = mColorPaletteMap.get(key)) == null) {
524afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            colorPalette = new ArrayList<Integer>();
534afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
544afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        colorPalette.add(displayColor);
554afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        mColorPaletteMap.put(key, colorPalette);
564afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
574afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
584afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    /**
594afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung     * Retrieve an array of colors for a specific account name and type.
604afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung     */
614afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    public int[] getColorArray(String accountName, String accountType) {
624afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        ArrayList<Integer> colors = mColorPaletteMap.get(createKey(accountName, accountType));
634afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        if (colors == null) {
644afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            return null;
654afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
664afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        int[] ret = new int[colors.size()];
674afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        for (int i = 0; i < ret.length; i++) {
684afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            ret[i] = colors.get(i);
694afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
704afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        return ret;
714afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
724afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
734afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    /**
744afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung     * Retrieve an event color's unique key based on account name, type, and color.
754afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung     */
764afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    public int getColorKey(String accountName, String accountType, int displayColor) {
774afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        return mColorKeyMap.get(createKey(accountName, accountType, displayColor));
784afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
794afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
804afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    /**
814afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung     * Sorts the arrays of colors based on a comparator.
824afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung     */
834afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    public void sortPalettes(Comparator<Integer> comparator) {
844afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        for (String key : mColorPaletteMap.keySet()) {
854afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            ArrayList<Integer> palette = mColorPaletteMap.get(key);
864afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            Integer[] sortedColors = new Integer[palette.size()];
874afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            Arrays.sort(palette.toArray(sortedColors), comparator);
884afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            palette.clear();
894afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            for (Integer color : sortedColors) {
904afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                palette.add(color);
914afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            }
924afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            mColorPaletteMap.put(key, palette);
934afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        }
944afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
954afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
964afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private String createKey(String accountName, String accountType) {
974afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        return new StringBuilder().append(accountName)
984afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                .append(SEPARATOR)
994afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                .append(accountType)
1004afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung                .toString();
1014afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
1024afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung
1034afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    private String createKey(String accountName, String accountType, int displayColor) {
1044afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung        return new StringBuilder(createKey(accountName, accountType))
1054afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            .append(SEPARATOR)
1064afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            .append(displayColor)
1074afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung            .toString();
1084afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung    }
1094afba187f8990ae2b3afaf8fcdb6039f231f4914James Kung}
110