merged account database with app database, bug fix

This commit is contained in:
nuclearfog 2022-12-24 14:30:31 +01:00
parent da061d316b
commit ac7ca301cd
No known key found for this signature in database
GPG Key ID: 03488A185C476379
5 changed files with 84 additions and 119 deletions

View File

@ -2,7 +2,7 @@ package org.nuclearfog.twidda.backend.async;
import android.os.AsyncTask;
import org.nuclearfog.twidda.database.AccountDatabase;
import org.nuclearfog.twidda.database.AppDatabase;
import org.nuclearfog.twidda.model.Account;
import org.nuclearfog.twidda.ui.fragments.AccountFragment;
@ -26,7 +26,7 @@ public class AccountLoader extends AsyncTask<Long, Void, List<Account>> {
*/
public static final int MODE_DELETE = 2;
private AccountDatabase accountDatabase;
private AppDatabase db;
private WeakReference<AccountFragment> weakRef;
private int mode;
@ -38,7 +38,7 @@ public class AccountLoader extends AsyncTask<Long, Void, List<Account>> {
public AccountLoader(AccountFragment fragment, int mode) {
super();
weakRef = new WeakReference<>(fragment);
accountDatabase = new AccountDatabase(fragment.requireContext());
db = new AppDatabase(fragment.requireContext());
this.mode = mode;
}
@ -47,11 +47,11 @@ public class AccountLoader extends AsyncTask<Long, Void, List<Account>> {
protected List<Account> doInBackground(Long... param) {
// get all logins
if (mode == MODE_LOAD) {
return accountDatabase.getLogins();
return db.getLogins();
}
// delete login
else if (mode == MODE_DELETE) {
accountDatabase.removeLogin(param[0]);
db.removeLogin(param[0]);
deleteId = param[0];
}
return null;

View File

@ -7,7 +7,6 @@ import androidx.annotation.Nullable;
import org.nuclearfog.twidda.backend.api.Connection;
import org.nuclearfog.twidda.backend.api.ConnectionException;
import org.nuclearfog.twidda.backend.api.ConnectionManager;
import org.nuclearfog.twidda.database.AccountDatabase;
import org.nuclearfog.twidda.database.AppDatabase;
import org.nuclearfog.twidda.model.Account;
import org.nuclearfog.twidda.ui.activities.LoginActivity;
@ -43,7 +42,6 @@ public class LoginAction extends AsyncTask<String, Void, String> {
public static final int LOGIN_MASTODON = 11;
private WeakReference<LoginActivity> weakRef;
private AccountDatabase accountDB;
private AppDatabase database;
private Connection connection;
@Nullable
@ -61,7 +59,6 @@ public class LoginAction extends AsyncTask<String, Void, String> {
public LoginAction(LoginActivity activity, int network, int mode) {
super();
weakRef = new WeakReference<>(activity);
accountDB = new AccountDatabase(activity);
database = new AppDatabase(activity);
this.mode = mode;
@ -86,8 +83,7 @@ public class LoginAction extends AsyncTask<String, Void, String> {
// login with pin and access token
Account account = connection.loginApp(param);
// save new user information
database.saveUser(account.getUser());
accountDB.saveLogin(account);
database.saveLogin(account);
return "";
}
} catch (ConnectionException exception) {

View File

@ -1,104 +0,0 @@
package org.nuclearfog.twidda.database;
import static android.database.sqlite.SQLiteDatabase.CONFLICT_REPLACE;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import org.nuclearfog.twidda.database.DatabaseAdapter.AccountTable;
import org.nuclearfog.twidda.database.impl.AccountImpl;
import org.nuclearfog.twidda.model.Account;
import java.util.ArrayList;
import java.util.List;
/**
* this database stores multi user logins
*
* @author nuclearfog
*/
public class AccountDatabase {
/**
* selection for account entry
*/
private static final String ACCOUNT_SELECTION = AccountTable.ID + "=?";
/**
* default sort order of the entries
* sort by date of creation, starting with the latest entry
*/
private static final String SORT_BY_CREATION = AccountTable.DATE + " DESC";
private DatabaseAdapter dataHelper;
private AppDatabase database;
/**
* @param context current activity context
*/
public AccountDatabase(Context context) {
dataHelper = DatabaseAdapter.getInstance(context);
database = new AppDatabase(context);
}
/**
* register user login
*
* @param account Account information
*/
public void saveLogin(Account account) {
ContentValues values = new ContentValues();
values.put(AccountTable.ID, account.getId());
values.put(AccountTable.DATE, account.getLoginDate());
values.put(AccountTable.HOSTNAME, account.getHostname());
values.put(AccountTable.CLIENT_ID, account.getConsumerToken());
values.put(AccountTable.CLIENT_SECRET, account.getConsumerSecret());
values.put(AccountTable.API, account.getApiType());
values.put(AccountTable.ACCESS_TOKEN, account.getOauthToken());
values.put(AccountTable.TOKEN_SECRET, account.getOauthSecret());
values.put(AccountTable.BEARER, account.getBearerToken());
SQLiteDatabase db = dataHelper.getDatabase();
db.beginTransaction();
db.insertWithOnConflict(AccountTable.NAME, "", values, CONFLICT_REPLACE);
db.setTransactionSuccessful();
db.endTransaction();
}
/**
* get all user logins
*
* @return list of all logins
*/
public List<Account> getLogins() {
ArrayList<Account> result = new ArrayList<>();
SQLiteDatabase db = dataHelper.getDatabase();
Cursor cursor = db.query(AccountTable.NAME, AccountImpl.COLUMNS, null, null, null, null, SORT_BY_CREATION);
if (cursor.moveToFirst()) {
result.ensureCapacity(cursor.getCount());
do {
AccountImpl account = new AccountImpl(cursor);
account.addUser(database.getUser(account.getId(), account));
result.add(account);
} while (cursor.moveToNext());
}
cursor.close();
return result;
}
/**
* remove login information from storage
*
* @param id account ID to remove
*/
public void removeLogin(long id) {
String[] args = {Long.toString(id)};
SQLiteDatabase db = dataHelper.getDatabase();
db.delete(AccountTable.NAME, ACCOUNT_SELECTION, args);
}
}

View File

@ -2,6 +2,7 @@ package org.nuclearfog.twidda.database;
import static android.database.sqlite.SQLiteDatabase.CONFLICT_IGNORE;
import static android.database.sqlite.SQLiteDatabase.CONFLICT_REPLACE;
import static org.nuclearfog.twidda.database.DatabaseAdapter.AccountTable;
import static org.nuclearfog.twidda.database.DatabaseAdapter.FavoriteTable;
import static org.nuclearfog.twidda.database.DatabaseAdapter.LocationTable;
import static org.nuclearfog.twidda.database.DatabaseAdapter.MediaTable;
@ -21,6 +22,7 @@ import android.database.sqlite.SQLiteDatabase;
import androidx.annotation.Nullable;
import org.nuclearfog.twidda.backend.lists.Messages;
import org.nuclearfog.twidda.database.impl.AccountImpl;
import org.nuclearfog.twidda.database.impl.LocationImpl;
import org.nuclearfog.twidda.database.impl.MediaImpl;
import org.nuclearfog.twidda.database.impl.MessageImpl;
@ -37,6 +39,7 @@ import org.nuclearfog.twidda.model.Status;
import org.nuclearfog.twidda.model.Trend;
import org.nuclearfog.twidda.model.User;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@ -271,6 +274,11 @@ public class AppDatabase {
*/
private static final String USER_REG_SELECT = UserRegisterTable.ID + "=? AND " + UserRegisterTable.OWNER + "=?";
/**
* selection for account entry
*/
private static final String ACCOUNT_SELECTION = AccountTable.ID + "=?";
/**
* column projection for user register
*/
@ -286,6 +294,11 @@ public class AppDatabase {
*/
private static final String TREND_ORDER = TrendTable.INDEX + " ASC";
/**
* default sort order for logins
*/
private static final String SORT_BY_CREATION = AccountTable.DATE + " DESC";
/**
* limit for accessing a single row
*/
@ -441,6 +454,32 @@ public class AppDatabase {
commit(db);
}
/**
* save user login
*
* @param account login information
*/
public void saveLogin(Account account) {
ContentValues values = new ContentValues(9);
values.put(AccountTable.ID, account.getId());
values.put(AccountTable.DATE, account.getLoginDate());
values.put(AccountTable.HOSTNAME, account.getHostname());
values.put(AccountTable.CLIENT_ID, account.getConsumerToken());
values.put(AccountTable.CLIENT_SECRET, account.getConsumerSecret());
values.put(AccountTable.API, account.getApiType());
values.put(AccountTable.ACCESS_TOKEN, account.getOauthToken());
values.put(AccountTable.TOKEN_SECRET, account.getOauthSecret());
values.put(AccountTable.BEARER, account.getBearerToken());
SQLiteDatabase db = getDbWrite();
db.beginTransaction();
db.insertWithOnConflict(AccountTable.NAME, "", values, CONFLICT_REPLACE);
if (account.getUser() != null) {
saveUser(account.getUser(), db, CONFLICT_IGNORE);
}
db.setTransactionSuccessful();
db.endTransaction();
}
/**
* load home timeline
*
@ -698,6 +737,18 @@ public class AppDatabase {
commit(db);
}
/**
* remove login information from database
*
* @param id account ID to remove
*/
public void removeLogin(long id) {
String[] args = {Long.toString(id)};
SQLiteDatabase db = getDbWrite();
db.delete(DatabaseAdapter.AccountTable.NAME, ACCOUNT_SELECTION, args);
}
/**
* Load trend List
*
@ -782,6 +833,28 @@ public class AppDatabase {
commit(db);
}
/**
* get all user logins
*
* @return list of all logins
*/
public List<Account> getLogins() {
ArrayList<Account> result = new ArrayList<>();
SQLiteDatabase db = getDbRead();
Cursor cursor = db.query(DatabaseAdapter.AccountTable.NAME, AccountImpl.COLUMNS, null, null, null, null, SORT_BY_CREATION);
if (cursor.moveToFirst()) {
result.ensureCapacity(cursor.getCount());
do {
AccountImpl account = new AccountImpl(cursor);
account.addUser(getUser(account.getId(), account));
result.add(account);
} while (cursor.moveToNext());
}
cursor.close();
return result;
}
/**
* get status information from database
*
@ -1154,8 +1227,8 @@ public class AppDatabase {
userUpdate.put(UserTable.FRIENDS, user.getFollowing());
userUpdate.put(UserTable.FOLLOWER, user.getFollower());
db.update(StatusTable.NAME, statusUpdate, STATUS_SELECT, statusIdArg);
db.update(UserTable.NAME, userUpdate, USER_SELECT, userIdArg);
db.updateWithOnConflict(StatusTable.NAME, statusUpdate, STATUS_SELECT, statusIdArg, CONFLICT_REPLACE);
db.updateWithOnConflict(UserTable.NAME, userUpdate, USER_SELECT, userIdArg, CONFLICT_IGNORE);
saveStatusRegister(db, status, register);
}

View File

@ -47,7 +47,7 @@ import org.nuclearfog.twidda.backend.api.ConnectionException;
import org.nuclearfog.twidda.backend.async.LocationLoader;
import org.nuclearfog.twidda.backend.utils.AppStyles;
import org.nuclearfog.twidda.backend.utils.ErrorHandler;
import org.nuclearfog.twidda.database.AccountDatabase;
import org.nuclearfog.twidda.database.AppDatabase;
import org.nuclearfog.twidda.database.DatabaseAdapter;
import org.nuclearfog.twidda.database.GlobalSettings;
import org.nuclearfog.twidda.model.Account;
@ -300,8 +300,8 @@ public class SettingsActivity extends AppCompatActivity implements OnClickListen
// confirm log out
if (type == ConfirmDialog.APP_LOG_OUT) {
// remove account from database
AccountDatabase accountDB = new AccountDatabase(this);
accountDB.removeLogin(settings.getLogin().getId());
AppDatabase db = new AppDatabase(this);
db.removeLogin(settings.getLogin().getId());
settings.setLogin(null, true);
setResult(RETURN_APP_LOGOUT);
finish();