Java tutorial
/* This file is part of BeepMe. BeepMe 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. BeepMe 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 BeepMe. If not, see <http://www.gnu.org/licenses/>. Copyright 2012-2014 Michael Glanznig http://beepme.yourexp.at */ package com.glanznig.beepme.view; import java.io.File; import java.lang.ref.WeakReference; import java.text.DateFormat; import java.util.Calendar; import java.util.Iterator; import com.glanznig.beepme.R; import com.glanznig.beepme.data.Sample; import com.glanznig.beepme.data.Tag; import com.glanznig.beepme.db.SampleTable; import com.glanznig.beepme.helper.AsyncImageScaler; import com.glanznig.beepme.helper.FlowLayout; import com.glanznig.beepme.helper.PhotoUtils; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.os.Handler.Callback; import android.os.Message; import android.support.v4.app.Fragment; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.TextView; public class ViewSampleFragment extends Fragment implements Callback { private static final String TAG = "ViewSampleFragment"; private long sampleId = 0L; private SamplePhotoView photoView; private static class ImgLoadHandler extends Handler { WeakReference<SamplePhotoView> view; ImgLoadHandler(SamplePhotoView view) { this.view = new WeakReference<SamplePhotoView>(view); } @Override public void handleMessage(Message msg) { if (msg.what == PhotoUtils.MSG_PHOTO_LOADED) { Bitmap imageBitmap = (Bitmap) msg.obj; if (view.get() != null && imageBitmap != null) { view.get().setPhoto(imageBitmap); } } } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { super.onCreate(savedState); View rootView = inflater.inflate(R.layout.view_sample, container, false); Bundle args = getArguments(); sampleId = args.getLong("sampleId"); return rootView; } @Override public void onResume() { super.onResume(); populateFields(); } private void populateFields() { if (sampleId != 0L) { Sample s = new SampleTable(getActivity().getApplicationContext()).getSampleWithTags(sampleId); TextView timestamp = (TextView) getView().findViewById(R.id.view_sample_timestamp); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); timestamp.setText(dateFormat.format(s.getTimestamp())); TextView title = (TextView) getView().findViewById(R.id.view_sample_title); if (s.getTitle() != null && s.getTitle().length() > 0) { title.setText(s.getTitle()); } else { title.setText(getString(R.string.sample_untitled)); } TextView description = (TextView) getView().findViewById(R.id.view_sample_description); if (s.getDescription() != null && s.getDescription().length() > 0) { description.setTextSize(14); description.setText(s.getDescription()); } else { description.setTextSize(12); // not editable any more if ((Calendar.getInstance().getTimeInMillis() - s.getTimestamp().getTime()) >= 24 * 60 * 60 * 1000) { description.setText(getString(R.string.sample_no_description)); } else { description.setText(getString(R.string.sample_no_description_editable)); } } boolean hasKeywordTags = false; FlowLayout keywordHolder = (FlowLayout) getView().findViewById(R.id.view_sample_keyword_container); keywordHolder.removeAllViews(); Iterator<Tag> i = s.getTags().iterator(); Tag tag = null; while (i.hasNext()) { tag = i.next(); if (tag.getVocabularyId() == 1) { TextView view = new TextView(getView().getContext()); view.setText(tag.getName()); final float scale = getResources().getDisplayMetrics().density; int textPaddingLeftRight = 6; int textPaddingTopBottom = 2; view.setPadding((int) (textPaddingLeftRight * scale + 0.5f), (int) (textPaddingTopBottom * scale + 0.5f), (int) (textPaddingLeftRight * scale + 0.5f), (int) (textPaddingTopBottom * scale + 0.5f)); view.setBackgroundColor(getResources().getColor(R.color.bg_keyword)); keywordHolder.addView(view); hasKeywordTags = true; } } TextView noKeywordsView = (TextView) getView().findViewById(R.id.view_sample_no_keywords); if (!hasKeywordTags) { keywordHolder.setVisibility(View.GONE); noKeywordsView.setVisibility(View.VISIBLE); // not editable any more (after 1 day) if ((Calendar.getInstance().getTimeInMillis() - s.getTimestamp().getTime()) >= 24 * 60 * 60 * 1000) { noKeywordsView.setText(getString(R.string.sample_no_keywords)); } else { noKeywordsView.setText(getString(R.string.sample_no_keywords_editable)); } } else { noKeywordsView.setVisibility(View.GONE); keywordHolder.setVisibility(View.VISIBLE); } photoView = (SamplePhotoView) getView().findViewById(R.id.view_sample_photo); photoView.setRights(false, false); // read only DisplayMetrics metrics = getView().getContext().getResources().getDisplayMetrics(); int thumbnailSize; if (!isLandscape()) { photoView.setFrameWidth(LayoutParams.MATCH_PARENT); thumbnailSize = (int) (metrics.widthPixels / metrics.density + 0.5f); } else { thumbnailSize = (int) (metrics.heightPixels / metrics.density + 0.5f); } String thumbnailUri = PhotoUtils.getThumbnailUri(s.getPhotoUri(), thumbnailSize); if (thumbnailUri != null) { File thumb = new File(thumbnailUri); if (thumb.exists()) { ImgLoadHandler handler = new ImgLoadHandler(photoView); PhotoUtils.getAsyncBitmap(getView().getContext(), thumbnailUri, handler); } else { Handler handler = new Handler(this); PhotoUtils.generateThumbnails(getView().getContext(), s.getPhotoUri(), handler); } } else { photoView.unsetPhoto(); } } } @Override public boolean handleMessage(Message msg) { if (msg.what == AsyncImageScaler.MSG_SUCCESS) { Bitmap photoBitmap = (Bitmap) msg.obj; if (photoBitmap != null) { photoView.setPhoto(photoBitmap); return true; } } if (msg.what == AsyncImageScaler.MSG_ERROR) { // error handling } return false; } private boolean isLandscape() { DisplayMetrics metrics = getView().getContext().getResources().getDisplayMetrics(); if (metrics.heightPixels < metrics.widthPixels) { return true; } else { return false; } } }