Loading app/src/main/java/app/fedilab/android/activities/ContextActivity.java +20 −17 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; Loading @@ -35,14 +34,15 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.preference.PreferenceManager; import java.util.regex.Matcher; import java.util.regex.Pattern; import app.fedilab.android.BaseMainActivity; 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.client.entities.app.StatusCache; import app.fedilab.android.databinding.ActivityConversationBinding; import app.fedilab.android.exception.DBException; import app.fedilab.android.helper.CrossActionHelper; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastodonHelper; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonContext; Loading Loading @@ -143,6 +143,8 @@ public class ContextActivity extends BaseActivity implements FragmentMastodonCon MenuItem action_remote = menu.findItem(R.id.action_remote); if (remote_instance != null) { action_remote.setVisible(false); } else { action_remote.setVisible(firstMessage != null && !firstMessage.visibility.equalsIgnoreCase("direct") && !firstMessage.visibility.equalsIgnoreCase("private")); } return true; } Loading Loading @@ -184,31 +186,31 @@ public class ContextActivity extends BaseActivity implements FragmentMastodonCon Toasty.info(ContextActivity.this, getString(R.string.toast_on_your_instance), Toasty.LENGTH_SHORT).show(); return true; } Log.v(Helper.TAG, "firstMessage.uri: " + firstMessage.uri); Log.v(Helper.TAG, "instance: " + instance); CrossActionHelper.fetchStatusInRemoteInstance(ContextActivity.this, firstMessage.uri, instance, new CrossActionHelper.Callback() { @Override public void federatedStatus(Status status) { Log.v(Helper.TAG, ">status: " + status); Pattern pattern = Helper.statusIdInUrl; Matcher matcher = pattern.matcher(firstMessage.uri); String remoteId = null; if (matcher.find()) { remoteId = matcher.group(1); } if (remoteId != null) { StatusesVM statusesVM = new ViewModelProvider(ContextActivity.this).get(StatusesVM.class); statusesVM.getStatus(instance, null, remoteId).observe(ContextActivity.this, status -> { if (status != null) { Intent intentContext = new Intent(ContextActivity.this, ContextActivity.class); intentContext.putExtra(Helper.ARG_STATUS, status); intentContext.putExtra(Helper.ARG_REMOTE_INSTANCE, true); intentContext.putExtra(Helper.ARG_REMOTE_INSTANCE, instance); intentContext.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intentContext); } else { Toasty.warning(ContextActivity.this, getString(R.string.toast_error_fetch_message), Toasty.LENGTH_SHORT).show(); } } @Override public void federatedAccount(Account account) { Log.v(Helper.TAG, ">account: " + account); } }); } else { Toasty.warning(ContextActivity.this, getString(R.string.toast_error_fetch_message), Toasty.LENGTH_SHORT).show(); } } else { Toasty.warning(ContextActivity.this, getString(R.string.toast_error_fetch_message), Toasty.LENGTH_SHORT).show(); } } return true; } Loading @@ -216,5 +218,6 @@ public class ContextActivity extends BaseActivity implements FragmentMastodonCon @Override public void get(Status status) { firstMessage = status; invalidateOptionsMenu(); } } No newline at end of file app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java +0 −5 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; Loading Loading @@ -449,7 +448,6 @@ public class CrossActionHelper { new Thread(() -> { Call<Results> resultsCall = mastodonSearchService.search(null, url, null, "statuses", null, null, null, null, null, null, null); Results results = null; Log.v(Helper.TAG, ">request: " + resultsCall.request()); if (resultsCall != null) { try { Response<Results> resultsResponse = resultsCall.execute(); Loading @@ -461,8 +459,6 @@ public class CrossActionHelper { results.statuses = new ArrayList<>(); } } } else { Log.v(Helper.TAG, ">err: " + resultsResponse.errorBody().string()); } } catch (IOException e) { e.printStackTrace(); Loading @@ -471,7 +467,6 @@ public class CrossActionHelper { Handler mainHandler = new Handler(Looper.getMainLooper()); Results finalResults = results; Runnable myRunnable = () -> { Log.v(Helper.TAG, ">finalResults.statuses " + finalResults.statuses); if (finalResults != null && finalResults.statuses != null && finalResults.statuses.size() > 0) { callback.federatedStatus(finalResults.statuses.get(0)); } Loading app/src/main/java/app/fedilab/android/helper/Helper.java +2 −0 Original line number Diff line number Diff line Loading @@ -343,6 +343,8 @@ public class Helper { public static final Pattern codePattern = Pattern.compile("code=([\\w-]+)"); public static final Pattern nitterIDPattern = Pattern.compile("/status/(\\d+)"); public static final Pattern emailPattern = Pattern.compile("(\\s+[\\w_.-]+@[a-zA-Z0-9][a-zA-Z0-9.-]{1,61}[a-zA-Z0-9](?:\\.[a-zA-Z]{2,})+)"); public static final Pattern statusIdInUrl = Pattern.compile("statuses/(\\w+)"); /*public static final Pattern urlPattern = Pattern.compile( "(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,10}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))", Loading app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +15 −13 Original line number Diff line number Diff line Loading @@ -1453,13 +1453,14 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } return; } if (context instanceof ContextActivity) { if (context instanceof ContextActivity && !remote) { Bundle bundle = new Bundle(); bundle.putSerializable(Helper.ARG_STATUS, statusToDeal); Fragment fragment = Helper.addFragment(((AppCompatActivity) context).getSupportFragmentManager(), R.id.nav_host_fragment_content_main, new FragmentMastodonContext(), bundle, null, FragmentMastodonContext.class.getName()); ((ContextActivity) context).setCurrentFragment((FragmentMastodonContext) fragment); } else { if (remote) { if (!(context instanceof ContextActivity)) { //We are not already checking a remote conversation Toasty.info(context, context.getString(R.string.retrieve_remote_status), Toasty.LENGTH_SHORT).show(); searchVM.search(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.uri, null, "statuses", false, true, false, 0, null, null, 1) .observe((LifecycleOwner) context, results -> { Loading @@ -1472,6 +1473,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> Toasty.info(context, context.getString(R.string.toast_error_search), Toasty.LENGTH_SHORT).show(); } }); } } else { Intent intent = new Intent(context, ContextActivity.class); intent.putExtra(Helper.ARG_STATUS, statusToDeal); Loading app/src/main/res/layout/activity_conversation.xml +2 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,8 @@ <androidx.appcompat.widget.AppCompatTextView android:id="@+id/title" style="@style/TextAppearance.AppCompat.Title" android:ellipsize="end" android:maxLines="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> Loading Loading
app/src/main/java/app/fedilab/android/activities/ContextActivity.java +20 −17 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; Loading @@ -35,14 +34,15 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.preference.PreferenceManager; import java.util.regex.Matcher; import java.util.regex.Pattern; import app.fedilab.android.BaseMainActivity; 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.client.entities.app.StatusCache; import app.fedilab.android.databinding.ActivityConversationBinding; import app.fedilab.android.exception.DBException; import app.fedilab.android.helper.CrossActionHelper; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastodonHelper; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonContext; Loading Loading @@ -143,6 +143,8 @@ public class ContextActivity extends BaseActivity implements FragmentMastodonCon MenuItem action_remote = menu.findItem(R.id.action_remote); if (remote_instance != null) { action_remote.setVisible(false); } else { action_remote.setVisible(firstMessage != null && !firstMessage.visibility.equalsIgnoreCase("direct") && !firstMessage.visibility.equalsIgnoreCase("private")); } return true; } Loading Loading @@ -184,31 +186,31 @@ public class ContextActivity extends BaseActivity implements FragmentMastodonCon Toasty.info(ContextActivity.this, getString(R.string.toast_on_your_instance), Toasty.LENGTH_SHORT).show(); return true; } Log.v(Helper.TAG, "firstMessage.uri: " + firstMessage.uri); Log.v(Helper.TAG, "instance: " + instance); CrossActionHelper.fetchStatusInRemoteInstance(ContextActivity.this, firstMessage.uri, instance, new CrossActionHelper.Callback() { @Override public void federatedStatus(Status status) { Log.v(Helper.TAG, ">status: " + status); Pattern pattern = Helper.statusIdInUrl; Matcher matcher = pattern.matcher(firstMessage.uri); String remoteId = null; if (matcher.find()) { remoteId = matcher.group(1); } if (remoteId != null) { StatusesVM statusesVM = new ViewModelProvider(ContextActivity.this).get(StatusesVM.class); statusesVM.getStatus(instance, null, remoteId).observe(ContextActivity.this, status -> { if (status != null) { Intent intentContext = new Intent(ContextActivity.this, ContextActivity.class); intentContext.putExtra(Helper.ARG_STATUS, status); intentContext.putExtra(Helper.ARG_REMOTE_INSTANCE, true); intentContext.putExtra(Helper.ARG_REMOTE_INSTANCE, instance); intentContext.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intentContext); } else { Toasty.warning(ContextActivity.this, getString(R.string.toast_error_fetch_message), Toasty.LENGTH_SHORT).show(); } } @Override public void federatedAccount(Account account) { Log.v(Helper.TAG, ">account: " + account); } }); } else { Toasty.warning(ContextActivity.this, getString(R.string.toast_error_fetch_message), Toasty.LENGTH_SHORT).show(); } } else { Toasty.warning(ContextActivity.this, getString(R.string.toast_error_fetch_message), Toasty.LENGTH_SHORT).show(); } } return true; } Loading @@ -216,5 +218,6 @@ public class ContextActivity extends BaseActivity implements FragmentMastodonCon @Override public void get(Status status) { firstMessage = status; invalidateOptionsMenu(); } } No newline at end of file
app/src/main/java/app/fedilab/android/helper/CrossActionHelper.java +0 −5 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; Loading Loading @@ -449,7 +448,6 @@ public class CrossActionHelper { new Thread(() -> { Call<Results> resultsCall = mastodonSearchService.search(null, url, null, "statuses", null, null, null, null, null, null, null); Results results = null; Log.v(Helper.TAG, ">request: " + resultsCall.request()); if (resultsCall != null) { try { Response<Results> resultsResponse = resultsCall.execute(); Loading @@ -461,8 +459,6 @@ public class CrossActionHelper { results.statuses = new ArrayList<>(); } } } else { Log.v(Helper.TAG, ">err: " + resultsResponse.errorBody().string()); } } catch (IOException e) { e.printStackTrace(); Loading @@ -471,7 +467,6 @@ public class CrossActionHelper { Handler mainHandler = new Handler(Looper.getMainLooper()); Results finalResults = results; Runnable myRunnable = () -> { Log.v(Helper.TAG, ">finalResults.statuses " + finalResults.statuses); if (finalResults != null && finalResults.statuses != null && finalResults.statuses.size() > 0) { callback.federatedStatus(finalResults.statuses.get(0)); } Loading
app/src/main/java/app/fedilab/android/helper/Helper.java +2 −0 Original line number Diff line number Diff line Loading @@ -343,6 +343,8 @@ public class Helper { public static final Pattern codePattern = Pattern.compile("code=([\\w-]+)"); public static final Pattern nitterIDPattern = Pattern.compile("/status/(\\d+)"); public static final Pattern emailPattern = Pattern.compile("(\\s+[\\w_.-]+@[a-zA-Z0-9][a-zA-Z0-9.-]{1,61}[a-zA-Z0-9](?:\\.[a-zA-Z]{2,})+)"); public static final Pattern statusIdInUrl = Pattern.compile("statuses/(\\w+)"); /*public static final Pattern urlPattern = Pattern.compile( "(?i)\\b((?:[a-z][\\w-]+:(?:/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,10}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))", Loading
app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java +15 −13 Original line number Diff line number Diff line Loading @@ -1453,13 +1453,14 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> } return; } if (context instanceof ContextActivity) { if (context instanceof ContextActivity && !remote) { Bundle bundle = new Bundle(); bundle.putSerializable(Helper.ARG_STATUS, statusToDeal); Fragment fragment = Helper.addFragment(((AppCompatActivity) context).getSupportFragmentManager(), R.id.nav_host_fragment_content_main, new FragmentMastodonContext(), bundle, null, FragmentMastodonContext.class.getName()); ((ContextActivity) context).setCurrentFragment((FragmentMastodonContext) fragment); } else { if (remote) { if (!(context instanceof ContextActivity)) { //We are not already checking a remote conversation Toasty.info(context, context.getString(R.string.retrieve_remote_status), Toasty.LENGTH_SHORT).show(); searchVM.search(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, statusToDeal.uri, null, "statuses", false, true, false, 0, null, null, 1) .observe((LifecycleOwner) context, results -> { Loading @@ -1472,6 +1473,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> Toasty.info(context, context.getString(R.string.toast_error_search), Toasty.LENGTH_SHORT).show(); } }); } } else { Intent intent = new Intent(context, ContextActivity.class); intent.putExtra(Helper.ARG_STATUS, statusToDeal); Loading
app/src/main/res/layout/activity_conversation.xml +2 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,8 @@ <androidx.appcompat.widget.AppCompatTextView android:id="@+id/title" style="@style/TextAppearance.AppCompat.Title" android:ellipsize="end" android:maxLines="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" /> Loading