Compare commits
123 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| df3cf9652e | |||
| 1c15767d10 | |||
| b19b740c43 | |||
| 969adad9b0 | |||
| 018fe29a75 | |||
| f5800388d3 | |||
| 8c71d4372e | |||
| 348a6da9a3 | |||
| 8e54fdb86d | |||
| d260f98377 | |||
| 3649468e7f | |||
| d9f6eaa339 | |||
| a7e185690e | |||
| 78997f704f | |||
| 2e8974b745 | |||
| 5a2eee49d5 | |||
| 1a8b3f2eee | |||
| 4514c0f33f | |||
| 457ab021c7 | |||
| bd60b9a038 | |||
| ca4cff2adf | |||
| ed219bc8a4 | |||
| 8fe05dc70b | |||
| f187b519f0 | |||
| b21f3c1fd8 | |||
| f5128d6753 | |||
| 83a5ce6e9f | |||
| ded7193c49 | |||
| 1017f9a34d | |||
| c1dc0da9e3 | |||
| 7558fc7f20 | |||
| 6191943d3f | |||
| 6afb9b6f28 | |||
| 38181c8827 | |||
| 2c494edadc | |||
| bba77bb45a | |||
| 2af187e429 | |||
| 221f01653f | |||
| d7a9ad3c82 | |||
| 135832859c | |||
| f7f3b56db8 | |||
| d10626efe6 | |||
| d664f12d08 | |||
| d16730781b | |||
| 6446e143ba | |||
| b04d6c67ae | |||
| 5222b6e3e6 | |||
| 01d5e97d21 | |||
| 13fc473081 | |||
| 4e01ff666e | |||
| 8292dc91a1 | |||
| eeb0df3dcf | |||
| 6cd3f712d8 | |||
| 8b499b9215 | |||
| e88c68b1e3 | |||
| a046e9fa0a | |||
| 1530364abc | |||
| 4da25f0e23 | |||
| 503ae75d79 | |||
| 9f80432924 | |||
| 7333f7404d | |||
| 0f109e21b4 | |||
| e4d414f3c6 | |||
| 5c9e0ecba4 | |||
| 1ac2c6539e | |||
| 8a36744ac7 | |||
| 594df14a31 | |||
| f228e8265e | |||
| 4d822d63de | |||
| c0c69dbf6b | |||
| 0a4f467a39 | |||
| 83448dc9c7 | |||
| a47d007ccb | |||
| 034252fd4d | |||
| 4cf8b8d129 | |||
| 09e0572612 | |||
| 72cf38a2fc | |||
| 8a83548ab8 | |||
| 1f116fe6ff | |||
| a8f6277ff2 | |||
| 184acf1ba4 | |||
| e29d4546db | |||
| 0f98338504 | |||
| 4dc920186f | |||
| 4c3a2ba5b5 | |||
| 76004e34d0 | |||
| bfe6eeda0c | |||
| 08f179b0c3 | |||
| 63123a1a31 | |||
| 40b7ffd5fb | |||
| f5825de88c | |||
| f5e523417a | |||
| 1465c81b9b | |||
| d4f4d8a8d5 | |||
| d28fcb1ea6 | |||
| e8f7948d60 | |||
| 1380a66f88 | |||
| fd6c063079 | |||
| 29f02e59b2 | |||
| 9242bbd944 | |||
| 1d0eab434f | |||
| 0feee0b940 | |||
| 77d808ca1b | |||
| e4282229e5 | |||
| bda928098c | |||
| 9bf99db956 | |||
| e8fa4b4257 | |||
| 00ebfb1e48 | |||
| 7e2021d681 | |||
| 431ce603c6 | |||
| 5fb077a40d | |||
| b20d0aa819 | |||
| 090d866250 | |||
| d6c7f498e6 | |||
| 90c4a4ef48 | |||
| 63c716bae6 | |||
| e558a9cc14 | |||
| 60aff7acf8 | |||
| 939af7dc7a | |||
| 0fb72d416f | |||
| 3d76bb9e18 | |||
| 7eab6bbbdc | |||
| df2a0f0788 |
@@ -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 &
|
||||||
|
|||||||
@@ -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
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 +0,0 @@
|
|||||||
/build
|
|
||||||
@@ -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>
|
|
||||||
|
|
||||||
@@ -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.+'
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 161 B |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 142 B |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 174 B |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 208 B |
|
Before Width: | Height: | Size: 202 B |
|
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" />
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<resources>
|
|
||||||
|
|
||||||
<!-- Base application theme. -->
|
|
||||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
|
||||||
<!-- Customize your theme here. -->
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</resources>
|
|
||||||
@@ -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
|
|
||||||