1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/* 2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project 3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License. 6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at 7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software 11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and 14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License. 15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.datamodel.action; 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Parcel; 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Parcelable; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.BugleDatabaseOperations; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DataModel; 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseWrapper; 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.action.ActionMonitor.ActionCompletedListener; 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationListItemData; 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.MessageData; 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert; 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert.RunsOnMainThread; 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.LogUtil; 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.google.common.annotations.VisibleForTesting; 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class ReadDraftDataAction extends Action implements Parcelable { 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Interface for ReadDraftDataAction listeners 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public interface ReadDraftDataActionListener { 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @RunsOnMainThread 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd abstract void onReadDraftDataSucceeded(final ReadDraftDataAction action, 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Object data, final MessageData message, 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationListItemData conversation); 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @RunsOnMainThread 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd abstract void onReadDraftDataFailed(final ReadDraftDataAction action, final Object data); 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Read draft message and associated data (with listener) 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static ReadDraftDataActionMonitor readDraftData(final String conversationId, 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final MessageData incomingDraft, final Object data, 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ReadDraftDataActionListener listener) { 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ReadDraftDataActionMonitor monitor = new ReadDraftDataActionMonitor(data, 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd listener); 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ReadDraftDataAction action = new ReadDraftDataAction(conversationId, 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd incomingDraft, monitor.getActionKey()); 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd action.start(monitor); 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return monitor; 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final String KEY_CONVERSATION_ID = "conversationId"; 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final String KEY_INCOMING_DRAFT = "draftMessage"; 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private ReadDraftDataAction(final String conversationId, final MessageData incomingDraft, 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final String actionKey) { 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super(actionKey); 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd actionParameters.putString(KEY_CONVERSATION_ID, conversationId); 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd actionParameters.putParcelable(KEY_INCOMING_DRAFT, incomingDraft); 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @VisibleForTesting 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd class DraftData { 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final MessageData message; 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final ConversationListItemData conversation; 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd DraftData(final MessageData message, final ConversationListItemData conversation) { 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd this.message = message; 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd this.conversation = conversation; 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected Object executeAction() { 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final DatabaseWrapper db = DataModel.get().getDatabase(); 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final String conversationId = actionParameters.getString(KEY_CONVERSATION_ID); 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final MessageData incomingDraft = actionParameters.getParcelable(KEY_INCOMING_DRAFT); 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationListItemData conversation = 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ConversationListItemData.getExistingConversation(db, conversationId); 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd MessageData message = null; 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (conversation != null) { 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (incomingDraft == null) { 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd message = BugleDatabaseOperations.readDraftMessageData(db, conversationId, 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd conversation.getSelfId()); 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (message == null) { 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd message = MessageData.createDraftMessage(conversationId, conversation.getSelfId(), 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd incomingDraft); 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(LogUtil.BUGLE_TAG, "ReadDraftMessage: created draft. " 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd + "conversationId=" + conversationId 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd + " selfId=" + conversation.getSelfId()); 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd LogUtil.d(LogUtil.BUGLE_TAG, "ReadDraftMessage: read draft. " 103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd + "conversationId=" + conversationId 104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd + " selfId=" + conversation.getSelfId()); 105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new DraftData(message, conversation); 107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return null; 109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * An operation that notifies a listener upon completion 113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static class ReadDraftDataActionMonitor extends ActionMonitor 115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd implements ActionCompletedListener { 116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private final ReadDraftDataActionListener mListener; 118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ReadDraftDataActionMonitor(final Object data, 120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ReadDraftDataActionListener completed) { 121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super(STATE_CREATED, generateUniqueActionKey("ReadDraftDataAction"), data); 122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd setCompletedListener(this); 123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener = completed; 124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onActionSucceeded(final ActionMonitor monitor, 128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Action action, final Object data, final Object result) { 129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final DraftData draft = (DraftData) result; 130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (draft == null) { 131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onReadDraftDataFailed((ReadDraftDataAction) action, data); 132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onReadDraftDataSucceeded((ReadDraftDataAction) action, data, 134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd draft.message, draft.conversation); 135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onActionFailed(final ActionMonitor monitor, 140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Action action, final Object data, final Object result) { 141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.fail("Reading draft should not fail"); 142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private ReadDraftDataAction(final Parcel in) { 146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super(in); 147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final Parcelable.Creator<ReadDraftDataAction> CREATOR 150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd = new Parcelable.Creator<ReadDraftDataAction>() { 151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public ReadDraftDataAction createFromParcel(final Parcel in) { 153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new ReadDraftDataAction(in); 154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public ReadDraftDataAction[] newArray(final int size) { 158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return new ReadDraftDataAction[size]; 159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }; 161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void writeToParcel(final Parcel parcel, final int flags) { 164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd writeActionToParcel(parcel, flags); 165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd} 167