244 lines
10 KiB
Java
Raw Normal View History

/*
* Copyright (C) 2018 Open Whisper Systems
2012-09-30 19:56:29 -07:00
*
2011-12-20 10:20:44 -08:00
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
2012-09-30 19:56:29 -07:00
*
2011-12-20 10:20:44 -08:00
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.thoughtcrime.securesms.database;
import android.content.Context;
import android.support.annotation.NonNull;
2012-09-30 19:56:29 -07:00
import net.sqlcipher.database.SQLiteDatabase;
import org.thoughtcrime.securesms.DatabaseUpgradeActivity;
2015-07-14 14:31:03 -07:00
import org.thoughtcrime.securesms.contacts.ContactsDatabase;
import org.thoughtcrime.securesms.crypto.AttachmentSecret;
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider;
import org.thoughtcrime.securesms.crypto.DatabaseSecret;
import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.helpers.ClassicOpenHelper;
import org.thoughtcrime.securesms.database.helpers.SQLCipherMigrationHelper;
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
2019-06-07 15:21:25 +10:00
import org.thoughtcrime.securesms.loki.LokiAPIDatabase;
2019-06-24 14:10:09 +10:00
import org.thoughtcrime.securesms.loki.LokiPreKeyRecordDatabase;
2019-06-04 12:12:40 +10:00
import org.thoughtcrime.securesms.loki.LokiPreKeyBundleDatabase;
2019-06-18 09:57:36 +10:00
import org.thoughtcrime.securesms.loki.LokiMessageFriendRequestDatabase;
import org.thoughtcrime.securesms.loki.LokiThreadFriendRequestDatabase;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
2011-12-20 10:20:44 -08:00
public class DatabaseFactory {
2012-09-30 19:56:29 -07:00
private static final Object lock = new Object();
2012-09-30 19:56:29 -07:00
2011-12-20 10:20:44 -08:00
private static DatabaseFactory instance;
2012-09-30 19:56:29 -07:00
2018-02-15 20:33:10 -08:00
private final SQLCipherOpenHelper databaseHelper;
private final SmsDatabase sms;
private final MmsDatabase mms;
private final AttachmentDatabase attachments;
private final MediaDatabase media;
private final ThreadDatabase thread;
private final MmsSmsDatabase mmsSmsDatabase;
private final IdentityDatabase identityDatabase;
private final DraftDatabase draftDatabase;
private final PushDatabase pushDatabase;
private final GroupDatabase groupDatabase;
private final RecipientDatabase recipientDatabase;
private final ContactsDatabase contactsDatabase;
private final GroupReceiptDatabase groupReceiptDatabase;
private final OneTimePreKeyDatabase preKeyDatabase;
private final SignedPreKeyDatabase signedPreKeyDatabase;
2018-02-18 16:43:18 -08:00
private final SessionDatabase sessionDatabase;
private final SearchDatabase searchDatabase;
2019-03-28 08:56:35 -07:00
private final JobDatabase jobDatabase;
2012-09-30 19:56:29 -07:00
2019-06-04 12:12:40 +10:00
// Loki
2019-06-07 15:21:25 +10:00
private final LokiAPIDatabase lokiAPIDatabase;
2019-06-24 14:10:09 +10:00
private final LokiPreKeyRecordDatabase lokiContactPreKeyDatabase;
2019-06-04 12:12:40 +10:00
private final LokiPreKeyBundleDatabase lokiPreKeyBundleDatabase;
2019-06-18 09:57:36 +10:00
private final LokiMessageFriendRequestDatabase lokiMessageFriendRequestDatabase;
private final LokiThreadFriendRequestDatabase lokiThreadFriendRequestDatabase;
2019-06-04 12:12:40 +10:00
2011-12-20 10:20:44 -08:00
public static DatabaseFactory getInstance(Context context) {
synchronized (lock) {
if (instance == null)
instance = new DatabaseFactory(context.getApplicationContext());
2012-09-30 19:56:29 -07:00
2011-12-20 10:20:44 -08:00
return instance;
}
}
2012-09-30 19:56:29 -07:00
2011-12-20 10:20:44 -08:00
public static MmsSmsDatabase getMmsSmsDatabase(Context context) {
return getInstance(context).mmsSmsDatabase;
}
2012-09-30 19:56:29 -07:00
2011-12-20 10:20:44 -08:00
public static ThreadDatabase getThreadDatabase(Context context) {
return getInstance(context).thread;
}
2012-09-30 19:56:29 -07:00
2011-12-20 10:20:44 -08:00
public static SmsDatabase getSmsDatabase(Context context) {
return getInstance(context).sms;
}
2012-09-30 19:56:29 -07:00
2011-12-20 10:20:44 -08:00
public static MmsDatabase getMmsDatabase(Context context) {
return getInstance(context).mms;
}
2012-09-30 19:56:29 -07:00
public static AttachmentDatabase getAttachmentDatabase(Context context) {
return getInstance(context).attachments;
}
public static MediaDatabase getMediaDatabase(Context context) {
return getInstance(context).media;
2011-12-20 10:20:44 -08:00
}
2012-09-30 19:56:29 -07:00
2011-12-20 10:20:44 -08:00
public static IdentityDatabase getIdentityDatabase(Context context) {
return getInstance(context).identityDatabase;
}
public static DraftDatabase getDraftDatabase(Context context) {
return getInstance(context).draftDatabase;
}
public static PushDatabase getPushDatabase(Context context) {
return getInstance(context).pushDatabase;
}
2014-01-14 00:26:43 -08:00
public static GroupDatabase getGroupDatabase(Context context) {
return getInstance(context).groupDatabase;
}
public static RecipientDatabase getRecipientDatabase(Context context) {
return getInstance(context).recipientDatabase;
}
2015-07-14 14:31:03 -07:00
public static ContactsDatabase getContactsDatabase(Context context) {
return getInstance(context).contactsDatabase;
}
public static GroupReceiptDatabase getGroupReceiptDatabase(Context context) {
return getInstance(context).groupReceiptDatabase;
}
2018-02-15 20:33:10 -08:00
public static OneTimePreKeyDatabase getPreKeyDatabase(Context context) {
return getInstance(context).preKeyDatabase;
}
public static SignedPreKeyDatabase getSignedPreKeyDatabase(Context context) {
return getInstance(context).signedPreKeyDatabase;
}
2018-02-18 16:43:18 -08:00
public static SessionDatabase getSessionDatabase(Context context) {
return getInstance(context).sessionDatabase;
}
public static SearchDatabase getSearchDatabase(Context context) {
return getInstance(context).searchDatabase;
}
2019-03-28 08:56:35 -07:00
public static JobDatabase getJobDatabase(Context context) {
return getInstance(context).jobDatabase;
}
public static SQLiteDatabase getBackupDatabase(Context context) {
return getInstance(context).databaseHelper.getReadableDatabase();
}
2019-06-04 12:12:40 +10:00
// region Loki
2019-06-07 15:21:25 +10:00
public static LokiAPIDatabase getLokiAPIDatabase(Context context) {
return getInstance(context).lokiAPIDatabase;
}
2019-06-24 14:10:09 +10:00
public static LokiPreKeyRecordDatabase getLokiPreKeyRecordDatabase(Context context) {
2019-06-04 12:12:40 +10:00
return getInstance(context).lokiContactPreKeyDatabase;
}
public static LokiPreKeyBundleDatabase getLokiPreKeyBundleDatabase(Context context) {
return getInstance(context).lokiPreKeyBundleDatabase;
}
public static LokiMessageFriendRequestDatabase getLokiMessageFriendRequestDatabase(Context context) {
2019-06-18 09:57:36 +10:00
return getInstance(context).lokiMessageFriendRequestDatabase;
}
public static LokiThreadFriendRequestDatabase getLokiThreadFriendRequestDatabase(Context context) {
return getInstance(context).lokiThreadFriendRequestDatabase;
}
2019-06-04 12:12:40 +10:00
// endregion
public static void upgradeRestored(Context context, SQLiteDatabase database){
getInstance(context).databaseHelper.onUpgrade(database, database.getVersion(), -1);
getInstance(context).databaseHelper.markCurrent(database);
}
private DatabaseFactory(@NonNull Context context) {
SQLiteDatabase.loadLibs(context);
DatabaseSecret databaseSecret = new DatabaseSecretProvider(context).getOrCreateDatabaseSecret();
AttachmentSecret attachmentSecret = AttachmentSecretProvider.getInstance(context).getOrCreateAttachmentSecret();
this.databaseHelper = new SQLCipherOpenHelper(context, databaseSecret);
this.sms = new SmsDatabase(context, databaseHelper);
this.mms = new MmsDatabase(context, databaseHelper);
this.attachments = new AttachmentDatabase(context, databaseHelper, attachmentSecret);
this.media = new MediaDatabase(context, databaseHelper);
this.thread = new ThreadDatabase(context, databaseHelper);
this.mmsSmsDatabase = new MmsSmsDatabase(context, databaseHelper);
this.identityDatabase = new IdentityDatabase(context, databaseHelper);
this.draftDatabase = new DraftDatabase(context, databaseHelper);
this.pushDatabase = new PushDatabase(context, databaseHelper);
this.groupDatabase = new GroupDatabase(context, databaseHelper);
this.recipientDatabase = new RecipientDatabase(context, databaseHelper);
this.groupReceiptDatabase = new GroupReceiptDatabase(context, databaseHelper);
this.contactsDatabase = new ContactsDatabase(context);
2018-02-15 20:33:10 -08:00
this.preKeyDatabase = new OneTimePreKeyDatabase(context, databaseHelper);
this.signedPreKeyDatabase = new SignedPreKeyDatabase(context, databaseHelper);
2018-02-18 16:43:18 -08:00
this.sessionDatabase = new SessionDatabase(context, databaseHelper);
this.searchDatabase = new SearchDatabase(context, databaseHelper);
2019-03-28 08:56:35 -07:00
this.jobDatabase = new JobDatabase(context, databaseHelper);
2019-06-04 12:12:40 +10:00
2019-06-11 09:46:42 +10:00
this.lokiAPIDatabase = new LokiAPIDatabase(context, databaseHelper);
2019-06-24 14:10:09 +10:00
this.lokiContactPreKeyDatabase = new LokiPreKeyRecordDatabase(context, databaseHelper);
2019-06-04 12:12:40 +10:00
this.lokiPreKeyBundleDatabase = new LokiPreKeyBundleDatabase(context, databaseHelper);
2019-06-18 09:57:36 +10:00
this.lokiMessageFriendRequestDatabase = new LokiMessageFriendRequestDatabase(context, databaseHelper);
this.lokiThreadFriendRequestDatabase = new LokiThreadFriendRequestDatabase(context, databaseHelper);
2011-12-20 10:20:44 -08:00
}
2012-09-30 19:56:29 -07:00
public void onApplicationLevelUpgrade(@NonNull Context context, @NonNull MasterSecret masterSecret,
int fromVersion, DatabaseUpgradeActivity.DatabaseUpgradeListener listener)
{
databaseHelper.getWritableDatabase();
ClassicOpenHelper legacyOpenHelper = null;
if (fromVersion < DatabaseUpgradeActivity.ASYMMETRIC_MASTER_SECRET_FIX_VERSION) {
legacyOpenHelper = new ClassicOpenHelper(context);
legacyOpenHelper.onApplicationLevelUpgrade(context, masterSecret, fromVersion, listener);
2011-12-20 10:20:44 -08:00
}
if (fromVersion < DatabaseUpgradeActivity.SQLCIPHER && TextSecurePreferences.getNeedsSqlCipherMigration(context)) {
if (legacyOpenHelper == null) {
legacyOpenHelper = new ClassicOpenHelper(context);
}
SQLCipherMigrationHelper.migrateCiphertext(context, masterSecret,
legacyOpenHelper.getWritableDatabase(),
databaseHelper.getWritableDatabase(),
listener);
}
2011-12-20 10:20:44 -08:00
}
2011-12-20 10:20:44 -08:00
}