diff options
author | Thomas <tschneider.ac@gmail.com> | 2023-01-11 18:30:08 +0100 |
---|---|---|
committer | Thomas <tschneider.ac@gmail.com> | 2023-01-11 18:30:08 +0100 |
commit | af10d647b924b9ba6cb8cbd662d0e23a26041872 (patch) | |
tree | 6c165be4a425cc61faa27a421d2197bf5de01df0 | |
parent | 8c98b9e46dc179ff8c00705b424c1b6d6820f77b (diff) | |
parent | 31025af9abde6970be53212db1437c3dd6de7f3e (diff) |
Merge branch 'develop'3.14.1
28 files changed, 680 insertions, 159 deletions
diff --git a/app/build.gradle b/app/build.gradle index 2046c73dd..e39b62ae5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { defaultConfig { minSdk 21 targetSdk 33 - versionCode 462 - versionName "3.14.0" + versionCode 463 + versionName "3.14.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions "default" @@ -97,6 +97,10 @@ dependencies { implementation 'org.framagit.tom79:SparkButton:1.0.13' implementation "com.github.bumptech.glide:glide:4.14.2" implementation "com.github.bumptech.glide:okhttp3-integration:4.14.2" + implementation("com.github.bumptech.glide:recyclerview-integration:4.14.2") { + // Excludes the support library because it's already included by Glide. + transitive = false + } implementation "org.jsoup:jsoup:1.15.1" diff --git a/app/src/main/assets/release_notes/notes.json b/app/src/main/assets/release_notes/notes.json index c55a9703b..53210353f 100644 --- a/app/src/main/assets/release_notes/notes.json +++ b/app/src/main/assets/release_notes/notes.json @@ -1,5 +1,10 @@ [ { + "version": "3.14.1", + "code": "463", + "note": "Added:\n- Search bar: display suggestions when starting by \"@\" or \"#\"\n\nChanged:\n- Preload media in timelines to avoid jumps\n- Search: Automatically switch to account tab if no results for tags\n\nFixed:\n- Fix jumps with the fetch more feature\n- Fix videos cannot be saved\n- Tags cannot be pinned when there are no custom tabs\n- PixelFed view: NSFW not honored\n- Fix crashes" + }, + { "version": "3.14.0", "code": "462", "note": "Added:\n\n- Add Bubble timeline support in extra-features with filters\n- Allow to display public profiles by default to get all messages (Settings > Interface)\n- Glitch: Allow to post messages locally (Can be turned off in Settings)\n- Pixelfed: Custom layout to display Media fully (Also works for other software when there are media)\n- Allow to align left action buttons in messages\n\nChanged:\n- Full rework on links in messages (also mentions and tags)\n- Add pinned tag in \"any\" to avoid to lose it when renaming timeline\n\nFixed:\n- Links to messages not handled by the app\n- CW when editing a message\n- Fix push notifications with several accounts\n- New messages or edition notifications not pushed\n- Fix quotes with tags/mentions\n- Fix notifications\n- Fix sending multiple media\n- Fix crashes" diff --git a/app/src/main/java/app/fedilab/android/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/BaseMainActivity.java index 43b4ddb3b..ff7cffd95 100644 --- a/app/src/main/java/app/fedilab/android/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/BaseMainActivity.java @@ -23,11 +23,13 @@ import static app.fedilab.android.ui.drawer.StatusAdapter.sendAction; import android.Manifest; import android.annotation.SuppressLint; +import android.app.SearchManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; +import android.database.MatrixCursor; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -35,6 +37,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.provider.BaseColumns; import android.text.Editable; import android.text.Html; import android.text.TextWatcher; @@ -63,6 +66,7 @@ import androidx.appcompat.widget.SearchView; import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityOptionsCompat; import androidx.core.view.GravityCompat; +import androidx.cursoradapter.widget.CursorAdapter; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.ViewModelProvider; @@ -75,7 +79,9 @@ import androidx.preference.PreferenceManager; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.gif.GifDrawable; +import com.bumptech.glide.request.FutureTarget; import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.transition.Transition; import com.google.android.material.snackbar.Snackbar; import com.google.android.material.tabs.TabLayout; @@ -91,6 +97,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Objects; +import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -129,6 +136,7 @@ import app.fedilab.android.client.entities.api.Filter; import app.fedilab.android.client.entities.api.Instance; import app.fedilab.android.client.entities.api.MastodonList; import app.fedilab.android.client.entities.api.Status; +import app.fedilab.android.client.entities.api.Tag; import app.fedilab.android.client.entities.app.Account; import app.fedilab.android.client.entities.app.BaseAccount; import app.fedilab.android.client.entities.app.BottomMenu; @@ -146,12 +154,15 @@ import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MastodonHelper; import app.fedilab.android.helper.PinnedTimelineHelper; import app.fedilab.android.helper.PushHelper; +import app.fedilab.android.ui.drawer.AccountsSearchTopBarAdapter; +import app.fedilab.android.ui.drawer.TagSearchTopBarAdapter; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonConversation; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonTimeline; import app.fedilab.android.ui.fragment.timeline.FragmentNotificationContainer; import app.fedilab.android.viewmodel.mastodon.AccountsVM; import app.fedilab.android.viewmodel.mastodon.FiltersVM; import app.fedilab.android.viewmodel.mastodon.InstancesVM; +import app.fedilab.android.viewmodel.mastodon.SearchVM; import app.fedilab.android.viewmodel.mastodon.TimelinesVM; import app.fedilab.android.viewmodel.mastodon.TopBarVM; import es.dmoral.toasty.Toasty; @@ -777,6 +788,75 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt @Override public boolean onQueryTextChange(String newText) { + String pattern = "^(@[\\w_-]+@[a-z0-9.\\-]+|@[\\w_-]+)"; + final Pattern mentionPattern = Pattern.compile(pattern); + String patternTag = "^#([\\w-]{2,})$"; + final Pattern tagPattern = Pattern.compile(patternTag); + Matcher matcherMention, matcherTag; + matcherMention = mentionPattern.matcher(newText); + matcherTag = tagPattern.matcher(newText); + if (newText.trim().isEmpty()) { + binding.toolbarSearch.setSuggestionsAdapter(null); + } + if (matcherMention.matches()) { + String[] from = new String[]{SearchManager.SUGGEST_COLUMN_ICON_1, SearchManager.SUGGEST_COLUMN_TEXT_1}; + int[] to = new int[]{R.id.account_pp, R.id.account_un}; + String searchGroup = matcherMention.group(); + AccountsVM accountsVM = new ViewModelProvider(BaseMainActivity.this).get(AccountsVM.class); + MatrixCursor cursor = new MatrixCursor(new String[]{BaseColumns._ID, + SearchManager.SUGGEST_COLUMN_ICON_1, + SearchManager.SUGGEST_COLUMN_TEXT_1}); + accountsVM.searchAccounts(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, searchGroup, 5, false, false) + .observe(BaseMainActivity.this, accounts -> { + if (accounts == null) { + return; + } + AccountsSearchTopBarAdapter cursorAdapter = new AccountsSearchTopBarAdapter(BaseMainActivity.this, accounts, R.layout.drawer_account_search, null, from, to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); + binding.toolbarSearch.setSuggestionsAdapter(cursorAdapter); + new Thread(() -> { + int i = 0; + for (app.fedilab.android.client.entities.api.Account account : accounts) { + FutureTarget<File> futureTarget = Glide + .with(BaseMainActivity.this.getApplicationContext()) + .load(account.avatar_static) + .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); + File cacheFile; + try { + cacheFile = futureTarget.get(); + cursor.addRow(new String[]{String.valueOf(i), cacheFile.getAbsolutePath(), "@" + account.acct}); + i++; + } catch (ExecutionException | InterruptedException e) { + e.printStackTrace(); + } + } + runOnUiThread(() -> cursorAdapter.changeCursor(cursor)); + }).start(); + + }); + } else if (matcherTag.matches()) { + SearchVM searchVM = new ViewModelProvider(BaseMainActivity.this).get(SearchVM.class); + String[] from = new String[]{SearchManager.SUGGEST_COLUMN_TEXT_1}; + int[] to = new int[]{R.id.tag_name}; + String searchGroup = matcherTag.group(); + MatrixCursor cursor = new MatrixCursor(new String[]{BaseColumns._ID, + SearchManager.SUGGEST_COLUMN_TEXT_1}); + searchVM.search(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, searchGroup, null, + "hashtags", false, true, false, 0, + null, null, 10).observe(BaseMainActivity.this, + results -> { + if (results == null || results.hashtags == null) { + return; + } + TagSearchTopBarAdapter cursorAdapter = new TagSearchTopBarAdapter(BaseMainActivity.this, results.hashtags, R.layout.drawer_tag_search, null, from, to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); + binding.toolbarSearch.setSuggestionsAdapter(cursorAdapter); + int i = 0; + for (Tag tag : results.hashtags) { + cursor.addRow(new String[]{String.valueOf(i), "#" + tag.name}); + i++; + } + runOnUiThread(() -> cursorAdapter.changeCursor(cursor)); + }); + } return false; } }); diff --git a/app/src/main/java/app/fedilab/android/activities/HashTagActivity.java b/app/src/main/java/app/fedilab/android/activities/HashTagActivity.java index af6b0c533..4843f4670 100644 --- a/app/src/main/java/app/fedilab/android/activities/HashTagActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/HashTagActivity.java @@ -105,21 +105,22 @@ public class HashTagActivity extends BaseActivity { }); ReorderVM reorderVM = new ViewModelProvider(HashTagActivity.this).get(ReorderVM.class); reorderVM.getAllPinned().observe(HashTagActivity.this, pinned -> { - if (pinned != null) { - this.pinned = pinned; - pinnedTag = false; - if (pinned.pinnedTimelines != null) { - for (PinnedTimeline pinnedTimeline : pinned.pinnedTimelines) { - if (pinnedTimeline.tagTimeline != null) { - if (pinnedTimeline.tagTimeline.name.equalsIgnoreCase(stripTag)) { - this.pinnedTimeline = pinnedTimeline; - pinnedTag = true; - break; - } + if (pinned == null) { + pinned = new Pinned(); + pinned.pinnedTimelines = new ArrayList<>(); + } + pinnedTag = false; + if (pinned.pinnedTimelines != null) { + for (PinnedTimeline pinnedTimeline : pinned.pinnedTimelines) { + if (pinnedTimeline.tagTimeline != null) { + if (pinnedTimeline.tagTimeline.name.equalsIgnoreCase(stripTag)) { + this.pinnedTimeline = pinnedTimeline; + pinnedTag = true; + break; } } - invalidateOptionsMenu(); } + invalidateOptionsMenu(); } }); if (MainActivity.filterFetched && MainActivity.mainFilters != null) { diff --git a/app/src/main/java/app/fedilab/android/activities/SearchResultTabActivity.java b/app/src/main/java/app/fedilab/android/activities/SearchResultTabActivity.java index 2e6584a83..0f9c732a7 100644 --- a/app/src/main/java/app/fedilab/android/activities/SearchResultTabActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/SearchResultTabActivity.java @@ -16,7 +16,9 @@ package app.fedilab.android.activities; import android.app.SearchManager; import android.content.Context; +import android.database.MatrixCursor; import android.os.Bundle; +import android.provider.BaseColumns; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -26,22 +28,38 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.widget.SearchView; +import androidx.cursoradapter.widget.CursorAdapter; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.lifecycle.ViewModelProvider; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.FutureTarget; +import com.bumptech.glide.request.target.Target; import com.google.android.material.tabs.TabLayout; import org.jetbrains.annotations.NotNull; +import java.io.File; +import java.util.concurrent.ExecutionException; +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.Tag; import app.fedilab.android.databinding.ActivitySearchResultTabsBinding; import app.fedilab.android.helper.Helper; +import app.fedilab.android.ui.drawer.AccountsSearchTopBarAdapter; +import app.fedilab.android.ui.drawer.TagSearchTopBarAdapter; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonAccount; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonTag; import app.fedilab.android.ui.fragment.timeline.FragmentMastodonTimeline; +import app.fedilab.android.viewmodel.mastodon.AccountsVM; +import app.fedilab.android.viewmodel.mastodon.SearchVM; import es.dmoral.toasty.Toasty; @@ -140,6 +158,75 @@ public class SearchResultTabActivity extends BaseBarActivity { @Override public boolean onQueryTextChange(String newText) { + String pattern = "^(@[\\w_-]+@[a-z0-9.\\-]+|@[\\w_-]+)"; + final Pattern mentionPattern = Pattern.compile(pattern); + String patternTag = "^#([\\w-]{2,})$"; + final Pattern tagPattern = Pattern.compile(patternTag); + Matcher matcherMention, matcherTag; + matcherMention = mentionPattern.matcher(newText); + matcherTag = tagPattern.matcher(newText); + if (newText.trim().isEmpty()) { + searchView.setSuggestionsAdapter(null); + } + if (matcherMention.matches()) { + String[] from = new String[]{SearchManager.SUGGEST_COLUMN_ICON_1, SearchManager.SUGGEST_COLUMN_TEXT_1}; + int[] to = new int[]{R.id.account_pp, R.id.account_un}; + String searchGroup = matcherMention.group(); + AccountsVM accountsVM = new ViewModelProvider(SearchResultTabActivity.this).get(AccountsVM.class); + MatrixCursor cursor = new MatrixCursor(new String[]{BaseColumns._ID, + SearchManager.SUGGEST_COLUMN_ICON_1, + SearchManager.SUGGEST_COLUMN_TEXT_1}); + accountsVM.searchAccounts(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, searchGroup, 5, false, false) + .observe(SearchResultTabActivity.this, accounts -> { + if (accounts == null) { + return; + } + AccountsSearchTopBarAdapter cursorAdapter = new AccountsSearchTopBarAdapter(SearchResultTabActivity.this, accounts, R.layout.drawer_account_search, null, from, to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); + searchView.setSuggestionsAdapter(cursorAdapter); + new Thread(() -> { + int i = 0; + for (app.fedilab.android.client.entities.api.Account account : accounts) { + FutureTarget<File> futureTarget = Glide + .with(SearchResultTabActivity.this.getApplicationContext()) + .load(account.avatar_static) + .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); + File cacheFile; + try { + cacheFile = futureTarget.get(); + cursor.addRow(new String[]{String.valueOf(i), cacheFile.getAbsolutePath(), "@" + account.acct}); + i++; + } catch (ExecutionException | InterruptedException e) { + e.printStackTrace(); + } + } + runOnUiThread(() -> cursorAdapter.changeCursor(cursor)); + }).start(); + + }); + } else if (matcherTag.matches()) { + SearchVM searchVM = new ViewModelProvider(SearchResultTabActivity.this).get(SearchVM.class); + String[] from = new String[]{SearchManager.SUGGEST_COLUMN_TEXT_1}; + int[] to = new int[]{R.id.tag_name}; + String searchGroup = matcherTag.group(); + MatrixCursor cursor = new MatrixCursor(new String[]{BaseColumns._ID, + SearchManager.SUGGEST_COLUMN_TEXT_1}); + searchVM.search(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, searchGroup, null, + "hashtags", false, true, false, 0, + null, null, 10).observe(SearchResultTabActivity.this, + results -> { + if (results == null || results.hashtags == null) { + return; + } + TagSearchTopBarAdapter cursorAdapter = new TagSearchTopBarAdapter(SearchResultTabActivity.this, results.hashtags, R.layout.drawer_tag_search, null, from, to, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); + searchView.setSuggestionsAdapter(cursorAdapter); + int i = 0; + for (Tag tag : results.hashtags) { + cursor.addRow(new String[]{String.valueOf(i), "#" + tag.name}); + i++; + } + runOnUiThread(() -> cursorAdapter.changeCursor(cursor)); + }); + } return false; } }); @@ -188,6 +275,10 @@ public class SearchResultTabActivity extends BaseBarActivity { } + public void moveToAccount() { + binding.searchViewpager.setCurrentItem(1); + } + /** * Pager adapter for the 4 fragments */ diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Attachment.java b/app/src/main/java/app/fedilab/android/client/entities/api/Attachment.java index f569a2422..0ccbacc27 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Attachment.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Attachment.java @@ -45,13 +45,14 @@ public class Attachment implements Serializable { public String local_path; @SerializedName("meta") public Meta meta; + @SerializedName("sensitive") + public boolean sensitive = false; public String peertubeHost = null; public String peertubeId = null; public String focus = null; public String translation = null; - public float measuredWidth = -1.f; public static class Meta implements Serializable { @SerializedName("focus") diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index 310edb0d4..2d31e6059 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -522,9 +522,8 @@ public class Helper { long months = days / 30; long years = days / 365; - String format = DateFormat.getDateInstance(DateFormat.SHORT).format(date); if (years > 0) { - return format; + return DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault()).format(date); } else if (months > 0 || days > 7) { //Removes the year depending of the locale from DateFormat.SHORT format SimpleDateFormat df = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault()); diff --git a/app/src/main/java/app/fedilab/android/helper/MediaHelper.java b/app/src/main/java/app/fedilab/android/helper/MediaHelper.java index 770436b5f..b6f65f7c7 100644 --- a/app/src/main/java/app/fedilab/android/helper/MediaHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/MediaHelper.java @@ -94,30 +94,14 @@ public class MediaHelper { try { request = new DownloadManager.Request(Uri.parse(url.trim())); } catch (Exception e) { + e.printStackTrace(); Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); return -1; } try { String mime = getMimeType(url); - final String fileName = URLUtil.guessFileName(url, null, null); request.allowScanningByMediaScanner(); - String myDir; - if (mime.toLowerCase().startsWith("video")) { - myDir = Environment.DIRECTORY_MOVIES + "/" + context.getString(R.string.app_name); - } else if (mime.toLowerCase().startsWith("audio")) { - myDir = Environment.DIRECTORY_MUSIC + "/" + context.getString(R.string.app_name); - } else { - myDir = Environment.DIRECTORY_DOWNLOADS; - } - - if (!new File(myDir).exists()) { - boolean created = new File(myDir).mkdir(); - if (!created) { - Toasty.error(context, context.getString(R.string.toast_error), Toasty.LENGTH_SHORT).show(); - return -1; - } - } if (mime.toLowerCase().startsWith("video")) { request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MOVIES, context.getString(R.string.app_name) + "/" + fileName); } else if (mime.toLowerCase().startsWith("audio")) { diff --git a/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java b/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java index f95e42c38..7a39946da 100644 --- a/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/PinnedTimelineHelper.java @@ -464,6 +464,11 @@ public class PinnedTimelineHelper { break; case NITTER: item.setIcon(R.drawable.nitter); + if (pinnedTimeline.remoteInstance.displayName.trim().length() > 0) { + item.setTitle(pinnedTimeline.remoteInstance.displayName); + } else { + item.setTitle(pinnedTimeline.remoteInstance.host); + } break; } break; diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java index f53c1172a..e030eeae9 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -99,7 +99,9 @@ public class SpannableHelper { public static Spannable convert(Context context, String text, Status status, Account account, Announcement announcement, WeakReference<View> viewWeakReference, Status.Callback callback) { - + if (text == null) { + return null; + } SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); int currentNightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; boolean customLight = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_LIGHT_COLORS), false); diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/AccountsSearchTopBarAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/AccountsSearchTopBarAdapter.java new file mode 100644 index 000000000..6de07a1b3 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/ui/drawer/AccountsSearchTopBarAdapter.java @@ -0,0 +1,79 @@ +package app.fedilab.android.ui.drawer; +/* 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.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.appcompat.widget.LinearLayoutCompat; +import androidx.core.app.ActivityOptionsCompat; +import androidx.cursoradapter.widget.SimpleCursorAdapter; + +import java.util.List; + +import app.fedilab.android.R; +import app.fedilab.android.activities.ProfileActivity; +import app.fedilab.android.client.entities.api.Account; +import app.fedilab.android.helper.Helper; + + +public class AccountsSearchTopBarAdapter extends SimpleCursorAdapter { + + private final int layout; + private final LayoutInflater inflater; + private final List<Account> accountList; + + public AccountsSearchTopBarAdapter(Context context, List<Account> accounts, int layout, Cursor c, String[] from, int[] to, int flags) { + super(context, layout, c, from, to, flags); + this.layout = layout; + this.inflater = LayoutInflater.from(context); + this.accountList = accounts; + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return inflater.inflate(layout, null); + } + + + @Override + public void bindView(View view, Context context, Cursor cursor) { + super.bindView(view, context, cursor); + + LinearLayoutCompat container = view.findViewById(R.id.account_container); + container.setTag(cursor.getPosition()); + ImageView account_pp = view.findViewById(R.id.account_pp); + container.setOnClickListener(v -> { + int position = (int) v.getTag(); + if (accountList != null && accountList.size() > position) { + Intent intent = new Intent(context, ProfileActivity.class); + Bundle b = new Bundle(); + b.putSerializable(Helper.ARG_ACCOUNT, accountList.get(position)); + intent.putExtras(b); + ActivityOptionsCompat options = ActivityOptionsCompat + .makeSceneTransitionAnimation((Activity) context, account_pp, context.getString(R.string.activity_porfile_pp)); + // start the new activity + context.startActivity(intent, options.toBundle()); |