131 Commits

Author SHA1 Message Date
Bradlee Speice 4269988b7c Backport to Java 6...
Android Studio automatically folds lambda-style, so it won't get too out of hand.
2014-06-14 16:41:11 -04:00
Bradlee Speice e945ef51a7 Get the unit tests passing again
Note: I need to write more. Lots more.
2014-06-14 16:25:13 -04:00
Bradlee Speice 04fe4d13b4 Add lots of Lint fixes 2014-06-14 15:13:44 -04:00
Bradlee Speice dda5c79299 Fix books not being removed... 2014-06-14 15:04:17 -04:00
Bradlee Speice 93abe065a2 Fix a NetworkOnMainThreadException 2014-06-14 14:10:43 -04:00
Bradlee Speice ba3c6ebe6c Some refactoring and Async fixes. 2014-06-14 14:08:50 -04:00
Bradlee Speice 3869cf0b9b Synchronization needs fixing, otherwise works. 2014-06-10 23:46:29 -04:00
Bradlee Speice 8d17b6db64 Silly DownloadManager
Injects are for classes that need them.
2014-06-10 23:44:35 -04:00
Bradlee Speice 7070c933d1 Fix the dagger compile errors
If you have an @Singleton with no @Injects inside it, you need to add an
@Injects constructor for Dagger to validate.
2014-06-10 23:41:35 -04:00
Bradlee Speice 28dfec81d7 [broken probably] Refactoring to Rx should be done...
But having issues with compiling. Checking if Dagger and retrolambda
play nice.
2014-06-10 23:17:20 -04:00
Bradlee Speice fb0c5fdaaa [broken] BookListFragment to Rx 2014-06-10 22:56:52 -04:00
Bradlee Speice 6eb5f66dcc [broken] BookItemHolder to Rx 2014-06-10 22:49:47 -04:00
Bradlee Speice e356c8d1fc Revert "[broken] Remove the BookDownloadThread again"
This reverts commit 8f346f17e4.
2014-06-10 22:40:46 -04:00
Bradlee Speice 287b8cb40d [broken] Add a note on the InstalledManager 2014-06-10 22:39:06 -04:00
Bradlee Speice 899b054c8b [broken] Slight semantic change to RefreshManager 2014-06-10 22:37:53 -04:00
Bradlee Speice 8f346f17e4 [broken] Remove the BookDownloadThread again 2014-06-10 22:36:12 -04:00
Bradlee Speice 1a7364da86 [broken] Convert BookDownloadManager to Rx 2014-06-10 22:35:40 -04:00
Bradlee Speice ca1ccd9942 [broken] Convert RefreshManager to Rx 2014-06-10 22:04:53 -04:00
Bradlee Speice 5770e8dd74 Add RxAndroid support, remove eventbus 2014-06-10 19:32:23 -04:00
Bradlee Speice 3f5909be08 Add retrolambda support 2014-06-10 19:30:45 -04:00
DjBushido a7e185690e Try once more to fix the NPE on tests. 2014-06-05 21:29:00 -04:00
Bradlee Speice 78997f704f Dynamically create the ObjectGraph, rather than onCreate() 2014-06-05 21:00:15 -04:00
Bradlee Speice 2e8974b745 See if I can't figure out why I'm getting a NPE on the setup method... 2014-06-04 22:18:08 -04:00
Bradlee Speice 5a2eee49d5 Add code to test installing and removing books
The test was successful on the first try. I don't know if I should be scared about that.
2014-06-04 21:53:53 -04:00
Bradlee Speice 1a8b3f2eee Add code to remove books 2014-06-04 21:42:41 -04:00
Bradlee Speice 4514c0f33f Forgot to actually include the link on the README update 2014-05-31 00:04:12 -04:00
Bradlee Speice 457ab021c7 Split out the setUp, Travis is giving an NPE 2014-05-31 00:02:47 -04:00
Bradlee Speice bd60b9a038 Set up the README with the Travis build status 2014-05-30 23:37:48 -04:00
Bradlee Speice ca4cff2adf Allow the await() to run longer...
Forgot how slow the emulator was, this is a bit ridiculous.
2014-05-30 23:33:50 -04:00
Bradlee Speice ed219bc8a4 Unit test fixes, works locally.
We'll see if it finally runs on Travis...
2014-05-30 23:23:16 -04:00
Bradlee Speice 8fe05dc70b wait_for_emulator wasn't marked executable 2014-05-30 22:09:17 -04:00
DjBushido f187b519f0 Add the wait_for_emulator script 2014-05-30 22:04:41 -04:00
DjBushido b21f3c1fd8 Ignore lint errors on build, I'm working on the fix. 2014-05-30 21:55:33 -04:00
DjBushido f5128d6753 Remove some extraneous build artifacts
Also trigger the Travis build.
2014-05-30 21:41:31 -04:00
DjBushido 83a5ce6e9f Add the initial Travis build file 2014-05-30 21:30:07 -04:00
Bradlee Speice ded7193c49 Lint fixes 2014-05-25 18:11:09 -04:00
Bradlee Speice 1017f9a34d Downloads are now thoroughly done
No bugs that I can see, likely needs some cleanup.
2014-05-25 17:48:39 -04:00
Bradlee Speice c1dc0da9e3 Some tweaks to progress, add "remove" button
Doesn't remove anything yet though...
2014-05-25 01:00:41 -04:00
Bradlee Speice 7558fc7f20 Progress is working fine for most books
Still seeing some strange issues, need to do some investigation...
2014-05-24 22:34:55 -04:00
Bradlee Speice 6191943d3f Downloading now shows progress!
Nasty bug where you can double register to the bus because it's not actually destroyed, need to fix that.
2014-05-24 22:13:23 -04:00
Bradlee Speice 6afb9b6f28 Can download books!
Progress doesn't show, but I'm about to fix that.
2014-05-24 21:12:20 -04:00
Bradlee Speice 38181c8827 Remove the Otto dependency
I appreciate Green Robot's EventBus' ability to let subscribers choose what thread they subscribe on.
2014-05-24 15:12:40 -04:00
Bradlee Speice 2c494edadc Unit testing now working
Also demo test case for async testing.
2014-05-24 15:11:26 -04:00
Bradlee Speice bba77bb45a And add an incredibly basic test 2014-05-24 02:13:35 -04:00
Bradlee Speice 2af187e429 Enable android testing 2014-05-24 02:12:57 -04:00
Bradlee Speice 221f01653f Add the Otto dependency 2014-05-24 02:03:44 -04:00
Bradlee Speice d7a9ad3c82 Extra refactoring and cleanup on BookItemHolder
Also, rules for displaying everything and layouts are fleshed out.
2014-05-20 22:21:59 -04:00
Bradlee Speice 135832859c Add a couple TODOs for cleaning the Adapter 2014-05-19 23:32:27 -04:00
Bradlee Speice f7f3b56db8 Add bones for registering download progress 2014-05-19 23:20:47 -04:00
Bradlee Speice d10626efe6 Switch to Esperandro for SharedPreferences 2014-05-19 22:52:00 -04:00
Bradlee Speice d664f12d08 Path refactoring
Also fixed an issue with View recycling
2014-05-19 22:34:56 -04:00
Bradlee Speice d16730781b Add the SVG logo I used 2014-05-17 20:56:38 -04:00
Bradlee Speice 6446e143ba Remove the ProgressWheel folder entirely
Not sure why it was allowed to stay...
2014-05-17 01:38:06 -04:00
Bradlee Speice b04d6c67ae Add in the ProgressWheel!
Also make sure it gets put in the proper package to make sure the author gets credit.
2014-05-17 01:37:44 -04:00
Bradlee Speice 5222b6e3e6 Various cleanups
Move ProgressWheel into the project proper, optimize the DL ListView
And also remove android-iconify. Despite using icons (which is awesome)
it didn't handle button highlight on click well, and the icons seemed a
bit small anyways.
2014-05-17 01:16:36 -04:00
Bradlee Speice 01d5e97d21 Some new libraries to play with
Not all will be used quite yet.
2014-05-17 00:07:52 -04:00
Bradlee Speice 13fc473081 Add a download button to the download list view! 2014-05-12 22:18:37 -04:00
Bradlee Speice 4e01ff666e Big documentation (no functionality) update 2014-05-10 20:20:16 -04:00
Bradlee Speice 8292dc91a1 Update one more TODO 2014-05-10 19:21:42 -04:00
Bradlee Speice eeb0df3dcf Incredibly minor documentation update 2014-05-10 19:20:25 -04:00
Bradlee Speice 6cd3f712d8 Sort downloadable books 2014-05-10 19:19:23 -04:00
Bradlee Speice 8b499b9215 Ugly hack to get everything working until Dagger issues resolved.
Dagger issue is being tracked here: https://github.com/square/dagger/issues/410
2014-05-10 19:09:21 -04:00
DjBushido e88c68b1e3 Issues with Dagger and Android Annotations, broken 2014-05-08 23:47:07 -04:00
DjBushido a046e9fa0a Refactor download prefs, when to d/l over internet 2014-05-08 21:39:29 -04:00
DjBushido 1530364abc Refactoring, and download layout alignment fixes 2014-05-08 20:39:38 -04:00
Bradlee Speice 4da25f0e23 Dagger support now working
Could've saved an hour or two if someone had told me every class needs to inject itself...
2014-05-07 02:06:38 -04:00
Bradlee Speice 503ae75d79 And ignore /build in the root folder 2014-05-07 00:52:00 -04:00
Bradlee Speice 9f80432924 Update gradle version 2014-05-07 00:51:16 -04:00
Bradlee Speice 7333f7404d Remove icu4j from build, cuts JAR size in half 2014-05-07 00:51:11 -04:00
DjBushido 0f109e21b4 Merge branch 'ButterKnife' 2014-05-06 21:06:14 -04:00
DjBushido e4d414f3c6 Update to Gradle plugin v.9 2014-05-06 20:58:22 -04:00
Bradlee Speice 5c9e0ecba4 Browsing documents, now with 100% more butter! 2014-05-06 00:29:12 -04:00
Bradlee Speice 1ac2c6539e Also make sure we're using the most up to date Gradle plugin 2014-05-05 23:07:15 -04:00
Bradlee Speice 8a36744ac7 Remove AndroidAnnotations and switch to ButterKnife 2014-05-05 23:05:56 -04:00
Bradlee Speice 594df14a31 Can now browse a list of documents! 2014-05-05 04:07:58 -04:00
Bradlee Speice f228e8265e Start switch to new Android Annotation format 2014-05-05 01:10:42 -04:00
Bradlee Speice 4d822d63de Build should use the appcompat project for support jar 2014-05-05 01:06:58 -04:00
Bradlee Speice c0c69dbf6b Dependencies are now fetched via Gradle 2014-05-01 00:03:35 -04:00
Bradlee Speice 0a4f467a39 Build totally working! 2014-04-30 22:27:05 -04:00
DjBushido 83448dc9c7 Commit a mostly working Gradle build
Currently, the initial build fails, but second one succeeds
2014-04-30 16:11:18 -04:00
DjBushido a47d007ccb Gradle build now working on Windows 2014-04-30 12:40:37 -04:00
Bradlee Speice 034252fd4d Dang yo, got Android Studio support going. 2014-04-30 01:16:53 -04:00
Bradlee Speice 4cf8b8d129 Very minor move 2014-04-29 23:28:45 -04:00
Bradlee Speice 09e0572612 Remove pre-EventBus code from Download 2014-04-29 23:25:38 -04:00
Bradlee Speice 72cf38a2fc Amazingly, I got the implementation almost perfect. 2014-04-29 23:21:11 -04:00
DjBushido 8a83548ab8 Initial draft of Event-based download management 2014-04-28 15:07:39 -04:00
DjBushido 1f116fe6ff Add the green robot jar 2014-04-28 14:28:03 -04:00
Bradlee Speice a8f6277ff2 Use the jsword-minimalbible submodule 2014-04-23 22:41:47 -04:00
Bradlee Speice 184acf1ba4 Remove the appcompat R files 2014-04-23 00:17:46 -04:00
Bradlee Speice e29d4546db Refactor so we don't re-download the book list every time
Code is still pretty ugly, but I'm not sure on how to prettify it. Get
to that later.
2014-04-23 00:11:13 -04:00
Bradlee Speice 0f98338504 Fragments know what category they are
Filtering not quite working yet, not sure why...
2014-04-21 23:11:16 -04:00
Bradlee Speice 4dc920186f Split out DL fragments, give them D/L responsibility 2014-04-21 22:28:49 -04:00
Bradlee Speice 4c3a2ba5b5 Some refactoring work to support an optional refresh 2014-04-21 22:01:52 -04:00
Bradlee Speice 76004e34d0 Add the libs/ folder, necessary for building. 2014-04-19 00:32:00 -04:00
Bradlee Speice bfe6eeda0c Get the JarJar system running to build a shaded Jar
Unfortunately means I can't just copy the ivy.xml from jSword.
But I do have excludes="" that I didn't with maven previously.
2014-04-19 00:17:05 -04:00
Bradlee Speice 08f179b0c3 Remove the maven build of jSword, use the proper Ant build
Also means we now have all the dependencies automagically copied in for
us.
2014-04-18 22:21:09 -04:00
Bradlee Speice 63123a1a31 Working build of jSword using the tweaks.
Lots of code taken from
https://github.com/mjdenham/and-bible/blob/master/jsword-tweaks/build.xml
and some re-written to make life easier.
2014-04-18 22:19:53 -04:00
Bradlee Speice 40b7ffd5fb Add a second jsword project to apply changes
These changes are specific to MinimalBible
2014-04-18 21:50:38 -04:00
Bradlee Speice f5825de88c Add jsword to ADT, still need to get build running 2014-04-18 21:17:10 -04:00
Bradlee Speice f5e523417a Oh man is it ugly, but I can download module lists. 2014-04-18 00:53:14 -04:00
Bradlee Speice 1465c81b9b Update jSword JAR to use a shaded org.apache.http
http://stackoverflow.com/questions/20238421/java-lang-nosuchfielderror-org-apache-http-message-basiclineformatter-instance
2014-04-18 00:52:49 -04:00
Bradlee Speice d4f4d8a8d5 And update the README because Markdown syntax issues 2014-04-16 22:56:13 -04:00
Bradlee Speice d28fcb1ea6 Link to the README inside the actual project 2014-04-16 22:51:22 -04:00
Bradlee Speice e8f7948d60 Update the README to mark two large goals done! 2014-04-16 22:50:17 -04:00
Bradlee Speice 1380a66f88 Navbar for download activity now displays things from jsword! 2014-04-16 22:39:47 -04:00
Bradlee Speice fd6c063079 Remove jSword from the classpath, use a JAR
JAR has all jSword dependencies built in for easy distribution
2014-04-16 22:01:38 -04:00
DjBushido 29f02e59b2 Add jsword to the classpath
Need to add a submodule sometime in the future.
2014-04-16 14:08:47 -04:00
Bradlee Speice 9242bbd944 EGit sucks. Remove the bin/ folder by hand. 2014-04-16 14:03:10 -04:00
DjBushido 1d0eab434f Hopefully finally stop tracking the bin/ folder... 2014-04-16 13:58:47 -04:00
DjBushido 0feee0b940 Split out the Nav Drawers between activities 2014-04-16 13:57:33 -04:00
DjBushido 77d808ca1b Download Activity displays the FrameLayout correctly 2014-04-16 13:43:03 -04:00
DjBushido e4282229e5 Refactor the BibleViewer to the its own activity package 2014-04-16 13:30:59 -04:00
DjBushido bda928098c Add a BaseActivity for common functionality
Right now it's just setting the translucent statusbar color
2014-04-16 13:29:26 -04:00
DjBushido 9bf99db956 Switch action bar colors to what they should be 2014-04-16 13:23:18 -04:00
DjBushido e8fa4b4257 Nav drawer shouldn't over-ride the title 2014-04-16 13:21:55 -04:00
DjBushido 00ebfb1e48 Switch DownloadActivity to sliding drawer
Re-remove the bin/ and gen/ files
2014-04-16 13:17:12 -04:00
DjBushido 7e2021d681 Revert "Switch the downloader to an ActionBar Tab And hopefully finish up cleaning up the bin/ and gen/ folders..."
This reverts commit 431ce603c6.
2014-04-16 12:29:56 -04:00
Bradlee Speice 431ce603c6 Switch the downloader to an ActionBar Tab
And hopefully finish up cleaning up the bin/ and gen/ folders...
2014-04-15 22:18:21 -04:00
DjBushido 5fb077a40d Add a quick download warning for the DownloaderActivity 2014-04-15 19:39:19 -04:00
DjBushido b20d0aa819 Add the downloader activity
Also untrack a whole lot of appcompat that shouldn't have been included
2014-04-15 19:13:21 -04:00
Bradlee Speice 090d866250 Forgot to move the .gitignore earlier 2014-04-14 22:41:46 -04:00
Bradlee Speice d6c7f498e6 Add the appcompat project to the repository 2014-04-14 22:38:12 -04:00
Bradlee Speice 90c4a4ef48 More feature ideas/planning
Think I'm about done, getting overwhelmed...
2014-04-14 22:34:08 -04:00
Bradlee Speice 63c716bae6 Add requirement to send feedback 2014-04-14 22:28:25 -04:00
Bradlee Speice e558a9cc14 Realized the appcompat isn't in the repo. Fix dat. 2014-04-14 22:21:59 -04:00
Bradlee Speice 60aff7acf8 Update some core goals, add feature goals 2014-04-14 22:15:18 -04:00
Bradlee Speice 939af7dc7a Add initial Core project outline 2014-04-14 21:58:41 -04:00
Bradlee Speice 0fb72d416f Don't use immersive mode, all you really gain is a bit of screen space.
Plus, backwards compatibility will be so much easier now!
2014-04-13 20:25:54 -04:00
Bradlee Speice 3d76bb9e18 Refactor the MainActivity to BibleViewer.
Dumb naming mistake on my part.
2014-04-13 16:32:35 -04:00
DjBushido 7eab6bbbdc Create README.md 2014-04-13 16:24:54 -04:00
Bradlee Speice df2a0f0788 Initial Minimal Bible project files 2014-04-13 16:15:08 -04:00
54 changed files with 235 additions and 1297 deletions
-5
View File
@@ -2,11 +2,6 @@ language: android
env:
matrix:
- ANDROID_SDKS=android-19,sysimg-19 ANDROID_TARGET=android-19 ANDROID_ABI=armeabi-v7a
android:
components:
- build-tools-20.0.0
before_install:
- echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI
- emulator -avd test -no-skin -no-audio -no-window &
@@ -6,7 +6,7 @@
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="20" />
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+19 -11
View File
@@ -7,7 +7,8 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2+'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.3'
//classpath 'me.tatarka:gradle-retrolambda:1.3.2'
}
}
@@ -26,11 +27,10 @@ dependencies {
apt 'de.devland.esperandro:esperandro:1.1.2'
// compile 'com.f2prateek.dart:dart:1.1.0'
compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
// compile 'de.greenrobot:eventbus:2.2.0'
compile 'com.netflix.rxjava:rxjava-android:0.19.0'
// Handled by appcompat
// compile 'com.google.android:support-v4:r7'
// And our unit testing needs some specific stuff (and specific stuff included again)
androidTestCompile 'junit:junit:4.11+'
androidTestCompile 'com.jayway.awaitility:awaitility:1.6.0'
@@ -39,10 +39,10 @@ dependencies {
android {
compileSdkVersion 19
buildToolsVersion '20'
buildToolsVersion '19.1.0'
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src/main/java']
resources.srcDirs = ['src/main/res']
aidl.srcDirs = ['src']
@@ -52,12 +52,7 @@ android {
}
// Move the tests to tests/java, tests/res, etc...
androidTest {
manifest.srcFile 'src/test/AndroidManifest.xml'
java.srcDirs = ['src/test/java']
resources.srcDirs = ['src/test/res']
assets.srcDirs = ['src/test/assets']
}
androidTest.setRoot('src/test')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
@@ -80,4 +75,17 @@ android {
lintOptions {
abortOnError false
}
/*
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
*/
defaultConfig {}
productFlavors {
}
buildTypes {
}
}
-11
View File
@@ -1,11 +0,0 @@
<html>
<body>
<div id="content" />
<script type="text/javascript">
function set_content(content) {
document.getElementById("content").innerHTML = content;
}
</script>
</body>
</html>
@@ -2,11 +2,6 @@ package org.bspeice.minimalbible;
import android.app.Application;
import android.content.Context;
import android.util.Log;
import org.crosswire.jsword.book.sword.SwordBookPath;
import java.io.File;
import dagger.ObjectGraph;
@@ -23,8 +18,6 @@ public class MinimalBible extends Application {
*/
private static MinimalBible instance;
private String TAG = "MinimalBible";
/**
* Create the application, and persist the application Context
*/
@@ -58,7 +51,6 @@ public class MinimalBible extends Application {
public void onCreate() {
//TODO: Is this necessary?
inject(this);
setJswordHome();
}
/**
@@ -75,24 +67,4 @@ public class MinimalBible extends Application {
}
return graph;
}
public void plusObjGraph(Object... modules) {
graph = graph.plus(modules);
}
/**
* Notify jSword that it needs to store files in the Android internal directory
* NOTE: Android will uninstall these files if you uninstall MinimalBible.
*/
@SuppressWarnings("null")
private void setJswordHome() {
// 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);
System.setProperty("sword.home", home);
SwordBookPath.setDownloadDir(new File(home));
Log.d(TAG, "Sword download path: " + SwordBookPath.getSwordDownloadDir());
}
}
@@ -1,7 +1,6 @@
package org.bspeice.minimalbible.activities;
import org.bspeice.minimalbible.activities.downloader.ActivityDownloaderModule;
import org.bspeice.minimalbible.activities.viewer.ActivityViewerModule;
import dagger.Module;
@@ -10,8 +9,7 @@ import dagger.Module;
*/
@Module(
includes = {
ActivityDownloaderModule.class,
ActivityViewerModule.class
ActivityDownloaderModule.class
}
)
public class ActivityModules {
@@ -40,7 +40,7 @@ public class BookListFragment extends BaseFragment {
* The fragment argument representing the section number for this fragment.
* Not a candidate for Dart (yet) because I would have to write a Parcelable around it.
*/
protected static final String ARG_BOOK_CATEGORY = "book_category";
private static final String ARG_BOOK_CATEGORY = "book_category";
private final String TAG = "BookListFragment";
@@ -48,9 +48,9 @@ public class BookListFragment extends BaseFragment {
ListView downloadsAvailable;
@Inject RefreshManager refreshManager;
@Inject protected DownloadPrefs downloadPrefs;
@Inject DownloadPrefs downloadPrefs;
protected ProgressDialog refreshDialog;
private ProgressDialog refreshDialog;
private LayoutInflater inflater;
/**
@@ -93,7 +93,7 @@ public class BookListFragment extends BaseFragment {
* Trigger the functionality to display a list of modules. Prompts user if downloading
* from the internet is allowable.
*/
protected void displayModules() {
private void displayModules() {
boolean dialogDisplayed = downloadPrefs.hasShownDownloadDialog();
if (!dialogDisplayed) {
@@ -1,15 +0,0 @@
package org.bspeice.minimalbible.activities.viewer;
import dagger.Module;
/**
* Created by bspeice on 6/18/14.
*/
@Module(
injects = {
BibleViewer.class,
BookFragment.class
}
)
public class ActivityViewerModule {
}
@@ -1,33 +1,27 @@
package org.bspeice.minimalbible.activities.viewer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
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 org.bspeice.minimalbible.MinimalBible;
import org.bspeice.minimalbible.R;
import org.bspeice.minimalbible.activities.BaseActivity;
import org.bspeice.minimalbible.activities.BaseNavigationDrawerFragment;
import org.bspeice.minimalbible.activities.downloader.DownloadActivity;
import org.crosswire.jsword.book.Book;
import javax.inject.Inject;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
public class BibleViewer extends BaseActivity implements
BaseNavigationDrawerFragment.NavigationDrawerCallbacks {
@Inject BookManager bookManager;
/**
* Fragment managing the behaviors, interactions and presentation of the
* navigation drawer.
@@ -43,31 +37,6 @@ public class BibleViewer extends BaseActivity implements
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MinimalBible.getApplication().inject(this);
// If no books are installed, we need to download one first.
int count = bookManager.getInstalledBooks()
.count()
.toBlocking()
.last();
if (count <= 0) {
Intent i = new Intent(this, DownloadActivity.class);
startActivityForResult(i, 0);
finish();
} else {
bookManager.getInstalledBooks()
.first()
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Book>() {
@Override
public void call(Book book) {
Log.d("BibleViewer", "Subscribed to display book: " + book.getName());
displayMainBook(book);
}
});
}
setContentView(R.layout.activity_bible_viewer);
mNavigationDrawerFragment = (ViewerNavDrawerFragment) getSupportFragmentManager()
@@ -76,19 +45,32 @@ public class BibleViewer extends BaseActivity implements
// Set up the drawer.
mNavigationDrawerFragment.setUp(R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// Handle a navigation movement
// update the main content by replacing fragments
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager
.beginTransaction()
.replace(R.id.container,
PlaceholderFragment.newInstance(position + 1)).commit();
}
public void setActionBarTitle(String title) {
ActionBar actionBar = getSupportActionBar();
mTitle = title;
actionBar.setTitle(title);
}
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 restoreActionBar() {
ActionBar actionBar = getSupportActionBar();
@@ -124,13 +106,48 @@ public class BibleViewer extends BaseActivity implements
return super.onOptionsItemSelected(item);
}
private void displayMainBook(Book b) {
Log.d("BibleViewer", "Initializing main book: " + b.getName());
Log.d("MainThread?", Boolean.toString(Looper.myLooper() == Looper.getMainLooper()));
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment f = BookFragment.newInstance(b.getName());
fragmentManager.beginTransaction()
.replace(R.id.container, f)
.commit();
}
/**
* 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_main, 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);
((BibleViewer) activity).onSectionAttached(getArguments().getInt(
ARG_SECTION_NUMBER));
}
}
}
@@ -1,140 +0,0 @@
package org.bspeice.minimalbible.activities.viewer;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import org.bspeice.minimalbible.MinimalBible;
import org.bspeice.minimalbible.R;
import org.bspeice.minimalbible.activities.BaseFragment;
import org.crosswire.jsword.book.Book;
import java.util.List;
import javax.inject.Inject;
import butterknife.ButterKnife;
import butterknife.InjectView;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
/**
* A placeholder fragment containing a simple view.
*/
public class BookFragment extends BaseFragment {
@Inject BookManager bookManager;
@InjectView(R.id.book_content)
WebView mainContent;
private static final String ARG_BOOK_NAME = "book_name";
private Book mBook;
/**
* Returns a new instance of this fragment for the given section number.
*/
public static BookFragment newInstance(String bookName) {
BookFragment fragment = new BookFragment();
Bundle args = new Bundle();
args.putString(ARG_BOOK_NAME, bookName);
fragment.setArguments(args);
return fragment;
}
public BookFragment() {
}
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
MinimalBible.getApplication().inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_viewer_main, container,
false);
ButterKnife.inject(this, rootView);
mainContent.getSettings().setJavaScriptEnabled(true);
// TODO: Load initial text from SharedPreferences
// And due to Observable async, we can kick off fetching the actual book asynchronously!
bookManager.getInstalledBooks()
.first(new Func1<Book, Boolean>() {
@Override
public Boolean call(Book book) {
String mBookName = getArguments().getString(ARG_BOOK_NAME);
return book.getName().equals(mBookName);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Book>() {
@Override
public void call(Book book) {
BookFragment.this.mBook = book;
displayBook(book);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.d("BookFragment", "No books installed?");
}
});
return rootView;
}
// TODO: Remove?
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
private void displayBook(Book b) {
Log.d("BookFragment", b.getName());
((BibleViewer)getActivity()).setActionBarTitle(b.getInitials());
mainContent.loadUrl(getString(R.string.content_page));
mainContent.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
invokeJavascript("set_content", BookFragment.this.mBook.getName());
}
});
}
private void invokeJavascript(String function, Object arg) {
mainContent.loadUrl("javascript:" + function + "('" + arg.toString() + "')");
}
private void invokeJavascript(String function, List<Object> args) {
mainContent.loadUrl("javascript:" + function + "(" + joinString(",", args.toArray()) + ")");
}
// Convenience from http://stackoverflow.com/a/17795110/1454178
public static String joinString(String join, Object... strings) {
if (strings == null || strings.length == 0) {
return "";
} else if (strings.length == 1) {
return strings[0].toString();
} else {
StringBuilder sb = new StringBuilder();
sb.append(strings[0]);
for (int i = 1; i < strings.length; i++) {
sb.append(join).append(strings[i].toString());
}
return sb.toString();
}
}
}
@@ -1,50 +0,0 @@
package org.bspeice.minimalbible.activities.viewer;
import org.crosswire.jsword.book.Book;
import org.crosswire.jsword.book.Books;
import javax.inject.Inject;
import javax.inject.Singleton;
import rx.Observable;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
/**
* Created by bspeice on 6/18/14.
*/
@Singleton
public class BookManager {
private Observable<Book> installedBooks;
private Boolean refreshComplete;
@Inject
BookManager() {
installedBooks = Observable.from(Books.installed().getBooks())
.cache();
installedBooks.subscribeOn(Schedulers.io())
.subscribe(new Action1<Book>() {
@Override
public void call(Book book) {}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {}
}, new Action0() {
@Override
public void call() {
BookManager.this.refreshComplete = true;
}
});
}
public Observable<Book> getInstalledBooks() {
return installedBooks;
}
public Boolean isRefreshComplete() {
return refreshComplete;
}
}
@@ -2,11 +2,11 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".DownloadActivity$PlaceholderFragment">
tools:context="org.bspeice.minimalbible.MainActivity$PlaceholderFragment" >
<TextView
android:id="@+id/section_label"
@@ -3,7 +3,6 @@
android:id="@+id/list_nav_drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cccccc"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
@@ -1,12 +0,0 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="org.bspeice.minimalbible.MainActivity$PlaceholderFragment" >
<WebView
android:id="@+id/book_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
+4
View File
@@ -3,6 +3,10 @@
xmlns:tools="http://schemas.android.com/tools"
tools:context="org.bspeice.minimalbible.MainActivity" >
<item
android:id="@+id/action_example"
android:title="@string/action_example"
app:showAsAction="withText|ifRoom"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="content_page">file:///android_asset/book.html</string>
</resources>
-19
View File
@@ -1,19 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.bspeice.minimalbible">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="20" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name="org.bspeice.minimalbible.test.MinimalBibleTest" >
</application>
</manifest>
@@ -0,0 +1,99 @@
package org.bspeice.minimalbible.test;
import android.test.InstrumentationTestCase;
import android.util.Log;
import org.bspeice.minimalbible.MinimalBible;
import org.bspeice.minimalbible.MinimalBibleModules;
import org.bspeice.minimalbible.activities.downloader.manager.BookDownloadManager;
import org.bspeice.minimalbible.activities.downloader.manager.DLProgressEvent;
import org.bspeice.minimalbible.activities.downloader.manager.DownloadManager;
import org.bspeice.minimalbible.activities.downloader.manager.InstalledManager;
import org.bspeice.minimalbible.activities.downloader.manager.RefreshManager;
import org.crosswire.jsword.book.Book;
import org.crosswire.jsword.book.BookException;
import org.crosswire.jsword.book.Books;
import org.crosswire.jsword.book.install.InstallException;
import org.crosswire.jsword.book.install.Installer;
import org.crosswire.jsword.passage.NoSuchKeyException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.inject.Inject;
import dagger.Module;
import dagger.ObjectGraph;
import rx.Observable;
import static com.jayway.awaitility.Awaitility.await;
/**
* Tests for the Download activity
*/
public class DownloadActivityTest extends InstrumentationTestCase {
@Module(addsTo = MinimalBibleModules.class,
injects = DownloadActivityTest.class)
public static class DownloadActivityTestModule {}
@Inject DownloadManager dm;
@Inject InstalledManager im;
@Inject RefreshManager rm;
@Inject BookDownloadManager bdm;
public void setUp() {
MinimalBible application = MinimalBible.getApplication();
ObjectGraph graph = application.getObjGraph();
ObjectGraph plusGraph = graph.plus(DownloadActivityTestModule.class);
plusGraph.inject(this);
}
public void testBasicAssertion() {
assertEquals(true, true);
}
/**
* Test that we can successfully download and remove a book
*/
public void testInstallAndRemoveBook() {
// Install a book
Installer i = (Installer) dm.getInstallers().values().toArray()[0];
final Book testBook = i.getBooks().get(0);
bdm.installBook(testBook);
await().atMost(30, TimeUnit.SECONDS)
.until(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
return Books.installed().getBooks().contains(testBook);
}
});
// Validate that we can actually do something with the book
// TODO: Validate that the book exists on the filesystem too
try {
assertNotNull(testBook.getRawText(testBook.getKey("Gen 1:1")));
} catch (BookException e) {
fail(e.getMessage());
} catch (NoSuchKeyException e) {
fail(e.getMessage());
}
// Remove the book and make sure it's gone
// TODO: Validate that the book is off the filesystem
im.removeBook(testBook);
await().atMost(10, TimeUnit.SECONDS)
.until(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
return !Books.installed().getBooks().contains(testBook);
}
});
}
}
@@ -1,20 +0,0 @@
package org.bspeice.minimalbible.test;
import org.bspeice.minimalbible.MinimalBible;
import org.bspeice.minimalbible.MinimalBibleModules;
import dagger.Module;
/**
* Master module for MinimalBible
*/
@Module(
injects = {
MinimalBible.class
},
includes = {
MinimalBibleModules.class
}
)
public class MinimalBibleModulesTest {
}
@@ -1,75 +0,0 @@
package org.bspeice.minimalbible.test;
import android.content.Context;
import org.bspeice.minimalbible.MinimalBible;
import dagger.ObjectGraph;
public class MinimalBibleTest extends MinimalBible {
/**
* The graph used by Dagger to track dependencies
*/
private ObjectGraph graph;
/**
* A singleton reference to the Application currently being run.
* Used mostly so we have a fixed point to get the App Context from
*/
private static MinimalBibleTest instance;
private String TAG = "MinimalBibleTest";
/**
* Create the application, and persist the application Context
*/
public MinimalBibleTest() {
instance = this;
}
/**
* Get the Application Context. Please note, all attempts to get the App Context should come
* through here, and please be sure that the Application won't satisfy what you need.
* @return The Application Context
*/
public static Context getAppContext() {
return instance;
}
/**
* Get the Application, rather than just the Application Context. You likely should be using
* this, rather than {@link #getAppContext()}
* @return The MinimalBible {@link android.app.Application} object
*/
public static MinimalBibleTest getApplication() {
return instance;
}
/**
* Create the {@link android.app.Application}. Responsible for building and
* holding on to the master ObjectGraph.
*/
@Override
public void onCreate() {
super.onCreate();
//TODO: Is this necessary?
inject(this);
}
/**
* Inject a Dagger object
* @param o The object to be injected
*/
@Override
public void inject(Object o) {
getObjGraph().inject(o);
}
public ObjectGraph getObjGraph() {
if (graph == null) {
graph = ObjectGraph.create(MinimalBibleModulesTest.class);
}
return graph;
}
}
@@ -1,117 +0,0 @@
package org.bspeice.minimalbible.test.activities.downloader;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.test.ActivityInstrumentationTestCase2;
import org.bspeice.minimalbible.MinimalBible;
import org.bspeice.minimalbible.activities.downloader.BookListFragment;
import org.bspeice.minimalbible.activities.downloader.DownloadActivity;
import org.bspeice.minimalbible.activities.downloader.DownloadPrefs;
import org.bspeice.minimalbible.test.MinimalBibleModulesTest;
import org.crosswire.jsword.book.BookCategory;
import java.util.concurrent.CountDownLatch;
import dagger.Module;
import de.devland.esperandro.Esperandro;
/**
* Created by bspeice on 6/23/14.
*/
public class BookListFragmentTest extends ActivityInstrumentationTestCase2<DownloadActivity> {
@Module(injects = TestDialogDisplayedIfFirstTimeFragment.class,
addsTo = MinimalBibleModulesTest.class
)
protected static class BookListFragmentTestModule{}
public BookListFragmentTest() {
super(DownloadActivity.class);
}
FragmentManager mFragmentManager;
public void setUp() throws Exception {
super.setUp();
mFragmentManager = getActivity().getSupportFragmentManager();
assertNotNull(mFragmentManager);
}
public <F extends Fragment> F startFragment(F fragment) {
try {
mFragmentManager.beginTransaction()
.replace(android.R.id.content, fragment)
.commit();
} catch (Exception e) {
e.printStackTrace();
}
final CountDownLatch signal = new CountDownLatch(1);
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
mFragmentManager.executePendingTransactions();
signal.countDown();
}
});
try {
signal.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
return (F)(mFragmentManager.findFragmentById(android.R.id.content));
}
protected class TestDialogDisplayedIfFirstTimeFragment extends BookListFragment {
/**
* If the refresh dialog is blank after calling display, it must be showing the warning
* @return Whether the warning dialog is showing
*/
public boolean callDisplayModules(DownloadPrefs prefs) {
// Inject the new preferences...
this.downloadPrefs = prefs;
displayModules();
return (refreshDialog == null);
}
public void setArgs(BookCategory c) {
Bundle args = new Bundle();
args.putString(ARG_BOOK_CATEGORY, c.toString());
this.setArguments(args);
}
}
public void testDialogDisplayedIfFirstTime() {
((MinimalBible)getActivity().getApplication()).plusObjGraph(BookListFragmentTestModule.class);
TestDialogDisplayedIfFirstTimeFragment f = new TestDialogDisplayedIfFirstTimeFragment();
f.setArgs(BookCategory.BIBLE);
startFragment(f);
DownloadPrefs prefs = Esperandro.getPreferences(DownloadPrefs.class, getActivity());
prefs.hasShownDownloadDialog(false);
assertNotNull(f);
assertTrue(f.callDisplayModules(Esperandro.getPreferences(DownloadPrefs.class, getActivity())));
}
public void testRefreshDisplayedAfterFirstTime() {
((MinimalBible)getActivity().getApplication()).plusObjGraph(BookListFragmentTestModule.class);
TestDialogDisplayedIfFirstTimeFragment f = new TestDialogDisplayedIfFirstTimeFragment();
f.setArgs(BookCategory.BIBLE);
startFragment(f);
DownloadPrefs prefs = Esperandro.getPreferences(DownloadPrefs.class, getActivity());
prefs.hasShownDownloadDialog(true);
assertNotNull(f);
assertFalse(f.callDisplayModules(Esperandro.getPreferences(DownloadPrefs.class, getActivity())));
}
}
-1
View File
@@ -1 +0,0 @@
/build
-68
View File
@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="MinimalBible2" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android-gradle" name="Android-Gradle">
<configuration>
<option name="GRADLE_PROJECT_PATH" value=":app" />
</configuration>
</facet>
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugJava" />
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/../../MinimalBible2/app/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
</content>
<orderEntry type="jdk" jdkName="Android API 20, L preview Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="appcompat-v7-19.1.0" level="project" />
<orderEntry type="library" exported="" name="support-v4-19.1.0" level="project" />
</component>
</module>
-25
View File
@@ -1,25 +0,0 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 'android-L'
buildToolsVersion "20.0.0"
defaultConfig {
applicationId "org.bspeice.minimalbible"
minSdkVersion 8
targetSdkVersion 'L'
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:19.+'
}
-17
View File
@@ -1,17 +0,0 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\Bradlee Speice\AppData\Local\Android\android-studio\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
@@ -1,13 +0,0 @@
package org.bspeice.minimalbible;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
}
-21
View File
@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.bspeice.minimalbible" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".DownloadActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
@@ -1,146 +0,0 @@
package org.bspeice.minimalbible;
import android.app.Activity;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class DownloadActivity extends ActionBarActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private NavigationDrawerFragment mNavigationDrawerFragment;
/**
* Used to store the last screen title. For use in {@link #restoreActionBar()}.
*/
private CharSequence mTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download);
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
.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 restoreActionBar() {
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDrawerOpen()) {
// Only show items in the action bar relevant to this screen
// if the drawer is not showing. Otherwise, let the drawer
// decide what to show in the action bar.
getMenuInflater().inflate(R.menu.download, menu);
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
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);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((DownloadActivity) activity).onSectionAttached(
getArguments().getInt(ARG_SECTION_NUMBER));
}
}
}
@@ -1,282 +0,0 @@
package org.bspeice.minimalbible;
import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
/**
* Fragment used for managing interactions for and presentation of a navigation drawer.
* See the <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction">
* design guidelines</a> for a complete explanation of the behaviors implemented here.
*/
public class NavigationDrawerFragment extends Fragment {
/**
* Remember the position of the selected item.
*/
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
/**
* Per the design guidelines, you should show the drawer on launch until the user manually
* expands it. This shared preference tracks this.
*/
private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
/**
* A pointer to the current callbacks instance (the Activity).
*/
private NavigationDrawerCallbacks mCallbacks;
/**
* Helper component that ties the action bar to the navigation drawer.
*/
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private ListView mDrawerListView;
private View mFragmentContainerView;
private int mCurrentSelectedPosition = 0;
private boolean mFromSavedInstanceState;
private boolean mUserLearnedDrawer;
public NavigationDrawerFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Read in the flag indicating whether or not the user has demonstrated awareness of the
// drawer. See PREF_USER_LEARNED_DRAWER for details.
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);
if (savedInstanceState != null) {
mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
mFromSavedInstanceState = true;
}
// Select either the default item (0) or the last selected item.
selectItem(mCurrentSelectedPosition);
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Indicate that this fragment would like to influence the set of actions in the action bar.
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mDrawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false);
mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
});
mDrawerListView.setAdapter(new ArrayAdapter<String>(
getActionBar().getThemedContext(),
android.R.layout.simple_list_item_1,
android.R.id.text1,
new String[]{
getString(R.string.title_section1),
getString(R.string.title_section2),
getString(R.string.title_section3),
}));
mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
return mDrawerListView;
}
public boolean isDrawerOpen() {
return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
}
/**
* Users of this fragment must call this method to set up the navigation drawer interactions.
*
* @param fragmentId The android:id of this fragment in its activity's layout.
* @param drawerLayout The DrawerLayout containing this fragment's UI.
*/
public void setUp(int fragmentId, DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the navigation drawer and the action bar app icon.
mDrawerToggle = new ActionBarDrawerToggle(
getActivity(), /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
R.string.navigation_drawer_open, /* "open drawer" description for accessibility */
R.string.navigation_drawer_close /* "close drawer" description for accessibility */
) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) {
return;
}
if (!mUserLearnedDrawer) {
// The user manually opened the drawer; store this flag to prevent auto-showing
// the navigation drawer automatically in the future.
mUserLearnedDrawer = true;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).commit();
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};
// If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(mFragmentContainerView);
}
// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
private void selectItem(int position) {
mCurrentSelectedPosition = position;
if (mDrawerListView != null) {
mDrawerListView.setItemChecked(position, true);
}
if (mDrawerLayout != null) {
mDrawerLayout.closeDrawer(mFragmentContainerView);
}
if (mCallbacks != null) {
mCallbacks.onNavigationDrawerItemSelected(position);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallbacks = (NavigationDrawerCallbacks) activity;
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
}
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Forward the new configuration the drawer toggle component.
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// If the drawer is open, show the global app actions in the action bar. See also
// showGlobalContextActionBar, which controls the top-left area of the action bar.
if (mDrawerLayout != null && isDrawerOpen()) {
inflater.inflate(R.menu.global, menu);
showGlobalContextActionBar();
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
if (item.getItemId() == R.id.action_example) {
Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Per the navigation drawer design guidelines, updates the action bar to show the global app
* 'context', rather than just what's in the current screen.
*/
private void showGlobalContextActionBar() {
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setTitle(R.string.app_name);
}
private ActionBar getActionBar() {
return ((ActionBarActivity) getActivity()).getSupportActionBar();
}
/**
* Callbacks interface that all activities using this fragment must implement.
*/
public static interface NavigationDrawerCallbacks {
/**
* Called when an item in the navigation drawer is selected.
*/
void onNavigationDrawerItemSelected(int position);
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

@@ -1,31 +0,0 @@
<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".DownloadActivity">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
the container. -->
<fragment android:id="@+id/navigation_drawer"
android:layout_width="@dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:name="org.bspeice.minimalbible.NavigationDrawerFragment"
tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>
@@ -1,9 +0,0 @@
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#cccc"
tools:context=".NavigationDrawerFragment" />
-12
View File
@@ -1,12 +0,0 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".DownloadActivity" >
<item android:id="@+id/action_example"
android:title="@string/action_example"
app:showAsAction="withText|ifRoom" />
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
app:showAsAction="never" />
</menu>
-7
View File
@@ -1,7 +0,0 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
app:showAsAction="never" />
</menu>
-5
View File
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="android:Theme.Material.Light">
</style>
</resources>
@@ -1,6 +0,0 @@
<resources>
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
(such as screen margins) for screens with more than 820dp of available width. This
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
<dimen name="activity_horizontal_margin">64dp</dimen>
</resources>
-9
View File
@@ -1,9 +0,0 @@
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<!-- Per the design guidelines, navigation drawers should be between 240dp and 320dp:
https://developer.android.com/design/patterns/navigation-drawer.html -->
<dimen name="navigation_drawer_width">240dp</dimen>
</resources>
-13
View File
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">MinimalBible</string>
<string name="title_section1">Section 1</string>
<string name="title_section2">Section 2</string>
<string name="title_section3">Section 3</string>
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
<string name="action_example">Example action</string>
<string name="action_settings">Settings</string>
</resources>
-8
View File
@@ -1,8 +0,0 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
</resources>
+1 -1
View File
@@ -6,7 +6,7 @@ dependencies {
android {
compileSdkVersion 19
buildToolsVersion "20"
buildToolsVersion "19.1.0"
sourceSets {
main {
+1 -1
View File
@@ -4,6 +4,6 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
classpath 'com.android.tools.build:gradle:0.11.+'
}
}
-18
View File
@@ -1,18 +0,0 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Settings specified in this file will override any Gradle settings
# configured through the IDE.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
+1 -1
View File
@@ -1,4 +1,4 @@
#Fri Jun 27 21:15:50 EDT 2014
#Tue Jun 10 19:26:46 EDT 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME