add database and file migrations for 1.16.0
This commit is contained in:
parent
f2d9539d90
commit
a86b2fefd9
|
@ -7,6 +7,7 @@ import android.database.DatabaseUtils;
|
||||||
import android.database.sqlite.SQLiteCantOpenDatabaseException;
|
import android.database.sqlite.SQLiteCantOpenDatabaseException;
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
|
import android.os.Environment;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
@ -21,6 +22,7 @@ import org.whispersystems.libaxolotl.state.SessionRecord;
|
||||||
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
|
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.security.cert.CertificateEncodingException;
|
import java.security.cert.CertificateEncodingException;
|
||||||
import java.security.cert.CertificateException;
|
import java.security.cert.CertificateException;
|
||||||
|
@ -47,6 +49,7 @@ import eu.siacs.conversations.entities.Message;
|
||||||
import eu.siacs.conversations.entities.PresenceTemplate;
|
import eu.siacs.conversations.entities.PresenceTemplate;
|
||||||
import eu.siacs.conversations.entities.Roster;
|
import eu.siacs.conversations.entities.Roster;
|
||||||
import eu.siacs.conversations.entities.ServiceDiscoveryResult;
|
import eu.siacs.conversations.entities.ServiceDiscoveryResult;
|
||||||
|
import eu.siacs.conversations.utils.MimeUtils;
|
||||||
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
|
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
|
||||||
import eu.siacs.conversations.xmpp.jid.Jid;
|
import eu.siacs.conversations.xmpp.jid.Jid;
|
||||||
|
|
||||||
|
@ -55,7 +58,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
||||||
private static DatabaseBackend instance = null;
|
private static DatabaseBackend instance = null;
|
||||||
|
|
||||||
private static final String DATABASE_NAME = "history";
|
private static final String DATABASE_NAME = "history";
|
||||||
private static final int DATABASE_VERSION = 33;
|
private static final int DATABASE_VERSION = 34;
|
||||||
|
|
||||||
private static String CREATE_CONTATCS_STATEMENT = "create table "
|
private static String CREATE_CONTATCS_STATEMENT = "create table "
|
||||||
+ Contact.TABLENAME + "(" + Contact.ACCOUNT + " TEXT, "
|
+ Contact.TABLENAME + "(" + Contact.ACCOUNT + " TEXT, "
|
||||||
|
@ -146,6 +149,8 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
||||||
|
|
||||||
private static String CREATE_START_TIMES_TABLE = "create table "+START_TIMES_TABLE+" (timestamp NUMBER);";
|
private static String CREATE_START_TIMES_TABLE = "create table "+START_TIMES_TABLE+" (timestamp NUMBER);";
|
||||||
|
|
||||||
|
private static String CREATE_MESSAGE_TIME_INDEX = "create INDEX message_time_index ON "+Message.TABLENAME+"("+Message.TIME_SENT+")";
|
||||||
|
|
||||||
private DatabaseBackend(Context context) {
|
private DatabaseBackend(Context context) {
|
||||||
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
||||||
}
|
}
|
||||||
|
@ -193,7 +198,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
||||||
+ Message.CONVERSATION + ") REFERENCES "
|
+ Message.CONVERSATION + ") REFERENCES "
|
||||||
+ Conversation.TABLENAME + "(" + Conversation.UUID
|
+ Conversation.TABLENAME + "(" + Conversation.UUID
|
||||||
+ ") ON DELETE CASCADE);");
|
+ ") ON DELETE CASCADE);");
|
||||||
|
db.execSQL(CREATE_MESSAGE_TIME_INDEX);
|
||||||
db.execSQL(CREATE_CONTATCS_STATEMENT);
|
db.execSQL(CREATE_CONTATCS_STATEMENT);
|
||||||
db.execSQL(CREATE_DISCOVERY_RESULTS_STATEMENT);
|
db.execSQL(CREATE_DISCOVERY_RESULTS_STATEMENT);
|
||||||
db.execSQL(CREATE_SESSIONS_STATEMENT);
|
db.execSQL(CREATE_SESSIONS_STATEMENT);
|
||||||
|
@ -388,6 +393,45 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
||||||
String whereClause = SQLiteAxolotlStore.OWN+"=1";
|
String whereClause = SQLiteAxolotlStore.OWN+"=1";
|
||||||
db.update(SQLiteAxolotlStore.IDENTITIES_TABLENAME,createFingerprintStatusContentValues(FingerprintStatus.Trust.VERIFIED,true),whereClause,null);
|
db.update(SQLiteAxolotlStore.IDENTITIES_TABLENAME,createFingerprintStatusContentValues(FingerprintStatus.Trust.VERIFIED,true),whereClause,null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (oldVersion < 34 && newVersion >= 34) {
|
||||||
|
db.execSQL(CREATE_MESSAGE_TIME_INDEX);
|
||||||
|
|
||||||
|
final File oldPicturesDirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/Conversations/");
|
||||||
|
final File oldFilesDirectory = new File(Environment.getExternalStorageDirectory() + "/Conversations/");
|
||||||
|
final File newFilesDirectory = new File(Environment.getExternalStorageDirectory() + "/Conversations/Media/Conversations Files/");
|
||||||
|
final File newVideosDirectory = new File(Environment.getExternalStorageDirectory() + "/Conversations/Media/Conversations Videos/");
|
||||||
|
if (oldPicturesDirectory.exists() && oldPicturesDirectory.isDirectory()) {
|
||||||
|
final File newPicturesDirectory = new File(Environment.getExternalStorageDirectory() + "/Conversations/Media/Conversations Images/");
|
||||||
|
newPicturesDirectory.getParentFile().mkdirs();
|
||||||
|
if (oldPicturesDirectory.renameTo(newPicturesDirectory)) {
|
||||||
|
Log.d(Config.LOGTAG,"moved "+oldPicturesDirectory.getAbsolutePath()+" to "+newPicturesDirectory.getAbsolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (oldFilesDirectory.exists() && oldFilesDirectory.isDirectory()) {
|
||||||
|
newFilesDirectory.mkdirs();
|
||||||
|
newVideosDirectory.mkdirs();
|
||||||
|
for(File file : oldFilesDirectory.listFiles()) {
|
||||||
|
if (file.getName().equals(".nomedia")) {
|
||||||
|
if (file.delete()) {
|
||||||
|
Log.d(Config.LOGTAG,"deleted nomedia file in "+oldFilesDirectory.getAbsolutePath());
|
||||||
|
}
|
||||||
|
} else if (file.isFile()) {
|
||||||
|
final String name = file.getName();
|
||||||
|
boolean isVideo = false;
|
||||||
|
int start = name.lastIndexOf('.') + 1;
|
||||||
|
if (start < name.length()) {
|
||||||
|
String mime= MimeUtils.guessMimeTypeFromExtension(name.substring(start));
|
||||||
|
isVideo = mime != null && mime.startsWith("video/");
|
||||||
|
}
|
||||||
|
File dst = new File((isVideo ? newVideosDirectory : newFilesDirectory).getAbsolutePath()+"/"+file.getName());
|
||||||
|
if (file.renameTo(dst)) {
|
||||||
|
Log.d(Config.LOGTAG, "moved " + file + " to " + dst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ContentValues createFingerprintStatusContentValues(FingerprintStatus.Trust trust, boolean active) {
|
private static ContentValues createFingerprintStatusContentValues(FingerprintStatus.Trust trust, boolean active) {
|
||||||
|
|
|
@ -84,7 +84,6 @@ public class FileBackend {
|
||||||
public void updateMediaScanner(File file) {
|
public void updateMediaScanner(File file) {
|
||||||
String path = file.getAbsolutePath();
|
String path = file.getAbsolutePath();
|
||||||
if (!path.startsWith(getConversationsDirectory("Files"))) {
|
if (!path.startsWith(getConversationsDirectory("Files"))) {
|
||||||
new File(Environment.getExternalStorageDirectory()+"/Conversations/.nomedia").delete();
|
|
||||||
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
|
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
|
||||||
intent.setData(Uri.fromFile(file));
|
intent.setData(Uri.fromFile(file));
|
||||||
mXmppConnectionService.sendBroadcast(intent);
|
mXmppConnectionService.sendBroadcast(intent);
|
||||||
|
|
|
@ -934,16 +934,21 @@ public class XmppConnectionService extends Service {
|
||||||
|
|
||||||
private void expireOldMessages() {
|
private void expireOldMessages() {
|
||||||
mLastExpiryRun.set(SystemClock.elapsedRealtime());
|
mLastExpiryRun.set(SystemClock.elapsedRealtime());
|
||||||
synchronized (this.conversations) {
|
mDatabaseExecutor.execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
long timestamp = getAutomaticMessageDeletionDate();
|
long timestamp = getAutomaticMessageDeletionDate();
|
||||||
if (timestamp > 0) {
|
if (timestamp > 0) {
|
||||||
databaseBackend.expireOldMessages(timestamp);
|
databaseBackend.expireOldMessages(timestamp);
|
||||||
for (Conversation conversation : this.conversations) {
|
synchronized (XmppConnectionService.this.conversations) {
|
||||||
|
for (Conversation conversation : XmppConnectionService.this.conversations) {
|
||||||
conversation.expireOldMessages(timestamp);
|
conversation.expireOldMessages(timestamp);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
updateConversationUi();
|
updateConversationUi();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasInternetConnection() {
|
public boolean hasInternetConnection() {
|
||||||
|
|
Loading…
Reference in New Issue