From 4dc920186f1f7e2fb1e8523ce06e58e9557f7f77 Mon Sep 17 00:00:00 2001 From: Bradlee Speice Date: Mon, 21 Apr 2014 22:28:49 -0400 Subject: [PATCH] Split out DL fragments, give them D/L responsibility --- .../downloader/BookListFragment.java | 150 +++++++++++++++++ .../downloader/DownloadActivity.java | 158 +----------------- .../downloader/DownloadManager.java | 24 ++- 3 files changed, 175 insertions(+), 157 deletions(-) create mode 100644 MinimalBible/src/org/bspeice/minimalbible/activities/downloader/BookListFragment.java diff --git a/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/BookListFragment.java b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/BookListFragment.java new file mode 100644 index 0000000..8ba8845 --- /dev/null +++ b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/BookListFragment.java @@ -0,0 +1,150 @@ +package org.bspeice.minimalbible.activities.downloader; + +import java.util.List; + +import org.bspeice.minimalbible.MinimalBibleConstants; +import org.bspeice.minimalbible.R; +import org.crosswire.jsword.book.Book; +import org.crosswire.jsword.book.BookCategory; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +/** + * A placeholder fragment containing a simple view. + */ +public class BookListFragment extends Fragment { + /** + * The fragment argument representing the section number for this fragment. + */ + private static final String ARG_BOOK_CATEGORY = "book_category"; + + /** + * Returns a new instance of this fragment for the given section number. + */ + public static BookListFragment newInstance(BookCategory c) { + BookListFragment fragment = new BookListFragment(); + Bundle args = new Bundle(); + args.putString(ARG_BOOK_CATEGORY, c.toString()); + fragment.setArguments(args); + return fragment; + } + + public BookListFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_download, container, + false); + TextView textView = (TextView) rootView + .findViewById(R.id.section_label); + textView.setText(getArguments().getString(ARG_BOOK_CATEGORY)); + return rootView; + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + ((DownloadActivity) activity).onSectionAttached(getArguments() + .getString(ARG_BOOK_CATEGORY)); + } + + public void displayModules() { + DownloadManager dm = new DownloadManager(); + + if (dm.willRefresh()) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + DownloadDialogListener dialogListener = new DownloadDialogListener(); + builder.setMessage( + "About to contact servers to download content. Continue?") + .setPositiveButton("Yes", dialogListener) + .setNegativeButton("No", dialogListener) + .setCancelable(false).show(); + } else { + refreshModules(); + } + } + + private void refreshModules() { + DownloadManager dm = new DownloadManager(); + + if (dm.willRefresh()) { + ProgressDialog refreshDialog = new ProgressDialog(getActivity()); + refreshDialog.setMessage("Refreshing available modules..."); + refreshDialog.setCancelable(false); + refreshDialog.show(); + dm.fetchAvailableBooks(new DlBookRefreshListener(refreshDialog)); + } else { + dm.fetchAvailableBooks(new DlBookRefreshListener()); + } + } + + private class DlBookRefreshListener implements + BookRefreshTask.BookRefreshListener { + // TODO: Figure out why I need to pass in the ProgressDialog, and can't + // cancel it from onRefreshComplete. + ProgressDialog dl; + + public DlBookRefreshListener(ProgressDialog dl) { + this.dl = dl; + } + + public DlBookRefreshListener() { + } + + @Override + public void onRefreshComplete(List results) { + if (dl != null) { + dl.cancel(); + } + + for (Book b : results) { + Log.d("DlBookRefreshListener", b.getName()); + } + } + } + + private class DownloadDialogListener implements + DialogInterface.OnClickListener { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + // Clicked ready to continue - allow downloading in the future + SharedPreferences prefs = getActivity().getSharedPreferences( + MinimalBibleConstants.DOWNLOAD_PREFS_FILE, Context.MODE_PRIVATE); + prefs.edit() + .putBoolean(MinimalBibleConstants.KEY_DOWNLOAD_ENABLED, + true).commit(); + + // And warn them that it has been enabled in the future. + Toast.makeText(getActivity(), + "Downloading now enabled. Disable in settings.", + Toast.LENGTH_SHORT).show(); + refreshModules(); + break; + + case DialogInterface.BUTTON_NEGATIVE: + // Not going to continue, still show what has + // already been downloaded. + break; + } + + } + } + +} \ No newline at end of file diff --git a/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadActivity.java b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadActivity.java index 1efcf50..8789b59 100644 --- a/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadActivity.java +++ b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadActivity.java @@ -1,31 +1,15 @@ package org.bspeice.minimalbible.activities.downloader; -import java.util.List; - -import org.bspeice.minimalbible.MinimalBibleConstants; import org.bspeice.minimalbible.R; import org.bspeice.minimalbible.activities.BaseActivity; import org.bspeice.minimalbible.activities.BaseNavigationDrawerFragment; -import org.crosswire.jsword.book.Book; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.ProgressDialog; -import android.content.DialogInterface; -import android.content.SharedPreferences; import android.os.Bundle; -import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; -import android.util.Log; -import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import android.widget.Toast; public class DownloadActivity extends BaseActivity implements BaseNavigationDrawerFragment.NavigationDrawerCallbacks { @@ -54,10 +38,6 @@ public class DownloadActivity extends BaseActivity implements // Set up the drawer. mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout)); - - // Refresh our modules - prompts user if they do actually want to - // connect to the internet - doRefreshModules(); } @Override @@ -67,21 +47,11 @@ public class DownloadActivity extends BaseActivity implements fragmentManager .beginTransaction() .replace(R.id.container, - PlaceholderFragment.newInstance(position + 1)).commit(); + BookListFragment.newInstance(DownloadManager.VALID_CATEGORIES[position])).commit(); } - public void onSectionAttached(int number) { - switch (number) { - case 1: - mTitle = getString(R.string.title_section1); - break; - case 2: - mTitle = getString(R.string.title_section2); - break; - case 3: - mTitle = getString(R.string.title_section3); - break; - } + public void onSectionAttached(String category) { + mTitle = category; } public void restoreActionBar() { @@ -115,126 +85,4 @@ public class DownloadActivity extends BaseActivity implements } return super.onOptionsItemSelected(item); } - - /** - * A placeholder fragment containing a simple view. - */ - public static class PlaceholderFragment extends Fragment { - /** - * The fragment argument representing the section number for this - * fragment. - */ - private static final String ARG_SECTION_NUMBER = "section_number"; - - /** - * Returns a new instance of this fragment for the given section number. - */ - public static PlaceholderFragment newInstance(int sectionNumber) { - PlaceholderFragment fragment = new PlaceholderFragment(); - Bundle args = new Bundle(); - args.putInt(ARG_SECTION_NUMBER, sectionNumber); - fragment.setArguments(args); - return fragment; - } - - public PlaceholderFragment() { - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_download, - container, false); - TextView textView = (TextView) rootView - .findViewById(R.id.section_label); - textView.setText(Integer.toString(getArguments().getInt( - ARG_SECTION_NUMBER))); - return rootView; - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - ((DownloadActivity) activity).onSectionAttached(getArguments() - .getInt(ARG_SECTION_NUMBER)); - } - } - - private void doRefreshModules() { - SharedPreferences prefs = getSharedPreferences( - MinimalBibleConstants.DOWNLOAD_PREFS_FILE, MODE_PRIVATE); - - // If downloading has not been enabled, or user has permanently disabled - // downloading, WARN THEM! - if (!prefs - .getBoolean(MinimalBibleConstants.KEY_DOWNLOAD_ENABLED, false) - || prefs.getBoolean( - MinimalBibleConstants.KEY_PERM_DISABLE_DOWNLOAD, false)) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - DownloadDialogListener dialogListener = new DownloadDialogListener(); - builder.setMessage( - "About to contact servers to download content. Continue?") - .setPositiveButton("Yes", dialogListener) - .setNegativeButton("No", dialogListener) - .setCancelable(false).show(); - } else { - refreshModules(); - } - } - - private void refreshModules() { - // TODO: Discover if we need to refresh over Internet, or use a cached copy - // Fun fact - jSword handles the caching for us. - ProgressDialog refreshDialog = new ProgressDialog(this); - refreshDialog.setMessage("Refreshing available modules..."); - refreshDialog.setCancelable(false); - refreshDialog.show(); - DownloadManager dm = new DownloadManager(); - dm.fetchAvailableBooks(true, new DlBookRefreshListener(refreshDialog)); - } - - private class DownloadDialogListener implements - DialogInterface.OnClickListener { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - // Clicked ready to continue - allow downloading in the future - SharedPreferences prefs = getSharedPreferences( - MinimalBibleConstants.DOWNLOAD_PREFS_FILE, MODE_PRIVATE); - prefs.edit() - .putBoolean(MinimalBibleConstants.KEY_DOWNLOAD_ENABLED, - true).commit(); - - // And warn them that it has been enabled in the future. - Toast.makeText(DownloadActivity.this, - "Downloading now enabled. Disable in settings.", - Toast.LENGTH_SHORT).show(); - refreshModules(); - break; - - case DialogInterface.BUTTON_NEGATIVE: - // Not going to continue, still show what has - // already been downloaded. - break; - } - - } - } - - private class DlBookRefreshListener implements BookRefreshTask.BookRefreshListener { - // TODO: Figure out why I need to pass in the ProgressDialog, and can't cancel it from onRefreshComplete. - ProgressDialog dl; - public DlBookRefreshListener(ProgressDialog dl) { - this.dl = dl; - } - @Override - public void onRefreshComplete(List results) { - dl.cancel(); - for (Book b : results) { - Log.d("DlBookRefreshListener", b.getName()); - } - } - } - } diff --git a/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadManager.java b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadManager.java index 5e635fc..aa64c64 100644 --- a/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadManager.java +++ b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadManager.java @@ -3,10 +3,13 @@ package org.bspeice.minimalbible.activities.downloader; import java.util.Map; import org.bspeice.minimalbible.MinimalBible; +import org.bspeice.minimalbible.MinimalBibleConstants; import org.crosswire.jsword.book.BookCategory; import org.crosswire.jsword.book.install.InstallManager; import org.crosswire.jsword.book.install.Installer; +import android.content.Context; +import android.content.SharedPreferences; import android.util.Log; public class DownloadManager { @@ -21,16 +24,33 @@ public class DownloadManager { setDownloadDir(); } - public BookRefreshTask fetchAvailableBooks(boolean refresh, + public BookRefreshTask fetchAvailableBooks( BookRefreshTask.BookRefreshListener bookRefreshListener) { Map installers = getInstallers(); - return (BookRefreshTask) new BookRefreshTask(refresh, + return (BookRefreshTask) new BookRefreshTask(willRefresh(), bookRefreshListener).execute(installers.values().toArray( new Installer[installers.size()])); } + public boolean willRefresh() { + // Method to determine if we need a refresh + // Public, so other modules can predict and take action accordingly. + // TODO: Discover if we need to refresh over Internet, or use a cached + // copy + // Fun fact - jSword handles the caching for us. + + SharedPreferences prefs = MinimalBible.getAppContext() + .getSharedPreferences( + MinimalBibleConstants.DOWNLOAD_PREFS_FILE, + Context.MODE_PRIVATE); + + return (!prefs.getBoolean(MinimalBibleConstants.KEY_DOWNLOAD_ENABLED, + false) || prefs.getBoolean( + MinimalBibleConstants.KEY_PERM_DISABLE_DOWNLOAD, false)); + } + public Map getInstallers() { return new InstallManager().getInstallers(); }