public void createUI(Bundle savedInstanceState) { if (core == null) return; // Now create the UI. // First create the document view making use of the ReaderView's internal // gesture recognition mDocView = new ReaderView(this) { private boolean showButtonsDisabled; public boolean onSingleTapUp(MotionEvent e) { if (!showButtonsDisabled) { MuPDFPageView pageView = (MuPDFPageView) mDocView.getDisplayedView(); if (MuPDFCore.javascriptSupported() && pageView.passClickEvent(e.getX(), e.getY())) { // If the page consumes the event do nothing else } else if (e.getX() < super.getWidth() / TAP_PAGE_MARGIN) { super.moveToPrevious(); } else if (e.getX() > super.getWidth() * (TAP_PAGE_MARGIN - 1) / TAP_PAGE_MARGIN) { super.moveToNext(); } else { int linkPage = -1; if (mLinkState != LinkState.INHIBIT) { if (pageView != null) { // XXX linkPage = pageView.hitLinkPage(e.getX(), e.getY()); } } if (linkPage != -1) { mDocView.setDisplayedViewIndex(linkPage); } else { if (!mButtonsVisible) { showButtons(); } else { hideButtons(); } } } } return super.onSingleTapUp(e); } public boolean onScroll( MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (!showButtonsDisabled) hideButtons(); return super.onScroll(e1, e2, distanceX, distanceY); } public boolean onScaleBegin(ScaleGestureDetector d) { // Disabled showing the buttons until next touch. // Not sure why this is needed, but without it // pinch zoom can make the buttons appear showButtonsDisabled = true; return super.onScaleBegin(d); } public boolean onTouchEvent(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) showButtonsDisabled = false; return super.onTouchEvent(event); } protected void onChildSetup(int i, View v) { if (SearchTaskResult.get() != null && SearchTaskResult.get().pageNumber == i) ((PageView) v).setSearchBoxes(SearchTaskResult.get().searchBoxes); else ((PageView) v).setSearchBoxes(null); ((PageView) v).setLinkHighlighting(mLinkState == LinkState.HIGHLIGHT); } protected void onMoveToChild(int i) { if (core == null) return; mPageNumberView.setText(String.format("%d/%d", i + 1, core.countPages())); mPageSlider.setMax((core.countPages() - 1) * mPageSliderRes); mPageSlider.setProgress(i * mPageSliderRes); if (SearchTaskResult.get() != null && SearchTaskResult.get().pageNumber != i) { SearchTaskResult.set(null); mDocView.resetupChildren(); } } protected void onSettle(View v) { // When the layout has settled ask the page to render // in HQ ((PageView) v).addHq(false); } protected void onUnsettle(View v) { // When something changes making the previous settled view // no longer appropriate, tell the page to remove HQ ((PageView) v).removeHq(); } @Override protected void onNotInUse(View v) { ((PageView) v).releaseResources(); } }; mDocView.setAdapter(new MuPDFPageAdapter(this, core)); // Make the buttons overlay, and store all its // controls in variables makeButtonsView(); // Set up the page slider int smax = Math.max(core.countPages() - 1, 1); mPageSliderRes = ((10 + smax - 1) / smax) * 2; // Set the file-name text mFilenameView.setText(mFileName); // Activate the seekbar mPageSlider.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener() { public void onStopTrackingTouch(SeekBar seekBar) { mDocView.setDisplayedViewIndex( (seekBar.getProgress() + mPageSliderRes / 2) / mPageSliderRes); } public void onStartTrackingTouch(SeekBar seekBar) {} public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { updatePageNumView((progress + mPageSliderRes / 2) / mPageSliderRes); } }); // Activate the search-preparing button mSearchButton.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { searchModeOn(); } }); mCancelButton.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { searchModeOff(); } }); // Search invoking buttons are disabled while there is no text specified mSearchBack.setEnabled(false); mSearchFwd.setEnabled(false); // React to interaction with the text widget mSearchText.addTextChangedListener( new TextWatcher() { public void afterTextChanged(Editable s) { boolean haveText = s.toString().length() > 0; mSearchBack.setEnabled(haveText); mSearchFwd.setEnabled(haveText); // Remove any previous search results if (SearchTaskResult.get() != null && !mSearchText.getText().toString().equals(SearchTaskResult.get().txt)) { SearchTaskResult.set(null); mDocView.resetupChildren(); } } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void onTextChanged(CharSequence s, int start, int before, int count) {} }); // React to Done button on keyboard mSearchText.setOnEditorActionListener( new TextView.OnEditorActionListener() { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) search(1); return false; } }); mSearchText.setOnKeyListener( new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) search(1); return false; } }); // Activate search invoking buttons mSearchBack.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { search(-1); } }); mSearchFwd.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { search(1); } }); /* XXX mLinkButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { switch(mLinkState) { case DEFAULT: mLinkState = LinkState.HIGHLIGHT; mLinkButton.setImageResource(R.drawable.ic_hl_link); //Inform pages of the change. mDocView.resetupChildren(); break; case HIGHLIGHT: mLinkState = LinkState.INHIBIT; mLinkButton.setImageResource(R.drawable.ic_nolink); //Inform pages of the change. mDocView.resetupChildren(); break; case INHIBIT: mLinkState = LinkState.DEFAULT; mLinkButton.setImageResource(R.drawable.ic_link); break; } } }); */ if (core.hasOutline()) { mOutlineButton.setOnClickListener( new View.OnClickListener() { public void onClick(View v) { OutlineItem outline[] = core.getOutline(); if (outline != null) { OutlineActivityData.get().items = outline; Intent intent = new Intent(MuPDFActivity.this, OutlineActivity.class); startActivityForResult(intent, 0); } } }); } else { mOutlineButton.setVisibility(View.GONE); } // Reenstate last state if it was recorded SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE); mDocView.setDisplayedViewIndex(prefs.getInt("page" + mFileName, 0)); if (savedInstanceState == null || !savedInstanceState.getBoolean("ButtonsHidden", false)) showButtons(); if (savedInstanceState != null && savedInstanceState.getBoolean("SearchMode", false)) searchModeOn(); // Stick the document view and the buttons overlay into a parent view RelativeLayout layout = new RelativeLayout(this); layout.addView(mDocView); layout.addView(mButtonsView); layout.setBackgroundResource(R.drawable.tiled_background); // layout.setBackgroundResource(R.color.canvas); setContentView(layout); }