/** Copyright 2015 Tim Engler, Rareventure LLC This file is part of Tiny Travel Tracker. Tiny Travel Tracker is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Tiny Travel Tracker is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Tiny Travel Tracker. If not, see <http://www.gnu.org/licenses/>. */ package com.rareventure.gps2.reviewer.map; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.TimeZone; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.BaseAdapter; import android.widget.FrameLayout; import android.widget.Gallery; import android.widget.ImageView; import android.widget.TextView; import com.rareventure.gps2.R; import com.rareventure.android.Util; import com.rareventure.gps2.GTG; import com.rareventure.gps2.database.cache.MediaLocTime; import com.rareventure.gps2.reviewer.imageviewer.ViewImage; public class MediaGalleryFragment extends Fragment { private ArrayList<MediaLocTime> mlts; private OsmMapGpsTrailerReviewerMapActivity gtum; private Gallery gallery; private MltAdapter adapter; private int lastGalleryPosition; public MediaGalleryFragment(OsmMapGpsTrailerReviewerMapActivity gtum, ArrayList<MediaLocTime> mlts) { this.gtum = gtum; this.mlts = mlts; } public MediaGalleryFragment() { //TODO 2.5 how to handle no arg constructor calls } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(gtum == null) return null; View v = inflater.inflate(R.layout.media_gallery, container, false); View glassPane = (View) v.findViewById(R.id.glass_pane); glassPane.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finishBrowsing(); } }); // Reference the Gallery view gallery = (Gallery) v.findViewById(R.id.gallery); //remove the alphaness gallery.setUnselectedAlpha(1.0f); gallery.setSpacing((int) Util.convertDpToPixel(10, this.getActivity())); // Set a item click listener, and just Toast the clicked position gallery.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { MediaLocTime mlt = mlts.get((int)id); if(!mlt.isClean(gtum)) return; ViewImage.mAllImages = mlts; ViewImage.mCurrentPosition = (int) id; Intent intent = new Intent(getActivity(), ViewImage.class); gtum.startInternalActivity(intent); // FullMediaGalleryActivity.setFullMediaGalleryActivityData(mlts, (int)id); // startActivity(new Intent(getActivity(), FullMediaGalleryActivity.class)); // // if(mlt.getType() == MediaLocTime.TYPE_IMAGE) // Util.viewMediaInGallery(gtum, mlt.getFilename(), true); // else // Util.viewMediaInGallery(gtum, mlt.getFilename(), false //video // ); } }); final TextView index = (TextView) v.findViewById(R.id.index); final TextView timeAndTimezone = (TextView) v.findViewById(R.id.time_and_timezone); final String indexTextFormat = getResources().getText(R.string.x_of_x_items_format).toString(); final String nothingTextFormat = getResources().getText(R.string.x_items_format).toString(); final String timeWithTimezoneFormat = getResources().getText(R.string.media_gallery_strip_time_with_timezone).toString(); final SimpleDateFormat timeAndDateSdf = new SimpleDateFormat(getString(R.string.time_and_date_format)); gallery.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { int secs = mlts.get(position).getTimeSecs(); /* ttt_installer:remove_line */Log.d(GTG.TAG,"Mlt selected: "+mlts.get(position)); TimeZone tz = GTG.tztSet. getTimeZoneTimeOrNullIfUnknwonOrLocalTime(secs); if(tz != null) timeAndDateSdf.setTimeZone(tz); else timeAndDateSdf.setTimeZone(Util.getCurrTimeZone()); String dateStr = timeAndDateSdf.format(new Date(secs * 1000l)); index.setText(String.format(indexTextFormat,(position+1), mlts.size())); if(tz != null) timeAndTimezone.setText(String.format(timeWithTimezoneFormat, dateStr, tz.getDisplayName())); else timeAndTimezone.setText(dateStr); } @Override public void onNothingSelected(AdapterView<?> parent) { index.setText(String.format(nothingTextFormat,mlts.size())); timeAndTimezone.setText(""); } }); ; ((Gallery) v.findViewById(R.id.gallery)).setAdapter(adapter = new MltAdapter(getActivity(), inflater, mlts)); // Inflate the layout for this fragment return v; } // public void setMlts(ArrayList<MediaLocTime> mltArray) // { // this.mlts = mltArray; // // // Set the adapter to our custom adapter (below) // ((Gallery) getView().findViewById(R.id.gallery)).setAdapter(new MltAdapter(getActivity(), mltArray)); // } public void finishBrowsing() { FragmentManager fragmentManager = gtum.getSupportFragmentManager(); fragmentManager.popBackStack(); } @Override public void onResume() { super.onResume(); if(adapter == null) return; //TODO 2.1 use startActivityForResult and use the picture selected in that screen as the position gallery.setSelection(lastGalleryPosition >= mlts.size() ? mlts.size()-1 : lastGalleryPosition); adapter.notifyDataSetChanged(); gtum.registerMediaGalleryFragment(this); } @Override public void onPause() { super.onPause(); //TODO 2.5 the gtum can be null if we get a no arg constructor call if(gtum != null) gtum.unregisterMediaGalleryFragment(this); //sometimes onCreateView isn't being called when gallery is paused (after kill and restart) if(gallery != null) lastGalleryPosition = gallery.getSelectedItemPosition(); } private static class MltAdapter extends BaseAdapter { // /** // * For some reason, the width seems not correspond to what // * I put here.. I need to investigate how this will show // * on different screens / why this happens // */ // private static final float WEIRD_LAYOUT_WIDTH_MULTIPLIER = 1.7f; private ArrayList<MediaLocTime> mltArray; private Context context; private FrameLayout fl; private ImageView imageView; private ImageView videoMarkerView; private LayoutInflater inflater; private ContentResolver contentResolver; public MltAdapter(Context context, LayoutInflater inflater, ArrayList<MediaLocTime> mltArray) { this.context = context; this.mltArray = mltArray; this.inflater = inflater; fl = new FrameLayout(context); imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER); videoMarkerView = new ImageView(context); videoMarkerView.setImageBitmap(((BitmapDrawable) context.getResources(). getDrawable(R.drawable.small_video_indicator)).getBitmap()); videoMarkerView.setScaleType(ImageView.ScaleType.CENTER); fl.addView(imageView); fl.addView(videoMarkerView); contentResolver = context.getContentResolver(); } @Override public int getCount() { return mltArray.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { GTG.cacheCreatorLock.registerReadingThread(); try { MediaLocTime mlt = mltArray.get(position); View fl = convertView; if (fl == null) { fl = inflater.inflate(R.layout.media_gallery_media, parent, false); } ImageView imageView = (ImageView) fl.findViewById(R.id.image); ImageView videoMarkerView = (ImageView) fl .findViewById(R.id.video_indicator); if (!mlt.isDeleted() && mlt.isClean(context)) { Bitmap b = mltArray.get(position).getThumbnailBitmap( contentResolver, true); imageView.setImageBitmap(b); if (mlt.isVideo()) { videoMarkerView.setVisibility(View.VISIBLE); } else videoMarkerView.setVisibility(View.GONE); // LayoutParams layoutParams = new // Gallery.LayoutParams((int) (b.getWidth() * // WEIRD_LAYOUT_WIDTH_MULTIPLIER), // b.getHeight()); // i.setLayoutParams(layoutParams); } else { Bitmap b = ((BitmapDrawable) context.getResources(). getDrawable(R.drawable.white1x1)).getBitmap(); imageView.setImageBitmap(b); // LayoutParams layoutParams = new Gallery.LayoutParams(0, 100); // imageView.setLayoutParams(layoutParams); // imageView.setImageBitmap(null); if (!mlt.isDeleted()) GTG.mediaLocTimeMap.notifyMltNotClean(mlt); videoMarkerView.setVisibility(View.GONE); } // Log.d(GTG.TAG, "getView for " + position); return fl; } finally { GTG.cacheCreatorLock.unregisterReadingThread(); } } } }