/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAlertBuilder = new AlertDialog.Builder(this); if (core == null) { core = (MuPDFCore) getLastNonConfigurationInstance(); if (savedInstanceState != null && savedInstanceState.containsKey("FileName")) { mFileName = savedInstanceState.getString("FileName"); } } if (core == null) { Intent intent = getIntent(); if (Intent.ACTION_VIEW.equals(intent.getAction())) { Uri uri = intent.getData(); if (uri.toString().startsWith("content://")) { // Handle view requests from the Transformer Prime's file manager // Hopefully other file managers will use this same scheme, if not // using explicit paths. Cursor cursor = getContentResolver().query(uri, new String[] {"_data"}, null, null, null); if (cursor.moveToFirst()) { uri = Uri.parse(cursor.getString(0)); } } core = openFile(Uri.decode(uri.getEncodedPath())); SearchTaskResult.set(null); } if (core != null && core.needsPassword()) { requestPassword(savedInstanceState); return; } } if (core == null) { AlertDialog alert = mAlertBuilder.create(); alert.setTitle(R.string.open_failed); alert.setButton( AlertDialog.BUTTON_POSITIVE, "Dismiss", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }); alert.show(); return; } createUI(savedInstanceState); }
void showButtons() { if (core == null) return; if (!mButtonsVisible) { mButtonsVisible = true; // Update page number text and slider int index = mDocView.getDisplayedViewIndex(); updatePageNumView(index); mPageSlider.setMax((core.countPages() - 1) * mPageSliderRes); mPageSlider.setProgress(index * mPageSliderRes); if (mTopBarIsSearch) { mSearchText.requestFocus(); showKeyboard(); } Animation anim = new TranslateAnimation(0, 0, -mTopBarSwitcher.getHeight(), 0); anim.setDuration(200); anim.setAnimationListener( new Animation.AnimationListener() { public void onAnimationStart(Animation animation) { mTopBarSwitcher.setVisibility(View.VISIBLE); } public void onAnimationRepeat(Animation animation) {} public void onAnimationEnd(Animation animation) {} }); mTopBarSwitcher.startAnimation(anim); anim = new TranslateAnimation(0, 0, mPageSlider.getHeight(), 0); anim.setDuration(200); anim.setAnimationListener( new Animation.AnimationListener() { public void onAnimationStart(Animation animation) { mPageSlider.setVisibility(View.VISIBLE); } public void onAnimationRepeat(Animation animation) {} public void onAnimationEnd(Animation animation) { mPageNumberView.setVisibility(View.VISIBLE); } }); mPageSlider.startAnimation(anim); } }
void search(int direction) { hideKeyboard(); if (core == null) return; killSearch(); final int increment = direction; final int startIndex = SearchTaskResult.get() == null ? mDocView.getDisplayedViewIndex() : SearchTaskResult.get().pageNumber + increment; final ProgressDialogX progressDialog = new ProgressDialogX(this); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setTitle(getString(R.string.searching_)); progressDialog.setOnCancelListener( new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { killSearch(); } }); progressDialog.setMax(core.countPages()); mSearchTask = new SafeAsyncTask<Void, Integer, SearchTaskResult>() { @Override protected SearchTaskResult doInBackground(Void... params) { int index = startIndex; while (0 <= index && index < core.countPages() && !isCancelled()) { publishProgress(index); RectF searchHits[] = core.searchPage(index, mSearchText.getText().toString()); if (searchHits != null && searchHits.length > 0) return new SearchTaskResult(mSearchText.getText().toString(), index, searchHits); index += increment; } return null; } @Override protected void onPostExecute(SearchTaskResult result) { progressDialog.cancel(); if (result != null) { // Ask the ReaderView to move to the resulting page mDocView.setDisplayedViewIndex(result.pageNumber); SearchTaskResult.set(result); // Make the ReaderView act on the change to mSearchTaskResult // via overridden onChildSetup method. mDocView.resetupChildren(); } else { mAlertBuilder.setTitle( SearchTaskResult.get() == null ? R.string.text_not_found : R.string.no_further_occurences_found); AlertDialog alert = mAlertBuilder.create(); alert.setButton( AlertDialog.BUTTON_POSITIVE, "Dismiss", (DialogInterface.OnClickListener) null); alert.show(); } } @Override protected void onCancelled() { super.onCancelled(); progressDialog.cancel(); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); progressDialog.setProgress(values[0].intValue()); } @Override protected void onPreExecute() { super.onPreExecute(); mHandler.postDelayed( new Runnable() { public void run() { if (!progressDialog.isCancelled()) { progressDialog.show(); progressDialog.setProgress(startIndex); } } }, SEARCH_PROGRESS_DELAY); } }; mSearchTask.safeExecute(); }
void updatePageNumView(int index) { if (core == null) return; mPageNumberView.setText(String.format("%d/%d", index + 1, core.countPages())); }
public void onDestroy() { if (core != null) core.onDestroy(); core = null; super.onDestroy(); }
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); }