replicant-packages_apps_Email/provider_src/com/android/email/provider/WidgetProvider.java

192 lines
7.6 KiB
Java

/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.email.provider;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.Mailbox;
import com.android.mail.providers.Folder;
import com.android.mail.providers.UIProvider;
import com.android.mail.utils.LogTag;
import com.android.mail.utils.LogUtils;
import com.android.mail.widget.BaseWidgetProvider;
import com.android.mail.widget.WidgetService;
public class WidgetProvider extends BaseWidgetProvider {
private static final String LEGACY_PREFS_NAME = "com.android.email.widget.WidgetManager";
private static final String LEGACY_ACCOUNT_ID_PREFIX = "accountId_";
private static final String LEGACY_MAILBOX_ID_PREFIX = "mailboxId_";
private static final String LOG_TAG = LogTag.getLogTag();
/**
* Remove preferences when deleting widget
*/
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
// Remove any legacy Email widget information
final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0);
final SharedPreferences.Editor editor = prefs.edit();
for (int widgetId : appWidgetIds) {
// Remove the account in the preference
editor.remove(LEGACY_ACCOUNT_ID_PREFIX + widgetId);
editor.remove(LEGACY_MAILBOX_ID_PREFIX + widgetId);
}
editor.apply();
}
@Override
protected com.android.mail.providers.Account getAccountObject(
Context context, String accountUri) {
final ContentResolver resolver = context.getContentResolver();
final Cursor accountCursor = resolver.query(Uri.parse(accountUri),
UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null);
return getPopulatedAccountObject(accountCursor);
}
@Override
protected boolean isAccountValid(Context context, com.android.mail.providers.Account account) {
if (account != null) {
final ContentResolver resolver = context.getContentResolver();
final Cursor accountCursor = resolver.query(account.uri,
UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null);
if (accountCursor != null) {
try {
return accountCursor.getCount() > 0;
} finally {
accountCursor.close();
}
}
}
return false;
}
@Override
protected void migrateLegacyWidgetInformation(Context context, int widgetId) {
final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0);
final SharedPreferences.Editor editor = prefs.edit();
long accountId = loadAccountIdPref(context, widgetId);
long mailboxId = loadMailboxIdPref(context, widgetId);
// Legacy support; if preferences haven't been saved for this widget, load something
if (accountId == Account.NO_ACCOUNT || mailboxId == Mailbox.NO_MAILBOX) {
LogUtils.d(LOG_TAG, "Couldn't load account or mailbox. accountId: %d" +
" mailboxId: %d widgetId %d", accountId, mailboxId, widgetId);
return;
}
accountId = migrateLegacyWidgetAccountId(accountId);
mailboxId = migrateLegacyWidgetMailboxId(mailboxId, accountId);
// Get Account and folder objects for the account id and mailbox id
final com.android.mail.providers.Account uiAccount = getAccount(context, accountId);
final Folder uiFolder = EmailProvider.getFolder(context, mailboxId);
if (uiAccount != null && uiFolder != null) {
WidgetService.saveWidgetInformation(context, widgetId, uiAccount,
uiFolder.folderUri.fullUri.toString());
updateWidgetInternal(context, widgetId, uiAccount, uiFolder.type, uiFolder.capabilities,
uiFolder.folderUri.fullUri, uiFolder.conversationListUri, uiFolder.name);
// Now remove the old legacy preference value
editor.remove(LEGACY_ACCOUNT_ID_PREFIX + widgetId);
editor.remove(LEGACY_MAILBOX_ID_PREFIX + widgetId);
}
editor.apply();
}
private static long migrateLegacyWidgetAccountId(long accountId) {
if (accountId == Account.ACCOUNT_ID_COMBINED_VIEW) {
return EmailProvider.COMBINED_ACCOUNT_ID;
}
return accountId;
}
/**
* @param accountId The migrated accountId
* @return
*/
private static long migrateLegacyWidgetMailboxId(long mailboxId, long accountId) {
if (mailboxId == Mailbox.QUERY_ALL_INBOXES) {
return EmailProvider.getVirtualMailboxId(accountId, Mailbox.TYPE_INBOX);
} else if (mailboxId == Mailbox.QUERY_ALL_UNREAD) {
return EmailProvider.getVirtualMailboxId(accountId, Mailbox.TYPE_UNREAD);
}
return mailboxId;
}
private static com.android.mail.providers.Account getAccount(Context context, long accountId) {
final ContentResolver resolver = context.getContentResolver();
final Cursor ac = resolver.query(EmailProvider.uiUri("uiaccount", accountId),
UIProvider.ACCOUNTS_PROJECTION_NO_CAPABILITIES, null, null, null);
com.android.mail.providers.Account uiAccount = getPopulatedAccountObject(ac);
return uiAccount;
}
private static com.android.mail.providers.Account getPopulatedAccountObject(
final Cursor accountCursor) {
if (accountCursor == null) {
LogUtils.e(LOG_TAG, "Null account cursor");
return null;
}
com.android.mail.providers.Account uiAccount = null;
try {
if (accountCursor.moveToFirst()) {
uiAccount = com.android.mail.providers.Account.builder().buildFrom(accountCursor);
}
} finally {
accountCursor.close();
}
return uiAccount;
}
/**
* Returns the saved account ID for the given widget. Otherwise,
* {@link com.android.emailcommon.provider.Account#NO_ACCOUNT} if
* the account ID was not previously saved.
*/
static long loadAccountIdPref(Context context, int appWidgetId) {
final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0);
long accountId = prefs.getLong(LEGACY_ACCOUNT_ID_PREFIX + appWidgetId, Account.NO_ACCOUNT);
return accountId;
}
/**
* Returns the saved mailbox ID for the given widget. Otherwise,
* {@link com.android.emailcommon.provider.Mailbox#NO_MAILBOX} if
* the mailbox ID was not previously saved.
*/
static long loadMailboxIdPref(Context context, int appWidgetId) {
final SharedPreferences prefs = context.getSharedPreferences(LEGACY_PREFS_NAME, 0);
long mailboxId = prefs.getLong(LEGACY_MAILBOX_ID_PREFIX + appWidgetId, Mailbox.NO_MAILBOX);
return mailboxId;
}
}