private void loadDraft() {
            Log.i(TAG, "loadDraft() start:");
        if (mWorkingMessage.isWorthSaving()) {
            Log.w(TAG, "loadDraft() called with non-empty working message");
            return;
        }        /// M: add for load IP message draft.@{
        if (IpMessageUtils.getIpMessagePlugin(this).isActualPlugin()) {
            if (mIpMessageDraft != null) {
                Log.w(TAG, "loadDraft() called with non-empty IP message draft");
                return;
            } else if (loadIpMessagDraft()) {
                return;
            }
        }
        /// @}        if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
            log("loadDraft() call WorkingMessage.loadDraft");
        }        /// M:[Just Comment] 4.1 Code.  There may be a bug.
        mWorkingMessage = WorkingMessage.loadDraft(this, mConversation,
                new Runnable() {
                    @Override
                    public void run() {
                        drawTopPanel(false);
                        drawBottomPanel();
                        updateSendButtonState();
                    }
                });
//        if (mConversation != null && mConversation.getRecipients() != null
//                && mConversation.getRecipients().size() > 20) {
//            MmsLog.d(TAG, "register mDraftChangeObserver");
//            mContentResolver.registerContentObserver(
//                    Mms.CONTENT_URI, true, mDraftChangeObserver);
//        }
    }    private void saveDraft(boolean isStopping) {
            Log.i(TAG, "saveDraft() start:");
        if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
            LogTag.debug("saveDraft");
        }
        /// M: add for save IP message draft.@{
        if (IpMessageUtils.getIpMessagePlugin(this).isActualPlugin() && isFinishing()) {
            if (mIpMessageDraft != null) {
                saveIpMessageDraft();
                return;
            }
            if (mIpMessageDraftId > 0) {
                IpMessageUtils.deleteIpMessageDraft(this, mConversation, mWorkingMessage);
            }
        }
        /// @}
        // TODO: Do something better here.  Maybe make discard() legal
        // to call twice and make isEmpty() return true if discarded
        // so it is caught in the clause above this one?
        if (mWorkingMessage.isDiscarded()) {
            return;
        }        if (!mWaitingForSubActivity &&
                (!mWorkingMessage.isWorthSaving() && mIpMessageDraft == null) &&
                (!isRecipientsEditorVisible() || recipientCount() == 0)) {
            if (LogTag.VERBOSE || Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
                log("not worth saving, discard WorkingMessage and bail");
            }
            mWorkingMessage.discard(false);
            return;
        }
        /// M : Fix CR: ALPS00996195
        /// group message, more than one recipients, no need to saveDraft,
        /// is going to MultiDeleteActivity, just return. if contains draft, discard it @{
        if (mIsStartMultiDeleteActivity) {
            if (MmsPreferenceActivity.getIsGroupMmsEnabled(this) && !needSaveDraft()
                && mConversation.getRecipients().size() > 1) {
                Log.d("[Mms][Draft][ComposeMessageActivity]", "[saveDraft] group message & "
                        + " no need save drat & mIsStartMultiDeleteActivity true, then just return!");
                if (mConversation.hasDraft()) {
                    Log.d("[Mms][Draft][ComposeMessageActivity]", "[saveDraft] mConversation has draft, then delete it");
                    mWorkingMessage.discard(false);
                }
                return;
            }
            /// M Fix CR ALPS01201355, which will save draft the contact contains email address.
            /// when start multideleteactivity. if contains mms draft ,discard it @{
            if (getRecipients().containsEmail() && !needSaveDraft()) {
                Log.d("[Mms][Draft][ComposeMessageActivity]", "[saveDraft] contains email address"
                    + ",no need to save draft, just return!!");
                if (mConversation.hasDraft()) {
                    Log.d("[Mms][Draft][ComposeMessageActivity]", "[saveDraft] mConversation has draft, then delete it");
                    mWorkingMessage.discard(false);
                }
                return;
            }
            /// @}
        }
        /// @}        Log.d("[Mms][Draft][ComposeMessageActivity]", "[saveDraft] call workingmessage.saveDraft");
        mWorkingMessage.saveDraft(isStopping);        if (mToastForDraftSave && MmsConfig.isSmsEnabled(this)) {
            Toast.makeText(this, R.string.message_saved_as_draft,
                    Toast.LENGTH_SHORT).show();
        }
    }