Don't require Application when a Context instance will do

This commit is contained in:
cketti 2014-12-12 04:40:49 +01:00
parent 86487a738d
commit 328405419a
11 changed files with 115 additions and 141 deletions

View File

@ -49,7 +49,7 @@ import android.widget.TextView;
* Currently we make no attempts to stop the background code (e.g. {@link MessagingController}) from
* opening the accounts' databases. If this happens the upgrade is performed in one of the
* background threads and not by {@link DatabaseUpgradeService}. But this is not a problem. Due to
* the locking in {@link Store#getLocalInstance(Account, android.app.Application)} the upgrade
* the locking in {@link Store#getLocalInstance(Account, Context)} the upgrade
* service will block in the {@link Account#getLocalStore()} call and from the outside (especially
* for this activity) it will appear as if {@link DatabaseUpgradeService} is performing the upgrade.
* </p>

View File

@ -22,7 +22,6 @@ import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import android.app.Application;
import android.app.KeyguardManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
@ -195,10 +194,7 @@ public class MessagingController implements Runnable {
private boolean mBusy;
/**
* {@link K9}
*/
private Application mApplication;
private Context context;
/**
* A holder class for pending notification data
@ -316,14 +312,12 @@ public class MessagingController implements Runnable {
private static final Set<Flag> SYNC_FLAGS = EnumSet.of(Flag.SEEN, Flag.FLAGGED, Flag.ANSWERED, Flag.FORWARDED);
private void suppressMessages(Account account, List<LocalMessage> messages) {
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(),
mApplication.getApplicationContext());
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context);
cache.hideMessages(messages);
}
private void unsuppressMessages(Account account, List<? extends Message> messages) {
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(),
mApplication.getApplicationContext());
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context);
cache.unhideMessages(messages);
}
@ -331,16 +325,14 @@ public class MessagingController implements Runnable {
long messageId = message.getId();
long folderId = message.getFolder().getId();
EmailProviderCache cache = EmailProviderCache.getCache(message.getFolder().getAccountUuid(),
mApplication.getApplicationContext());
EmailProviderCache cache = EmailProviderCache.getCache(message.getFolder().getAccountUuid(), context);
return cache.isMessageHidden(messageId, folderId);
}
private void setFlagInCache(final Account account, final List<Long> messageIds,
final Flag flag, final boolean newState) {
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(),
mApplication.getApplicationContext());
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context);
String columnName = LocalStore.getColumnNameForFlag(flag);
String value = Integer.toString((newState) ? 1 : 0);
cache.setValueForMessages(messageIds, columnName, value);
@ -349,8 +341,7 @@ public class MessagingController implements Runnable {
private void removeFlagFromCache(final Account account, final List<Long> messageIds,
final Flag flag) {
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(),
mApplication.getApplicationContext());
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context);
String columnName = LocalStore.getColumnNameForFlag(flag);
cache.removeValueForMessages(messageIds, columnName);
}
@ -358,8 +349,7 @@ public class MessagingController implements Runnable {
private void setFlagForThreadsInCache(final Account account, final List<Long> threadRootIds,
final Flag flag, final boolean newState) {
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(),
mApplication.getApplicationContext());
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context);
String columnName = LocalStore.getColumnNameForFlag(flag);
String value = Integer.toString((newState) ? 1 : 0);
cache.setValueForThreads(threadRootIds, columnName, value);
@ -368,18 +358,14 @@ public class MessagingController implements Runnable {
private void removeFlagForThreadsFromCache(final Account account, final List<Long> messageIds,
final Flag flag) {
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(),
mApplication.getApplicationContext());
EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context);
String columnName = LocalStore.getColumnNameForFlag(flag);
cache.removeValueForThreads(messageIds, columnName);
}
/**
* @param application {@link K9}
*/
private MessagingController(Application application) {
mApplication = application;
private MessagingController(Context context) {
this.context = context.getApplicationContext();
mThread = new Thread(this);
mThread.setName("MessagingController");
mThread.start();
@ -388,15 +374,9 @@ public class MessagingController implements Runnable {
}
}
/**
* Gets or creates the singleton instance of MessagingController. Application is used to
* provide a Context to classes that need it.
* @param application {@link K9}
* @return
*/
public synchronized static MessagingController getInstance(Application application) {
public synchronized static MessagingController getInstance(Context context) {
if (inst == null) {
inst = new MessagingController(application);
inst = new MessagingController(context);
}
return inst;
}
@ -556,7 +536,7 @@ public class MessagingController implements Runnable {
l.listFoldersStarted(account);
}
List <? extends Folder > localFolders = null;
if (!account.isAvailable(mApplication)) {
if (!account.isAvailable(context)) {
Log.i(K9.LOG_TAG, "not listing folders of unavailable account");
} else {
try {
@ -680,7 +660,7 @@ public class MessagingController implements Runnable {
public void searchLocalMessagesSynchronous(final LocalSearch search, final MessagingListener listener) {
final AccountStats stats = new AccountStats();
final Set<String> uuidSet = new HashSet<String>(Arrays.asList(search.getAccountUuids()));
List<Account> accounts = Preferences.getPreferences(mApplication.getApplicationContext()).getAccounts();
List<Account> accounts = Preferences.getPreferences(context).getAccounts();
boolean allAccounts = uuidSet.contains(SearchSpecification.ALL_ACCOUNTS);
// for every account we want to search do the query in the localstore
@ -761,7 +741,7 @@ public class MessagingController implements Runnable {
}
public void searchRemoteMessagesSynchronous(final String acctUuid, final String folderName, final String query,
final Set<Flag> requiredFlags, final Set<Flag> forbiddenFlags, final MessagingListener listener) {
final Account acct = Preferences.getPreferences(mApplication.getApplicationContext()).getAccount(acctUuid);
final Account acct = Preferences.getPreferences(context).getAccount(acctUuid);
if (listener != null) {
listener.remoteSearchStarted(folderName);
@ -1175,7 +1155,7 @@ public class MessagingController implements Runnable {
for (MessagingListener l : getListeners(listener)) {
l.synchronizeMailboxFailed(account, folder, rootMessage);
}
notifyUserIfCertificateProblem(mApplication, e, account, true);
notifyUserIfCertificateProblem(context, e, account, true);
addErrorMessage(account, null, e);
Log.e(K9.LOG_TAG, "Failed synchronizing folder " + account.getDescription() + ":" + folder + " @ " + new Date());
@ -1258,7 +1238,7 @@ public class MessagingController implements Runnable {
int unreadBeforeStart = 0;
try {
AccountStats stats = account.getStats(mApplication);
AccountStats stats = account.getStats(context);
unreadBeforeStart = stats.unreadMessageCount;
} catch (MessagingException e) {
@ -1390,7 +1370,7 @@ public class MessagingController implements Runnable {
if (oldestExtantMessage.before(downloadStarted) &&
oldestExtantMessage.after(new Date(account.getLatestOldMessageSeenTime()))) {
account.setLatestOldMessageSeenTime(oldestExtantMessage.getTime());
account.save(Preferences.getPreferences(mApplication.getApplicationContext()));
account.save(Preferences.getPreferences(context));
}
}
@ -1651,7 +1631,7 @@ public class MessagingController implements Runnable {
if (shouldNotifyForMessage(account, localFolder, message)) {
// Notify with the localMessage so that we don't have to recalculate the content preview.
notifyAccount(mApplication, account, localMessage, unreadBeforeStart);
notifyAccount(context, account, localMessage, unreadBeforeStart);
}
} catch (MessagingException me) {
@ -1789,7 +1769,7 @@ public class MessagingController implements Runnable {
// Send a notification of this message
if (shouldNotifyForMessage(account, localFolder, message)) {
// Notify with the localMessage so that we don't have to recalculate the content preview.
notifyAccount(mApplication, account, localMessage, unreadBeforeStart);
notifyAccount(context, account, localMessage, unreadBeforeStart);
}
}//for large messages
@ -1846,8 +1826,8 @@ public class MessagingController implements Runnable {
if (data != null) {
synchronized (data) {
MessageReference ref = localMessage.makeMessageReference();
if (data.removeMatchingMessage(mApplication, ref)) {
notifyAccountWithDataLocked(mApplication, account, null, data);
if (data.removeMatchingMessage(context, ref)) {
notifyAccountWithDataLocked(context, account, null, data);
}
}
}
@ -2007,7 +1987,7 @@ public class MessagingController implements Runnable {
}
}
} catch (MessagingException me) {
notifyUserIfCertificateProblem(mApplication, me, account, true);
notifyUserIfCertificateProblem(context, me, account, true);
addErrorMessage(account, null, me);
Log.e(K9.LOG_TAG, "Could not process command '" + processingCommand + "'", me);
throw me;
@ -2679,8 +2659,8 @@ public class MessagingController implements Runnable {
CharArrayWriter baos = new CharArrayWriter(t.getStackTrace().length * 10);
PrintWriter ps = new PrintWriter(baos);
try {
PackageInfo packageInfo = mApplication.getPackageManager().getPackageInfo(
mApplication.getPackageName(), 0);
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
ps.format("K9-Mail version: %s\r\n", packageInfo.versionName);
} catch (Exception e) {
// ignore
@ -2984,7 +2964,7 @@ public class MessagingController implements Runnable {
if (uid.startsWith(K9.LOCAL_UID_PREFIX)) {
Log.w(K9.LOG_TAG, "Message has local UID so cannot download fully.");
// ASH move toast
android.widget.Toast.makeText(mApplication,
android.widget.Toast.makeText(context,
"Message has local UID so cannot download fully",
android.widget.Toast.LENGTH_LONG).show();
// TODO: Using X_DOWNLOADED_FULL is wrong because it's only a partial message. But
@ -3061,7 +3041,7 @@ public class MessagingController implements Runnable {
for (MessagingListener l : getListeners(listener)) {
l.loadMessageForViewFailed(account, folder, uid, e);
}
notifyUserIfCertificateProblem(mApplication, e, account, true);
notifyUserIfCertificateProblem(context, e, account, true);
addErrorMessage(account, null, e);
return false;
} finally {
@ -3224,7 +3204,7 @@ public class MessagingController implements Runnable {
for (MessagingListener l : getListeners(listener)) {
l.loadAttachmentFailed(account, message, part, tag, me.getMessage());
}
notifyUserIfCertificateProblem(mApplication, me, account, true);
notifyUserIfCertificateProblem(context, me, account, true);
addErrorMessage(account, null, me);
} finally {
@ -3268,7 +3248,7 @@ public class MessagingController implements Runnable {
public void sendPendingMessages(MessagingListener listener) {
final Preferences prefs = Preferences.getPreferences(mApplication.getApplicationContext());
final Preferences prefs = Preferences.getPreferences(context);
for (Account account : prefs.getAvailableAccounts()) {
sendPendingMessages(account, listener);
}
@ -3285,7 +3265,7 @@ public class MessagingController implements Runnable {
putBackground("sendPendingMessages", listener, new Runnable() {
@Override
public void run() {
if (!account.isAvailable(mApplication)) {
if (!account.isAvailable(context)) {
throw new UnavailableAccountException();
}
if (messagesPendingSend(account)) {
@ -3305,7 +3285,7 @@ public class MessagingController implements Runnable {
private void cancelNotification(int id) {
NotificationManager notifMgr =
(NotificationManager) mApplication.getSystemService(Context.NOTIFICATION_SERVICE);
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notifMgr.cancel(id);
}
@ -3328,9 +3308,9 @@ public class MessagingController implements Runnable {
}
NotificationManager notifMgr =
(NotificationManager) mApplication.getSystemService(Context.NOTIFICATION_SERVICE);
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(mApplication);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.drawable.ic_notify_check_mail);
builder.setWhen(System.currentTimeMillis());
builder.setOngoing(true);
@ -3339,13 +3319,13 @@ public class MessagingController implements Runnable {
String accountName = (TextUtils.isEmpty(accountDescription)) ?
account.getEmail() : accountDescription;
builder.setTicker(mApplication.getString(R.string.notification_bg_send_ticker,
builder.setTicker(context.getString(R.string.notification_bg_send_ticker,
accountName));
builder.setContentTitle(mApplication.getString(R.string.notification_bg_send_title));
builder.setContentTitle(context.getString(R.string.notification_bg_send_title));
builder.setContentText(account.getDescription());
TaskStackBuilder stack = buildMessageListBackStack(mApplication, account,
TaskStackBuilder stack = buildMessageListBackStack(context, account,
account.getInboxFolderName());
builder.setContentIntent(stack.getPendingIntent(0, 0));
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
@ -3380,19 +3360,19 @@ public class MessagingController implements Runnable {
*/
private void notifySendFailed(Account account, Exception lastFailure, String openFolder) {
NotificationManager notifMgr =
(NotificationManager) mApplication.getSystemService(Context.NOTIFICATION_SERVICE);
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(mApplication);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(platformSupportsLockScreenNotifications()
? R.drawable.ic_notify_new_mail_vector
: R.drawable.ic_notify_new_mail);
builder.setWhen(System.currentTimeMillis());
builder.setAutoCancel(true);
builder.setTicker(mApplication.getString(R.string.send_failure_subject));
builder.setContentTitle(mApplication.getString(R.string.send_failure_subject));
builder.setTicker(context.getString(R.string.send_failure_subject));
builder.setContentTitle(context.getString(R.string.send_failure_subject));
builder.setContentText(getRootCauseMessage(lastFailure));
TaskStackBuilder stack = buildFolderListBackStack(mApplication, account);
TaskStackBuilder stack = buildFolderListBackStack(context, account);
builder.setContentIntent(stack.getPendingIntent(0, 0));
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
@ -3417,20 +3397,20 @@ public class MessagingController implements Runnable {
}
final NotificationManager notifMgr =
(NotificationManager) mApplication.getSystemService(Context.NOTIFICATION_SERVICE);
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder = new NotificationCompat.Builder(mApplication);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.drawable.ic_notify_check_mail);
builder.setWhen(System.currentTimeMillis());
builder.setOngoing(true);
builder.setTicker(mApplication.getString(
builder.setTicker(context.getString(
R.string.notification_bg_sync_ticker, account.getDescription(), folder.getName()));
builder.setContentTitle(mApplication.getString(R.string.notification_bg_sync_title));
builder.setContentTitle(context.getString(R.string.notification_bg_sync_title));
builder.setContentText(account.getDescription() +
mApplication.getString(R.string.notification_bg_title_separator) +
context.getString(R.string.notification_bg_title_separator) +
folder.getName());
TaskStackBuilder stack = buildMessageListBackStack(mApplication, account,
TaskStackBuilder stack = buildMessageListBackStack(context, account,
account.getInboxFolderName());
builder.setContentIntent(stack.getPendingIntent(0, 0));
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
@ -3585,7 +3565,7 @@ public class MessagingController implements Runnable {
localFolder.moveMessages(Collections.singletonList(message), (LocalFolder) localStore.getFolder(account.getDraftsFolderName()));
}
notifyUserIfCertificateProblem(mApplication, e, account, false);
notifyUserIfCertificateProblem(context, e, account, false);
addErrorMessage(account, "Failed to send message", e);
message.setFlag(Flag.X_SEND_FAILED, true);
Log.e(K9.LOG_TAG, "Failed to send message", e);
@ -3662,7 +3642,7 @@ public class MessagingController implements Runnable {
public AccountStats getSearchAccountStatsSynchronous(final SearchAccount searchAccount,
final MessagingListener listener) {
Preferences preferences = Preferences.getPreferences(mApplication);
Preferences preferences = Preferences.getPreferences(context);
LocalSearch search = searchAccount.getRelatedSearch();
// Collect accounts that belong to the search
@ -3678,7 +3658,7 @@ public class MessagingController implements Runnable {
}
}
ContentResolver cr = mApplication.getContentResolver();
ContentResolver cr = context.getContentResolver();
int unreadMessageCount = 0;
int flaggedMessageCount = 0;
@ -5286,7 +5266,7 @@ public class MessagingController implements Runnable {
if (previousPusher != null) {
previousPusher.stop();
}
Preferences prefs = Preferences.getPreferences(mApplication);
Preferences prefs = Preferences.getPreferences(context);
Account.FolderMode aDisplayMode = account.getFolderDisplayMode();
Account.FolderMode aPushMode = account.getFolderPushMode();
@ -5338,7 +5318,7 @@ public class MessagingController implements Runnable {
}
if (!names.isEmpty()) {
PushReceiver receiver = new MessagingControllerPushReceiver(mApplication, account, this);
PushReceiver receiver = new MessagingControllerPushReceiver(context, account, this);
int maxPushFolders = account.getMaxPushFolders();
if (names.size() > maxPushFolders) {
@ -5422,7 +5402,7 @@ public class MessagingController implements Runnable {
Log.i(K9.LOG_TAG, "messagesArrived newCount = " + newCount + ", unread count = " + unreadMessageCount);
if (unreadMessageCount == 0) {
notifyAccountCancel(mApplication, account);
notifyAccountCancel(context, account);
}
for (MessagingListener l : getListeners()) {

View File

@ -1,6 +1,5 @@
package com.fsck.k9.controller;
import android.app.Application;
import android.content.Context;
import android.util.Log;
@ -21,12 +20,12 @@ import java.util.concurrent.CountDownLatch;
public class MessagingControllerPushReceiver implements PushReceiver {
final Account account;
final MessagingController controller;
final Application mApplication;
final Context context;
public MessagingControllerPushReceiver(Application nApplication, Account nAccount, MessagingController nController) {
public MessagingControllerPushReceiver(Context context, Account nAccount, MessagingController nController) {
account = nAccount;
controller = nController;
mApplication = nApplication;
this.context = context;
}
public void messagesFlagsChanged(Folder folder,
@ -71,13 +70,13 @@ public class MessagingControllerPushReceiver implements PushReceiver {
@Override
public void sleep(TracingWakeLock wakeLock, long millis) {
SleepService.sleep(mApplication, millis, wakeLock, K9.PUSH_WAKE_LOCK_TIMEOUT);
SleepService.sleep(context, millis, wakeLock, K9.PUSH_WAKE_LOCK_TIMEOUT);
}
public void pushError(String errorMessage, Exception e) {
String errMess = errorMessage;
controller.notifyUserIfCertificateProblem(mApplication, e, account, true);
controller.notifyUserIfCertificateProblem(context, e, account, true);
if (errMess == null && e != null) {
errMess = e.getMessage();
}
@ -110,7 +109,7 @@ public class MessagingControllerPushReceiver implements PushReceiver {
@Override
public Context getContext() {
return mApplication;
return context;
}
}

View File

@ -1,7 +1,6 @@
package com.fsck.k9.helper;
import android.app.Application;
import android.content.Context;
import android.database.Cursor;
import android.net.ConnectivityManager;
@ -421,12 +420,10 @@ public class Utility {
/**
* Check to see if we have network connectivity.
* @param app Current application (Hint: see if your base class has a getApplication() method.)
* @return true if we have connectivity, false otherwise.
*/
public static boolean hasConnectivity(final Application app) {
public static boolean hasConnectivity(final Context context) {
final ConnectivityManager connectivityManager =
(ConnectivityManager) app.getSystemService(Context.CONNECTIVITY_SERVICE);
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
return false;
}

View File

@ -4,7 +4,7 @@ import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import android.app.Application;
import android.content.Context;
import android.net.Uri;
import com.fsck.k9.mail.MessagingException;
@ -13,18 +13,18 @@ import com.fsck.k9.mail.MessagingException;
* An attachment whose contents are loaded from an URI.
*/
public class LocalAttachmentBody extends BinaryAttachmentBody {
private Application mApplication;
private Context context;
private Uri mUri;
public LocalAttachmentBody(Uri uri, Application application) {
mApplication = application;
public LocalAttachmentBody(Uri uri, Context context) {
this.context = context;
mUri = uri;
}
@Override
public InputStream getInputStream() throws MessagingException {
try {
return mApplication.getContentResolver().openInputStream(mUri);
return context.getContentResolver().openInputStream(mUri);
} catch (FileNotFoundException fnfe) {
/*
* Since it's completely normal for us to try to serve up attachments that

View File

@ -5,7 +5,7 @@ import java.io.OutputStream;
import org.apache.james.mime4j.util.MimeUtil;
import android.app.Application;
import android.content.Context;
import android.net.Uri;
import com.fsck.k9.mail.CompositeBody;
@ -17,8 +17,8 @@ import com.fsck.k9.mail.MessagingException;
*/
class LocalAttachmentMessageBody extends LocalAttachmentBody implements CompositeBody {
public LocalAttachmentMessageBody(Uri uri, Application application) {
super(uri, application);
public LocalAttachmentMessageBody(Uri uri, Context context) {
super(uri, context);
}
@Override

View File

@ -737,11 +737,11 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
if (MimeUtil.isMessage(type)) {
body = new LocalAttachmentMessageBody(
Uri.parse(contentUri),
LocalFolder.this.localStore.mApplication);
LocalFolder.this.localStore.context);
} else {
body = new LocalAttachmentBody(
Uri.parse(contentUri),
LocalFolder.this.localStore.mApplication);
LocalFolder.this.localStore.context);
}
}
@ -1306,7 +1306,7 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
attachments = container.attachments;
} else {
ViewableContainer container =
LocalMessageExtractor.extractTextAndAttachments(LocalFolder.this.localStore.mApplication, message);
LocalMessageExtractor.extractTextAndAttachments(LocalFolder.this.localStore.context, message);
attachments = container.attachments;
text = container.text;
@ -1412,7 +1412,7 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
message.buildMimeRepresentation();
ViewableContainer container =
LocalMessageExtractor.extractTextAndAttachments(LocalFolder.this.localStore.mApplication, message);
LocalMessageExtractor.extractTextAndAttachments(LocalFolder.this.localStore.context, message);
List<Part> attachments = container.attachments;
String text = container.text;
@ -1548,7 +1548,7 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
attachmentId = ((LocalAttachmentBodyPart) attachment).getAttachmentId();
}
final File attachmentDirectory = StorageManager.getInstance(LocalFolder.this.localStore.mApplication).getAttachmentDirectory(LocalFolder.this.localStore.uUid, LocalFolder.this.localStore.database.getStorageProviderId());
final File attachmentDirectory = StorageManager.getInstance(LocalFolder.this.localStore.context).getAttachmentDirectory(LocalFolder.this.localStore.uUid, LocalFolder.this.localStore.database.getStorageProviderId());
if (attachment.getBody() != null) {
Body body = attachment.getBody();
if (body instanceof LocalAttachmentBody) {
@ -1653,10 +1653,10 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
attachmentId);
if (MimeUtil.isMessage(attachment.getMimeType())) {
attachment.setBody(new LocalAttachmentMessageBody(
contentUri, LocalFolder.this.localStore.mApplication));
contentUri, LocalFolder.this.localStore.context));
} else {
attachment.setBody(new LocalAttachmentBody(
contentUri, LocalFolder.this.localStore.mApplication));
contentUri, LocalFolder.this.localStore.context));
}
ContentValues cv = new ContentValues();
cv.put("content_uri", contentUri != null ? contentUri.toString() : null);
@ -1891,14 +1891,14 @@ public class LocalFolder extends Folder<LocalMessage> implements Serializable {
Cursor attachmentsCursor = null;
try {
String accountUuid = getAccountUuid();
Context context = LocalFolder.this.localStore.mApplication;
Context context = LocalFolder.this.localStore.context;
// Get attachment IDs
String[] whereArgs = new String[] { Long.toString(messageId) };
attachmentsCursor = db.query("attachments", new String[] { "id" },
"message_id = ?", whereArgs, null, null, null);
final File attachmentDirectory = StorageManager.getInstance(LocalFolder.this.localStore.mApplication)
final File attachmentDirectory = StorageManager.getInstance(LocalFolder.this.localStore.context)
.getAttachmentDirectory(LocalFolder.this.localStore.uUid, LocalFolder.this.localStore.database.getStorageProviderId());
while (attachmentsCursor.moveToNext()) {

View File

@ -145,7 +145,7 @@ public class LocalStore extends Store implements Serializable {
protected String uUid = null;
final Application mApplication;
final Context context;
LockableDatabase database;
@ -154,17 +154,17 @@ public class LocalStore extends Store implements Serializable {
/**
* local://localhost/path/to/database/uuid.db
* This constructor is only used by {@link Store#getLocalInstance(Account, Application)}
* This constructor is only used by {@link Store#getLocalInstance(Account, Context)}
* @param account
* @param application
* @param context
* @throws UnavailableStorageException if not {@link StorageProvider#isReady(Context)}
*/
public LocalStore(final Account account, final Application application) throws MessagingException {
public LocalStore(final Account account, final Context context) throws MessagingException {
mAccount = account;
database = new LockableDatabase(application, account.getUuid(), new StoreSchemaDefinition(this));
database = new LockableDatabase(context, account.getUuid(), new StoreSchemaDefinition(this));
mApplication = application;
mContentResolver = application.getContentResolver();
this.context = context;
mContentResolver = context.getContentResolver();
database.setStorageProviderId(account.getLocalStorageProviderId());
uUid = account.getUuid();
@ -227,12 +227,12 @@ public class LocalStore extends Store implements Serializable {
}
protected SharedPreferences getPreferences() {
return Preferences.getPreferences(mApplication).getPreferences();
return Preferences.getPreferences(context).getPreferences();
}
public long getSize() throws MessagingException {
final StorageManager storageManager = StorageManager.getInstance(mApplication);
final StorageManager storageManager = StorageManager.getInstance(context);
final File attachmentDirectory = storageManager.getAttachmentDirectory(uUid,
database.getStorageProviderId());
@ -421,7 +421,7 @@ public class LocalStore extends Store implements Serializable {
cv.putNull("content_uri");
db.update("attachments", cv, null, null);
}
final StorageManager storageManager = StorageManager.getInstance(mApplication);
final StorageManager storageManager = StorageManager.getInstance(context);
File[] files = storageManager.getAttachmentDirectory(uUid, database.getStorageProviderId()).listFiles();
for (File file : files) {
if (file.exists()) {

View File

@ -6,7 +6,6 @@ import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import android.annotation.TargetApi;
import android.app.Application;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
@ -128,7 +127,7 @@ public class LockableDatabase {
private final StorageListener mStorageListener = new StorageListener();
private Application mApplication;
private Context context;
/**
* {@link ThreadLocal} to check whether a DB transaction is occuring in the
@ -143,15 +142,15 @@ public class LockableDatabase {
private String uUid;
/**
* @param application
* @param context
* Never <code>null</code>.
* @param uUid
* Never <code>null</code>.
* @param schemaDefinition
* Never <code>null</code
*/
public LockableDatabase(final Application application, final String uUid, final SchemaDefinition schemaDefinition) {
this.mApplication = application;
public LockableDatabase(final Context context, final String uUid, final SchemaDefinition schemaDefinition) {
this.context = context;
this.uUid = uUid;
this.mSchemaDefinition = schemaDefinition;
}
@ -165,7 +164,7 @@ public class LockableDatabase {
}
private StorageManager getStorageManager() {
return StorageManager.getInstance(mApplication);
return StorageManager.getInstance(context);
}
/**
@ -364,7 +363,7 @@ public class LockableDatabase {
} finally {
unlockWrite();
}
StorageManager.getInstance(mApplication).addListener(mStorageListener);
StorageManager.getInstance(context).addListener(mStorageListener);
}
/**
@ -395,7 +394,7 @@ public class LockableDatabase {
private void doOpenOrCreateDb(final File databaseFile) {
if (StorageManager.InternalStorageProvider.ID.equals(mStorageProviderId)) {
// internal storage
mDb = mApplication.openOrCreateDatabase(databaseFile.getName(), Context.MODE_PRIVATE,
mDb = context.openOrCreateDatabase(databaseFile.getName(), Context.MODE_PRIVATE,
null);
} else {
// external storage

View File

@ -12,7 +12,6 @@ import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import android.app.Application;
import android.content.Context;
import android.os.Build;
import android.os.Environment;
@ -486,7 +485,7 @@ public class StorageManager {
*/
private final Map<StorageProvider, SynchronizationAid> mProviderLocks = new IdentityHashMap<StorageProvider, SynchronizationAid>();
protected final Application mApplication;
protected final Context context;
/**
* Listener to be notified for storage related events.
@ -495,9 +494,9 @@ public class StorageManager {
private static transient StorageManager instance;
public static synchronized StorageManager getInstance(final Application application) {
public static synchronized StorageManager getInstance(final Context context) {
if (instance == null) {
instance = new StorageManager(application);
instance = new StorageManager(context);
}
return instance;
}
@ -518,17 +517,17 @@ public class StorageManager {
}
/**
* @param application
* @param context
* Never <code>null</code>.
* @throws NullPointerException
* If <tt>application</tt> is <code>null</code>.
* If <tt>context</tt> is <code>null</code>.
*/
protected StorageManager(final Application application) throws NullPointerException {
if (application == null) {
throw new NullPointerException("No application instance given");
protected StorageManager(final Context context) throws NullPointerException {
if (context == null) {
throw new NullPointerException("No Context given");
}
mApplication = application;
this.context = context;
/*
* 20101113/fiouzy:
@ -547,10 +546,10 @@ public class StorageManager {
new ExternalStorageProvider());
for (final StorageProvider provider : allProviders) {
// check for provider compatibility
if (provider.isSupported(mApplication)) {
if (provider.isSupported(context)) {
// provider is compatible! proceeding
provider.init(application);
provider.init(context);
mProviders.put(provider.getId(), provider);
mProviderLocks.put(provider, new SynchronizationAid());
}
@ -585,7 +584,7 @@ public class StorageManager {
public File getDatabase(final String dbName, final String providerId) {
StorageProvider provider = getProvider(providerId);
// TODO fallback to internal storage if no provider
return provider.getDatabase(mApplication, dbName);
return provider.getDatabase(context, dbName);
}
/**
@ -598,7 +597,7 @@ public class StorageManager {
public File getAttachmentDirectory(final String dbName, final String providerId) {
StorageProvider provider = getProvider(providerId);
// TODO fallback to internal storage if no provider
return provider.getAttachmentDirectory(mApplication, dbName);
return provider.getAttachmentDirectory(context, dbName);
}
/**
@ -612,7 +611,7 @@ public class StorageManager {
Log.w(K9.LOG_TAG, "Storage-Provider \"" + providerId + "\" does not exist");
return false;
}
return provider.isReady(mApplication);
return provider.isReady(context);
}
/**
@ -624,7 +623,7 @@ public class StorageManager {
public Map<String, String> getAvailableProviders() {
final Map<String, String> result = new LinkedHashMap<String, String>();
for (final Map.Entry<String, StorageProvider> entry : mProviders.entrySet()) {
result.put(entry.getKey(), entry.getValue().getName(mApplication));
result.put(entry.getKey(), entry.getValue().getName(context));
}
return result;
}
@ -698,7 +697,7 @@ public class StorageManager {
*/
protected StorageProvider resolveProvider(final String path) {
for (final StorageProvider provider : mProviders.values()) {
if (path.equals(provider.getRoot(mApplication).getAbsolutePath())) {
if (path.equals(provider.getRoot(context).getAbsolutePath())) {
return provider;
}
}
@ -738,7 +737,7 @@ public class StorageManager {
sync.readLock.unlock();
}
throw new UnavailableStorageException("StorageProvider is unmounting");
} else if (locked && !provider.isReady(mApplication)) {
} else if (locked && !provider.isReady(context)) {
sync.readLock.unlock();
throw new UnavailableStorageException("StorageProvider not ready");
}

View File

@ -53,7 +53,7 @@ class StoreSchemaDefinition implements LockableDatabase.SchemaDefinition {
Log.i(K9.LOG_TAG, String.format(Locale.US, "Upgrading database from version %d to version %d",
db.getVersion(), LocalStore.DB_VERSION));
AttachmentProvider.clear(this.localStore.mApplication);
AttachmentProvider.clear(this.localStore.context);
db.beginTransaction();
try {
@ -595,4 +595,4 @@ class StoreSchemaDefinition implements LockableDatabase.SchemaDefinition {
new Object[] { integrate, inTopGroup, syncClass, pushClass, displayClass, id });
}
}
}