diff --git a/MinimalBible/AndroidManifest.xml b/MinimalBible/AndroidManifest.xml
index f42e055..e82455a 100644
--- a/MinimalBible/AndroidManifest.xml
+++ b/MinimalBible/AndroidManifest.xml
@@ -7,12 +7,14 @@
+
+ android:theme="@style/AppTheme"
+ android:name="org.bspeice.minimalbible.MinimalBible" >
diff --git a/MinimalBible/src/org/bspeice/minimalbible/MinimalBible.java b/MinimalBible/src/org/bspeice/minimalbible/MinimalBible.java
new file mode 100644
index 0000000..9d0705e
--- /dev/null
+++ b/MinimalBible/src/org/bspeice/minimalbible/MinimalBible.java
@@ -0,0 +1,18 @@
+package org.bspeice.minimalbible;
+
+import android.app.Application;
+import android.content.Context;
+
+public class MinimalBible extends Application {
+
+ private static MinimalBible instance;
+
+ public MinimalBible() {
+ instance = this;
+ }
+
+ public static Context getAppContext() {
+ return instance;
+ }
+
+}
diff --git a/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadActivity.java b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadActivity.java
index d636851..fdc08ac 100644
--- a/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadActivity.java
+++ b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadActivity.java
@@ -1,12 +1,17 @@
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.bspeice.minimalbible.activities.downloader.DownloadManager.BookRefreshListener;
+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;
@@ -14,6 +19,7 @@ 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;
@@ -25,6 +31,8 @@ import android.widget.Toast;
public class DownloadActivity extends BaseActivity implements
BaseNavigationDrawerFragment.NavigationDrawerCallbacks {
+ private ProgressDialog refreshDialog;
+
/**
* Fragment managing the behaviors, interactions and presentation of the
* navigation drawer.
@@ -49,6 +57,10 @@ 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
@@ -150,47 +162,82 @@ public class DownloadActivity extends BaseActivity implements
.getInt(ARG_SECTION_NUMBER));
}
}
-
- private void displayInternetWarning() {
- 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)) {
+
+ 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();
+ builder.setMessage(
+ "About to contact servers to download content. Continue?")
+ .setPositiveButton("Yes", dialogListener)
+ .setNegativeButton("No", dialogListener)
+ .setCancelable(false).show();
} else {
- downloadModules();
+ refreshModules();
}
}
-
- private void downloadModules() {
-
+
+ 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 {
+
+ private class DownloadDialogListener implements
+ DialogInterface.OnClickListener {
@Override
public void onClick(DialogInterface dialog, int which) {
- switch (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();
-
+ 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();
- downloadModules();
+ "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 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
new file mode 100644
index 0000000..43e8d16
--- /dev/null
+++ b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadManager.java
@@ -0,0 +1,77 @@
+package org.bspeice.minimalbible.activities.downloader;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+import org.bspeice.minimalbible.MinimalBible;
+import org.crosswire.jsword.book.Book;
+import org.crosswire.jsword.book.install.InstallException;
+import org.crosswire.jsword.book.install.InstallManager;
+import org.crosswire.jsword.book.install.Installer;
+
+import android.os.AsyncTask;
+import android.util.Log;
+
+public class DownloadManager {
+
+ private final String TAG = "DownloadManager";
+
+ public DownloadManager() {
+ setDownloadDir();
+ }
+
+ public InstallerReloadTask fetchAvailableBooks(boolean forceRefresh, BookRefreshListener bookRefreshListener) {
+
+ Map installers = getInstallers();
+
+ return (InstallerReloadTask)
+ new InstallerReloadTask(bookRefreshListener).execute(installers.values().toArray(new Installer[installers.size()]));
+ }
+
+ public Map getInstallers() {
+ return new InstallManager().getInstallers();
+ }
+
+ private void setDownloadDir() {
+ // We need to set the download directory for jSword to stick with Android.
+ String home = MinimalBible.getAppContext().getFilesDir().toString();
+ Log.d(TAG, "Setting jsword.home to: " + home);
+ System.setProperty("jsword.home", home);
+ }
+
+ public class InstallerReloadTask extends AsyncTask> {
+ private BookRefreshListener listener;
+
+ public InstallerReloadTask(BookRefreshListener listener) {
+ this.listener = listener;
+ }
+
+ @Override
+ protected List doInBackground(Installer... params) {
+ List books = new LinkedList();
+ for (Installer i: params) {
+ try {
+ i.reloadBookList();
+ } catch (InstallException e) {
+ Log.e(TAG, "Error downloading books from installer: " + i.toString(), e);
+ }
+ books.addAll(i.getBooks());
+ }
+
+ return books;
+ }
+
+ @Override
+ protected void onPostExecute(List result) {
+ super.onPostExecute(result);
+ listener.onRefreshComplete(result);
+ }
+ }
+
+ public interface BookRefreshListener {
+ public void onRefreshComplete(List results);
+ }
+
+}
diff --git a/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadNavDrawerFragment.java b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadNavDrawerFragment.java
index c540fd2..d56a867 100644
--- a/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadNavDrawerFragment.java
+++ b/MinimalBible/src/org/bspeice/minimalbible/activities/downloader/DownloadNavDrawerFragment.java
@@ -37,7 +37,7 @@ public class DownloadNavDrawerFragment extends BaseNavigationDrawerFragment {
for (int i = 0; i < displayCategories.length; i++) {
sCategories[i] = displayCategories[i].toString();
}
-
+
mDrawerListView.setAdapter(new ArrayAdapter(getActionBar()
.getThemedContext(), android.R.layout.simple_list_item_1,
android.R.id.text1, sCategories));