From c5b73667138824ca043a06842c970f6179dd8bf0 Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Fri, 4 Jul 2025 08:29:54 -0500 Subject: [PATCH] Converted welcome activity / pager to kotlin --- .../fr/free/nrw/commons/WelcomeActivity.java | 109 ------------------ .../fr/free/nrw/commons/WelcomeActivity.kt | 78 +++++++++++++ .../free/nrw/commons/WelcomePagerAdapter.java | 77 ------------- .../free/nrw/commons/WelcomePagerAdapter.kt | 70 +++++++++++ .../nrw/commons/contributions/MainActivity.kt | 4 +- .../commons/navtab/MoreBottomSheetFragment.kt | 4 +- 6 files changed, 152 insertions(+), 190 deletions(-) delete mode 100644 app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java create mode 100644 app/src/main/java/fr/free/nrw/commons/WelcomeActivity.kt delete mode 100644 app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java create mode 100644 app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.kt diff --git a/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java b/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java deleted file mode 100644 index c8cedfef1..000000000 --- a/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.java +++ /dev/null @@ -1,109 +0,0 @@ -package fr.free.nrw.commons; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import fr.free.nrw.commons.databinding.ActivityWelcomeBinding; -import fr.free.nrw.commons.databinding.PopupForCopyrightBinding; -import fr.free.nrw.commons.quiz.QuizActivity; -import fr.free.nrw.commons.theme.BaseActivity; -import fr.free.nrw.commons.utils.ConfigUtils; - -public class WelcomeActivity extends BaseActivity { - - private ActivityWelcomeBinding binding; - private PopupForCopyrightBinding copyrightBinding; - - private final WelcomePagerAdapter adapter = new WelcomePagerAdapter(); - private boolean isQuiz; - private AlertDialog.Builder dialogBuilder; - private AlertDialog dialog; - - /** - * Initialises exiting fields and dependencies - * - * @param savedInstanceState WelcomeActivity bundled data - */ - @Override - public void onCreate(final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - binding = ActivityWelcomeBinding.inflate(getLayoutInflater()); - final View view = binding.getRoot(); - setContentView(view); - - if (getIntent() != null) { - final Bundle bundle = getIntent().getExtras(); - if (bundle != null) { - isQuiz = bundle.getBoolean("isQuiz"); - } - } else { - isQuiz = false; - } - - // Enable skip button if beta flavor - if (ConfigUtils.isBetaFlavour()) { - binding.finishTutorialButton.setVisibility(View.VISIBLE); - - dialogBuilder = new AlertDialog.Builder(this); - copyrightBinding = PopupForCopyrightBinding.inflate(getLayoutInflater()); - final View contactPopupView = copyrightBinding.getRoot(); - dialogBuilder.setView(contactPopupView); - dialogBuilder.setCancelable(false); - dialog = dialogBuilder.create(); - dialog.show(); - - copyrightBinding.buttonOk.setOnClickListener(v -> dialog.dismiss()); - } - - binding.welcomePager.setAdapter(adapter); - binding.welcomePagerIndicator.setViewPager(binding.welcomePager); - - binding.finishTutorialButton.setOnClickListener(v -> finishTutorial()); - - } - - /** - * References WelcomePageAdapter to null before the activity is destroyed - */ - @Override - public void onDestroy() { - if (isQuiz) { - final Intent i = new Intent(this, QuizActivity.class); - startActivity(i); - } - super.onDestroy(); - } - - /** - * Creates a way to change current activity to WelcomeActivity - * - * @param context Activity context - */ - public static void startYourself(final Context context) { - final Intent welcomeIntent = new Intent(context, WelcomeActivity.class); - context.startActivity(welcomeIntent); - } - - /** - * Override onBackPressed() to go to previous tutorial 'pages' if not on first page - */ - @Override - public void onBackPressed() { - if (binding.welcomePager.getCurrentItem() != 0) { - binding.welcomePager.setCurrentItem(binding.welcomePager.getCurrentItem() - 1, true); - } else { - if (defaultKvStore.getBoolean("firstrun", true)) { - finishAffinity(); - } else { - super.onBackPressed(); - } - } - } - - public void finishTutorial() { - defaultKvStore.putBoolean("firstrun", false); - finish(); - } -} diff --git a/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.kt b/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.kt new file mode 100644 index 000000000..439ed1e92 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/WelcomeActivity.kt @@ -0,0 +1,78 @@ +package fr.free.nrw.commons + +import android.app.AlertDialog +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import fr.free.nrw.commons.databinding.ActivityWelcomeBinding +import fr.free.nrw.commons.databinding.PopupForCopyrightBinding +import fr.free.nrw.commons.quiz.QuizActivity +import fr.free.nrw.commons.theme.BaseActivity +import fr.free.nrw.commons.utils.ConfigUtils.isBetaFlavour + +class WelcomeActivity : BaseActivity() { + private var binding: ActivityWelcomeBinding? = null + private var isQuiz = false + + /** + * Initialises exiting fields and dependencies + * + * @param savedInstanceState WelcomeActivity bundled data + */ + public override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityWelcomeBinding.inflate(layoutInflater) + setContentView(binding!!.root) + + isQuiz = intent?.extras?.getBoolean("isQuiz", false) ?: false + + // Enable skip button if beta flavor + if (isBetaFlavour) { + binding!!.finishTutorialButton.visibility = View.VISIBLE + + val copyrightBinding = PopupForCopyrightBinding.inflate(layoutInflater) + + val dialog = AlertDialog.Builder(this) + .setView(copyrightBinding.root) + .setCancelable(false) + .create() + dialog.show() + + copyrightBinding.buttonOk.setOnClickListener { v: View? -> dialog.dismiss() } + } + + val adapter = WelcomePagerAdapter() + binding!!.welcomePager.adapter = adapter + binding!!.welcomePagerIndicator.setViewPager(binding!!.welcomePager) + binding!!.finishTutorialButton.setOnClickListener { v: View? -> finishTutorial() } + } + + public override fun onDestroy() { + if (isQuiz) { + startActivity(Intent(this, QuizActivity::class.java)) + } + super.onDestroy() + } + + override fun onBackPressed() { + if (binding!!.welcomePager.currentItem != 0) { + binding!!.welcomePager.setCurrentItem(binding!!.welcomePager.currentItem - 1, true) + } else { + if (defaultKvStore.getBoolean("firstrun", true)) { + finishAffinity() + } else { + super.onBackPressed() + } + } + } + + fun finishTutorial() { + defaultKvStore.putBoolean("firstrun", false) + finish() + } +} + +fun Context.startWelcome() { + startActivity(Intent(this, WelcomeActivity::class.java)) +} diff --git a/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java b/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java deleted file mode 100644 index a9b7381df..000000000 --- a/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.java +++ /dev/null @@ -1,77 +0,0 @@ -package fr.free.nrw.commons; - -import static fr.free.nrw.commons.utils.UrlUtilsKt.handleWebUrl; - -import android.net.Uri; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.viewpager.widget.PagerAdapter; -import fr.free.nrw.commons.utils.UnderlineUtils; - -public class WelcomePagerAdapter extends PagerAdapter { - private static final int[] PAGE_LAYOUTS = new int[]{ - R.layout.welcome_wikipedia, - R.layout.welcome_do_upload, - R.layout.welcome_dont_upload, - R.layout.welcome_image_example, - R.layout.welcome_final - }; - - /** - * Gets total number of layouts - * @return Number of layouts - */ - @Override - public int getCount() { - return PAGE_LAYOUTS.length; - } - - /** - * Compares given view with provided object - * @param view Adapter view - * @param object Adapter object - * @return Equality between view and object - */ - @Override - public boolean isViewFromObject(View view, Object object) { - return (view == object); - } - - @Override - public Object instantiateItem(ViewGroup container, int position) { - LayoutInflater inflater = LayoutInflater.from(container.getContext()); - ViewGroup layout = (ViewGroup) inflater.inflate(PAGE_LAYOUTS[position], container, false); - - // If final page - if (position == PAGE_LAYOUTS.length - 1) { - // Add link to more information - TextView moreInfo = layout.findViewById(R.id.welcomeInfo); - UnderlineUtils.setUnderlinedText(moreInfo, R.string.welcome_help_button_text); - moreInfo.setOnClickListener(view -> handleWebUrl( - container.getContext(), - Uri.parse("https://commons.wikimedia.org/wiki/Help:Contents") - )); - - // Handle click of finishTutorialButton ("YES!" button) inside layout - layout.findViewById(R.id.finishTutorialButton) - .setOnClickListener(view -> ((WelcomeActivity) container.getContext()).finishTutorial()); - } - - container.addView(layout); - return layout; - } - - /** - * Provides a way to remove an item from container - * @param container Adapter view group container - * @param position Index of item - * @param obj Adapter object - */ - @Override - public void destroyItem(ViewGroup container, int position, Object obj) { - container.removeView((View) obj); - } -} diff --git a/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.kt b/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.kt new file mode 100644 index 000000000..0cb88c48b --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/WelcomePagerAdapter.kt @@ -0,0 +1,70 @@ +package fr.free.nrw.commons + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.core.net.toUri +import androidx.viewpager.widget.PagerAdapter +import fr.free.nrw.commons.utils.UnderlineUtils.setUnderlinedText +import fr.free.nrw.commons.utils.handleWebUrl + +class WelcomePagerAdapter : PagerAdapter() { + /** + * Gets total number of layouts + * @return Number of layouts + */ + override fun getCount(): Int = PAGE_LAYOUTS.size + + /** + * Compares given view with provided object + * @param view Adapter view + * @param obj Adapter object + * @return Equality between view and object + */ + override fun isViewFromObject(view: View, obj: Any): Boolean = (view === obj) + + /** + * Provides a way to remove an item from container + * @param container Adapter view group container + * @param position Index of item + * @param obj Adapter object + */ + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) = + container.removeView(obj as View) + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val inflater = LayoutInflater.from(container.context) + val layout = inflater.inflate(PAGE_LAYOUTS[position], container, false) as ViewGroup + + // If final page + if (position == PAGE_LAYOUTS.size - 1) { + // Add link to more information + val moreInfo = layout.findViewById(R.id.welcomeInfo) + setUnderlinedText(moreInfo, R.string.welcome_help_button_text) + moreInfo.setOnClickListener { + handleWebUrl( + container.context, + "https://commons.wikimedia.org/wiki/Help:Contents".toUri() + ) + } + + // Handle click of finishTutorialButton ("YES!" button) inside layout + layout.findViewById(R.id.finishTutorialButton) + .setOnClickListener { view: View? -> (container.context as WelcomeActivity).finishTutorial() } + } + + container.addView(layout) + return layout + } + + companion object { + private val PAGE_LAYOUTS = intArrayOf( + R.layout.welcome_wikipedia, + R.layout.welcome_do_upload, + R.layout.welcome_dont_upload, + R.layout.welcome_image_example, + R.layout.welcome_final + ) + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt index a83532bdb..b9fa3e395 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt @@ -12,7 +12,6 @@ import androidx.fragment.app.FragmentManager import androidx.work.ExistingWorkPolicy import com.google.android.material.bottomnavigation.BottomNavigationView import fr.free.nrw.commons.R -import fr.free.nrw.commons.WelcomeActivity import fr.free.nrw.commons.auth.SessionManager import fr.free.nrw.commons.bookmarks.BookmarkFragment import fr.free.nrw.commons.contributions.ContributionsFragment.Companion.newInstance @@ -33,6 +32,7 @@ import fr.free.nrw.commons.notification.NotificationActivity.Companion.startYour import fr.free.nrw.commons.notification.NotificationController import fr.free.nrw.commons.quiz.QuizChecker import fr.free.nrw.commons.settings.SettingsFragment +import fr.free.nrw.commons.startWelcome import fr.free.nrw.commons.theme.BaseActivity import fr.free.nrw.commons.upload.UploadProgressActivity import fr.free.nrw.commons.upload.worker.WorkRequestHelper.Companion.makeOneTimeWorkRequest @@ -517,7 +517,7 @@ after opening the app. (!applicationKvStore!!.getBoolean("login_skipped")) ) { defaultKvStore.putBoolean("inAppCameraFirstRun", true) - WelcomeActivity.startYourself(this) + startWelcome() } retryAllFailedUploads() diff --git a/app/src/main/java/fr/free/nrw/commons/navtab/MoreBottomSheetFragment.kt b/app/src/main/java/fr/free/nrw/commons/navtab/MoreBottomSheetFragment.kt index 3f7a196fe..2d92855fc 100644 --- a/app/src/main/java/fr/free/nrw/commons/navtab/MoreBottomSheetFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/navtab/MoreBottomSheetFragment.kt @@ -18,7 +18,6 @@ import fr.free.nrw.commons.BuildConfig import fr.free.nrw.commons.CommonsApplication import fr.free.nrw.commons.CommonsApplication.ActivityLogoutListener import fr.free.nrw.commons.R -import fr.free.nrw.commons.WelcomeActivity import fr.free.nrw.commons.actions.PageEditClient import fr.free.nrw.commons.databinding.FragmentMoreBottomSheetBinding import fr.free.nrw.commons.di.ApplicationlessInjection @@ -32,6 +31,7 @@ import fr.free.nrw.commons.logging.CommonsLogSender import fr.free.nrw.commons.profile.ProfileActivity import fr.free.nrw.commons.review.ReviewActivity import fr.free.nrw.commons.settings.SettingsActivity +import fr.free.nrw.commons.startWelcome import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers @@ -241,7 +241,7 @@ class MoreBottomSheetFragment : BottomSheetDialogFragment() { } fun onTutorialClicked() { - WelcomeActivity.startYourself(requireActivity()) + requireContext().startWelcome() } fun onSettingsClicked() {