package carnero.cgeo; import java.util.ArrayList; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.net.Uri; import android.app.Activity; import android.app.ProgressDialog; import android.util.Log; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.LinearLayout; import android.content.Intent; import android.content.res.Resources; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.view.ViewGroup.LayoutParams; public class cgeospoilers extends Activity { private ArrayList<cgSpoiler> spoilers = new ArrayList<cgSpoiler>(); private Resources res = null; private String geocode = null; private cgeoapplication app = null; private Activity activity = null; private cgSettings settings = null; private cgBase base = null; private cgWarning warning = null; private LayoutInflater inflater = null; private ProgressDialog progressDialog = null; private ProgressDialog waitDialog = null; private LinearLayout spoilerView = null; private int offline = 0; private int count = 0; private int countDone = 0; private Handler loadSpoilersHandler = new Handler() { @Override public void handleMessage(Message msg) { try { if (spoilers.isEmpty()) { if (waitDialog != null) { waitDialog.dismiss(); } warning.showToast("Sorry, c:geo failed to load spoiler images."); finish(); return; } else { if (waitDialog != null) { waitDialog.dismiss(); } if (app.isOffline(geocode, null) == true) { offline = 1; } else { offline = 0; } count = spoilers.size(); progressDialog = new ProgressDialog(activity); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage(res.getString(R.string.cache_spoiler_images_loading)); progressDialog.setCancelable(true); progressDialog.setMax(count); progressDialog.show(); LinearLayout rowView = null; for (final cgSpoiler spl : spoilers) { rowView = (LinearLayout) inflater.inflate(R.layout.spoiler_item, null); ((TextView) rowView.findViewById(R.id.title)).setText(Html.fromHtml(spl.title)); if (spl.description != null && spl.description.length() > 0) { final TextView descView = (TextView) rowView.findViewById(R.id.description); descView.setText(Html.fromHtml(spl.description), TextView.BufferType.SPANNABLE); descView.setVisibility(View.VISIBLE); } final Handler handler = new onLoadHandler(rowView, spl); new Thread() { @Override public void run() { BitmapDrawable image = null; try { cgHtmlImg imgGetter = new cgHtmlImg(activity, settings, geocode, true, offline, false); image = imgGetter.getDrawable(spl.url); Message message = handler.obtainMessage(0, image); handler.sendMessage(message); } catch (Exception e) { Log.e(cgSettings.tag, "cgeospoilers.onCreate.onClick.run: " + e.toString()); } } }.start(); spoilerView.addView(rowView); } } } catch (Exception e) { if (waitDialog != null) { waitDialog.dismiss(); } Log.e(cgSettings.tag, "cgeospoilers.loadSpoilersHandler: " + e.toString()); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // init activity = this; res = this.getResources(); app = (cgeoapplication) this.getApplication(); settings = new cgSettings(this, getSharedPreferences(cgSettings.preferences, 0)); base = new cgBase(app, settings, getSharedPreferences(cgSettings.preferences, 0)); warning = new cgWarning(this); // set layout if (settings.skin == 1) { setTheme(R.style.light); } else { setTheme(R.style.dark); } setContentView(R.layout.spoilers); base.setTitle(activity, res.getString(R.string.cache_spoiler_images_title)); // google analytics base.sendAnal(activity, "/spoilers"); // get parameters Bundle extras = getIntent().getExtras(); // try to get data from extras if (extras != null) { geocode = extras.getString("geocode"); } if (geocode == null) { warning.showToast("Sorry, c:geo forgot for what cache you want to load spoiler images."); finish(); return; } inflater = activity.getLayoutInflater(); if (spoilerView == null) { spoilerView = (LinearLayout) findViewById(R.id.spoiler_list); } waitDialog = ProgressDialog.show(this, null, res.getString(R.string.cache_spoiler_images_loading), true); waitDialog.setCancelable(true); (new loadSpoilers()).start(); } @Override public void onResume() { super.onResume(); settings.load(); } private class loadSpoilers extends Thread { @Override public void run() { try { spoilers = app.loadSpoilers(geocode); loadSpoilersHandler.sendMessage(new Message()); } catch (Exception e) { Log.e(cgSettings.tag, "cgeospoilers.loadSpoilers.run: " + e.toString()); } } } private class onLoadHandler extends Handler { LinearLayout view = null; cgSpoiler spoiler = null; public onLoadHandler(LinearLayout view, cgSpoiler spoiler) { this.view = view; this.spoiler = spoiler; } @Override public void handleMessage(Message message) { BitmapDrawable image = (BitmapDrawable) message.obj; if (image != null) { ImageView spoilerImage = null; spoilerImage = (ImageView) inflater.inflate(R.layout.image_item, null); Rect bounds = image.getBounds(); spoilerImage.setImageResource(R.drawable.image_not_loaded); spoilerImage.setClickable(true); spoilerImage.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(spoiler.url))); } }); spoilerImage.setImageDrawable((BitmapDrawable) message.obj); spoilerImage.setScaleType(ImageView.ScaleType.CENTER_CROP); spoilerImage.setLayoutParams(new LayoutParams(bounds.width(), bounds.height())); view.addView(spoilerImage); } countDone++; progressDialog.setProgress(countDone); if (progressDialog.getProgress() >= count) { progressDialog.dismiss(); } } } public void goHome(View view) { base.goHome(activity); } }