diff --git a/app/build.gradle b/app/build.gradle
index e7ca274c..ffbfa920 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,8 +9,8 @@ android {
defaultConfig {
minSdk 21
targetSdk 31
- versionCode 1
- versionName "1.0"
+ versionCode 13
+ versionName "beta-13"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2194018b..7e8520fb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -98,7 +98,11 @@
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/reorder_timelines"
android:theme="@style/AppThemeBar" />
-
+
. */
+
+
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.view.MenuItem;
+import android.view.View;
+
+import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.content.ContextCompat;
+import androidx.lifecycle.ViewModelProvider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import app.fedilab.android.BuildConfig;
+import app.fedilab.android.R;
+import app.fedilab.android.client.entities.api.Account;
+import app.fedilab.android.client.entities.api.Status;
+import app.fedilab.android.databinding.ActivityAboutBinding;
+import app.fedilab.android.helper.CrossActionHelper;
+import app.fedilab.android.helper.Helper;
+import app.fedilab.android.helper.MastodonHelper;
+import app.fedilab.android.helper.ThemeHelper;
+import app.fedilab.android.viewmodel.mastodon.AccountsVM;
+
+
+public class AboutActivity extends BaseActivity {
+
+
+ private ActivityAboutBinding binding;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ThemeHelper.applyThemeBar(this);
+ binding = ActivityAboutBinding.inflate(getLayoutInflater());
+ setContentView(binding.getRoot());
+
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.cyanea_primary)));
+ }
+
+ try {
+ PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
+ String version = pInfo.versionName;
+ binding.aboutVersion.setText(getResources().getString(R.string.about_vesrion, version));
+ } catch (PackageManager.NameNotFoundException ignored) {
+ }
+
+ binding.aboutCode.setOnClickListener(v -> Helper.openBrowser(AboutActivity.this, "https://codeberg.org/tom79/Fedilab"));
+ binding.aboutThekinrar.setOnClickListener(v -> Helper.openBrowser(AboutActivity.this, "https://instances.social/"));
+ binding.aboutLicense.setOnClickListener(v -> Helper.openBrowser(AboutActivity.this, "https://www.gnu.org/licenses/quick-guide-gplv3.fr.html"));
+ binding.aboutSupport.setOnClickListener(v -> Helper.openBrowser(AboutActivity.this, "https://liberapay.com/tom79"));
+ if (BuildConfig.DONATIONS) {
+ binding.aboutSupport.setVisibility(View.VISIBLE);
+ } else {
+ binding.aboutSupport.setVisibility(View.GONE);
+ }
+ binding.aboutSupportPaypal.setOnClickListener(v -> Helper.openBrowser(AboutActivity.this, "https://www.paypal.me/Mastalab"));
+
+
+ if (BuildConfig.DONATIONS) {
+ binding.aboutSupportPaypal.setVisibility(View.VISIBLE);
+ } else {
+ binding.aboutSupportPaypal.setVisibility(View.GONE);
+ }
+ binding.aboutWebsite.setOnClickListener(v -> Helper.openBrowser(AboutActivity.this, "https://fedilab.app"));
+ CrossActionHelper.fetchRemoteAccount(AboutActivity.this, "@apps@toot.fedilab.app", new CrossActionHelper.Callback() {
+ @Override
+ public void federatedStatus(Status status) {
+
+ }
+
+ @Override
+ public void federatedAccount(Account account) {
+ if (account != null && account.username.equalsIgnoreCase("apps")) {
+ binding.developerTitle.setVisibility(View.VISIBLE);
+ binding.acccountContainer.setVisibility(View.VISIBLE);
+ MastodonHelper.loadPPMastodon(binding.accountPp, account);
+ binding.accountDn.setText(account.display_name);
+ binding.accountUn.setText(account.acct);
+ binding.accountPp.setOnClickListener(v -> {
+ Intent intent = new Intent(AboutActivity.this, ProfileActivity.class);
+ Bundle b = new Bundle();
+ b.putSerializable(Helper.ARG_ACCOUNT, account);
+ intent.putExtras(b);
+ ActivityOptionsCompat options = ActivityOptionsCompat
+ .makeSceneTransitionAnimation(AboutActivity.this, binding.accountPp, getString(R.string.activity_porfile_pp));
+ startActivity(intent, options.toBundle());
+ });
+ AccountsVM accountsVM = new ViewModelProvider(AboutActivity.this).get(AccountsVM.class);
+ List ids = new ArrayList<>();
+ ids.add(account.id);
+ accountsVM.getRelationships(MainActivity.currentInstance, MainActivity.currentToken, ids)
+ .observe(AboutActivity.this, relationShips -> {
+ if (relationShips != null && relationShips.size() > 0) {
+ if (!relationShips.get(0).following) {
+ binding.accountFollow.setVisibility(View.VISIBLE);
+ binding.accountFollow.setOnClickListener(v -> accountsVM.follow(MainActivity.currentInstance, MainActivity.currentToken, account.id, true, false)
+ .observe(AboutActivity.this, relationShip -> binding.accountFollow.setVisibility(View.GONE)));
+ }
+ }
+ });
+ }
+ }
+ });
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+
+}
diff --git a/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAdminService.java b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAdminService.java
index 746462db..ac0a19b6 100644
--- a/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAdminService.java
+++ b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAdminService.java
@@ -103,15 +103,15 @@ public interface MastodonAdminService {
@Path("account_id") String account_id
);
- @FormUrlEncoded
+
@GET("admin/reports")
Call> getReports(
@Header("Authorization") String token,
- @Field("resolved") Boolean resolved,
- @Field("account_id") String account_id,
- @Field("target_account_id") String target_account_id,
- @Field("max_id") String max_id,
- @Field("limit") int limit
+ @Query("resolved") Boolean resolved,
+ @Query("account_id") String account_id,
+ @Query("target_account_id") String target_account_id,
+ @Query("max_id") String max_id,
+ @Query("limit") int limit
);
@FormUrlEncoded
diff --git a/app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java b/app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java
index c1f5e404..df9eb781 100644
--- a/app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java
+++ b/app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java
@@ -354,6 +354,52 @@ public class CrossActionHelper {
}).start();
}
+ /**
+ * Fetch and federate the remote status
+ */
+ public static void fetchRemoteAccount(@NonNull Context context, String acct, Callback callback) {
+
+
+ MastodonSearchService mastodonSearchService = init(context, MainActivity.currentInstance);
+ new Thread(() -> {
+ Call resultsCall = mastodonSearchService.search(MainActivity.currentToken, acct, null, "accounts", false, true, false, 0, null, null, 1);
+ Results results = null;
+ if (resultsCall != null) {
+ try {
+ Response resultsResponse = resultsCall.execute();
+ if (resultsResponse.isSuccessful()) {
+ results = resultsResponse.body();
+ if (results != null) {
+ if (results.statuses == null) {
+ results.statuses = new ArrayList<>();
+ } else {
+ results.statuses = SpannableHelper.convertStatus(context, results.statuses);
+ }
+ if (results.accounts == null) {
+ results.accounts = new ArrayList<>();
+ }
+ if (results.hashtags == null) {
+ results.hashtags = new ArrayList<>();
+ }
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ Handler mainHandler = new Handler(Looper.getMainLooper());
+ Results finalResults = results;
+ Runnable myRunnable = () -> {
+ if (finalResults != null && finalResults.accounts != null && finalResults.accounts.size() > 0) {
+ callback.federatedAccount(finalResults.accounts.get(0));
+ }
+ };
+ mainHandler.post(myRunnable);
+
+ }).start();
+ }
+
+
public enum TypeOfCrossAction {
FOLLOW_ACTION,
UNFOLLOW_ACTION,
diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/admin/FragmentAdminReport.java b/app/src/main/java/app/fedilab/android/ui/fragment/admin/FragmentAdminReport.java
index 9bd9fd2e..50744da2 100644
--- a/app/src/main/java/app/fedilab/android/ui/fragment/admin/FragmentAdminReport.java
+++ b/app/src/main/java/app/fedilab/android/ui/fragment/admin/FragmentAdminReport.java
@@ -32,6 +32,7 @@ import java.util.List;
import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.R;
+import app.fedilab.android.activities.AdminActionActivity;
import app.fedilab.android.client.entities.api.AdminReport;
import app.fedilab.android.client.entities.api.AdminReports;
import app.fedilab.android.databinding.FragmentPaginationBinding;
@@ -81,7 +82,7 @@ public class FragmentAdminReport extends Fragment {
binding.recyclerView.setVisibility(View.GONE);
flagLoading = false;
adminVM.getReports(
- BaseMainActivity.currentInstance, BaseMainActivity.currentToken, null, null, null, null)
+ BaseMainActivity.currentInstance, BaseMainActivity.currentToken, AdminActionActivity.resolved, null, null, null)
.observe(getViewLifecycleOwner(), this::initializeStatusesCommonView);
return binding.getRoot();
}
@@ -108,7 +109,7 @@ public class FragmentAdminReport extends Fragment {
max_id = null;
flagLoading = false;
adminVM.getReports(
- BaseMainActivity.currentInstance, BaseMainActivity.currentToken, null, null, null, null)
+ BaseMainActivity.currentInstance, BaseMainActivity.currentToken, AdminActionActivity.resolved, null, null, null)
.observe(getViewLifecycleOwner(), this::initializeStatusesCommonView);
});
@@ -161,7 +162,7 @@ public class FragmentAdminReport extends Fragment {
flagLoading = true;
binding.loadingNextElements.setVisibility(View.VISIBLE);
adminVM.getReports(
- BaseMainActivity.currentInstance, BaseMainActivity.currentToken, null, null, null, max_id)
+ BaseMainActivity.currentInstance, BaseMainActivity.currentToken, AdminActionActivity.resolved, null, null, max_id)
.observe(getViewLifecycleOwner(), adminReports1 -> dealWithPagination(adminReports1));
}
} else {
diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml
new file mode 100644
index 00000000..bd9f11ac
--- /dev/null
+++ b/app/src/main/res/layout/activity_about.xml
@@ -0,0 +1,237 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml
index c37cf29b..cdbc7e8e 100644
--- a/app/src/main/res/menu/activity_main_drawer.xml
+++ b/app/src/main/res/menu/activity_main_drawer.xml
@@ -46,5 +46,9 @@
android:id="@+id/nav_settings"
android:icon="@drawable/ic_baseline_settings_24"
android:title="@string/settings" />
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 93551230..1f30006e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -203,7 +203,7 @@
License:
GNU GPL V3
Source code:
- FramaGit
+ CodeBerg
Translation of toots:
Powered by Yandex.Translate
Search instances: