package org.ebookdroid.ui.viewer; import org.ebookdroid.common.settings.types.DocumentViewMode; import org.ebookdroid.common.settings.types.RotationType; import org.emdev.ui.uimanager.UIManagerAppCompat; import org.sufficientlysecure.viewer.R; import org.ebookdroid.common.settings.AppSettings; import org.ebookdroid.common.settings.books.BookSettings; import org.ebookdroid.common.settings.books.Bookmark; import org.ebookdroid.common.settings.types.ToastPosition; import org.ebookdroid.common.touch.TouchManagerView; import org.ebookdroid.core.DecodeService; import org.ebookdroid.core.codec.CodecFeatures; import org.ebookdroid.ui.viewer.stubs.ViewStub; import org.ebookdroid.ui.viewer.viewers.GLView; import org.ebookdroid.ui.viewer.views.ManualCropView; import org.ebookdroid.ui.viewer.views.PageViewZoomControls; import org.ebookdroid.ui.viewer.views.SearchControls; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.util.DisplayMetrics; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Gravity; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.FrameLayout; import android.widget.Toast; import org.emdev.common.android.AndroidVersion; import org.emdev.ui.AbstractActionActivity; import org.emdev.ui.actions.ActionDialogBuilder; import org.emdev.ui.actions.ActionMenuHelper; import org.emdev.ui.gl.GLConfiguration; import org.emdev.ui.uimanager.IUIManager; import org.emdev.utils.LayoutUtils; import org.emdev.utils.LengthUtils; public class ViewerActivity extends AbstractActionActivity<ViewerActivity, ViewerActivityController> { public static final DisplayMetrics DM = new DisplayMetrics(); IView view; private Toast pageNumberToast; private Toast zoomToast; private PageViewZoomControls zoomControls; private SearchControls searchControls; private FrameLayout frameLayout; private TouchManagerView touchView; private boolean menuClosedCalled; private ManualCropView cropControls; /** * Instantiates a new base viewer activity. */ public ViewerActivity() { super(false, ON_CREATE, ON_RESUME, ON_PAUSE, ON_DESTROY); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#createController() */ @Override protected ViewerActivityController createController() { return new ViewerActivityController(this); } /** * {@inheritDoc} * * @see android.app.Activity#onNewIntent(android.content.Intent) */ @Override protected void onNewIntent(final Intent intent) { super.onNewIntent(intent); if (LCTX.isDebugEnabled()) { LCTX.d("onNewIntent(): " + intent); } } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#onCreateImpl(android.os.Bundle) */ @Override protected void onCreateImpl(final Bundle savedInstanceState) { getWindowManager().getDefaultDisplay().getMetrics(DM); LCTX.i("XDPI=" + DM.xdpi + ", YDPI=" + DM.ydpi); View rootLayout = getLayoutInflater().inflate(R.layout.viewer, null); frameLayout = (FrameLayout) rootLayout.findViewById(R.id.framelayout); view = ViewStub.STUB; try { GLConfiguration.checkConfiguration(); view = new GLView(getController()); this.registerForContextMenu(view.getView()); LayoutUtils.fillInParent(frameLayout, view.getView()); frameLayout.addView(view.getView()); frameLayout.addView(getZoomControls()); frameLayout.addView(getManualCropControls()); frameLayout.addView(getSearchControls()); frameLayout.addView(getTouchView()); } catch (final Throwable th) { final ActionDialogBuilder builder = new ActionDialogBuilder(this, getController()); builder.setTitle(R.string.error_dlg_title); builder.setMessage(th.getMessage()); builder.setPositiveButton(R.string.error_close, R.id.mainmenu_close); builder.show(); } setContentView(rootLayout); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#onResumeImpl() */ @Override protected void onResumeImpl() { IUIManager.instance.onResume(this); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#onPauseImpl(boolean) */ @Override protected void onPauseImpl(final boolean finishing) { IUIManager.instance.onPause(this); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#onDestroyImpl(boolean) */ @Override protected void onDestroyImpl(final boolean finishing) { view.onDestroy(); } /** * {@inheritDoc} * * @see android.app.Activity#onWindowFocusChanged(boolean) */ @Override public void onWindowFocusChanged(final boolean hasFocus) { if (hasFocus && this.view != null) { IUIManager.instance.setFullScreenMode(this, this.view.getView(), AppSettings.current().fullScreen); } } public TouchManagerView getTouchView() { if (touchView == null) { touchView = new TouchManagerView(getController()); } return touchView; } public void currentPageChanged(final String pageText) { if (LengthUtils.isEmpty(pageText)) { return; } final AppSettings app = AppSettings.current(); if (UIManagerAppCompat.isToolbarVisible(this) && app.pageInTitle) { return; } if (app.pageNumberToastPosition == ToastPosition.Invisible) { return; } if (pageNumberToast != null) { pageNumberToast.setText(pageText); } else { pageNumberToast = Toast.makeText(this, pageText, Toast.LENGTH_SHORT); } pageNumberToast.setGravity(app.pageNumberToastPosition.position, 0, 0); pageNumberToast.show(); } public void zoomChanged(final float zoom) { if (getZoomControls().isShown()) { return; } final AppSettings app = AppSettings.current(); if (app.zoomToastPosition == ToastPosition.Invisible) { return; } final String zoomText = String.format("%.2f", zoom) + "x"; if (zoomToast != null) { zoomToast.setText(zoomText); } else { zoomToast = Toast.makeText(this, zoomText, Toast.LENGTH_SHORT); } zoomToast.setGravity(app.zoomToastPosition.position, 0, 0); zoomToast.show(); } public PageViewZoomControls getZoomControls() { if (zoomControls == null) { zoomControls = new PageViewZoomControls(this, getController().getZoomModel()); zoomControls.setGravity(Gravity.RIGHT | Gravity.BOTTOM); } return zoomControls; } public SearchControls getSearchControls() { if (searchControls == null) { searchControls = new SearchControls(this); } return searchControls; } public ManualCropView getManualCropControls() { if (cropControls == null) { cropControls = new ManualCropView(getController()); } return cropControls; } /** * {@inheritDoc} * * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, * android.view.ContextMenu.ContextMenuInfo) */ @Override public void onCreateContextMenu(final ContextMenu menu, final View v, final ContextMenuInfo menuInfo) { menu.clear(); menu.setHeaderTitle(R.string.app_name); menu.setHeaderIcon(R.drawable.application_icon); final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.mainmenu_context, menu); updateMenuItems(menu); } /** * {@inheritDoc} * * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu) */ @Override public boolean onCreateOptionsMenu(final Menu menu) { menu.clear(); final MenuInflater inflater = getMenuInflater(); if (hasNormalMenu()) { inflater.inflate(R.menu.mainmenu, menu); } else { inflater.inflate(R.menu.mainmenu_context, menu); } return true; } protected boolean hasNormalMenu() { return IUIManager.instance.isTabletUi(this) || AppSettings.current().showTitle; } /** * {@inheritDoc} * * @see android.app.Activity#onMenuOpened(int, android.view.Menu) */ @Override public boolean onMenuOpened(final int featureId, final Menu menu) { view.changeLayoutLock(true); IUIManager.instance.onMenuOpened(this); return super.onMenuOpened(featureId, menu); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#updateMenuItems(android.view.Menu) */ @Override protected void updateMenuItems(final Menu menu) { final AppSettings as = AppSettings.current(); ActionMenuHelper.setMenuItemChecked(menu, as.fullScreen, R.id.mainmenu_fullscreen); ActionMenuHelper.setMenuItemChecked(menu, as.showTitle, R.id.mainmenu_showtitle); ActionMenuHelper .setMenuItemChecked(menu, getZoomControls().getVisibility() == View.VISIBLE, R.id.mainmenu_zoom); final BookSettings bs = getController().getBookSettings(); if (bs == null) { return; } ActionMenuHelper.setMenuItemChecked(menu, (bs.rotation == RotationType.PORTRAIT || bs.rotation == RotationType.REVERSE_PORTRAIT), R.id.mainmenu_force_portrait); ActionMenuHelper.setMenuItemChecked(menu, (bs.rotation == RotationType.LANDSCAPE || bs.rotation == RotationType.REVERSE_LANDSCAPE), R.id.mainmenu_force_landscape); ActionMenuHelper.setMenuItemChecked(menu, (bs.rotation == RotationType.REVERSE_LANDSCAPE || bs.rotation == RotationType.REVERSE_PORTRAIT), R.id.mainmenu_reverse_orientation); ActionMenuHelper.setMenuItemEnabled(menu, (bs.rotation == RotationType.PORTRAIT || bs.rotation == RotationType.REVERSE_PORTRAIT || bs.rotation == RotationType.LANDSCAPE || bs.rotation == RotationType.REVERSE_LANDSCAPE), R.id.mainmenu_reverse_orientation); ActionMenuHelper.setMenuItemChecked(menu, bs.nightMode, R.id.mainmenu_nightmode); ActionMenuHelper.setMenuItemChecked(menu, bs.cropPages, R.id.mainmenu_croppages); ActionMenuHelper.setMenuItemChecked(menu, bs.splitPages, R.id.mainmenu_splitpages, R.drawable.viewer_menu_split_pages, R.drawable.viewer_menu_split_pages_off); ActionMenuHelper.setMenuItemChecked(menu, bs.viewMode == DocumentViewMode.SINGLE_PAGE, R.id.mainmenu_singlepage); final DecodeService ds = getController().getDecodeService(); final boolean cropSupported = ds.isFeatureSupported(CodecFeatures.FEATURE_CROP_SUPPORT); ActionMenuHelper.setMenuItemVisible(menu, cropSupported, R.id.mainmenu_croppages); ActionMenuHelper.setMenuItemVisible(menu, cropSupported, R.id.mainmenu_crop); final boolean splitSupported = ds.isFeatureSupported(CodecFeatures.FEATURE_SPLIT_SUPPORT); ActionMenuHelper.setMenuItemVisible(menu, splitSupported, R.id.mainmenu_splitpages); final MenuItem navMenu = menu.findItem(R.id.mainmenu_nav_menu); if (navMenu != null) { final SubMenu subMenu = navMenu.getSubMenu(); subMenu.removeGroup(R.id.actions_goToBookmarkGroup); if (AppSettings.current().showBookmarksInMenu && LengthUtils.isNotEmpty(bs.bookmarks)) { for (final Bookmark b : bs.bookmarks) { addBookmarkMenuItem(subMenu, b); } } } } protected void addBookmarkMenuItem(final Menu menu, final Bookmark b) { final MenuItem bmi = menu.add(R.id.actions_goToBookmarkGroup, R.id.actions_goToBookmark, Menu.NONE, b.name); bmi.setIcon(R.drawable.viewer_menu_bookmark); ActionMenuHelper.setMenuItemExtra(bmi, "bookmark", b); } /** * {@inheritDoc} * * @see android.app.Activity#onPanelClosed(int, android.view.Menu) */ @Override public void onPanelClosed(final int featureId, final Menu menu) { menuClosedCalled = false; super.onPanelClosed(featureId, menu); if (!menuClosedCalled) { onOptionsMenuClosed(menu); } } /** * {@inheritDoc} * * @see android.app.Activity#onOptionsMenuClosed(android.view.Menu) */ @Override public void onOptionsMenuClosed(final Menu menu) { menuClosedCalled = true; IUIManager.instance.onMenuClosed(this); view.changeLayoutLock(false); } /** * {@inheritDoc} * * @see android.app.Activity#dispatchKeyEvent(android.view.KeyEvent) */ @Override public final boolean dispatchKeyEvent(final KeyEvent event) { view.checkFullScreenMode(); if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_MENU) { if (!hasNormalMenu()) { getController().getOrCreateAction(R.id.actions_openOptionsMenu).run(); return true; } } if (getController().dispatchKeyEvent(event)) { return true; } return super.dispatchKeyEvent(event); } public void showToastText(final int duration, final int resId, final Object... args) { Toast.makeText(getApplicationContext(), getResources().getString(resId, args), duration).show(); } }