From 9b7ebf7ef60408d09baf4180c79b3f759114ae2d Mon Sep 17 00:00:00 2001 From: str4d Date: Sat, 14 Jun 2014 07:11:35 +0000 Subject: [PATCH] Pull to check email --- TODO | 2 - app/build.gradle | 1 + .../i2p/bote/android/EmailListFragment.java | 87 ++++++++++++++++++- .../i2p/bote/android/util/BoteHelper.java | 8 ++ app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/styles.xml | 14 +++ 6 files changed, 110 insertions(+), 5 deletions(-) diff --git a/TODO b/TODO index b33a312..f2d703f 100644 --- a/TODO +++ b/TODO @@ -13,8 +13,6 @@ Tasks: -- Optimize use of Android lifecycles Features: -- Show check mail status in inbox list header -- Pull-to-check - Import/export identities -- Export Destination / make it copyable - Show contact pictures in recipients dropdown diff --git a/app/build.gradle b/app/build.gradle index d83cd93..c356eba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,4 +24,5 @@ clean.dependsOn preclean dependencies { compile 'com.android.support:appcompat-v7:+' compile fileTree(dir: 'libs', include: '*.jar') + compile 'com.github.chrisbanes.actionbarpulltorefresh:extra-abc:+' } diff --git a/app/src/main/java/i2p/bote/android/EmailListFragment.java b/app/src/main/java/i2p/bote/android/EmailListFragment.java index 1faab81..8722444 100644 --- a/app/src/main/java/i2p/bote/android/EmailListFragment.java +++ b/app/src/main/java/i2p/bote/android/EmailListFragment.java @@ -7,6 +7,10 @@ import java.util.List; import javax.mail.Flags.Flag; import javax.mail.MessagingException; +import uk.co.senab.actionbarpulltorefresh.extras.actionbarcompat.PullToRefreshLayout; +import uk.co.senab.actionbarpulltorefresh.library.ActionBarPullToRefresh; +import uk.co.senab.actionbarpulltorefresh.library.Options; +import uk.co.senab.actionbarpulltorefresh.library.listeners.OnRefreshListener; import net.i2p.I2PAppContext; import net.i2p.util.Log; import i2p.bote.I2PBote; @@ -37,6 +41,7 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.EditText; @@ -46,13 +51,15 @@ import android.widget.TextView; public class EmailListFragment extends ListFragment implements LoaderManager.LoaderCallbacks>, MoveToDialogFragment.MoveToDialogListener, - EmailListAdapter.EmailSelector { + EmailListAdapter.EmailSelector, OnRefreshListener { public static final String FOLDER_NAME = "folder_name"; private static final int EMAIL_LIST_LOADER = 1; OnEmailSelectedListener mCallback; + private PullToRefreshLayout mPullToRefreshLayout; + private EmailListAdapter mAdapter; private EmailFolder mFolder; private ActionMode mMode; @@ -94,10 +101,42 @@ public class EmailListFragment extends ListFragment implements } @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view,savedInstanceState); String folderName = getArguments().getString(FOLDER_NAME); mFolder = BoteHelper.getMailFolder(folderName); + + if (BoteHelper.isInbox(mFolder)) { + // This is the View which is created by ListFragment + ViewGroup viewGroup = (ViewGroup) view; + + // We need to create a PullToRefreshLayout manually + mPullToRefreshLayout = new PullToRefreshLayout(viewGroup.getContext()); + + // We can now setup the PullToRefreshLayout + ActionBarPullToRefresh.from(getActivity()) + + // We need to insert the PullToRefreshLayout into the Fragment's ViewGroup + .insertLayoutInto(viewGroup) + + // We need to mark the ListView and it's Empty View as pullable + // This is because they are not dirent children of the ViewGroup + .theseChildrenArePullable(getListView(), getListView().getEmptyView()) + + // We can now complete the setup as desired + .listener(this) + .options(Options.create() + .refreshOnUp(true) + .build()) + .setup(mPullToRefreshLayout); + + mPullToRefreshLayout.setRefreshing(I2PBote.getInstance().isCheckingForMail()); + } + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); mAdapter = new EmailListAdapter(getActivity(), this, BoteHelper.isOutbox(mFolder)); @@ -461,4 +500,46 @@ public class EmailListFragment extends ListFragment implements public void select(int position) { onListItemSelect(position); } + + // OnRefreshListener + + public void onRefreshStarted(View view) { + I2PBote bote = I2PBote.getInstance(); + if (bote.isConnected()) { + try { + if (!bote.isCheckingForMail()) + bote.checkForMail(); + + new AsyncTask() { + @Override + protected Void doInBackground(Void... params) { + while (I2PBote.getInstance().isCheckingForMail()) { + try { + Thread.sleep(100); + } catch (InterruptedException e) {} + } + return null; + } + + @Override + protected void onPostExecute(Void result) { + super.onPostExecute(result); + + // Notify PullToRefreshLayout that the refresh has finished + mPullToRefreshLayout.setRefreshComplete(); + } + }.execute(); + } catch (PasswordException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (GeneralSecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } else + mPullToRefreshLayout.setRefreshComplete(); + } } diff --git a/app/src/main/java/i2p/bote/android/util/BoteHelper.java b/app/src/main/java/i2p/bote/android/util/BoteHelper.java index fbe188f..0147b4f 100644 --- a/app/src/main/java/i2p/bote/android/util/BoteHelper.java +++ b/app/src/main/java/i2p/bote/android/util/BoteHelper.java @@ -202,6 +202,14 @@ public class BoteHelper extends GeneralHelper { } } + public static boolean isInbox(EmailFolder folder) { + return isInbox(folder.getName()); + } + + public static boolean isInbox(String folderName) { + return "Inbox".equalsIgnoreCase(folderName); + } + public static boolean isOutbox(EmailFolder folder) { return isOutbox(folder.getName()); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9f29a6d..7fef346 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,9 @@ Settings It appears that I2P Android is not running. Would you like to start it? + Pull to check email + Checking email... + Let go to check email %s selected Delete diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8f51583..74ff1cf 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -15,6 +15,20 @@ + + +