package com.afollestad.materialcamera; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.media.CamcorderProfile; import android.support.annotation.AttrRes; import android.support.annotation.ColorInt; import android.support.annotation.ColorRes; import android.support.annotation.DrawableRes; import android.support.annotation.FloatRange; import android.support.annotation.IntDef; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.v4.content.ContextCompat; import com.afollestad.materialcamera.internal.CameraIntentKey; import com.afollestad.materialcamera.util.CameraUtil; import com.afollestad.materialdialogs.util.DialogUtils; import java.io.File; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * @author Aidan Follestad (afollestad) */ @SuppressWarnings("WeakerAccess") public class MaterialCamera { @IntDef({QUALITY_HIGH, QUALITY_LOW, QUALITY_480P, QUALITY_720P, QUALITY_1080P}) @Retention(RetentionPolicy.SOURCE) public @interface QualityProfile { } public static final int QUALITY_HIGH = CamcorderProfile.QUALITY_HIGH; public static final int QUALITY_LOW = CamcorderProfile.QUALITY_LOW; public static final int QUALITY_480P = CamcorderProfile.QUALITY_480P; public static final int QUALITY_720P = CamcorderProfile.QUALITY_720P; public static final int QUALITY_1080P = CamcorderProfile.QUALITY_1080P; public static final String ERROR_EXTRA = "mcam_error"; public static final String STATUS_EXTRA = "mcam_status"; public static final int STATUS_RECORDED = 1; public static final int STATUS_RETRY = 2; private Context mContext; private Activity mActivityContext; private android.app.Fragment mAppFragment; private android.support.v4.app.Fragment mSupportFragment; private boolean mIsFragment = false; private long mLengthLimit = -1; private boolean mAllowRetry = true; private boolean mAutoSubmit = false; private String mSaveDir; private int mPrimaryColor; private boolean mShowPortraitWarning = true; private boolean mAllowChangeCamera = true; private boolean mDefaultToFrontFacing = false; private boolean mCountdownImmediately = false; private boolean mRetryExists = false; private boolean mRestartTimerOnRetry = false; private boolean mContinueTimerInPlayback = true; private boolean mForceCamera1 = false; private boolean mStillShot; private boolean mAudioDisabled = false; private long mAutoRecord = -1; private int mVideoEncodingBitRate = -1; private int mAudioEncodingBitRate = -1; private int mVideoFrameRate = -1; private int mVideoPreferredHeight = -1; private float mVideoPreferredAspect = -1f; private long mMaxFileSize = -1; private int mQualityProfile = -1; private int mIconRecord; private int mIconStop; private int mIconFrontCamera; private int mIconRearCamera; private int mIconPlay; private int mIconPause; private int mIconRestart; private int mLabelRetry; private int mLabelConfirm; public MaterialCamera(@NonNull Activity context) { mContext = context; mActivityContext = context; mPrimaryColor = DialogUtils.resolveColor(context, R.attr.colorPrimary); } public MaterialCamera(@NonNull android.app.Fragment context) { mIsFragment = true; mContext = context.getActivity(); mAppFragment = context; mSupportFragment = null; mPrimaryColor = DialogUtils.resolveColor(mContext, R.attr.colorPrimary); } public MaterialCamera(@NonNull android.support.v4.app.Fragment context) { mIsFragment = true; mContext = context.getContext(); mSupportFragment = context; mAppFragment = null; mPrimaryColor = DialogUtils.resolveColor(mContext, R.attr.colorPrimary); } public MaterialCamera countdownMillis(long lengthLimitMs) { mLengthLimit = lengthLimitMs; return this; } public MaterialCamera countdownSeconds(float lengthLimitSec) { return countdownMillis((int) (lengthLimitSec * 1000f)); } public MaterialCamera countdownMinutes(float lengthLimitMin) { return countdownMillis((int) (lengthLimitMin * 1000f * 60f)); } public MaterialCamera allowRetry(boolean allowRetry) { mAllowRetry = allowRetry; return this; } public MaterialCamera autoSubmit(boolean autoSubmit) { mAutoSubmit = autoSubmit; return this; } public MaterialCamera countdownImmediately(boolean immediately) { mCountdownImmediately = immediately; return this; } public MaterialCamera saveDir(@Nullable File dir) { if (dir == null) return saveDir((String) null); return saveDir(dir.getAbsolutePath()); } public MaterialCamera saveDir(@Nullable String dir) { mSaveDir = dir; return this; } public MaterialCamera primaryColor(@ColorInt int color) { mPrimaryColor = color; return this; } public MaterialCamera primaryColorRes(@ColorRes int colorRes) { return primaryColor(ContextCompat.getColor(mContext, colorRes)); } public MaterialCamera primaryColorAttr(@AttrRes int colorAttr) { return primaryColor(DialogUtils.resolveColor(mContext, colorAttr)); } public MaterialCamera showPortraitWarning(boolean show) { mShowPortraitWarning = show; return this; } public MaterialCamera allowChangeCamera(boolean allowChangeCamera) { mAllowChangeCamera = allowChangeCamera; return this; } public MaterialCamera defaultToFrontFacing(boolean frontFacing) { mDefaultToFrontFacing = frontFacing; return this; } public MaterialCamera retryExits(boolean exits) { mRetryExists = exits; return this; } public MaterialCamera restartTimerOnRetry(boolean restart) { mRestartTimerOnRetry = restart; return this; } public MaterialCamera continueTimerInPlayback(boolean continueTimer) { mContinueTimerInPlayback = continueTimer; return this; } public MaterialCamera forceCamera1() { mForceCamera1 = true; return this; } public MaterialCamera audioDisabled(boolean disabled) { mAudioDisabled = disabled; return this; } /** * @deprecated Renamed to videoEncodingBitRate(int). */ @Deprecated public MaterialCamera videoBitRate(@IntRange(from = 1, to = Integer.MAX_VALUE) int rate) { return videoEncodingBitRate(rate); } public MaterialCamera videoEncodingBitRate(@IntRange(from = 1, to = Integer.MAX_VALUE) int rate) { mVideoEncodingBitRate = rate; return this; } public MaterialCamera audioEncodingBitRate(@IntRange(from = 1, to = Integer.MAX_VALUE) int rate) { mAudioEncodingBitRate = rate; return this; } public MaterialCamera videoFrameRate(@IntRange(from = 1, to = Integer.MAX_VALUE) int rate) { mVideoFrameRate = rate; return this; } public MaterialCamera videoPreferredHeight(@IntRange(from = 1, to = Integer.MAX_VALUE) int height) { mVideoPreferredHeight = height; return this; } public MaterialCamera videoPreferredAspect(@FloatRange(from = 0.1, to = Float.MAX_VALUE) float ratio) { mVideoPreferredAspect = ratio; return this; } public MaterialCamera maxAllowedFileSize(long size) { mMaxFileSize = size; return this; } public MaterialCamera qualityProfile(@QualityProfile int profile) { mQualityProfile = profile; return this; } public MaterialCamera iconRecord(@DrawableRes int iconRes) { mIconRecord = iconRes; return this; } public MaterialCamera iconStop(@DrawableRes int iconRes) { mIconStop = iconRes; return this; } public MaterialCamera iconFrontCamera(@DrawableRes int iconRes) { mIconFrontCamera = iconRes; return this; } public MaterialCamera iconRearCamera(@DrawableRes int iconRes) { mIconRearCamera = iconRes; return this; } public MaterialCamera iconPlay(@DrawableRes int iconRes) { mIconPlay = iconRes; return this; } public MaterialCamera iconPause(@DrawableRes int iconRes) { mIconPause = iconRes; return this; } public MaterialCamera iconRestart(@DrawableRes int iconRes) { mIconRestart = iconRes; return this; } public MaterialCamera labelRetry(@StringRes int stringRes) { mLabelRetry = stringRes; return this; } @Deprecated /* This has been replaced with labelConfirm */ public MaterialCamera labelUseVideo(@StringRes int stringRes) { mLabelConfirm = stringRes; return this; } public MaterialCamera labelConfirm(@StringRes int stringRes) { mLabelConfirm = stringRes; return this; } /** * Will take a still shot instead of recording. */ public MaterialCamera stillShot() { mStillShot = true; return this; } public MaterialCamera autoRecordWithDelayMs(@IntRange(from = -1, to = Long.MAX_VALUE) long delayMillis) { mAutoRecord = delayMillis; return this; } public MaterialCamera autoRecordWithDelaySec(@IntRange(from = -1, to = Long.MAX_VALUE) int delaySeconds) { mAutoRecord = delaySeconds * 1000; return this; } public Intent getIntent(boolean showGuide) { final Class<?> cls = !mForceCamera1 && CameraUtil.hasCamera2(mContext, mStillShot) ? CaptureActivity2.class : CaptureActivity.class; Intent intent = new Intent(mContext, cls) .putExtra(CameraIntentKey.LENGTH_LIMIT, mLengthLimit) .putExtra(CameraIntentKey.ALLOW_RETRY, mAllowRetry) .putExtra(CameraIntentKey.AUTO_SUBMIT, mAutoSubmit) .putExtra(CameraIntentKey.SAVE_DIR, mSaveDir) .putExtra(CameraIntentKey.PRIMARY_COLOR, mPrimaryColor) .putExtra(CameraIntentKey.SHOW_PORTRAIT_WARNING, mShowPortraitWarning) .putExtra(CameraIntentKey.ALLOW_CHANGE_CAMERA, mAllowChangeCamera) .putExtra(CameraIntentKey.DEFAULT_TO_FRONT_FACING, mDefaultToFrontFacing) .putExtra(CameraIntentKey.COUNTDOWN_IMMEDIATELY, mCountdownImmediately) .putExtra(CameraIntentKey.RETRY_EXITS, mRetryExists) .putExtra(CameraIntentKey.RESTART_TIMER_ON_RETRY, mRestartTimerOnRetry) .putExtra(CameraIntentKey.CONTINUE_TIMER_IN_PLAYBACK, mContinueTimerInPlayback) .putExtra(CameraIntentKey.STILL_SHOT, mStillShot) .putExtra(CameraIntentKey.AUTO_RECORD, mAutoRecord) .putExtra(CameraIntentKey.AUDIO_DISABLED, mAudioDisabled); if (mVideoEncodingBitRate > 0) intent.putExtra(CameraIntentKey.VIDEO_BIT_RATE, mVideoEncodingBitRate); if (mAudioEncodingBitRate > 0) intent.putExtra(CameraIntentKey.AUDIO_ENCODING_BIT_RATE, mAudioEncodingBitRate); if (mVideoFrameRate > 0) intent.putExtra(CameraIntentKey.VIDEO_FRAME_RATE, mVideoFrameRate); if (mVideoPreferredHeight > 0) intent.putExtra(CameraIntentKey.VIDEO_PREFERRED_HEIGHT, mVideoPreferredHeight); if (mVideoPreferredAspect > 0f) intent.putExtra(CameraIntentKey.VIDEO_PREFERRED_ASPECT, mVideoPreferredAspect); if (mMaxFileSize > -1) intent.putExtra(CameraIntentKey.MAX_ALLOWED_FILE_SIZE, mMaxFileSize); if (mQualityProfile > -1) intent.putExtra(CameraIntentKey.QUALITY_PROFILE, mQualityProfile); if (mIconRecord != 0) intent.putExtra(CameraIntentKey.ICON_RECORD, mIconRecord); if (mIconStop != 0) intent.putExtra(CameraIntentKey.ICON_STOP, mIconStop); if (mIconFrontCamera != 0) intent.putExtra(CameraIntentKey.ICON_FRONT_CAMERA, mIconFrontCamera); if (mIconRearCamera != 0) intent.putExtra(CameraIntentKey.ICON_REAR_CAMERA, mIconRearCamera); if (mIconPlay != 0) intent.putExtra(CameraIntentKey.ICON_PLAY, mIconPlay); if (mIconPause != 0) intent.putExtra(CameraIntentKey.ICON_PAUSE, mIconPause); if (mIconRestart != 0) intent.putExtra(CameraIntentKey.ICON_RESTART, mIconRestart); if (mLabelRetry != 0) intent.putExtra(CameraIntentKey.LABEL_RETRY, mLabelRetry); if (mLabelConfirm != 0) intent.putExtra(CameraIntentKey.LABEL_CONFIRM, mLabelConfirm); intent.putExtra("showGuide",showGuide); return intent; } public void start(int requestCode,boolean showGuide) { if (mIsFragment && mSupportFragment != null) mSupportFragment.startActivityForResult(getIntent(showGuide), requestCode); else if (mIsFragment && mAppFragment != null) mAppFragment.startActivityForResult(getIntent(showGuide), requestCode); else mActivityContext.startActivityForResult(getIntent(showGuide), requestCode); } }