예제 #1
0
  /** 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);
  }
예제 #2
0
  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);
    }
  }
예제 #3
0
  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();
  }
예제 #4
0
 void updatePageNumView(int index) {
   if (core == null) return;
   mPageNumberView.setText(String.format("%d/%d", index + 1, core.countPages()));
 }
예제 #5
0
 public void onDestroy() {
   if (core != null) core.onDestroy();
   core = null;
   super.onDestroy();
 }
예제 #6
0
  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);
  }