Display books of the Bible in the navbar

This commit is contained in:
Bradlee Speice 2014-07-11 19:56:02 -04:00
parent 365cf0dccb
commit 0014ec8bad
7 changed files with 196 additions and 41 deletions

View File

@ -17,7 +17,6 @@ import org.bspeice.minimalbible.R;
import org.bspeice.minimalbible.activity.BaseActivity;
import org.bspeice.minimalbible.activity.BaseNavigationDrawerFragment;
import org.bspeice.minimalbible.activity.downloader.DownloadActivity;
import org.bspeice.minimalbible.activity.downloader.DownloadActivityModules;
import org.crosswire.jsword.book.Book;
import javax.inject.Inject;
@ -39,7 +38,7 @@ public class BibleViewer extends BaseActivity implements
private void buildObjGraph() {
if (bvObjectGraph == null) {
bvObjectGraph = MinimalBible.get(this)
.plus(new BibleViewerModules());
.plus(new BibleViewerModules(this));
}
bvObjectGraph.inject(this);
}

View File

@ -1,6 +1,21 @@
package org.bspeice.minimalbible.activity.viewer;
import android.util.Log;
import org.bspeice.minimalbible.Injector;
import org.bspeice.minimalbible.activity.viewer.bookutil.VersificationUtil;
import org.crosswire.jsword.book.Book;
import java.util.concurrent.atomic.AtomicReference;
import javax.inject.Named;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import de.devland.esperandro.Esperandro;
import rx.functions.Action1;
import rx.functions.Func1;
/**
* Created by bspeice on 6/18/14.
@ -8,8 +23,65 @@ import dagger.Module;
@Module(
injects = {
BibleViewer.class,
BookFragment.class
}
BookFragment.class,
ViewerNavDrawerFragment.class
},
library = true
)
public class BibleViewerModules {
BibleViewer activity;
public BibleViewerModules(BibleViewer activity) {
this.activity = activity;
}
@Provides @Singleton
Injector provideInjector() {
return activity;
}
@Provides @Singleton
BibleViewerPreferences providePrefs() {
return Esperandro.getPreferences(BibleViewerPreferences.class, activity);
}
@Provides @Named("MainBook")
Book provideMainBook(BookManager bookManager, final BibleViewerPreferences prefs) {
final AtomicReference<Book> mBook = new AtomicReference<Book>(null);
bookManager.getInstalledBooks()
.first(new Func1<Book, Boolean>() {
@Override
public Boolean call(Book book) {
return book.getName().equals(prefs.defaultBookName());
}
})
.subscribe(new Action1<Book>() {
@Override
public void call(Book book) {
mBook.set(book);
}
},new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.d("BibleViewerModules", throwable.getLocalizedMessage());
}
});
if (mBook.get() == null) {
Book fallback;
fallback = bookManager.getInstalledBooks()
.toBlocking().first();
prefs.defaultBookName(fallback.getName());
return fallback;
} else {
return mBook.get();
}
}
@Provides
VersificationUtil provideVersificationUtil() {
return new VersificationUtil();
}
}

View File

@ -0,0 +1,13 @@
package org.bspeice.minimalbible.activity.viewer;
import de.devland.esperandro.annotations.SharedPreferences;
/**
* Created by bspeice on 7/11/14.
*/
@SharedPreferences(name = "BibleViewerPreferences")
public interface BibleViewerPreferences {
String defaultBookName();
void defaultBookName(String defaultBookName);
}

View File

