Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/Rd4dev/oppia-android int…
Browse files Browse the repository at this point in the history
…o Issue#5169-Usability
  • Loading branch information
Rd4dev committed Oct 31, 2023
2 parents d44638a + 6ac4f9c commit 98f27db
Show file tree
Hide file tree
Showing 47 changed files with 1,499 additions and 55 deletions.
12 changes: 12 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,18 @@
android:name=".app.notice.testing.GeneralAvailabilityUpgradeNoticeDialogFragmentTestActivity"
android:label="@string/test_activity_label"
android:theme="@style/OppiaThemeWithoutActionBar" />
<activity
android:name=".app.notice.testing.ForcedAppDeprecationNoticeDialogFragmentTestActivity"
android:label="@string/test_activity_label"
android:theme="@style/OppiaThemeWithoutActionBar" />
<activity
android:name=".app.notice.testing.OptionalAppDeprecationNoticeDialogFragmentTestActivity"
android:label="@string/test_activity_label"
android:theme="@style/OppiaThemeWithoutActionBar" />
<activity
android:name=".app.notice.testing.OsDeprecationNoticeDialogFragmentTestActivity"
android:label="@string/test_activity_label"
android:theme="@style/OppiaThemeWithoutActionBar" />
<activity
android:name=".app.onboarding.OnboardingActivity"
android:label="@string/onboarding_activity_title"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.oppia.android.app.administratorcontrols.learneranalytics
import android.annotation.SuppressLint
import android.content.ActivityNotFoundException
import android.content.Intent
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
Expand Down Expand Up @@ -228,7 +229,11 @@ class ControlButtonsViewModel private constructor(
val compressedMessage = ByteArrayOutputStream().also { byteOutputStream ->
GZIPOutputStream(byteOutputStream).use(::writeTo)
}.toByteArray()
return Base64.getEncoder().encodeToString(compressedMessage)
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Base64.getEncoder().encodeToString(compressedMessage)
} else {
android.util.Base64.encodeToString(compressedMessage, 0)
}
}

