Allow connection with Mastodon & Pleroma accounts

This commit is contained in:
Thomas 2020-12-31 14:19:26 +01:00
parent 0e14540b69
commit 36073d340d
12 changed files with 646 additions and 31 deletions

View File

@ -15,7 +15,6 @@ package app.fedilab.fedilabtube;
* see <http://www.gnu.org/licenses>. */
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.SpannableString;
@ -75,9 +74,8 @@ public class AccountActivity extends AppCompatActivity {
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
String token = Helper.getToken(AccountActivity.this);
TextView instanceView = findViewById(R.id.instance);
Account account = new AccountDAO(AccountActivity.this, db).getAccountByToken(token);

View File

@ -559,7 +559,7 @@ public class MainActivity extends AppCompatActivity implements ChromeCastsListen
private void refreshToken() {
new Thread(() -> {
final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
String tokenStr = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
String tokenStr = Helper.getToken(MainActivity.this);
String instance = HelperInstance.getLiveInstance(MainActivity.this);
SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
String instanceShar = sharedpreferences.getString(Helper.PREF_INSTANCE, null);

View File

@ -309,7 +309,7 @@ public class PeertubeActivity extends AppCompatActivity implements CommentListAd
max_id = "0";
SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
String token = Helper.getToken(PeertubeActivity.this);
if (Helper.isLoggedIn(PeertubeActivity.this) && !sepiaSearch) {
Account account = new AccountDAO(PeertubeActivity.this, db).getAccountByToken(token);
Helper.loadGiF(PeertubeActivity.this, account.getAvatar() != null ? account.getAvatar().getPath() : null, binding.myPp);

View File

@ -321,7 +321,7 @@ public class PeertubeUploadActivity extends AppCompatActivity {
}
try {
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
String token = Helper.getToken(PeertubeUploadActivity.this);
new MultipartUploadRequest(PeertubeUploadActivity.this, "https://" + HelperInstance.getLiveInstance(PeertubeUploadActivity.this) + "/api/v1/videos/upload")
.setMethod("POST")

View File

@ -15,7 +15,7 @@ package app.fedilab.fedilabtube.client;
* see <http://www.gnu.org/licenses>. */
import app.fedilab.fedilabtube.client.data.AccountData;
import app.fedilab.fedilabtube.client.entities.MastodonAccount;
import app.fedilab.fedilabtube.client.entities.Oauth;
import app.fedilab.fedilabtube.client.entities.Token;
import retrofit2.Call;
@ -45,6 +45,6 @@ interface MastodonService {
@Field("code") String code);
@GET("accounts/verify_credentials")
Call<AccountData.Account> verifyCredentials(@Header("Authorization") String credentials);
Call<MastodonAccount.Account> verifyCredentials(@Header("Authorization") String credentials);
}

View File

@ -14,13 +14,13 @@ import java.net.URLDecoder;
import app.fedilab.fedilabtube.MainActivity;
import app.fedilab.fedilabtube.R;
import app.fedilab.fedilabtube.client.data.AccountData;
import app.fedilab.fedilabtube.client.entities.Error;
import app.fedilab.fedilabtube.client.entities.MastodonAccount;
import app.fedilab.fedilabtube.client.entities.Oauth;
import app.fedilab.fedilabtube.client.entities.OauthParams;
import app.fedilab.fedilabtube.client.entities.Token;
import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.sqlite.AccountDAO;
import app.fedilab.fedilabtube.sqlite.MastodonAccountDAO;
import app.fedilab.fedilabtube.sqlite.Sqlite;
import retrofit2.Call;
import retrofit2.Response;
@ -44,7 +44,7 @@ public class RetrofitMastodonAPI {
public void updateCredential(Activity activity, String client_id, String client_secret, String refresh_token, String software) {
new Thread(() -> {
AccountData.Account account;
MastodonAccount.Account account;
try {
account = new RetrofitMastodonAPI(activity, instance, token).verifyCredentials();
} catch (Error error) {
@ -63,17 +63,19 @@ public class RetrofitMastodonAPI {
account.setClient_secret(client_secret);
account.setRefresh_token(refresh_token);
account.setHost(instance);
account.setSoftware(software);
SQLiteDatabase db = Sqlite.getInstance(activity.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
boolean userExists = new AccountDAO(activity, db).userExist(account);
boolean userExists = new MastodonAccountDAO(activity, db).userExist(account);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_KEY_ID, account.getId());
editor.putString(Helper.PREF_KEY_NAME, account.getUsername());
editor.putString(Helper.PREF_SOFTWARE, software);
editor.apply();
if (userExists)
new AccountDAO(activity, db).updateAccountCredential(account);
new MastodonAccountDAO(activity, db).updateAccountCredential(account);
else {
if (account.getUsername() != null && account.getCreatedAt() != null)
new AccountDAO(activity, db).insertAccount(account, software);
new MastodonAccountDAO(activity, db).insertAccount(account);
}
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> {
@ -91,9 +93,8 @@ public class RetrofitMastodonAPI {
.baseUrl(finalUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
SharedPreferences sharedpreferences = _context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
if (token == null) {
token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
token = Helper.getToken(_context);
}
return retrofit.create(MastodonService.class);
}
@ -123,12 +124,12 @@ public class RetrofitMastodonAPI {
* Verifiy credential of the authenticated user *synchronously*
* @return Account
*/
public AccountData.Account verifyCredentials() throws Error {
public MastodonAccount.Account verifyCredentials() throws Error {
MastodonService mastodonService = init();
Call<AccountData.Account> accountCall = mastodonService.verifyCredentials("Bearer " + token);
Call<MastodonAccount.Account> accountCall = mastodonService.verifyCredentials("Bearer " + token);
APIResponse apiResponse = new APIResponse();
try {
Response<AccountData.Account> response = accountCall.execute();
Response<MastodonAccount.Account> response = accountCall.execute();
if (response.isSuccessful() && response.body() != null) {
return response.body();
} else {

View File

@ -201,7 +201,7 @@ public class RetrofitPeertubeAPI {
.build();
SharedPreferences sharedpreferences = _context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
if (token == null) {
token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
token = Helper.getToken(_context);
}
selection = sharedpreferences.getStringSet(_context.getString(R.string.set_video_language_choice), null);
return retrofit.create(PeertubeService.class);

View File

@ -0,0 +1,240 @@
package app.fedilab.fedilabtube.client.entities;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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.
*
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import android.os.Parcel;
import android.os.Parcelable;
import com.google.gson.annotations.SerializedName;
import java.util.Date;
@SuppressWarnings({"unused", "RedundantSuppression"})
public class MastodonAccount {
public static class Account implements Parcelable {
public static final Creator<Account> CREATOR = new Creator<Account>() {
@Override
public Account createFromParcel(Parcel source) {
return new Account(source);
}
@Override
public Account[] newArray(int size) {
return new Account[size];
}
};
@SerializedName("avatar")
private String avatar;
@SerializedName("createdAt")
private Date createdAt;
@SerializedName("note")
private String description;
@SerializedName("display_name")
private String displayName;
@SerializedName("followers_count")
private int followersCount;
@SerializedName("following_count")
private int followingCount;
@SerializedName("id")
private String id;
@SerializedName("username")
private String username;
@SerializedName("updatedAt")
private Date updatedAt;
@SerializedName("url")
private String url;
private String token;
private String client_id;
private String client_secret;
private String refresh_token;
private String software;
private String host;
public Account() {
}
protected Account(Parcel in) {
this.avatar = in.readString();
long tmpCreatedAt = in.readLong();
this.createdAt = tmpCreatedAt == -1 ? null : new Date(tmpCreatedAt);
this.description = in.readString();
this.displayName = in.readString();
this.followersCount = in.readInt();
this.followingCount = in.readInt();
this.id = in.readString();
this.username = in.readString();
long tmpUpdatedAt = in.readLong();
this.updatedAt = tmpUpdatedAt == -1 ? null : new Date(tmpUpdatedAt);
this.url = in.readString();
}
public String getAvatar() {
return avatar;
}
public void setAvatar(String avatar) {
this.avatar = avatar;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDisplayName() {
return displayName;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
public int getFollowersCount() {
return followersCount;
}
public void setFollowersCount(int followersCount) {
this.followersCount = followersCount;
}
public int getFollowingCount() {
return followingCount;
}
public void setFollowingCount(int followingCount) {
this.followingCount = followingCount;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getAcct() {
return username + "@" + host;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getClient_id() {
return client_id;
}
public void setClient_id(String client_id) {
this.client_id = client_id;
}
public String getClient_secret() {
return client_secret;
}
public void setClient_secret(String client_secret) {
this.client_secret = client_secret;
}
public String getRefresh_token() {
return refresh_token;
}
public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
}
public String getSoftware() {
return software;
}
public void setSoftware(String software) {
this.software = software;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.avatar);
dest.writeLong(this.createdAt != null ? this.createdAt.getTime() : -1);
dest.writeString(this.description);
dest.writeString(this.displayName);
dest.writeInt(this.followersCount);
dest.writeInt(this.followingCount);
dest.writeString(this.id);
dest.writeString(this.username);
dest.writeLong(this.updatedAt != null ? this.updatedAt.getTime() : -1);
dest.writeString(this.url);
}
}
}

View File

@ -77,6 +77,7 @@ import es.dmoral.toasty.Toasty;
import jp.wasabeef.glide.transformations.BlurTransformation;
import static android.content.Context.DOWNLOAD_SERVICE;
import static android.content.Context.MODE_PRIVATE;
public class Helper {
@ -342,7 +343,7 @@ public class Helper {
} else {
webView = rootView.findViewById(webviewId);
}
final SharedPreferences sharedpreferences = activity.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
final SharedPreferences sharedpreferences = activity.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setUseWideViewPort(true);
@ -421,7 +422,7 @@ public class Helper {
* @param account Account
*/
public static void logoutCurrentUser(Activity activity, Account account) {
SharedPreferences sharedpreferences = activity.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
SharedPreferences sharedpreferences = activity.getSharedPreferences(APP_PREFS, MODE_PRIVATE);
//Current user
SQLiteDatabase db = Sqlite.getInstance(activity.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
@ -459,7 +460,7 @@ public class Helper {
* @param activity Activity
*/
public static void logoutNoRemoval(Activity activity) {
SharedPreferences sharedpreferences = activity.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
SharedPreferences sharedpreferences = activity.getSharedPreferences(APP_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(PREF_KEY_OAUTH_TOKEN, null);
editor.putString(CLIENT_ID, null);
@ -507,7 +508,7 @@ public class Helper {
* @return MainActivity.TypeOfConnection
*/
private static MainActivity.TypeOfConnection isLoggedInType(Context context) {
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
String prefKeyOauthTokenT = sharedpreferences.getString(PREF_KEY_OAUTH_TOKEN, null);
String prefSoftware = sharedpreferences.getString(PREF_SOFTWARE, null);
if (prefKeyOauthTokenT != null && prefSoftware == null) {
@ -519,6 +520,14 @@ public class Helper {
}
}
public static String getToken(Context context) {
if (isLoggedInType(context) == MainActivity.TypeOfConnection.NORMAL) {
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
return sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
} else {
return null;
}
}
/**
* Converts dp to pixel
@ -544,7 +553,7 @@ public class Helper {
public static boolean isOwner(Context context, Account account) {
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
String userName = sharedpreferences.getString(Helper.PREF_KEY_NAME, "");
String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, "");
if (instance != null && userName != null) {
@ -555,7 +564,7 @@ public class Helper {
}
public static boolean isVideoOwner(Context context, VideoData.Video video) {
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
String userName = sharedpreferences.getString(Helper.PREF_KEY_NAME, "");
String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, "");
if (video == null) {
@ -582,7 +591,7 @@ public class Helper {
if (files == null || files.size() == 0) {
return null;
}
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
int video_quality = sharedpreferences.getInt(Helper.SET_QUALITY_MODE, Helper.QUALITY_HIGH);
if (video_quality == QUALITY_HIGH) {
return files.get(0);

View File

@ -0,0 +1,369 @@
package app.fedilab.fedilabtube.sqlite;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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.
*
* You should have received a copy of the GNU General Public License along with TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import app.fedilab.fedilabtube.client.entities.MastodonAccount.Account;
import app.fedilab.fedilabtube.client.entities.Token;
import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.helper.HelperInstance;
@SuppressWarnings("UnusedReturnValue")
public class MastodonAccountDAO {
private final SQLiteDatabase db;
public Context context;
public MastodonAccountDAO(Context context, SQLiteDatabase db) {
//Creation of the DB with tables
this.context = context;
this.db = db;
}
/**
* Insert an Account in database
*
* @param account Account
* @return boolean
*/
public boolean insertAccount(Account account) {
ContentValues values = new ContentValues();
if (account.getCreatedAt() == null)
account.setCreatedAt(new Date());
if (account.getDescription() == null)
account.setDescription("");
values.put(Sqlite.COL_USER_ID, account.getId());
values.put(Sqlite.COL_USERNAME, account.getUsername());
values.put(Sqlite.COL_ACCT, account.getUsername() + "@" + account.getHost());
values.put(Sqlite.COL_DISPLAYED_NAME, account.getDisplayName() != null ? account.getDisplayName() : account.getUsername());
values.put(Sqlite.COL_FOLLOWERS_COUNT, account.getFollowersCount());
values.put(Sqlite.COL_FOLLOWING_COUNT, account.getFollowingCount());
values.put(Sqlite.COL_NOTE, account.getDescription());
values.put(Sqlite.COL_URL, account.getUrl());
values.put(Sqlite.COL_AVATAR, account.getAvatar());
values.put(Sqlite.COL_CREATED_AT, Helper.dateToString(account.getCreatedAt()));
values.put(Sqlite.COL_INSTANCE, account.getHost());
values.put(Sqlite.COL_LOCKED, false);
values.put(Sqlite.COL_STATUSES_COUNT, 0);
values.put(Sqlite.COL_URL, "");
values.put(Sqlite.COL_AVATAR_STATIC, "");
values.put(Sqlite.COL_HEADER, "");
values.put(Sqlite.COL_HEADER_STATIC, "");
if (account.getSoftware() != null && account.getSoftware().toUpperCase().trim().compareTo("PEERTUBE") != 0) {
values.put(Sqlite.COL_SOFTWARE, account.getSoftware().toUpperCase().trim());
}
if (account.getClient_id() != null && account.getClient_secret() != null) {
values.put(Sqlite.COL_CLIENT_ID, account.getClient_id());
values.put(Sqlite.COL_CLIENT_SECRET, account.getClient_secret());
}
if (account.getRefresh_token() != null) {
values.put(Sqlite.COL_REFRESH_TOKEN, account.getRefresh_token());
}
if (account.getToken() != null)
values.put(Sqlite.COL_OAUTHTOKEN, account.getToken());
//Inserts account
try {
db.insertOrThrow(Sqlite.TABLE_USER_ACCOUNT, null, values);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* Update an Account in database
*
* @param account Account
* @return boolean
*/
public int updateAccount(Account account) {
ContentValues values = new ContentValues();
if (account.getCreatedAt() == null)
account.setCreatedAt(new Date());
if (account.getDescription() == null)
account.setDescription("");
values.put(Sqlite.COL_USER_ID, account.getId());
values.put(Sqlite.COL_USERNAME, account.getUsername());
values.put(Sqlite.COL_ACCT, account.getUsername() + "@" + account.getHost());
values.put(Sqlite.COL_DISPLAYED_NAME, account.getDisplayName());
values.put(Sqlite.COL_FOLLOWERS_COUNT, account.getFollowersCount());
values.put(Sqlite.COL_FOLLOWING_COUNT, account.getFollowingCount());
values.put(Sqlite.COL_NOTE, account.getDescription());
values.put(Sqlite.COL_URL, account.getUrl());
values.put(Sqlite.COL_AVATAR, account.getAvatar());
values.put(Sqlite.COL_CREATED_AT, Helper.dateToString(account.getCreatedAt()));
try {
return db.update(Sqlite.TABLE_USER_ACCOUNT,
values, Sqlite.COL_USERNAME + " = ? AND " + Sqlite.COL_INSTANCE + " =?",
new String[]{account.getUsername(), account.getHost()});
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
/**
* Update an Account token in database
*
* @param token Token
* @return boolean
*/
public int updateAccountToken(Token token) {
ContentValues values = new ContentValues();
if (token.getRefresh_token() != null) {
values.put(Sqlite.COL_REFRESH_TOKEN, token.getRefresh_token());
}
if (token.getAccess_token() != null)
values.put(Sqlite.COL_OAUTHTOKEN, token.getAccess_token());
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
String instance = HelperInstance.getLiveInstance(context);
try {
return db.update(Sqlite.TABLE_USER_ACCOUNT,
values, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =?",
new String[]{userId, instance});
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
/**
* Update an Account in database
*
* @param account Account
* @return boolean
*/
public int updateAccountCredential(Account account) {
ContentValues values = new ContentValues();
if (account.getCreatedAt() == null)
account.setCreatedAt(new Date());
if (account.getDescription() == null)
account.setDescription("");
values.put(Sqlite.COL_USERNAME, account.getUsername());
values.put(Sqlite.COL_ACCT, account.getUsername() + "@" + account.getHost());
values.put(Sqlite.COL_DISPLAYED_NAME, account.getDisplayName());
values.put(Sqlite.COL_FOLLOWERS_COUNT, account.getFollowersCount());
values.put(Sqlite.COL_FOLLOWING_COUNT, account.getFollowingCount());
values.put(Sqlite.COL_NOTE, account.getDescription());
values.put(Sqlite.COL_URL, account.getUrl());
values.put(Sqlite.COL_AVATAR, account.getAvatar());
values.put(Sqlite.COL_CREATED_AT, Helper.dateToString(account.getCreatedAt()));
if (account.getClient_id() != null && account.getClient_secret() != null) {
values.put(Sqlite.COL_CLIENT_ID, account.getClient_id());
values.put(Sqlite.COL_CLIENT_SECRET, account.getClient_secret());
}
if (account.getRefresh_token() != null) {
values.put(Sqlite.COL_REFRESH_TOKEN, account.getRefresh_token());
}
if (account.getToken() != null)
values.put(Sqlite.COL_OAUTHTOKEN, account.getToken());
return db.update(Sqlite.TABLE_USER_ACCOUNT,
values, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =?",
new String[]{account.getId(), account.getHost()});
}
public int removeUser(Account account) {
return db.delete(Sqlite.TABLE_USER_ACCOUNT, Sqlite.COL_USER_ID + " = '" + account.getId() +
"' AND " + Sqlite.COL_INSTANCE + " = '" + account.getHost() + "'", null);
}
/**
* Returns last used account
*
* @return Account
*/
public Account getLastUsedAccount() {
try {
Cursor c = db.query(Sqlite.TABLE_USER_ACCOUNT, null, Sqlite.COL_OAUTHTOKEN + " != 'null'", null, null, null, Sqlite.COL_UPDATED_AT + " DESC", "1");
return cursorToUser(c);
} catch (Exception e) {
return null;
}
}
/**
* Returns all Account in db
*
* @return Account List<Account>
*/
public List<Account> getAllAccount() {
try {
Cursor c = db.query(Sqlite.TABLE_USER_ACCOUNT, null, null, null, null, null, Sqlite.COL_INSTANCE + " ASC", null);
return cursorToListUser(c);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Returns an Account by token
*
* @param token String
* @return Account
*/
public Account getAccountByToken(String token) {
try {
Cursor c = db.query(Sqlite.TABLE_USER_ACCOUNT, null, Sqlite.COL_OAUTHTOKEN + " = \"" + token + "\"", null, null, null, null, "1");
return cursorToUser(c);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Returns an Account by id and instance
*
* @param id String
* @param instance String
* @return Account
*/
public Account getAccountByIdInstance(String id, String instance) {
try {
Cursor c = db.query(Sqlite.TABLE_USER_ACCOUNT, null, Sqlite.COL_USER_ID + " = \"" + id + "\" AND " + Sqlite.COL_INSTANCE + " = \"" + instance + "\"", null, null, null, null, "1");
return cursorToUser(c);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Test if the current user is already stored in data base
*
* @param account Account
* @return boolean
*/
public boolean userExist(Account account) {
Cursor mCount = db.rawQuery("select count(*) from " + Sqlite.TABLE_USER_ACCOUNT
+ " where " + Sqlite.COL_USERNAME + " = '" + account.getUsername() + "' AND " + Sqlite.COL_INSTANCE + " = '" + account.getHost() + "'", null);
mCount.moveToFirst();
int count = mCount.getInt(0);
mCount.close();
return (count > 0);
}
/***
* Method to hydrate an Account from database
* @param c Cursor
* @return Account
*/
private Account cursorToUser(Cursor c) {
//No element found
if (c.getCount() == 0) {
c.close();
return null;
}
//Take the first element
c.moveToFirst();
//New user
Account account = new Account();
account.setId(c.getString(c.getColumnIndex(Sqlite.COL_USER_ID)));
account.setUsername(c.getString(c.getColumnIndex(Sqlite.COL_USERNAME)));
account.setDisplayName(c.getString(c.getColumnIndex(Sqlite.COL_DISPLAYED_NAME)));
account.setFollowersCount(c.getInt(c.getColumnIndex(Sqlite.COL_FOLLOWERS_COUNT)));
account.setFollowingCount(c.getInt(c.getColumnIndex(Sqlite.COL_FOLLOWING_COUNT)));
account.setDescription(c.getString(c.getColumnIndex(Sqlite.COL_NOTE)));
account.setUrl(c.getString(c.getColumnIndex(Sqlite.COL_URL)));
account.setAvatar(c.getString(c.getColumnIndex(Sqlite.COL_AVATAR)));
account.setUpdatedAt(Helper.stringToDate(context, c.getString(c.getColumnIndex(Sqlite.COL_UPDATED_AT))));
account.setCreatedAt(Helper.stringToDate(context, c.getString(c.getColumnIndex(Sqlite.COL_CREATED_AT))));
account.setHost(c.getString(c.getColumnIndex(Sqlite.COL_INSTANCE)));
account.setToken(c.getString(c.getColumnIndex(Sqlite.COL_OAUTHTOKEN)));
account.setSoftware(c.getString(c.getColumnIndex(Sqlite.COL_SOFTWARE)));
account.setClient_id(c.getString(c.getColumnIndex(Sqlite.COL_CLIENT_ID)));
account.setClient_secret(c.getString(c.getColumnIndex(Sqlite.COL_CLIENT_SECRET)));
account.setRefresh_token(c.getString(c.getColumnIndex(Sqlite.COL_REFRESH_TOKEN)));
//Close the cursor
c.close();
//User is returned
return account;
}
/***
* Method to hydrate an Accounts from database
* @param c Cursor
* @return List<Account>
*/
private List<Account> cursorToListUser(Cursor c) {
//No element found
if (c.getCount() == 0) {
c.close();
return null;
}
List<Account> accounts = new ArrayList<>();
while (c.moveToNext()) {
//New user
Account account = new Account();
account.setId(c.getString(c.getColumnIndex(Sqlite.COL_USER_ID)));
account.setUsername(c.getString(c.getColumnIndex(Sqlite.COL_USERNAME)));
account.setDisplayName(c.getString(c.getColumnIndex(Sqlite.COL_DISPLAYED_NAME)));
account.setFollowersCount(c.getInt(c.getColumnIndex(Sqlite.COL_FOLLOWERS_COUNT)));
account.setFollowingCount(c.getInt(c.getColumnIndex(Sqlite.COL_FOLLOWING_COUNT)));
account.setDescription(c.getString(c.getColumnIndex(Sqlite.COL_NOTE)));
account.setUrl(c.getString(c.getColumnIndex(Sqlite.COL_URL)));
account.setAvatar(c.getString(c.getColumnIndex(Sqlite.COL_AVATAR)));
account.setUpdatedAt(Helper.stringToDate(context, c.getString(c.getColumnIndex(Sqlite.COL_UPDATED_AT))));
account.setCreatedAt(Helper.stringToDate(context, c.getString(c.getColumnIndex(Sqlite.COL_CREATED_AT))));
account.setHost(c.getString(c.getColumnIndex(Sqlite.COL_INSTANCE)));
account.setToken(c.getString(c.getColumnIndex(Sqlite.COL_OAUTHTOKEN)));
account.setSoftware(c.getString(c.getColumnIndex(Sqlite.COL_SOFTWARE)));
account.setClient_id(c.getString(c.getColumnIndex(Sqlite.COL_CLIENT_ID)));
account.setClient_secret(c.getString(c.getColumnIndex(Sqlite.COL_CLIENT_SECRET)));
account.setRefresh_token(c.getString(c.getColumnIndex(Sqlite.COL_REFRESH_TOKEN)));
accounts.add(account);
}
//Close the cursor
c.close();
//Users list is returned
return accounts;
}
}

View File

@ -63,7 +63,7 @@ public class ChannelsVM extends AndroidViewModel {
if (type == RetrofitPeertubeAPI.DataType.MY_CHANNELS) {
SharedPreferences sharedpreferences = _mContext.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
SQLiteDatabase db = Sqlite.getInstance(_mContext.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
String token = Helper.getToken(_mContext);
AccountData.Account account = new AccountDAO(_mContext, db).getAccountByToken(token);
finalElement = account.getUsername() + "@" + account.getHost();
}

View File

@ -16,7 +16,6 @@ package app.fedilab.fedilabtube.viewmodel;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Handler;
import android.os.Looper;
@ -97,8 +96,7 @@ public class PlaylistsVM extends AndroidViewModel {
Context _mContext = getApplication().getApplicationContext();
new Thread(() -> {
try {
SharedPreferences sharedpreferences = _mContext.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
String token = sharedpreferences.getString(Helper.PREF_KEY_OAUTH_TOKEN, null);
String token = Helper.getToken(_mContext);
SQLiteDatabase db = Sqlite.getInstance(_mContext.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
Account account = new AccountDAO(_mContext, db).getAccountByToken(token);
int statusCode = -1;