private Bitmap getBitmap(int page) {
    Bitmap bitmap = null;
    if (cache != null && cache.containsKey("page_" + page)) {
      SoftReference<Bitmap> bitmapRef = cache.get("page_" + page);
      bitmap = bitmapRef.get();
      Log.d(TAG, "reading image for page " + page + " from cache!");
    } else {
      Log.d(TAG, "loading image for page " + page + " from sdcard");
    }

    boolean outOfMemory = false;
    // Bitmap not found in cache..
    if (bitmap == null) {
      String filename = mContext.getPageFileName(page);
      try {
        bitmap = QuranUtils.getImageFromSD(filename);
      } catch (OutOfMemoryError oe) {
        bitmap = null;
        outOfMemory = true;
        mHasBeenOutOfMemory = true;
      }

      // Add Bitmap to cache..
      if (bitmap != null) {
        cache.put("page_" + page, new SoftReference<Bitmap>(bitmap));
        Log.d(TAG, "page " + page + " added to cache!");
      } else {
        if (!outOfMemory) {
          Log.d(TAG, "page " + page + " not found on sdcard");
          bitmap = QuranUtils.getImageFromWeb(filename);
        }

        if (bitmap != null) cache.put("page_" + page, new SoftReference<Bitmap>(bitmap));
        else
          Log.d(
              TAG,
              "page "
                  + page
                  + " could not be fetched "
                  + (outOfMemory ? "due to being out of memory" : "from the web"));
      }
    }

    return bitmap;
  }
 @Override
 public void bind(BookmarksFragment fragment) {
   mFragment = fragment;
   boolean isRtl = mQuranSettings.isArabicNames() || QuranUtils.isRtl();
   if (isRtl == mIsRtl) {
     requestData(true);
   } else {
     // don't use the cache if rtl changed
     mIsRtl = isRtl;
     requestData(false);
   }
 }
 @Override
 protected void onPostExecute(RectF[] rect) {
   if (rect != null && rect.length == 1 && isAdded()) {
     mImageView.setPageBounds(rect[0]);
     if (overlayText) {
       int page = pageNumber;
       Context context = getContext();
       String suraText = QuranInfo.getSuraNameFromPage(context, page, true);
       String juzText = QuranInfo.getJuzString(context, page);
       String pageText = QuranUtils.getLocalizedNumber(context, page);
       String rub3Text = QuranDisplayHelper.displayRub3(context, page);
       mImageView.setOverlayText(suraText, juzText, pageText, rub3Text);
     }
   }
 }