@ -10,41 +10,41 @@ import android.webkit.WebView;
import android.webkit.WebViewClient;
import org.bspeice.minimalbible.Injector;
import org.bspeice.minimalbible.MinimalBible;
import org.bspeice.minimalbible.R;
import org.bspeice.minimalbible.activity.BaseFragment;
import org.crosswire.jsword.book.Book;
import org.crosswire.jsword.book.BookMetaData;
import org.crosswire.jsword.versification.Versification;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import butterknife.ButterKnife;
import butterknife.InjectView;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import static org.crosswire.jsword.versification.system.Versifications.instance;
/**
* A placeholder fragment containing a simple view.
*/
public class BookFragment extends BaseFragment {
Injector i;
@Inject BookManager bookManager;
@Inject @Named("MainBook") Book mBook;
@InjectView(R.id.book_content)
WebView mainContent;
private static final String ARG_BOOK_NAME = "book_name";
private Book mBook;
/**
* Returns a new instance of this fragment for the given section number.
*/
public static BookFragment newInstance(String bookName, Injector injector) {
BookFragment fragment = new BookFragment();
injector.inject(fragment);
fragment.i = injector;
Bundle args = new Bundle();
args.putString(ARG_BOOK_NAME, bookName);
fragment.setArguments(args);
@ -57,7 +57,7 @@ public class BookFragment extends BaseFragment {
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
((Injector)getActivity()).inject(this);
}
@Override
@ -65,37 +65,23 @@ public class BookFragment extends BaseFragment {
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_viewer_main, container,
false);
i.inject(this);
ButterKnife.inject(this, rootView);
mainContent.getSettings().setJavaScriptEnabled(true);
// TODO: Load initial text from SharedPreferences
// And due to Observable async, we can kick off fetching the actual book asynchronously!
bookManager.getInstalledBooks()
.first(new Func1<Book, Boolean>() {
@Override
public Boolean call(Book book) {
String mBookName = getArguments().getString(ARG_BOOK_NAME);
return book.getName().equals(mBookName);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Book>() {
@Override
public void call(Book book) {
BookFragment.this.mBook = book;
displayBook(book);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.d("BookFragment", "No books installed?");
}
});
displayBook(mBook);
Log.d("BookFragment", getVersification(mBook).toString());
return rootView;
}
private Versification getVersification(Book b) {
return instance().getVersification((String) b.getBookMetaData().getProperty(BookMetaData.KEY_VERSIFICATION));
}
// TODO: Remove?
@Override
public void onAttach(Activity activity) {

View File

@ -8,14 +8,28 @@ import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import org.bspeice.minimalbible.Injector;
import org.bspeice.minimalbible.R;
import org.bspeice.minimalbible.activity.BaseNavigationDrawerFragment;
import org.bspeice.minimalbible.activity.viewer.bookutil.VersificationUtil;
import org.crosswire.jsword.book.Book;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
public class ViewerNavDrawerFragment extends BaseNavigationDrawerFragment {
@Inject VersificationUtil vUtil;
@Inject @Named("MainBook")
Book mainBook;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
((Injector)getActivity()).inject(this);
mDrawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false);
mDrawerListView
@ -26,12 +40,12 @@ public class ViewerNavDrawerFragment extends BaseNavigationDrawerFragment {
selectItem(position);
}
});
List<String> bookNames = vUtil.getNiceBookNames(mainBook)
.toList().toBlocking().first();
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)}));
android.R.id.text1, bookNames));
mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
return mDrawerListView;
}

View File

@ -0,0 +1,54 @@
package org.bspeice.minimalbible.activity.viewer.bookutil;
import org.bspeice.minimalbible.util.IteratorUtil;
import org.crosswire.jsword.book.Book;
import org.crosswire.jsword.book.BookMetaData;
import org.crosswire.jsword.versification.BibleBook;
import org.crosswire.jsword.versification.Versification;
import org.crosswire.jsword.versification.system.Versifications;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.functions.Func1;
/**
* Created by bspeice on 7/11/14.
*/
public class VersificationUtil {
private static final List<BibleBook> INTROS = new ArrayList<BibleBook>() {{
add(BibleBook.INTRO_BIBLE);
add(BibleBook.INTRO_OT);
add(BibleBook.INTRO_NT);
}};
public Versification getVersification(Book b) {
return Versifications.instance().getVersification(
(String) b.getBookMetaData().getProperty(BookMetaData.KEY_VERSIFICATION)
);
}
public Observable<BibleBook> getBookNames(Book b) {
Versification v = getVersification(b);
return Observable.from(IteratorUtil.copyIterator(v.getBookIterator()))
.filter(new Func1<BibleBook, Boolean>() {
@Override
public Boolean call(BibleBook bibleBook) {
return !INTROS.contains(bibleBook);
}
});
}
public Observable<String> getNiceBookNames(final Book b) {
return getBookNames(b)
.map(new Func1<BibleBook, String>() {
@Override
public String call(BibleBook bibleBook) {
return getVersification(b).getLongName(bibleBook);
}
});
}
}

View File

@ -0,0 +1,17 @@
package org.bspeice.minimalbible.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by bspeice on 7/11/14.
*/
public class IteratorUtil {
public static <T> List<T> copyIterator(Iterator<T> iter) {
List<T> copy = new ArrayList<T>();
while (iter.hasNext())
copy.add(iter.next());
return copy;
}
}