161388102bec5243dfd4494b8c674cdb7957663a6James Kung/*
261388102bec5243dfd4494b8c674cdb7957663a6James Kung * Copyright (C) 2013 The Android Open Source Project
361388102bec5243dfd4494b8c674cdb7957663a6James Kung *
461388102bec5243dfd4494b8c674cdb7957663a6James Kung * Licensed under the Apache License, Version 2.0 (the "License");
561388102bec5243dfd4494b8c674cdb7957663a6James Kung * you may not use this file except in compliance with the License.
661388102bec5243dfd4494b8c674cdb7957663a6James Kung * You may obtain a copy of the License at
761388102bec5243dfd4494b8c674cdb7957663a6James Kung *
861388102bec5243dfd4494b8c674cdb7957663a6James Kung *      http://www.apache.org/licenses/LICENSE-2.0
961388102bec5243dfd4494b8c674cdb7957663a6James Kung *
1061388102bec5243dfd4494b8c674cdb7957663a6James Kung * Unless required by applicable law or agreed to in writing, software
1161388102bec5243dfd4494b8c674cdb7957663a6James Kung * distributed under the License is distributed on an "AS IS" BASIS,
1261388102bec5243dfd4494b8c674cdb7957663a6James Kung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361388102bec5243dfd4494b8c674cdb7957663a6James Kung * See the License for the specific language governing permissions and
1461388102bec5243dfd4494b8c674cdb7957663a6James Kung * limitations under the License.
1561388102bec5243dfd4494b8c674cdb7957663a6James Kung */
1661388102bec5243dfd4494b8c674cdb7957663a6James Kung
1761388102bec5243dfd4494b8c674cdb7957663a6James Kungpackage com.android.calendar.selectcalendars;
1861388102bec5243dfd4494b8c674cdb7957663a6James Kung
1961388102bec5243dfd4494b8c674cdb7957663a6James Kungimport android.content.Context;
2061388102bec5243dfd4494b8c674cdb7957663a6James Kungimport android.database.Cursor;
2161388102bec5243dfd4494b8c674cdb7957663a6James Kungimport android.provider.CalendarContract.Colors;
2261388102bec5243dfd4494b8c674cdb7957663a6James Kung
2361388102bec5243dfd4494b8c674cdb7957663a6James Kungimport com.android.calendar.AsyncQueryService;
2461388102bec5243dfd4494b8c674cdb7957663a6James Kung
2561388102bec5243dfd4494b8c674cdb7957663a6James Kungimport java.util.HashSet;
2661388102bec5243dfd4494b8c674cdb7957663a6James Kung
2761388102bec5243dfd4494b8c674cdb7957663a6James Kung/**
2861388102bec5243dfd4494b8c674cdb7957663a6James Kung * CalendarColorCache queries the provider and stores the account identifiers (name and type)
2961388102bec5243dfd4494b8c674cdb7957663a6James Kung * of the accounts which contain optional calendar colors, and thus should allow for the
3061388102bec5243dfd4494b8c674cdb7957663a6James Kung * user to choose calendar colors.
3161388102bec5243dfd4494b8c674cdb7957663a6James Kung */
3261388102bec5243dfd4494b8c674cdb7957663a6James Kungpublic class CalendarColorCache {
3361388102bec5243dfd4494b8c674cdb7957663a6James Kung
3461388102bec5243dfd4494b8c674cdb7957663a6James Kung    private HashSet<String> mCache = new HashSet<String>();
3561388102bec5243dfd4494b8c674cdb7957663a6James Kung
3661388102bec5243dfd4494b8c674cdb7957663a6James Kung    private static final String SEPARATOR = "::";
3761388102bec5243dfd4494b8c674cdb7957663a6James Kung
3861388102bec5243dfd4494b8c674cdb7957663a6James Kung    private AsyncQueryService mService;
3961388102bec5243dfd4494b8c674cdb7957663a6James Kung    private OnCalendarColorsLoadedListener mListener;
4061388102bec5243dfd4494b8c674cdb7957663a6James Kung
4161388102bec5243dfd4494b8c674cdb7957663a6James Kung    private StringBuffer mStringBuffer = new StringBuffer();
4261388102bec5243dfd4494b8c674cdb7957663a6James Kung
4361388102bec5243dfd4494b8c674cdb7957663a6James Kung    private static String[] PROJECTION = new String[] {Colors.ACCOUNT_NAME, Colors.ACCOUNT_TYPE };
4461388102bec5243dfd4494b8c674cdb7957663a6James Kung
4561388102bec5243dfd4494b8c674cdb7957663a6James Kung    /**
4661388102bec5243dfd4494b8c674cdb7957663a6James Kung     * Interface which provides callback after provider query of calendar colors.
4761388102bec5243dfd4494b8c674cdb7957663a6James Kung     */
4861388102bec5243dfd4494b8c674cdb7957663a6James Kung    public interface OnCalendarColorsLoadedListener {
4961388102bec5243dfd4494b8c674cdb7957663a6James Kung
5061388102bec5243dfd4494b8c674cdb7957663a6James Kung        /**
5161388102bec5243dfd4494b8c674cdb7957663a6James Kung         * Callback after the set of accounts with additional calendar colors are loaded.
5261388102bec5243dfd4494b8c674cdb7957663a6James Kung         */
5361388102bec5243dfd4494b8c674cdb7957663a6James Kung        void onCalendarColorsLoaded();
5461388102bec5243dfd4494b8c674cdb7957663a6James Kung    }
5561388102bec5243dfd4494b8c674cdb7957663a6James Kung
5661388102bec5243dfd4494b8c674cdb7957663a6James Kung    public CalendarColorCache(Context context, OnCalendarColorsLoadedListener listener) {
5761388102bec5243dfd4494b8c674cdb7957663a6James Kung        mListener = listener;
5861388102bec5243dfd4494b8c674cdb7957663a6James Kung        mService = new AsyncQueryService(context) {
5961388102bec5243dfd4494b8c674cdb7957663a6James Kung
6061388102bec5243dfd4494b8c674cdb7957663a6James Kung            @Override
6161388102bec5243dfd4494b8c674cdb7957663a6James Kung            public void onQueryComplete(int token, Object cookie, Cursor c) {
6261388102bec5243dfd4494b8c674cdb7957663a6James Kung                if (c == null) {
6361388102bec5243dfd4494b8c674cdb7957663a6James Kung                    return;
6461388102bec5243dfd4494b8c674cdb7957663a6James Kung                }
6561388102bec5243dfd4494b8c674cdb7957663a6James Kung                if (c.moveToFirst()) {
6661388102bec5243dfd4494b8c674cdb7957663a6James Kung                    clear();
6761388102bec5243dfd4494b8c674cdb7957663a6James Kung                    do {
6861388102bec5243dfd4494b8c674cdb7957663a6James Kung                        insert(c.getString(0), c.getString(1));
6961388102bec5243dfd4494b8c674cdb7957663a6James Kung                    } while (c.moveToNext());
7061388102bec5243dfd4494b8c674cdb7957663a6James Kung                    mListener.onCalendarColorsLoaded();
7161388102bec5243dfd4494b8c674cdb7957663a6James Kung                }
7261388102bec5243dfd4494b8c674cdb7957663a6James Kung                if (c != null) {
7361388102bec5243dfd4494b8c674cdb7957663a6James Kung                    c.close();
7461388102bec5243dfd4494b8c674cdb7957663a6James Kung                }
7561388102bec5243dfd4494b8c674cdb7957663a6James Kung            }
7661388102bec5243dfd4494b8c674cdb7957663a6James Kung        };
7761388102bec5243dfd4494b8c674cdb7957663a6James Kung        mService.startQuery(0, null, Colors.CONTENT_URI, PROJECTION,
7861388102bec5243dfd4494b8c674cdb7957663a6James Kung                Colors.COLOR_TYPE + "=" + Colors.TYPE_CALENDAR, null, null);
7961388102bec5243dfd4494b8c674cdb7957663a6James Kung    }
8061388102bec5243dfd4494b8c674cdb7957663a6James Kung
8161388102bec5243dfd4494b8c674cdb7957663a6James Kung    /**
8261388102bec5243dfd4494b8c674cdb7957663a6James Kung     * Inserts a specified account into the set.
8361388102bec5243dfd4494b8c674cdb7957663a6James Kung     */
8461388102bec5243dfd4494b8c674cdb7957663a6James Kung    private void insert(String accountName, String accountType) {
8561388102bec5243dfd4494b8c674cdb7957663a6James Kung        mCache.add(generateKey(accountName, accountType));
8661388102bec5243dfd4494b8c674cdb7957663a6James Kung    }
8761388102bec5243dfd4494b8c674cdb7957663a6James Kung
8861388102bec5243dfd4494b8c674cdb7957663a6James Kung    /**
8961388102bec5243dfd4494b8c674cdb7957663a6James Kung     * Does a set lookup to determine if a specified account has more optional calendar colors.
9061388102bec5243dfd4494b8c674cdb7957663a6James Kung     */
9161388102bec5243dfd4494b8c674cdb7957663a6James Kung    public boolean hasColors(String accountName, String accountType) {
9261388102bec5243dfd4494b8c674cdb7957663a6James Kung        return mCache.contains(generateKey(accountName, accountType));
9361388102bec5243dfd4494b8c674cdb7957663a6James Kung    }
9461388102bec5243dfd4494b8c674cdb7957663a6James Kung
9561388102bec5243dfd4494b8c674cdb7957663a6James Kung    /**
9661388102bec5243dfd4494b8c674cdb7957663a6James Kung     * Clears the cached set.
9761388102bec5243dfd4494b8c674cdb7957663a6James Kung     */
9861388102bec5243dfd4494b8c674cdb7957663a6James Kung    private void clear() {
9961388102bec5243dfd4494b8c674cdb7957663a6James Kung        mCache.clear();
10061388102bec5243dfd4494b8c674cdb7957663a6James Kung    }
10161388102bec5243dfd4494b8c674cdb7957663a6James Kung
10261388102bec5243dfd4494b8c674cdb7957663a6James Kung    /**
10361388102bec5243dfd4494b8c674cdb7957663a6James Kung     * Generates a single key based on account name and account type for map lookup/insertion.
10461388102bec5243dfd4494b8c674cdb7957663a6James Kung     */
10561388102bec5243dfd4494b8c674cdb7957663a6James Kung    private String generateKey(String accountName, String accountType) {
10661388102bec5243dfd4494b8c674cdb7957663a6James Kung        mStringBuffer.setLength(0);
10761388102bec5243dfd4494b8c674cdb7957663a6James Kung        return mStringBuffer.append(accountName).append(SEPARATOR).append(accountType).toString();
10861388102bec5243dfd4494b8c674cdb7957663a6James Kung    }
10961388102bec5243dfd4494b8c674cdb7957663a6James Kung}
110