1/*
2 * Copyright (C) 2008 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.email2.ui;
18
19import android.content.ComponentName;
20import android.content.ContentResolver;
21import android.content.Context;
22import android.content.Intent;
23import android.content.UriMatcher;
24import android.content.pm.PackageManager;
25import android.database.Cursor;
26import android.net.Uri;
27import android.os.Bundle;
28
29import com.android.email.Preferences;
30import com.android.email.provider.EmailProvider;
31import com.android.email.service.AttachmentService;
32import com.android.email.service.EmailServiceUtils;
33import com.android.emailcommon.Logging;
34import com.android.emailcommon.TempDirectory;
35import com.android.emailcommon.provider.Mailbox;
36import com.android.emailcommon.utility.IntentUtilities;
37import com.android.mail.providers.Folder;
38import com.android.mail.providers.UIProvider;
39import com.android.mail.utils.LogTag;
40import com.android.mail.utils.LogUtils;
41import com.android.mail.utils.Utils;
42
43public class MailActivityEmail extends com.android.mail.ui.MailActivity {
44
45    public static final String LOG_TAG = LogTag.getLogTag();
46
47    private static final int MATCH_LEGACY_SHORTCUT_INTENT = 1;
48    /**
49     * A matcher for data URI's that specify conversation list info.
50     */
51    private static final UriMatcher sUrlMatcher = new UriMatcher(UriMatcher.NO_MATCH);
52    static {
53        sUrlMatcher.addURI(
54                EmailProvider.LEGACY_AUTHORITY, "view/mailbox", MATCH_LEGACY_SHORTCUT_INTENT);
55    }
56
57
58    @Override
59    public void onCreate(Bundle bundle) {
60        final Intent intent = getIntent();
61        final Uri data = intent != null ? intent.getData() : null;
62        if (data != null) {
63            final int match = sUrlMatcher.match(data);
64            switch (match) {
65                case MATCH_LEGACY_SHORTCUT_INTENT: {
66                    final long mailboxId = IntentUtilities.getMailboxIdFromIntent(intent);
67                    final Mailbox mailbox = Mailbox.restoreMailboxWithId(this, mailboxId);
68                    if (mailbox == null) {
69                        LogUtils.e(LOG_TAG, "unable to restore mailbox");
70                        break;
71                    }
72
73                    final Intent viewIntent = getViewIntent(mailbox.mAccountKey, mailboxId);
74                    if (viewIntent != null) {
75                        setIntent(viewIntent);
76                    }
77                    break;
78                }
79            }
80        }
81
82        super.onCreate(bundle);
83        TempDirectory.setTempDirectory(this);
84
85        // Make sure all required services are running when the app is started (can prevent
86        // issues after an adb sync/install)
87        EmailProvider.setServicesEnabledAsync(this);
88    }
89
90    /**
91     * Internal, utility method for logging.
92     * The calls to log() must be guarded with "if (Email.LOGD)" for performance reasons.
93     */
94    public static void log(String message) {
95        LogUtils.d(Logging.LOG_TAG, message);
96    }
97
98    private Intent getViewIntent(long accountId, long mailboxId) {
99        final ContentResolver contentResolver = getContentResolver();
100
101        final Cursor accountCursor = contentResolver.query(
102                EmailProvider.uiUri("uiaccount", accountId),
103                UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES,
104                null, null, null);
105
106        if (accountCursor == null) {
107            LogUtils.e(LOG_TAG, "Null account cursor for mAccountId %d", accountId);
108            return null;
109        }
110
111        com.android.mail.providers.Account account = null;
112        try {
113            if (accountCursor.moveToFirst()) {
114                account = com.android.mail.providers.Account.builder().buildFrom(accountCursor);
115            }
116        } finally {
117            accountCursor.close();
118        }
119
120
121        final Cursor folderCursor = contentResolver.query(
122                EmailProvider.uiUri("uifolder", mailboxId),
123                UIProvider.FOLDERS_PROJECTION, null, null, null);
124
125        if (folderCursor == null) {
126            LogUtils.e(LOG_TAG, "Null folder cursor for account %d, mailbox %d",
127                    accountId, mailboxId);
128            return null;
129        }
130
131        Folder folder = null;
132        try {
133            if (folderCursor.moveToFirst()) {
134                folder = new Folder(folderCursor);
135            } else {
136                LogUtils.e(LOG_TAG, "Empty folder cursor for account %d, mailbox %d",
137                        accountId, mailboxId);
138                return null;
139            }
140        } finally {
141            folderCursor.close();
142        }
143
144        return Utils.createViewFolderIntent(this, folder.folderUri.fullUri, account);
145    }
146}
147