package com.daifan.activity; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.view.*; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragment; import com.daifan.R; import com.daifan.Singleton; import com.daifan.activity.adapter.ThumbnailsLoader; import java.io.File; import java.io.IOException; public class ThumbnailsFragment extends SherlockFragment { static public interface ThumbnailsConfig { public boolean supportNew(); } private ThumbnailsLoader loader; public ThumbnailsLoader getLoader(){ return this.loader; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { boolean supportNew = false; if (this.getSherlockActivity() instanceof ThumbnailsConfig) { supportNew = ((ThumbnailsConfig) this.getSherlockActivity()).supportNew(); } View v = inflater.inflate(R.layout.postnew_gridview, container, false); ExpandGridView grid = (ExpandGridView) v.findViewById(R.id.mygallery); grid.setExpanded(true); this.loader = new ThumbnailsLoader(this.getSherlockActivity(), new ThumbnailsLoader.NewImageCallback() { @Override public void postNewImage(Bitmap previewBm, ImageView imageView) { Log.d(Singleton.DAIFAN_TAG, "accepted callback for postNewImage"); if (imageView != null) { registerForContextMenu(imageView); } } @Override public View.OnClickListener newBtnClickListener() { return new View.OnClickListener() { @Override public void onClick(View v) { //ThumbnailsFragment.this.clickAddPic(v); } }; } @Override public void postNotANewImage(ImageView imageView) { if (imageView != null) unregisterForContextMenu(imageView); } }); grid.setAdapter(this.loader); if (supportNew) grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.d(Singleton.DAIFAN_TAG, "onItemClickListener " + position); } }); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = this.getSherlockActivity().getMenuInflater(); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (!Singleton.isIntentAvailable(this.getSherlockActivity(), takePhotoIntent)) menu.removeItem(R.id.pic_menu_take_photo); inflater.inflate(R.menu.pic, menu); } @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); return this.onNewImgMenu(item); } private Uri currentTakingDest = null; private void clickAddPic(View clickedV) { PopupMenu popup = new PopupMenu(this.getSherlockActivity(), clickedV); popup.getMenuInflater().inflate(R.menu.pic, popup.getMenu()); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (!Singleton.isIntentAvailable(this.getSherlockActivity(), takePhotoIntent)) popup.getMenu().removeItem(R.id.pic_menu_take_photo); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(android.view.MenuItem item) { return onNewImgMenu(item); } }); popup.show(); } private boolean onNewImgMenu(MenuItem item) { Intent intent; switch (item.getItemId()) { case R.id.pic_menu_pick_photo: intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, 2); return true; case R.id.pic_menu_take_photo: File tmpImg; try { tmpImg = Singleton.getFileCache().createTmpImg(); } catch (IOException e) { Log.e(Singleton.DAIFAN_TAG, "cannot creat tmp file in file Cache"); Toast.makeText(getSherlockActivity(), "无法创建用于保存图像的临时文件!", Toast.LENGTH_SHORT).show(); return false; } currentTakingDest = Uri.fromFile(tmpImg); intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, currentTakingDest); startActivityForResult(intent, 3); return true; default: return false; } } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); Log.d(Singleton.DAIFAN_TAG, "the requestCode is " + requestCode + ", resultCode=" + resultCode); if (resultCode == Activity.RESULT_OK) { if (requestCode == 3) { this.galleryAddPic(this.currentTakingDest); addToNewImage(this.currentTakingDest); return; } else if (requestCode == 2) { if (null == intent) { Toast.makeText(this.getSherlockActivity(), "添加图片失败!", Toast.LENGTH_SHORT).show(); return; } Uri uri = intent.getData(); addToNewImage(uri); return; } } } private void addToNewImage(Uri uri) { try { this.loader.addNewImage(uri); } catch (IOException e) { Log.e(Singleton.DAIFAN_TAG, "add pic failed for exception:" + e.getMessage(), e); Toast.makeText(this.getSherlockActivity(), "添加图片失败!", Toast.LENGTH_SHORT).show(); return; } return; } private void galleryAddPic(Uri contentUri) { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); mediaScanIntent.setData(contentUri); this.getSherlockActivity().sendBroadcast(mediaScanIntent); } }