1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.android.contacts.activities; 18 19 import android.app.ActionBar; 20 import android.app.Dialog; 21 import android.content.ContentValues; 22 import android.content.Context; 23 import android.content.Intent; 24 import android.net.Uri; 25 import android.os.Bundle; 26 import android.provider.ContactsContract; 27 import android.provider.ContactsContract.Contacts; 28 import android.provider.ContactsContract.RawContacts; 29 import android.util.Log; 30 import android.view.LayoutInflater; 31 import android.view.View; 32 import android.view.View.OnClickListener; 33 import android.widget.TextView; 34 35 import com.android.contacts.ContactSaveService; 36 import com.android.contacts.ContactsActivity; 37 import com.android.contacts.R; 38 import com.android.contacts.editor.ContactEditorFragment; 39 import com.android.contacts.editor.ContactEditorFragment.SaveMode; 40 import com.android.contacts.common.model.AccountTypeManager; 41 import com.android.contacts.common.model.account.AccountType; 42 import com.android.contacts.common.model.account.AccountWithDataSet; 43 import com.android.contacts.interactions.ContactDeletionInteraction; 44 import com.android.contacts.util.DialogManager; 45 46 import java.util.ArrayList; 47 48 public class ContactEditorActivity extends ContactsActivity 49 implements DialogManager.DialogShowingViewActivity { 50 private static final String TAG = "ContactEditorActivity"; 51 52 public static final String ACTION_JOIN_COMPLETED = "joinCompleted"; 53 public static final String ACTION_SAVE_COMPLETED = "saveCompleted"; 54 55 /** 56 * Boolean intent key that specifies that this activity should finish itself 57 * (instead of launching a new view intent) after the editor changes have been 58 * saved. 59 */ 60 public static final String INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED = 61 "finishActivityOnSaveCompleted"; 62 63 private ContactEditorFragment mFragment; 64 private boolean mFinishActivityOnSaveCompleted; 65 66 private DialogManager mDialogManager = new DialogManager(this); 67 68 @Override onCreate(Bundle savedState)69 public void onCreate(Bundle savedState) { 70 super.onCreate(savedState); 71 72 final Intent intent = getIntent(); 73 final String action = intent.getAction(); 74 75 // Determine whether or not this activity should be finished after the user is done 76 // editing the contact or if this activity should launch another activity to view the 77 // contact's details. 78 mFinishActivityOnSaveCompleted = intent.getBooleanExtra( 79 INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, false); 80 81 // The only situation where action could be ACTION_JOIN_COMPLETED is if the 82 // user joined the contact with another and closed the activity before 83 // the save operation was completed. The activity should remain closed then. 84 if (ACTION_JOIN_COMPLETED.equals(action)) { 85 finish(); 86 return; 87 } 88 89 if (ACTION_SAVE_COMPLETED.equals(action)) { 90 finish(); 91 return; 92 } 93 94 setContentView(R.layout.contact_editor_activity); 95 96 ActionBar actionBar = getActionBar(); 97 if (actionBar != null) { 98 if (Intent.ACTION_EDIT.equals(action)) { 99 actionBar.setTitle(getResources().getString( 100 R.string.contact_editor_title_existing_contact)); 101 } else { 102 actionBar.setTitle(getResources().getString( 103 R.string.contact_editor_title_new_contact)); 104 } 105 actionBar.setDisplayShowHomeEnabled(true); 106 actionBar.setDisplayHomeAsUpEnabled(true); 107 } 108 109 mFragment = (ContactEditorFragment) getFragmentManager().findFragmentById( 110 R.id.contact_editor_fragment); 111 mFragment.setListener(mFragmentListener); 112 Uri uri = Intent.ACTION_EDIT.equals(action) ? getIntent().getData() : null; 113 mFragment.load(action, uri, getIntent().getExtras()); 114 } 115 116 @Override onNewIntent(Intent intent)117 protected void onNewIntent(Intent intent) { 118 super.onNewIntent(intent); 119 120 if (mFragment == null) { 121 return; 122 } 123 124 String action = intent.getAction(); 125 if (Intent.ACTION_EDIT.equals(action)) { 126 mFragment.setIntentExtras(intent.getExtras()); 127 } else if (ACTION_SAVE_COMPLETED.equals(action)) { 128 mFragment.onSaveCompleted(true, 129 intent.getIntExtra(ContactEditorFragment.SAVE_MODE_EXTRA_KEY, SaveMode.CLOSE), 130 intent.getBooleanExtra(ContactSaveService.EXTRA_SAVE_SUCCEEDED, false), 131 intent.getData()); 132 } else if (ACTION_JOIN_COMPLETED.equals(action)) { 133 mFragment.onJoinCompleted(intent.getData()); 134 } 135 } 136 137 @Override onCreateDialog(int id, Bundle args)138 protected Dialog onCreateDialog(int id, Bundle args) { 139 if (DialogManager.isManagedId(id)) return mDialogManager.onCreateDialog(id, args); 140 141 // Nobody knows about the Dialog 142 Log.w(TAG, "Unknown dialog requested, id: " + id + ", args: " + args); 143 return null; 144 } 145 146 @Override onBackPressed()147 public void onBackPressed() { 148 mFragment.save(SaveMode.CLOSE); 149 } 150 151 private final ContactEditorFragment.Listener mFragmentListener = 152 new ContactEditorFragment.Listener() { 153 154 @Override 155 public void onDeleteRequested(Uri contactUri) { 156 ContactDeletionInteraction.start(ContactEditorActivity.this, contactUri, true); 157 } 158 159 @Override 160 public void onReverted() { 161 finish(); 162 } 163 164 @Override 165 public void onSaveFinished(Intent resultIntent) { 166 if (mFinishActivityOnSaveCompleted) { 167 setResult(resultIntent == null ? RESULT_CANCELED : RESULT_OK, resultIntent); 168 } else if (resultIntent != null) { 169 startActivity(resultIntent); 170 } 171 finish(); 172 } 173 174 @Override 175 public void onContactSplit(Uri newLookupUri) { 176 finish(); 177 } 178 179 @Override 180 public void onContactNotFound() { 181 finish(); 182 } 183 184 @Override 185 public void onEditOtherContactRequested( 186 Uri contactLookupUri, ArrayList<ContentValues> values) { 187 Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri); 188 intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 189 | Intent.FLAG_ACTIVITY_FORWARD_RESULT); 190 intent.putExtra(ContactEditorFragment.INTENT_EXTRA_ADD_TO_DEFAULT_DIRECTORY, ""); 191 192 // Pass on all the data that has been entered so far 193 if (values != null && values.size() != 0) { 194 intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, values); 195 } 196 197 startActivity(intent); 198 finish(); 199 } 200 201 @Override 202 public void onCustomCreateContactActivityRequested(AccountWithDataSet account, 203 Bundle intentExtras) { 204 final AccountTypeManager accountTypes = 205 AccountTypeManager.getInstance(ContactEditorActivity.this); 206 final AccountType accountType = accountTypes.getAccountType( 207 account.type, account.dataSet); 208 209 Intent intent = new Intent(); 210 intent.setClassName(accountType.syncAdapterPackageName, 211 accountType.getCreateContactActivityClassName()); 212 intent.setAction(Intent.ACTION_INSERT); 213 intent.setType(Contacts.CONTENT_ITEM_TYPE); 214 if (intentExtras != null) { 215 intent.putExtras(intentExtras); 216 } 217 intent.putExtra(RawContacts.ACCOUNT_NAME, account.name); 218 intent.putExtra(RawContacts.ACCOUNT_TYPE, account.type); 219 intent.putExtra(RawContacts.DATA_SET, account.dataSet); 220 intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 221 | Intent.FLAG_ACTIVITY_FORWARD_RESULT); 222 startActivity(intent); 223 finish(); 224 } 225 226 @Override 227 public void onCustomEditContactActivityRequested(AccountWithDataSet account, 228 Uri rawContactUri, Bundle intentExtras, boolean redirect) { 229 final AccountTypeManager accountTypes = 230 AccountTypeManager.getInstance(ContactEditorActivity.this); 231 final AccountType accountType = accountTypes.getAccountType( 232 account.type, account.dataSet); 233 234 Intent intent = new Intent(); 235 intent.setClassName(accountType.syncAdapterPackageName, 236 accountType.getEditContactActivityClassName()); 237 intent.setAction(Intent.ACTION_EDIT); 238 intent.setData(rawContactUri); 239 if (intentExtras != null) { 240 intent.putExtras(intentExtras); 241 } 242 243 if (redirect) { 244 intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 245 | Intent.FLAG_ACTIVITY_FORWARD_RESULT); 246 startActivity(intent); 247 finish(); 248 } else { 249 startActivity(intent); 250 } 251 } 252 }; 253 254 @Override getDialogManager()255 public DialogManager getDialogManager() { 256 return mDialogManager; 257 } 258 } 259