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