1 /*
2  * Copyright (C) 2013 Google Inc.
3  * Licensed to The Android Open Source Project.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.mail.browse;
19 
20 import android.content.ContentResolver;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.net.Uri;
24 
25 import com.android.emailcommon.TempDirectory;
26 import com.android.emailcommon.internet.MimeMessage;
27 import com.android.emailcommon.mail.MessagingException;
28 import com.android.mail.ui.MailAsyncTaskLoader;
29 import com.android.mail.utils.LogTag;
30 import com.android.mail.utils.LogUtils;
31 
32 import java.io.File;
33 import java.io.FileNotFoundException;
34 import java.io.IOException;
35 import java.io.InputStream;
36 
37 /**
38  * Loader that builds a ConversationMessage from an EML file Uri.
39  */
40 public class EmlMessageLoader extends MailAsyncTaskLoader<ConversationMessage> {
41     private static final String LOG_TAG = LogTag.getLogTag();
42 
43     private Uri mEmlFileUri;
44 
EmlMessageLoader(Context context, Uri emlFileUri)45     public EmlMessageLoader(Context context, Uri emlFileUri) {
46         super(context);
47         mEmlFileUri = emlFileUri;
48     }
49 
50     @Override
loadInBackground()51     public ConversationMessage loadInBackground() {
52         final Context context = getContext();
53         TempDirectory.setTempDirectory(context);
54         final ContentResolver resolver = context.getContentResolver();
55         final InputStream stream;
56         try {
57             stream = resolver.openInputStream(mEmlFileUri);
58         } catch (FileNotFoundException e) {
59             LogUtils.e(LOG_TAG, e, "Could not find eml file at uri: %s", mEmlFileUri);
60             return null;
61         }
62 
63         final MimeMessage mimeMessage;
64         ConversationMessage convMessage;
65         try {
66             mimeMessage = new MimeMessage(stream);
67             convMessage = new ConversationMessage(context, mimeMessage, mEmlFileUri);
68         } catch (IOException e) {
69             LogUtils.e(LOG_TAG, e, "Could not read eml file");
70             return null;
71         } catch (MessagingException e) {
72             LogUtils.e(LOG_TAG, e, "Error in parsing eml file");
73             return null;
74         } finally {
75             try {
76                 stream.close();
77             } catch (IOException e) {
78                 convMessage = null;
79             }
80 
81             // delete temp files created during parsing
82             final File[] cacheFiles = TempDirectory.getTempDirectory().listFiles();
83             for (final File file : cacheFiles) {
84                 if (file.getName().startsWith("body")) {
85                     final boolean deleted = file.delete();
86                     if (!deleted) {
87                         LogUtils.d(LOG_TAG, "Failed to delete temp file" + file.getName());
88                     }
89                 }
90             }
91         }
92 
93         return convMessage;
94     }
95 
96     /**
97      * Helper function to take care of releasing resources associated
98      * with an actively loaded data set.
99      */
100     @Override
onDiscardResult(ConversationMessage message)101     protected void onDiscardResult(ConversationMessage message) {
102         // if this eml message had attachments, start a service to clean up the cache files
103         if (message.attachmentListUri != null) {
104             final Intent intent = new Intent(Intent.ACTION_DELETE);
105             intent.setClass(getContext(), EmlTempFileDeletionService.class);
106             intent.setData(message.attachmentListUri);
107 
108             getContext().startService(intent);
109         }
110     }
111 }
112