From b5d32c0cc320e32af463dd57b39a9a1f83f490e5 Mon Sep 17 00:00:00 2001 From: str4d Date: Fri, 28 Feb 2014 05:59:00 +0000 Subject: [PATCH] Populate ViewPager with Loader --- src/i2p/bote/ViewEmailActivity.java | 127 ++++++++++++++++++++++------ 1 file changed, 103 insertions(+), 24 deletions(-) diff --git a/src/i2p/bote/ViewEmailActivity.java b/src/i2p/bote/ViewEmailActivity.java index d9e4c47..e7c252b 100644 --- a/src/i2p/bote/ViewEmailActivity.java +++ b/src/i2p/bote/ViewEmailActivity.java @@ -3,21 +3,33 @@ package i2p.bote; import java.util.ArrayList; import java.util.List; +import i2p.bote.email.Email; +import i2p.bote.fileencryption.PasswordException; import i2p.bote.folder.EmailFolder; +import i2p.bote.folder.FolderListener; +import i2p.bote.util.BetterAsyncTaskLoader; import i2p.bote.util.BoteHelper; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.Loader; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBarActivity; -public class ViewEmailActivity extends ActionBarActivity { +public class ViewEmailActivity extends ActionBarActivity implements + LoaderManager.LoaderCallbacks> { public static final String FOLDER_NAME = "folder_name"; public static final String MESSAGE_ID = "message_id"; + private static final int MESSAGE_ID_LIST_LOADER = 1; + private EmailFolder mFolder; + // The messageId of the currently-viewed Email + private String mMessageId; private ViewPager mPager; private ViewEmailPagerAdapter mPagerAdapter; @@ -30,21 +42,22 @@ public class ViewEmailActivity extends ActionBarActivity { String folderName = i.getStringExtra(FOLDER_NAME); mFolder = BoteHelper.getMailFolder( folderName == null ? "inbox" : folderName); - String messageId = i.getStringExtra(MESSAGE_ID); + mMessageId = i.getStringExtra(MESSAGE_ID); // Instantiate the ViewPager and PagerAdapter mPager = (ViewPager) findViewById(R.id.pager); mPagerAdapter = new ViewEmailPagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); + mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { + + @Override + public void onPageSelected(int position) { + mMessageId = mPagerAdapter.getMessageId(position); + } + }); - // Start with a "fake" list of messageIds containing only - // the selected messageId, so the UI starts up quickly - List messageIds = new ArrayList(); - messageIds.add(messageId); - mPagerAdapter.setData(messageIds); - - // Now fire off a Loader to fetch the real list - // TODO: Implement + // Fire off a Loader to fetch the list of Emails + getSupportLoaderManager().initLoader(MESSAGE_ID_LIST_LOADER, null, this); } private class ViewEmailPagerAdapter extends FragmentStatePagerAdapter { @@ -59,25 +72,27 @@ public class ViewEmailActivity extends ActionBarActivity { notifyDataSetChanged(); } + public int getPosition(String messageId) { + if (mIds == null) + return 0; + else + return mIds.indexOf(messageId); + } + + public String getMessageId(int position) { + if (mIds == null) + return null; + else + return mIds.get(position); + } + @Override public Fragment getItem(int position) { if (mIds == null) return null; - - return ViewEmailFragment.newInstance( - mFolder.getName(), mIds.get(position)); - } - - @Override - public int getItemPosition(Object item) { - ViewEmailFragment f = (ViewEmailFragment) item; - String messageId = f.getMessageId(); - int position = mIds.indexOf(messageId); - - if (position >= 0) - return position; else - return POSITION_NONE; + return ViewEmailFragment.newInstance( + mFolder.getName(), mIds.get(position)); } @Override @@ -88,4 +103,68 @@ public class ViewEmailActivity extends ActionBarActivity { return mIds.size(); } } + + // LoaderManager.LoaderCallbacks> + + public Loader> onCreateLoader(int id, Bundle args) { + return new MessageIdListLoader(this, mFolder); + } + + private static class MessageIdListLoader extends BetterAsyncTaskLoader> implements + FolderListener { + private EmailFolder mFolder; + + public MessageIdListLoader(Context context, EmailFolder folder) { + super(context); + mFolder = folder; + } + + @Override + public List loadInBackground() { + List messageIds = null; + try { + List emails = BoteHelper.getEmails(mFolder, null, true); + messageIds = new ArrayList(); + for (Email email : emails) + messageIds.add(email.getMessageID()); + } catch (PasswordException pe) { + // TODO: Handle this error properly (get user to log in) + } + return messageIds; + } + + protected void onStartMonitoring() { + mFolder.addFolderListener(this); + } + + protected void onStopMonitoring() { + mFolder.removeFolderListener(this); + } + + protected void releaseResources(List data) { + } + + // FolderListener + + @Override + public void elementAdded() { + onContentChanged(); + } + + @Override + public void elementRemoved() { + onContentChanged(); + } + } + + public void onLoadFinished(Loader> loader, + List data) { + mPagerAdapter.setData(data); + mPager.setCurrentItem( + mPagerAdapter.getPosition(mMessageId)); + } + + public void onLoaderReset(Loader> loader) { + mPagerAdapter.setData(null); + } }