Loading app/src/main/java/app/fedilab/android/BaseMainActivity.java +3 −6 Original line number Diff line number Diff line Loading @@ -418,15 +418,13 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt Intent intent = new Intent(BaseMainActivity.this, CacheActivity.class); startActivity(intent); } else if (id == R.id.nav_about_instance) { Intent intent = new Intent(BaseMainActivity.this, InstanceActivity.class); startActivity(intent); (new InstanceActivity()).show(getSupportFragmentManager(), null); } binding.drawerLayout.close(); return false; }); headerMainBinding.instanceInfo.setOnClickListener(v -> startActivity(new Intent(BaseMainActivity.this, InstanceHealthActivity.class))); headerMainBinding.instanceInfo.setOnClickListener(v -> (new InstanceHealthActivity()).show(getSupportFragmentManager(), null)); headerMainBinding.accountProfilePicture.setOnClickListener(v -> { Intent intent = new Intent(BaseMainActivity.this, ProfileActivity.class); Bundle b = new Bundle(); Loading Loading @@ -585,8 +583,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt alert.show(); return true; } else if (itemId == R.id.action_proxy) { Intent intent = new Intent(BaseMainActivity.this, ProxyActivity.class); startActivity(intent); (new ProxyActivity()).show(getSupportFragmentManager(), null); return true; } return true; Loading app/src/main/java/app/fedilab/android/activities/InstanceActivity.java +47 −63 Original line number Diff line number Diff line Loading @@ -15,9 +15,9 @@ package app.fedilab.android.activities; * see <http://www.gnu.org/licenses>. */ import android.app.Dialog; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; Loading @@ -26,18 +26,16 @@ import android.text.SpannableString; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import android.text.style.UnderlineSpan; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import androidx.lifecycle.ViewModelProvider; import androidx.preference.PreferenceManager; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; Loading @@ -48,42 +46,38 @@ import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.viewmodel.mastodon.InstancesVM; public class InstanceActivity extends BaseAlertDialogActivity { public class InstanceActivity extends DialogFragment { ActivityInstanceBinding binding; private boolean applyMaxChar = false; @NonNull @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { binding = ActivityInstanceBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(requireContext()); materialAlertDialogBuilder.setView(binding.getRoot()); getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); if (getSupportActionBar() != null) getSupportActionBar().hide(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(InstanceActivity.this); Dialog dialog = materialAlertDialogBuilder.create(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()); final SpannableString contentAbout = new SpannableString(getString(R.string.action_about_instance)); contentAbout.setSpan(new UnderlineSpan(), 0, contentAbout.length(), 0); contentAbout.setSpan(new ForegroundColorSpan(ThemeHelper.getAttColor(this, R.attr.colorPrimary)), 0, contentAbout.length(), contentAbout.setSpan(new ForegroundColorSpan(ThemeHelper.getAttColor(requireContext(), R.attr.colorPrimary)), 0, contentAbout.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); binding.tos.setText(contentAbout); binding.about.setText(contentAbout); final SpannableString contentPrivacy = new SpannableString(getString(R.string.action_privacy_policy)); contentPrivacy.setSpan(new UnderlineSpan(), 0, contentPrivacy.length(), 0); contentPrivacy.setSpan(new ForegroundColorSpan(ThemeHelper.getAttColor(this, R.attr.colorPrimary)), 0, contentPrivacy.length(), contentPrivacy.setSpan(new ForegroundColorSpan(ThemeHelper.getAttColor(requireContext(), R.attr.colorPrimary)), 0, contentPrivacy.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); binding.privacy.setText(contentPrivacy); binding.tos.setOnClickListener(v -> Helper.openBrowser(InstanceActivity.this, "https://" + MainActivity.currentInstance + "/about")); binding.privacy.setOnClickListener(v -> Helper.openBrowser(InstanceActivity.this, "https://" + MainActivity.currentInstance + "/privacy-policy")); binding.close.setOnClickListener( view -> { binding.about.setOnClickListener(v -> Helper.openBrowser(requireActivity(), "https://" + MainActivity.currentInstance + "/about")); binding.privacy.setOnClickListener(v -> Helper.openBrowser(requireActivity(), "https://" + MainActivity.currentInstance + "/privacy-policy")); binding.close.setOnClickListener( view -> { if (applyMaxChar) { String max_char = binding.maxChar.getText().toString(); Loading @@ -96,25 +90,18 @@ public class InstanceActivity extends BaseAlertDialogActivity { } } } finish(); requireDialog().dismiss(); } ); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); } InstancesVM instancesVM = new ViewModelProvider(InstanceActivity.this).get(InstancesVM.class); instancesVM.getInstance(BaseMainActivity.currentInstance).observe(InstanceActivity.this, instanceInfo -> { binding.instanceContainer.setVisibility(View.VISIBLE); binding.loader.setVisibility(View.GONE); if (instanceInfo == null || instanceInfo.info == null || instanceInfo.info.description == null) { binding.maxCharContainer.setVisibility(View.VISIBLE); binding.instanceContainer.setVisibility(View.GONE); binding.instanceContact.setVisibility(View.GONE); binding.instanceData.setVisibility(View.GONE); binding.contact.setVisibility(View.GONE); int val = sharedpreferences.getInt(getString(R.string.SET_MAX_INSTANCE_CHAR) + MainActivity.currentInstance, -1); if (val != -1) { binding.maxChar.setText(String.valueOf(val)); Loading @@ -123,51 +110,48 @@ public class InstanceActivity extends BaseAlertDialogActivity { } else { Instance instance = instanceInfo.info; binding.instanceTitle.setText(instance.title); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) binding.instanceDescription.setText(Html.fromHtml(instance.description, Html.FROM_HTML_MODE_LEGACY)); else binding.instanceDescription.setText(Html.fromHtml(instance.description)); if (instance.description == null || instance.description.trim().length() == 0) binding.instanceDescription.setText(getString(R.string.instance_no_description)); binding.instanceVersion.setText(instance.version); binding.instanceUri.setText(instance.uri); if (instance.email == null) { binding.instanceContact.hide(); } Glide.with(InstanceActivity.this) .asDrawable() .placeholder(R.drawable.default_banner) .load(instance.thumbnail) .into(new CustomTarget<Drawable>() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { binding.background.setAlpha(0.2f); binding.background.setBackground(resource); } .into(binding.backgroundImage); @Override public void onLoadCleared(@Nullable Drawable placeholder) { binding.name.setText(instance.title); if (instance.description == null || instance.description.trim().length() == 0) binding.description.setText(getString(R.string.instance_no_description)); else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) binding.description.setText(Html.fromHtml(instance.description, Html.FROM_HTML_MODE_LEGACY)); else binding.description.setText(Html.fromHtml(instance.description)); binding.version.setText(instance.version); binding.uri.setText(instance.uri); if (instance.email == null) { binding.contact.setVisibility(View.GONE); } else { binding.contact.setVisibility(View.VISIBLE); } }); binding.instanceContact.setOnClickListener(v -> { binding.contact.setOnClickListener(v -> { Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", instance.email, null)); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "[Mastodon] - " + instance.uri); startActivity(Intent.createChooser(emailIntent, getString(R.string.send_email))); }); binding.instanceData.setVisibility(View.VISIBLE); } }); } return dialog; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); public void onDestroyView() { super.onDestroyView(); binding = null; } } app/src/main/java/app/fedilab/android/activities/InstanceHealthActivity.javadeleted 100644 → 0 +0 −118 Original line number Diff line number Diff line package app.fedilab.android.activities; /* Copyright 2022 Thomas Schneider * * This file is a part of Fedilab * * 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. * * Fedilab 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 Fedilab; if not, * see <http://www.gnu.org/licenses>. */ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.text.SpannableString; import android.text.style.UnderlineSpan; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.lifecycle.ViewModelProvider; import com.bumptech.glide.Glide; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.client.entities.app.InstanceSocial; import app.fedilab.android.databinding.ActivityInstanceSocialBinding; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.viewmodel.mastodon.InstanceSocialVM; public class InstanceHealthActivity extends BaseAlertDialogActivity { private ActivityInstanceSocialBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityInstanceSocialBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); if (getSupportActionBar() != null) getSupportActionBar().hide(); binding.close.setOnClickListener(view -> finish()); SpannableString content = new SpannableString(binding.refInstance.getText().toString()); content.setSpan(new UnderlineSpan(), 0, content.length(), 0); binding.refInstance.setText(content); binding.refInstance.setOnClickListener(view -> { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://instances.social")); startActivity(browserIntent); }); checkInstance(); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); } private void checkInstance() { InstanceSocialVM instanceSocialVM = new ViewModelProvider(InstanceHealthActivity.this).get(InstanceSocialVM.class); instanceSocialVM.getInstances(BaseMainActivity.currentInstance.trim()).observe(InstanceHealthActivity.this, instanceSocialList -> { if (instanceSocialList != null && instanceSocialList.instances.size() > 0) { InstanceSocial.Instance instanceSocial = instanceSocialList.instances.get(0); for (InstanceSocial.Instance instance : instanceSocialList.instances) { if (instance.name.equalsIgnoreCase(BaseMainActivity.currentInstance.trim())) { instanceSocial = instance; break; } } if (instanceSocial.thumbnail != null && !instanceSocial.thumbnail.equals("null")) Glide.with(InstanceHealthActivity.this) .asBitmap() .load(instanceSocial.thumbnail) .into(binding.backGroundImage); binding.name.setText(instanceSocial.name); if (instanceSocial.up) { binding.up.setText(R.string.is_up); binding.up.setTextColor(ThemeHelper.getAttColor(this, R.attr.colorPrimary)); } else { binding.up.setText(R.string.is_down); binding.up.setTextColor(ThemeHelper.getAttColor(this, R.attr.colorError)); } binding.uptime.setText(getString(R.string.instance_health_uptime, (instanceSocial.uptime * 100))); if (instanceSocial.checked_at != null) binding.checkedAt.setText(getString(R.string.instance_health_checkedat, Helper.dateToString(instanceSocial.checked_at))); binding.values.setText(getString(R.string.instance_health_indication, instanceSocial.version, Helper.withSuffix(instanceSocial.active_users), Helper.withSuffix(instanceSocial.statuses))); binding.instanceContainer.setVisibility(View.VISIBLE); } else { binding.instanceContainer.setVisibility(View.VISIBLE); binding.mainContainer.setVisibility(View.GONE); binding.noInstance.setVisibility(View.VISIBLE); } binding.loader.setVisibility(View.GONE); }); } } app/src/main/java/app/fedilab/android/activities/InstanceHealthActivity.kt 0 → 100644 +106 −0 Original line number Diff line number Diff line package app.fedilab.android.activities import android.app.Dialog import android.content.Intent import android.net.Uri import android.os.Bundle import android.text.SpannableString import android.text.style.UnderlineSpan import android.view.Window import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment import androidx.lifecycle.ViewModelProvider import app.fedilab.android.BaseMainActivity import app.fedilab.android.R import app.fedilab.android.client.entities.app.InstanceSocial import app.fedilab.android.databinding.ActivityInstanceSocialBinding import app.fedilab.android.helper.Helper import app.fedilab.android.helper.ThemeHelper import app.fedilab.android.viewmodel.mastodon.InstanceSocialVM import com.bumptech.glide.Glide import com.google.android.material.dialog.MaterialAlertDialogBuilder /* Copyright 2022 Thomas Schneider * * This file is a part of Fedilab * * 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. * * Fedilab 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 Fedilab; if not, * see <http://www.gnu.org/licenses>. */ class InstanceHealthActivity : DialogFragment() { private var _binding: ActivityInstanceSocialBinding? = null private val binding: ActivityInstanceSocialBinding get() = _binding!! override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { _binding = ActivityInstanceSocialBinding.inflate(layoutInflater) binding.close.setOnClickListener { dialog?.dismiss() } val content = SpannableString(binding.refInstance.text.toString()) content.setSpan(UnderlineSpan(), 0, content.length, 0) binding.refInstance.text = content binding.refInstance.setOnClickListener { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://instances.social"))) } val materialAlertDialogBuilder = MaterialAlertDialogBuilder(requireContext()) materialAlertDialogBuilder.setView(binding.root) val dialog = materialAlertDialogBuilder.create() dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) dialog.setOnShowListener { checkInstance() } return dialog } private fun checkInstance() { val instanceSocialVM = ViewModelProvider(this@InstanceHealthActivity)[InstanceSocialVM::class.java] instanceSocialVM.getInstances(BaseMainActivity.currentInstance.trim { it <= ' ' }) .observe(this@InstanceHealthActivity) { instanceSocialList: InstanceSocial? -> val instance = instanceSocialList?.instances?.firstOrNull { instance -> instance.name.equals(BaseMainActivity.currentInstance.trim { it <= ' ' }, ignoreCase = true) } if (instance != null) { instance.thumbnail?.takeIf { it != "null" }?.let { thumbnail -> Glide.with(this@InstanceHealthActivity) .asBitmap() .placeholder(R.drawable.default_banner) .load(thumbnail) .into(binding.backgroundImage) } binding.name.text = instance.name if (instance.up) { binding.up.setText(app.fedilab.android.R.string.is_up) binding.up.setTextColor(ThemeHelper.getAttColor(requireContext(), app.fedilab.android.R.attr.colorPrimary)) } else { binding.up.setText(app.fedilab.android.R.string.is_down) binding.up.setTextColor(ThemeHelper.getAttColor(requireContext(), app.fedilab.android.R.attr.colorError)) } binding.uptime.text = getString(app.fedilab.android.R.string.instance_health_uptime, instance.uptime * 100) if (instance.checked_at != null) binding.checkedAt.text = getString(app.fedilab.android.R.string.instance_health_checkedat, Helper.dateToString(instance.checked_at)) binding.values.text = getString( app.fedilab.android.R.string.instance_health_indication, instance.version, Helper.withSuffix(instance.active_users.toLong()), Helper.withSuffix(instance.statuses.toLong()) ) } else { binding.instanceData.isVisible = false binding.noInstance.isVisible = true } binding.loader.isVisible = false } } override fun onDestroyView() { super.onDestroyView() _binding = null } } No newline at end of file app/src/main/java/app/fedilab/android/activities/InstanceProfileActivity.java +23 −31 Original line number Diff line number Diff line Loading @@ -15,72 +15,64 @@ package app.fedilab.android.activities; * see <http://www.gnu.org/licenses>. */ import android.app.Dialog; import android.os.Bundle; import android.text.SpannableString; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import androidx.lifecycle.ViewModelProvider; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import app.fedilab.android.R; import app.fedilab.android.databinding.ActivityInstanceProfileBinding; import app.fedilab.android.helper.Helper; import app.fedilab.android.viewmodel.mastodon.NodeInfoVM; import es.dmoral.toasty.Toasty; public class InstanceProfileActivity extends BaseAlertDialogActivity { public class InstanceProfileActivity extends DialogFragment { private String instance; private ActivityInstanceProfileBinding binding; @NonNull @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { binding = ActivityInstanceProfileBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); Bundle b = getIntent().getExtras(); if (getSupportActionBar() != null) getSupportActionBar().hide(); MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(requireContext()); materialAlertDialogBuilder.setView(binding.getRoot()); Dialog dialog = materialAlertDialogBuilder.create(); Bundle b = getArguments(); if (b != null) instance = b.getString(Helper.ARG_INSTANCE, null); if (instance == null) { finish(); requireDialog().dismiss(); } Button close = findViewById(R.id.close); close.setOnClickListener(view -> finish()); binding.close.setOnClickListener(v -> requireDialog().dismiss()); NodeInfoVM nodeInfoVM = new ViewModelProvider(InstanceProfileActivity.this).get(NodeInfoVM.class); nodeInfoVM.getNodeInfo(instance).observe(InstanceProfileActivity.this, nodeInfo -> { if (nodeInfo == null) { Toasty.error(InstanceProfileActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show(); finish(); Toasty.error(requireContext(), getString(R.string.toast_error), Toast.LENGTH_LONG).show(); requireDialog().dismiss(); return; } binding.name.setText(instance); SpannableString descriptionSpan; binding.userCount.setText(Helper.withSuffix((nodeInfo.usage.users.total))); binding.statusCount.setText(Helper.withSuffix(((nodeInfo.usage.localPosts)))); String softwareStr = nodeInfo.software.name + " - "; binding.software.setText(softwareStr); binding.version.setText(nodeInfo.software.version); binding.instanceContainer.setVisibility(View.VISIBLE); binding.loader.setVisibility(View.GONE); }); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; return dialog; } return super.onOptionsItemSelected(item); } } Loading
app/src/main/java/app/fedilab/android/BaseMainActivity.java +3 −6 Original line number Diff line number Diff line Loading @@ -418,15 +418,13 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt Intent intent = new Intent(BaseMainActivity.this, CacheActivity.class); startActivity(intent); } else if (id == R.id.nav_about_instance) { Intent intent = new Intent(BaseMainActivity.this, InstanceActivity.class); startActivity(intent); (new InstanceActivity()).show(getSupportFragmentManager(), null); } binding.drawerLayout.close(); return false; }); headerMainBinding.instanceInfo.setOnClickListener(v -> startActivity(new Intent(BaseMainActivity.this, InstanceHealthActivity.class))); headerMainBinding.instanceInfo.setOnClickListener(v -> (new InstanceHealthActivity()).show(getSupportFragmentManager(), null)); headerMainBinding.accountProfilePicture.setOnClickListener(v -> { Intent intent = new Intent(BaseMainActivity.this, ProfileActivity.class); Bundle b = new Bundle(); Loading Loading @@ -585,8 +583,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt alert.show(); return true; } else if (itemId == R.id.action_proxy) { Intent intent = new Intent(BaseMainActivity.this, ProxyActivity.class); startActivity(intent); (new ProxyActivity()).show(getSupportFragmentManager(), null); return true; } return true; Loading
app/src/main/java/app/fedilab/android/activities/InstanceActivity.java +47 −63 Original line number Diff line number Diff line Loading @@ -15,9 +15,9 @@ package app.fedilab.android.activities; * see <http://www.gnu.org/licenses>. */ import android.app.Dialog; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; Loading @@ -26,18 +26,16 @@ import android.text.SpannableString; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import android.text.style.UnderlineSpan; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import androidx.lifecycle.ViewModelProvider; import androidx.preference.PreferenceManager; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; Loading @@ -48,42 +46,38 @@ import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.viewmodel.mastodon.InstancesVM; public class InstanceActivity extends BaseAlertDialogActivity { public class InstanceActivity extends DialogFragment { ActivityInstanceBinding binding; private boolean applyMaxChar = false; @NonNull @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { binding = ActivityInstanceBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(requireContext()); materialAlertDialogBuilder.setView(binding.getRoot()); getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); if (getSupportActionBar() != null) getSupportActionBar().hide(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(InstanceActivity.this); Dialog dialog = materialAlertDialogBuilder.create(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()); final SpannableString contentAbout = new SpannableString(getString(R.string.action_about_instance)); contentAbout.setSpan(new UnderlineSpan(), 0, contentAbout.length(), 0); contentAbout.setSpan(new ForegroundColorSpan(ThemeHelper.getAttColor(this, R.attr.colorPrimary)), 0, contentAbout.length(), contentAbout.setSpan(new ForegroundColorSpan(ThemeHelper.getAttColor(requireContext(), R.attr.colorPrimary)), 0, contentAbout.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); binding.tos.setText(contentAbout); binding.about.setText(contentAbout); final SpannableString contentPrivacy = new SpannableString(getString(R.string.action_privacy_policy)); contentPrivacy.setSpan(new UnderlineSpan(), 0, contentPrivacy.length(), 0); contentPrivacy.setSpan(new ForegroundColorSpan(ThemeHelper.getAttColor(this, R.attr.colorPrimary)), 0, contentPrivacy.length(), contentPrivacy.setSpan(new ForegroundColorSpan(ThemeHelper.getAttColor(requireContext(), R.attr.colorPrimary)), 0, contentPrivacy.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); binding.privacy.setText(contentPrivacy); binding.tos.setOnClickListener(v -> Helper.openBrowser(InstanceActivity.this, "https://" + MainActivity.currentInstance + "/about")); binding.privacy.setOnClickListener(v -> Helper.openBrowser(InstanceActivity.this, "https://" + MainActivity.currentInstance + "/privacy-policy")); binding.close.setOnClickListener( view -> { binding.about.setOnClickListener(v -> Helper.openBrowser(requireActivity(), "https://" + MainActivity.currentInstance + "/about")); binding.privacy.setOnClickListener(v -> Helper.openBrowser(requireActivity(), "https://" + MainActivity.currentInstance + "/privacy-policy")); binding.close.setOnClickListener( view -> { if (applyMaxChar) { String max_char = binding.maxChar.getText().toString(); Loading @@ -96,25 +90,18 @@ public class InstanceActivity extends BaseAlertDialogActivity { } } } finish(); requireDialog().dismiss(); } ); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); } InstancesVM instancesVM = new ViewModelProvider(InstanceActivity.this).get(InstancesVM.class); instancesVM.getInstance(BaseMainActivity.currentInstance).observe(InstanceActivity.this, instanceInfo -> { binding.instanceContainer.setVisibility(View.VISIBLE); binding.loader.setVisibility(View.GONE); if (instanceInfo == null || instanceInfo.info == null || instanceInfo.info.description == null) { binding.maxCharContainer.setVisibility(View.VISIBLE); binding.instanceContainer.setVisibility(View.GONE); binding.instanceContact.setVisibility(View.GONE); binding.instanceData.setVisibility(View.GONE); binding.contact.setVisibility(View.GONE); int val = sharedpreferences.getInt(getString(R.string.SET_MAX_INSTANCE_CHAR) + MainActivity.currentInstance, -1); if (val != -1) { binding.maxChar.setText(String.valueOf(val)); Loading @@ -123,51 +110,48 @@ public class InstanceActivity extends BaseAlertDialogActivity { } else { Instance instance = instanceInfo.info; binding.instanceTitle.setText(instance.title); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) binding.instanceDescription.setText(Html.fromHtml(instance.description, Html.FROM_HTML_MODE_LEGACY)); else binding.instanceDescription.setText(Html.fromHtml(instance.description)); if (instance.description == null || instance.description.trim().length() == 0) binding.instanceDescription.setText(getString(R.string.instance_no_description)); binding.instanceVersion.setText(instance.version); binding.instanceUri.setText(instance.uri); if (instance.email == null) { binding.instanceContact.hide(); } Glide.with(InstanceActivity.this) .asDrawable() .placeholder(R.drawable.default_banner) .load(instance.thumbnail) .into(new CustomTarget<Drawable>() { @Override public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { binding.background.setAlpha(0.2f); binding.background.setBackground(resource); } .into(binding.backgroundImage); @Override public void onLoadCleared(@Nullable Drawable placeholder) { binding.name.setText(instance.title); if (instance.description == null || instance.description.trim().length() == 0) binding.description.setText(getString(R.string.instance_no_description)); else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) binding.description.setText(Html.fromHtml(instance.description, Html.FROM_HTML_MODE_LEGACY)); else binding.description.setText(Html.fromHtml(instance.description)); binding.version.setText(instance.version); binding.uri.setText(instance.uri); if (instance.email == null) { binding.contact.setVisibility(View.GONE); } else { binding.contact.setVisibility(View.VISIBLE); } }); binding.instanceContact.setOnClickListener(v -> { binding.contact.setOnClickListener(v -> { Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", instance.email, null)); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "[Mastodon] - " + instance.uri); startActivity(Intent.createChooser(emailIntent, getString(R.string.send_email))); }); binding.instanceData.setVisibility(View.VISIBLE); } }); } return dialog; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); public void onDestroyView() { super.onDestroyView(); binding = null; } }
app/src/main/java/app/fedilab/android/activities/InstanceHealthActivity.javadeleted 100644 → 0 +0 −118 Original line number Diff line number Diff line package app.fedilab.android.activities; /* Copyright 2022 Thomas Schneider * * This file is a part of Fedilab * * 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. * * Fedilab 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 Fedilab; if not, * see <http://www.gnu.org/licenses>. */ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.text.SpannableString; import android.text.style.UnderlineSpan; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.lifecycle.ViewModelProvider; import com.bumptech.glide.Glide; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; import app.fedilab.android.client.entities.app.InstanceSocial; import app.fedilab.android.databinding.ActivityInstanceSocialBinding; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.viewmodel.mastodon.InstanceSocialVM; public class InstanceHealthActivity extends BaseAlertDialogActivity { private ActivityInstanceSocialBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityInstanceSocialBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); if (getSupportActionBar() != null) getSupportActionBar().hide(); binding.close.setOnClickListener(view -> finish()); SpannableString content = new SpannableString(binding.refInstance.getText().toString()); content.setSpan(new UnderlineSpan(), 0, content.length(), 0); binding.refInstance.setText(content); binding.refInstance.setOnClickListener(view -> { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://instances.social")); startActivity(browserIntent); }); checkInstance(); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); } private void checkInstance() { InstanceSocialVM instanceSocialVM = new ViewModelProvider(InstanceHealthActivity.this).get(InstanceSocialVM.class); instanceSocialVM.getInstances(BaseMainActivity.currentInstance.trim()).observe(InstanceHealthActivity.this, instanceSocialList -> { if (instanceSocialList != null && instanceSocialList.instances.size() > 0) { InstanceSocial.Instance instanceSocial = instanceSocialList.instances.get(0); for (InstanceSocial.Instance instance : instanceSocialList.instances) { if (instance.name.equalsIgnoreCase(BaseMainActivity.currentInstance.trim())) { instanceSocial = instance; break; } } if (instanceSocial.thumbnail != null && !instanceSocial.thumbnail.equals("null")) Glide.with(InstanceHealthActivity.this) .asBitmap() .load(instanceSocial.thumbnail) .into(binding.backGroundImage); binding.name.setText(instanceSocial.name); if (instanceSocial.up) { binding.up.setText(R.string.is_up); binding.up.setTextColor(ThemeHelper.getAttColor(this, R.attr.colorPrimary)); } else { binding.up.setText(R.string.is_down); binding.up.setTextColor(ThemeHelper.getAttColor(this, R.attr.colorError)); } binding.uptime.setText(getString(R.string.instance_health_uptime, (instanceSocial.uptime * 100))); if (instanceSocial.checked_at != null) binding.checkedAt.setText(getString(R.string.instance_health_checkedat, Helper.dateToString(instanceSocial.checked_at))); binding.values.setText(getString(R.string.instance_health_indication, instanceSocial.version, Helper.withSuffix(instanceSocial.active_users), Helper.withSuffix(instanceSocial.statuses))); binding.instanceContainer.setVisibility(View.VISIBLE); } else { binding.instanceContainer.setVisibility(View.VISIBLE); binding.mainContainer.setVisibility(View.GONE); binding.noInstance.setVisibility(View.VISIBLE); } binding.loader.setVisibility(View.GONE); }); } }
app/src/main/java/app/fedilab/android/activities/InstanceHealthActivity.kt 0 → 100644 +106 −0 Original line number Diff line number Diff line package app.fedilab.android.activities import android.app.Dialog import android.content.Intent import android.net.Uri import android.os.Bundle import android.text.SpannableString import android.text.style.UnderlineSpan import android.view.Window import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment import androidx.lifecycle.ViewModelProvider import app.fedilab.android.BaseMainActivity import app.fedilab.android.R import app.fedilab.android.client.entities.app.InstanceSocial import app.fedilab.android.databinding.ActivityInstanceSocialBinding import app.fedilab.android.helper.Helper import app.fedilab.android.helper.ThemeHelper import app.fedilab.android.viewmodel.mastodon.InstanceSocialVM import com.bumptech.glide.Glide import com.google.android.material.dialog.MaterialAlertDialogBuilder /* Copyright 2022 Thomas Schneider * * This file is a part of Fedilab * * 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. * * Fedilab 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 Fedilab; if not, * see <http://www.gnu.org/licenses>. */ class InstanceHealthActivity : DialogFragment() { private var _binding: ActivityInstanceSocialBinding? = null private val binding: ActivityInstanceSocialBinding get() = _binding!! override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { _binding = ActivityInstanceSocialBinding.inflate(layoutInflater) binding.close.setOnClickListener { dialog?.dismiss() } val content = SpannableString(binding.refInstance.text.toString()) content.setSpan(UnderlineSpan(), 0, content.length, 0) binding.refInstance.text = content binding.refInstance.setOnClickListener { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://instances.social"))) } val materialAlertDialogBuilder = MaterialAlertDialogBuilder(requireContext()) materialAlertDialogBuilder.setView(binding.root) val dialog = materialAlertDialogBuilder.create() dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) dialog.setOnShowListener { checkInstance() } return dialog } private fun checkInstance() { val instanceSocialVM = ViewModelProvider(this@InstanceHealthActivity)[InstanceSocialVM::class.java] instanceSocialVM.getInstances(BaseMainActivity.currentInstance.trim { it <= ' ' }) .observe(this@InstanceHealthActivity) { instanceSocialList: InstanceSocial? -> val instance = instanceSocialList?.instances?.firstOrNull { instance -> instance.name.equals(BaseMainActivity.currentInstance.trim { it <= ' ' }, ignoreCase = true) } if (instance != null) { instance.thumbnail?.takeIf { it != "null" }?.let { thumbnail -> Glide.with(this@InstanceHealthActivity) .asBitmap() .placeholder(R.drawable.default_banner) .load(thumbnail) .into(binding.backgroundImage) } binding.name.text = instance.name if (instance.up) { binding.up.setText(app.fedilab.android.R.string.is_up) binding.up.setTextColor(ThemeHelper.getAttColor(requireContext(), app.fedilab.android.R.attr.colorPrimary)) } else { binding.up.setText(app.fedilab.android.R.string.is_down) binding.up.setTextColor(ThemeHelper.getAttColor(requireContext(), app.fedilab.android.R.attr.colorError)) } binding.uptime.text = getString(app.fedilab.android.R.string.instance_health_uptime, instance.uptime * 100) if (instance.checked_at != null) binding.checkedAt.text = getString(app.fedilab.android.R.string.instance_health_checkedat, Helper.dateToString(instance.checked_at)) binding.values.text = getString( app.fedilab.android.R.string.instance_health_indication, instance.version, Helper.withSuffix(instance.active_users.toLong()), Helper.withSuffix(instance.statuses.toLong()) ) } else { binding.instanceData.isVisible = false binding.noInstance.isVisible = true } binding.loader.isVisible = false } } override fun onDestroyView() { super.onDestroyView() _binding = null } } No newline at end of file
app/src/main/java/app/fedilab/android/activities/InstanceProfileActivity.java +23 −31 Original line number Diff line number Diff line Loading @@ -15,72 +15,64 @@ package app.fedilab.android.activities; * see <http://www.gnu.org/licenses>. */ import android.app.Dialog; import android.os.Bundle; import android.text.SpannableString; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import androidx.lifecycle.ViewModelProvider; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import app.fedilab.android.R; import app.fedilab.android.databinding.ActivityInstanceProfileBinding; import app.fedilab.android.helper.Helper; import app.fedilab.android.viewmodel.mastodon.NodeInfoVM; import es.dmoral.toasty.Toasty; public class InstanceProfileActivity extends BaseAlertDialogActivity { public class InstanceProfileActivity extends DialogFragment { private String instance; private ActivityInstanceProfileBinding binding; @NonNull @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { binding = ActivityInstanceProfileBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); Bundle b = getIntent().getExtras(); if (getSupportActionBar() != null) getSupportActionBar().hide(); MaterialAlertDialogBuilder materialAlertDialogBuilder = new MaterialAlertDialogBuilder(requireContext()); materialAlertDialogBuilder.setView(binding.getRoot()); Dialog dialog = materialAlertDialogBuilder.create(); Bundle b = getArguments(); if (b != null) instance = b.getString(Helper.ARG_INSTANCE, null); if (instance == null) { finish(); requireDialog().dismiss(); } Button close = findViewById(R.id.close); close.setOnClickListener(view -> finish()); binding.close.setOnClickListener(v -> requireDialog().dismiss()); NodeInfoVM nodeInfoVM = new ViewModelProvider(InstanceProfileActivity.this).get(NodeInfoVM.class); nodeInfoVM.getNodeInfo(instance).observe(InstanceProfileActivity.this, nodeInfo -> { if (nodeInfo == null) { Toasty.error(InstanceProfileActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show(); finish(); Toasty.error(requireContext(), getString(R.string.toast_error), Toast.LENGTH_LONG).show(); requireDialog().dismiss(); return; } binding.name.setText(instance); SpannableString descriptionSpan; binding.userCount.setText(Helper.withSuffix((nodeInfo.usage.users.total))); binding.statusCount.setText(Helper.withSuffix(((nodeInfo.usage.localPosts)))); String softwareStr = nodeInfo.software.name + " - "; binding.software.setText(softwareStr); binding.version.setText(nodeInfo.software.version); binding.instanceContainer.setVisibility(View.VISIBLE); binding.loader.setVisibility(View.GONE); }); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; return dialog; } return super.onOptionsItemSelected(item); } }