diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index acb88ff2716..8ed9afea212 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -263,6 +263,8 @@ + + { - FeedbackUtil.composeFeedbackEmail(requireContext(), - getString(R.string.email_report_patroller_tasks_subject), - getString(R.string.email_report_patroller_tasks_body)) + showFeedbackOptionsDialog(true) true } else -> false @@ -370,6 +387,15 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, L } } + private fun maybeShowOneTimeSequentialRecentEditsTooltips() { + if (Prefs.showOneTimeSequentialRecentEditsDiffTooltip && viewModel.fromRecentEdits && + binding.oresDamagingButton.isVisible && binding.oresGoodFaithButton.isVisible) { + Prefs.showOneTimeSequentialRecentEditsDiffTooltip = false + binding.scrollContainer.removeCallbacks(sequentialTooltipRunnable) + binding.scrollContainer.postDelayed(sequentialTooltipRunnable, 500) + } + } + private fun setErrorState(t: Throwable) { L.e(t) binding.errorView.setError(t) @@ -433,6 +459,8 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, L binding.oresGoodFaithButton.isVisible = true binding.oresGoodFaithButton.text = getString(R.string.edit_intent, ((it.ores?.goodfaithProb ?: 0f) * 100f).toInt().toString().plus("%")) binding.oresGoodFaithButton.setOnClickListener(openQualityAndIntentFiltersPage) + + maybeShowOneTimeSequentialRecentEditsTooltips() } } @@ -492,10 +520,34 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, L ExclusiveBottomSheetPresenter.show(childFragmentManager, WatchlistExpiryDialog.newInstance(expiry)) } } + snackbar.addCallback(object : Snackbar.Callback() { + override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { + if (!isAdded || viewModel.watchlistExpiryChanged) { + return + } + showFeedbackOptionsDialog() + } + }) snackbar.show() } } + private fun showThankSnackbar() { + val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.thank_success_message, + viewModel.revisionTo?.user)) + binding.thankIcon.setImageResource(R.drawable.ic_heart_24) + binding.thankButton.isEnabled = false + snackbar.addCallback(object : Snackbar.Callback() { + override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { + if (!isAdded) { + return + } + showFeedbackOptionsDialog() + } + }) + snackbar.show() + } + private fun showThankDialog() { val parent = FrameLayout(requireContext()) val dialog = MaterialAlertDialogBuilder(requireActivity()) @@ -521,6 +573,19 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, L dialog.show() } + private fun showUndoSnackbar() { + val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.revision_undo_success)) + snackbar.addCallback(object : Snackbar.Callback() { + override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { + if (!isAdded) { + return + } + showFeedbackOptionsDialog() + } + }) + snackbar.show() + } + private fun showRollbackDialog() { MaterialAlertDialogBuilder(requireActivity()) .setMessage(R.string.revision_rollback_dialog_title) @@ -534,6 +599,85 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, L .show() } + private fun showRollbackSnackbar() { + val snackbar = FeedbackUtil.makeSnackbar(requireActivity(), getString(R.string.revision_rollback_success)) + snackbar.addCallback(object : Snackbar.Callback() { + override fun onDismissed(transientBottomBar: Snackbar, @DismissEvent event: Int) { + if (!isAdded) { + return + } + showFeedbackOptionsDialog() + } + }) + snackbar.show() + } + + private fun showFeedbackOptionsDialog(skipPreference: Boolean = false) { + if (!skipPreference && !Prefs.showOneTimeRecentEditsFeedbackForm) { + return + } + + var dialog: AlertDialog? = null + val feedbackView = layoutInflater.inflate(R.layout.dialog_patrol_edit_feedback_options, null) + + val clickListener = View.OnClickListener { + viewModel.feedbackOption = (it as TextView).text.toString() + dialog?.dismiss() + if (viewModel.feedbackOption == getString(R.string.patroller_diff_feedback_dialog_option_satisfied)) { + // TODO: send to the event logging since it is satisfied + showFeedbackSnackbarAndTooltip() + } else { + showFeedbackInputDialog() + } + } + + feedbackView.findViewById(R.id.optionSatisfied).setOnClickListener(clickListener) + feedbackView.findViewById(R.id.optionNeutral).setOnClickListener(clickListener) + feedbackView.findViewById(R.id.optionUnsatisfied).setOnClickListener(clickListener) + + dialog = MaterialAlertDialogBuilder(requireActivity()) + .setTitle(R.string.patroller_diff_feedback_dialog_title) + .setCancelable(false) + .setView(feedbackView) + .show() + } + + private fun showFeedbackInputDialog() { + val feedbackView = layoutInflater.inflate(R.layout.dialog_patrol_edit_feedback_input, null) + val feedbackInput = feedbackView.findViewById(R.id.feedbackInput).text.toString() + MaterialAlertDialogBuilder(requireActivity()) + .setTitle(R.string.patroller_diff_feedback_dialog_feedback_title) + .setCancelable(false) + .setView(feedbackView) + .setPositiveButton(R.string.patroller_diff_feedback_dialog_submit) { _, _ -> + viewModel.feedbackInput = feedbackInput + // TODO: send to the event logging + showFeedbackSnackbarAndTooltip() + } + .show() + } + + private fun showFeedbackSnackbarAndTooltip() { + FeedbackUtil.showMessage(this@ArticleEditDetailsFragment, R.string.patroller_diff_feedback_submitted_snackbar) + binding.root.postDelayed({ + val anchorView = requireActivity().findViewById(R.id.more_options) + if (isAdded && anchorView != null && Prefs.showOneTimeRecentEditsFeedbackForm) { + FeedbackUtil.getTooltip( + requireActivity(), + getString(R.string.patroller_diff_feedback_tooltip), + arrowAnchorPadding = -DimenUtil.roundedDpToPx(7f), + topOrBottomMargin = 0, + aboveOrBelow = false, + autoDismiss = false, + showDismissButton = true + ).apply { + showAlignBottom(anchorView) + Prefs.showOneTimeRecentEditsFeedbackForm = false + } + } + }, 100) + } + private fun updateActionButtons() { binding.undoButton.isVisible = viewModel.revisionFrom != null && AccountUtil.isLoggedIn binding.thankButton.isEnabled = true @@ -549,6 +693,7 @@ class ArticleEditDetailsFragment : Fragment(), WatchlistExpiryDialog.Callback, L override fun onExpirySelect(expiry: WatchlistExpiry) { viewModel.watchOrUnwatch(isWatched, expiry, false) ExclusiveBottomSheetPresenter.dismiss(childFragmentManager) + showFeedbackOptionsDialog() } override fun onLinkPreviewLoadPage(title: PageTitle, entry: HistoryEntry, inNewTab: Boolean) { diff --git a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt index 5d0369ca1a3..0e93e25b113 100644 --- a/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt +++ b/app/src/main/java/org/wikipedia/diff/ArticleEditDetailsViewModel.kt @@ -53,6 +53,9 @@ class ArticleEditDetailsViewModel(bundle: Bundle) : ViewModel() { var canGoForward = false var hasRollbackRights = false + var feedbackOption = "" + var feedbackInput = "" + val diffSize get() = if (revisionFrom != null) revisionTo!!.size - revisionFrom!!.size else revisionTo!!.size init { diff --git a/app/src/main/java/org/wikipedia/onboarding/OnboardingPageView.kt b/app/src/main/java/org/wikipedia/onboarding/OnboardingPageView.kt index 2b33881cea5..f2d58bae11f 100644 --- a/app/src/main/java/org/wikipedia/onboarding/OnboardingPageView.kt +++ b/app/src/main/java/org/wikipedia/onboarding/OnboardingPageView.kt @@ -21,7 +21,7 @@ import org.wikipedia.databinding.ViewOnboardingPageBinding import org.wikipedia.onboarding.OnboardingPageView.LanguageListAdapter.OptionsViewHolder import org.wikipedia.page.LinkMovementMethodExt import org.wikipedia.util.StringUtil -import java.util.* +import java.util.Locale class OnboardingPageView constructor(context: Context, attrs: AttributeSet? = null) : ConstraintLayout(context, attrs) { interface Callback { @@ -44,8 +44,7 @@ class OnboardingPageView constructor(context: Context, attrs: AttributeSet? = nu init { attrs?.let { attrSet -> context.withStyledAttributes(attrSet, R.styleable.OnboardingPageView) { - val centeredImage = AppCompatResources.getDrawable(context, - getResourceId(R.styleable.OnboardingPageView_centeredImage, -1)) + val imageResource = getResourceId(R.styleable.OnboardingPageView_centeredImage, -1) val primaryText = getString(R.styleable.OnboardingPageView_primaryText) val secondaryText = getString(R.styleable.OnboardingPageView_secondaryText) val tertiaryText = getString(R.styleable.OnboardingPageView_tertiaryText) @@ -54,18 +53,26 @@ class OnboardingPageView constructor(context: Context, attrs: AttributeSet? = nu val showListView = getBoolean(R.styleable.OnboardingPageView_showListView, false) val background = getDrawable(R.styleable.OnboardingPageView_background) val imageSize = getDimension(R.styleable.OnboardingPageView_imageSize, 0f) + val showPatrollerTasksButtons = getBoolean(R.styleable.OnboardingPageView_patrollerTasksButtons, false) background?.let { setBackground(it) } - binding.imageViewCentered.setImageDrawable(centeredImage) - if (imageSize > 0 && centeredImage != null && centeredImage.intrinsicHeight > 0) { - val aspect = centeredImage.intrinsicWidth.toFloat() / centeredImage.intrinsicHeight - binding.imageViewCentered.updateLayoutParams { - width = imageSize.toInt() - height = (imageSize / aspect).toInt() + binding.imageViewCentered.isVisible = imageResource != -1 + if (imageSize > 0 && imageResource != -1) { + val centeredImage = AppCompatResources.getDrawable(context, imageResource) + if (centeredImage != null && centeredImage.intrinsicHeight > 0) { + binding.imageViewCentered.setImageDrawable(centeredImage) + val aspect = + centeredImage.intrinsicWidth.toFloat() / centeredImage.intrinsicHeight + binding.imageViewCentered.updateLayoutParams { + width = imageSize.toInt() + height = (imageSize / aspect).toInt() + } } } binding.primaryTextView.visibility = if (primaryText.isNullOrEmpty()) GONE else VISIBLE binding.primaryTextView.text = primaryText + binding.secondaryTextView.visibility = if (secondaryText.isNullOrEmpty()) GONE else VISIBLE binding.secondaryTextView.text = StringUtil.fromHtml(secondaryText) + binding.tertiaryTextView.visibility = if (tertiaryText.isNullOrEmpty()) GONE else VISIBLE binding.tertiaryTextView.text = tertiaryText binding.acceptRejectContainer.isVisible = acceptRejectButtons setUpLanguageListContainer(showListView, listDataType) @@ -77,6 +84,8 @@ class OnboardingPageView constructor(context: Context, attrs: AttributeSet? = nu } binding.acceptButton.setOnClickListener { callback?.onAcceptOrReject(this@OnboardingPageView, true) } binding.rejectButton.setOnClickListener { callback?.onAcceptOrReject(this@OnboardingPageView, false) } + + binding.patrollerTasksButtonsContainer?.root?.isVisible = showPatrollerTasksButtons } } } diff --git a/app/src/main/java/org/wikipedia/settings/Prefs.kt b/app/src/main/java/org/wikipedia/settings/Prefs.kt index ad48429daf6..f672739401d 100644 --- a/app/src/main/java/org/wikipedia/settings/Prefs.kt +++ b/app/src/main/java/org/wikipedia/settings/Prefs.kt @@ -697,4 +697,16 @@ object Prefs { get() = JsonUtil.decodeFromString>(PrefsIoUtil.getString(R.string.preference_key_recent_edits_included_type_codes, null)) ?: SuggestedEditsRecentEditsFilterTypes.DEFAULT_FILTER_TYPE_SET.map { it.id } set(types) = PrefsIoUtil.setString(R.string.preference_key_recent_edits_included_type_codes, JsonUtil.encodeToString(types)) + + var recentEditsOnboardingShown + get() = PrefsIoUtil.getBoolean(R.string.preference_key_recent_edits_onboarding_shown, false) + set(value) = PrefsIoUtil.setBoolean(R.string.preference_key_recent_edits_onboarding_shown, value) + + var showOneTimeSequentialRecentEditsDiffTooltip + get() = PrefsIoUtil.getBoolean(R.string.preference_key_show_sequential_recent_edits_diff_tooltip, true) + set(value) = PrefsIoUtil.setBoolean(R.string.preference_key_show_sequential_recent_edits_diff_tooltip, value) + + var showOneTimeRecentEditsFeedbackForm + get() = PrefsIoUtil.getBoolean(R.string.preference_key_show_recent_edits_feedback_form, true) + set(value) = PrefsIoUtil.setBoolean(R.string.preference_key_show_recent_edits_feedback_form, value) } diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt index d0266743beb..838a3588df9 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsCardsFragment.kt @@ -4,9 +4,14 @@ import android.app.Activity.RESULT_OK import android.content.Intent import android.graphics.drawable.Animatable import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View import android.view.View.GONE import android.view.View.VISIBLE +import android.view.ViewGroup import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.appcompat.app.AppCompatActivity @@ -27,7 +32,13 @@ import org.wikipedia.dataclient.ServiceFactory import org.wikipedia.dataclient.mwapi.MwQueryPage import org.wikipedia.dataclient.mwapi.SiteMatrix import org.wikipedia.descriptions.DescriptionEditActivity -import org.wikipedia.descriptions.DescriptionEditActivity.Action.* +import org.wikipedia.descriptions.DescriptionEditActivity.Action.ADD_CAPTION +import org.wikipedia.descriptions.DescriptionEditActivity.Action.ADD_DESCRIPTION +import org.wikipedia.descriptions.DescriptionEditActivity.Action.ADD_IMAGE_TAGS +import org.wikipedia.descriptions.DescriptionEditActivity.Action.IMAGE_RECOMMENDATIONS +import org.wikipedia.descriptions.DescriptionEditActivity.Action.TRANSLATE_CAPTION +import org.wikipedia.descriptions.DescriptionEditActivity.Action.TRANSLATE_DESCRIPTION +import org.wikipedia.descriptions.DescriptionEditActivity.Action.VANDALISM_PATROL import org.wikipedia.page.PageTitle import org.wikipedia.settings.Prefs import org.wikipedia.suggestededits.SuggestionsActivity.Companion.EXTRA_SOURCE_ADDED_CONTRIBUTION @@ -94,7 +105,10 @@ class SuggestedEditsCardsFragment : Fragment(), MenuProvider, SuggestedEditsItem super.onViewCreated(view, savedInstanceState) requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.RESUMED) setInitialUiState() - binding.cardsViewPager.offscreenPageLimit = 2 + // Disable offscreenPageLimit for recentEdits can avoid the tooltips showing incorrectly. + if (action != VANDALISM_PATROL) { + binding.cardsViewPager.offscreenPageLimit = 2 + } binding.cardsViewPager.registerOnPageChangeCallback(viewPagerListener) // addOnPageChangeListener(viewPagerListener) resetViewPagerItemAdapter() diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsActivity.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsActivity.kt index 70c07f4b690..88e85595c57 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsActivity.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsActivity.kt @@ -2,9 +2,17 @@ package org.wikipedia.suggestededits import android.content.Context import android.content.Intent +import android.os.Bundle import org.wikipedia.activity.SingleFragmentActivity +import org.wikipedia.settings.Prefs class SuggestedEditsRecentEditsActivity : SingleFragmentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + maybeShowOnboarding() + } + public override fun createFragment(): SuggestedEditsRecentEditsFragment { return SuggestedEditsRecentEditsFragment.newInstance() } @@ -13,6 +21,13 @@ class SuggestedEditsRecentEditsActivity : SingleFragmentActivity(), OnboardingFragment.Callback { + override fun onComplete() { + setResult(RESULT_OK, intent) + finish() + } + + override fun createFragment(): SuggestedEditsRecentEditsOnboardingFragment { + return SuggestedEditsRecentEditsOnboardingFragment.newInstance() + } + + companion object { + fun newIntent(context: Context): Intent { + return Intent(context, SuggestedEditsRecentEditsOnboardingActivity::class.java) + } + } +} diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsOnboardingFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsOnboardingFragment.kt new file mode 100644 index 00000000000..56d574a684a --- /dev/null +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsRecentEditsOnboardingFragment.kt @@ -0,0 +1,76 @@ +package org.wikipedia.suggestededits + +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter +import org.wikipedia.R +import org.wikipedia.activity.FragmentUtil +import org.wikipedia.onboarding.OnboardingFragment +import org.wikipedia.onboarding.OnboardingPageView +import org.wikipedia.settings.Prefs +import org.wikipedia.util.FeedbackUtil +import org.wikipedia.util.UriUtil + +class SuggestedEditsRecentEditsOnboardingFragment : OnboardingFragment(), OnboardingPageView.Callback { + override val doneButtonText = R.string.onboarding_get_started + override val showDoneButton = Prefs.isEventLoggingEnabled + + override fun getAdapter(): FragmentStateAdapter { + return DescriptionEditTutorialPagerAdapter(this) + } + + internal inner class DescriptionEditTutorialPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { + override fun getItemCount(): Int { + return if (!Prefs.isEventLoggingEnabled) pages.size else pages.size - 1 + } + + override fun createFragment(position: Int): Fragment { + return ItemFragment().apply { arguments = bundleOf(ARG_POSITION to position) } + } + } + + override fun onAcceptOrReject(view: OnboardingPageView, accept: Boolean) { + if ((view.tag as Int) == 2) { + Prefs.isEventLoggingEnabled = accept + requireActivity().finish() + } + } + + override fun onLinkClick(view: OnboardingPageView, url: String) { + when (url) { + "#privacy" -> FeedbackUtil.showPrivacyPolicy(requireContext()) + else -> UriUtil.handleExternalLink(requireActivity(), Uri.parse(url)) + } + } + + override fun onListActionButtonClicked(view: OnboardingPageView) { } + + class ItemFragment : Fragment() { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + super.onCreateView(inflater, container, savedInstanceState) + val position = requireArguments().getInt(ARG_POSITION, 0) + val view = inflater.inflate(pages[position], container, false) as OnboardingPageView + view.tag = position + view.callback = callback + return view + } + + private val callback + get() = FragmentUtil.getCallback(this, OnboardingPageView.Callback::class.java) + } + + companion object { + const val ARG_POSITION = "position" + val pages = arrayOf( + R.layout.inflate_patroller_tasks_onboarding_page_one, + R.layout.inflate_patroller_tasks_onboarding_page_two, + R.layout.inflate_initial_onboarding_page_three + ) + fun newInstance() = SuggestedEditsRecentEditsOnboardingFragment() + } +} diff --git a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt index 70765cc8b14..6f71f0542ea 100644 --- a/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt +++ b/app/src/main/java/org/wikipedia/suggestededits/SuggestedEditsTasksFragment.kt @@ -338,7 +338,6 @@ class SuggestedEditsTasksFragment : Fragment() { imageRecommendationsTask.description = getString(R.string.suggested_edits_image_recommendations_task_detail) imageRecommendationsTask.imageDrawable = R.drawable.ic_add_image imageRecommendationsTask.primaryAction = getString(R.string.suggested_edits_task_action_text_add) - imageRecommendationsTask.new = !Prefs.suggestedEditsImageRecsOnboardingShown vandalismPatrolTask = SuggestedEditsTask() vandalismPatrolTask.title = getString(R.string.suggested_edits_edit_patrol) @@ -346,6 +345,7 @@ class SuggestedEditsTasksFragment : Fragment() { vandalismPatrolTask.primaryAction = getString(R.string.suggested_edits_edit_patrol_review) vandalismPatrolTask.imageDrawable = R.drawable.ic_patrol_24 vandalismPatrolTask.primaryActionIcon = R.drawable.ic_check_black_24dp + vandalismPatrolTask.new = !Prefs.recentEditsOnboardingShown displayedTasks.add(vandalismPatrolTask) diff --git a/app/src/main/res/drawable/illustration_patroller_tasks.xml b/app/src/main/res/drawable/illustration_patroller_tasks.xml new file mode 100644 index 00000000000..9a61d00bb1e --- /dev/null +++ b/app/src/main/res/drawable/illustration_patroller_tasks.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_patrol_edit_feedback_input.xml b/app/src/main/res/layout/dialog_patrol_edit_feedback_input.xml new file mode 100644 index 00000000000..99f76f0e1b8 --- /dev/null +++ b/app/src/main/res/layout/dialog_patrol_edit_feedback_input.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_patrol_edit_feedback_options.xml b/app/src/main/res/layout/dialog_patrol_edit_feedback_options.xml new file mode 100644 index 00000000000..d4f1423a291 --- /dev/null +++ b/app/src/main/res/layout/dialog_patrol_edit_feedback_options.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/inflate_patroller_tasks_onboarding_page_one.xml b/app/src/main/res/layout/inflate_patroller_tasks_onboarding_page_one.xml new file mode 100644 index 00000000000..99bdb7151c2 --- /dev/null +++ b/app/src/main/res/layout/inflate_patroller_tasks_onboarding_page_one.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/inflate_patroller_tasks_onboarding_page_two.xml b/app/src/main/res/layout/inflate_patroller_tasks_onboarding_page_two.xml new file mode 100644 index 00000000000..e188fc13d80 --- /dev/null +++ b/app/src/main/res/layout/inflate_patroller_tasks_onboarding_page_two.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_onboarding_page.xml b/app/src/main/res/layout/view_onboarding_page.xml index a86f7532149..0d9ecd2de83 100644 --- a/app/src/main/res/layout/view_onboarding_page.xml +++ b/app/src/main/res/layout/view_onboarding_page.xml @@ -65,6 +65,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_edit_details.xml b/app/src/main/res/menu/menu_edit_details.xml index a05ed7a6676..f88abb24b69 100644 --- a/app/src/main/res/menu/menu_edit_details.xml +++ b/app/src/main/res/menu/menu_edit_details.xml @@ -2,7 +2,7 @@ Скасаваць Налады праграмы Краніцеся іконкі яшчэ раз, каб пачаць увод шуканага тэрміну. + Гісторыя Ачысьціць гісторыю прагляду Гэтае дзеяньне выдаліць усю гісторыю прагляду і зачыніць усе адкрытыя ўстаўкі. Вы ўпэўнены? Так diff --git a/app/src/main/res/values-bew/strings.xml b/app/src/main/res/values-bew/strings.xml index 60706c441b6..8634ff024a7 100644 --- a/app/src/main/res/values-bew/strings.xml +++ b/app/src/main/res/values-bew/strings.xml @@ -856,7 +856,7 @@ Saranan mesin Saran dibuat ama mesin, bukan ama sukarèlawan atawa Yayasan Wikimédia Cèngliin palang peranti - Cèngliin palang peranti bawah paké 5 jalan pintas nyang lu kira paling ngebantu. + Cèngliin palang peranti bawah paké 5 tetenggelan nyang lu kira paling ngebantu. Palang peranti Menu Sèrèt èn taroh barang lu punya demen di mari 👋 @@ -1266,13 +1266,13 @@ Tengerin udah dibaca Tengerin belon dibaca Dumanin - Tanggepan paling baru: %s + Sautan paling baru: %s Jumblah dibaca Lambang pemaké Baca Belon dibaca Masup bakal langganan ke topik - Langganan topik bakal mungkinin lu nerima ma\'lumat pasal tanggepan baru di ni topik. Padol dah, keja rèkening atawa masup ke lu punya rèkening Wikipédi bakal langganan ke topik. + Langganan topik bakal mungkinin lu nerima ma\'lumat pasal sautan baru di ni topik. Padol dah, keja rèkening atawa masup ke lu punya rèkening Wikipédi bakal langganan ke topik. Arsip obrolan: %s Dumanin perhadring Dumanin halaman obrolan diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index b5c588fd184..65d0c1e1897 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -11,6 +11,7 @@ * Glavkos * KATRINE1992 * KATRINE1993 +* McDutchie * Michail Angelos Georgoulas * MuratTheTurkish * NikosLikomitros @@ -46,7 +47,7 @@ Επιστροφή Επόμενο Εκκαθάριση ιστορικού - το %s έχει αφαιρεθεί από το ιστορικό + το %s έχει αφαιρεθεί από το ιστορικό Τα %d λήμματα έχουν αφαιρεθεί από το ιστορικό Αναίρεση Αναίρεση @@ -681,8 +682,8 @@ χτες %d ημέρες πριν - σήμερα - Διαβάστε %s + σήμερα + Διαβάστε %s Όχι, ευχαριστώ Το περιεχόμενο δεν μπορεί να φορτωθεί όταν είστε εκτός σύνδεσης. Προβεβλημένο λήμμα @@ -902,10 +903,10 @@ Τυχαία Συνέχεια ανάγνωσης Αναζήτηση - Αυτήν την μέρα + Αυτήν την μέρα Περισσότερα αυτή την ημέρα %1$s συμβάντα από %2$s–%3$d - Φέτος + Φέτος Επόμενος μήνας Προηγούμενος μήνας Άνοιγμα επιλογής ημερομηνίας diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index fbb17d1dee6..bc8b6dcd0b7 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -498,7 +498,7 @@ Tema Claro Oscuro - Negro + Negro Sepia Texto de muestra Arrastra el control deslizante para cambiar el tamaño del texto de los artículos. Para modificar el tamaño del texto en toda la aplicación, utiliza la configuración del sistema. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 5e35b4acae5..329ce35302c 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -395,6 +395,7 @@ Artikkelia ei voida ladata offline-tilassa. Vihje: lisää artikkeli lukulistaan, jolloin se ladataan laitteeseen verkkoyhteyden ollessa saatavilla. Luet tämän artikkelin yhteydettömän tilan versiota, joka tallennettiin %s. + Ohjattu sivulta \"%s\" Hae reittiohjeet Yhtäkään reittiohjeita tarjoavaa sovellusta ei löytynyt Tutki-syöte @@ -1190,6 +1191,7 @@ Malline Lähde Esikatsele linkki + Mainitse käyttäjä Lisää media Valitse tiedosto Wikimedia Commonsista Etsi mediaa @@ -1447,8 +1449,11 @@ Sinulla ei ole tallennettuja varoitusviestejä. Uusi viesti Aihe + Kirjoita viesti Tallenna Tallenna muutokset + Lisää otsikko ja tallenna viesti. + Viestin otsikko Tallenna Peruuta Malline \"%s\" on jo olemassa. @@ -1468,11 +1473,20 @@ Tarkastele käyttäjän muokkauksia Kiitä Käyttäjätiedot + <b>Muokkausmäärä: </b> %s Sulje Suodattimet + Nollaa Kaikki + Rekisteröitymätön + Muokkaajat, jotka eivät ole kirjautuneet sisään. + Rekisteröitynyt Sisäänkirjautuneet muokkaajat. Tulokkaat + Rekisteröityneet muokkaajat, joilla on vähemmän kuin 10 muokkausta 4 aktiivisuuspäivän aikana. + Uusimmat versiot + Uusin versio + Ei uusin versio Automatisoidut muutokset Botti Ihminen (ei botti) @@ -1493,16 +1507,21 @@ Haluatko tarkkailla artikkelien muokkauksia? Lisää artikkeli tarkkailuluetteloosi. Löydät sen \"Lisää\"-valikosta. Kumoa Valitse \"Kumoa\" kumotaksesi mahdollisesti haitallisen muokkauksen. + Lähetä dataa nimettömästi + Auta parantamaan ominaisuutta kertomalla meille, kuinka käytät sitä. Kerätyt tiedot ovat nimettömiä. <a href=\"#privacy\">Lue lisää</a> + Lähetä käyttöraportteja Auta meitä parantamaan tätä ominaisuutta Oletko tyytyväinen tähän ominaisuuteen? Tyytyväinen Neutraali Tyytymätön + Kuinka voimme parantaa ominaisuutta? Palaute Lähetä Palaute lähetetty. Hyväksy Hylkää + Pieniä virheenkorjauksia ja parannuksia Palaa takaisin Avaa järjestelmäselaimessa diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 8226af945b6..7969ed7b66a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -477,7 +477,7 @@ Thème Clair Sombre - Noir + Noir Sépia Texte d’exemple Glissez le curseur pour modifier la taille du texte utilisée pour lire les articles. Pour définir la taille du texte dans tout le reste de l’application, changez la taille du texte dans vos paramètres Android. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 3fb9e0200d6..11de1236c32 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -294,7 +294,7 @@ Szerkesztési ütközés Ezt a lapot egy másik felhasználó már módosította, és ez ütközik a szerkesztéseddel. Másold ki a szerkesztéseidet, menj vissza az előző oldalra és frissítsd az oldalt, majd próbálkozz újra a szerkesztéssel. Szerkesztési megjegyzés - Módosítás előtt elolvasni + Kérjük, olvasd el szerkesztés előtt Szerkesztési megjegyzések megjelenése Érintsd meg ezt a gombot a szócikk szerkesztési megjegyzéseinek megjelenítéséhez. Következő keresése diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 6a7f92c2b94..25c373ee89a 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -406,7 +406,7 @@ הצגת תקציר מהיר של ערכים בעת הקשה על קישורים. מזעור טבלאות מזעור אוטומטי של טבלאות בערכים, כגון תיבות מידע, מקורות, והערות שוליים. - תרומה + לתרום מצטערים, זיהוי קולי אינו זמין. שירותי המיקום כבויים. הפעלה diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 846af7908f3..436bab04cfa 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -300,6 +300,7 @@ Opnieuw uitvoeren Terugdraaien Waarschuwen + Schade %s Bedoeling %s %s byte diff --git a/app/src/main/res/values-olo/strings.xml b/app/src/main/res/values-olo/strings.xml index 3025b3631de..c0d2996d70a 100644 --- a/app/src/main/res/values-olo/strings.xml +++ b/app/src/main/res/values-olo/strings.xml @@ -10,11 +10,30 @@ Wikipedii Beta Wikipedii Alfa Wikimedii + Järilleh + Järilleh + Ielleh Eči Wikipedies + Eči iänel + Eči kieli + Suodata minun luvettelo + Kohendukset + Ozuta enämbi + Eči Yhtevytty internettah ei sua muvvostua Opi uvvessah + Opi uvvessah + Opi uvvessah + Opi uvvessah + Opi uvvessah Mene järilleh + Mene järilleh + Ielleh Pyhki histourii + %s poistettu histouriespäi + Hylgiä + Hylgiä + Sovelduksen azetukset Pyhkie histourii? Tämä hävittäy kai livuanduhistourien da salbuau avvoi olijat välilehtet. Oletgo varmu? Jagua diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index e56793daf58..9de034ee56d 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -269,6 +269,7 @@ Uveljavi Vrni Opozorilo + Poškodba %s %s namere %s zlog diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 7c034c6bc39..844c365f669 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -274,6 +274,7 @@ Понови Врати Упозори + Оштећено %s %s бајт %s бајтова @@ -1071,8 +1072,8 @@ Додата слика и натпис Прикажи Страница датотеке - Додат натпис слике - Додате ознаке за слику + Додај натпис слике + Додај ознаке за слику Уреди %s Хвала вам што уређујете Википедију. Знамо да сте дали све од себе, али један од патролера има примедбу. Могући разлози због чега је ваша измена поништена: @@ -1257,8 +1258,8 @@ Сакриј одговор Сакриј одговоре (%d) - Пратите \"%s\" - Више не пратите \"%s\" + Пратите „%s” + Више не пратите „%s” Прати Пратите Означи као прочитано diff --git a/app/src/main/res/values-tly/strings.xml b/app/src/main/res/values-tly/strings.xml index aca0c25adb7..1263049acaf 100644 --- a/app/src/main/res/values-tly/strings.xml +++ b/app/src/main/res/values-tly/strings.xml @@ -194,7 +194,7 @@ Sijohijon sinxronizasijə karde bo hande Hande sijohiku məǧolon okyrnije Sinxron kardə byə bo hande sijohijon «%s» mole? - Məxfi + Xysusijət Oko doj hisobon vyǧande Xəto barədə hisobon vyǧande Parzyni tarix @@ -686,7 +686,7 @@ Šikilon nom-nyšonon pegordynije Bomy ni Zyvonon əlovə kardej - Şəkl + Šikil Myəllif Myəllif Səvon @@ -696,7 +696,7 @@ Məǧolon (%s) nom-nyšonon əlovə karde Bino kardej Šikili nom-nyšon (%s) - Şəkl + Šikil Fajl ce Vikiamboku Myəllif Tegon @@ -726,7 +726,7 @@ Zyvon Taryx / Zəmon Tohfə tispir - Şəkl + Šikil Məǧolon %1$d %2$s Zinə diff --git a/app/src/main/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml index 2fcb9852ae2..14fe13817ef 100644 --- a/app/src/main/res/values-uz/strings.xml +++ b/app/src/main/res/values-uz/strings.xml @@ -266,6 +266,7 @@ Qaytarmoq Eski holiga qaytarish Ogohlantirish + %s zararlanishi %s maqsadi %s bayt @@ -1460,7 +1461,7 @@ Saqlash Oʻchirish Xabar yangilandi - Haqiqatan ham %s xabarini roʻyxatdan oʻchirib tashlamoqchimisiz? + Haqiqatan ham %s xabarini roʻyxatdan oʻchirib tashlamoqchimisiz? Xabar oʻchirildi Tahrirlar roʻyxati Tahrirlarni qidirish yoki filtrlash @@ -1481,10 +1482,35 @@ Barchasi Foydalanuvchi qaydi va tajribasi Roʻyxatdan oʻtmagan + Tizimga kirmagan muharrirlar. + Roʻyxatdan oʻtgan + Tizimga kirgan muharrirlar. + Yangi kelganlar + 4 kunlik faoliyat davomida 10 tadan kam tahrirga qilgan roʻyxatdan oʻtgan muharrirlar. + Oʻrganuvchilar + “Yangi kelganlar” hamda “Tajribali foydalanuvchilar” oʻrtasida boʻlgan roʻyxatdan oʻtgan muharrirlar. + Tajribali foydalanuvchilar + 500 tadan kam tahrir qilgan va koʻpida 30 kun avval roʻyxatdan oʻtgan foydalanuvchilar. + Soʻnggi faolligi + Soʻnggi koʻrinishi + Oxirgi tahrir emas + Avtomatik hissalar Bot + Inson (bot emas) + Ahamiyati + Kichik tahrirlar + Kichik boʻlmagan tahrirlar + Hissa sifatini tahlil qilish + Ehtimol yaxshi + Deyarli barcha muammosiz tahrirlarni topishda yuqori aniqlik. + Muammolari boʻlishi mumkin + Koʻp nuqsonli yoki zararli tahrirlarni topadi, lekin pastroq aniqlik bilan. + Ehtimol, muammolar bordir Koʻrish Xususiyat bilan bogʻliq muammo Batafsil + Joʻnatish + Fikr-mulohaza yuborildi. Qabul qilish Rad etish Sahifa muammolari diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 13e1dc731a3..08f05611791 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -56,6 +56,7 @@ + diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 9aefd362781..a8ab5f18860 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -166,4 +166,7 @@ eventPlatformQueueSize filterRecentEditsWikiCode filterRecentEditsIncludedTypeCodes + recentEditsOnboardingShown + showSequentialRecentEditsDiffTooltip + showRecentEditsFeedbackForm diff --git a/app/src/main/res/xml/developer_preferences.xml b/app/src/main/res/xml/developer_preferences.xml index 434ec9802d9..d7ab257a9ae 100644 --- a/app/src/main/res/xml/developer_preferences.xml +++ b/app/src/main/res/xml/developer_preferences.xml @@ -317,6 +317,11 @@ android:key="@string/preference_key_push_notification_options_set" android:title="@string/preference_key_push_notification_options_set" /> + + + @@ -424,6 +429,14 @@ android:key="@string/preference_key_se_image_recs_onboarding_shown" android:title="@string/preference_key_se_image_recs_onboarding_shown" /> + + + + diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 1489e1301d6..e5c3f73ef0d 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -62,7 +62,7 @@