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;
18 
19 import android.content.Context;
20 import android.database.sqlite.SQLiteDatabase;
21 import android.net.Uri;
22 import android.text.TextUtils;
23 
24 import com.android.messaging.Factory;
25 import com.android.messaging.datamodel.action.Action;
26 import com.android.messaging.datamodel.action.ActionService;
27 import com.android.messaging.datamodel.action.BackgroundWorker;
28 import com.android.messaging.datamodel.data.BlockedParticipantsData;
29 import com.android.messaging.datamodel.data.BlockedParticipantsData.BlockedParticipantsDataListener;
30 import com.android.messaging.datamodel.data.ContactListItemData;
31 import com.android.messaging.datamodel.data.ContactPickerData;
32 import com.android.messaging.datamodel.data.ContactPickerData.ContactPickerDataListener;
33 import com.android.messaging.datamodel.data.ConversationData;
34 import com.android.messaging.datamodel.data.ConversationData.ConversationDataListener;
35 import com.android.messaging.datamodel.data.ConversationListData;
36 import com.android.messaging.datamodel.data.ConversationListData.ConversationListDataListener;
37 import com.android.messaging.datamodel.data.DraftMessageData;
38 import com.android.messaging.datamodel.data.GalleryGridItemData;
39 import com.android.messaging.datamodel.data.LaunchConversationData;
40 import com.android.messaging.datamodel.data.LaunchConversationData.LaunchConversationDataListener;
41 import com.android.messaging.datamodel.data.MediaPickerData;
42 import com.android.messaging.datamodel.data.MessagePartData;
43 import com.android.messaging.datamodel.data.ParticipantData;
44 import com.android.messaging.datamodel.data.ParticipantListItemData;
45 import com.android.messaging.datamodel.data.PeopleAndOptionsData;
46 import com.android.messaging.datamodel.data.PeopleAndOptionsData.PeopleAndOptionsDataListener;
47 import com.android.messaging.datamodel.data.PeopleOptionsItemData;
48 import com.android.messaging.datamodel.data.SettingsData;
49 import com.android.messaging.datamodel.data.SettingsData.SettingsDataListener;
50 import com.android.messaging.datamodel.data.SubscriptionListData;
51 import com.android.messaging.datamodel.data.VCardContactItemData;
52 import com.android.messaging.util.Assert.DoesNotRunOnMainThread;
53 import com.android.messaging.util.ConnectivityUtil;
54 
55 public abstract class DataModel {
56     private String mFocusedConversation;
57     private boolean mConversationListScrolledToNewestConversation;
58 
get()59     public static DataModel get() {
60         return Factory.get().getDataModel();
61     }
62 
startActionService(final Action action)63     public static final void startActionService(final Action action) {
64         get().getActionService().startAction(action);
65     }
66 
scheduleAction(final Action action, final int code, final long delayMs)67     public static final void scheduleAction(final Action action,
68             final int code, final long delayMs) {
69         get().getActionService().scheduleAction(action, code, delayMs);
70     }
71 
createConversationListData(final Context context, final ConversationListDataListener listener, final boolean archivedMode)72     public abstract ConversationListData createConversationListData(final Context context,
73             final ConversationListDataListener listener, final boolean archivedMode);
74 
createConversationData(final Context context, final ConversationDataListener listener, final String conversationId)75     public abstract ConversationData createConversationData(final Context context,
76             final ConversationDataListener listener, final String conversationId);
77 
createContactListItemData()78     public abstract ContactListItemData createContactListItemData();
79 
createContactPickerData(final Context context, final ContactPickerDataListener listener)80     public abstract ContactPickerData createContactPickerData(final Context context,
81             final ContactPickerDataListener listener);
82 
createMediaPickerData(final Context context)83     public abstract MediaPickerData createMediaPickerData(final Context context);
84 
createGalleryGridItemData()85     public abstract GalleryGridItemData createGalleryGridItemData();
86 
createLaunchConversationData( LaunchConversationDataListener listener)87     public abstract LaunchConversationData createLaunchConversationData(
88             LaunchConversationDataListener listener);
89 
createPeopleOptionsItemData(final Context context)90     public abstract PeopleOptionsItemData createPeopleOptionsItemData(final Context context);
91 
createPeopleAndOptionsData(final String conversationId, final Context context, final PeopleAndOptionsDataListener listener)92     public abstract PeopleAndOptionsData createPeopleAndOptionsData(final String conversationId,
93             final Context context, final PeopleAndOptionsDataListener listener);
94 
createVCardContactItemData(final Context context, final MessagePartData data)95     public abstract VCardContactItemData createVCardContactItemData(final Context context,
96             final MessagePartData data);
97 
createVCardContactItemData(final Context context, final Uri vCardUri)98     public abstract VCardContactItemData createVCardContactItemData(final Context context,
99             final Uri vCardUri);
100 
createParticipantListItemData( final ParticipantData participant)101     public abstract ParticipantListItemData createParticipantListItemData(
102             final ParticipantData participant);
103 
createBlockedParticipantsData(Context context, BlockedParticipantsDataListener listener)104     public abstract BlockedParticipantsData createBlockedParticipantsData(Context context,
105             BlockedParticipantsDataListener listener);
106 
createSubscriptonListData(Context context)107     public abstract SubscriptionListData createSubscriptonListData(Context context);
108 
createSettingsData(Context context, SettingsDataListener listener)109     public abstract SettingsData createSettingsData(Context context, SettingsDataListener listener);
110 
createDraftMessageData(String conversationId)111     public abstract DraftMessageData createDraftMessageData(String conversationId);
112 
getActionService()113     public abstract ActionService getActionService();
114 
getBackgroundWorkerForActionService()115     public abstract BackgroundWorker getBackgroundWorkerForActionService();
116 
117     @DoesNotRunOnMainThread
getDatabase()118     public abstract DatabaseWrapper getDatabase();
119 
120     // Allow DataModel to coordinate with activity lifetime events.
onActivityResume()121     public abstract void onActivityResume();
122 
onCreateTables(final SQLiteDatabase db)123     abstract void onCreateTables(final SQLiteDatabase db);
124 
setFocusedConversation(final String conversationId)125     public void setFocusedConversation(final String conversationId) {
126         mFocusedConversation = conversationId;
127     }
128 
isFocusedConversation(final String conversationId)129     public boolean isFocusedConversation(final String conversationId) {
130         return !TextUtils.isEmpty(mFocusedConversation)
131                 && TextUtils.equals(mFocusedConversation, conversationId);
132     }
133 
setConversationListScrolledToNewestConversation( final boolean scrolledToNewestConversation)134     public void setConversationListScrolledToNewestConversation(
135             final boolean scrolledToNewestConversation) {
136         mConversationListScrolledToNewestConversation = scrolledToNewestConversation;
137     }
138 
isConversationListScrolledToNewestConversation()139     public boolean isConversationListScrolledToNewestConversation() {
140         return mConversationListScrolledToNewestConversation;
141     }
142 
143     /**
144      * If a new message is received in the specified conversation, will the user be able to
145      * observe it in some UI within the app?
146      * @param conversationId conversation with the new incoming message
147      */
isNewMessageObservable(final String conversationId)148     public boolean isNewMessageObservable(final String conversationId) {
149         return isConversationListScrolledToNewestConversation()
150                 || isFocusedConversation(conversationId);
151     }
152 
onApplicationCreated()153     public abstract void onApplicationCreated();
154 
getConnectivityUtil()155     public abstract ConnectivityUtil getConnectivityUtil();
156 
getSyncManager()157     public abstract SyncManager getSyncManager();
158 }
159