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