/* * Copyright 2012 The Stanford MobiSocial Laboratory * * 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 mobisocial.musubi.feed.action; import java.io.IOException; import mobisocial.musubi.Helpers; import mobisocial.musubi.R; import mobisocial.musubi.feed.iface.FeedAction; import mobisocial.musubi.objects.PictureObj; import mobisocial.musubi.objects.VideoObj; import mobisocial.musubi.service.WizardStepHandler; import mobisocial.musubi.ui.MusubiBaseActivity; import mobisocial.socialkit.Obj; import mobisocial.socialkit.musubi.Musubi; import org.mobisocial.corral.ContentCorral; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.widget.Toast; /** * Captures an image to share with a feed. * */ public class CamcorderAction extends FeedAction { private static final String TAG = "CamcorderAction"; private static final int REQUEST_CAPTURE_MEDIA = 9413; private Uri mFeedUri; @Override public String getName() { return "Video"; } @Override public Drawable getIcon(Context c) { return c.getResources().getDrawable(R.drawable.ic_attach_capture_video_holo_light); } @Override public void onClick(final Context context, final Uri feedUri) { mFeedUri = feedUri; Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); //intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024*1024*30); intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 45); intent.putExtra(Musubi.EXTRA_FEED_URI, feedUri); startActivityForResult(intent, REQUEST_CAPTURE_MEDIA); } @Override public boolean isActive(Context c) { return MusubiBaseActivity.isDeveloperModeEnabled(c); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CAPTURE_MEDIA) { if (resultCode != Activity.RESULT_OK) { return; } new CameraCaptureTask(data).execute(); } super.onActivityResult(requestCode, resultCode, data); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { mFeedUri = savedInstanceState.getParcelable("feed"); } } @Override public void onSaveInstanceState(Bundle outState) { outState.putParcelable("feed", mFeedUri); } class CameraCaptureTask extends AsyncTask<Void, Void, Boolean> { Intent mData; Throwable mError; Obj mObj; public CameraCaptureTask(Intent data) { mData = data; } @Override protected Boolean doInBackground(Void... params) { if (mData == null || mData.getData() == null) { return false; } Uri mediaUri; String type; mediaUri = mData.getData(); type = mData.getType(); if (type == null) { type = getActivity().getContentResolver().getType(mediaUri); } if (type != null && type.startsWith("video/")) { try { mObj = VideoObj.from(getActivity(), mediaUri, type); } catch (IOException e) { Log.e(TAG, "Failed to fetch video", e); return false; } } if (type != null && type.startsWith("image/")) { Uri storedUri = ContentCorral.storeContent(getActivity(), mediaUri, type); try { mObj = PictureObj.from(getActivity(), storedUri, true); } catch (IOException e) { Log.e(TAG, "Corral photo action had an issue", e); try { mObj = PictureObj.from(getActivity(), mediaUri, true); } catch(Throwable t) { Log.e(TAG, "fallback photo action had an issue", t); } } } if (mObj == null) { return false; } Helpers.sendToFeed(getActivity(), mObj, mFeedUri); return true; } @Override protected void onPostExecute(Boolean result) { if (result) { Helpers.emailUnclaimedMembers(getActivity(), mObj, mFeedUri); WizardStepHandler.accomplishTask(getActivity(), WizardStepHandler.TASK_TAKE_PICTURE); } else { Toast.makeText(getActivity(), "Failed to capture media.", Toast.LENGTH_SHORT).show(); } } } }