package kr.kdev.dg1s.biowiki.ui.info.viewer; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; import net.htmlparser.jericho.Attribute; import net.htmlparser.jericho.Attributes; import net.htmlparser.jericho.Element; import net.htmlparser.jericho.Source; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import kr.kdev.dg1s.biowiki.BioWiki; import kr.kdev.dg1s.biowiki.Constants; import kr.kdev.dg1s.biowiki.R; import kr.kdev.dg1s.biowiki.ui.BIActionBarActivity; import kr.kdev.dg1s.biowiki.ui.info.common.utils.PlantInfoFetcher; public class PlantInformationViewerActivity extends BIActionBarActivity { LinearLayout infoContainer; ViewPager pager = null; MainPagerAdapter pagerAdapter = null; ImageLoaderConfiguration config; DisplayImageOptions options; Context context; Source dictionaryAssets; @Override public void onCreate(Bundle savedInstanceState) { title = getString(R.string.plantInformationTitle); super.onCreate(savedInstanceState); setContentView(R.layout.bioinfo_plant_details); getSupportActionBar().setDisplayHomeAsUpEnabled(true); try { initializeGlobalVariables(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(context, "Unable to initialize blank linear layout", Toast.LENGTH_SHORT).show(); } Log.d("Bundle is", " " + (savedInstanceState != null)); Log.d("Bundle", getIntent().getStringExtra("plant") + (savedInstanceState != null)); displayContents(getIntent().getStringExtra("plant")); } public void displayContents(String name) { PlantInfoFetcher fetcher = new PlantInfoFetcher(name, context); if (fetcher.hasImages) { while (pagerAdapter.getCount() != 0) { pagerAdapter.removeView(pager, 0); } pagerAdapter.notifyDataSetChanged(); for (String fileName : fetcher.images) { ImageView imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); ImageLoader imageLoader = ImageLoader.getInstance(); imageLoader.init(config); imageLoader.displayImage(BioWiki.getCurrentBlog().getHomeURL() + "repo/IMG/" + fileName, imageView); addView(imageView); } pager.setVisibility(View.VISIBLE); } else { pager.setVisibility(View.GONE); } for (ArrayList<String> details : fetcher.plantDetails) { infoContainer.addView(plantDetails(details.get(0), details.get(1))); } TextView plantName = (TextView) infoContainer.findViewById(R.id.plant_name); plantName.setText(name); } View plantDetails(String token, String value) { LinearLayout plantDetails = (LinearLayout) LayoutInflater.from(context) .inflate(R.layout.plant_detail_adapter, null); TextView name = (TextView) plantDetails.findViewById(R.id.name); TextView details = (TextView) plantDetails.findViewById(R.id.details); name.setText(token); name.setTextColor(getResources().getColor(R.color.black)); details.setText(value); details.setTextColor(getResources().getColor(R.color.black)); return plantDetails; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Menu is defined inside 'res/menu/...xml getSupportMenuInflater().inflate(R.menu.plant_viewer, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem menu) { switch (menu.getItemId()) { case android.R.id.home: finish(); return true; case R.id.gotoChart: Intent intent = new Intent(this, ChartViewerActivity.class); startActivity(intent); return true; default: return super.onOptionsItemSelected(menu); } } // Create global configuration and initialize ImageLoader with this configuration public void initializeGlobalVariables() throws IOException { dictionaryAssets = new Source(getResources().getAssets().open("xmls/kingdom.xml")); // Direct child of ScrollView infoContainer = (LinearLayout) findViewById(R.id.details); // Image pagers pagerAdapter = new MainPagerAdapter(); pager = (ViewPager) findViewById(R.id.viewpager); pager.setAdapter(pagerAdapter); /* pager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { v.getParent().getParent().getParent().requestDisallowInterceptTouchEvent(true); return false; } }); */ pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { pager.getParent().requestDisallowInterceptTouchEvent(true); } @Override public void onPageScrollStateChanged(int arg0) { } }); // Get context context = getApplicationContext(); // AUIL stuff options = Constants.imageOptions; config = new ImageLoaderConfiguration.Builder(context) .threadPoolSize(4) .discCache(new UnlimitedDiscCache(getCacheDir())) .discCacheSize(200 * 1024 * 1024) .discCacheFileNameGenerator(new Md5FileNameGenerator()) .writeDebugLogs() .defaultDisplayImageOptions(options) .discCacheFileCount(1000) .build(); } /** * Below are methods for pagers */ // Here's what the app should do to add a view to the ViewPager. public void addView(View newPage) { pagerAdapter.addView(newPage); pagerAdapter.notifyDataSetChanged(); } // Here's what the app should do to remove a view from the ViewPager. public void removeView(View defunctPage) { int pageIndex = pagerAdapter.removeView(pager, defunctPage); // You might want to choose what page to display, if the current page was "defunctPage". if (pageIndex == pagerAdapter.getCount()) pageIndex--; pager.setCurrentItem(pageIndex); pagerAdapter.notifyDataSetChanged(); } // Here's what the app should do to get the currently displayed page. public View getCurrentPage() { return pagerAdapter.getView(pager.getCurrentItem()); } // Here's what the app should do to set the currently displayed page. "pageToShow" must // currently be in the adapter, or this will crash. public void setCurrentPage(View pageToShow) { pager.setCurrentItem(pagerAdapter.getItemPosition(pageToShow), true); } /** * Pager methods ends here */ public static class MainPagerAdapter extends PagerAdapter { // This holds all the currently displayable views, in order from left to right. private ArrayList<View> views = new ArrayList<View>(); // Used by ViewPager. "Object" represents the page; tell the ViewPager where the // page should be displayed, from left-to-right. If the page no longer exists, // return POSITION_NONE. @Override public int getItemPosition(Object object) { int index = views.indexOf(object); if (index == -1) return POSITION_NONE; else return index; } // Used by ViewPager. Called when ViewPager needs a page to display; it is our job // to add the page to the container, which is normally the ViewPager itself. Since // all our pages are persistent, we simply retrieve it from our "views" ArrayList. @Override public Object instantiateItem(ViewGroup container, int position) { View v = views.get(position); container.addView(v); return v; } // Used by ViewPager. Called when ViewPager no longer needs a page to display; it // is our job to remove the page from the container, which is normally the // ViewPager itself. Since all our pages are persistent, we do nothing to the // contents of our "views" ArrayList. @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(views.get(position)); } // Used by ViewPager; can be used by app as well. // Returns the total number of pages that the ViewPage can display. This must // never be 0. @Override public int getCount() { return views.size(); } // Used by ViewPager. @Override public boolean isViewFromObject(View view, Object object) { return view == object; } // Add "view" to right end of "views". // Returns the position of the new view. // The app should call this to add pages; not used by ViewPager. public int addView(View v) { return addView(v, views.size()); } // Add "view" at "position" to "views". // Returns position of new view. // The app should call this to add pages; not used by ViewPager. public int addView(View v, int position) { views.add(position, v); return position; } // Removes "view" from "views". // Retuns position of removed view. // The app should call this to remove pages; not used by ViewPager. public int removeView(ViewPager pager, View v) { return removeView(pager, views.indexOf(v)); } // Removes the "view" at "position" from "views". // Retuns position of removed view. // The app should call this to remove pages; not used by ViewPager. public int removeView(ViewPager pager, int position) { // ViewPager doesn't have a delete method; the closest is to set the adapter // again. When doing so, it deletes all its views. Then we can delete the view // from from the adapter and finally set the adapter to the pager again. Note // that we set the adapter to null before removing the view from "views" - that's // because while ViewPager deletes all its views, it will call destroyItem which // will in turn cause a null pointer ref. pager.setAdapter(null); views.remove(position); pager.setAdapter(this); return position; } // Returns the "view" at "position". // The app should call this to retrieve a view; not used by ViewPager. public View getView(int position) { return views.get(position); } // Other relevant methods: // finishUpdate - called by the ViewPager - we don't care about what pages the // pager is displaying so we don't use this method. } }