10353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan/* 20353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * Copyright (C) 2011 The Android Open Source Project 30353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * 40353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * Licensed under the Apache License, Version 2.0 (the "License"); 50353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * you may not use this file except in compliance with the License. 60353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * You may obtain a copy of the License at 70353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * 80353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * http://www.apache.org/licenses/LICENSE-2.0 90353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * 100353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * Unless required by applicable law or agreed to in writing, software 110353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * distributed under the License is distributed on an "AS IS" BASIS, 120353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * See the License for the specific language governing permissions and 140353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * limitations under the License 150353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan */ 160353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 170353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanpackage com.android.contacts.activities; 180353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 190353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.app.Activity; 200353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.content.Intent; 210353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.os.Bundle; 220353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.provider.ContactsContract.Intents; 230353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.view.View; 240353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.view.View.OnClickListener; 250353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.widget.AdapterView; 260353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.widget.AdapterView.OnItemClickListener; 270353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.widget.Button; 280353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.widget.ListView; 290353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport android.widget.TextView; 300353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 310353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport com.android.contacts.R; 320353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport com.android.contacts.editor.ContactEditorUtils; 330d5588da244d0992c3ff8f25d0875fdf95a8c644Chiao Chengimport com.android.contacts.common.model.AccountTypeManager; 34428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountWithDataSet; 3587c71f43c70cd970e54eecbfa4c8d79259922c5dChiao Chengimport com.android.contacts.common.util.AccountsListAdapter; 3687c71f43c70cd970e54eecbfa4c8d79259922c5dChiao Chengimport com.android.contacts.common.util.AccountsListAdapter.AccountListFilter; 370353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 380353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanimport java.util.List; 390353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 400353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan/** 410353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * This activity can be shown to the user when creating a new contact to inform the user about 420353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * which account the contact will be saved in. There is also an option to add an account at 430353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * this time. The {@link Intent} in the activity result will contain an extra 440353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * {@link #Intents.Insert.ACCOUNT} that contains the {@link AccountWithDataSet} to create 450353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * the new contact in. If the activity result doesn't contain intent data, then there is no 460353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan * account for this contact. 470353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan */ 480353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuanpublic class ContactEditorAccountsChangedActivity extends Activity { 490353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 500353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan private static final String TAG = ContactEditorAccountsChangedActivity.class.getSimpleName(); 510353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 520353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan private static final int SUBACTIVITY_ADD_NEW_ACCOUNT = 1; 530353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 540353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan private AccountsListAdapter mAccountListAdapter; 550353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan private ContactEditorUtils mEditorUtils; 560353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 570353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan private final OnItemClickListener mAccountListItemClickListener = new OnItemClickListener() { 580353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan @Override 590353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 600353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan if (mAccountListAdapter == null) { 610353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan return; 620353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 630353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan saveAccountAndReturnResult(mAccountListAdapter.getItem(position)); 640353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 650353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan }; 660353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 670353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan private final OnClickListener mAddAccountClickListener = new OnClickListener() { 680353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan @Override 690353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan public void onClick(View v) { 700353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan startActivityForResult(mEditorUtils.createAddWritableAccountIntent(), 710353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan SUBACTIVITY_ADD_NEW_ACCOUNT); 720353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 730353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan }; 740353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 750353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan @Override 760353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan protected void onCreate(Bundle savedInstanceState) { 770353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan super.onCreate(savedInstanceState); 780353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 790353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan mEditorUtils = ContactEditorUtils.getInstance(this); 800353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final List<AccountWithDataSet> accounts = AccountTypeManager.getInstance(this). 810353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan getAccounts(true); 820353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final int numAccounts = accounts.size(); 830353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan if (numAccounts < 0) { 840353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan throw new IllegalStateException("Cannot have a negative number of accounts"); 850353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 860353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 870353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan if (numAccounts >= 2) { 880353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // When the user has 2+ writable accounts, show a list of accounts so the user can pick 890353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // which account to create a contact in. 900353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan setContentView(R.layout.contact_editor_accounts_changed_activity_with_picker); 910353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 920353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final TextView textView = (TextView) findViewById(R.id.text); 930353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan textView.setText(getString(R.string.contact_editor_prompt_multiple_accounts)); 940353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 950353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final Button button = (Button) findViewById(R.id.add_account_button); 960353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan button.setText(getString(R.string.add_new_account)); 970353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan button.setOnClickListener(mAddAccountClickListener); 980353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 990353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final ListView accountListView = (ListView) findViewById(R.id.account_list); 1006f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki mAccountListAdapter = new AccountsListAdapter(this, 1016f74c0f3313cbb08ee8a8fbb79bfefc5b03fe215Makoto Onuki AccountListFilter.ACCOUNTS_CONTACT_WRITABLE); 1020353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan accountListView.setAdapter(mAccountListAdapter); 1030353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan accountListView.setOnItemClickListener(mAccountListItemClickListener); 1040353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } else if (numAccounts == 1) { 1050353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // If the user has 1 writable account we will just show the user a message with 2 1060353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // possible action buttons. 1070353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan setContentView(R.layout.contact_editor_accounts_changed_activity_with_text); 1080353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1090353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final TextView textView = (TextView) findViewById(R.id.text); 1100353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final Button leftButton = (Button) findViewById(R.id.left_button); 1110353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final Button rightButton = (Button) findViewById(R.id.right_button); 1120353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1130353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final AccountWithDataSet account = accounts.get(0); 1140353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan textView.setText(getString(R.string.contact_editor_prompt_one_account, 1150353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan account.name)); 1160353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1170353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // This button allows the user to add a new account to the device and return to 1180353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // this app afterwards. 1190353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan leftButton.setText(getString(R.string.add_new_account)); 1200353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan leftButton.setOnClickListener(mAddAccountClickListener); 1210353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1220353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // This button allows the user to continue creating the contact in the specified 1230353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // account. 1240353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan rightButton.setText(getString(android.R.string.ok)); 1250353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan rightButton.setOnClickListener(new OnClickListener() { 1260353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan @Override 1270353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan public void onClick(View v) { 1280353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan saveAccountAndReturnResult(account); 1290353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 1300353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan }); 1310353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } else { 1320353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // If the user has 0 writable accounts, we will just show the user a message with 2 1330353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // possible action buttons. 1340353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan setContentView(R.layout.contact_editor_accounts_changed_activity_with_text); 1350353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1360353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final TextView textView = (TextView) findViewById(R.id.text); 1370353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final Button leftButton = (Button) findViewById(R.id.left_button); 1380353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan final Button rightButton = (Button) findViewById(R.id.right_button); 1390353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1400353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan textView.setText(getString(R.string.contact_editor_prompt_zero_accounts)); 1410353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1420353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // This button allows the user to continue editing the contact as a phone-only 1430353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // local contact. 1440353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan leftButton.setText(getString(R.string.keep_local)); 1450353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan leftButton.setOnClickListener(new OnClickListener() { 1460353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan @Override 1470353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan public void onClick(View v) { 1480353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // Remember that the user wants to create local contacts, so the user is not 1490353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // prompted again with this activity. 1500353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan mEditorUtils.saveDefaultAndAllAccounts(null); 1510353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan setResult(RESULT_OK); 1520353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan finish(); 1530353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 1540353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan }); 1550353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1560353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // This button allows the user to add a new account to the device and return to 1570353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // this app afterwards. 1580353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan rightButton.setText(getString(R.string.add_account)); 1590353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan rightButton.setOnClickListener(mAddAccountClickListener); 1600353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 1610353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 1620353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1630353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan @Override 1640353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan protected void onActivityResult(int requestCode, int resultCode, Intent data) { 1650353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan if (requestCode == SUBACTIVITY_ADD_NEW_ACCOUNT) { 1660353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // If the user canceled the account setup process, then keep this activity visible to 1670353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // the user. 1680353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan if (resultCode != RESULT_OK) { 1690353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan return; 1700353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 1710353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // Subactivity was successful, so pass the result back and finish the activity. 1720353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan AccountWithDataSet account = mEditorUtils.getCreatedAccount(resultCode, data); 1730353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan if (account == null) { 1740353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan setResult(resultCode); 1750353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan finish(); 1760353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan return; 1770353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 1780353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan saveAccountAndReturnResult(account); 1790353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 1800353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 1810353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1820353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan private void saveAccountAndReturnResult(AccountWithDataSet account) { 1830353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // Save this as the default account 1840353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan mEditorUtils.saveDefaultAndAllAccounts(account); 1850353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan 1860353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan // Pass account info in activity result intent 1870353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan Intent intent = new Intent(); 1880353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan intent.putExtra(Intents.Insert.ACCOUNT, account); 1890353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan setResult(RESULT_OK, intent); 1900353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan finish(); 1910353a24d97cc0266eb9bf0ee6c7d6821aeb1896eKatherine Kuan } 192428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Cheng} 193