diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountLoader.java b/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountLoader.java index 037837a2..1af07595 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountLoader.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/async/AccountLoader.java @@ -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> { */ public static final int MODE_DELETE = 2; - private AccountDatabase accountDatabase; + private AppDatabase db; private WeakReference weakRef; private int mode; @@ -38,7 +38,7 @@ public class AccountLoader extends AsyncTask> { 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> { protected List 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; diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/async/LoginAction.java b/app/src/main/java/org/nuclearfog/twidda/backend/async/LoginAction.java index 0d7d2b22..f4e8bfb6 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/async/LoginAction.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/async/LoginAction.java @@ -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 { public static final int LOGIN_MASTODON = 11; private WeakReference weakRef; - private AccountDatabase accountDB; private AppDatabase database; private Connection connection; @Nullable @@ -61,7 +59,6 @@ public class LoginAction extends AsyncTask { 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 { // 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) { diff --git a/app/src/main/java/org/nuclearfog/twidda/database/AccountDatabase.java b/app/src/main/java/org/nuclearfog/twidda/database/AccountDatabase.java deleted file mode 100644 index 61c54b27..00000000 --- a/app/src/main/java/org/nuclearfog/twidda/database/AccountDatabase.java +++ /dev/null @@ -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 getLogins() { - ArrayList 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); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java b/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java index d320a671..dccb1259 100644 --- a/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java +++ b/app/src/main/java/org/nuclearfog/twidda/database/AppDatabase.java @@ -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 getLogins() { + ArrayList 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); } diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/SettingsActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/SettingsActivity.java index 7ead3629..5f4a8c40 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/SettingsActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/SettingsActivity.java @@ -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();