123 Commits

Author SHA1 Message Date
Bradlee Speice df3cf9652e More ugly unit testing... 2014-07-01 22:40:19 -04:00
Bradlee Speice 1c15767d10 Prettify the unit testing 2014-06-27 21:35:49 -04:00
Bradlee Speice b19b740c43 Update to the latest project version 2014-06-27 21:20:53 -04:00
Bradlee Speice 969adad9b0 I have a PoC Unit test. It needs refactoring.
Desperately.
2014-06-24 00:38:43 -04:00
Bradlee Speice 018fe29a75 One last minor tweak to show the book name instead of random text. 2014-06-18 22:58:54 -04:00
Bradlee Speice f5800388d3 Some basic WebView shenanigans 2014-06-18 22:51:31 -04:00
Bradlee Speice 8c71d4372e Initial switch to WebView 2014-06-18 22:18:46 -04:00
Bradlee Speice 348a6da9a3 Beginning work on the actual Bible viewer! 2014-06-18 22:08:53 -04:00
DjBushido 8e54fdb86d Disable tests for now
Having lots of issues with the jSword API just not being consistent...
2014-06-14 20:38:44 -04:00
Bradlee Speice d260f98377 Forgot to commit most of the files... 2014-06-14 18:07:18 -04:00
Bradlee Speice 3649468e7f Switch back to Dev/ branch of Android Studio
So Travis builds correctly.
2014-06-14 18:01:19 -04:00
Bradlee Speice d9f6eaa339 Squashed commit of the following: (enable Rx)
commit 4269988b7c
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Sat Jun 14 16:41:11 2014 -0400

    Backport to Java 6...
    Android Studio automatically folds lambda-style, so it won't get too out of hand.

commit e945ef51a7
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Sat Jun 14 16:25:13 2014 -0400

    Get the unit tests passing again
    Note: I need to write more. Lots more.

commit 04fe4d13b4
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Sat Jun 14 15:13:44 2014 -0400

    Add lots of Lint fixes

commit dda5c79299
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Sat Jun 14 15:04:17 2014 -0400

    Fix books not being removed...

commit 93abe065a2
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Sat Jun 14 14:10:43 2014 -0400

    Fix a NetworkOnMainThreadException

commit ba3c6ebe6c
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Sat Jun 14 14:08:50 2014 -0400

    Some refactoring and Async fixes.

commit 3869cf0b9b
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 23:46:29 2014 -0400

    Synchronization needs fixing, otherwise works.

commit 8d17b6db64
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 23:44:35 2014 -0400

    Silly DownloadManager
    Injects are for classes that need them.

commit 7070c933d1
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 23:41:35 2014 -0400

    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.

commit 28dfec81d7
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 23:17:20 2014 -0400

    [broken probably] Refactoring to Rx should be done...
    But having issues with compiling. Checking if Dagger and retrolambda
    play nice.

commit fb0c5fdaaa
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 22:56:52 2014 -0400

    [broken] BookListFragment to Rx

commit 6eb5f66dcc
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 22:49:47 2014 -0400

    [broken] BookItemHolder to Rx

commit e356c8d1fc
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 22:40:46 2014 -0400

    Revert "[broken] Remove the BookDownloadThread again"

    This reverts commit 8f346f17e4.

commit 287b8cb40d
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 22:39:06 2014 -0400

    [broken] Add a note on the InstalledManager

commit 899b054c8b
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 22:37:53 2014 -0400

    [broken] Slight semantic change to RefreshManager

commit 8f346f17e4
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 22:36:12 2014 -0400

    [broken] Remove the BookDownloadThread again

commit 1a7364da86
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 22:35:40 2014 -0400

    [broken] Convert BookDownloadManager to Rx

commit ca1ccd9942
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 22:04:53 2014 -0400

    [broken] Convert RefreshManager to Rx

commit 5770e8dd74
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 19:32:23 2014 -0400

    Add RxAndroid support, remove eventbus

