录音机代码分析
来源:互联网 发布:linux命令 system dd 编辑:程序博客网 时间:2024/06/05 14:35
从Activity流程一步步往下走:
首先是SoundRecorder.java:
public class SoundRecorder extends Activity implements SoundRecorderService.OnEventListener, SoundRecorderService.OnErrorListener, SoundRecorderService.OnStateChangedListener, Button.OnClickListener, SoundRecorderService.OnUpdateTimeViewListener { private static final String TAG = "SR/SoundRecorder"; private static final String NULL_STRING = ""; private static final int OPTIONMENU_SELECT_FORMAT = 0; private static final int OPTIONMENU_SELECT_MODE = 1; private static final int OPTIONMENU_SELECT_EFFECT = 2; private static final int DIALOG_SELECT_MODE = 0; private static final int DIALOG_SELECT_FORMAT = 1; public static final int DIALOG_SELECT_EFFECT = 2; private static final int TWO_BUTTON_WEIGHT_SUM = 2; private static final int THREE_BUTTON_WEIGHT_SUM = 3; private static final int REQURST_FILE_LIST = 1; private static final int TIME_BASE = 60; private static final int TIME_TEXT_ZIZE=40; //add private static final int HOUR_TIME=24;// private String mTimerFormat = "%02d:%02d:%02d";//add private static final int TIME_BASIS=1440; private static final long MAX_FILE_SIZE_NULL = -1L; private static final int TIME_NINE_MIN = 540; private static final int MMS_FILE_LIMIT = 190; private static final long ONE_SECOND = 1000; private static final int DONE = 100; public static final int TWO_LEVELS = 2; public static final int THREE_LEVELS = 3; private static final int PERMISSION_RECORD_AUDIO = 1; private static final int PERMISSION_READ_STORAGE = 2; private static final int PERMISSION_READ_STORAGE_LIST = 3; private static final String INTENT_ACTION_MAIN = "android.intent.action.MAIN"; private static final String EXTRA_MAX_BYTES = android.provider.MediaStore.Audio.Media.EXTRA_MAX_BYTES; private static final String AUDIO_NOT_LIMIT_TYPE = "audio/*"; private static final String DIALOG_TAG_SELECT_MODE = "SelectMode"; private static final String DIALOG_TAG_SELECT_FORMAT = "SelectFormat"; private static final String DIALOG_TAG_SELECT_EFFECT = "SelectEffect"; private static final String SOUND_RECORDER_DATA = "sound_recorder_data"; private static final String PATH = "path"; public static final String PLAY = "play"; public static final String RECORD = "record"; public static final String INIT = "init"; public static final String DOWHAT = "dowhat"; public static final String EMPTY = ""; public static final String ERROR_CODE = "errorCode"; private int mSelectedFormat = -1; private int mSelectedMode = -1; private boolean[] mSelectEffectArray = new boolean[3]; private boolean[] mSelectEffectArrayTemp = new boolean[3]; private String mRequestedType = AUDIO_NOT_LIMIT_TYPE; private String mTimerFormat = null; private String mFileName = ""; private String mDoWhat = null; private String mDoWhatFilePath = null; private long mMaxFileSize = -1L; private boolean mRunFromLauncher = true; private boolean mHasFileSizeLimitation = false; private boolean mBackPressed = false; private boolean mOnSaveInstanceStateHasRun = false; private WakeLock mWakeLock = null; private boolean mIsStopService = false; // M: used for saving record file when SoundRecorder launch from other // application private boolean mSetResultAfterSave = true; // private WakeLock mWakeLock = null; private SharedPreferences mPrefs = null; private boolean mIsButtonDisabled = false; private Menu mMenu = null; private Button mAcceptButton; private Button mDiscardButton; private ImageButton mRecordButton; private ImageButton mPlayButton; private ImageButton mStopButton; private ImageButton mFileListButton; private ImageButton mPauseRecordingButton; // image view at the left of mStateTextView// private ImageView mRecordingStateImageView; // image view at the left of mRecordingFileNameTextView private ImageView mPlayingStateImageView; private TextView mRemainingTimeTextView; // message below the state message private TextView mStateTextView; // state message with LED private TextView mTimerTextView;// private TextView innertime; private TextView mRecordingFileNameTextView;// private ProgressBar mStateProgressBar; private LinearLayout mExitButtons;// private VUMeter mVUMeter; private MyAF mMyAF; private NOMOVE nomove; private LinearLayout mButtonParent; private OnScreenHint mStorageHint;// private ImageView mFirstLine;// private ImageView mSecondLine; private FrameLayout mFrameLayout; private boolean mIsRecordStarting = false; //start by zhangshifan for bug16864 录音机在保存录音机文件时不能重命名文件.2016.12.16 private RenameDialogFragment mRenameDialogFragment; private static final String DIALOG_TAG_RENAME = "Rename"; //end by zhangshifan for bug16864 录音机在保存录音机文件时不能重命名文件.2016.12.16 // M: add for long string in option menu private static final String LIST_MENUITEM_VIEW_NAME = "com.android.internal.view.menu.ListMenuItemView"; private static final Class[] INFLATER_CONSTRUCTOR_SIGNATURE = new Class[] { Context.class, AttributeSet.class }; private static Class sListMenuItemViewClass = null; private static Constructor sListMenuItemViewConstructor = null; private boolean mFileFromList = false; private boolean mResumeNeedRefresh = false; private boolean mSavingRecordFileFromMms = false; private SoundRecorderService mService = null; private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName arg0, IBinder arg1) { PDebug.Start("onServiceConnected"); LogUtils.i(TAG, "<onServiceConnected> Service connected"); mService = ((SoundRecorderService.SoundRecorderBinder) arg1).getService(); initWhenHaveService(); PDebug.End("onServiceConnected"); } @Override public void onServiceDisconnected(ComponentName arg0) { LogUtils.i(TAG, "<onServiceDisconnected> Service dis connected"); mService = null; } }; private DialogInterface.OnClickListener mSelectFormatListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichItemSelect) { LogUtils.i(TAG, "<mSelectFormatListener onClick>"); setSelectedFormat(whichItemSelect); dialog.dismiss(); } }; private DialogInterface.OnClickListener mSelectModeListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichItemSelect) { LogUtils.i(TAG, "<mSelectModeListener onClick>"); setSelectedMode(whichItemSelect); dialog.dismiss(); } }; private DialogInterface.OnClickListener mSelectEffectOkListener = new OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { mSelectEffectArray = mSelectEffectArrayTemp.clone(); if (null != mService) { mService.setSelectEffectArray(mSelectEffectArray); } } }; private DialogInterface.OnMultiChoiceClickListener mSelectEffectMultiChoiceClickListener = new OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface arg0, int arg1, boolean arg2) { mSelectEffectArrayTemp[arg1] = arg2; if (null != mService) { mService.setSelectEffectArrayTmp(mSelectEffectArrayTemp); } } }; private SoundRecorderService.OnUpdateButtonState mButtonUpdater = new SoundRecorderService.OnUpdateButtonState() { @Override public void updateButtonState(boolean enable) { if (!enable) { SoundRecorder.this.disableButton(); } } }; @Override public void onEvent(int eventCode) { switch (eventCode) { case SoundRecorderService.EVENT_SAVE_SUCCESS: LogUtils.i(TAG, "<onEvent> EVENT_SAVE_SUCCESS"); Uri uri = mService.getSaveFileUri(); if (null != uri) { mHandler.sendEmptyMessage(SoundRecorderService.STATE_SAVE_SUCESS); } if (!mRunFromLauncher) { LogUtils.i(TAG, "<onEvent> mSetResultAfterSave = " + mSetResultAfterSave); if (mSetResultAfterSave) { setResult(RESULT_OK, new Intent().setData(uri) .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)); LogUtils.i(TAG, "<onEvent> finish"); LogUtils.i(TAG, "<onEvent> Activity = " + this.toString()); finish(); } else { mSetResultAfterSave = true; } } mService.reset(); mHandler.sendEmptyMessage(mService.getCurrentState()); long mEndSaveTime = System.currentTimeMillis(); Log.i(TAG, "[Performance test][SoundRecorder] recording save end [" + mEndSaveTime + "]"); break; case SoundRecorderService.EVENT_DISCARD_SUCCESS: LogUtils.i(TAG, "<onEvent> EVENT_DISCARD_SUCCESS"); if (mRunFromLauncher) { mService.reset(); mHandler.sendEmptyMessage(mService.getCurrentState()); } else { mService.reset(); LogUtils.i(TAG, "<onEvent> finish"); LogUtils.i(TAG, "<onEvent> Activity = " + this.toString()); finish();// return; } break; case SoundRecorderService.EVENT_STORAGE_MOUNTED: LogUtils.i(TAG, "<onEvent> EVENT_STORAGE_MOUNTED"); // remove error dialog after sd card mounted removeOldFragmentByTag(ErrorHandle.ERROR_DIALOG_TAG); break; default: LogUtils.i(TAG, "<onEvent> event out of range, event code = " + eventCode); break; } } @Override public void onStateChanged(int stateCode) { LogUtils.i(TAG, "<onStateChanged> change to " + stateCode); if (!mRunFromLauncher) { if (stateCode == SoundRecorderService.STATE_RECORDING) { acquireWakeLock(); } else { releaseWakeLock(); } } mHandler.removeMessages(stateCode); mHandler.sendEmptyMessage(stateCode); } @Override public void onError(int errorCode) { LogUtils.i(TAG, "<onError> errorCode = " + errorCode); // M: if OnSaveInstanceState has run, we do not show Dialogfragment now, // or else FragmentManager will throw IllegalStateException if (!mOnSaveInstanceStateHasRun) { Bundle bundle = new Bundle(1); bundle.putInt(ERROR_CODE, errorCode); Message msg = mHandler.obtainMessage(SoundRecorderService.STATE_ERROR); msg.setData(bundle); mHandler.sendMessage(msg); } } /** * Handle the button * * @param button * which button has been clicked */ public void onClick(View button) { // avoid to response button click event when // activity is paused/stopped/destroy. if (isFinishing()) { return; } if (!button.isEnabled()) { return; } LogUtils.i(TAG, "<onClick> Activity = " + this.toString()); switch (button.getId()) { case R.id.recordButton: LogUtils.i(TAG, "<onClick> recordButton"); onClickRecordButton(); break; case R.id.playButton: LogUtils.i(TAG, "<onClick> playButton"); onClickPlayButton(); break; case R.id.stopButton: LogUtils.i(TAG, "<onClick> stopButton"); onClickStopButton(); break; case R.id.acceptButton: LogUtils.i(TAG, "<onClick> acceptButton"); onClickAcceptButton(); break; case R.id.discardButton: LogUtils.i(TAG, "<onClick> discardButton"); onClickDiscardButton(); break; case R.id.fileListButton: onClickFileListButton(); break; case R.id.pauseRecordingButton: LogUtils.i(TAG, "<onClick> pauseRecordingButton"); onClickPauseRecordingButton(); break; default: break; } } @Override// public void onCreate(Bundle icycle) { protected void onCreate(Bundle savedInstanceState) { PDebug.Start("onCreate()"); PDebug.Start("onCreate -- super onCreate"); super.onCreate(savedInstanceState); PDebug.End("onCreate -- super onCreate"); LogUtils.i(TAG, "<onCreate> start, Activity = " + this.toString()); /** * M: process the string of menu item too long */ PDebug.Start("onCreate -- addOptionsMenuInflaterFactory"); addOptionsMenuInflaterFactory(); PDebug.End("onCreate -- addOptionsMenuInflaterFactory"); // init PDebug.Start("onCreate -- setContentView"); setContentView(R.layout.main); PDebug.End("onCreate -- setContentView"); PDebug.Start("onCreate -- initFromIntent"); if (!initFromIntent()) { setResult(RESULT_CANCELED); finish(); return; } PDebug.End("onCreate -- initFromIntent"); if (!mRunFromLauncher) { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); LogUtils.e(TAG, "<onCreate> PowerManager == " + pm); if (pm != null) { mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, TAG); } } PDebug.Start("onCreate -- initParams"); //Initial the record parameters shared preferences when firstly use. RecordParamsSetting.initRecordParamsSharedPreference(SoundRecorder.this); PDebug.End("onCreate -- initParams"); mResumeNeedRefresh = true; LogUtils.i(TAG, "<onCreate> end"); PDebug.End("onCreate()"); } @Override protected void onResume() { PDebug.Start("onResume()"); super.onResume(); LogUtils.i(TAG, "<onResume> start mRunFromLauncher = " + mRunFromLauncher + ", Activity = " + this.toString()); mOnSaveInstanceStateHasRun = false; if (mService == null) { disableButton(); // start service LogUtils.i(TAG, "<onResume> start service"); PDebug.Start("onResume()-startService"); if (null == startService(new Intent(SoundRecorder.this, SoundRecorderService.class))) { LogUtils.e(TAG, "<onResume> fail to start service"); finish(); return; } PDebug.End("onResume()-startService"); // bind service LogUtils.i(TAG, "<onResume> bind service"); PDebug.Start("onResume()-bindService"); if (!bindService(new Intent(SoundRecorder.this, SoundRecorderService.class), mServiceConnection, BIND_AUTO_CREATE)) { LogUtils.e(TAG, "<onResume> fail to bind service"); finish(); return; } PDebug.End("onResume()-bindService"); // M: reset ui to initial state, or else the UI may be abnormal before service not bind PDebug.Start("onResume()-resetUi"); if (mResumeNeedRefresh) { resetUi(); } PDebug.End("onResume()-resetUi"); } else { // M: when switch SoundRecorder and RecordingFileList quickly, it's // possible that onStop was not been called, // but onResume is called, in this case, mService has not been // unbind, so mService != null // but we still should do some initial operation, such as play // recording file which select from RecordingFileList initWhenHaveService(); } PDebug.End("onResume()"); LogUtils.i(TAG, "<onResume> end"); } @Override public void onBackPressed() { LogUtils.i(TAG, "<onBackPressed> start, Activity = " + this.toString()); mBackPressed = true; if (!mRunFromLauncher) { if (mService != null) { mService.doStop(mButtonUpdater); if (mService.isCurrentFileWaitToSave()) { LogUtils.i(TAG, "<onBackPressed> mService.saveRecord()"); mService.doSaveRecord(mButtonUpdater); } else { // M: if not call saveRecord, we finish activity by ourself finish(); } } else { // M: if not call saveRecord, we finish activity by ourself finish(); } } else { // M: if run from launcher, we do not run other operation when back // key pressed if (null != mService) { mService.storeRecordParamsSettings(); } super.onBackPressed(); } LogUtils.i(TAG, "<onBackPressed> end"); } @Override protected void onPause() { LogUtils.i(TAG, "<onPause> start, Activity =" + this.toString()); if (!mBackPressed && mService != null && !mRunFromLauncher) { if (mService.getCurrentState() == SoundRecorderService.STATE_RECORDING) { mService.doStop(mButtonUpdater); } if (mService.isCurrentFileWaitToSave()) { LogUtils.i(TAG, "<onPause> mService.saveRecord()"); mService.saveRecord(); } } mBackPressed = false; LogUtils.i(TAG, "<onPause> end"); super.onPause(); } @Override protected void onStop() { LogUtils.i(TAG, "<onStop> start, Activity = " + this.toString()); if (mRunFromLauncher && mService != null) { boolean stopService = (mService.getCurrentState() == SoundRecorderService.STATE_IDLE) && !mService.isCurrentFileWaitToSave(); // M: if another instance of soundrecorder has been resume, // the listener of service has changed to another instance, so we // cannot call setAllListenerSelf boolean isListener = mService.isListener(SoundRecorder.this); LogUtils.i(TAG, "<onStop> isListener = " + isListener); if (isListener) { // set listener of service as default, // so when error occurs, service can show error info in toast mService.setAllListenerSelf(); } LogUtils.i(TAG, "<onStop> unbind service"); unbindService(mServiceConnection); mIsStopService = stopService && isListener; mService = null; } hideStorageHint(); LogUtils.i(TAG, "<onStop> end"); super.onStop(); } @Override protected void onDestroy() { LogUtils.i(TAG, "<onDestroy> start, Activity = " + this.toString()); if (mRunFromLauncher && mIsStopService) { LogUtils.i(TAG, "<onDestroy> stop service"); stopService(new Intent(SoundRecorder.this, SoundRecorderService.class)); } if (!mRunFromLauncher) { releaseWakeLock(); } LogUtils.i(TAG, "<onDestroy> end"); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { LogUtils.i(TAG, "<onSaveInstanceState> start"); mOnSaveInstanceStateHasRun = true; if (null != mService) { mService.storeRecordParamsSettings(); } LogUtils.i(TAG, "<onSaveInstanceState> end"); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); LogUtils.i(TAG, "<onRestoreInstanceState> start"); restoreDialogFragment(); restoreRecordParamsSettings(); LogUtils.i(TAG, "<onRestoreInstanceState> end"); } @Override /** * M: add option menu to select record mode and format */ public boolean onCreateOptionsMenu(Menu menu) { LogUtils.i(TAG, "<onCreateOptionsMenu> begin"); super.onCreateOptionsMenu(menu); MenuInflater menuInflater = new MenuInflater(getApplicationContext()); menuInflater.inflate(R.menu.option_menu, menu); mMenu = menu; LogUtils.i(TAG, "<onCreateOptionsMenu> end"); return true; } @Override /** * M: add option menu to select record mode and format */ public boolean onPrepareOptionsMenu(Menu menu) { LogUtils.i(TAG, "<onPrepareOptionsMenu> start"); super.onPrepareOptionsMenu(menu); mMenu = menu; updateOptionsMenu(true); LogUtils.i(TAG, "<onPrepareOptionsMenu> end"); return true; } @Override /** * M: add option menu to select record mode and format, * when select one item, show corresponding dialog */ public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (R.id.record_format == id) { showDialogFragment(DIALOG_SELECT_FORMAT, null); } else if (R.id.record_mode == id) { showDialogFragment(DIALOG_SELECT_MODE, null); } else if (R.id.record_effect == id) { mSelectEffectArrayTemp = mSelectEffectArray.clone(); showDialogFragment(DIALOG_SELECT_EFFECT, null); } return true; } @Override /** * M: add process of view focus, and save configuration change state when * SoundRecorder is started by other application */ public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); LogUtils.i(TAG, "<onConfigurationChanged> start"); View viewFocus = this.getCurrentFocus(); int viewId = -1; if (null != viewFocus) { viewId = viewFocus.getId(); } setContentView(R.layout.main); if (null != mService) { initResourceRefs(); if (!mService.isCurrentFileWaitToSave()) { mExitButtons.setVisibility(View.INVISIBLE);// mFirstLine.setVisibility(View.INVISIBLE); } mHandler.sendEmptyMessage(mService.getCurrentState()); mService.storeRecordParamsSettings(); } else { resetUi(); disableButton(); } if (viewId >= 0) { View view = findViewById(viewId); if (null != view) { view.setFocusable(true); view.requestFocus(); } } LogUtils.i(TAG, "<onConfigurationChanged> end"); } @Override /** * M: do record or play operation after press record * or press one record item in RecordingFileList */ protected void onActivityResult(int requestCode, int resultCode, Intent data) { LogUtils.i(TAG, "<onActivityResult> start"); if (RESULT_OK != resultCode) { LogUtils.i(TAG, "<onActivityResult> resultCode != RESULT_OK, return"); return; } if ((null != mService) && (null != mFileListButton)) { mFileListButton.setEnabled(true); } Intent intent = data; Bundle bundle = intent.getExtras(); if (null == bundle) { LogUtils.i(TAG, "<onActivityResult> bundle == null, return"); return; } mDoWhat = bundle.getString(DOWHAT); if (null != mDoWhat) { if (mDoWhat.equals(PLAY)) { if ((null != intent.getExtras()) && (null != intent.getExtras().getString(PATH))) { mDoWhatFilePath = intent.getExtras().getString(PATH); mFileFromList = true; } } } // later, after mService connected, play/record LogUtils.i(TAG, "<onActivityResult> end"); } private void initWhenHaveService() { LogUtils.i(TAG, "<initWhenHaveService> start"); mService.setErrorListener(SoundRecorder.this); mService.setEventListener(SoundRecorder.this); mService.setStateChangedListener(SoundRecorder.this); mService.setShowNotification(mRunFromLauncher); //Add for update time view through implements the listener defined by SoundRecorderService. mService.setUpdateTimeViewListener(SoundRecorder.this); initResourceRefs(); // M: if run from other application, we will stop recording and auto // save the recording file // and reset SoundRecorder to innitial state if (!mRunFromLauncher) { mService.doStop(mButtonUpdater); if (mService.isCurrentFileWaitToSave()) { // M: set mSetResultAfterSave = false ,and set // mSetResultAfterSave = true in onEvent mSetResultAfterSave = false; LogUtils.i(TAG, "<initWhenHaveService> save record when run from other ap"); mService.doSaveRecord(mButtonUpdater); mSavingRecordFileFromMms = true; } else { mService.reset(); }// return true;// } else {// return super.onKeyDown(keyCode, event); } restoreRecordParamsSettings(); mHandler.sendEmptyMessage(mService.getCurrentState()); // do action that need to bo in onActivityResult if (RECORD.equals(mDoWhat)) { onClickRecordButton(); } else if (PLAY.equals(mDoWhat)) { mService.playFile(mDoWhatFilePath); } mDoWhat = null; mDoWhatFilePath = null; LogUtils.i(TAG, "<initWhenHaveService> end"); } /** * Whenever the UI is re-created (due f.ex. to orientation change) we have * to reinitialize references to the views. */ private void initResourceRefs() { LogUtils.i(TAG, "<initResourceRefs> start"); initResourceRefsWhenNoService(); /** * M: set related property according to if SoundRecorder is started by * launcher @{ */ if (mRunFromLauncher) { mPlayButton.setOnClickListener(this); mFileListButton.setOnClickListener(this); mPauseRecordingButton.setOnClickListener(this); } else { mPlayButton.setVisibility(View.GONE); mFileListButton.setVisibility(View.GONE); mPauseRecordingButton.setVisibility(View.GONE); } /** @} */ mRecordButton.setOnClickListener(this); mStopButton.setOnClickListener(this); mAcceptButton.setOnClickListener(this); mDiscardButton.setOnClickListener(this); setTitle(getResources().getString(R.string.app_name));// mVUMeter.setRecorder(mService.getRecorder());// mMyAF.setRecorder(mService.getRecorder()); if (mResumeNeedRefresh) { setTimerTextView(true); mResumeNeedRefresh = false; } LogUtils.i(TAG, "<initResourceRefs> end"); } /** * init state when onCreate * * @return whether success when init */ private boolean initFromIntent() { LogUtils.i(TAG, "<initFromIntent> start"); Intent intent = getIntent(); if (null != intent) { LogUtils.i(TAG, "<initFromIntent> Intent is " + intent.toString()); /** * M: check if SoundRecorder is start by launcher or start by * SoundRecorderService */ String action = intent.getAction(); if (action == null) { LogUtils.i(TAG, "<initFromIntent> the action is null"); mRunFromLauncher = true; } else { mRunFromLauncher = (action.equals(INTENT_ACTION_MAIN)) || (action.equals("com.android.soundrecorder.SoundRecorder")); } String typeString = intent.getType(); if (null != typeString) { if (RecordParamsSetting.isAvailableRequestType(typeString)) { mRequestedType = typeString; } else { LogUtils.i(TAG, "<initFromIntent> return false"); return false; } } mMaxFileSize = intent.getLongExtra(EXTRA_MAX_BYTES, MAX_FILE_SIZE_NULL); /** M: if mMaxFileSize != -1, set mHasFileSizeLimitation as true. */ mHasFileSizeLimitation = (mMaxFileSize != MAX_FILE_SIZE_NULL); /* Pass extras to recording time calculation Extension */ IRecordingTimeCalculationExt ext = ExtensionHelper.getRecordingTimeCalculationExt(getApplicationContext()); ext.setExtras(intent.getExtras()); } LogUtils.i(TAG, "<initFromIntent> end"); return true; } /** * show dialog use DialogFragment * * @param id * the flag of dialog * @param args * the parameters of create dialog * * M: use DialogFragment to show dialog, for showDialog() is * deprecated in current version */ private void showDialogFragment(int id, Bundle args) { LogUtils.i(TAG, "<showDialogFragment> start"); DialogFragment newFragment = null; FragmentManager fragmentManager = getFragmentManager(); switch (id) { case DIALOG_SELECT_FORMAT: removeOldFragmentByTag(DIALOG_TAG_SELECT_FORMAT); newFragment = SelectDialogFragment.newInstance(RecordParamsSetting .getFormatStringArray(SoundRecorder.this), null, R.string.select_voice_quality, true, mSelectedFormat, null); ((SelectDialogFragment) newFragment).setOnClickListener(mSelectFormatListener); newFragment.show(fragmentManager, DIALOG_TAG_SELECT_FORMAT); LogUtils.i(TAG, "<showDialogFragment> show select format dialog"); break; case DIALOG_SELECT_MODE: removeOldFragmentByTag(DIALOG_TAG_SELECT_MODE); newFragment = SelectDialogFragment.newInstance(RecordParamsSetting .getModeStringIDArray(), null, R.string.select_recording_mode, true, mSelectedMode, null); ((SelectDialogFragment) newFragment).setOnClickListener(mSelectModeListener); newFragment.show(fragmentManager, DIALOG_TAG_SELECT_MODE); LogUtils.i(TAG, "<showDialogFragment> show select mode dialog"); break; case DIALOG_SELECT_EFFECT: removeOldFragmentByTag(DIALOG_TAG_SELECT_EFFECT); newFragment = SelectDialogFragment.newInstance(RecordParamsSetting .getEffectStringIDArray(), null, R.string.select_recording_effect, false, 0, mSelectEffectArray); ((SelectDialogFragment) newFragment).setOnClickListener(mSelectEffectOkListener); ((SelectDialogFragment) newFragment).setOnMultiChoiceListener(mSelectEffectMultiChoiceClickListener); newFragment.show(fragmentManager, DIALOG_TAG_SELECT_EFFECT); break; default: break; } fragmentManager.executePendingTransactions(); LogUtils.i(TAG, "<showDialogFragment> end"); } /** * remove old DialogFragment * * @param tag * the tag of DialogFragment to be removed */ private void removeOldFragmentByTag(String tag) { LogUtils.i(TAG, "<removeOldFragmentByTag> start"); FragmentManager fragmentManager = getFragmentManager(); DialogFragment oldFragment = (DialogFragment) fragmentManager.findFragmentByTag(tag); LogUtils.i(TAG, "<removeOldFragmentByTag> oldFragment = " + oldFragment); if (null != oldFragment) { oldFragment.dismissAllowingStateLoss(); LogUtils.i(TAG, "<removeOldFragmentByTag> remove oldFragment success"); } LogUtils.i(TAG, "<removeOldFragmentByTag> end"); } /** * set current record mode when user select an item in SelectDialogFragment * * @param mode * mode to be set */ public void setSelectedMode(int which) { mSelectedMode = RecordParamsSetting.getSelectMode(which); if (null != mService) { mService.setSelectedMode(mSelectedMode); } LogUtils.i(TAG, "<setSelectedMode> mSelectedMode = " + mSelectedMode); } /** * set current record format when user select an item in * SelectDialogFragment * * @param which * which format has selected */ public void setSelectedFormat(int which) { mSelectedFormat = RecordParamsSetting.getSelectFormat(which); if (null != mService) { mService.setSelectedFormat(mSelectedFormat); } LogUtils.i(TAG, "<setSelectedFormat> mSelectedFormat = " + mSelectedFormat); } /** * M: reset the UI to initial state when mService is not available, only * used in onResume */ private void resetUi() { initResourceRefsWhenNoService(); disableButton(); setTitle(getResources().getString(R.string.app_name)); mButtonParent.setWeightSum(THREE_BUTTON_WEIGHT_SUM);//... mRecordButton.setEnabled(true); mRecordButton.setFocusable(true); mRecordButton.setSoundEffectsEnabled(true); mPlayButton.setVisibility(View.GONE); mStopButton.setEnabled(false); mStopButton.setFocusable(false); nomove.setVisibility(View.VISIBLE);// innertime.setVisibility(View.VISIBLE); mMyAF.setVisibility(View.GONE); mStopButton.setVisibility(View.VISIBLE); if (mRunFromLauncher) { mFileListButton.setVisibility(View.VISIBLE); mFileListButton.setEnabled(true); mFileListButton.setFocusable(true); } else { mFileListButton.setVisibility(View.VISIBLE); mFileListButton.setEnabled(true); mFileListButton.setFocusable(true); mStopButton.setVisibility(View.VISIBLE); mStopButton.setEnabled(false); mStopButton.setFocusable(false); } mPauseRecordingButton.setVisibility(View.GONE); mPauseRecordingButton.setSoundEffectsEnabled(false); mRemainingTimeTextView.setVisibility(View.INVISIBLE);// mRecordingStateImageView.setVisibility(View.INVISIBLE); mStateTextView.setVisibility(View.INVISIBLE); mPlayingStateImageView.setVisibility(View.GONE); mRecordingFileNameTextView.setVisibility(View.INVISIBLE);// mFirstLine.setVisibility(View.GONE); mExitButtons.setVisibility(View.INVISIBLE); mMyAF.setVisibility(View.GONE); nomove.setVisibility(View.VISIBLE);// mVUMeter.setVisibility(View.VISIBLE);// mVUMeter.mCurrentAngle = 0;// mStateProgressBar.setVisibility(View.INVISIBLE); /**M: Avoid fresh the timer view if current is recording state.@{**/ if (mService == null || (mService.getCurrentState() != SoundRecorderService.STATE_RECORDING)) { setTimerTextView(true); } /**@}**/ } private void initResourceRefsWhenNoService() { nomove= (NOMOVE) findViewById(R.id.nomove); mMyAF= (MyAF) findViewById(R.id.myaaa); mRecordButton = (ImageButton) findViewById(R.id.recordButton); mStopButton = (ImageButton) findViewById(R.id.stopButton); mPlayButton = (ImageButton) findViewById(R.id.playButton); mFileListButton = (ImageButton) findViewById(R.id.fileListButton); mPauseRecordingButton = (ImageButton) findViewById(R.id.pauseRecordingButton); mButtonParent = (LinearLayout) findViewById(R.id.buttonParent); mRemainingTimeTextView = (TextView) findViewById(R.id.stateMessage1); mStateTextView = (TextView) findViewById(R.id.stateMessage2); mTimerTextView = (TextView) findViewById(R.id.timerView); mPlayingStateImageView = (ImageView) findViewById(R.id.currState); mRecordingFileNameTextView = (TextView) findViewById(R.id.recordingFileName); mExitButtons = (LinearLayout) findViewById(R.id.exitButtons); mTimerFormat = getResources().getString(R.string.timer_format); mAcceptButton = (Button) findViewById(R.id.acceptButton); mDiscardButton = (Button) findViewById(R.id.discardButton); mFrameLayout = (FrameLayout) findViewById(R.id.frameLayout); } /** * M: Update UI on idle state */ private void updateUiOnIdleState() { LogUtils.i(TAG, "<updateUiOnIdleState> start"); boolean isCurrentFileWaitToSave = mService.isCurrentFileWaitToSave(); int time = 0; if (mFileFromList) { mFileFromList = false; } else { time = (int) mService.getCurrentFileDurationInSecond(); } if (mIsRecordStarting) { time = 0; } String timerString = String.format(mTimerFormat,time/TIME_BASIS ,time / TIME_BASE, time % TIME_BASE); setTimerViewTextSize(time); mTimerTextView.setText(timerString); String currentFilePath = mService.getCurrentFilePath(); mStateTextView.setVisibility(View.INVISIBLE); mButtonParent.setWeightSum(THREE_BUTTON_WEIGHT_SUM); mRecordButton.setVisibility(View.VISIBLE); mRecordButton.setEnabled(true); mRecordButton.setFocusable(true); mRecordButton.setSoundEffectsEnabled(true); mRecordButton.requestFocus(); mPauseRecordingButton.setVisibility(View.GONE); mPauseRecordingButton.setSoundEffectsEnabled(false); mStopButton.setEnabled(false); mStopButton.setVisibility(View.VISIBLE); if (null == currentFilePath) { mPlayButton.setVisibility(View.GONE); if (mRunFromLauncher) { mFileListButton.setVisibility(View.VISIBLE); mFileListButton.setEnabled(true); mFileListButton.setFocusable(true); } else { mFileListButton.setVisibility(View.VISIBLE); mStopButton.setVisibility(View.VISIBLE); mStopButton.setEnabled(false); mStopButton.setFocusable(false); } mRemainingTimeTextView.setVisibility(View.INVISIBLE); mPlayingStateImageView.setVisibility(View.GONE); mRecordingFileNameTextView.setVisibility(View.INVISIBLE); mExitButtons.setVisibility(View.INVISIBLE); mMyAF.setVisibility(View.GONE); nomove.setVisibility(View.VISIBLE); } else { if (mRunFromLauncher) { mButtonParent.setWeightSum(THREE_BUTTON_WEIGHT_SUM); mPlayButton.setVisibility(View.GONE); mPlayButton.setEnabled(true); mPlayButton.setFocusable(true); mPlayButton.setImageResource(R.drawable.play); } mRemainingTimeTextView.setVisibility(View.INVISIBLE); mRecordingFileNameTextView.setVisibility(View.VISIBLE); mExitButtons.setVisibility(View.INVISIBLE); mMyAF.setVisibility(View.GONE); nomove.setVisibility(View.GONE); mFileListButton.setVisibility(View.VISIBLE); if (isCurrentFileWaitToSave && mService.getCurrentState() == SoundRecorderService.STATE_IDLE) { mExitButtons.setVisibility(View.VISIBLE); mAcceptButton.setEnabled(true); mDiscardButton.setEnabled(true); mStopButton.setVisibility(View.VISIBLE); mStopButton.setEnabled(false); mStopButton.setFocusable(false); mFileListButton.setVisibility(View.VISIBLE); } else { mFileListButton.setEnabled(true); } } mIsButtonDisabled = false; LogUtils.i(TAG, "<updateUiOnIdleState> end"); } /** * M: Update UI on success state */ private void updateUiOnSaveSuccessState() { LogUtils.i(TAG, "<updateUiOnSaveSuccessState> start"); updateUiOnIdleState(); LogUtils.i(TAG, "<updateUiOnSaveSuccessState> end"); } /** * M: Update UI on pause playing state */ private void updateUiOnPausePlayingState() { LogUtils.i(TAG, "<updateUiOnPausePlayingState> start"); mButtonParent.setWeightSum(THREE_BUTTON_WEIGHT_SUM); mRecordButton.setEnabled(true); mRecordButton.setFocusable(true); mRecordButton.setSoundEffectsEnabled(true); mPlayButton.setVisibility(View.GONE); mPlayButton.setEnabled(false); mPlayButton.setFocusable(false); mPlayButton.setImageResource(R.drawable.play); mStopButton.setVisibility(View.VISIBLE); mFileListButton.setVisibility(View.VISIBLE); mFileListButton.setEnabled(false); mPauseRecordingButton.setVisibility(View.GONE); mPauseRecordingButton.setSoundEffectsEnabled(false); mStopButton.setEnabled(true); mStopButton.setFocusable(true); mRemainingTimeTextView.setVisibility(View.INVISIBLE);// mRecordingStateImageView.setVisibility(View.INVISIBLE); mStateTextView.setVisibility(View.INVISIBLE);// mPlayingStateImageView.setImageResource(R.drawable.pause);// mPlayingStateImageView.setVisibility(View.VISIBLE); mRecordingFileNameTextView.setVisibility(View.VISIBLE); boolean isCurrentFileWaitToSave = false; if (null != mService) { isCurrentFileWaitToSave = mService.isCurrentFileWaitToSave(); } if (!isCurrentFileWaitToSave) { mExitButtons.setVisibility(View.INVISIBLE);// mFirstLine.setVisibility(View.INVISIBLE);// mSecondLine.setVisibility(View.VISIBLE); } else {// mFrameLayout.setBackgroundColor(getResources().getColor(R.color.blackColor)); mExitButtons.setVisibility(View.VISIBLE); mAcceptButton.setEnabled(true); mDiscardButton.setEnabled(true);// mFirstLine.setVisibility(View.VISIBLE);// mSecondLine.setVisibility(View.INVISIBLE); } setTimerTextView(false);// mStateProgressBar.setVisibility(View.VISIBLE);// mStateProgressBar.setProgress((int) (100// * mService.getCurrentProgressInMillSecond()// / mService.getCurrentFileDurationInMillSecond()));// mVUMeter.setVisibility(View.INVISIBLE); // mMyAF.setVisibility(View.INVISIBLE); mMyAF.setVisibility(View.GONE); nomove.setVisibility(View.GONE);// innertime.setVisibility(View.INVISIBLE); mIsButtonDisabled = false; LogUtils.i(TAG, "<updateUiOnPausePlayingState> end"); } /** * M: Update UI on recording state */ private void updateUiOnRecordingState() { LogUtils.i(TAG, "<updateUiOnRecordingState> start");// mFrameLayout.setBackgroundColor(getResources().getColor(R.color.frameLayoutGrayColor)); Resources res = getResources(); mButtonParent.setWeightSum(THREE_BUTTON_WEIGHT_SUM); mRecordButton.setVisibility(View.GONE); mPlayButton.setVisibility(View.GONE); mStopButton.setVisibility(View.VISIBLE); mStopButton.setEnabled(true); mStopButton.setFocusable(true); if (mRunFromLauncher) { mFileListButton.setVisibility(View.VISIBLE); mFileListButton.setEnabled(false); mPauseRecordingButton.setVisibility(View.VISIBLE); mPauseRecordingButton.setEnabled(true); mPauseRecordingButton.setFocusable(true); mPauseRecordingButton.setSoundEffectsEnabled(false); } else { mRecordButton.setVisibility(View.VISIBLE); mRecordButton.setEnabled(false); mRecordButton.setFocusable(false); mRecordButton.setSoundEffectsEnabled(true);// mFileListButton.setVisibility(View.GONE); mFileListButton.setVisibility(View.VISIBLE); mFileListButton.setEnabled(false); mPauseRecordingButton.setVisibility(View.GONE); }// mRecordingStateImageView.setVisibility(View.VISIBLE);// mRecordingStateImageView.setImageResource(R.drawable.recording_led); mStateTextView.setVisibility(View.VISIBLE); mStateTextView.setText(res.getString(R.string.recording)); mRemainingTimeTextView.setText(EMPTY); mRemainingTimeTextView.setVisibility(View.VISIBLE); mPlayingStateImageView.setVisibility(View.GONE); mRecordingFileNameTextView.setVisibility(View.VISIBLE); mExitButtons.setVisibility(View.INVISIBLE);// mFirstLine.setVisibility(View.INVISIBLE);// mSecondLine.setVisibility(View.VISIBLE);// mVUMeter.setVisibility(View.VISIBLE); // mMyAF.setVisibility(View.INVISIBLE); mMyAF.setVisibility(View.VISIBLE); nomove.setVisibility(View.GONE);// innertime.setVisibility(View.INVISIBLE);// mStateProgressBar.setVisibility(View.INVISIBLE); int remainingTime = (int) mService.getRemainingTime(); boolean isUpdateRemainingTimerView = mHasFileSizeLimitation ? (remainingTime < MMS_FILE_LIMIT) : (remainingTime < TIME_NINE_MIN); if ((remainingTime > 0) && isUpdateRemainingTimerView) { updateRemainingTimerView(remainingTime); } setTimerTextView(false); mIsButtonDisabled = false; LogUtils.i(TAG, "<updateUiOnRecordingState> end"); } /** * M: Update UI on pause Recording state */ private void updateUiOnPauseRecordingState() { LogUtils.i(TAG, "<updateUiOnPauseRecordingState> start"); Resources res = getResources(); mButtonParent.setWeightSum(THREE_BUTTON_WEIGHT_SUM); mRecordButton.setVisibility(View.VISIBLE); mRecordButton.setEnabled(true); mRecordButton.setFocusable(true); mRecordButton.setSoundEffectsEnabled(false); mPlayButton.setVisibility(View.GONE); mFileListButton.setVisibility(View.VISIBLE); mFileListButton.setEnabled(true); mPauseRecordingButton.setVisibility(View.GONE); mStopButton.setVisibility(View.VISIBLE); mStopButton.setEnabled(true); mStopButton.setFocusable(true);// mRecordingStateImageView.setVisibility(View.VISIBLE);// mRecordingStateImageView.setImageResource(R.drawable.idle_led); mStateTextView.setVisibility(View.VISIBLE); mStateTextView.setText(res.getString(R.string.recording_paused)); mRemainingTimeTextView.setVisibility(View.INVISIBLE); mPlayingStateImageView.setVisibility(View.GONE); mRecordingFileNameTextView.setVisibility(View.VISIBLE); mExitButtons.setVisibility(View.INVISIBLE);// mFirstLine.setVisibility(View.INVISIBLE);// mSecondLine.setVisibility(View.VISIBLE);// mVUMeter.setVisibility(View.VISIBLE);// mVUMeter.mCurrentAngle = 0; mMyAF.setVisibility(View.GONE); nomove.setVisibility(View.VISIBLE);// innertime.setVisibility(View.INVISIBLE);// mStateProgressBar.setVisibility(View.INVISIBLE); setTimerTextView(false); mIsButtonDisabled = false; LogUtils.i(TAG, "<updateUiOnPauseRecordingState> end"); } /** * M: Update UI on playing state */ private void updateUiOnPlayingState() { LogUtils.i(TAG, "<updateUiOnPlayingState> start"); mButtonParent.setWeightSum(THREE_BUTTON_WEIGHT_SUM); mRecordButton.setEnabled(true); mRecordButton.setFocusable(true); mRecordButton.setSoundEffectsEnabled(true); mPlayButton.setVisibility(View.INVISIBLE); mPlayButton.setEnabled(false); mPlayButton.setFocusable(false); mPlayButton.setImageResource(R.drawable.pause); mFileListButton.setVisibility(View.GONE); mPauseRecordingButton.setVisibility(View.GONE); mPauseRecordingButton.setSoundEffectsEnabled(false); mStopButton.setVisibility(View.VISIBLE); mStopButton.setEnabled(true); mStopButton.setFocusable(true);// mRecordingStateImageView.setVisibility(View.INVISIBLE); mStateTextView.setVisibility(View.INVISIBLE); mRemainingTimeTextView.setVisibility(View.INVISIBLE);// mPlayingStateImageView.setVisibility(View.VISIBLE);// mPlayingStateImageView.setImageResource(R.drawable.play); mRecordingFileNameTextView.setVisibility(View.VISIBLE); if (!mService.isCurrentFileWaitToSave()) { mExitButtons.setVisibility(View.INVISIBLE);// mFirstLine.setVisibility(View.INVISIBLE);// mSecondLine.setVisibility(View.VISIBLE); } else {// mFrameLayout.setBackgroundColor(getResources().getColor(R.color.blackColor)); mExitButtons.setVisibility(View.VISIBLE); mAcceptButton.setEnabled(true); mDiscardButton.setEnabled(true);// mFirstLine.setVisibility(View.VISIBLE);// mSecondLine.setVisibility(View.INVISIBLE); } nomove.setVisibility(View.GONE);// innertime.setVisibility(View.INVISIBLE); mMyAF.setVisibility(View.GONE);// mVUMeter.setVisibility(View.INVISIBLE); // mMyAF.setVisibility(View.INVISIBLE);// mStateProgressBar.setVisibility(View.VISIBLE); setTimerTextView(true); mIsButtonDisabled = false; LogUtils.i(TAG, "<updateUiOnPlayingState> end"); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { boolean mShowPermission = true; if (requestCode == PERMISSION_RECORD_AUDIO) { boolean granted = true; for (int counter = 0; counter < permissions.length; counter++) { granted = granted && (grantResults[counter] == PackageManager.PERMISSION_GRANTED); LogUtils.i(TAG, "<onRequestPermissionsResult> " + grantResults[counter]); if (grantResults[counter] != PackageManager.PERMISSION_GRANTED) { mShowPermission = mShowPermission && shouldShowRequestPermissionRationale(permissions[counter]); } LogUtils.i(TAG, "<onRequestPermissionsResult1>" + granted + mShowPermission); } if (granted == true) { onClickRecordButton(); } else { if (mShowPermission == false) { SoundRecorderUtils.getToast(SoundRecorder.this, com.mediatek.internal.R.string.denied_required_permission); return; } } } else if (requestCode == PERMISSION_READ_STORAGE_LIST) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { onClickFileListButton(); } else { if (!shouldShowRequestPermissionRationale( Manifest.permission.READ_EXTERNAL_STORAGE)) { SoundRecorderUtils.getToast( SoundRecorder.this, com.mediatek.internal.R.string.denied_required_permission); return; } } } } /** * process after click record button */ void onClickRecordButton() {// ImageView image = (ImageView) findViewById(R.id.main_image); RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(mTimerTextView.getLayoutParams()); lp.setMargins(210, 120, 0, 0); mTimerTextView.setLayoutParams(lp);// mTimerTextView.setPadding(0,0,0,60); mMyAF.setVisibility(View.GONE); nomove.setVisibility(View.VISIBLE);// innertime.setVisibility(View.VISIBLE); if (OptionsUtil.isRunningInEmulator()) { LogUtils.d(TAG, "for special action for emulator load, do nothing..."); return; } int recordAudioPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO); int readExtStorage = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE); List<String> mPermissionStrings = new ArrayList<String>(); boolean mRequest = false; LogUtils.d(TAG, "<onClickRecordButton1> " + recordAudioPermission + readExtStorage); if (readExtStorage != PackageManager.PERMISSION_GRANTED) { mPermissionStrings.add(Manifest.permission.READ_EXTERNAL_STORAGE); mRequest = true; } if (recordAudioPermission != PackageManager.PERMISSION_GRANTED) { mPermissionStrings.add(Manifest.permission.RECORD_AUDIO); mRequest = true; } if (mRequest == true) { String[] mPermissionList = new String[mPermissionStrings.size()]; mPermissionList = mPermissionStrings.toArray(mPermissionList); requestPermissions(mPermissionList, PERMISSION_RECORD_AUDIO); return; } if (null != mService) { mIsRecordStarting = true; mService.startRecordingAsync( RecordParamsSetting.getRecordParams(mRequestedType, mSelectedFormat, mSelectedMode, mSelectEffectArray, SoundRecorder.this), (int) mMaxFileSize, mButtonUpdater); } long mEndRecordingTime = System.currentTimeMillis(); Log.i(TAG, "[Performance test][SoundRecorder] recording end [" + mEndRecordingTime + "]"); } /** * process after click play button */ void onClickPlayButton() { if (!isFinishing() && null != mService) { mService.doPlayRecord(mButtonUpdater); } } /** * process after click stop button */ void onClickStopButton() { if (null == mService) { long mEndStopTime = System.currentTimeMillis(); Log.i(TAG, "[Performance test][SoundRecorder] recording stop end [" + mEndStopTime + "]"); return; } mService.doStop(mButtonUpdater); long mEndStopTime = System.currentTimeMillis(); Log.i(TAG, "[Performance test][SoundRecorder] recording stop end [" + mEndStopTime + "]"); } /** * process after click accept button */ void onClickAcceptButton() { if (null == mService) { return; } // showRenameDialog();//add by zhangshifan for bug16864 录音机在保存录音机文件时不能重命名文件.2016.12.16 mService.doSaveRecord(mButtonUpdater); } //start by zhangshifan for bug16864 录音机在保存录音机文件时不能重命名文件.2016.12.16 private void showRenameDialog(){ LogUtils.i(TAG, "<showRenameDialog>"); removeOldFragmentByTag(DIALOG_TAG_RENAME); FragmentManager fragmentManager = getFragmentManager(); LogUtils.i(TAG, "<showRenameDialog> fragmentManager = " + fragmentManager); DialogFragment newFragment = RenameDialogFragment.newInstance(); ((RenameDialogFragment) newFragment).setOnClickListener(mRenameialogListener); newFragment.show(fragmentManager, DIALOG_TAG_RENAME); fragmentManager.executePendingTransactions();//like commit mRenameDialogFragment=(RenameDialogFragment) newFragment; } private final DialogInterface.OnClickListener mRenameialogListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { LogUtils.i(TAG, "<mRenameialogListener onClick>"); String newName = mRenameDialogFragment.getNewName(); //modify by wangmingyue for 新的名称中不可以包含 . 防止用户在此修改文件名导致文件名中出现 . if(newName.lastIndexOf(".") >= 0){ Toast.makeText(getApplicationContext(),R.string.new_file_name_error, Toast.LENGTH_LONG).show(); showRenameDialog(); return; } //modify by wangmingyue for 新的名称中不可以包含 . 防止用户在此修改文件名导致文件名中出现 . if(newName.equals(mFileName)){ mService.doSaveRecord(mButtonUpdater); }else { mService.tw_doSaveRecord(mButtonUpdater,newName); } arg0.dismiss(); } }; String getFileName(){//用于RenameDialogFragment得到当前默认的文件名 return mFileName; } //end by zhangshifan for bug16864 录音机在保存录音机文件时不能重命名文件.2016.12.16 /** * process after click discard button */ void onClickDiscardButton() { if (mService != null) { mService.doDiscardRecord(mButtonUpdater); }// mVUMeter.mCurrentAngle = 0;// mVUMeter.invalidate(); // mMyAF.invalidate(); } /** * process after click file list button */ void onClickFileListButton() { if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { LogUtils.i(TAG, "<onClickRecordButton> Need storage permission"); requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_READ_STORAGE_LIST); return; } disableButton(); if (null != mService) { LogUtils.i(TAG, "<onClickFileListButton> mService.reset()"); mService.reset(); } Intent mIntent = new Intent(); mIntent.setClass(this, RecordingFileList.class); startActivityForResult(mIntent, REQURST_FILE_LIST); } /** * process after click pause recording button */ void onClickPauseRecordingButton() { if (null != mService) { mService.doPause(mButtonUpdater); } } /** * Update the big MM:SS timer. If we are in play back, also update the * progress bar. */ @Override public void updateTimerView(int time) { LogUtils.i(TAG, "<updateTimerView> start time = " + time); int state = mService.getCurrentState(); // update progress bar if (SoundRecorderService.STATE_PLAYING == state) { long fileDuration = mService.getCurrentFileDurationInMillSecond(); LogUtils.i(TAG, "<updateTimerView> fileDuration = " + fileDuration); if (fileDuration > ONE_SECOND) { long progress = mService.getCurrentProgressInMillSecond(); LogUtils.i(TAG, "<updateTimerView> progress = " + (fileDuration - progress)); if (fileDuration - progress < SoundRecorderService.WAIT_TIME) {// mStateProgressBar.setProgress(DONE); } else {// mStateProgressBar.setProgress((int) (100 * progress / fileDuration)); } } else { // mStateProgressBar.setProgress(DONE); } } // update timer setTimerTextView(time); // update remaining time if (SoundRecorderService.STATE_RECORDING == mService.getCurrentState()) { int remainingTime = (int) mService.getRemainingTime(); if (mService.isStorageLower()) { showStorageHint(getString(R.string.storage_low)); } else { hideStorageHint(); } boolean isUpdateRemainingTimerView = mHasFileSizeLimitation ? (remainingTime < MMS_FILE_LIMIT) : (remainingTime < TIME_NINE_MIN); if ((remainingTime > 0) && isUpdateRemainingTimerView) { updateRemainingTimerView(remainingTime); } } LogUtils.i(TAG, "<updateTimerView> end"); } /** * set text size bigger if time >= 100 * * @param time * time in minutes should be shown */ private void setTimerViewTextSize(int time) { /** M: set text size bigger if >= 100 @{ */ final int textSizeChangeBoundary = 100; float scale = getResources().getConfiguration().fontScale; float textSize; if ((time / TIME_BASE) >= textSizeChangeBoundary) { textSize = getResources().getDimension(R.dimen.timerView_TextSize_Small); } else { textSize = getResources().getDimension(R.dimen.timerView_TextSize_Big); } if (scale > 1) { textSize = textSize / scale; }// mTimerTextView.setTextSize(textSize); mTimerTextView.setTextSize(TIME_TEXT_ZIZE);// innertime.setTextSize(TIME_TEXT_ZIZE); /** @} */ } private void restoreDialogFragment() { FragmentManager fragmentManager = getFragmentManager(); Fragment fragment = fragmentManager.findFragmentByTag(DIALOG_TAG_SELECT_FORMAT); if (null != fragment) { ((SelectDialogFragment) fragment).setOnClickListener(mSelectFormatListener); } fragment = fragmentManager.findFragmentByTag(DIALOG_TAG_SELECT_MODE); if (null != fragment) { ((SelectDialogFragment) fragment).setOnClickListener(mSelectModeListener); } fragment = fragmentManager.findFragmentByTag(DIALOG_TAG_SELECT_EFFECT); if (null != fragment) { ((SelectDialogFragment) fragment).setOnMultiChoiceListener(mSelectEffectMultiChoiceClickListener); ((SelectDialogFragment) fragment).setOnClickListener(mSelectEffectOkListener); } } private void restoreRecordParamsSettings() { LogUtils.i(TAG, "<restoreRecordParamsSettings> "); if (mSelectedFormat != -1) { if (null != mService) { mService.setSelectedFormat(mSelectedFormat); mService.setSelectedMode(mSelectedMode); mService.setSelectEffectArray(mSelectEffectArray); mService.setSelectEffectArrayTmp(mSelectEffectArrayTemp); } LogUtils.i(TAG, "<restoreRecordParamsSettings> selectedFormat return "); return; } if (null == mPrefs) { mPrefs = getSharedPreferences(SOUND_RECORDER_DATA, 0); } int defaultRecordingLevel = RecordParamsSetting.getDefaultRecordingLevel(RecordParamsSetting.FORMAT_HIGH); mSelectedFormat = mPrefs.getInt(SoundRecorderService.SELECTED_RECORDING_FORMAT, defaultRecordingLevel); if (mSelectedFormat < 0 || mSelectedFormat > RecordParamsSetting.getQualityLevelNumber()) { mSelectedFormat = defaultRecordingLevel; } mSelectedMode = mPrefs .getInt(SoundRecorderService.SELECTED_RECORDING_MODE, RecordParamsSetting.MODE_NORMAL); if (mSelectedMode < 0) { mSelectedMode = RecordParamsSetting.MODE_NORMAL; } mSelectEffectArray[RecordParamsSetting.EFFECT_AEC] = mPrefs.getBoolean( SoundRecorderService.SELECTED_RECORDING_EFFECT_AEC, false); mSelectEffectArray[RecordParamsSetting.EFFECT_AGC] = mPrefs.getBoolean( SoundRecorderService.SELECTED_RECORDING_EFFECT_AGC, false); mSelectEffectArray[RecordParamsSetting.EFFECT_NS] = mPrefs.getBoolean( SoundRecorderService.SELECTED_RECORDING_EFFECT_NS, false); mSelectEffectArrayTemp[RecordParamsSetting.EFFECT_AEC] = mPrefs.getBoolean( SoundRecorderService.SELECTED_RECORDING_EFFECT_AEC_TMP, false); mSelectEffectArrayTemp[RecordParamsSetting.EFFECT_AGC] = mPrefs.getBoolean( SoundRecorderService.SELECTED_RECORDING_EFFECT_AGC_TMP, false); mSelectEffectArrayTemp[RecordParamsSetting.EFFECT_NS] = mPrefs.getBoolean( SoundRecorderService.SELECTED_RECORDING_EFFECT_NS_TMP, false); if (null != mService) { mService.setSelectedFormat(mSelectedFormat); mService.setSelectedMode(mSelectedMode); mService.setSelectEffectArray(mSelectEffectArray); mService.setSelectEffectArrayTmp(mSelectEffectArrayTemp); } LogUtils.i(TAG, "mSelectedFormat is:" + mSelectedFormat + "; mSelectedMode is:" + mSelectedMode); } private void updateRemainingTimerView(int second) { String timeString = ""; if (second < 0) { mRemainingTimeTextView.setText(NULL_STRING); } else if (second < TIME_BASE) { timeString = String.format(getString(R.string.sec_available), second); } else { if (second % TIME_BASE == 0) { timeString = String.format(getString(R.string.min_available), second / TIME_BASE); } else { timeString = String.format(getString(R.string.time_available), second / TIME_BASE, second % TIME_BASE); } } LogUtils.i(TAG, "<updateRemainingTimerView> mRemainingTimeTextView.setText: " + timeString); mRemainingTimeTextView.setText(timeString); mRemainingTimeTextView.setVisibility(View.VISIBLE); } /** * M: release wake lock */ private void releaseWakeLock() { // if mWakeLock is not release, release it if ((null != mWakeLock) && mWakeLock.isHeld()) { mWakeLock.release(); LogUtils.i(TAG, "<releaseWakeLock>"); } } /** * M: acquire wake lock */ private void acquireWakeLock() { if ((null != mWakeLock) && !mWakeLock.isHeld()) { mWakeLock.acquire(); LogUtils.i(TAG, "<acquireWakeLock>"); } } /** * M: add for long string in option menu */ protected void addOptionsMenuInflaterFactory() { final LayoutInflater infl = getLayoutInflater(); infl.setFactory(new Factory() { public View onCreateView(final String name, final Context context, final AttributeSet attrs) { // not create list menu item view if (!name.equalsIgnoreCase(LIST_MENUITEM_VIEW_NAME)) { return null; } // get class and constructor if (null == sListMenuItemViewClass) { try { sListMenuItemViewClass = getClassLoader().loadClass(name); } catch (ClassNotFoundException e) { return null; } } if (null == sListMenuItemViewClass) { return null; } if (null == sListMenuItemViewConstructor) { try { sListMenuItemViewConstructor = sListMenuItemViewClass .getConstructor(INFLATER_CONSTRUCTOR_SIGNATURE); } catch (SecurityException e) { return null; } catch (NoSuchMethodException e) { return null; } } if (null == sListMenuItemViewConstructor) { return null; } // create list menu item view View view = null; try { Object[] args = new Object[] { context, attrs }; view = (View) (sListMenuItemViewConstructor.newInstance(args)); } catch (IllegalArgumentException e) { return null; } catch (InstantiationException e) { return null; } catch (IllegalAccessException e) { return null; } catch (InvocationTargetException e) { return null; } if (null == view) { return null; } final View viewTemp = view; new Handler().post(new Runnable() { public void run() { TextView textView = (TextView) viewTemp.findViewById(android.R.id.title); LogUtils.e(TAG, "<create ListMenuItemView> setSingleLine"); // multi line if item string too long textView.setSingleLine(false); } }); LogUtils.e(TAG, "<create ListMenuItemView> return view = " + view.toString()); return view; } }); } private void updateOptionsMenu(boolean isShow) { LogUtils.i(TAG, "<updateOptionsMenu>"); if (null == mMenu) { LogUtils.i(TAG, "<updateOptionsMenu> mMenu == null, return"); return; } boolean allowSelectFormatAndMode = mRunFromLauncher && isShow; if (null != mService) { allowSelectFormatAndMode = mRunFromLauncher && isShow && (SoundRecorderService.STATE_IDLE == mService.getCurrentState()); } if (RecordParamsSetting.canSelectFormat()) { MenuItem item1 = mMenu.getItem(OPTIONMENU_SELECT_FORMAT); if (null != item1) { item1.setVisible(allowSelectFormatAndMode); } } if (RecordParamsSetting.canSelectMode(getApplicationContext())) { MenuItem item2 = mMenu.getItem(OPTIONMENU_SELECT_MODE); if (null != item2) { item2.setVisible(allowSelectFormatAndMode); } } if (RecordParamsSetting.canSelectEffect()) { MenuItem item3 = mMenu.getItem(OPTIONMENU_SELECT_EFFECT); if (null != item3) { item3.setVisible(allowSelectFormatAndMode); } } } private void showStorageHint(String message) { if (null == mStorageHint) { mStorageHint = OnScreenHint.makeText(this, message); } else { mStorageHint.setText(message); } mStorageHint.show(); } private void hideStorageHint() { if (null != mStorageHint) { mStorageHint.cancel(); mStorageHint = null; } } /** * M: for reduce repeat code * * initial: true to set the time as 0, otherwise set as current progress */ public void setTimerTextView(boolean initial) { int time = 0; if (!initial) { if (null != mService) { time = (int) mService.getCurrentProgressInSecond(); } } setTimerTextView(time); } private void setTimerTextView(int time) { LogUtils.i(TAG, "<setTimerTextView> start with time = " + time);// String str1 = SoundRecorder.this.mTimerFormat;// Object[] arrayOfObject = new Object[3];// arrayOfObject[0] = Integer.valueOf(0);// arrayOfObject[1] = Integer.valueOf(0);// arrayOfObject[2] = Integer.valueOf(0);// String str2 = String.format(str1, arrayOfObject); String timerString = String.format(mTimerFormat, time/TIME_BASIS,time / TIME_BASE, time % TIME_BASE); setTimerViewTextSize(time); mTimerTextView.setVisibility(View.VISIBLE);//8.30 mTimerTextView.setText(timerString);// innertime.setVisibility(View.INVISIBLE);// innertime.setText(timerString);// mTimerTextView.setText(str2); LogUtils.i(TAG, "<setTimerTextView> end"); } /** * Shows/hides the appropriate child views for the new state. M: use * different function in different state to update UI */ private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { LogUtils.i(TAG, "<handleMessage> start with msg.what-" + msg.what); if (null == mService || SoundRecorder.this.isFinishing()) { return; } if (mSavingRecordFileFromMms && msg.what != SoundRecorderService.STATE_SAVE_SUCESS) { return; } else if (mSavingRecordFileFromMms && msg.what == SoundRecorderService.STATE_SAVE_SUCESS) { mSavingRecordFileFromMms = false; } updateOptionsMenu(true); String filePath = mService.getCurrentFilePath(); LogUtils.i(TAG, "<handleMessage> mService.getCurrentFilePath() = " + filePath); mFileName = NULL_STRING; if (null != filePath) { mFileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1, filePath .length()); mFileName = (mFileName.endsWith(Recorder.SAMPLE_SUFFIX)) ? mFileName.substring(0, mFileName.lastIndexOf(Recorder.SAMPLE_SUFFIX)) : mFileName; } LogUtils.i(TAG, "<updateUi> mRecordingFileNameTextView.setText : " + mFileName); mRecordingFileNameTextView.setText(mFileName); mAcceptButton.setText(R.string.accept); if (mRunFromLauncher) { mAcceptButton.setText(R.string.save_record); } hideStorageHint(); switch (msg.what) { case SoundRecorderService.STATE_IDLE: updateUiOnIdleState(); break; case SoundRecorderService.STATE_PAUSE_PLAYING: updateUiOnPausePlayingState(); break; case SoundRecorderService.STATE_RECORDING: mIsRecordStarting = false; updateUiOnRecordingState(); break; case SoundRecorderService.STATE_PAUSE_RECORDING: updateUiOnPauseRecordingState(); break; case SoundRecorderService.STATE_PLAYING: updateUiOnPlayingState(); break; case SoundRecorderService.STATE_ERROR: Bundle bundle = msg.getData(); int errorCode = bundle.getInt(ERROR_CODE); ErrorHandle.showErrorInfo(SoundRecorder.this, errorCode); if (mService != null && mIsButtonDisabled) { updateUiAccordingState(mService.getCurrentState()); } break; case SoundRecorderService.STATE_SAVE_SUCESS: updateUiOnSaveSuccessState(); SoundRecorderUtils.getToast(SoundRecorder.this, R.string.tell_save_record_success); break; default: break; }// mVUMeter.invalidate();// mMyAF.invalidate(); LogUtils.i(TAG, "<handleMessage> end"); } }; private void updateUiAccordingState(int code) { LogUtils.d(TAG, "updateUiAccordingState start : " + code); switch (code) { case SoundRecorderService.STATE_IDLE: updateUiOnIdleState(); break; case SoundRecorderService.STATE_PAUSE_PLAYING: updateUiOnPausePlayingState(); break; case SoundRecorderService.STATE_RECORDING: updateUiOnRecordingState(); break; case SoundRecorderService.STATE_PAUSE_RECORDING: updateUiOnPauseRecordingState(); break; case SoundRecorderService.STATE_PLAYING: updateUiOnPlayingState(); break; default: break; } LogUtils.d(TAG, "updateUiAccordingState end : " + code); } /** * disable all buttons */ private void disableButton() { LogUtils.i(TAG, "<disableButton>"); closeOptionsMenu(); updateOptionsMenu(false); if (mRecordButton == null) { return; } mRecordButton.setEnabled(false); mPauseRecordingButton.setEnabled(false); mStopButton.setEnabled(false); mPlayButton.setEnabled(false); mFileListButton.setEnabled(false); mDiscardButton.setEnabled(false); mAcceptButton.setEnabled(false); mIsButtonDisabled = true; }}
分析:在oncreate中,它做了事情:
(1)addOptionsMenuInflaterFactory:加入menu菜单
(2)setContentView(R.layout.main);
(3) if (!initFromIntent()) {
setResult(RESULT_CANCELED);
finish();
return;
}
进行了一次判断:
private boolean initFromIntent() {
LogUtils.i(TAG, “ start”);
Intent intent = getIntent();
if (null != intent) {
LogUtils.i(TAG, “ Intent is ” + intent.toString());
/**
* M: check if SoundRecorder is start by launcher or start by
* SoundRecorderService
*/
String action = intent.getAction();
if (action == null) {
LogUtils.i(TAG, “ the action is null”);
mRunFromLauncher = true;
} else {
mRunFromLauncher = (action.equals(INTENT_ACTION_MAIN))
|| (action.equals(“com.android.soundrecorder.SoundRecorder”));
}
String typeString = intent.getType();
if (null != typeString) {
if (RecordParamsSetting.isAvailableRequestType(typeString)) {
mRequestedType = typeString;
} else {
LogUtils.i(TAG, “ return false”);
return false;
}
}
mMaxFileSize = intent.getLongExtra(EXTRA_MAX_BYTES, MAX_FILE_SIZE_NULL);
/* M: if mMaxFileSize != -1, set mHasFileSizeLimitation as true. /
mHasFileSizeLimitation = (mMaxFileSize != MAX_FILE_SIZE_NULL);
/* Pass extras to recording time calculation Extension */ IRecordingTimeCalculationExt ext = ExtensionHelper.getRecordingTimeCalculationExt(getApplicationContext()); ext.setExtras(intent.getExtras()); } LogUtils.i(TAG, "<initFromIntent> end"); return true;}在第一次打开此应用,此方法return true,getIntent的为空
TODO
- 录音机代码分析
- Java录音机代码
- Android 录音机模块分析
- linphone mediastream2 分析-双向录音机
- linphone mediastream2 分析-双向录音机
- 录音机
- 录音机
- 打开录音机
- 录音机程序
- java 录音机
- 数字录音机
- 简单录音机
- Qt录音机
- 简单录音机
- 【Android】录音机
- 吉辰录音机 官网
- 吉辰录音机 官方
- opennetcf ---Windows MObile 录音机
- Android之提升App启动速度
- 数组扁平化和去重
- python UnicodeDecodeError: 'ascii' codec can't decode byte ...
- NKOJ 3985 (HNOI 2012) 矿场搭建(Tarjan求割点)
- 取消鼠标拖动选中文字的方法
- 录音机代码分析
- MOOC清华《面向对象程序设计》第7章:统计考试及格率v1.0(采用迭代器模式)
- 关于ext,根节点隐藏,做完全选与反选,拼接出错的问题
- 动态代理
- 云计算的1024种玩法——如何快速搭建个人博客?
- C/C++ ODBC API
- python dir()
- 前端零基础入门(四):第一个HTML页面
- 使用JS 实现 分享到 新浪微博 QQ 空间