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 
17 package com.android.messaging.datamodel.action;
18 
19 import android.content.ContentValues;
20 import android.os.Parcel;
21 import android.os.Parcelable;
22 
23 import com.android.messaging.datamodel.BugleDatabaseOperations;
24 import com.android.messaging.datamodel.DataModel;
25 import com.android.messaging.datamodel.DatabaseHelper.ConversationColumns;
26 import com.android.messaging.datamodel.DatabaseWrapper;
27 import com.android.messaging.datamodel.MessagingContentProvider;
28 import com.android.messaging.util.Assert;
29 
30 /**
31  * Action used to update conversation options such as notification settings.
32  */
33 public class UpdateConversationOptionsAction extends Action
34         implements Parcelable {
35     /**
36      * Enable/disable conversation notifications.
37      */
enableConversationNotifications(final String conversationId, final boolean enableNotification)38     public static void enableConversationNotifications(final String conversationId,
39             final boolean enableNotification) {
40         Assert.notNull(conversationId);
41 
42         final UpdateConversationOptionsAction action = new UpdateConversationOptionsAction(
43                 conversationId, enableNotification, null, null);
44         action.start();
45     }
46 
47     /**
48      * Sets conversation notification sound.
49      */
setConversationNotificationSound(final String conversationId, final String ringtoneUri)50     public static void setConversationNotificationSound(final String conversationId,
51             final String ringtoneUri) {
52         Assert.notNull(conversationId);
53 
54         final UpdateConversationOptionsAction action = new UpdateConversationOptionsAction(
55                 conversationId, null, ringtoneUri, null);
56         action.start();
57     }
58 
59     /**
60      * Enable/disable vibrations for conversation notification.
61      */
enableVibrationForConversationNotification(final String conversationId, final boolean enableVibration)62     public static void enableVibrationForConversationNotification(final String conversationId,
63             final boolean enableVibration) {
64         Assert.notNull(conversationId);
65 
66         final UpdateConversationOptionsAction action = new UpdateConversationOptionsAction(
67                 conversationId, null, null, enableVibration);
68         action.start();
69     }
70 
71     private static final String KEY_CONVERSATION_ID = "conversation_id";
72 
73     // Keys for all settable settings.
74     private static final String KEY_ENABLE_NOTIFICATION = "enable_notification";
75     private static final String KEY_RINGTONE_URI = "ringtone_uri";
76     private static final String KEY_ENABLE_VIBRATION = "enable_vibration";
77 
UpdateConversationOptionsAction(final String conversationId, final Boolean enableNotification, final String ringtoneUri, final Boolean enableVibration)78     protected UpdateConversationOptionsAction(final String conversationId,
79             final Boolean enableNotification, final String ringtoneUri,
80             final Boolean enableVibration) {
81         Assert.notNull(conversationId);
82         actionParameters.putString(KEY_CONVERSATION_ID, conversationId);
83         if (enableNotification != null) {
84             actionParameters.putBoolean(KEY_ENABLE_NOTIFICATION, enableNotification);
85         }
86 
87         if (ringtoneUri != null) {
88             actionParameters.putString(KEY_RINGTONE_URI, ringtoneUri);
89         }
90 
91         if (enableVibration != null) {
92             actionParameters.putBoolean(KEY_ENABLE_VIBRATION, enableVibration);
93         }
94     }
95 
putOptionValuesInTransaction(final ContentValues values, final DatabaseWrapper dbWrapper)96     protected void putOptionValuesInTransaction(final ContentValues values,
97             final DatabaseWrapper dbWrapper) {
98         Assert.isTrue(dbWrapper.getDatabase().inTransaction());
99         if (actionParameters.containsKey(KEY_ENABLE_NOTIFICATION)) {
100             values.put(ConversationColumns.NOTIFICATION_ENABLED,
101                     actionParameters.getBoolean(KEY_ENABLE_NOTIFICATION));
102         }
103 
104         if (actionParameters.containsKey(KEY_RINGTONE_URI)) {
105             values.put(ConversationColumns.NOTIFICATION_SOUND_URI,
106                     actionParameters.getString(KEY_RINGTONE_URI));
107         }
108 
109         if (actionParameters.containsKey(KEY_ENABLE_VIBRATION)) {
110             values.put(ConversationColumns.NOTIFICATION_VIBRATION,
111                     actionParameters.getBoolean(KEY_ENABLE_VIBRATION));
112         }
113     }
114 
115     @Override
executeAction()116     protected Object executeAction() {
117         final String conversationId = actionParameters.getString(KEY_CONVERSATION_ID);
118 
119         final DatabaseWrapper db = DataModel.get().getDatabase();
120         db.beginTransaction();
121         try {
122             final ContentValues values = new ContentValues();
123             putOptionValuesInTransaction(values, db);
124 
125             BugleDatabaseOperations.updateConversationRowIfExists(db, conversationId, values);
126 
127             db.setTransactionSuccessful();
128         } finally {
129             db.endTransaction();
130         }
131         MessagingContentProvider.notifyConversationMetadataChanged(conversationId);
132         return null;
133     }
134 
UpdateConversationOptionsAction(final Parcel in)135     protected UpdateConversationOptionsAction(final Parcel in) {
136         super(in);
137     }
138 
139     public static final Parcelable.Creator<UpdateConversationOptionsAction> CREATOR
140             = new Parcelable.Creator<UpdateConversationOptionsAction>() {
141         @Override
142         public UpdateConversationOptionsAction createFromParcel(final Parcel in) {
143             return new UpdateConversationOptionsAction(in);
144         }
145 
146         @Override
147         public UpdateConversationOptionsAction[] newArray(final int size) {
148             return new UpdateConversationOptionsAction[size];
149         }
150     };
151 
152     @Override
writeToParcel(final Parcel parcel, final int flags)153     public void writeToParcel(final Parcel parcel, final int flags) {
154         writeActionToParcel(parcel, flags);
155     }
156 }
157