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
17package com.android.messaging.datamodel.action;
18
19import android.content.ContentValues;
20import android.os.Parcel;
21import android.os.Parcelable;
22
23import com.android.messaging.datamodel.BugleDatabaseOperations;
24import com.android.messaging.datamodel.DataModel;
25import com.android.messaging.datamodel.DatabaseHelper.ConversationColumns;
26import com.android.messaging.datamodel.DatabaseWrapper;
27import com.android.messaging.datamodel.MessagingContentProvider;
28import com.android.messaging.util.Assert;
29
30/**
31 * Action used to update conversation options such as notification settings.
32 */
33public class UpdateConversationOptionsAction extends Action
34        implements Parcelable {
35    /**
36     * Enable/disable conversation notifications.
37     */
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     */
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     */
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
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
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
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
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
153    public void writeToParcel(final Parcel parcel, final int flags) {
154        writeActionToParcel(parcel, flags);
155    }
156}
157