commit 3f5909be08
Author: Bradlee Speice <bspeice.nc@gmail.com>
Date:   Tue Jun 10 19:30:45 2014 -0400

    Add retrolambda support
2014-06-14 16:43:21 -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
40 changed files with 146 additions and 824 deletions
-5
View File
@@ -2,11 +2,6 @@ language: android
env: env:
matrix: matrix:
- ANDROID_SDKS=android-19,sysimg-19 ANDROID_TARGET=android-19 ANDROID_ABI=armeabi-v7a - ANDROID_SDKS=android-19,sysimg-19 ANDROID_TARGET=android-19 ANDROID_ABI=armeabi-v7a
android:
components:
- build-tools-20.0.0
before_install: before_install:
- echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI
- emulator -avd test -no-skin -no-audio -no-window & - emulator -avd test -no-skin -no-audio -no-window &
+1 -6
View File
@@ -52,12 +52,7 @@ android {
} }
// Move the tests to tests/java, tests/res, etc... // Move the tests to tests/java, tests/res, etc...
androidTest { androidTest.setRoot('src/test')
manifest.srcFile 'src/test/AndroidManifest.xml'
java.srcDirs = ['src/test/java']
resources.srcDirs = ['src/test/res']
assets.srcDirs = ['src/test/assets']
}
// Move the build types to build-types/<type> // Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
@@ -0,0 +1,12 @@
package org.bspeice.minimalbible;
/**
* Massive shout-out to <a href="https://github.com/vovkab">vovkab</a> for this idea.
*/
public interface Injectable {
public Object[] getModules();
public void inject(Object o);
}
@@ -10,7 +10,7 @@ import java.io.File;
import dagger.ObjectGraph; import dagger.ObjectGraph;
public class MinimalBible extends Application { public class MinimalBible extends Application implements Injectable {
/** /**
* The graph used by Dagger to track dependencies * The graph used by Dagger to track dependencies
@@ -71,13 +71,14 @@ public class MinimalBible extends Application {
public ObjectGraph getObjGraph() { public ObjectGraph getObjGraph() {
if (graph == null) { if (graph == null) {
graph = ObjectGraph.create(MinimalBibleModules.class); graph = ObjectGraph.create(getModules());
} }
return graph; return graph;
} }
public void plusObjGraph(Object... modules) { @Override
graph = graph.plus(modules); public Object[] getModules() {
return MinimalBibleModules.list();
} }
/** /**
@@ -16,4 +16,12 @@ import dagger.Module;
} }
) )
public class MinimalBibleModules { public class MinimalBibleModules {
private MinimalBibleModules() {}
public static Object[] list() {
return new Object[] {
MinimalBibleModules.class
};
}
} }
-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>
@@ -1,75 +1,38 @@
package org.bspeice.minimalbible.test; package org.bspeice.minimalbible.test;
import android.app.Application;
import android.content.Context; import android.content.Context;
import android.os.Build;
import org.bspeice.minimalbible.MinimalBible; import org.bspeice.minimalbible.MinimalBible;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import dagger.ObjectGraph; import dagger.ObjectGraph;
public class MinimalBibleTest extends MinimalBible { public class MinimalBibleTest extends Application {
public MinimalBibleTest(Context ctx) {
/** attachBaseContext(ctx);
* 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 @Override
public void onCreate() { public void attachBaseContext(Context base) {
super.onCreate(); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
//TODO: Is this necessary? super.attachBaseContext(base);
inject(this); } else {
} try {
Class<Application> applicationClass = Application.class;
/** Method attach = applicationClass.getDeclaredMethod("attach", Context.class);
* Inject a Dagger object attach.setAccessible(true);
* @param o The object to be injected attach.invoke(this, base);
*/ } catch (NoSuchMethodException e) {
@Override e.printStackTrace();
public void inject(Object o) { } catch (IllegalAccessException e) {
getObjGraph().inject(o); e.printStackTrace();
} } catch (InvocationTargetException e) {
e.printStackTrace();
public ObjectGraph getObjGraph() { }
if (graph == null) {
graph = ObjectGraph.create(MinimalBibleModulesTest.class);
} }
return graph;
} }
} }
@@ -0,0 +1,28 @@
package org.bspeice.minimalbible.test;
import android.content.Context;
import org.bspeice.minimalbible.Injectable;
import dagger.ObjectGraph;
/**
* Created by bspeice on 6/27/14.
*/
public abstract class MinimalBibleTestMockable extends MinimalBibleTest implements Injectable {
private ObjectGraph mObjectGraph;
public MinimalBibleTestMockable(Context context) {
super(context);
mObjectGraph = ObjectGraph.create(getModules());
}
@Override
public abstract Object[] getModules();
@Override
public void inject(Object o) {
mObjectGraph.inject(o);
}
}
@@ -1,47 +1,88 @@
package org.bspeice.minimalbible.test.activities.downloader; package org.bspeice.minimalbible.test.activities.downloader;
import android.app.Application;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.test.ActivityInstrumentationTestCase2; import android.test.ActivityUnitTestCase;
import org.bspeice.minimalbible.MinimalBible; import org.bspeice.minimalbible.MinimalBible;
import org.bspeice.minimalbible.activities.downloader.BookListFragment; import org.bspeice.minimalbible.activities.downloader.BookListFragment;
import org.bspeice.minimalbible.activities.downloader.DownloadActivity; import org.bspeice.minimalbible.activities.downloader.DownloadActivity;
import org.bspeice.minimalbible.activities.downloader.DownloadPrefs; import org.bspeice.minimalbible.activities.downloader.DownloadPrefs;
import org.bspeice.minimalbible.test.MinimalBibleModulesTest; import org.bspeice.minimalbible.test.MinimalBibleModulesTest;
import org.bspeice.minimalbible.test.MinimalBibleTest;
import org.bspeice.minimalbible.test.MinimalBibleTestMockable;
import org.crosswire.jsword.book.BookCategory; import org.crosswire.jsword.book.BookCategory;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import javax.inject.Inject;
import dagger.Module; import dagger.Module;
import dagger.Provides;
import de.devland.esperandro.Esperandro; import de.devland.esperandro.Esperandro;
/** /**
* Created by bspeice on 6/23/14. * Created by bspeice on 6/23/14.
*/ */
public class BookListFragmentTest extends ActivityInstrumentationTestCase2<DownloadActivity> { public class BookListFragmentTest extends ActivityUnitTestCase<DownloadActivity> {
private static Class activityUnderTest = DownloadActivity.class;
@Module(injects = TestDialogDisplayedIfFirstTimeFragment.class, @Module(injects = TestDialogDisplayedIfFirstTimeFragment.class,
addsTo = MinimalBibleModulesTest.class addsTo = MinimalBibleModulesTest.class,
overrides = true
) )
protected static class BookListFragmentTestModule{} protected static class BookListFragmentTestModule{
@Provides
public BookListFragmentTest() { DownloadPrefs providePrefs() {
super(DownloadActivity.class); return Esperandro.getPreferences(DownloadPrefs.class,
MinimalBible.getApplication());
}
} }
public BookListFragmentTest() {
super(activityUnderTest);
}
@Inject DownloadPrefs downloadPrefs;
FragmentManager mFragmentManager; FragmentManager mFragmentManager;
private Application mApplication;
private Context mContext;
@Override
public void setUp() throws Exception { public void setUp() throws Exception {
super.setUp(); super.setUp();
mFragmentManager = getActivity().getSupportFragmentManager(); // Set 'dexmaker.dexcache' system property, otherwise sometimes it is null and test will crash
assertNotNull(mFragmentManager); // System.setProperty("dexmaker.dexcache", getInstrumentation().getTargetContext().getCacheDir().getPath());
mContext = new ContextWrapper(getInstrumentation().getTargetContext()) {
@Override
public Context getApplicationContext() {
return mApplication;
}
};
mApplication = new MinimalBibleTestMockable(mContext) {
@Override public Object[] getModules() {
return new Object[]{new BookListFragmentTestModule()};
}
};
setApplication(mApplication);
} }
@Override
public void tearDown() throws Exception {
super.tearDown();
}
public <F extends Fragment> F startFragment(F fragment) { public <F extends Fragment> F startFragment(F fragment) {
try { try {
@@ -68,15 +109,19 @@ public class BookListFragmentTest extends ActivityInstrumentationTestCase2<Downl
return (F)(mFragmentManager.findFragmentById(android.R.id.content)); return (F)(mFragmentManager.findFragmentById(android.R.id.content));
} }
public void testApplicationReplacementWorks() {
setActivityContext(mContext);
startActivity(new Intent(mContext, activityUnderTest), null, null);
assertTrue(getActivity().getApplicationContext() instanceof MinimalBibleTestMockable);
}
protected class TestDialogDisplayedIfFirstTimeFragment extends BookListFragment { protected class TestDialogDisplayedIfFirstTimeFragment extends BookListFragment {
/** /**
* If the refresh dialog is blank after calling display, it must be showing the warning * If the refresh dialog is blank after calling display, it must be showing the warning
* @return Whether the warning dialog is showing * @return Whether the warning dialog is showing
*/ */
public boolean callDisplayModules(DownloadPrefs prefs) { public boolean callDisplayModules() {
// Inject the new preferences...
this.downloadPrefs = prefs;
displayModules(); displayModules();
return (refreshDialog == null); return (refreshDialog == null);
} }
@@ -89,29 +134,30 @@ public class BookListFragmentTest extends ActivityInstrumentationTestCase2<Downl
} }
public void testDialogDisplayedIfFirstTime() { public void testDialogDisplayedIfFirstTime() {
((MinimalBible)getActivity().getApplication()).plusObjGraph(BookListFragmentTestModule.class); setActivityContext(mContext);
startActivity(new Intent(mContext, activityUnderTest), null, null);
TestDialogDisplayedIfFirstTimeFragment f = new TestDialogDisplayedIfFirstTimeFragment(); TestDialogDisplayedIfFirstTimeFragment f = new TestDialogDisplayedIfFirstTimeFragment();
f.setArgs(BookCategory.BIBLE); f.setArgs(BookCategory.BIBLE);
startFragment(f); startFragment(f);
DownloadPrefs prefs = Esperandro.getPreferences(DownloadPrefs.class, getActivity());
prefs.hasShownDownloadDialog(false);
assertNotNull(f); assertNotNull(f);
assertTrue(f.callDisplayModules(Esperandro.getPreferences(DownloadPrefs.class, getActivity())));
downloadPrefs.hasShownDownloadDialog(false);
assertTrue(f.callDisplayModules());
} }
public void testRefreshDisplayedAfterFirstTime() { public void testRefreshDisplayedAfterFirstTime() {
((MinimalBible)getActivity().getApplication()).plusObjGraph(BookListFragmentTestModule.class); setActivityContext(mContext);
startActivity(new Intent(mContext, activityUnderTest), null, null);
TestDialogDisplayedIfFirstTimeFragment f = new TestDialogDisplayedIfFirstTimeFragment(); TestDialogDisplayedIfFirstTimeFragment f = new TestDialogDisplayedIfFirstTimeFragment();
f.setArgs(BookCategory.BIBLE); f.setArgs(BookCategory.BIBLE);
startFragment(f); startFragment(f);
DownloadPrefs prefs = Esperandro.getPreferences(DownloadPrefs.class, getActivity());
prefs.hasShownDownloadDialog(true);
assertNotNull(f); assertNotNull(f);
assertFalse(f.callDisplayModules(Esperandro.getPreferences(DownloadPrefs.class, getActivity())));
downloadPrefs.hasShownDownloadDialog(true);
assertFalse(f.callDisplayModules());
} }
} }
-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,16 +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"
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">
<TextView
android:id="@+id/section_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
@@ -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>
-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