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
17package com.android.contacts.activities;
18
19import com.android.contacts.ContactSaveService;
20import com.android.contacts.ContactsActivity;
21import com.android.contacts.R;
22import com.android.contacts.editor.ContactEditorFragment;
23import com.android.contacts.editor.ContactEditorFragment.SaveMode;
24import com.android.contacts.model.AccountType;
25import com.android.contacts.model.AccountTypeManager;
26import com.android.contacts.model.AccountWithDataSet;
27import com.android.contacts.util.DialogManager;
28
29import android.app.ActionBar;
30import android.app.Dialog;
31import android.content.ContentValues;
32import android.content.Context;
33import android.content.Intent;
34import android.net.Uri;
35import android.os.Bundle;
36import android.provider.ContactsContract;
37import android.provider.ContactsContract.Contacts;
38import android.provider.ContactsContract.RawContacts;
39import android.util.Log;
40import android.view.LayoutInflater;
41import android.view.View;
42import android.view.View.OnClickListener;
43
44import java.util.ArrayList;
45
46public class ContactEditorActivity extends ContactsActivity
47        implements DialogManager.DialogShowingViewActivity {
48    private static final String TAG = "ContactEditorActivity";
49
50    public static final String ACTION_JOIN_COMPLETED = "joinCompleted";
51    public static final String ACTION_SAVE_COMPLETED = "saveCompleted";
52
53    /**
54     * Boolean intent key that specifies that this activity should finish itself
55     * (instead of launching a new view intent) after the editor changes have been
56     * saved.
57     */
58    public static final String INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED =
59            "finishActivityOnSaveCompleted";
60
61    private ContactEditorFragment mFragment;
62    private boolean mFinishActivityOnSaveCompleted;
63
64    private DialogManager mDialogManager = new DialogManager(this);
65
66    @Override
67    public void onCreate(Bundle savedState) {
68        super.onCreate(savedState);
69
70        final Intent intent = getIntent();
71        final String action = intent.getAction();
72
73        // Determine whether or not this activity should be finished after the user is done
74        // editing the contact or if this activity should launch another activity to view the
75        // contact's details.
76        mFinishActivityOnSaveCompleted = intent.getBooleanExtra(
77                INTENT_KEY_FINISH_ACTIVITY_ON_SAVE_COMPLETED, false);
78
79        // The only situation where action could be ACTION_JOIN_COMPLETED is if the
80        // user joined the contact with another and closed the activity before
81        // the save operation was completed.  The activity should remain closed then.
82        if (ACTION_JOIN_COMPLETED.equals(action)) {
83            finish();
84            return;
85        }
86
87        if (ACTION_SAVE_COMPLETED.equals(action)) {
88            finish();
89            return;
90        }
91
92        setContentView(R.layout.contact_editor_activity);
93
94        ActionBar actionBar = getActionBar();
95        if (actionBar != null) {
96            // Inflate a custom action bar that contains the "done" button for saving changes
97            // to the contact
98            LayoutInflater inflater = (LayoutInflater) getSystemService
99                    (Context.LAYOUT_INFLATER_SERVICE);
100            View customActionBarView = inflater.inflate(R.layout.editor_custom_action_bar, null);
101            View saveMenuItem = customActionBarView.findViewById(R.id.save_menu_item);
102            saveMenuItem.setOnClickListener(new OnClickListener() {
103                @Override
104                public void onClick(View v) {
105                    mFragment.doSaveAction();
106                }
107            });
108            // Show the custom action bar but hide the home icon and title
109            actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
110                    ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME |
111                    ActionBar.DISPLAY_SHOW_TITLE);
112            actionBar.setCustomView(customActionBarView);
113        }
114
115        mFragment = (ContactEditorFragment) getFragmentManager().findFragmentById(
116                R.id.contact_editor_fragment);
117        mFragment.setListener(mFragmentListener);
118        Uri uri = Intent.ACTION_EDIT.equals(action) ? getIntent().getData() : null;
119        mFragment.load(action, uri, getIntent().getExtras());
120    }
121
122    @Override
123    protected void onNewIntent(Intent intent) {
124        super.onNewIntent(intent);
125
126        if (mFragment == null) {
127            return;
128        }
129
130        String action = intent.getAction();
131        if (Intent.ACTION_EDIT.equals(action)) {
132            mFragment.setIntentExtras(intent.getExtras());
133        } else if (ACTION_SAVE_COMPLETED.equals(action)) {
134            mFragment.onSaveCompleted(true,
135                    intent.getIntExtra(ContactEditorFragment.SAVE_MODE_EXTRA_KEY, SaveMode.CLOSE),
136                    intent.getBooleanExtra(ContactSaveService.EXTRA_SAVE_SUCCEEDED, false),
137                    intent.getData());
138        } else if (ACTION_JOIN_COMPLETED.equals(action)) {
139            mFragment.onJoinCompleted(intent.getData());
140        }
141    }
142
143    @Override
144    protected Dialog onCreateDialog(int id, Bundle args) {
145        if (DialogManager.isManagedId(id)) return mDialogManager.onCreateDialog(id, args);
146
147        // Nobody knows about the Dialog
148        Log.w(TAG, "Unknown dialog requested, id: " + id + ", args: " + args);
149        return null;
150    }
151
152    @Override
153    public void onBackPressed() {
154        mFragment.save(SaveMode.CLOSE);
155    }
156
157    private final ContactEditorFragment.Listener mFragmentListener =
158            new ContactEditorFragment.Listener() {
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.resPackageName,
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.resPackageName,
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
255    public DialogManager getDialogManager() {
256        return mDialogManager;
257    }
258}
259