Loading app/build.gradle +7 −6 Original line number Diff line number Diff line Loading @@ -9,8 +9,8 @@ android { defaultConfig { minSdk 21 targetSdk 31 versionCode 385 versionName "3.0.0-beta-22" versionCode 386 versionName "3.0.0-beta-23" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions "default" Loading Loading @@ -71,13 +71,14 @@ allprojects { dependencies { implementation project(':autoimageslider') implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "com.google.code.gson:gson:2.8.6" implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.preference:preference:1.2.0' implementation "org.conscrypt:conscrypt-android:2.5.2" implementation 'com.github.evozi:Cyanea:1.0.7' implementation 'com.vanniktech:emoji-one:0.6.0' implementation 'com.github.GrenderG:Toasty:1.5.2' Loading Loading @@ -118,8 +119,8 @@ dependencies { implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' implementation 'androidx.lifecycle:lifecycle-livedata:2.4.1' implementation 'androidx.lifecycle:lifecycle-viewmodel:2.4.1' implementation 'androidx.navigation:navigation-fragment:2.4.1' implementation 'androidx.navigation:navigation-ui:2.4.1' implementation 'androidx.navigation:navigation-fragment:2.4.2' implementation 'androidx.navigation:navigation-ui:2.4.2' testImplementation 'junit:junit:' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' Loading app/src/main/java/app/fedilab/android/activities/ContextActivity.java +29 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ package app.fedilab.android.activities; * see <http://www.gnu.org/licenses>. */ import static app.fedilab.android.ui.drawer.StatusAdapter.sendAction; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; Loading @@ -28,17 +30,22 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.preference.PreferenceManager; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.client.entities.api.Status; import app.fedilab.android.client.entities.app.QuickLoad; import app.fedilab.android.client.entities.app.StatusCache; import app.fedilab.android.databinding.ActivityConversationBinding; import app.fedilab.android.exception.DBException; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastodonHelper; import app.fedilab.android.helper.SpannableHelper; import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonContext; import app.fedilab.android.viewmodel.mastodon.StatusesVM; public class ContextActivity extends BaseActivity { Loading Loading @@ -91,6 +98,28 @@ public class ContextActivity extends BaseActivity { }; mainHandler.post(myRunnable); }).start(); StatusesVM timelinesVM = new ViewModelProvider(ContextActivity.this).get(StatusesVM.class); timelinesVM.getStatus(MainActivity.currentInstance, MainActivity.currentToken, focusedStatus.id).observe(ContextActivity.this, status -> { StatusCache statusCache = new StatusCache(); statusCache.instance = MainActivity.currentInstance; statusCache.user_id = MainActivity.currentUserID; statusCache.status = status; statusCache.status_id = status.id; //Update cache new Thread(() -> { try { new StatusCache(getApplication()).updateIfExists(statusCache); new QuickLoad(getApplication().getApplicationContext()).updateStatus(MainActivity.accountWeakReference.get(), status); Handler mainHandler = new Handler(Looper.getMainLooper()); //Update UI Runnable myRunnable = () -> sendAction(ContextActivity.this, Helper.ARG_STATUS_ACTION, status, null); mainHandler.post(myRunnable); } catch (DBException e) { e.printStackTrace(); } }).start(); }); } Loading app/src/main/java/app/fedilab/android/activities/LoginActivity.java +16 −18 Original line number Diff line number Diff line Loading @@ -14,16 +14,13 @@ package app.fedilab.android.activities; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see <http://www.gnu.org/licenses>. */ import static app.fedilab.android.BaseMainActivity.api; import static app.fedilab.android.BaseMainActivity.client_id; import static app.fedilab.android.BaseMainActivity.client_secret; import static app.fedilab.android.BaseMainActivity.currentInstance; import static app.fedilab.android.BaseMainActivity.software; import static app.fedilab.android.helper.MastodonHelper.REDIRECT_CONTENT_WEB; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.FrameLayout; Loading @@ -36,7 +33,6 @@ import org.jetbrains.annotations.NotNull; import java.util.regex.Matcher; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.client.entities.app.Account; import app.fedilab.android.helper.Helper; Loading @@ -53,7 +49,8 @@ public class LoginActivity extends BaseActivity { private final int PICK_IMPORT = 5557; private boolean requestedAdmin; public static Account.API apiLogin; public static String currentInstanceLogin, client_idLogin, client_secretLogin, softwareLogin; private void manageItent(Intent intent) { if (intent != null && intent.getData() != null && intent.getData().toString().contains(REDIRECT_CONTENT_WEB + "?code=")) { Loading @@ -65,22 +62,24 @@ public class LoginActivity extends BaseActivity { } String code = matcher.group(1); OauthVM oauthVM = new ViewModelProvider(LoginActivity.this).get(OauthVM.class); Log.v(Helper.TAG, "finalInstance: " + currentInstanceLogin); //We are dealing with a Mastodon API if (api == Account.API.MASTODON) { if (apiLogin == Account.API.MASTODON) { //API call to get the user token String scope = requestedAdmin ? Helper.OAUTH_SCOPES_ADMIN : Helper.OAUTH_SCOPES; oauthVM.createToken(currentInstance, "authorization_code", client_id, client_secret, Helper.REDIRECT_CONTENT_WEB, scope, code) oauthVM.createToken(currentInstanceLogin, "authorization_code", client_idLogin, client_secretLogin, Helper.REDIRECT_CONTENT_WEB, scope, code) .observe(LoginActivity.this, tokenObj -> { Account account = new Account(); account.client_id = BaseMainActivity.client_id; account.client_secret = BaseMainActivity.client_secret; account.client_id = client_idLogin; account.client_secret = client_secretLogin; account.token = tokenObj.token_type + " " + tokenObj.access_token; account.api = api; account.software = software; account.instance = currentInstance; account.api = apiLogin; account.software = softwareLogin; account.instance = currentInstanceLogin; //API call to retrieve account information for the new token AccountsVM accountsVM = new ViewModelProvider(LoginActivity.this).get(AccountsVM.class); accountsVM.getConnectedAccount(currentInstance, account.token).observe(LoginActivity.this, mastodonAccount -> { accountsVM.getConnectedAccount(currentInstanceLogin, account.token).observe(LoginActivity.this, mastodonAccount -> { account.mastodon_account = mastodonAccount; account.user_id = mastodonAccount.id; //We check if user have really moderator rights Loading Loading @@ -112,8 +111,8 @@ public class LoginActivity extends BaseActivity { ThemeHelper.applyTheme(this); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(LoginActivity.this); setContentView(new FrameLayout(this)); Helper.addFragment(getSupportFragmentManager(), android.R.id.content, new FragmentLoginMain(), null, null, null); FragmentLoginMain fragmentLoginMain = new FragmentLoginMain(); Helper.addFragment(getSupportFragmentManager(), android.R.id.content, fragmentLoginMain, null, null, null); requestedAdmin = false; //The activity handles a redirect URI, it will extract token code and will proceed to authentication //That happens when the user wants to use an external browser Loading Loading @@ -185,5 +184,4 @@ public class LoginActivity extends BaseActivity { } } } No newline at end of file app/src/main/java/app/fedilab/android/activities/WebviewConnectActivity.java +15 −15 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ package app.fedilab.android.activities; import static app.fedilab.android.BaseMainActivity.api; import static app.fedilab.android.BaseMainActivity.currentInstance; import static app.fedilab.android.BaseMainActivity.software; import static app.fedilab.android.activities.LoginActivity.apiLogin; import static app.fedilab.android.activities.LoginActivity.client_idLogin; import static app.fedilab.android.activities.LoginActivity.client_secretLogin; import static app.fedilab.android.activities.LoginActivity.currentInstanceLogin; import static app.fedilab.android.activities.LoginActivity.softwareLogin; import static app.fedilab.android.helper.Helper.PREF_USER_TOKEN; import android.annotation.SuppressLint; Loading Loading @@ -52,7 +54,6 @@ import androidx.preference.PreferenceManager; import java.util.regex.Matcher; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.client.entities.app.Account; import app.fedilab.android.databinding.ActivityWebviewConnectBinding; Loading Loading @@ -96,9 +97,9 @@ public class WebviewConnectActivity extends BaseActivity { //update the database new Account(activity).insertOrUpdate(account); Handler mainHandler = new Handler(Looper.getMainLooper()); BaseMainActivity.currentToken = account.token; BaseMainActivity.currentUserID = account.user_id; api = Account.API.MASTODON; MainActivity.currentToken = account.token; MainActivity.currentUserID = account.user_id; MainActivity.api = Account.API.MASTODON; SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity); SharedPreferences.Editor editor = sharedpreferences.edit(); editor.putString(PREF_USER_TOKEN, account.token); Loading Loading @@ -130,7 +131,6 @@ public class WebviewConnectActivity extends BaseActivity { if (b != null) { login_url = b.getString("login_url"); requestedAdmin = b.getBoolean("requestedAdmin", false); } if (login_url == null) finish(); Loading Loading @@ -223,18 +223,18 @@ public class WebviewConnectActivity extends BaseActivity { OauthVM oauthVM = new ViewModelProvider(WebviewConnectActivity.this).get(OauthVM.class); //API call to get the user token String scope = requestedAdmin ? Helper.OAUTH_SCOPES_ADMIN : Helper.OAUTH_SCOPES; oauthVM.createToken(currentInstance, "authorization_code", BaseMainActivity.client_id, BaseMainActivity.client_secret, Helper.REDIRECT_CONTENT_WEB, scope, code) oauthVM.createToken(currentInstanceLogin, "authorization_code", client_idLogin, client_secretLogin, Helper.REDIRECT_CONTENT_WEB, scope, code) .observe(WebviewConnectActivity.this, tokenObj -> { Account account = new Account(); account.client_id = BaseMainActivity.client_id; account.client_secret = BaseMainActivity.client_secret; account.client_id = client_idLogin; account.client_secret = client_secretLogin; account.token = tokenObj.token_type + " " + tokenObj.access_token; account.api = api; account.software = software; account.instance = currentInstance; account.api = apiLogin; account.software = softwareLogin; account.instance = currentInstanceLogin; //API call to retrieve account information for the new token AccountsVM accountsVM = new ViewModelProvider(WebviewConnectActivity.this).get(AccountsVM.class); accountsVM.getConnectedAccount(currentInstance, account.token).observe(WebviewConnectActivity.this, mastodonAccount -> { accountsVM.getConnectedAccount(currentInstanceLogin, account.token).observe(WebviewConnectActivity.this, mastodonAccount -> { account.mastodon_account = mastodonAccount; account.user_id = mastodonAccount.id; //We check if user have really moderator rights Loading app/src/main/java/app/fedilab/android/client/entities/app/QuickLoad.java +74 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,80 @@ public class QuickLoad { } } /** * Update a status in quickload * * @param account {@link Account} * @param newStatus - Status * @throws DBException exception with database */ public void updateStatus(Account account, Status newStatus) throws DBException { if (db == null) { throw new DBException("db is null. Wrong initialization."); } QuickLoad homeQuickLoad = getSavedValue(account, Timeline.TimeLineEnum.HOME, null); QuickLoad localQuickLoad = getSavedValue(account, Timeline.TimeLineEnum.LOCAL, null); QuickLoad publicQuickLoad = getSavedValue(account, Timeline.TimeLineEnum.PUBLIC, null); if (homeQuickLoad != null && homeQuickLoad.statuses != null) { for (int i = 0; i < homeQuickLoad.statuses.size(); i++) { if (homeQuickLoad.statuses.get(i).id.equals(newStatus.id)) { homeQuickLoad.statuses.set(i, newStatus); break; } } ContentValues valuesHome = new ContentValues(); valuesHome.put(Sqlite.COL_STATUSES, StatusDraft.mastodonStatusListToStringStorage(homeQuickLoad.statuses)); //Inserts token try { db.update(Sqlite.TABLE_QUICK_LOAD, valuesHome, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =? AND " + Sqlite.COL_SLUG + "=?", new String[]{homeQuickLoad.user_id, homeQuickLoad.instance, homeQuickLoad.slug}); } catch (Exception e) { e.printStackTrace(); } } if (localQuickLoad != null && localQuickLoad.statuses != null) { for (int i = 0; i < localQuickLoad.statuses.size(); i++) { if (localQuickLoad.statuses.get(i).id.equals(newStatus.id)) { localQuickLoad.statuses.set(i, newStatus); break; } } ContentValues valuesLocal = new ContentValues(); valuesLocal.put(Sqlite.COL_STATUSES, StatusDraft.mastodonStatusListToStringStorage(localQuickLoad.statuses)); //Inserts token try { db.update(Sqlite.TABLE_QUICK_LOAD, valuesLocal, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =? AND " + Sqlite.COL_SLUG + "=?", new String[]{localQuickLoad.user_id, localQuickLoad.instance, localQuickLoad.slug}); } catch (Exception e) { e.printStackTrace(); } } if (publicQuickLoad != null && publicQuickLoad.statuses != null) { for (int i = 0; i < publicQuickLoad.statuses.size(); i++) { if (publicQuickLoad.statuses.get(i).id.equals(newStatus.id)) { publicQuickLoad.statuses.set(i, newStatus); break; } } ContentValues valuesPublic = new ContentValues(); valuesPublic.put(Sqlite.COL_STATUSES, StatusDraft.mastodonStatusListToStringStorage(publicQuickLoad.statuses)); //Inserts token try { db.update(Sqlite.TABLE_QUICK_LOAD, valuesPublic, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =? AND " + Sqlite.COL_SLUG + "=?", new String[]{publicQuickLoad.user_id, publicQuickLoad.instance, publicQuickLoad.slug}); } catch (Exception e) { e.printStackTrace(); } } } /** * Delete a status in quickload * Loading Loading
app/build.gradle +7 −6 Original line number Diff line number Diff line Loading @@ -9,8 +9,8 @@ android { defaultConfig { minSdk 21 targetSdk 31 versionCode 385 versionName "3.0.0-beta-22" versionCode 386 versionName "3.0.0-beta-23" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions "default" Loading Loading @@ -71,13 +71,14 @@ allprojects { dependencies { implementation project(':autoimageslider') implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "com.google.code.gson:gson:2.8.6" implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' implementation 'androidx.preference:preference:1.2.0' implementation "org.conscrypt:conscrypt-android:2.5.2" implementation 'com.github.evozi:Cyanea:1.0.7' implementation 'com.vanniktech:emoji-one:0.6.0' implementation 'com.github.GrenderG:Toasty:1.5.2' Loading Loading @@ -118,8 +119,8 @@ dependencies { implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' implementation 'androidx.lifecycle:lifecycle-livedata:2.4.1' implementation 'androidx.lifecycle:lifecycle-viewmodel:2.4.1' implementation 'androidx.navigation:navigation-fragment:2.4.1' implementation 'androidx.navigation:navigation-ui:2.4.1' implementation 'androidx.navigation:navigation-fragment:2.4.2' implementation 'androidx.navigation:navigation-ui:2.4.2' testImplementation 'junit:junit:' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' Loading
app/src/main/java/app/fedilab/android/activities/ContextActivity.java +29 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,8 @@ package app.fedilab.android.activities; * see <http://www.gnu.org/licenses>. */ import static app.fedilab.android.ui.drawer.StatusAdapter.sendAction; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; Loading @@ -28,17 +30,22 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.preference.PreferenceManager; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.client.entities.api.Status; import app.fedilab.android.client.entities.app.QuickLoad; import app.fedilab.android.client.entities.app.StatusCache; import app.fedilab.android.databinding.ActivityConversationBinding; import app.fedilab.android.exception.DBException; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastodonHelper; import app.fedilab.android.helper.SpannableHelper; import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonContext; import app.fedilab.android.viewmodel.mastodon.StatusesVM; public class ContextActivity extends BaseActivity { Loading Loading @@ -91,6 +98,28 @@ public class ContextActivity extends BaseActivity { }; mainHandler.post(myRunnable); }).start(); StatusesVM timelinesVM = new ViewModelProvider(ContextActivity.this).get(StatusesVM.class); timelinesVM.getStatus(MainActivity.currentInstance, MainActivity.currentToken, focusedStatus.id).observe(ContextActivity.this, status -> { StatusCache statusCache = new StatusCache(); statusCache.instance = MainActivity.currentInstance; statusCache.user_id = MainActivity.currentUserID; statusCache.status = status; statusCache.status_id = status.id; //Update cache new Thread(() -> { try { new StatusCache(getApplication()).updateIfExists(statusCache); new QuickLoad(getApplication().getApplicationContext()).updateStatus(MainActivity.accountWeakReference.get(), status); Handler mainHandler = new Handler(Looper.getMainLooper()); //Update UI Runnable myRunnable = () -> sendAction(ContextActivity.this, Helper.ARG_STATUS_ACTION, status, null); mainHandler.post(myRunnable); } catch (DBException e) { e.printStackTrace(); } }).start(); }); } Loading
app/src/main/java/app/fedilab/android/activities/LoginActivity.java +16 −18 Original line number Diff line number Diff line Loading @@ -14,16 +14,13 @@ package app.fedilab.android.activities; * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see <http://www.gnu.org/licenses>. */ import static app.fedilab.android.BaseMainActivity.api; import static app.fedilab.android.BaseMainActivity.client_id; import static app.fedilab.android.BaseMainActivity.client_secret; import static app.fedilab.android.BaseMainActivity.currentInstance; import static app.fedilab.android.BaseMainActivity.software; import static app.fedilab.android.helper.MastodonHelper.REDIRECT_CONTENT_WEB; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.FrameLayout; Loading @@ -36,7 +33,6 @@ import org.jetbrains.annotations.NotNull; import java.util.regex.Matcher; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.client.entities.app.Account; import app.fedilab.android.helper.Helper; Loading @@ -53,7 +49,8 @@ public class LoginActivity extends BaseActivity { private final int PICK_IMPORT = 5557; private boolean requestedAdmin; public static Account.API apiLogin; public static String currentInstanceLogin, client_idLogin, client_secretLogin, softwareLogin; private void manageItent(Intent intent) { if (intent != null && intent.getData() != null && intent.getData().toString().contains(REDIRECT_CONTENT_WEB + "?code=")) { Loading @@ -65,22 +62,24 @@ public class LoginActivity extends BaseActivity { } String code = matcher.group(1); OauthVM oauthVM = new ViewModelProvider(LoginActivity.this).get(OauthVM.class); Log.v(Helper.TAG, "finalInstance: " + currentInstanceLogin); //We are dealing with a Mastodon API if (api == Account.API.MASTODON) { if (apiLogin == Account.API.MASTODON) { //API call to get the user token String scope = requestedAdmin ? Helper.OAUTH_SCOPES_ADMIN : Helper.OAUTH_SCOPES; oauthVM.createToken(currentInstance, "authorization_code", client_id, client_secret, Helper.REDIRECT_CONTENT_WEB, scope, code) oauthVM.createToken(currentInstanceLogin, "authorization_code", client_idLogin, client_secretLogin, Helper.REDIRECT_CONTENT_WEB, scope, code) .observe(LoginActivity.this, tokenObj -> { Account account = new Account(); account.client_id = BaseMainActivity.client_id; account.client_secret = BaseMainActivity.client_secret; account.client_id = client_idLogin; account.client_secret = client_secretLogin; account.token = tokenObj.token_type + " " + tokenObj.access_token; account.api = api; account.software = software; account.instance = currentInstance; account.api = apiLogin; account.software = softwareLogin; account.instance = currentInstanceLogin; //API call to retrieve account information for the new token AccountsVM accountsVM = new ViewModelProvider(LoginActivity.this).get(AccountsVM.class); accountsVM.getConnectedAccount(currentInstance, account.token).observe(LoginActivity.this, mastodonAccount -> { accountsVM.getConnectedAccount(currentInstanceLogin, account.token).observe(LoginActivity.this, mastodonAccount -> { account.mastodon_account = mastodonAccount; account.user_id = mastodonAccount.id; //We check if user have really moderator rights Loading Loading @@ -112,8 +111,8 @@ public class LoginActivity extends BaseActivity { ThemeHelper.applyTheme(this); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(LoginActivity.this); setContentView(new FrameLayout(this)); Helper.addFragment(getSupportFragmentManager(), android.R.id.content, new FragmentLoginMain(), null, null, null); FragmentLoginMain fragmentLoginMain = new FragmentLoginMain(); Helper.addFragment(getSupportFragmentManager(), android.R.id.content, fragmentLoginMain, null, null, null); requestedAdmin = false; //The activity handles a redirect URI, it will extract token code and will proceed to authentication //That happens when the user wants to use an external browser Loading Loading @@ -185,5 +184,4 @@ public class LoginActivity extends BaseActivity { } } } No newline at end of file
app/src/main/java/app/fedilab/android/activities/WebviewConnectActivity.java +15 −15 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ package app.fedilab.android.activities; import static app.fedilab.android.BaseMainActivity.api; import static app.fedilab.android.BaseMainActivity.currentInstance; import static app.fedilab.android.BaseMainActivity.software; import static app.fedilab.android.activities.LoginActivity.apiLogin; import static app.fedilab.android.activities.LoginActivity.client_idLogin; import static app.fedilab.android.activities.LoginActivity.client_secretLogin; import static app.fedilab.android.activities.LoginActivity.currentInstanceLogin; import static app.fedilab.android.activities.LoginActivity.softwareLogin; import static app.fedilab.android.helper.Helper.PREF_USER_TOKEN; import android.annotation.SuppressLint; Loading Loading @@ -52,7 +54,6 @@ import androidx.preference.PreferenceManager; import java.util.regex.Matcher; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.client.entities.app.Account; import app.fedilab.android.databinding.ActivityWebviewConnectBinding; Loading Loading @@ -96,9 +97,9 @@ public class WebviewConnectActivity extends BaseActivity { //update the database new Account(activity).insertOrUpdate(account); Handler mainHandler = new Handler(Looper.getMainLooper()); BaseMainActivity.currentToken = account.token; BaseMainActivity.currentUserID = account.user_id; api = Account.API.MASTODON; MainActivity.currentToken = account.token; MainActivity.currentUserID = account.user_id; MainActivity.api = Account.API.MASTODON; SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity); SharedPreferences.Editor editor = sharedpreferences.edit(); editor.putString(PREF_USER_TOKEN, account.token); Loading Loading @@ -130,7 +131,6 @@ public class WebviewConnectActivity extends BaseActivity { if (b != null) { login_url = b.getString("login_url"); requestedAdmin = b.getBoolean("requestedAdmin", false); } if (login_url == null) finish(); Loading Loading @@ -223,18 +223,18 @@ public class WebviewConnectActivity extends BaseActivity { OauthVM oauthVM = new ViewModelProvider(WebviewConnectActivity.this).get(OauthVM.class); //API call to get the user token String scope = requestedAdmin ? Helper.OAUTH_SCOPES_ADMIN : Helper.OAUTH_SCOPES; oauthVM.createToken(currentInstance, "authorization_code", BaseMainActivity.client_id, BaseMainActivity.client_secret, Helper.REDIRECT_CONTENT_WEB, scope, code) oauthVM.createToken(currentInstanceLogin, "authorization_code", client_idLogin, client_secretLogin, Helper.REDIRECT_CONTENT_WEB, scope, code) .observe(WebviewConnectActivity.this, tokenObj -> { Account account = new Account(); account.client_id = BaseMainActivity.client_id; account.client_secret = BaseMainActivity.client_secret; account.client_id = client_idLogin; account.client_secret = client_secretLogin; account.token = tokenObj.token_type + " " + tokenObj.access_token; account.api = api; account.software = software; account.instance = currentInstance; account.api = apiLogin; account.software = softwareLogin; account.instance = currentInstanceLogin; //API call to retrieve account information for the new token AccountsVM accountsVM = new ViewModelProvider(WebviewConnectActivity.this).get(AccountsVM.class); accountsVM.getConnectedAccount(currentInstance, account.token).observe(WebviewConnectActivity.this, mastodonAccount -> { accountsVM.getConnectedAccount(currentInstanceLogin, account.token).observe(WebviewConnectActivity.this, mastodonAccount -> { account.mastodon_account = mastodonAccount; account.user_id = mastodonAccount.id; //We check if user have really moderator rights Loading
app/src/main/java/app/fedilab/android/client/entities/app/QuickLoad.java +74 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,80 @@ public class QuickLoad { } } /** * Update a status in quickload * * @param account {@link Account} * @param newStatus - Status * @throws DBException exception with database */ public void updateStatus(Account account, Status newStatus) throws DBException { if (db == null) { throw new DBException("db is null. Wrong initialization."); } QuickLoad homeQuickLoad = getSavedValue(account, Timeline.TimeLineEnum.HOME, null); QuickLoad localQuickLoad = getSavedValue(account, Timeline.TimeLineEnum.LOCAL, null); QuickLoad publicQuickLoad = getSavedValue(account, Timeline.TimeLineEnum.PUBLIC, null); if (homeQuickLoad != null && homeQuickLoad.statuses != null) { for (int i = 0; i < homeQuickLoad.statuses.size(); i++) { if (homeQuickLoad.statuses.get(i).id.equals(newStatus.id)) { homeQuickLoad.statuses.set(i, newStatus); break; } } ContentValues valuesHome = new ContentValues(); valuesHome.put(Sqlite.COL_STATUSES, StatusDraft.mastodonStatusListToStringStorage(homeQuickLoad.statuses)); //Inserts token try { db.update(Sqlite.TABLE_QUICK_LOAD, valuesHome, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =? AND " + Sqlite.COL_SLUG + "=?", new String[]{homeQuickLoad.user_id, homeQuickLoad.instance, homeQuickLoad.slug}); } catch (Exception e) { e.printStackTrace(); } } if (localQuickLoad != null && localQuickLoad.statuses != null) { for (int i = 0; i < localQuickLoad.statuses.size(); i++) { if (localQuickLoad.statuses.get(i).id.equals(newStatus.id)) { localQuickLoad.statuses.set(i, newStatus); break; } } ContentValues valuesLocal = new ContentValues(); valuesLocal.put(Sqlite.COL_STATUSES, StatusDraft.mastodonStatusListToStringStorage(localQuickLoad.statuses)); //Inserts token try { db.update(Sqlite.TABLE_QUICK_LOAD, valuesLocal, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =? AND " + Sqlite.COL_SLUG + "=?", new String[]{localQuickLoad.user_id, localQuickLoad.instance, localQuickLoad.slug}); } catch (Exception e) { e.printStackTrace(); } } if (publicQuickLoad != null && publicQuickLoad.statuses != null) { for (int i = 0; i < publicQuickLoad.statuses.size(); i++) { if (publicQuickLoad.statuses.get(i).id.equals(newStatus.id)) { publicQuickLoad.statuses.set(i, newStatus); break; } } ContentValues valuesPublic = new ContentValues(); valuesPublic.put(Sqlite.COL_STATUSES, StatusDraft.mastodonStatusListToStringStorage(publicQuickLoad.statuses)); //Inserts token try { db.update(Sqlite.TABLE_QUICK_LOAD, valuesPublic, Sqlite.COL_USER_ID + " = ? AND " + Sqlite.COL_INSTANCE + " =? AND " + Sqlite.COL_SLUG + "=?", new String[]{publicQuickLoad.user_id, publicQuickLoad.instance, publicQuickLoad.slug}); } catch (Exception e) { e.printStackTrace(); } } } /** * Delete a status in quickload * Loading