1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.messaging.datamodel.action;
17
18import android.os.Parcel;
19import android.os.Parcelable;
20import android.text.TextUtils;
21
22import com.android.messaging.datamodel.BugleDatabaseOperations;
23import com.android.messaging.datamodel.DataModel;
24import com.android.messaging.datamodel.DatabaseWrapper;
25import com.android.messaging.datamodel.MessagingContentProvider;
26import com.android.messaging.util.Assert;
27
28public class UpdateDestinationBlockedAction extends Action {
29    public interface UpdateDestinationBlockedActionListener {
30        @Assert.RunsOnMainThread
31        abstract void onUpdateDestinationBlockedAction(final UpdateDestinationBlockedAction action,
32                                                       final boolean success,
33                                                       final boolean block,
34                                                       final String destination);
35    }
36
37    public static class UpdateDestinationBlockedActionMonitor extends ActionMonitor
38            implements ActionMonitor.ActionCompletedListener {
39        private final UpdateDestinationBlockedActionListener mListener;
40
41        public UpdateDestinationBlockedActionMonitor(
42                Object data, UpdateDestinationBlockedActionListener mListener) {
43            super(STATE_CREATED, generateUniqueActionKey("UpdateDestinationBlockedAction"), data);
44            setCompletedListener(this);
45            this.mListener = mListener;
46        }
47
48        private void onActionDone(final boolean succeeded,
49                                  final ActionMonitor monitor,
50                                  final Action action,
51                                  final Object data,
52                                  final Object result) {
53            mListener.onUpdateDestinationBlockedAction(
54                    (UpdateDestinationBlockedAction) action,
55                    succeeded,
56                    action.actionParameters.getBoolean(KEY_BLOCKED),
57                    action.actionParameters.getString(KEY_DESTINATION));
58        }
59
60        @Override
61        public void onActionSucceeded(final ActionMonitor monitor,
62                                      final Action action,
63                                      final Object data,
64                                      final Object result) {
65            onActionDone(true, monitor, action, data, result);
66        }
67
68        @Override
69        public void onActionFailed(final ActionMonitor monitor,
70                                   final Action action,
71                                   final Object data,
72                                   final Object result) {
73            onActionDone(false, monitor, action, data, result);
74        }
75    }
76
77
78    public static UpdateDestinationBlockedActionMonitor updateDestinationBlocked(
79            final String destination, final boolean blocked, final String conversationId,
80            final UpdateDestinationBlockedActionListener listener) {
81        Assert.notNull(listener);
82        final UpdateDestinationBlockedActionMonitor monitor =
83                new UpdateDestinationBlockedActionMonitor(null, listener);
84        final UpdateDestinationBlockedAction action =
85                new UpdateDestinationBlockedAction(destination, blocked, conversationId,
86                        monitor.getActionKey());
87        action.start(monitor);
88        return monitor;
89    }
90
91    private static final String KEY_CONVERSATION_ID = "conversation_id";
92    private static final String KEY_DESTINATION = "destination";
93    private static final String KEY_BLOCKED = "blocked";
94
95    protected UpdateDestinationBlockedAction(
96            final String destination, final boolean blocked, final String conversationId,
97            final String actionKey) {
98        super(actionKey);
99        Assert.isTrue(!TextUtils.isEmpty(destination));
100        actionParameters.putString(KEY_DESTINATION, destination);
101        actionParameters.putBoolean(KEY_BLOCKED, blocked);
102        actionParameters.putString(KEY_CONVERSATION_ID, conversationId);
103    }
104
105    @Override
106    protected Object executeAction() {
107        final String destination = actionParameters.getString(KEY_DESTINATION);
108        final boolean isBlocked = actionParameters.getBoolean(KEY_BLOCKED);
109        String conversationId = actionParameters.getString(KEY_CONVERSATION_ID);
110        final DatabaseWrapper db = DataModel.get().getDatabase();
111        BugleDatabaseOperations.updateDestination(db, destination, isBlocked);
112        if (conversationId == null) {
113            conversationId = BugleDatabaseOperations
114                    .getConversationFromOtherParticipantDestination(db, destination);
115        }
116        if (conversationId != null) {
117            if (isBlocked) {
118                UpdateConversationArchiveStatusAction.archiveConversation(conversationId);
119            } else {
120                UpdateConversationArchiveStatusAction.unarchiveConversation(conversationId);
121            }
122            MessagingContentProvider.notifyParticipantsChanged(conversationId);
123        }
124        return null;
125    }
126
127    protected UpdateDestinationBlockedAction(final Parcel in) {
128        super(in);
129    }
130
131    public static final Parcelable.Creator<UpdateDestinationBlockedAction> CREATOR
132            = new Parcelable.Creator<UpdateDestinationBlockedAction>() {
133        @Override
134        public UpdateDestinationBlockedAction createFromParcel(final Parcel in) {
135            return new UpdateDestinationBlockedAction(in);
136        }
137
138        @Override
139        public UpdateDestinationBlockedAction[] newArray(final int size) {
140            return new UpdateDestinationBlockedAction[size];
141        }
142    };
143
144    @Override
145    public void writeToParcel(final Parcel parcel, final int flags) {
146        writeActionToParcel(parcel, flags);
147    }
148}
149