Allow to login with a token

This commit is contained in:
Thomas 2025-03-04 17:05:33 +01:00
parent 020be16f11
commit f8ebd3435d
6 changed files with 109 additions and 9 deletions

View file

@ -100,8 +100,10 @@ public class PushHelper {
WorkManager.getInstance(context).cancelAllWorkByTag(Helper.WORKER_REFRESH_NOTIFICATION);
new Thread(() -> {
List<BaseAccount> accounts = new Account(context).getPushNotificationAccounts();
for (BaseAccount account : accounts) {
((Activity) context).runOnUiThread(() -> UnifiedPush.unregister(context, account.user_id + "@" + account.instance));
if(accounts != null) {
for (BaseAccount account : accounts) {
((Activity) context).runOnUiThread(() -> UnifiedPush.unregister(context, account.user_id + "@" + account.instance));
}
}
}).start();
break;

View file

@ -184,7 +184,7 @@ public class LoginActivity extends BaseBarActivity {
@SuppressLint("ApplySharedPref")
private void proceedLogin(Token token, String host) {
public void proceedLogin(Token token, String host) {
runOnUiThread(() -> {
if (token != null) {
//Update the account with the token;

View file

@ -22,6 +22,7 @@ import static app.fedilab.android.activities.LoginActivity.client_secretLogin;
import static app.fedilab.android.activities.LoginActivity.currentInstanceLogin;
import static app.fedilab.android.activities.LoginActivity.requestedAdmin;
import static app.fedilab.android.activities.LoginActivity.softwareLogin;
import static app.fedilab.android.mastodon.helper.Helper.TAG;
import android.Manifest;
import android.content.Intent;
@ -57,6 +58,7 @@ import java.net.URL;
import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.BuildConfig;
import app.fedilab.android.R;
import app.fedilab.android.activities.LoginActivity;
import app.fedilab.android.databinding.FragmentLoginMainBinding;
import app.fedilab.android.mastodon.activities.ProxyActivity;
import app.fedilab.android.mastodon.client.entities.app.Account;
@ -65,10 +67,12 @@ import app.fedilab.android.mastodon.helper.Helper;
import app.fedilab.android.mastodon.helper.MastodonHelper;
import app.fedilab.android.mastodon.helper.ThemeHelper;
import app.fedilab.android.mastodon.helper.ZipHelper;
import app.fedilab.android.mastodon.viewmodel.mastodon.AccountsVM;
import app.fedilab.android.mastodon.viewmodel.mastodon.AdminVM;
import app.fedilab.android.mastodon.viewmodel.mastodon.AppsVM;
import app.fedilab.android.mastodon.viewmodel.mastodon.InstanceSocialVM;
import app.fedilab.android.mastodon.viewmodel.mastodon.NodeInfoVM;
import app.fedilab.android.peertube.activities.LoginActivity;
import app.fedilab.android.peertube.client.entities.Token;
import es.dmoral.toasty.Toasty;
public class FragmentLoginMain extends Fragment {
@ -80,6 +84,15 @@ public class FragmentLoginMain extends Fragment {
private String oldSearch;
private ActivityResultLauncher<String> permissionLauncher;
public void setUseAToken(boolean useAToken){
if(useAToken){
} else {
}
}
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
@ -168,8 +181,22 @@ public class FragmentLoginMain extends Fragment {
if (currentInstanceLogin.isEmpty()) {
return;
}
binding.continueButton.setEnabled(false);
String customToken;
if(binding.loginTokenLayout.getVisibility() == View.VISIBLE) {
if (binding.loginToken.getText() == null || binding.loginToken.getText().toString().isEmpty()) {
binding.loginTokenLayout.setError(getString(R.string.toast_error_token_empty));
binding.loginTokenLayout.setErrorEnabled(true);
return;
}
customToken = binding.loginToken.getText().toString();
} else {
customToken = null;
}
NodeInfoVM nodeInfoVM = new ViewModelProvider(requireActivity()).get(NodeInfoVM.class);
binding.continueButton.setEnabled(false);
String instance = binding.loginInstance.getText().toString().trim();
nodeInfoVM.getNodeInfo(instance).observe(requireActivity(), nodeInfo -> {
if (nodeInfo != null) {
@ -198,6 +225,40 @@ public class FragmentLoginMain extends Fragment {
softwareLogin = "MASTODON";
}
if(customToken != null) {
Account account = new Account();
account.token = "Bearer " + customToken;
Token token = new Token();
token.setAccess_token(customToken);
token.setToken_type("Bearer");
account.client_id = "";
account.client_secret = "";
account.api = apiLogin;
account.software = softwareLogin;
account.instance = currentInstanceLogin;
AccountsVM accountsVM = new ViewModelProvider(requireActivity()).get(AccountsVM.class);
accountsVM.getConnectedAccount(currentInstanceLogin, account.token).observe(requireActivity(), mastodonAccount -> {
if (mastodonAccount != null) {
account.mastodon_account = mastodonAccount;
account.user_id = mastodonAccount.id;
//We check if user have really moderator rights
if (requestedAdmin) {
AdminVM adminVM = new ViewModelProvider(requireActivity()).get(AdminVM.class);
adminVM.getAccount(account.instance, account.token, account.user_id).observe(requireActivity(), adminAccount -> {
account.admin = adminAccount != null;
((LoginActivity)requireActivity()).proceedLogin(requireActivity(), account);
});
} else {
((LoginActivity)requireActivity()).proceedLogin(requireActivity(), account);
}
} else {
Toasty.error(requireActivity(), getString(R.string.toast_fail_authenticate), Toast.LENGTH_LONG).show();
}
});
return;
}
binding.continueButton.setEnabled(true);
if (apiLogin != Account.API.PEERTUBE) {
retrievesClientId(currentInstanceLogin);
@ -243,7 +304,11 @@ public class FragmentLoginMain extends Fragment {
return false;
}
});
} else if (itemId == R.id.action_import_data) {
} else if(itemId == R.id.action_use_token) {
item.setChecked(!item.isChecked());
binding.loginTokenLayout.setVisibility(item.isChecked()?View.VISIBLE:View.GONE);
}else if (itemId == R.id.action_import_data) {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
permissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
} else {

View file

@ -18,6 +18,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:background="?android:windowBackground">
<androidx.appcompat.widget.AppCompatImageButton
@ -35,7 +36,7 @@
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
app:errorEnabled="true"
app:layout_constraintBottom_toTopOf="@id/continue_button"
app:layout_constraintBottom_toTopOf="@id/login_token_layout"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed">
@ -51,6 +52,30 @@
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:visibility="gone"
tools:visibility="visible"
android:id="@+id/login_token_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="24dp"
app:errorEnabled="true"
app:layout_constraintBottom_toTopOf="@id/continue_button"
app:layout_constraintTop_toBottomOf="@+id/login_instance_layout"
app:layout_constraintVertical_chainStyle="packed">
<com.google.android.material.textfield.MaterialAutoCompleteTextView
android:id="@+id/login_token"
style="@style/Widget.Material3.TextInputEditText.FilledBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/instance_token"
android:imeOptions="actionDone"
android:inputType="text"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/continue_button"
android:layout_width="wrap_content"
@ -60,7 +85,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/login_instance_layout" />
app:layout_constraintTop_toBottomOf="@id/login_token_layout" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/no_account_q"

View file

@ -11,7 +11,11 @@
android:checkable="true"
android:title="@string/admin_scope"
app:actionViewClass="android.widget.CheckBox" />
<item
android:id="@+id/action_use_token"
android:checkable="true"
android:title="@string/use_token"
app:actionViewClass="android.widget.CheckBox" />
<item
android:id="@+id/action_import_data"
android:title="@string/import_data"

View file

@ -23,6 +23,7 @@
<string name="save">Save</string>
<string name="instance">Instance</string>
<string name="instance_example">Instance: mastodon.social</string>
<string name="instance_token">Your token</string>
<string name="toast_account_changed" formatted="false">Now works with the account %1$s</string>
<string name="add_account">Add an account</string>
<string name="clipboard">The content of the message has been copied to the clipboard</string>
@ -200,6 +201,7 @@
<string name="toast_error_internet">There is no Internet connection!</string>
<string name="toast_code_error">An error occurred! The instance did not return an authorisation code!</string>
<string name="toast_error_instance">The instance domain does not seem to be valid!</string>
<string name="toast_error_token_empty">The token cannot be empty!</string>
<string name="toast_error_loading_account">An error occurred while switching between accounts!</string>
<string name="toast_error_search">An error occurred while searching!</string>
<string name="nothing_to_do">No action can be taken</string>
@ -1273,6 +1275,7 @@
<string name="also_favourite_by">"Also favourited by: "</string>
<string name="also_boosted_by">Also boosted by:</string>
<string name="admin_scope">I am a moderator</string>
<string name="use_token">Use a token</string>
<string name="last_active">Last active</string>
<string name="location">Location</string>
<string name="staff">Staff</string>
@ -1308,6 +1311,7 @@
<string name="set_your_max_char_count">Set your max char count</string>
<string name="release_notes">Release notes</string>
<string name="toast_token">The app failed to get a token</string>
<string name="toast_fail_authenticate">The app failed to authenticate the account!</string>
<string name="media_cannot_be_uploaded">Media cannot be uploaded!</string>
<string name="open_draft">Open draft</string>
<string name="set_push_notifications_delay">Set the delay between each new fetch</string>