14b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa/* 24b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * Copyright (C) 2010 The Android Open Source Project 34b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * 44b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License"); 54b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * you may not use this file except in compliance with the License. 64b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * You may obtain a copy of the License at 74b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * 84b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * http://www.apache.org/licenses/LICENSE-2.0 94b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * 104b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * Unless required by applicable law or agreed to in writing, software 114b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS, 124b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * See the License for the specific language governing permissions and 144b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa * limitations under the License. 154b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa */ 164b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa 174b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawapackage com.android.calendar; 184b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa 196b858fc6f8afad95a075595016c5c22547924886Erikimport android.accounts.Account; 206b858fc6f8afad95a075595016c5c22547924886Erikimport android.accounts.AccountManager; 21e584a7df962b8e643224bcbce022c9bea19fe221Erikimport android.app.ActionBar; 226b858fc6f8afad95a075595016c5c22547924886Erikimport android.content.ContentResolver; 23e584a7df962b8e643224bcbce022c9bea19fe221Erikimport android.content.Intent; 246b858fc6f8afad95a075595016c5c22547924886Erikimport android.os.Bundle; 255e5c84a201af7cf537096213a635674fd2c07a0fErikimport android.os.Handler; 264b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawaimport android.preference.PreferenceActivity; 27a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract; 28a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Calendars; 2934bb002c19ed9488fc466909f9d729600232d305Erikimport android.provider.Settings; 30ca4786769151f97069980443ce43d9c4f867ac5bErikimport android.text.format.DateUtils; 3134bb002c19ed9488fc466909f9d729600232d305Erikimport android.view.Menu; 32e584a7df962b8e643224bcbce022c9bea19fe221Erikimport android.view.MenuItem; 334b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa 344b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawaimport java.util.List; 354b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa 364b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawapublic class CalendarSettingsActivity extends PreferenceActivity { 375e5c84a201af7cf537096213a635674fd2c07a0fErik private static final int CHECK_ACCOUNTS_DELAY = 3000; 385e5c84a201af7cf537096213a635674fd2c07a0fErik private Account[] mAccounts; 395e5c84a201af7cf537096213a635674fd2c07a0fErik private Handler mHandler = new Handler(); 40e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan private boolean mHideMenuButtons = false; 415e5c84a201af7cf537096213a635674fd2c07a0fErik 424b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa @Override 434b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa public void onBuildHeaders(List<Header> target) { 444b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa loadHeadersFromResource(R.xml.calendar_settings_headers, target); 455b2a907fa3a983f74bb48da86846e351c2a464d0Isaac Katzenelson 466b858fc6f8afad95a075595016c5c22547924886Erik Account[] accounts = AccountManager.get(this).getAccounts(); 476b858fc6f8afad95a075595016c5c22547924886Erik if (accounts != null) { 486b858fc6f8afad95a075595016c5c22547924886Erik int length = accounts.length; 496b858fc6f8afad95a075595016c5c22547924886Erik for (int i = 0; i < length; i++) { 506b858fc6f8afad95a075595016c5c22547924886Erik Account acct = accounts[i]; 51a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErik if (ContentResolver.getIsSyncable(acct, CalendarContract.AUTHORITY) > 0) { 526b858fc6f8afad95a075595016c5c22547924886Erik Header accountHeader = new Header(); 536b858fc6f8afad95a075595016c5c22547924886Erik accountHeader.title = acct.name; 546b858fc6f8afad95a075595016c5c22547924886Erik accountHeader.fragment = 556b858fc6f8afad95a075595016c5c22547924886Erik "com.android.calendar.selectcalendars.SelectCalendarsSyncFragment"; 566b858fc6f8afad95a075595016c5c22547924886Erik Bundle args = new Bundle(); 576b858fc6f8afad95a075595016c5c22547924886Erik args.putString(Calendars.ACCOUNT_NAME, acct.name); 586b858fc6f8afad95a075595016c5c22547924886Erik args.putString(Calendars.ACCOUNT_TYPE, acct.type); 596b858fc6f8afad95a075595016c5c22547924886Erik accountHeader.fragmentArguments = args; 606b858fc6f8afad95a075595016c5c22547924886Erik target.add(1, accountHeader); 616b858fc6f8afad95a075595016c5c22547924886Erik } 626b858fc6f8afad95a075595016c5c22547924886Erik } 636b858fc6f8afad95a075595016c5c22547924886Erik } 645e5c84a201af7cf537096213a635674fd2c07a0fErik mAccounts = accounts; 65ca4786769151f97069980443ce43d9c4f867ac5bErik if (Utils.getTardis() + DateUtils.MINUTE_IN_MILLIS > System.currentTimeMillis()) { 66ca4786769151f97069980443ce43d9c4f867ac5bErik Header tardisHeader = new Header(); 670dfbaae6a1c083f9c76ad77a9b711420968672a4Sam Blitzstein tardisHeader.title = getString(R.string.preferences_experimental_category); 68ca4786769151f97069980443ce43d9c4f867ac5bErik tardisHeader.fragment = "com.android.calendar.OtherPreferences"; 69ca4786769151f97069980443ce43d9c4f867ac5bErik target.add(tardisHeader); 70ca4786769151f97069980443ce43d9c4f867ac5bErik } 714b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa } 72e584a7df962b8e643224bcbce022c9bea19fe221Erik 73e584a7df962b8e643224bcbce022c9bea19fe221Erik @Override 74e584a7df962b8e643224bcbce022c9bea19fe221Erik public boolean onOptionsItemSelected(MenuItem item) { 75bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan if (item.getItemId() == android.R.id.home) { 76bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan finish(); 77bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan return true; 78bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan } else if (item.getItemId() == R.id.action_add_account) { 79bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan Intent nextIntent = new Intent(Settings.ACTION_ADD_ACCOUNT); 80bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan final String[] array = { "com.android.calendar" }; 81bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan nextIntent.putExtra(Settings.EXTRA_AUTHORITIES, array); 82bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan nextIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 83bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan startActivity(nextIntent); 84bb6d9279d8c0f0fb746160ad428da4738ece175eMichael Chan return true; 85e584a7df962b8e643224bcbce022c9bea19fe221Erik } 86e584a7df962b8e643224bcbce022c9bea19fe221Erik return super.onOptionsItemSelected(item); 87e584a7df962b8e643224bcbce022c9bea19fe221Erik } 8834bb002c19ed9488fc466909f9d729600232d305Erik 8934bb002c19ed9488fc466909f9d729600232d305Erik @Override 9034bb002c19ed9488fc466909f9d729600232d305Erik public boolean onCreateOptionsMenu(Menu menu) { 91e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan if (!mHideMenuButtons) { 92e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan getMenuInflater().inflate(R.menu.settings_title_bar, menu); 93e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan } 94c5c3b1cb6897c541be33dcb9651625f2e94bd95dRoboErik getActionBar() 95c5c3b1cb6897c541be33dcb9651625f2e94bd95dRoboErik .setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP); 9634bb002c19ed9488fc466909f9d729600232d305Erik return true; 9734bb002c19ed9488fc466909f9d729600232d305Erik } 985e5c84a201af7cf537096213a635674fd2c07a0fErik 995e5c84a201af7cf537096213a635674fd2c07a0fErik @Override 1005e5c84a201af7cf537096213a635674fd2c07a0fErik public void onResume() { 1015e5c84a201af7cf537096213a635674fd2c07a0fErik if (mHandler != null) { 1025e5c84a201af7cf537096213a635674fd2c07a0fErik mHandler.postDelayed(mCheckAccounts, CHECK_ACCOUNTS_DELAY); 1035e5c84a201af7cf537096213a635674fd2c07a0fErik } 1045e5c84a201af7cf537096213a635674fd2c07a0fErik super.onResume(); 1055e5c84a201af7cf537096213a635674fd2c07a0fErik } 1065e5c84a201af7cf537096213a635674fd2c07a0fErik 1075e5c84a201af7cf537096213a635674fd2c07a0fErik @Override 1085e5c84a201af7cf537096213a635674fd2c07a0fErik public void onPause() { 1095e5c84a201af7cf537096213a635674fd2c07a0fErik if (mHandler != null) { 1105e5c84a201af7cf537096213a635674fd2c07a0fErik mHandler.removeCallbacks(mCheckAccounts); 1115e5c84a201af7cf537096213a635674fd2c07a0fErik } 1125e5c84a201af7cf537096213a635674fd2c07a0fErik super.onPause(); 1135e5c84a201af7cf537096213a635674fd2c07a0fErik } 1145e5c84a201af7cf537096213a635674fd2c07a0fErik 115ffd6101165b330a379bc7e73ebf88583a74198b0Alon Albert @Override 116ffd6101165b330a379bc7e73ebf88583a74198b0Alon Albert protected boolean isValidFragment(String fragmentName) { 117ffd6101165b330a379bc7e73ebf88583a74198b0Alon Albert // This activity is not exported so we can just approve everything 118ffd6101165b330a379bc7e73ebf88583a74198b0Alon Albert return true; 119ffd6101165b330a379bc7e73ebf88583a74198b0Alon Albert } 120ffd6101165b330a379bc7e73ebf88583a74198b0Alon Albert 1215e5c84a201af7cf537096213a635674fd2c07a0fErik Runnable mCheckAccounts = new Runnable() { 1225e5c84a201af7cf537096213a635674fd2c07a0fErik @Override 1235e5c84a201af7cf537096213a635674fd2c07a0fErik public void run() { 1245e5c84a201af7cf537096213a635674fd2c07a0fErik Account[] accounts = AccountManager.get(CalendarSettingsActivity.this).getAccounts(); 1255e5c84a201af7cf537096213a635674fd2c07a0fErik if (accounts != null && !accounts.equals(mAccounts)) { 1265e5c84a201af7cf537096213a635674fd2c07a0fErik invalidateHeaders(); 1275e5c84a201af7cf537096213a635674fd2c07a0fErik } 1285e5c84a201af7cf537096213a635674fd2c07a0fErik } 1295e5c84a201af7cf537096213a635674fd2c07a0fErik }; 130e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan 131e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan public void hideMenuButtons() { 132e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan mHideMenuButtons = true; 133e98dca7e0042f7b36788b0e5d8dc6e94048c895cMichael Chan } 1346b858fc6f8afad95a075595016c5c22547924886Erik} 135