2017-05-05 16:36:04 +02:00
/ * Copyright 2017 Thomas Schneider
*
2019-05-18 11:10:30 +02:00
* This file is a part of Fedilab
2017-05-05 16:36:04 +02: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 .
*
2019-05-18 11:10:30 +02:00
* Fedilab is distributed in the hope that it will be useful , but WITHOUT ANY WARRANTY ; without even
2017-05-05 16:36:04 +02:00
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU General
* Public License for more details .
*
2019-05-18 11:10:30 +02:00
* You should have received a copy of the GNU General Public License along with Fedilab ; if not ,
2017-05-05 16:36:04 +02:00
* see < http : //www.gnu.org/licenses>. */
2019-05-18 11:10:30 +02:00
package app.fedilab.android.sqlite ;
2017-05-05 16:36:04 +02:00
2019-03-02 15:43:40 +01:00
import android.app.Activity ;
2017-05-05 16:36:04 +02:00
import android.content.Context ;
2019-03-02 15:43:40 +01:00
import android.content.Intent ;
2019-08-01 17:41:59 +02:00
import android.content.SharedPreferences ;
2017-05-05 16:36:04 +02:00
import android.database.sqlite.SQLiteDatabase ;
import android.database.sqlite.SQLiteOpenHelper ;
2019-03-02 15:43:40 +01:00
import android.graphics.BitmapFactory ;
import android.net.Uri ;
import android.os.Environment ;
import android.widget.Toast ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.FileOutputStream ;
import java.nio.channels.FileChannel ;
import java.text.SimpleDateFormat ;
import java.util.Date ;
import java.util.Locale ;
2019-11-15 16:32:25 +01:00
import app.fedilab.android.R ;
2019-08-01 17:41:59 +02:00
import app.fedilab.android.client.Entities.Account ;
2019-05-18 11:10:30 +02:00
import app.fedilab.android.helper.Helper ;
2019-03-02 15:43:40 +01:00
import es.dmoral.toasty.Toasty ;
2017-05-05 16:36:04 +02:00
2019-08-01 17:41:59 +02:00
import static android.content.Context.MODE_PRIVATE ;
2017-05-05 16:36:04 +02:00
/ * *
* Created by Thomas on 23 / 04 / 2017 .
* Manage the DataBase
* /
2018-01-04 15:58:39 +01:00
2017-05-05 16:36:04 +02:00
public class Sqlite extends SQLiteOpenHelper {
2020-04-09 19:37:10 +02:00
public static final int DB_VERSION = 38 ;
2017-05-05 16:36:04 +02:00
public static final String DB_NAME = " mastodon_etalab_db " ;
2017-11-01 18:52:08 +01:00
//Table for custom emoji
2019-03-02 11:40:46 +01:00
public static final String TABLE_CUSTOM_EMOJI = " CUSTOM_EMOJI " ;
2018-02-14 18:44:22 +01:00
//Table for cached statuses
2019-03-02 11:40:46 +01:00
public static final String TABLE_STATUSES_CACHE = " STATUSES_CACHE " ;
2018-11-18 16:01:46 +01:00
//Table for timeline cache
2019-05-12 09:17:22 +02:00
public static final String TABLE_TIMELINE_CACHE = " TIMELINE_CACHE " ;
2018-12-09 12:14:05 +01:00
//Table for scheduling boosts
2019-03-02 11:40:46 +01:00
public static final String TABLE_BOOST_SCHEDULE = " BOOST_SCHEDULE " ;
2019-02-14 11:49:52 +01:00
//Table for blocking tracking domains
2019-02-23 14:16:15 +01:00
public static final String TABLE_TRACKING_BLOCK = " TRACKING_BLOCK " ;
2019-04-21 10:22:07 +02:00
//Table for timelines
public static final String TABLE_TIMELINES = " TIMELINES " ;
2019-05-25 11:29:58 +02:00
//Table for timelines
public static final String TABLE_REMOTE_INSTANCE_TAGS = " REMOTE_INSTANCE_TAGS " ;
2019-08-25 12:08:18 +02:00
//Table for notifications
public static final String TABLE_NOTIFICATION_CACHE = " NOTIFICATION_CACHE " ;
2019-08-28 11:34:33 +02:00
//Table for main menu items
public static final String TABLE_MAIN_MENU_ITEMS = " MAIN_MENU_ITEMS " ;
2019-09-12 18:52:17 +02:00
//Table for taking notes about accounts
public static final String TABLE_USER_NOTES = " USER_NOTES " ;
2019-11-15 16:32:25 +01:00
/ * * *
* List of tables to manage users and data
* /
//Table of owned accounts
static final String TABLE_USER_ACCOUNT = " USER_ACCOUNT " ;
//Table of stored status
static final String TABLE_STATUSES_STORED = " STATUSES_STORED " ;
//Table for search
static final String TABLE_SEARCH = " SEARCH " ;
//Table for temp muting
static final String TABLE_TEMP_MUTE = " TEMP_MUTE " ;
//Table for instance names
static final String TABLE_INSTANCES = " INSTANCES " ;
//Table for peertube favorites
static final String TABLE_PEERTUBE_FAVOURITES = " PEERTUBE_FAVOURITES " ;
//Table for tags cache
static final String TABLE_CACHE_TAGS = " CACHE_TAGS " ;
2018-01-04 15:58:39 +01:00
static final String COL_USER_ID = " USER_ID " ;
static final String COL_USERNAME = " USERNAME " ;
static final String COL_ACCT = " ACCT " ;
static final String COL_DISPLAYED_NAME = " DISPLAYED_NAME " ;
static final String COL_LOCKED = " LOCKED " ;
static final String COL_CREATED_AT = " CREATED_AT " ;
static final String COL_FOLLOWERS_COUNT = " FOLLOWERS_COUNT " ;
static final String COL_FOLLOWING_COUNT = " FOLLOWING_COUNT " ;
static final String COL_STATUSES_COUNT = " STATUSES_COUNT " ;
static final String COL_NOTE = " NOTE " ;
static final String COL_URL = " URL " ;
static final String COL_AVATAR = " AVATAR " ;
static final String COL_AVATAR_STATIC = " AVATAR_STATIC " ;
static final String COL_HEADER = " HEADER " ;
static final String COL_HEADER_STATIC = " HEADER_STATIC " ;
static final String COL_INSTANCE = " INSTANCE " ;
static final String COL_OAUTHTOKEN = " OAUTH_TOKEN " ;
2018-09-16 15:05:33 +02:00
static final String COL_EMOJIS = " EMOJIS " ;
2019-01-02 19:39:40 +01:00
static final String COL_SOCIAL = " SOCIAL " ;
2019-01-05 13:00:15 +01:00
static final String COL_CLIENT_ID = " CLIENT_ID " ;
static final String COL_CLIENT_SECRET = " CLIENT_SECRET " ;
static final String COL_REFRESH_TOKEN = " REFRESH_TOKEN " ;
2019-01-27 11:02:53 +01:00
static final String COL_IS_MODERATOR = " IS_MODERATOR " ;
static final String COL_IS_ADMIN = " IS_ADMIN " ;
2019-01-29 11:52:54 +01:00
static final String COL_UPDATED_AT = " UPDATED_AT " ;
2019-05-08 17:50:17 +02:00
static final String COL_PRIVACY = " PRIVACY " ;
2019-05-08 17:52:05 +02:00
static final String COL_SENSITIVE = " SENSITIVE " ;
2018-01-04 15:58:39 +01:00
static final String COL_ID = " ID " ;
static final String COL_STATUS_SERIALIZED = " STATUS_SERIALIZED " ;
static final String COL_STATUS_REPLY_SERIALIZED = " STATUS_REPLY_SERIALIZED " ;
static final String COL_DATE_CREATION = " DATE_CREATION " ;
static final String COL_IS_SCHEDULED = " IS_SCHEDULED " ;
static final String COL_DATE_SCHEDULED = " DATE_SCHEDULED " ;
static final String COL_SENT = " SENT " ;
static final String COL_DATE_SENT = " DATE_SENT " ;
static final String COL_SHORTCODE = " SHORTCODE " ;
static final String COL_URL_STATIC = " URL_STATIC " ;
static final String COL_KEYWORDS = " KEYWORDS " ;
2019-09-06 17:55:14 +02:00
static final String COL_IS_ART = " IS_ART " ;
static final String COL_IS_NSFW = " IS_NSFW " ;
static final String COL_ANY = " ANY_TAG " ;
static final String COL_ALL = " ALL_TAG " ;
2018-12-27 17:49:50 +01:00
static final String COL_NONE = " NONE_TAG " ;
2018-12-28 10:41:40 +01:00
static final String COL_NAME = " NAME " ;
2018-01-04 15:58:39 +01:00
static final String COL_TARGETED_USER_ID = " TARGETED_USER_ID " ;
static final String COL_DATE_END = " DATE_END " ;
2018-02-14 18:44:22 +01:00
static final String COL_CACHED_ACTION = " CACHED_ACTION " ;
2018-02-15 07:55:24 +01:00
static final String COL_STATUS_ID = " STATUS_ID " ;
2018-02-14 18:44:22 +01:00
static final String COL_URI = " URI " ;
static final String COL_ACCOUNT = " ACCOUNT " ;
static final String COL_IN_REPLY_TO_ID = " IN_REPLY_TO_ID " ;
static final String COL_IN_REPLY_TO_ACCOUNT_ID = " IN_REPLY_TO_ACCOUNT_ID " ;
static final String COL_REBLOG = " REBLOG " ;
static final String COL_CONTENT = " CONTENT " ;
static final String COL_REBLOGS_COUNT = " REBLOGS_COUNT " ;
static final String COL_FAVOURITES_COUNT = " FAVOURITES_COUNT " ;
static final String COL_REBLOGGED = " REBLOGGED " ;
static final String COL_FAVOURITED = " FAVOURITED " ;
static final String COL_MUTED = " MUTED " ;
static final String COL_SPOILER_TEXT = " SPOILER_TEXT " ;
static final String COL_VISIBILITY = " VISIBILITY " ;
static final String COL_MEDIA_ATTACHMENTS = " MEDIA_ATTACHMENTS " ;
static final String COL_MENTIONS = " MENTIONS " ;
static final String COL_TAGS = " TAGS " ;
static final String COL_APPLICATION = " APPLICATION " ;
static final String COL_LANGUAGE = " LANGUAGE " ;
static final String COL_PINNED = " PINNED " ;
2018-02-17 08:49:28 +01:00
static final String COL_DATE_BACKUP = " DATE_BACKUP " ;
2018-11-18 13:33:12 +01:00
static final String COL_CARD = " CARD " ;
2018-10-05 18:02:11 +02:00
static final String COL_INSTANCE_TYPE = " INSTANCE_TYPE " ;
2019-05-25 11:29:58 +02:00
static final String COL_FILTERED_WITH = " FILTERED_WITH " ;
2018-10-21 18:43:57 +02:00
static final String COL_UUID = " UUID " ;
static final String COL_CACHE = " CACHE " ;
static final String COL_DATE = " DATE " ;
2019-11-15 16:32:25 +01:00
static final String COL_DOMAIN = " DOMAIN " ;
static final String COL_TYPE = " TYPE " ;
static final String COL_LIST_TIMELINE = " LIST_TIMELINE " ;
static final String COL_DISPLAYED = " DISPLAYED " ;
static final String COL_POSITION = " POSITION " ;
static final String COL_REMOTE_INSTANCE = " REMOTE_INSTANCE " ;
static final String COL_TAG_TIMELINE = " TAG_TIMELINE " ;
static final String COL_NOTIFICATION_ID = " NOTIFICATION_ID " ;
static final String COL_STATUS_ID_CACHE = " STATUS_ID_CACHE " ;
static final String COL_NAV_NEWS = " NAV_NEWS " ;
static final String COL_NAV_LIST = " NAV_LIST " ;
static final String COL_NAV_SCHEDULED = " NAV_SCHEDULED " ;
static final String COL_NAV_ARCHIVE = " NAV_ARCHIVE " ;
static final String COL_NAV_ARCHIVE_NOTIFICATIONS = " NAV_ARCHIVE_NOTIFICATIONS " ;
static final String COL_NAV_PEERTUBE = " NAV_PEERTUBE " ;
static final String COL_NAV_FILTERS = " NAV_FILTERS " ;
static final String COL_NAV_HOW_TO_FOLLOW = " NAV_HOW_TO_FOLLOW " ;
static final String COL_NAV_ADMINISTRATION = " NAV_ADMINISTRATION " ;
static final String COL_NAV_BLOCKED = " NAV_BLOCKED " ;
static final String COL_NAV_MUTED = " NAV_MUTED " ;
static final String COL_NAV_BLOCKED_DOMAINS = " NAV_BLOCKED_DOMAINS " ;
static final String COL_NAV_HOWTO = " NAV_HOWTO " ;
2019-12-08 18:48:52 +01:00
static final String COL_NAV_TRENDS = " NAV_TRENDS " ;
2020-04-09 19:37:10 +02:00
static final String COL_POLL = " POLL " ;
2019-11-15 16:32:25 +01:00
private static final String TABLE_USER_ACCOUNT_TEMP = " USER_ACCOUNT_TEMP " ;
private static final String CREATE_TABLE_USER_ACCOUNT = " CREATE TABLE " + TABLE_USER_ACCOUNT + " ( "
+ COL_USER_ID + " TEXT, " + COL_USERNAME + " TEXT NOT NULL, " + COL_ACCT + " TEXT NOT NULL, "
+ COL_DISPLAYED_NAME + " TEXT NOT NULL, " + COL_LOCKED + " INTEGER NOT NULL, "
+ COL_FOLLOWERS_COUNT + " INTEGER NOT NULL, " + COL_FOLLOWING_COUNT + " INTEGER NOT NULL, " + COL_STATUSES_COUNT + " INTEGER NOT NULL, "
+ COL_NOTE + " TEXT NOT NULL, " + COL_URL + " TEXT NOT NULL, "
+ COL_AVATAR + " TEXT NOT NULL, " + COL_AVATAR_STATIC + " TEXT NOT NULL, "
+ COL_HEADER + " TEXT NOT NULL, " + COL_HEADER_STATIC + " TEXT NOT NULL, "
+ COL_EMOJIS + " TEXT, "
+ COL_SOCIAL + " TEXT, "
+ COL_IS_MODERATOR + " INTEGER DEFAULT 0, "
+ COL_IS_ADMIN + " INTEGER DEFAULT 0, "
+ COL_CLIENT_ID + " TEXT, " + COL_CLIENT_SECRET + " TEXT, " + COL_REFRESH_TOKEN + " TEXT, "
+ COL_UPDATED_AT + " TEXT, "
+ COL_PRIVACY + " TEXT, "
+ COL_SENSITIVE + " INTEGER DEFAULT 0, "
+ COL_INSTANCE + " TEXT NOT NULL, " + COL_OAUTHTOKEN + " TEXT NOT NULL, " + COL_CREATED_AT + " TEXT NOT NULL) " ;
private static final String CREATE_TABLE_STATUSES_STORED = " CREATE TABLE " + TABLE_STATUSES_STORED + " ( "
2018-11-18 16:01:46 +01:00
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
2019-11-15 16:32:25 +01:00
+ COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, "
+ COL_STATUS_SERIALIZED + " TEXT NOT NULL, " + COL_STATUS_REPLY_SERIALIZED + " TEXT, " + COL_DATE_CREATION + " TEXT NOT NULL, "
+ COL_IS_SCHEDULED + " INTEGER NOT NULL, " + COL_DATE_SCHEDULED + " TEXT, "
+ COL_SENT + " INTEGER NOT NULL, " + COL_DATE_SENT + " TEXT) " ;
2018-12-09 12:14:05 +01:00
private static final String CREATE_TABLE_BOOST_SCHEDULE = " CREATE TABLE " + TABLE_BOOST_SCHEDULE + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, "
2019-09-06 17:55:14 +02:00
+ COL_STATUS_SERIALIZED + " TEXT NOT NULL, " + COL_DATE_SCHEDULED + " TEXT, "
2018-12-09 12:14:05 +01:00
+ COL_IS_SCHEDULED + " INTEGER NOT NULL, " + COL_SENT + " INTEGER NOT NULL, " + COL_DATE_SENT + " TEXT) " ;
2019-02-14 11:49:52 +01:00
private static final String CREATE_TABLE_TRACKING_BLOCK = " CREATE TABLE " + TABLE_TRACKING_BLOCK + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_DOMAIN + " TEXT NOT NULL) " ;
2019-04-22 13:16:35 +02:00
private static final String CREATE_TABLE_TIMELINES = " CREATE TABLE IF NOT EXISTS " + TABLE_TIMELINES + " ( "
2019-04-21 10:22:07 +02:00
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_POSITION + " INTEGER NOT NULL, "
+ COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, "
+ COL_TYPE + " TEXT NOT NULL, "
+ COL_REMOTE_INSTANCE + " TEXT, "
+ COL_TAG_TIMELINE + " TEXT, "
+ COL_DISPLAYED + " INTEGER NOT NULL, "
2019-04-21 12:09:30 +02:00
+ COL_LIST_TIMELINE + " TEXT) " ;
2019-05-12 09:17:22 +02:00
private static final String CREATE_TABLE_TIMELINE_CACHE = " CREATE TABLE "
+ TABLE_TIMELINE_CACHE + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_STATUS_ID + " TEXT NOT NULL, "
+ COL_INSTANCE + " TEXT NOT NULL, "
2019-05-12 09:52:56 +02:00
+ COL_USER_ID + " TEXT NOT NULL, "
2019-05-12 09:17:22 +02:00
+ COL_CACHE + " TEXT NOT NULL, "
+ COL_DATE + " TEXT NOT NULL) " ;
2019-08-25 11:30:30 +02:00
private static final String CREATE_TABLE_NOTIFICATIONS = " CREATE TABLE "
2019-08-25 12:08:18 +02:00
+ TABLE_NOTIFICATION_CACHE + " ( "
2019-08-25 11:30:30 +02:00
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_NOTIFICATION_ID + " TEXT NOT NULL, "
+ COL_INSTANCE + " TEXT NOT NULL, "
+ COL_USER_ID + " TEXT NOT NULL, "
+ COL_ACCOUNT + " TEXT NOT NULL, "
+ COL_TYPE + " TEXT NOT NULL, "
2019-08-25 18:08:16 +02:00
+ COL_STATUS_ID + " TEXT, "
2019-08-27 18:22:34 +02:00
+ COL_IN_REPLY_TO_ID + " TEXT, "
2019-08-25 11:30:30 +02:00
+ COL_STATUS_ID_CACHE + " INTEGER, "
+ COL_CREATED_AT + " TEXT NOT NULL) " ;
2019-08-28 11:34:33 +02:00
private static final String CREATE_TABLE_MAIN_MENU_ITEMS = " CREATE TABLE "
+ TABLE_MAIN_MENU_ITEMS + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
2019-08-28 16:21:50 +02:00
+ COL_USER_ID + " TEXT NOT NULL, "
2019-08-28 11:34:33 +02:00
+ COL_INSTANCE + " TEXT NOT NULL, "
+ COL_NAV_NEWS + " INTEGER DEFAULT 1, "
+ COL_NAV_LIST + " INTEGER DEFAULT 1, "
+ COL_NAV_SCHEDULED + " INTEGER DEFAULT 1, "
+ COL_NAV_ARCHIVE + " INTEGER DEFAULT 1, "
+ COL_NAV_ARCHIVE_NOTIFICATIONS + " INTEGER DEFAULT 1, "
+ COL_NAV_PEERTUBE + " INTEGER DEFAULT 1, "
+ COL_NAV_FILTERS + " INTEGER DEFAULT 1, "
+ COL_NAV_HOW_TO_FOLLOW + " INTEGER DEFAULT 1, "
2019-09-06 17:55:14 +02:00
+ COL_NAV_ADMINISTRATION + " INTEGER DEFAULT 1, "
+ COL_NAV_BLOCKED + " INTEGER DEFAULT 1, "
+ COL_NAV_MUTED + " INTEGER DEFAULT 1, "
+ COL_NAV_BLOCKED_DOMAINS + " INTEGER DEFAULT 1, "
2019-12-08 18:48:52 +01:00
+ COL_NAV_TRENDS + " INTEGER DEFAULT 1, "
2019-08-28 11:34:33 +02:00
+ COL_NAV_HOWTO + " INTEGER DEFAULT 1) " ;
2019-09-12 18:52:17 +02:00
private static final String CREATE_TABLE_USER_NOTES = " CREATE TABLE "
+ TABLE_USER_NOTES + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_ACCT + " TEXT NOT NULL, "
+ COL_NOTE + " TEXT, "
+ COL_DATE_CREATION + " TEXT NOT NULL) " ;
2019-11-15 16:32:25 +01:00
public static SQLiteDatabase db ;
private static Sqlite sInstance ;
private final String CREATE_TABLE_CUSTOM_EMOJI = " CREATE TABLE " + TABLE_CUSTOM_EMOJI + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_SHORTCODE + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, "
+ COL_URL + " TEXT NOT NULL, " + COL_URL_STATIC + " TEXT NOT NULL, " + COL_DATE_CREATION + " TEXT NOT NULL) " ;
private final String CREATE_TABLE_SEARCH = " CREATE TABLE " + TABLE_SEARCH + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_KEYWORDS + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, "
+ COL_ANY + " TEXT, " + COL_ALL + " TEXT, " + COL_NONE + " TEXT, " + COL_NAME + " TEXT, "
+ COL_IS_ART + " INTEGER DEFAULT 0, " + COL_IS_NSFW + " INTEGER DEFAULT 0, "
+ COL_DATE_CREATION + " TEXT NOT NULL) " ;
private final String CREATE_TABLE_TEMP_MUTE = " CREATE TABLE " + TABLE_TEMP_MUTE + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_ACCT + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " + COL_TARGETED_USER_ID + " TEXT NOT NULL, " + COL_DATE_CREATION + " TEXT NOT NULL, " + COL_DATE_END + " TEXT NOT NULL) " ;
private final String CREATE_TABLE_STATUSES_CACHE = " CREATE TABLE " + TABLE_STATUSES_CACHE + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_CACHED_ACTION + " INTEGER NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " NOT NULL, " + COL_DATE_BACKUP + " TEXT NOT NULL, "
+ COL_STATUS_ID + " TEXT NOT NULL, " + COL_URI + " TEXT NOT NULL, " + COL_URL + " TEXT NOT NULL, "
+ COL_ACCOUNT + " TEXT NOT NULL, " + COL_IN_REPLY_TO_ID + " TEXT, " + COL_IN_REPLY_TO_ACCOUNT_ID + " TEXT, "
+ COL_REBLOG + " TEXT, " + COL_CONTENT + " TEXT NOT NULL, " + COL_CREATED_AT + " TEXT NOT NULL, "
+ COL_EMOJIS + " TEXT, " + COL_REBLOGS_COUNT + " INTEGER NOT NULL, " + COL_FAVOURITES_COUNT + " INTEGER NOT NULL, "
+ COL_REBLOGGED + " INTEGER, " + COL_FAVOURITED + " INTEGER, " + COL_MUTED + " INTEGER, " + COL_SENSITIVE + " INTEGER, "
+ COL_SPOILER_TEXT + " TEXT, " + COL_VISIBILITY + " TEXT NOT NULL, " + COL_MEDIA_ATTACHMENTS + " TEXT, " + COL_CARD + " TEXT, "
2020-04-09 19:37:10 +02:00
+ COL_MENTIONS + " TEXT, " + COL_POLL + " TEXT, " + COL_TAGS + " TEXT, " + COL_APPLICATION + " TEXT, "
2019-11-15 16:32:25 +01:00
+ COL_LANGUAGE + " TEXT, " + COL_PINNED + " INTEGER) " ;
private final String CREATE_UNIQUE_CACHE_INDEX = " CREATE UNIQUE INDEX instance_statusid on "
+ TABLE_STATUSES_CACHE + " ( " + COL_INSTANCE + " , " + COL_STATUS_ID + " , " + COL_CACHED_ACTION + " ) " ;
private final String CREATE_TABLE_INSTANCES = " CREATE TABLE " + TABLE_INSTANCES + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE_TYPE + " TEXT, " + COL_TAGS + " TEXT, " + COL_FILTERED_WITH + " TEXT, " + COL_DATE_CREATION + " TEXT NOT NULL) " ;
private final String CREATE_TABLE_PEERTUBE_FAVOURITES = " CREATE TABLE "
+ TABLE_PEERTUBE_FAVOURITES + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_UUID + " TEXT NOT NULL, "
+ COL_INSTANCE + " TEXT NOT NULL, "
+ COL_CACHE + " TEXT NOT NULL, "
+ COL_DATE + " TEXT NOT NULL) " ;
private final String CREATE_TABLE_CACHE_TAGS = " CREATE TABLE "
+ TABLE_CACHE_TAGS + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_TAGS + " TEXT NOT NULL) " ;
2019-09-12 18:52:17 +02:00
2017-05-05 16:36:04 +02:00
public Sqlite ( Context context , String name , SQLiteDatabase . CursorFactory factory , int version ) {
super ( context , name , factory , version ) ;
}
2019-09-06 17:55:14 +02:00
public static synchronized Sqlite getInstance ( Context context , String name , SQLiteDatabase . CursorFactory factory , int version ) {
2017-05-05 16:36:04 +02:00
if ( sInstance = = null ) {
sInstance = new Sqlite ( context , name , factory , version ) ;
}
return sInstance ;
}
2019-11-15 16:32:25 +01:00
public static void importDB ( Activity activity , String backupDBPath ) {
try {
db . close ( ) ;
File dbDest = activity . getDatabasePath ( DB_NAME ) ;
File dbSource = new File ( backupDBPath ) ;
FileChannel src = new FileInputStream ( dbSource ) . getChannel ( ) ;
FileChannel dst = new FileOutputStream ( dbDest ) . getChannel ( ) ;
dst . transferFrom ( src , 0 , src . size ( ) ) ;
src . close ( ) ;
dst . close ( ) ;
Helper . logoutCurrentUser ( activity ) ;
} catch ( Exception e ) {
e . printStackTrace ( ) ;
2020-04-08 12:42:15 +02:00
Toasty . error ( activity , activity . getString ( R . string . data_import_error_simple ) , Toast . LENGTH_LONG ) . show ( ) ;
2019-11-15 16:32:25 +01:00
}
}
public static void exportDB ( Context context ) {
try {
File sd = Environment . getExternalStorageDirectory ( ) ;
if ( sd . canWrite ( ) ) {
String timeStamp = new SimpleDateFormat ( " yyyyMMdd_HHmmss " , Locale . ENGLISH ) . format ( new Date ( ) ) ;
String backupDBPath = " Fedilab_export_ " + timeStamp + " .fedilab " ;
File dbSource = context . getDatabasePath ( DB_NAME ) ;
File dbDest = new File ( sd , backupDBPath ) ;
FileChannel src = new FileInputStream ( dbSource ) . getChannel ( ) ;
FileChannel dst = new FileOutputStream ( dbDest ) . getChannel ( ) ;
dst . transferFrom ( src , 0 , src . size ( ) ) ;
src . close ( ) ;
dst . close ( ) ;
final Intent intent = new Intent ( ) ;
intent . setAction ( android . content . Intent . ACTION_VIEW ) ;
Uri uri = Uri . fromFile ( dbDest ) ;
intent . setDataAndType ( uri , " */* " ) ;
2020-04-09 18:57:12 +02:00
SQLiteDatabase db = Sqlite . getInstance ( context . getApplicationContext ( ) , Sqlite . DB_NAME , null , Sqlite . DB_VERSION ) . open ( ) ;
2019-11-15 16:32:25 +01:00
SharedPreferences sharedpreferences = context . getSharedPreferences ( Helper . APP_PREFS , MODE_PRIVATE ) ;
String userId = sharedpreferences . getString ( Helper . PREF_KEY_ID , null ) ;
String instance = sharedpreferences . getString ( Helper . PREF_INSTANCE , Helper . getLiveInstance ( context ) ) ;
Account account = new AccountDAO ( context , db ) . getUniqAccount ( userId , instance ) ;
Helper . notify_user ( context , account , intent , BitmapFactory . decodeResource ( context . getResources ( ) ,
R . mipmap . ic_launcher_bubbles ) , Helper . NotifType . STORE , context . getString ( R . string . save_over ) , context . getString ( R . string . download_from , backupDBPath ) ) ;
Toasty . success ( context , context . getString ( R . string . data_base_exported ) , Toast . LENGTH_LONG ) . show ( ) ;
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
Toasty . error ( context , context . getString ( R . string . data_export_error_simple ) , Toast . LENGTH_LONG ) . show ( ) ;
}
}
2017-05-05 16:36:04 +02:00
@Override
public void onCreate ( SQLiteDatabase db ) {
db . execSQL ( CREATE_TABLE_USER_ACCOUNT ) ;
2017-07-15 14:59:09 +02:00
db . execSQL ( CREATE_TABLE_STATUSES_STORED ) ;
2017-11-15 16:51:35 +01:00
db . execSQL ( CREATE_TABLE_CUSTOM_EMOJI ) ;
2017-11-23 18:16:47 +01:00
db . execSQL ( CREATE_TABLE_SEARCH ) ;
2018-01-04 15:58:39 +01:00
db . execSQL ( CREATE_TABLE_TEMP_MUTE ) ;
2018-02-14 18:44:22 +01:00
db . execSQL ( CREATE_TABLE_STATUSES_CACHE ) ;
2018-02-22 20:00:36 +01:00
db . execSQL ( CREATE_UNIQUE_CACHE_INDEX ) ;
2018-08-20 19:00:20 +02:00
db . execSQL ( CREATE_TABLE_INSTANCES ) ;
2018-10-21 18:43:57 +02:00
db . execSQL ( CREATE_TABLE_PEERTUBE_FAVOURITES ) ;
2018-11-30 18:39:01 +01:00
db . execSQL ( CREATE_TABLE_CACHE_TAGS ) ;
2018-12-09 12:14:05 +01:00
db . execSQL ( CREATE_TABLE_BOOST_SCHEDULE ) ;
2019-02-14 11:49:52 +01:00
db . execSQL ( CREATE_TABLE_TRACKING_BLOCK ) ;
2019-04-21 10:22:07 +02:00
db . execSQL ( CREATE_TABLE_TIMELINES ) ;
2019-05-12 09:17:22 +02:00
db . execSQL ( CREATE_TABLE_TIMELINE_CACHE ) ;
2019-08-25 11:30:30 +02:00
db . execSQL ( CREATE_TABLE_NOTIFICATIONS ) ;
2019-08-28 11:34:33 +02:00
db . execSQL ( CREATE_TABLE_MAIN_MENU_ITEMS ) ;
2019-09-12 18:52:17 +02:00
db . execSQL ( CREATE_TABLE_USER_NOTES ) ;
2017-05-05 16:36:04 +02:00
}
2019-04-22 09:43:09 +02:00
@Override
public void onDowngrade ( SQLiteDatabase db , int oldVersion , int newVersion ) {
}
2017-05-05 16:36:04 +02:00
@Override
public void onUpgrade ( SQLiteDatabase db , int oldVersion , int newVersion ) {
switch ( oldVersion ) {
2017-07-15 14:59:09 +02:00
case 1 :
db . execSQL ( CREATE_TABLE_STATUSES_STORED ) ;
2017-07-18 10:54:15 +02:00
case 2 :
2017-07-20 11:06:11 +02:00
db . execSQL ( " DROP TABLE IF EXISTS " + TABLE_STATUSES_STORED ) ;
db . execSQL ( CREATE_TABLE_STATUSES_STORED ) ;
2017-11-01 18:52:08 +01:00
case 3 :
db . execSQL ( CREATE_TABLE_CUSTOM_EMOJI ) ;
2017-11-15 16:51:35 +01:00
case 4 :
db . execSQL ( " CREATE TABLE IF NOT EXISTS " + TABLE_CUSTOM_EMOJI + " ( "
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COL_SHORTCODE + " TEXT NOT NULL, " + COL_INSTANCE + " TEXT NOT NULL, "
2019-09-06 17:55:14 +02:00
+ COL_URL + " TEXT NOT NULL, " + COL_URL_STATIC + " TEXT NOT NULL, " + COL_DATE_CREATION + " TEXT NOT NULL) " ) ;
2017-11-19 16:08:34 +01:00
case 5 :
2019-09-06 17:55:14 +02:00
db . execSQL ( " delete from " + TABLE_CUSTOM_EMOJI ) ; //Reset table due to bugs
2017-11-23 18:16:47 +01:00
case 6 :
db . execSQL ( CREATE_TABLE_SEARCH ) ;
2018-01-04 15:58:39 +01:00
case 7 :
db . execSQL ( CREATE_TABLE_TEMP_MUTE ) ;
2018-02-14 18:44:22 +01:00
case 8 :
db . execSQL ( CREATE_TABLE_STATUSES_CACHE ) ;
2018-02-17 08:44:13 +01:00
case 9 :
2018-02-17 08:49:28 +01:00
db . execSQL ( " DROP TABLE IF EXISTS " + TABLE_STATUSES_CACHE ) ;
db . execSQL ( CREATE_TABLE_STATUSES_CACHE ) ;
2018-02-22 20:00:36 +01:00
case 10 :
2018-02-23 07:31:05 +01:00
//Table cache is deleted to avoid error during migration
db . execSQL ( " DROP TABLE IF EXISTS " + TABLE_STATUSES_CACHE ) ;
db . execSQL ( CREATE_TABLE_STATUSES_CACHE ) ;
2018-02-22 20:00:36 +01:00
db . execSQL ( CREATE_UNIQUE_CACHE_INDEX ) ;
2018-08-20 19:00:20 +02:00
case 11 :
db . execSQL ( CREATE_TABLE_INSTANCES ) ;
2018-09-16 15:05:33 +02:00
case 12 :
2019-09-06 17:55:14 +02:00
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_EMOJIS + " TEXT " ) ;
2018-10-05 18:02:11 +02:00
case 13 :
2019-09-06 17:55:14 +02:00
if ( oldVersion > 11 )
db . execSQL ( " ALTER TABLE " + TABLE_INSTANCES + " ADD COLUMN " + COL_INSTANCE_TYPE + " TEXT " ) ;
2018-10-21 18:43:57 +02:00
case 14 :
db . execSQL ( CREATE_TABLE_PEERTUBE_FAVOURITES ) ;
2018-11-18 13:33:12 +01:00
case 15 :
2019-09-06 17:55:14 +02:00
if ( oldVersion > 8 )
db . execSQL ( " ALTER TABLE " + TABLE_STATUSES_CACHE + " ADD COLUMN " + COL_CARD + " TEXT " ) ;
2018-11-18 16:01:46 +01:00
case 16 :
2018-11-30 18:39:01 +01:00
case 17 :
db . execSQL ( " DROP TABLE IF EXISTS ' " + TABLE_TIMELINE_CACHE + " ' " ) ;
db . execSQL ( CREATE_TABLE_CACHE_TAGS ) ;
2018-12-09 12:14:05 +01:00
case 18 :
db . execSQL ( CREATE_TABLE_BOOST_SCHEDULE ) ;
2018-12-15 12:02:29 +01:00
case 19 :
2019-09-06 17:55:14 +02:00
if ( oldVersion > 6 ) {
2018-12-15 12:02:29 +01:00
db . execSQL ( " ALTER TABLE " + TABLE_SEARCH + " ADD COLUMN " + COL_IS_ART + " INTEGER DEFAULT 0 " ) ;
db . execSQL ( " ALTER TABLE " + TABLE_SEARCH + " ADD COLUMN " + COL_IS_NSFW + " INTEGER DEFAULT 0 " ) ;
}
2018-12-27 17:49:50 +01:00
case 20 :
2019-09-06 17:55:14 +02:00
if ( oldVersion > 6 ) {
2018-12-27 17:49:50 +01:00
db . execSQL ( " ALTER TABLE " + TABLE_SEARCH + " ADD COLUMN " + COL_ANY + " TEXT " ) ;
db . execSQL ( " ALTER TABLE " + TABLE_SEARCH + " ADD COLUMN " + COL_ALL + " TEXT " ) ;
db . execSQL ( " ALTER TABLE " + TABLE_SEARCH + " ADD COLUMN " + COL_NONE + " TEXT " ) ;
}
2018-12-28 10:41:40 +01:00
case 21 :
2019-09-06 17:55:14 +02:00
if ( oldVersion > 6 ) {
2018-12-28 10:41:40 +01:00
db . execSQL ( " ALTER TABLE " + TABLE_SEARCH + " ADD COLUMN " + COL_NAME + " TEXT " ) ;
}
2019-01-02 19:39:40 +01:00
case 22 :
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_SOCIAL + " TEXT " ) ;
2019-01-05 12:17:38 +01:00
case 23 :
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_CLIENT_ID + " TEXT " ) ;
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_CLIENT_SECRET + " TEXT " ) ;
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_REFRESH_TOKEN + " TEXT " ) ;
2019-01-27 11:02:53 +01:00
case 24 :
2019-09-06 17:55:14 +02:00
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_IS_MODERATOR + " INTEGER DEFAULT 0 " ) ;
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_IS_ADMIN + " INTEGER DEFAULT 0 " ) ;
2019-01-29 11:52:54 +01:00
case 25 :
2019-09-06 17:55:14 +02:00
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_UPDATED_AT + " TEXT " ) ;
2019-02-14 11:49:52 +01:00
case 26 :
db . execSQL ( CREATE_TABLE_TRACKING_BLOCK ) ;
2019-04-21 10:22:07 +02:00
case 27 :
db . execSQL ( CREATE_TABLE_TIMELINES ) ;
2019-05-08 17:50:17 +02:00
case 28 :
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_PRIVACY + " TEXT " ) ;
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN " + COL_SENSITIVE + " INTEGER DEFAULT 0 " ) ;
2019-05-12 09:17:22 +02:00
case 29 :
db . execSQL ( CREATE_TABLE_TIMELINE_CACHE ) ;
2019-05-25 11:29:58 +02:00
case 30 :
2019-09-06 17:55:14 +02:00
if ( oldVersion > 11 ) {
2019-05-25 11:29:58 +02:00
db . execSQL ( " ALTER TABLE " + TABLE_INSTANCES + " ADD COLUMN " + COL_TAGS + " TEXT " ) ;
db . execSQL ( " ALTER TABLE " + TABLE_INSTANCES + " ADD COLUMN " + COL_FILTERED_WITH + " TEXT " ) ;
}
2019-06-05 14:35:42 +02:00
case 31 :
String CREATE_TABLE_USER_ACCOUNT_TEMP = " CREATE TABLE " + TABLE_USER_ACCOUNT_TEMP + " ( "
+ COL_USER_ID + " TEXT, " + COL_USERNAME + " TEXT NOT NULL, " + COL_ACCT + " TEXT NOT NULL, "
+ COL_DISPLAYED_NAME + " TEXT NOT NULL, " + COL_LOCKED + " INTEGER NOT NULL, "
+ COL_FOLLOWERS_COUNT + " INTEGER NOT NULL, " + COL_FOLLOWING_COUNT + " INTEGER NOT NULL, " + COL_STATUSES_COUNT + " INTEGER NOT NULL, "
2019-09-06 17:55:14 +02:00
+ COL_NOTE + " TEXT NOT NULL, " + COL_URL + " TEXT NOT NULL, "
+ COL_AVATAR + " TEXT NOT NULL, " + COL_AVATAR_STATIC + " TEXT NOT NULL, "
+ COL_HEADER + " TEXT NOT NULL, " + COL_HEADER_STATIC + " TEXT NOT NULL, "
2019-06-05 14:35:42 +02:00
+ COL_EMOJIS + " TEXT, "
+ COL_SOCIAL + " TEXT, "
+ COL_IS_MODERATOR + " INTEGER DEFAULT 0, "
+ COL_IS_ADMIN + " INTEGER DEFAULT 0, "
+ COL_CLIENT_ID + " TEXT, " + COL_CLIENT_SECRET + " TEXT, " + COL_REFRESH_TOKEN + " TEXT, "
+ COL_UPDATED_AT + " TEXT, "
+ COL_PRIVACY + " TEXT, "
+ COL_SENSITIVE + " INTEGER DEFAULT 0, "
+ COL_INSTANCE + " TEXT NOT NULL, " + COL_OAUTHTOKEN + " TEXT NOT NULL, " + COL_CREATED_AT + " TEXT NOT NULL) " ;
db . execSQL ( CREATE_TABLE_USER_ACCOUNT_TEMP ) ;
2019-09-06 17:55:14 +02:00
String insert = " INSERT INTO " + TABLE_USER_ACCOUNT_TEMP + " ( "
+ COL_USER_ID + " , " + COL_USERNAME + " , " + COL_ACCT + " , " + COL_DISPLAYED_NAME + " , " + COL_LOCKED + " , " + COL_FOLLOWERS_COUNT + " , "
+ COL_FOLLOWING_COUNT + " , " + COL_STATUSES_COUNT + " , " + COL_NOTE + " , " + COL_URL + " , " + COL_AVATAR + " , " + COL_AVATAR_STATIC + " , "
+ COL_HEADER + " , " + COL_HEADER_STATIC + " , " + COL_EMOJIS + " , " + COL_SOCIAL + " , " + COL_IS_MODERATOR + " , " + COL_IS_ADMIN + " , "
+ COL_CLIENT_ID + " , " + COL_CLIENT_SECRET + " , " + COL_REFRESH_TOKEN + " , " + COL_UPDATED_AT + " , " + COL_PRIVACY + " , " + COL_SENSITIVE + " , "
+ COL_INSTANCE + " , " + COL_OAUTHTOKEN + " , " + COL_CREATED_AT + " ) "
+ " SELECT " + COL_USER_ID + " , " + COL_USERNAME + " , " + COL_ACCT + " , " + COL_DISPLAYED_NAME + " , " + COL_LOCKED + " , " + COL_FOLLOWERS_COUNT + " , "
+ COL_FOLLOWING_COUNT + " , " + COL_STATUSES_COUNT + " , " + COL_NOTE + " , " + COL_URL + " , " + COL_AVATAR + " , " + COL_AVATAR_STATIC + " , "
+ COL_HEADER + " , " + COL_HEADER_STATIC + " , " + COL_EMOJIS + " , " + COL_SOCIAL + " , " + COL_IS_MODERATOR + " , " + COL_IS_ADMIN + " , "
+ COL_CLIENT_ID + " , " + COL_CLIENT_SECRET + " , " + COL_REFRESH_TOKEN + " , " + COL_UPDATED_AT + " , " + COL_PRIVACY + " , " + COL_SENSITIVE + " , "
+ COL_INSTANCE + " , " + COL_OAUTHTOKEN + " , " + COL_CREATED_AT + " FROM " + TABLE_USER_ACCOUNT ;
2019-06-05 14:35:42 +02:00
db . execSQL ( insert ) ;
2019-09-06 17:55:14 +02:00
db . execSQL ( " DROP TABLE " + TABLE_USER_ACCOUNT ) ;
db . execSQL ( " ALTER TABLE " + TABLE_USER_ACCOUNT_TEMP + " RENAME TO " + TABLE_USER_ACCOUNT ) ;
2019-08-25 11:30:30 +02:00
case 32 :
db . execSQL ( CREATE_TABLE_NOTIFICATIONS ) ;
2019-08-28 11:34:33 +02:00
case 33 :
db . execSQL ( CREATE_TABLE_MAIN_MENU_ITEMS ) ;
2019-09-02 18:52:22 +02:00
case 34 :
db . execSQL ( " DROP INDEX IF EXISTS instance_statusid " ) ;
2019-09-06 17:55:14 +02:00
db . execSQL ( " DELETE FROM " + TABLE_STATUSES_CACHE ) ;
db . execSQL ( " DELETE FROM " + TABLE_NOTIFICATION_CACHE ) ;
2019-09-02 18:52:22 +02:00
db . execSQL ( CREATE_UNIQUE_CACHE_INDEX ) ;
2019-09-12 18:52:17 +02:00
case 35 :
db . execSQL ( CREATE_TABLE_USER_NOTES ) ;
2019-12-08 18:48:52 +01:00
case 36 :
2020-01-17 19:29:43 +01:00
if ( oldVersion > 33 ) {
db . execSQL ( " ALTER TABLE " + TABLE_MAIN_MENU_ITEMS + " ADD COLUMN " + COL_NAV_TRENDS + " INTEGER DEFAULT 1 " ) ;
}
2020-04-09 19:37:10 +02:00
case 37 :
if ( oldVersion > 8 )
db . execSQL ( " ALTER TABLE " + TABLE_STATUSES_CACHE + " ADD COLUMN " + COL_POLL + " TEXT " ) ;
2017-05-05 16:36:04 +02:00
default :
break ;
}
}
2019-09-06 17:55:14 +02:00
public SQLiteDatabase open ( ) {
2017-05-05 16:36:04 +02:00
//opened with write access
db = getWritableDatabase ( ) ;
return db ;
}
2019-09-06 17:55:14 +02:00
public void close ( ) {
2017-05-05 16:36:04 +02:00
//Close the db
2019-09-06 17:55:14 +02:00
if ( db ! = null & & db . isOpen ( ) ) {
2017-05-05 16:36:04 +02:00
db . close ( ) ;
}
}
2019-03-02 15:43:40 +01:00
2017-05-05 16:36:04 +02:00
}