private fun String.computeSha1Hash(machineLocale: OppiaLocale.MachineLocale): String {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatCheckBox;
import androidx.core.widget.CompoundButtonCompat;
import androidx.databinding.BindingAdapter;

/**
Expand All @@ -13,6 +14,6 @@ public final class AppCompatCheckBoxBindingAdapters {
/** Sets the button tint for the specified checkbox, via data-binding. */
@BindingAdapter("app:buttonTint")
public static void setButtonTint(@NonNull AppCompatCheckBox checkBox, @ColorInt int colorRgb) {
checkBox.setSupportButtonTintList(ColorStateList.valueOf(colorRgb));
CompoundButtonCompat.setButtonTintList(checkBox, ColorStateList.valueOf(colorRgb));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ import org.oppia.android.app.mydownloads.MyDownloadsFragment
import org.oppia.android.app.mydownloads.UpdatesTabFragment
import org.oppia.android.app.notice.AutomaticAppDeprecationNoticeDialogFragment
import org.oppia.android.app.notice.BetaNoticeDialogFragment
import org.oppia.android.app.notice.ForcedAppDeprecationNoticeDialogFragment
import org.oppia.android.app.notice.GeneralAvailabilityUpgradeNoticeDialogFragment
import org.oppia.android.app.notice.OptionalAppDeprecationNoticeDialogFragment
import org.oppia.android.app.notice.OsDeprecationNoticeDialogFragment
import org.oppia.android.app.onboarding.OnboardingFragment
import org.oppia.android.app.ongoingtopiclist.OngoingTopicListFragment
import org.oppia.android.app.options.AppLanguageFragment
Expand Down Expand Up @@ -113,7 +116,10 @@ interface FragmentComponentImpl : FragmentComponent, ViewComponentBuilderInjecto
fun inject(appVersionFragment: AppVersionFragment)
fun inject(audioFragment: AudioFragment)
fun inject(audioLanguageFragment: AudioLanguageFragment)
fun inject(autoAppDeprecationNoticeDialogFragment: AutomaticAppDeprecationNoticeDialogFragment)
fun inject(
automaticAppDeprecationNoticeDialogFragment:
AutomaticAppDeprecationNoticeDialogFragment
)
fun inject(betaNoticeDialogFragment: BetaNoticeDialogFragment)
fun inject(cellularAudioDialogFragment: CellularAudioDialogFragment)
fun inject(completedStoryListFragment: CompletedStoryListFragment)
Expand All @@ -127,6 +133,7 @@ interface FragmentComponentImpl : FragmentComponent, ViewComponentBuilderInjecto
fun inject(explorationTestActivityTestFragment: ExplorationTestActivityPresenter.TestFragment)
fun inject(faqListFragment: FAQListFragment)
fun inject(forceNetworkTypeFragment: ForceNetworkTypeFragment)
fun inject(forcedAppDeprecationNoticeDialogFragment: ForcedAppDeprecationNoticeDialogFragment)
fun inject(fragment: GeneralAvailabilityUpgradeNoticeDialogFragment)
fun inject(helpFragment: HelpFragment)
fun inject(hintsAndSolutionDialogFragment: HintsAndSolutionDialogFragment)
Expand All @@ -146,7 +153,9 @@ interface FragmentComponentImpl : FragmentComponent, ViewComponentBuilderInjecto
fun inject(navigationDrawerFragment: NavigationDrawerFragment)
fun inject(onboardingFragment: OnboardingFragment)
fun inject(ongoingTopicListFragment: OngoingTopicListFragment)
fun inject(optionalAppDeprecationNoticeDialogFragment: OptionalAppDeprecationNoticeDialogFragment)
fun inject(optionFragment: OptionsFragment)
fun inject(osDeprecationNoticeDialogFragment: OsDeprecationNoticeDialogFragment)
fun inject(policiesFragment: PoliciesFragment)
fun inject(profileAndDeviceIdFragment: ProfileAndDeviceIdFragment)
fun inject(profileChooserFragment: ProfileChooserFragment)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.oppia.android.app.notice

import org.oppia.android.app.splash.DeprecationNoticeActionType

/** Listener for when an option on any deprecation dialog is clicked. */
interface DeprecationNoticeActionListener {
/** Called when a dialog button is clicked. */
fun onActionButtonClicked(noticeType: DeprecationNoticeActionType)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.oppia.android.app.notice

import android.app.Dialog
import android.content.Context
import android.os.Bundle
import org.oppia.android.app.fragment.FragmentComponentImpl
import org.oppia.android.app.fragment.InjectableDialogFragment
import javax.inject.Inject

/** Dialog fragment that informs the user of an app deprecation. */
class ForcedAppDeprecationNoticeDialogFragment : InjectableDialogFragment() {
companion object {
/** Returns a new instance of [ForcedAppDeprecationNoticeDialogFragment]. */
fun newInstance(): ForcedAppDeprecationNoticeDialogFragment {
return ForcedAppDeprecationNoticeDialogFragment()
}
}

@Inject lateinit var presenter: ForcedAppDeprecationNoticeDialogFragmentPresenter

override fun onAttach(context: Context) {
super.onAttach(context)
(fragmentComponent as FragmentComponentImpl).inject(this)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return presenter.handleOnCreateDialog()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.oppia.android.app.notice

import android.app.Dialog
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import org.oppia.android.R
import org.oppia.android.app.splash.DeprecationNoticeActionType
import org.oppia.android.app.translation.AppLanguageResourceHandler
import javax.inject.Inject

/** Presenter class responsible for showing an app deprecation dialog to the user. */
class ForcedAppDeprecationNoticeDialogFragmentPresenter @Inject constructor(
private val activity: AppCompatActivity,
private val resourceHandler: AppLanguageResourceHandler
) {
private val deprecationNoticeActionListener by lazy {
activity as DeprecationNoticeActionListener
}

/** Handles dialog creation for the forced app deprecation notice. */
fun handleOnCreateDialog(): Dialog {
val appName = resourceHandler.getStringInLocale(R.string.app_name)

val dialog = AlertDialog.Builder(activity, R.style.DeprecationAlertDialogTheme)
.setTitle(R.string.forced_app_update_dialog_title)
.setMessage(
resourceHandler.getStringInLocaleWithWrapping(
R.string.forced_app_update_dialog_message,
appName
)
)
.setPositiveButton(R.string.forced_app_update_dialog_update_button_text) { _, _ ->
deprecationNoticeActionListener.onActionButtonClicked(
DeprecationNoticeActionType.UPDATE
)
}
.setNegativeButton(R.string.forced_app_update_dialog_close_button_text) { _, _ ->
deprecationNoticeActionListener.onActionButtonClicked(
DeprecationNoticeActionType.CLOSE
)
}
.setCancelable(false)
.create()
dialog.setCanceledOnTouchOutside(false)
return dialog
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.oppia.android.app.notice

import android.app.Dialog
import android.content.Context
import android.os.Bundle
import org.oppia.android.app.fragment.FragmentComponentImpl
import org.oppia.android.app.fragment.InjectableDialogFragment
import javax.inject.Inject

/** Dialog fragment that informs the user that a new app version is available for download. */
class OptionalAppDeprecationNoticeDialogFragment : InjectableDialogFragment() {
companion object {
/** Returns a new instance of [OptionalAppDeprecationNoticeDialogFragment]. */
fun newInstance(): OptionalAppDeprecationNoticeDialogFragment {
return OptionalAppDeprecationNoticeDialogFragment()
}
}

@Inject lateinit var optionalAppDeprecationNoticeDialogFragmentPresenter:
OptionalAppDeprecationNoticeDialogFragmentPresenter

override fun onAttach(context: Context) {
super.onAttach(context)
(fragmentComponent as FragmentComponentImpl).inject(this)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return optionalAppDeprecationNoticeDialogFragmentPresenter.handleOnCreateDialog()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.oppia.android.app.notice

import android.app.Dialog
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import org.oppia.android.R
import org.oppia.android.app.splash.DeprecationNoticeActionType
import org.oppia.android.app.translation.AppLanguageResourceHandler
import javax.inject.Inject

/** Presenter class responsible for showing an optional update dialog to the user. */
class OptionalAppDeprecationNoticeDialogFragmentPresenter @Inject constructor(
private val activity: AppCompatActivity,
private val resourceHandler: AppLanguageResourceHandler
) {
private val deprecationNoticeActionListener by lazy {
activity as DeprecationNoticeActionListener
}

/** Handles dialog creation for the optional app deprecation notice. */
fun handleOnCreateDialog(): Dialog {
val appName = resourceHandler.getStringInLocale(R.string.app_name)

val dialog = AlertDialog.Builder(activity, R.style.DeprecationAlertDialogTheme)
.setTitle(R.string.optional_app_update_dialog_title)
.setMessage(
resourceHandler.getStringInLocaleWithWrapping(
R.string.optional_app_update_dialog_message,
appName
)
)
.setPositiveButton(R.string.optional_app_update_dialog_update_button_text) { _, _ ->
deprecationNoticeActionListener.onActionButtonClicked(
DeprecationNoticeActionType.UPDATE
)
}
.setNegativeButton(R.string.optional_app_update_dialog_dismiss_button_text) { _, _ ->
deprecationNoticeActionListener.onActionButtonClicked(
DeprecationNoticeActionType.DISMISS
)
}
.setCancelable(false)
.create()
dialog.setCanceledOnTouchOutside(false)
return dialog
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.oppia.android.app.notice

import android.app.Dialog
import android.content.Context
import android.os.Bundle
import org.oppia.android.app.fragment.FragmentComponentImpl
import org.oppia.android.app.fragment.InjectableDialogFragment
import javax.inject.Inject

/**
* Dialog fragment that informs the user that their phone OS is no longer supported by Oppia and
* they will no longer be able to update their app to the latest version.
*/
class OsDeprecationNoticeDialogFragment : InjectableDialogFragment() {
companion object {
/** Returns a new instance of [OsDeprecationNoticeDialogFragment]. */
fun newInstance(): OsDeprecationNoticeDialogFragment {
return OsDeprecationNoticeDialogFragment()
}
}

@Inject lateinit var osDeprecationNoticeDialogFragmentPresenter:
OsDeprecationNoticeDialogFragmentPresenter

override fun onAttach(context: Context) {
super.onAttach(context)
(fragmentComponent as FragmentComponentImpl).inject(this)
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return osDeprecationNoticeDialogFragmentPresenter.handleOnCreateDialog()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.oppia.android.app.notice

import android.app.Dialog
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import org.oppia.android.R
import org.oppia.android.app.splash.DeprecationNoticeActionType
import org.oppia.android.app.translation.AppLanguageResourceHandler
import javax.inject.Inject

/** Presenter class responsible for showing an OS deprecation dialog to the user. */
class OsDeprecationNoticeDialogFragmentPresenter @Inject constructor(
private val activity: AppCompatActivity,
private val resourceHandler: AppLanguageResourceHandler
) {
private val deprecationNoticeActionListener by lazy {
activity as DeprecationNoticeActionListener
}

/** Handles dialog creation for the OS deprecation notice. */
fun handleOnCreateDialog(): Dialog {
val appName = resourceHandler.getStringInLocale(R.string.app_name)

val dialog = AlertDialog.Builder(activity, R.style.DeprecationAlertDialogTheme)
.setTitle(R.string.os_deprecation_dialog_title)
.setMessage(
resourceHandler.getStringInLocaleWithWrapping(
R.string.os_deprecation_dialog_message,
appName
)
)
.setNegativeButton(R.string.os_deprecation_dialog_dismiss_button_text) { _, _ ->
deprecationNoticeActionListener.onActionButtonClicked(
DeprecationNoticeActionType.DISMISS
)
}
.setCancelable(false)
.create()
dialog.setCanceledOnTouchOutside(false)
return dialog
}
}
39 changes: 39 additions & 0 deletions app/src/main/java/org/oppia/android/app/notice/testing/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,19 @@ kt_android_library(
],
)

kt_android_library(
name = "forced_app_deprecation_notice_dialog_fragment_test_activity",
testonly = True,
srcs = [
"ForcedAppDeprecationNoticeDialogFragmentTestActivity.kt",
],
visibility = ["//app:app_testing_visibility"],
deps = [
"//app",
"//app/src/main/java/org/oppia/android/app/testing/activity:test_activity",
],
)

kt_android_library(
name = "general_availability_upgrade_notice_dialog_fragment_test_activity",
testonly = True,
Expand All @@ -31,4 +44,30 @@ kt_android_library(
],
)

kt_android_library(
name = "optional_app_deprecation_notice_dialog_fragment_test_activity",
testonly = True,
srcs = [
"OptionalAppDeprecationNoticeDialogFragmentTestActivity.kt",
],
visibility = ["//app:app_testing_visibility"],
deps = [
"//app",
"//app/src/main/java/org/oppia/android/app/testing/activity:test_activity",
],
)

kt_android_library(
name = "os_deprecation_notice_dialog_fragment_test_activity",
testonly = True,
srcs = [
"OsDeprecationNoticeDialogFragmentTestActivity.kt",
],
visibility = ["//app:app_testing_visibility"],
deps = [
"//app",
"//app/src/main/java/org/oppia/android/app/testing/activity:test_activity",
],
)

dagger_rules()
Loading

0 comments on commit 98f27db

Please sign in to comment.