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