• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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             // Inflate a custom action bar that contains the "done" button for saving changes
99             // to the contact
100             LayoutInflater inflater = (LayoutInflater) getSystemService
101                     (Context.LAYOUT_INFLATER_SERVICE);
102             View customActionBarView = inflater.inflate(R.layout.editor_custom_action_bar, null);
103             View saveMenuItem = customActionBarView.findViewById(R.id.save_menu_item);
104             saveMenuItem.setOnClickListener(new OnClickListener() {
105                 @Override
106                 public void onClick(View v) {
107                     mFragment.doSaveAction();
108                 }
109             });
110             TextView title = (TextView) customActionBarView.findViewById(R.id.title);
111             if (Intent.ACTION_EDIT.equals(action)) {
112                 title.setText(getResources().getString(
113                         R.string.contact_editor_title_existing_contact));
114             } else {
115                 title.setText(getResources().getString(
116                         R.string.contact_editor_title_new_contact));
117             }
118             // Show the custom action bar but hide the home icon and title
119             actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
120                     ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME |
121                     ActionBar.DISPLAY_SHOW_TITLE);
122             actionBar.setCustomView(customActionBarView);
123         }
124 
125         mFragment = (ContactEditorFragment) getFragmentManager().findFragmentById(
126                 R.id.contact_editor_fragment);
127         mFragment.setListener(mFragmentListener);
128         Uri uri = Intent.ACTION_EDIT.equals(action) ? getIntent().getData() : null;
129         mFragment.load(action, uri, getIntent().getExtras());
130     }
131 
132     @Override
onNewIntent(Intent intent)133     protected void onNewIntent(Intent intent) {
134         super.onNewIntent(intent);
135 
136         if (mFragment == null) {
137             return;
138         }
139 
140         String action = intent.getAction();
141         if (Intent.ACTION_EDIT.equals(action)) {
142             mFragment.setIntentExtras(intent.getExtras());
143         } else if (ACTION_SAVE_COMPLETED.equals(action)) {
144             mFragment.onSaveCompleted(true,
145                     intent.getIntExtra(ContactEditorFragment.SAVE_MODE_EXTRA_KEY, SaveMode.CLOSE),
146                     intent.getBooleanExtra(ContactSaveService.EXTRA_SAVE_SUCCEEDED, false),
147                     intent.getData());
148         } else if (ACTION_JOIN_COMPLETED.equals(action)) {
149             mFragment.onJoinCompleted(intent.getData());
150         }
151     }
152 
153     @Override
onCreateDialog(int id, Bundle args)154     protected Dialog onCreateDialog(int id, Bundle args) {
155         if (DialogManager.isManagedId(id)) return mDialogManager.onCreateDialog(id, args);
156 
157         // Nobody knows about the Dialog
158         Log.w(TAG, "Unknown dialog requested, id: " + id + ", args: " + args);
159         return null;
160     }
161 
162     @Override
onBackPressed()163     public void onBackPressed() {
164         mFragment.save(SaveMode.CLOSE);
165     }
166 
167     private final ContactEditorFragment.Listener mFragmentListener =
168             new ContactEditorFragment.Listener() {
169 
170         @Override
171         public void onDeleteRequested(Uri contactUri) {
172             ContactDeletionInteraction.start(ContactEditorActivity.this, contactUri, true);
173         }
174 
175         @Override
176         public void onReverted() {
177             finish();
178         }
179 
180         @Override
181         public void onSaveFinished(Intent resultIntent) {
182             if (mFinishActivityOnSaveCompleted) {
183                 setResult(resultIntent == null ? RESULT_CANCELED : RESULT_OK, resultIntent);
184             } else if (resultIntent != null) {
185                 startActivity(resultIntent);
186             }
187             finish();
188         }
189 
190         @Override
191         public void onContactSplit(Uri newLookupUri) {
192             finish();
193         }
194 
195         @Override
196         public void onContactNotFound() {
197             finish();
198         }
199 
200         @Override
201         public void onEditOtherContactRequested(
202                 Uri contactLookupUri, ArrayList<ContentValues> values) {
203             Intent intent = new Intent(Intent.ACTION_EDIT, contactLookupUri);
204             intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
205                     | Intent.FLAG_ACTIVITY_FORWARD_RESULT);
206             intent.putExtra(ContactEditorFragment.INTENT_EXTRA_ADD_TO_DEFAULT_DIRECTORY, "");
207 
208             // Pass on all the data that has been entered so far
209             if (values != null && values.size() != 0) {
210                 intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, values);
211             }
212 
213             startActivity(intent);
214             finish();
215         }
216 
217         @Override
218         public void onCustomCreateContactActivityRequested(AccountWithDataSet account,
219                 Bundle intentExtras) {
220             final AccountTypeManager accountTypes =
221                     AccountTypeManager.getInstance(ContactEditorActivity.this);
222             final AccountType accountType = accountTypes.getAccountType(
223                     account.type, account.dataSet);
224 
225             Intent intent = new Intent();
226             intent.setClassName(accountType.syncAdapterPackageName,
227                     accountType.getCreateContactActivityClassName());
228             intent.setAction(Intent.ACTION_INSERT);
229             intent.setType(Contacts.CONTENT_ITEM_TYPE);
230             if (intentExtras != null) {
231                 intent.putExtras(intentExtras);
232             }
233             intent.putExtra(RawContacts.ACCOUNT_NAME, account.name);
234             intent.putExtra(RawContacts.ACCOUNT_TYPE, account.type);
235             intent.putExtra(RawContacts.DATA_SET, account.dataSet);
236             intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
237                     | Intent.FLAG_ACTIVITY_FORWARD_RESULT);
238             startActivity(intent);
239             finish();
240         }
241 
242         @Override
243         public void onCustomEditContactActivityRequested(AccountWithDataSet account,
244                 Uri rawContactUri, Bundle intentExtras, boolean redirect) {
245             final AccountTypeManager accountTypes =
246                     AccountTypeManager.getInstance(ContactEditorActivity.this);
247             final AccountType accountType = accountTypes.getAccountType(
248                     account.type, account.dataSet);
249 
250             Intent intent = new Intent();
251             intent.setClassName(accountType.syncAdapterPackageName,
252                     accountType.getEditContactActivityClassName());
253             intent.setAction(Intent.ACTION_EDIT);
254             intent.setData(rawContactUri);
255             if (intentExtras != null) {
256                 intent.putExtras(intentExtras);
257             }
258 
259             if (redirect) {
260                 intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
261                         | Intent.FLAG_ACTIVITY_FORWARD_RESULT);
262                 startActivity(intent);
263                 finish();
264             } else {
265                 startActivity(intent);
266             }
267         }
268     };
269 
270     @Override
getDialogManager()271     public DialogManager getDialogManager() {
272         return mDialogManager;
273     }
274 }
275