package kr.kdev.dg1s.biowiki.ui.info.viewer; import android.content.Context; 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.app.SherlockFragment; 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; public class PlantInformationFragment extends SherlockFragment { LinearLayout infoContainer; ViewPager pager = null; MainPagerAdapter pagerAdapter = null; ImageLoaderConfiguration config; DisplayImageOptions options; Context context; Source dictionaryAssets; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.bioinfo_plant_details, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); 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", getArguments().getString("plant") + (savedInstanceState != null)); displayContents(getArguments().getString("plant")); } // 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) getView().findViewById(R.id.details); // Image pagers pagerAdapter = new MainPagerAdapter(); pager = (ViewPager) getView().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 = getActivity().getApplicationContext(); // AUIL stuff options = Constants.imageOptions; config = new ImageLoaderConfiguration.Builder(context) .threadPoolSize(4) .discCache(new UnlimitedDiscCache(getActivity().getCacheDir())) .discCacheSize(200 * 1024 * 1024) .discCacheFileNameGenerator(new Md5FileNameGenerator()) .writeDebugLogs() .defaultDisplayImageOptions(options) .discCacheFileCount(1000) .build(); } 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); if (token.equals("name")) { name.setText("이름"); } else if (token.equals("stump")) { name.setText("줄기"); } else if (token.equals("leaf")) { name.setText("잎"); } else if (token.equals("flower")) { name.setText("꽃"); } else if (token.equals("fruit")) { name.setText("열매"); } else if (token.equals("chromo")) { name.setText("핵상"); } else if (token.equals("place")) { name.setText("서식지"); } else if (token.equals("horizon")) { name.setText("수평분포"); } else if (token.equals("vertical")) { name.setText("수직분포"); } else if (token.equals("geograph")) { name.setText("식생지리"); } else if (token.equals("vegetat")) { name.setText("식생형"); } else if (token.equals("preserve")) { name.setText("종보존등급"); } else { name.setText("기타"); } name.setTextColor(getResources().getColor(R.color.black)); details.setText(value); details.setTextColor(getResources().getColor(R.color.black)); return plantDetails; } public void displayContents(String name) { Log.d("XML", "Searching for details on " + name); Element element = dictionaryAssets.getFirstElement("name", name, false); if (element == null) { super.onDestroy(); } Attributes attributes = element.getAttributes(); for (Attribute attribute : attributes) { if (attribute.getName().equals("image")) { if (!(attribute.getValue().equals(""))) { // Delete all child views and make pager visible pager.setVisibility(View.VISIBLE); while (pagerAdapter.getCount() != 0) { pagerAdapter.removeView(pager, 0); } pagerAdapter.notifyDataSetChanged(); for (String filename : Arrays.asList(attribute.getValue().split(" "))) { 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.toUpperCase(), imageView); addView(imageView); } } else { pager.setVisibility(View.GONE); } } else { infoContainer.addView(plantDetails(attribute.getName(), attribute.getValue())); } } TextView plantName = (TextView) infoContainer.findViewById(R.id.plant_name); plantName.setText(name); } @Override public void onResume() { super.onResume(); } /** * 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. } }