Commit e776ea99 authored by Thomas's avatar Thomas
Browse files

Some fixes

parent f3720c56
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -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"
@@ -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'
@@ -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'
+29 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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 {

@@ -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();

        });
    }


+16 −18
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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=")) {
@@ -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
@@ -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
@@ -185,5 +184,4 @@ public class LoginActivity extends BaseActivity {
        }
    }


}
 No newline at end of file
+15 −15
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
@@ -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();
@@ -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
+74 −0
Original line number Diff line number Diff line
@@ -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