package com.erakk.lnreader.UI.activity; import android.annotation.SuppressLint; import android.app.DownloadManager; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.erakk.lnreader.Constants; import com.erakk.lnreader.LNReaderApplication; import com.erakk.lnreader.R; import com.erakk.lnreader.UIHelper; import com.erakk.lnreader.callback.ICallbackEventData; import com.erakk.lnreader.callback.IExtendedCallbackNotifier; import com.erakk.lnreader.helper.DisplayNovelContentHtmlHelper; import com.erakk.lnreader.helper.NonLeakingWebView; import com.erakk.lnreader.helper.Util; import com.erakk.lnreader.model.ImageModel; import com.erakk.lnreader.task.AsyncTaskResult; import com.erakk.lnreader.task.LoadImageTask; import java.util.ArrayList; public class DisplayImageActivity extends BaseActivity implements IExtendedCallbackNotifier<AsyncTaskResult<ImageModel>> { private static final String TAG = DisplayImageActivity.class.toString(); private LoadImageTask task; private String url; private String imageUrl; private String parent; private ArrayList<String> images; private int currentImageIndex = 0; private Menu _menu; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display_image); setupWebView(); Intent intent = getIntent(); url = intent.getStringExtra(Constants.EXTRA_IMAGE_URL); parent = intent.getStringExtra(Constants.EXTRA_PAGE); images = intent.getStringArrayListExtra("image_list"); if (images != null) { currentImageIndex = images.indexOf(url); } } public void setupWebView() { NonLeakingWebView imgWebView = (NonLeakingWebView) findViewById(R.id.webViewImage); imgWebView.getSettings().setAllowFileAccess(true); imgWebView.getSettings().setLoadWithOverviewMode(true); imgWebView.getSettings().setUseWideViewPort(true); imgWebView.setBackgroundColor(0); imgWebView.getSettings().setBuiltInZoomControls(UIHelper.getZoomPreferences(this)); imgWebView.setDisplayZoomControl(UIHelper.getZoomControlPreferences(this)); } @Override public void onResume() { super.onResume(); setupWebView(); executeTask(url, false); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putInt("currentImageIndex", currentImageIndex); savedInstanceState.putString(Constants.EXTRA_IMAGE_URL, url); savedInstanceState.putStringArrayList("image_list", images); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); currentImageIndex = savedInstanceState.getInt("currentImageIndex", 0); url = savedInstanceState.getString(Constants.EXTRA_IMAGE_URL); images = savedInstanceState.getStringArrayList("image_list"); } @Override protected void onDestroy() { super.onDestroy(); NonLeakingWebView imgWebView = (NonLeakingWebView) findViewById(R.id.webViewImage); if (imgWebView != null) { RelativeLayout rootView = (RelativeLayout) findViewById(R.id.rootView); rootView.removeView(imgWebView); imgWebView.removeAllViews(); imgWebView.destroy(); } } @SuppressLint("NewApi") private void executeTask(String url, boolean refresh) { NonLeakingWebView imgWebView = (NonLeakingWebView) findViewById(R.id.webViewImage); task = new LoadImageTask(url, parent, refresh, this); String key = TAG + ":" + url; boolean isAdded = LNReaderApplication.getInstance().addTask(key, task); if (isAdded) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); else task.execute(); } else { LoadImageTask tempTask = (LoadImageTask) LNReaderApplication.getInstance().getTask(key); if (tempTask != null) { task = tempTask; task.callback = this; } toggleProgressBar(true); } setPrevNextButtonState(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_display_image, menu); _menu = menu; setPrevNextButtonState(); return true; } private void setPrevNextButtonState() { if (_menu != null) { boolean isNextEnabled = false; boolean isPrevEnabled = false; if (images != null && images.size() > 0) { Log.d(TAG, "Image Count: " + images.size()); if (currentImageIndex > 0) isPrevEnabled = true; if (images.size() != 1 && currentImageIndex < images.size() - 1) isNextEnabled = true; } _menu.findItem(R.id.menu_chapter_next).setEnabled(isNextEnabled); _menu.findItem(R.id.menu_chapter_previous).setEnabled(isPrevEnabled); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_refresh_image: /* * Implement code to refresh image content */ executeTask(url, true); return true; case R.id.menu_chapter_previous: currentImageIndex--; url = images.get(currentImageIndex); executeTask(url, false); return true; case R.id.menu_chapter_next: currentImageIndex++; url = images.get(currentImageIndex); executeTask(url, false); return true; case R.id.menu_download_image: if( !Util.isStringNullOrEmpty(imageUrl)) { String temp[] = url.split("/"); String filename = temp[temp.length - 1]; filename = filename.replace("index.php?title=File:", ""); if(imageUrl.startsWith("file://")) { String dest = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/" + filename; try{ Util.copyFile(imageUrl.toString().replace("file://", ""), dest); Toast.makeText(this, "Image saved to: " + dest, Toast.LENGTH_SHORT).show(); } catch (Exception ex) { Log.e(TAG, ex.getMessage(), ex); Toast.makeText(this, "Failed to save image to: " + dest, Toast.LENGTH_LONG).show(); } } else { DownloadManager.Request request = new DownloadManager.Request(Uri.parse(imageUrl)); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); dm.enqueue(request); } } return true; case android.R.id.home: super.onBackPressed(); return true; } return super.onOptionsItemSelected(item); } public void toggleProgressBar(boolean show) { NonLeakingWebView imgWebView = (NonLeakingWebView) findViewById(R.id.webViewImage); TextView loadingText = (TextView) findViewById(R.id.emptyList); ProgressBar loadingBar = (ProgressBar) findViewById(R.id.loadProgress); if (imgWebView == null || loadingBar == null || loadingText == null) return; if (show) { loadingText.setVisibility(TextView.VISIBLE); loadingBar.setVisibility(ProgressBar.VISIBLE); imgWebView.setVisibility(View.GONE); } else { loadingText.setVisibility(TextView.GONE); loadingBar.setVisibility(ProgressBar.GONE); imgWebView.setVisibility(View.VISIBLE); } } @Override public boolean downloadListSetup(String id, String toastText, int type, boolean hasError) { Log.d(TAG, "Setup of " + id + ": " + toastText + " (type: " + type + ")" + "hasError: " + hasError); return false; } @Override public void onCompleteCallback(ICallbackEventData message, AsyncTaskResult<ImageModel> result) { if (result == null) return; Exception e = result.getError(); if (e == null) { if (result.getResultType() == ImageModel.class) { ImageModel imageModel = result.getResult(); if (!Util.isStringNullOrEmpty(imageModel.getPath())) { imageUrl = "file:///" + Util.sanitizeFilename(imageModel.getPath()); imageUrl = imageUrl.replace("file:////", "file:///"); NonLeakingWebView imgWebView = (NonLeakingWebView) findViewById(R.id.webViewImage); if (imgWebView != null) { StringBuilder html = new StringBuilder(); html.append("<html><head>"); html.append(DisplayNovelContentHtmlHelper.getViewPortMeta()); html.append("</head><body>"); html.append("<img src=\"" + imageUrl + "\"></img>"); html.append("</body></html>"); //imgWebView.loadUrl(imageUrl); imgWebView.loadDataWithBaseURL("file://", html.toString(), "text/html", "utf-8", null); } String title = imageModel.getName(); setTitle(title.substring(title.lastIndexOf("/"))); //Toast.makeText(this, String.format("Loaded: %s", imageUrl), Toast.LENGTH_SHORT).show(); Log.d("LoadImageTask", "Loaded: " + imageUrl); } else { Log.e(TAG, "Cannot get the image path."); Toast.makeText(this, "Cannot load the image.", Toast.LENGTH_SHORT).show(); } } else { Log.w(TAG, "Getting unexpected class: " + result.getResultType().getName()); } } else { Log.e(TAG, "Cannot load image.", e); Toast.makeText(this, e.getClass() + ": " + e.getMessage(), Toast.LENGTH_SHORT).show(); } toggleProgressBar(false); } @Override public void onProgressCallback(ICallbackEventData message) { toggleProgressBar(true); TextView loadingText = (TextView) findViewById(R.id.emptyList); ProgressBar loadingBar = (ProgressBar) findViewById(R.id.loadProgress); loadingText.setText(message.getMessage()); synchronized (this) { if (message.getPercentage() > -1) { // android progress bar bug // see: http://stackoverflow.com/a/4352073 loadingBar.setIndeterminate(false); loadingBar.setMax(100); loadingBar.setProgress(message.getPercentage()); loadingBar.setProgress(0); loadingBar.setProgress(message.getPercentage()); loadingBar.setMax(100); } else { loadingBar.setIndeterminate(true); } } } }