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 */ 16 package com.android.messaging.datamodel.action; 17 18 import android.os.Parcel; 19 import android.os.Parcelable; 20 import android.text.TextUtils; 21 22 import com.android.messaging.datamodel.BugleDatabaseOperations; 23 import com.android.messaging.datamodel.DataModel; 24 import com.android.messaging.datamodel.DatabaseWrapper; 25 import com.android.messaging.datamodel.MessagingContentProvider; 26 import com.android.messaging.util.Assert; 27 28 public 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