1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/*
2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project
3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License");
5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License.
6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at
7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *      http://www.apache.org/licenses/LICENSE-2.0
9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software
11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS,
12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and
14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License.
15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.datamodel;
18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context;
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.database.sqlite.SQLiteDatabase;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.net.Uri;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.text.TextUtils;
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.Factory;
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.action.Action;
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.action.ActionService;
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.action.BackgroundWorker;
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.BlockedParticipantsData;
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.BlockedParticipantsData.BlockedParticipantsDataListener;
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ContactListItemData;
31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ContactPickerData;
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ContactPickerData.ContactPickerDataListener;
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationData;
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationData.ConversationDataListener;
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationListData;
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationListData.ConversationListDataListener;
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.DraftMessageData;
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.GalleryGridItemData;
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.LaunchConversationData;
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.LaunchConversationData.LaunchConversationDataListener;
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.MediaPickerData;
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.MessagePartData;
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ParticipantData;
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ParticipantListItemData;
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.PeopleAndOptionsData;
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.PeopleAndOptionsData.PeopleAndOptionsDataListener;
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.PeopleOptionsItemData;
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.SettingsData;
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.SettingsData.SettingsDataListener;
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.SubscriptionListData;
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.VCardContactItemData;
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert.DoesNotRunOnMainThread;
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ConnectivityUtil;
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic abstract class DataModel {
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private String mFocusedConversation;
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private boolean mConversationListScrolledToNewestConversation;
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static DataModel get() {
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return Factory.get().getDataModel();
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final void startActionService(final Action action) {
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        get().getActionService().startAction(action);
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public static final void scheduleAction(final Action action,
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final int code, final long delayMs) {
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        get().getActionService().scheduleAction(action, code, delayMs);
70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract ConversationListData createConversationListData(final Context context,
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ConversationListDataListener listener, final boolean archivedMode);
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract ConversationData createConversationData(final Context context,
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ConversationDataListener listener, final String conversationId);
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract ContactListItemData createContactListItemData();
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract ContactPickerData createContactPickerData(final Context context,
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ContactPickerDataListener listener);
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract MediaPickerData createMediaPickerData(final Context context);
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract GalleryGridItemData createGalleryGridItemData();
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract LaunchConversationData createLaunchConversationData(
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            LaunchConversationDataListener listener);
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract PeopleOptionsItemData createPeopleOptionsItemData(final Context context);
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract PeopleAndOptionsData createPeopleAndOptionsData(final String conversationId,
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final Context context, final PeopleAndOptionsDataListener listener);
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract VCardContactItemData createVCardContactItemData(final Context context,
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final MessagePartData data);
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract VCardContactItemData createVCardContactItemData(final Context context,
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final Uri vCardUri);
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract ParticipantListItemData createParticipantListItemData(
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ParticipantData participant);
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract BlockedParticipantsData createBlockedParticipantsData(Context context,
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            BlockedParticipantsDataListener listener);
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract SubscriptionListData createSubscriptonListData(Context context);
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract SettingsData createSettingsData(Context context, SettingsDataListener listener);
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract DraftMessageData createDraftMessageData(String conversationId);
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract ActionService getActionService();
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract BackgroundWorker getBackgroundWorkerForActionService();
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @DoesNotRunOnMainThread
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract DatabaseWrapper getDatabase();
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    // Allow DataModel to coordinate with activity lifetime events.
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract void onActivityResume();
122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    abstract void onCreateTables(final SQLiteDatabase db);
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setFocusedConversation(final String conversationId) {
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mFocusedConversation = conversationId;
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean isFocusedConversation(final String conversationId) {
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return !TextUtils.isEmpty(mFocusedConversation)
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                && TextUtils.equals(mFocusedConversation, conversationId);
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void setConversationListScrolledToNewestConversation(
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final boolean scrolledToNewestConversation) {
136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mConversationListScrolledToNewestConversation = scrolledToNewestConversation;
137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean isConversationListScrolledToNewestConversation() {
140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mConversationListScrolledToNewestConversation;
141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * If a new message is received in the specified conversation, will the user be able to
145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * observe it in some UI within the app?
146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param conversationId conversation with the new incoming message
147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean isNewMessageObservable(final String conversationId) {
149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return isConversationListScrolledToNewestConversation()
150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                || isFocusedConversation(conversationId);
151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract void onApplicationCreated();
154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract ConnectivityUtil getConnectivityUtil();
156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public abstract SyncManager getSyncManager();
158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
159