package edu.alaska.gina.feeder.gina_puffinfeeder_android_viewer;
import android.app.Fragment;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import java.util.Arrays;
/**
* Fragment containing WebView that displays a full-sized image.
* Created by bobby on 7/1/13.
*/
class ImageViewerFragment extends Fragment {
private String image_url_small;
private String image_url_med;
private String image_url_large;
private WebView image_frame;
private SharedPreferences sharedPreferences;
private ConnectivityManager connectivityManager;
/** Overridden Methods. */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_image_viewer, container, false);
setHasOptionsMenu(true);
return v;
}
@Override
public void onStart() {
super.onStart();
Bundle extra = getArguments();
image_frame = (WebView) getActivity().findViewById(R.id.fragment_feed_image_webview);
image_frame.getSettings().setBuiltInZoomControls(true);
image_frame.getSettings().setLoadWithOverviewMode(true);
image_frame.setBackgroundColor(Color.parseColor(extra.getString("bg_color", "#000000")));
connectivityManager = getConnectivityManager();
image_frame.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
try {
getActivity().setProgress(newProgress * 100);
if (newProgress >= 0)
getActivity().setProgressBarIndeterminate(false);
if (newProgress >= 100) {
getActivity().setProgressBarVisibility(false);
getActivity().setProgressBarIndeterminateVisibility(false);
}
} catch (NullPointerException e) {
Log.d(getString(R.string.app_tag), "ProgressBar NullPointer!\n" + Arrays.toString(e.getStackTrace()));
}
}
});
image_url_small = extra.getString("image_url_small");
image_url_med = extra.getString("image_url_med");
image_url_large = extra.getString("image_url_large");
String title = extra.getString("bar_title");
if (getActivity().getActionBar() != null)
getActivity().getActionBar().setTitle(title);
getActivity().setProgressBarVisibility(true);
getActivity().setProgressBarIndeterminate(true);
getActivity().setProgressBarIndeterminateVisibility(true);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
sharedPreferences.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
if (isAdded())
loadme(pickLoadSize());
}
});
if (isAdded())
loadme(pickLoadSize());
}
@Override
public void onDetach() {
super.onDetach();
image_frame.destroy();
}
/**
* Determines if the network being used is a mobile network.
* @param net1 The NetworkInfo object representing the network to be tested.
* @return "true" if network is mobile (3/4G). "false" if it is not (wifi).
*/
private boolean isMetered(NetworkInfo net1) {
int type = net1.getType();
switch (type) {
case ConnectivityManager.TYPE_MOBILE:
case ConnectivityManager.TYPE_MOBILE_DUN:
case ConnectivityManager.TYPE_MOBILE_HIPRI:
case ConnectivityManager.TYPE_MOBILE_MMS:
case ConnectivityManager.TYPE_MOBILE_SUPL:
return true;
default:
return false;
}
}
/**
* Determines what sized image to load in the viewer.
* @return URL of image to be loaded.
*/
private String pickLoadSize() {
connectivityManager = getConnectivityManager();
NetworkInfo nf = connectivityManager.getActiveNetworkInfo();
if (nf != null) {
if (isMetered(nf))
return sharedPreferences.getString("pref_smart_sizing_size", "small");
else
return sharedPreferences.getString("pref_viewer_image_size", "med");
}
else {
Log.d(getString(R.string.app_tag), "NetworkInfo null!");
return sharedPreferences.getString("pref_viewer_image_size", "med");
}
}
/**
* Loads the image.
* @param size Size string. Can be "large", "med", or "small".
*/
private void loadme(String size) {
if (size.equals("small") && isTablet())
image_frame.getSettings().setUseWideViewPort(false);
else
image_frame.getSettings().setUseWideViewPort(true);
image_frame.stopLoading();
image_frame.loadUrl(getImageUrl(size));
}
/**
* Determines which url to return based on size choice.
* @param sizeString Size string. Can be "large", "med", or "small".
* @return URL of correct image size.
*/
private String getImageUrl(String sizeString) {
if (sizeString.equals("small"))
return image_url_small;
if (sizeString.equals("med"))
return image_url_med;
if (sizeString.equals("large"))
return image_url_large;
return null;
}
/**
* Grabs the ConnectivityManager object representing the device's networks.
* @return ConnectivityManager of the device.
*/
private ConnectivityManager getConnectivityManager() {
if (isAdded())
return (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
return this.connectivityManager;
}
/**
* Determines if device is a tablet.
* @return "true" if active device screen is greater than 7" in diagonal.
*/
boolean isTablet() {
DisplayMetrics d = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(d);
float hIn = d.heightPixels / d.ydpi;
float wIn = d.widthPixels / d.xdpi;
double diag = Math.sqrt((wIn * wIn) + (hIn * hIn));
return (diag >= 7);
}
}