Java tutorial
/* * Copyright 2013 Chris Banes * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.zhaojian.jolly.selectphotos; import android.app.Activity; import android.app.AlertDialog; import android.app.LoaderManager; import android.content.DialogInterface; import android.content.Intent; import android.content.Loader; import android.database.Cursor; import android.os.Bundle; import android.provider.MediaStore.Images; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import com.zhaojian.jolly.adapter.SelectedPhotosViewPagerAdapter; import com.zhaojian.jolly.adapter.UserPhotosViewPagerAdapter; import com.zhaojian.jolly.controller.PhotoUploadController; import com.zhaojian.jolly.model.PhotoUpload; import com.zhaojian.jolly.utils.CursorPagerAdapter; import com.zhaojian.jolly.utils.MediaStoreCursorHelper; import com.zhaojian.jolly.utils.PhotupCursorLoader; import com.zhaojian.jolly.views.CheckableImageView; import com.zhaojian.jolly.views.PhotoTagItemLayout; import com.zhaojian.select_photo_library.R; public class PhotoViewerActivity extends Activity implements OnCheckedChangeListener, OnPageChangeListener, LoaderManager.LoaderCallbacks<Cursor> { public static final String EXTRA_POSITION = "extra_position"; public static final String EXTRA_MODE = "extra_mode"; public static final String EXTRA_BUCKET_ID = "extra_bucket_id"; static final int RESULT_PHOTOVIEW = 102; public static int MODE_ALL_VALUE = 100; public static int MODE_SELECTED_VALUE = 101; static final int REQUEST_CROP_PHOTO = 200; class PhotoRemoveAnimListener implements AnimationListener { private final View mView; public PhotoRemoveAnimListener(View view) { mView = view; } public void onAnimationEnd(Animation animation) { mView.setVisibility(View.GONE); animation.setAnimationListener(null); if (!mController.hasSelections()) { finish(); } else { View view = (View) mView.getParent(); view.post(new Runnable() { public void run() { mAdapter.notifyDataSetChanged(); } }); } } public void onAnimationRepeat(Animation animation) { } public void onAnimationStart(Animation animation) { } } private ViewPager mViewPager; private PagerAdapter mAdapter; private ViewGroup mContentView; private CheckableImageView checkImageView; private LinearLayout back_btn; private Button finish_btn; private PhotoUploadController mController; private int mMode = MODE_SELECTED_VALUE; private String mBucketId; private int mRequestedPosition = -1; @Override public void onBackPressed() { super.onBackPressed(); } private void rotateCurrentPhoto() { PhotoTagItemLayout currentView = getCurrentView(); PhotoUpload upload = currentView.getPhotoSelection(); upload.rotateClockwise(); reloadView(currentView); } private void resetCurrentPhoto() { PhotoTagItemLayout currentView = getCurrentView(); PhotoUpload upload = currentView.getPhotoSelection(); upload.reset(); reloadView(currentView); } @Override public boolean onCreateOptionsMenu(Menu menu) { // getSupportMenuInflater().inflate(R.menu.menu_photo_viewer, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } public void onPageScrolled(int position, float arg1, int arg2) { // NO-OP // reloadView(getCurrentView()); // Log.d("zj","scroll"); if (position == 0) { reloadView(getCurrentView()); } } public void onPageScrollStateChanged(int state) { reloadView(getCurrentView()); } public void onPageSelected(int position) { PhotoTagItemLayout currentView = getCurrentView(); if (null != currentView) { PhotoUpload upload = currentView.getPhotoSelection(); if (null != upload) { reloadView(getCurrentView()); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_CROP_PHOTO: if (resultCode == RESULT_OK) { reloadView(getCurrentView()); } break; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo_viewer); mContentView = (ViewGroup) findViewById(R.id.fl_root); mController = PhotoUploadController.getFromContext(this); final Intent intent = getIntent(); mMode = intent.getIntExtra(EXTRA_MODE, MODE_ALL_VALUE); if (mMode == MODE_ALL_VALUE) { mBucketId = intent.getStringExtra(EXTRA_BUCKET_ID); } back_btn = (LinearLayout) findViewById(R.id.back_btn); finish_btn = (Button) findViewById(R.id.finish_btn); checkImageView = (CheckableImageView) findViewById(R.id.iv_large_selection_btn); mViewPager = (ViewPager) findViewById(R.id.vp_photos); mViewPager.setOffscreenPageLimit(2); mViewPager.setPageMargin(getResources().getDimensionPixelSize(R.dimen.viewpager_margin)); mViewPager.setOnPageChangeListener(this); checkImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { checkImageView.toggle(); // Update the controller updateController(); finish_btn.setText("?(" + mController.getSelectedCount() + ")"); } }); back_btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { finish(); } }); finish_btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { setResult(RESULT_PHOTOVIEW); finish(); } }); finish_btn.setText("?(" + mController.getSelectedCount() + ")"); if (mMode == MODE_ALL_VALUE) { mAdapter = new UserPhotosViewPagerAdapter(this); getLoaderManager().initLoader(0, null, this); } else { mAdapter = new SelectedPhotosViewPagerAdapter(this); } mViewPager.setAdapter(mAdapter); if (intent.hasExtra(EXTRA_POSITION)) { mRequestedPosition = intent.getIntExtra(EXTRA_POSITION, 0); mViewPager.setCurrentItem(mRequestedPosition); } /** * Nasty hack, basically we need to know when the ViewPager is laid out, * we then manually call onPageSelected. This is to fix onPageSelected * not being called on the first item. */ mViewPager.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @SuppressWarnings("deprecation") public void onGlobalLayout() { mViewPager.getViewTreeObserver().removeGlobalOnLayoutListener(this); onPageSelected(mViewPager.getCurrentItem()); } }); } @Override protected void onDestroy() { mController.updateDatabase(); super.onDestroy(); } private PhotoUpload getCurrentUpload() { PhotoTagItemLayout view = getCurrentView(); if (null != view) { return view.getPhotoSelection(); } return null; } private PhotoTagItemLayout getCurrentView() { final int currentPos = mViewPager.getCurrentItem(); for (int i = 0, z = mViewPager.getChildCount(); i < z; i++) { PhotoTagItemLayout child = (PhotoTagItemLayout) mViewPager.getChildAt(i); if (null != child && child.getPosition() == currentPos) { return child; } } return null; } private void reloadView(PhotoTagItemLayout currentView) { if (null != currentView) { // MultiTouchImageView imageView = currentView.getImageView(); PhotoUpload selection = currentView.getPhotoSelection(); // imageView.requestFullSize(selection, true, false, null); checkImageView.setChecked(mController.isSelected(selection)); } } public void onPhotoLoadStatusChanged(boolean finished) { // TODO Fix this setProgressBarIndeterminateVisibility(!finished); } public Loader<Cursor> onCreateLoader(int id, Bundle params) { String selection = null; String[] selectionArgs = null; if (null != mBucketId) { selection = Images.Media.BUCKET_ID + " = ?"; selectionArgs = new String[] { mBucketId }; } return new PhotupCursorLoader(this, MediaStoreCursorHelper.MEDIA_STORE_CONTENT_URI, MediaStoreCursorHelper.PHOTOS_PROJECTION, selection, selectionArgs, MediaStoreCursorHelper.PHOTOS_ORDER_BY, false); } public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { if (mAdapter instanceof CursorPagerAdapter) { ((CursorPagerAdapter) mAdapter).swapCursor(cursor); } if (mRequestedPosition != -1) { mViewPager.setCurrentItem(mRequestedPosition, false); mRequestedPosition = -1; } } public void onLoaderReset(Loader<Cursor> loader) { onLoadFinished(loader, null); } @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub PhotoTagItemLayout currentView = getCurrentView(); PhotoUpload upload = currentView.getPhotoSelection(); updateController(); reloadView(currentView); } void updateController() { final PhotoUpload currentUpload = getCurrentUpload(); if (null != currentUpload) { if (checkImageView.isChecked()) { mController.addSelection(currentUpload); } else { mController.removeSelection(currentUpload); } } } }