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.net.Uri;
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Bundle;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Parcel;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Parcelable;
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.text.TextUtils;
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.BugleDatabaseOperations;
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DataModel;
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DatabaseWrapper;
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.MessagingContentProvider;
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.MessageData;
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.sms.MmsUtils;
31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.LogUtil;
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/**
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Action used to delete a single message.
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class DeleteMessageAction extends Action implements Parcelable {
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final String TAG = LogUtil.BUGLE_DATAMODEL_TAG;
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static void deleteMessage(final String messageId) {
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final DeleteMessageAction action = new DeleteMessageAction(messageId);
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        action.start();
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private static final String KEY_MESSAGE_ID = "message_id";
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private DeleteMessageAction(final String messageId) {
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super();
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        actionParameters.putString(KEY_MESSAGE_ID, messageId);
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // Doing this work in the background so that we're not competing with sync
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // which could bring the deleted message back to life between the time we deleted
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // it locally and deleted it in telephony (sync is also done on doBackgroundWork).
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    //
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // Previously this block of code deleted from telephony first but that can be very
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // slow (on the order of seconds) so this was modified to first delete locally, trigger
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // the UI update, then delete from telephony.
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    protected Bundle doBackgroundWork() {
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final DatabaseWrapper db = DataModel.get().getDatabase();
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // First find the thread id for this conversation.
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        final String messageId = actionParameters.getString(KEY_MESSAGE_ID);
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (!TextUtils.isEmpty(messageId)) {
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // Check message still exists
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final MessageData message = BugleDatabaseOperations.readMessage(db, messageId);
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (message != null) {
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // Delete from local DB
70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                int count = BugleDatabaseOperations.deleteMessage(db, messageId);
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                if (count > 0) {
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    LogUtil.i(TAG, "DeleteMessageAction: Deleted local message "
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            + messageId);
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                } else {
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    LogUtil.w(TAG, "DeleteMessageAction: Could not delete local message "
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            + messageId);
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                MessagingContentProvider.notifyMessagesChanged(message.getConversationId());
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // We may have changed the conversation list
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                MessagingContentProvider.notifyConversationListChanged();
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                final Uri messageUri = message.getSmsMessageUri();
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                if (messageUri != null) {
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    // Delete from telephony DB
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    count = MmsUtils.deleteMessage(messageUri);
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    if (count > 0) {
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        LogUtil.i(TAG, "DeleteMessageAction: Deleted telephony message "
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                + messageUri);
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    } else {
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        LogUtil.w(TAG, "DeleteMessageAction: Could not delete message from "
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                + "telephony: messageId = " + messageId + ", telephony uri = "
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                + messageUri);
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                } else {
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    LogUtil.i(TAG, "DeleteMessageAction: Local message " + messageId
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            + " has no telephony uri.");
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            } else {
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                LogUtil.w(TAG, "DeleteMessageAction: Message " + messageId + " no longer exists");
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return null;
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Delete the message.
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    protected Object executeAction() {
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        requestBackgroundWork();
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return null;
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private DeleteMessageAction(final Parcel in) {
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super(in);
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final Parcelable.Creator<DeleteMessageAction> CREATOR
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            = new Parcelable.Creator<DeleteMessageAction>() {
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public DeleteMessageAction createFromParcel(final Parcel in) {
122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return new DeleteMessageAction(in);
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public DeleteMessageAction[] newArray(final int size) {
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return new DeleteMessageAction[size];
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void writeToParcel(final Parcel parcel, final int flags) {
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        writeActionToParcel(parcel, flags);
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
136