From 42dc06f6cc9cc07018a377dbc29832d5850840f5 Mon Sep 17 00:00:00 2001 From: LucasGGamerM Date: Tue, 19 Nov 2024 16:00:46 -0300 Subject: [PATCH] chore: readd the CustomWelcomeFragment --- .../joinmastodon/android/MainActivity.java | 3 +- .../onboarding/CustomWelcomeFragment.java | 251 ++++++++++++++++++ .../onboarding/InstanceCatalogFragment.java | 2 +- mastodon/src/main/res/drawable/logo.xml | 31 +++ .../src/main/res/drawable/rounded_box.xml | 5 + .../res/layout/fragment_welcome_custom.xml | 60 +++++ .../main/res/layout/header_welcome_custom.xml | 58 ++++ .../main/res/layout/item_instance_custom.xml | 88 ++++++ 8 files changed, 496 insertions(+), 2 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/CustomWelcomeFragment.java create mode 100644 mastodon/src/main/res/drawable/logo.xml create mode 100644 mastodon/src/main/res/drawable/rounded_box.xml create mode 100644 mastodon/src/main/res/layout/fragment_welcome_custom.xml create mode 100644 mastodon/src/main/res/layout/header_welcome_custom.xml create mode 100644 mastodon/src/main/res/layout/item_instance_custom.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java b/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java index 3afb33dbc..014dd9db9 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java +++ b/mastodon/src/main/java/org/joinmastodon/android/MainActivity.java @@ -24,6 +24,7 @@ import org.joinmastodon.android.fragments.ProfileFragment; import org.joinmastodon.android.fragments.SplashFragment; import org.joinmastodon.android.fragments.ThreadFragment; import org.joinmastodon.android.fragments.onboarding.AccountActivationFragment; +import org.joinmastodon.android.fragments.onboarding.CustomWelcomeFragment; import org.joinmastodon.android.model.Notification; import org.joinmastodon.android.model.SearchResults; import org.joinmastodon.android.ui.utils.UiUtils; @@ -183,7 +184,7 @@ public class MainActivity extends FragmentStackActivity{ public void restartHomeFragment(){ if(AccountSessionManager.getInstance().getLoggedInAccounts().isEmpty()){ - showFragmentClearingBackStack(new SplashFragment()); + showFragmentClearingBackStack(new CustomWelcomeFragment()); }else{ AccountSessionManager.getInstance().maybeUpdateLocalInfo(); AccountSession session; diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/CustomWelcomeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/CustomWelcomeFragment.java new file mode 100644 index 000000000..95c7972c4 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/CustomWelcomeFragment.java @@ -0,0 +1,251 @@ +package org.joinmastodon.android.fragments.onboarding; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.RadioButton; +import android.widget.Space; +import android.widget.TextView; +import android.widget.Toolbar; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.joinmastodon.android.R; +import org.joinmastodon.android.api.session.AccountSessionManager; +import org.joinmastodon.android.model.Instance; +import org.joinmastodon.android.model.catalog.CatalogInstance; +import org.joinmastodon.android.ui.BetterItemAnimator; +import org.joinmastodon.android.ui.utils.UiUtils; + +import java.util.ArrayList; +import java.util.Objects; + +import me.grishka.appkit.FragmentStackActivity; +import me.grishka.appkit.utils.BindableViewHolder; +import me.grishka.appkit.utils.MergeRecyclerAdapter; +import me.grishka.appkit.utils.SingleViewRecyclerAdapter; +import me.grishka.appkit.utils.V; +import me.grishka.appkit.views.UsableRecyclerView; + +public class CustomWelcomeFragment extends InstanceCatalogFragment { + private View headerView; + protected MergeRecyclerAdapter mergeAdapter; + + public CustomWelcomeFragment() { + super(R.layout.fragment_welcome_custom, 1); + } + + @Override + public void onAttach(Context context){ + super.onAttach(context); + setRefreshEnabled(false); + } + + @Override + public void onCreate(Bundle savedInstanceState){ + super.onCreate(savedInstanceState); + dataLoaded(); + } + + @Override + protected void onUpdateToolbar(){ + super.onUpdateToolbar(); + + if (!canGoBack()) { + ImageView toolbarLogo=new ImageView(getActivity()); + toolbarLogo.setScaleType(ImageView.ScaleType.CENTER); + toolbarLogo.setImageResource(R.drawable.logo); + toolbarLogo.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary))); + + FrameLayout logoWrap=new FrameLayout(getActivity()); + FrameLayout.LayoutParams logoParams=new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER); + logoParams.setMargins(0, V.dp(2), 0, 0); + logoWrap.addView(toolbarLogo, logoParams); + + getToolbar().addView(logoWrap, new Toolbar.LayoutParams(Gravity.CENTER)); + } else { + setTitle(R.string.add_account); + } + } + + @Override + protected void proceedWithAuthOrSignup(Instance instance) { + AccountSessionManager.getInstance().authenticate(getActivity(), instance); + } + + @Override + protected void updateFilteredList(){ + String query=getCurrentSearchQuery(); + boolean addFakeInstance=query.length()>0 && query.matches("^\\S+\\.[^\\.]+$"); + if(addFakeInstance){ + fakeInstance.domain=fakeInstance.normalizedDomain=query; + fakeInstance.description=getString(R.string.loading_instance); + if(filteredData.size()>0 && filteredData.get(0)==fakeInstance){ + if(list.findViewHolderForAdapterPosition(1) instanceof InstanceViewHolder ivh){ + ivh.rebind(); + } + } + if(filteredData.isEmpty()){ + filteredData.add(fakeInstance); + adapter.notifyItemInserted(0); + } + } + ArrayList prevData=new ArrayList<>(filteredData); + filteredData.clear(); + if(query.length()>0){ + boolean foundExactMatch=false; + for(CatalogInstance inst:data){ + if(inst.normalizedDomain.contains(query)){ + filteredData.add(inst); + if(inst.normalizedDomain.equals(query)) + foundExactMatch=true; + } + } + if(!foundExactMatch && addFakeInstance) { + filteredData.add(0, fakeInstance); + adapter.notifyItemChanged(0); + } + } + UiUtils.updateList(prevData, filteredData, list, adapter, Objects::equals); + for(int i=0;i0 ? parts[parts.length-1] : ""; + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + view.setBackgroundColor(UiUtils.getThemeColor(getActivity(), R.attr.colorM3Surface)); + list.setItemAnimator(new BetterItemAnimator()); + ((UsableRecyclerView) list).setSelector(null); + } + + @Override + protected void doLoadData(int offset, int count) {} + + @Override + protected RecyclerView.Adapter getAdapter(){ + headerView=getActivity().getLayoutInflater().inflate(R.layout.header_welcome_custom, list, false); + searchEdit=headerView.findViewById(R.id.search_edit); + searchEdit.setOnEditorActionListener(this::onSearchEnterPressed); + + headerView.findViewById(R.id.more).setVisibility(View.GONE); +// headerView.findViewById(R.id.visibility).setVisibility(View.GONE); +// headerView.findViewById(R.id.unread_indicator).setVisibility(View.GONE); +// headerView.findViewById(R.id.separator).setVisibility(View.GONE); +// headerView.findViewById(R.id.time).setVisibility(View.GONE); + // FIXME: make a custom header + ((TextView) headerView.findViewById(R.id.time_and_username)).setText(R.string.mo_app_username); + ((TextView) headerView.findViewById(R.id.name)).setText(R.string.mo_app_name); + ((ImageView) headerView.findViewById(R.id.avatar)).setImageDrawable(getActivity().getDrawable(R.mipmap.ic_launcher)); + ((FragmentStackActivity) getActivity()).invalidateSystemBarColors(this); + + searchEdit.addTextChangedListener(new TextWatcher(){ + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after){} + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count){ + nextButton.setEnabled(false); + chosenInstance = null; + searchEdit.removeCallbacks(searchDebouncer); + searchEdit.postDelayed(searchDebouncer, 300); + } + + @Override + public void afterTextChanged(Editable s){} + }); + + mergeAdapter=new MergeRecyclerAdapter(); + mergeAdapter.addAdapter(new SingleViewRecyclerAdapter(headerView)); + mergeAdapter.addAdapter(adapter=new InstancesAdapter()); + View spacer = new Space(getActivity()); + spacer.setMinimumHeight(V.dp(8)); + mergeAdapter.addAdapter(new SingleViewRecyclerAdapter(spacer)); + return mergeAdapter; + } + + private class InstancesAdapter extends UsableRecyclerView.Adapter { + public InstancesAdapter(){ + super(imgLoader); + } + + @NonNull + @Override + public InstanceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ + return new InstanceViewHolder(); + } + + @Override + public void onBindViewHolder(InstanceViewHolder holder, int position){ + holder.bind(filteredData.get(position)); + chosenInstance = filteredData.get(position); + if (chosenInstance != fakeInstance) nextButton.setEnabled(true); + super.onBindViewHolder(holder, position); + } + + @Override + public int getItemCount(){ + return filteredData.size(); + } + + @Override + public int getItemViewType(int position){ + return -1; + } + } + + private class InstanceViewHolder extends BindableViewHolder implements UsableRecyclerView.Clickable{ + private final TextView title, description, userCount, lang; + + public InstanceViewHolder(){ + super(getActivity(), R.layout.item_instance_custom, list); + title=findViewById(R.id.title); + description=findViewById(R.id.description); + userCount=findViewById(R.id.user_count); + lang=findViewById(R.id.lang); + if(Build.VERSION.SDK_INT + + + + + + + + + diff --git a/mastodon/src/main/res/drawable/rounded_box.xml b/mastodon/src/main/res/drawable/rounded_box.xml new file mode 100644 index 000000000..02fc62d8c --- /dev/null +++ b/mastodon/src/main/res/drawable/rounded_box.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/layout/fragment_welcome_custom.xml b/mastodon/src/main/res/layout/fragment_welcome_custom.xml new file mode 100644 index 000000000..65d3d5205 --- /dev/null +++ b/mastodon/src/main/res/layout/fragment_welcome_custom.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + +