package com.quran.labs.androidquran.ui;
import android.app.SearchManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.view.ActionMode;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.quran.labs.androidquran.AboutUsActivity;
import com.quran.labs.androidquran.HelpActivity;
import com.quran.labs.androidquran.QuranApplication;
import com.quran.labs.androidquran.QuranPreferenceActivity;
import com.quran.labs.androidquran.R;
import com.quran.labs.androidquran.SearchActivity;
import com.quran.labs.androidquran.ShortcutsActivity;
import com.quran.labs.androidquran.data.Constants;
import com.quran.labs.androidquran.model.bookmark.RecentPageModel;
import com.quran.labs.androidquran.presenter.translation.TranslationManagerPresenter;
import com.quran.labs.androidquran.service.AudioService;
import com.quran.labs.androidquran.ui.fragment.AddTagDialog;
import com.quran.labs.androidquran.ui.fragment.BookmarksFragment;
import com.quran.labs.androidquran.ui.fragment.JumpFragment;
import com.quran.labs.androidquran.ui.fragment.JuzListFragment;
import com.quran.labs.androidquran.ui.fragment.SuraListFragment;
import com.quran.labs.androidquran.ui.fragment.TagBookmarkDialog;
import com.quran.labs.androidquran.util.AudioUtils;
import com.quran.labs.androidquran.util.QuranSettings;
import com.quran.labs.androidquran.util.QuranUtils;
import com.quran.labs.androidquran.widgets.SlidingTabLayout;
import javax.inject.Inject;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import timber.log.Timber;
public class QuranActivity extends QuranActionBarActivity
implements TagBookmarkDialog.OnBookmarkTagsUpdateListener {
private static int[] TITLES = new int[]{
R.string.quran_sura,
R.string.quran_juz2,
R.string.menu_bookmarks };
private static int[] ARABIC_TITLES = new int[]{
R.string.menu_bookmarks,
R.string.quran_juz2,
R.string.quran_sura };
public static final String EXTRA_SHOW_TRANSLATION_UPGRADE = "transUp";
private static final String SI_SHOWED_UPGRADE_DIALOG = "si_showed_dialog";
private static final int SURA_LIST = 0;
private static final int JUZ2_LIST = 1;
private static final int BOOKMARKS_LIST = 2;
private static boolean updatedTranslations;
private AlertDialog upgradeDialog = null;
private boolean showedTranslationUpgradeDialog = false;
private boolean isRtl;
private boolean isPaused;
private MenuItem searchItem;
private ActionMode supportActionMode;
private CompositeDisposable compositeDisposable;
private QuranSettings settings;
private Observable<Integer> recentPages;
@Inject RecentPageModel recentPageModel;
@Inject TranslationManagerPresenter translationManagerPresenter;
@Override
public void onCreate(Bundle savedInstanceState) {
QuranApplication quranApp = (QuranApplication) getApplication();
quranApp.refreshLocale(this, false);
super.onCreate(savedInstanceState);
quranApp.getApplicationComponent().inject(this);
setContentView(R.layout.quran_index);
compositeDisposable = new CompositeDisposable();
settings = QuranSettings.getInstance(this);
isRtl = isRtl();
final Toolbar tb = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(tb);
final ActionBar ab = getSupportActionBar();
if (ab != null) {
ab.setTitle(R.string.app_name);
}
final ViewPager pager = (ViewPager) findViewById(R.id.index_pager);
pager.setOffscreenPageLimit(3);
PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager());
pager.setAdapter(pagerAdapter);
final SlidingTabLayout indicator =
(SlidingTabLayout) findViewById(R.id.indicator);
indicator.setViewPager(pager);
if (isRtl) {
pager.setCurrentItem(TITLES.length - 1);
}
if (savedInstanceState != null) {
showedTranslationUpgradeDialog = savedInstanceState.getBoolean(
SI_SHOWED_UPGRADE_DIALOG, false);
}
recentPages = recentPageModel.getLatestPageObservable();
Intent intent = getIntent();
if (intent != null) {
Bundle extras = intent.getExtras();
if (extras != null) {
if (extras.getBoolean(EXTRA_SHOW_TRANSLATION_UPGRADE, false)) {
if (!showedTranslationUpgradeDialog) {
showTranslationsUpgradeDialog();
}
}
}
if (ShortcutsActivity.ACTION_JUMP_TO_LATEST.equals(intent.getAction())) {
jumpToLastPage();
}
}
updateTranslationsListAsNeeded();
}
@Override
public void onResume() {
compositeDisposable.add(recentPages.subscribe());
super.onResume();
final boolean isRtl = isRtl();
if (isRtl != this.isRtl) {
final Intent i = getIntent();
finish();
startActivity(i);
} else {
startService(AudioUtils.getAudioIntent(this, AudioService.ACTION_STOP));
}
isPaused = false;
}
@Override
protected void onPause() {
compositeDisposable.clear();
isPaused = true;
super.onPause();
}
private boolean isRtl() {
return settings.isArabicNames() || QuranUtils.isRtl();
}
public Observable<Integer> getLatestPageObservable() {
return recentPages;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.home_menu, menu);
searchItem = menu.findItem(R.id.search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
final SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setQueryHint(getString(R.string.search_hint));
searchView.setSearchableInfo(searchManager.getSearchableInfo(
new ComponentName(this, SearchActivity.class)));
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.settings: {
Intent i = new Intent(this, QuranPreferenceActivity.class);
startActivity(i);
return true;
}
case R.id.last_page: {
jumpToLastPage();
return true;
}
case R.id.help: {
Intent i = new Intent(this, HelpActivity.class);
startActivity(i);
return true;
}
case R.id.about: {
Intent i = new Intent(this, AboutUsActivity.class);
startActivity(i);
return true;
}
case R.id.jump: {
gotoPageDialog();
return true;
}
case R.id.other_apps: {
Answers.getInstance().logCustom(new CustomEvent("menuOtherApps"));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://search?q=pub:quran.com"));
if (getPackageManager().resolveActivity(intent,
PackageManager.MATCH_DEFAULT_ONLY) == null) {
intent.setData(Uri.parse("http://play.google.com/store/search?q=pub:quran.com"));
}
startActivity(intent);
return true;
}
default: {
return super.onOptionsItemSelected(item);
}
}
}
@Override
public void onSupportActionModeFinished(@NonNull ActionMode mode) {
supportActionMode = null;
super.onSupportActionModeFinished(mode);
}
@Override
public void onSupportActionModeStarted(@NonNull ActionMode mode) {
supportActionMode = mode;
super.onSupportActionModeStarted(mode);
}
@Override
public void onBackPressed() {
if (supportActionMode != null) {
supportActionMode.finish();
} else if (searchItem != null && searchItem.isActionViewExpanded()) {
searchItem.collapseActionView();
} else {
super.onBackPressed();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putBoolean(SI_SHOWED_UPGRADE_DIALOG,
showedTranslationUpgradeDialog);
super.onSaveInstanceState(outState);
}
private void jumpToLastPage() {
compositeDisposable.add(recentPages
.observeOn(AndroidSchedulers.mainThread())
.subscribe(recentPage -> jumpTo(recentPage == Constants.NO_PAGE ? 1 : recentPage)));
}
private void updateTranslationsListAsNeeded() {
if (!updatedTranslations) {
long time = settings.getLastUpdatedTranslationDate();
Timber.d("checking whether we should update translations..");
if (System.currentTimeMillis() - time > Constants.TRANSLATION_REFRESH_TIME) {
Timber.d("updating translations list...");
updatedTranslations = true;
translationManagerPresenter.checkForUpdates();
}
}
}
private void showTranslationsUpgradeDialog() {
showedTranslationUpgradeDialog = true;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.translation_updates_available);
builder.setCancelable(false);
builder.setPositiveButton(R.string.translation_dialog_yes,
(dialog, id) -> {
dialog.dismiss();
upgradeDialog = null;
launchTranslationActivity();
});
builder.setNegativeButton(R.string.translation_dialog_later,
(dialog, which) -> {
dialog.dismiss();
upgradeDialog = null;
// pretend we don't have updated translations. we'll
// check again after 10 days.
settings.setHaveUpdatedTranslations(false);
});
upgradeDialog = builder.create();
upgradeDialog.show();
}
private void launchTranslationActivity() {
Intent i = new Intent(this, TranslationManagerActivity.class);
startActivity(i);
}
public void jumpTo(int page) {
Intent i = new Intent(this, PagerActivity.class);
i.putExtra("page", page);
i.putExtra(PagerActivity.EXTRA_JUMP_TO_TRANSLATION, settings.getWasShowingTranslation());
startActivity(i);
}
public void jumpToAndHighlight(int page, int sura, int ayah) {
Intent i = new Intent(this, PagerActivity.class);
i.putExtra("page", page);
i.putExtra(PagerActivity.EXTRA_HIGHLIGHT_SURA, sura);
i.putExtra(PagerActivity.EXTRA_HIGHLIGHT_AYAH, ayah);
startActivity(i);
}
private void gotoPageDialog() {
if (!isPaused) {
FragmentManager fm = getSupportFragmentManager();
JumpFragment jumpDialog = new JumpFragment();
jumpDialog.show(fm, JumpFragment.TAG);
}
}
public void addTag() {
if (!isPaused) {
FragmentManager fm = getSupportFragmentManager();
AddTagDialog addTagDialog = new AddTagDialog();
addTagDialog.show(fm, AddTagDialog.TAG);
}
}
public void editTag(long id, String name) {
if (!isPaused) {
FragmentManager fm = getSupportFragmentManager();
AddTagDialog addTagDialog = AddTagDialog.newInstance(id, name);
addTagDialog.show(fm, AddTagDialog.TAG);
}
}
public void tagBookmarks(long[] ids) {
if (ids != null && ids.length == 1) {
tagBookmark(ids[0]);
return;
}
if (!isPaused) {
FragmentManager fm = getSupportFragmentManager();
TagBookmarkDialog tagBookmarkDialog = TagBookmarkDialog.newInstance(ids);
tagBookmarkDialog.show(fm, TagBookmarkDialog.TAG);
}
}
private void tagBookmark(long id) {
if (!isPaused) {
FragmentManager fm = getSupportFragmentManager();
TagBookmarkDialog tagBookmarkDialog = TagBookmarkDialog.newInstance(id);
tagBookmarkDialog.show(fm, TagBookmarkDialog.TAG);
}
}
@Override
public void onAddTagSelected() {
FragmentManager fm = getSupportFragmentManager();
AddTagDialog dialog = new AddTagDialog();
dialog.show(fm, AddTagDialog.TAG);
}
private class PagerAdapter extends FragmentPagerAdapter {
PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 3;
}
@Override
public Fragment getItem(int position) {
int pos = position;
if (isRtl) {
pos = Math.abs(position - 2);
}
switch (pos) {
case QuranActivity.SURA_LIST:
return SuraListFragment.newInstance();
case QuranActivity.JUZ2_LIST:
return JuzListFragment.newInstance();
case QuranActivity.BOOKMARKS_LIST:
default:
return BookmarksFragment.newInstance();
}
}
@Override
public long getItemId(int position) {
int pos = isRtl ? Math.abs(position - 2) : position;
switch (pos) {
case QuranActivity.SURA_LIST:
return SURA_LIST;
case QuranActivity.JUZ2_LIST:
return JUZ2_LIST;
case QuranActivity.BOOKMARKS_LIST:
default:
return BOOKMARKS_LIST;
}
}
@Override
public CharSequence getPageTitle(int position) {
final int resId = isRtl ?
ARABIC_TITLES[position] : TITLES[position];
return getString(resId);
}
}
}