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