录音机代码分析

来源:互联网 发布: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

原创粉丝点击