diff --git a/WordPress/build.gradle b/WordPress/build.gradle index 3b3602aacb86..9eae6a8115a2 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -164,7 +164,6 @@ android { buildConfigField "boolean", "VOICE_TO_CONTENT", "false" buildConfigField "boolean", "READER_FLOATING_BUTTON", "false" buildConfigField "boolean", "ENABLE_SELF_HOSTED_USERS", "false" - buildConfigField "boolean", "GRAVATAR_QUICK_EDITOR", "false" // Override these constants in jetpack product flavor to enable/ disable features buildConfigField "boolean", "ENABLE_SITE_CREATION", "true" diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SignupEpilogueFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SignupEpilogueFragment.kt index 440314539931..f3997bfe6595 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SignupEpilogueFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SignupEpilogueFragment.kt @@ -3,12 +3,8 @@ package org.wordpress.android.ui.accounts.signup import android.annotation.SuppressLint -import android.app.Activity import android.content.Context import android.content.DialogInterface -import android.content.Intent -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable import android.net.Uri import android.os.Bundle import android.text.Editable @@ -26,7 +22,6 @@ import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView import androidx.annotation.LayoutRes -import androidx.appcompat.view.ContextThemeWrapper import androidx.core.widget.NestedScrollView import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -35,18 +30,16 @@ import com.gravatar.AvatarUrl import com.gravatar.quickeditor.GravatarQuickEditor import com.gravatar.quickeditor.ui.editor.AuthenticationMethod import com.gravatar.quickeditor.ui.editor.AvatarPickerContentLayout +import com.gravatar.quickeditor.ui.editor.AvatarPickerResult import com.gravatar.quickeditor.ui.editor.GravatarQuickEditorParams import com.gravatar.services.AvatarService import com.gravatar.services.GravatarResult import com.gravatar.types.Email -import com.yalantis.ucrop.UCrop -import com.yalantis.ucrop.UCropActivity import kotlinx.coroutines.launch import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.wordpress.android.R import org.wordpress.android.WordPress -import org.wordpress.android.WordPress.Companion.getBitmapCache import org.wordpress.android.analytics.AnalyticsTracker import org.wordpress.android.analytics.AnalyticsTracker.Stat import org.wordpress.android.fluxc.Dispatcher @@ -62,11 +55,7 @@ import org.wordpress.android.login.LoginBaseFormFragment import org.wordpress.android.login.widgets.WPLoginInputRow import org.wordpress.android.ui.FullScreenDialogFragment import org.wordpress.android.ui.FullScreenDialogFragment.OnShownListener -import org.wordpress.android.ui.RequestCodes import org.wordpress.android.ui.accounts.UnifiedLoginTracker -import org.wordpress.android.ui.photopicker.MediaPickerConstants -import org.wordpress.android.ui.photopicker.MediaPickerLauncher -import org.wordpress.android.ui.photopicker.PhotoPickerActivity.PhotoPickerMediaSource import org.wordpress.android.ui.prefs.AppPrefsWrapper import org.wordpress.android.ui.reader.services.update.ReaderUpdateLogic.UpdateTask import org.wordpress.android.ui.reader.services.update.ReaderUpdateServiceStarter @@ -74,10 +63,6 @@ import org.wordpress.android.util.AppLog import org.wordpress.android.util.MediaUtils import org.wordpress.android.util.StringUtils import org.wordpress.android.util.ToastUtils -import org.wordpress.android.util.WPAvatarUtils -import org.wordpress.android.util.WPMediaUtils -import org.wordpress.android.util.config.GravatarQuickEditorFeatureConfig -import org.wordpress.android.util.extensions.getColorFromAttribute import org.wordpress.android.util.extensions.redirectContextClickToLongPressListener import org.wordpress.android.util.image.ImageManager import org.wordpress.android.util.image.ImageType @@ -135,15 +120,9 @@ class SignupEpilogueFragment : LoginBaseFormFragment<SignupEpilogueListener?>(), @Inject lateinit var mSignupUtils: SignupUtils - @Inject - lateinit var mMediaPickerLauncher: MediaPickerLauncher - @Inject lateinit var mAvatarService: AvatarService - @Inject - lateinit var gravatarQuickEditorFeatureConfig: GravatarQuickEditorFeatureConfig - @LayoutRes override fun getContentLayout(): Int { return 0 // no content layout; entire view is inflated in createMainView @@ -173,33 +152,35 @@ class SignupEpilogueFragment : LoginBaseFormFragment<SignupEpilogueListener?>(), headerAvatarLayout.isEnabled = mIsEmailSignup headerAvatarLayout.setOnClickListener { mUnifiedLoginTracker.trackClick(UnifiedLoginTracker.Click.SELECT_AVATAR) - if (gravatarQuickEditorFeatureConfig.isEnabled()) { - GravatarQuickEditor.show( - fragment = this, - gravatarQuickEditorParams = GravatarQuickEditorParams { - email = Email(mEmailAddress) - avatarPickerContentLayout = AvatarPickerContentLayout.Horizontal - }, - authenticationMethod = AuthenticationMethod.Bearer(mAccount.accessToken.orEmpty()), - onAvatarSelected = { - mPhotoUrl = AvatarUrl( - email = Email(mEmailAddress), - avatarQueryOptions = AvatarQueryOptions { - preferredSize = resources.getDimensionPixelSize(R.dimen.avatar_sz_large) - } - ).url(cacheBuster = System.currentTimeMillis().toString()).toString() - mImageManager.loadIntoCircle( - mHeaderAvatar, - ImageType.AVATAR_WITHOUT_BACKGROUND, - mPhotoUrl - ) - mHeaderAvatarAdd.visibility = View.GONE - mIsAvatarAdded = true - }, - ) - } else { - mMediaPickerLauncher.showGravatarPicker(this@SignupEpilogueFragment) - } + GravatarQuickEditor.show( + fragment = this, + gravatarQuickEditorParams = GravatarQuickEditorParams { + email = Email(mEmailAddress) + avatarPickerContentLayout = AvatarPickerContentLayout.Horizontal + }, + authenticationMethod = AuthenticationMethod.Bearer(mAccount.accessToken.orEmpty()), + updateHandler = { event -> + when (event) { + AvatarPickerResult -> { + mPhotoUrl = AvatarUrl( + email = Email(mEmailAddress), + avatarQueryOptions = AvatarQueryOptions { + preferredSize = resources.getDimensionPixelSize(R.dimen.avatar_sz_large) + } + ).url(cacheBuster = System.currentTimeMillis().toString()).toString() + mImageManager.loadIntoCircle( + mHeaderAvatar, + ImageType.AVATAR_WITHOUT_BACKGROUND, + mPhotoUrl + ) + mHeaderAvatarAdd.visibility = View.GONE + mIsAvatarAdded = true + } + + else -> Unit + } + }, + ) } headerAvatarLayout.setOnLongClickListener { ToastUtils.showToast( @@ -374,81 +355,6 @@ class SignupEpilogueFragment : LoginBaseFormFragment<SignupEpilogueListener?>(), } } - @Deprecated("Deprecated in Java") - @Suppress("deprecation", "NestedBlockDepth", "LongMethod") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - - if (isAdded) { - when (resultCode) { - Activity.RESULT_OK -> when (requestCode) { - RequestCodes.PHOTO_PICKER -> if (data != null) { - val mediaUriStringsArray = - data.getStringArrayExtra(MediaPickerConstants.EXTRA_MEDIA_URIS) - - if (mediaUriStringsArray != null && mediaUriStringsArray.size > 0) { - val source = - PhotoPickerMediaSource.fromString( - data.getStringExtra(MediaPickerConstants.EXTRA_MEDIA_SOURCE) - ) - val stat = - if (source == PhotoPickerMediaSource.ANDROID_CAMERA) { - Stat.SIGNUP_EMAIL_EPILOGUE_GRAVATAR_SHOT_NEW - } else { - Stat.SIGNUP_EMAIL_EPILOGUE_GRAVATAR_GALLERY_PICKED - } - AnalyticsTracker.track(stat) - val imageUri = Uri.parse(mediaUriStringsArray[0]) - - if (imageUri != null) { - val wasSuccess = WPMediaUtils.fetchMediaAndDoNext( - activity, imageUri - ) { uri -> startCropActivity(uri) } - - if (!wasSuccess) { - AppLog.e( - AppLog.T.UTILS, - "Can't download picked or captured image" - ) - } - } else { - AppLog.e(AppLog.T.UTILS, "Can't parse media string") - } - } else { - AppLog.e(AppLog.T.UTILS, "Can't resolve picked or captured image") - } - } - - UCrop.REQUEST_CROP -> { - AnalyticsTracker.track(Stat.SIGNUP_EMAIL_EPILOGUE_GRAVATAR_CROPPED) - WPMediaUtils.fetchMediaAndDoNext( - activity, UCrop.getOutput((data)!!) - ) { uri -> - startGravatarUpload( - MediaUtils.getRealPathFromURI( - activity, uri - ) - ) - } - } - } - - UCrop.RESULT_ERROR -> { - AppLog.e( - AppLog.T.NUX, "Image cropping failed", UCrop.getError( - (data)!! - ) - ) - ToastUtils.showToast( - activity, - R.string.error_cropping_image, - ToastUtils.Duration.SHORT - ) - } - } - } - } - @Suppress("TooGenericExceptionThrown") override fun onAttach(context: Context) { super.onAttach(context) @@ -633,56 +539,6 @@ class SignupEpilogueFragment : LoginBaseFormFragment<SignupEpilogueListener?>(), mDialog?.show(requireActivity().supportFragmentManager, FullScreenDialogFragment.TAG) } - private fun loadAvatar(avatarUrl: String, injectFilePath: String) { - val newAvatarUploaded = injectFilePath.isNotEmpty() - if (newAvatarUploaded) { - // Remove specific URL entry from bitmap cache. Update it via injected request cache. - getBitmapCache().removeSimilar(avatarUrl) - // Changing the signature invalidates Glide's cache - mAppPrefsWrapper.avatarVersion += 1 - } - - val bitmap = getBitmapCache()[avatarUrl] - // Avatar's API doesn't synchronously update the image at avatarUrl. There is a replication lag - // (cca 5s), before the old avatar is replaced with the new avatar. Therefore we need to use this workaround, - // which temporary saves the new image into a local bitmap cache. - if (bitmap != null) { - mImageManager.load((mHeaderAvatar), bitmap) - } else { - mImageManager.loadIntoCircle( - mHeaderAvatar, - ImageType.AVATAR_WITHOUT_BACKGROUND, - if (newAvatarUploaded) { - injectFilePath - } else { - avatarUrl - }, - object : ImageManager.RequestListener<Drawable> { - override fun onLoadFailed(e: Exception?, model: Any?) { - AppLog.e( - AppLog.T.NUX, - "Uploading image to Gravatar succeeded, but setting image view failed" - ) - showErrorDialogWithCloseButton(getString(R.string.signup_epilogue_error_avatar_view)) - } - - @Suppress("NAME_SHADOWING") - override fun onResourceReady(resource: Drawable, model: Any?) { - if (newAvatarUploaded && resource is BitmapDrawable) { - var bitmap = resource.bitmap - // create a copy since the original bitmap may by automatically recycled - bitmap.config?.let { config -> - bitmap = bitmap.copy(config, true) - } - getBitmapCache().put((avatarUrl), bitmap) - } - } - }, - mAppPrefsWrapper.avatarVersion - ) - } - } - private fun populateViews() { mEmailAddress = mAccountStore.account.email mDisplayName = mSignupUtils.createDisplayNameFromEmail(mEmailAddress) @@ -728,84 +584,6 @@ class SignupEpilogueFragment : LoginBaseFormFragment<SignupEpilogueListener?>(), dialog.show() } - private fun startCropActivity(uri: Uri?) { - val baseContext: Context? = activity - - if (baseContext != null) { - val context: Context = ContextThemeWrapper(baseContext, R.style.WordPress_NoActionBar) - - val options = UCrop.Options() - options.setShowCropGrid(false) - options.setStatusBarColor( - context.getColorFromAttribute( - android.R.attr.statusBarColor - ) - ) - options.setToolbarColor(context.getColorFromAttribute(R.attr.wpColorAppBar)) - options.setToolbarWidgetColor( - context.getColorFromAttribute( - com.google.android.material.R.attr.colorOnSurface - ) - ) - options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.NONE, UCropActivity.NONE) - options.setHideBottomControls(true) - - UCrop.of((uri)!!, Uri.fromFile(File(context.cacheDir, "cropped.jpg"))) - .withAspectRatio(1f, 1f) - .withOptions(options) - .start(context, this) - } - } - - private fun startGravatarUpload(filePath: String) { - if (!TextUtils.isEmpty(filePath)) { - val file = File(filePath) - if (file.exists()) { - mAccountStore.accessToken?.let { accessToken -> - startProgress(false) - lifecycleScope.launch { - val result = mAvatarService.uploadCatching( - file, - accessToken, - hash = Email(mAccountStore.account.email).hash(), - selectAvatar = true - ) - when (result) { - is GravatarResult.Success -> { - endProgress() - AnalyticsTracker.track(Stat.ME_GRAVATAR_UPLOADED) - mPhotoUrl = WPAvatarUtils.rewriteAvatarUrl( - mAccount.account.avatarUrl, - resources.getDimensionPixelSize(R.dimen.avatar_sz_large) - ) - loadAvatar(mPhotoUrl, filePath) - mHeaderAvatarAdd.visibility = View.GONE - mIsAvatarAdded = true - } - - is GravatarResult.Failure -> { - endProgress() - showErrorDialogWithCloseButton(getString(R.string.signup_epilogue_error_avatar)) - val properties: MutableMap<String, Any?> = HashMap() - properties["error_type"] = result.error - AnalyticsTracker.track(Stat.ME_GRAVATAR_UPLOAD_EXCEPTION, properties) - AppLog.e(AppLog.T.NUX, "Uploading image to Gravatar failed") - } - } - } - } - } else { - ToastUtils.showToast( - activity, - R.string.error_locating_image, - ToastUtils.Duration.SHORT - ) - } - } else { - ToastUtils.showToast(activity, R.string.error_locating_image, ToastUtils.Duration.SHORT) - } - } - @SuppressLint("SetTextI18n") private fun undoChanges() { mDisplayName = if (!TextUtils.isEmpty(mAccountStore.account.displayName) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.kt index faaab57b8e6b..0f2ed9d7dadb 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.kt @@ -2,15 +2,12 @@ package org.wordpress.android.ui.main -import android.app.Activity import android.app.ProgressDialog import android.content.Intent import android.content.pm.PackageManager import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable -import android.net.Uri import android.os.Bundle -import android.text.TextUtils import android.view.View import android.view.View.OnClickListener import androidx.annotation.StringRes @@ -20,7 +17,6 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.gravatar.quickeditor.GravatarQuickEditor @@ -31,14 +27,8 @@ import com.gravatar.quickeditor.ui.editor.AvatarPickerAndAboutEditorConfiguratio import com.gravatar.quickeditor.ui.editor.AvatarPickerResult import com.gravatar.quickeditor.ui.editor.GravatarQuickEditorParams import com.gravatar.quickeditor.ui.editor.QuickEditorScopeOption -import com.gravatar.services.AvatarService -import com.gravatar.services.GravatarResult import com.gravatar.types.Email -import com.yalantis.ucrop.UCrop -import com.yalantis.ucrop.UCrop.Options -import com.yalantis.ucrop.UCropActivity import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -46,12 +36,7 @@ import org.wordpress.android.BuildConfig import org.wordpress.android.R import org.wordpress.android.WordPress import org.wordpress.android.analytics.AnalyticsTracker -import org.wordpress.android.analytics.AnalyticsTracker.Stat.ME_GRAVATAR_CROPPED -import org.wordpress.android.analytics.AnalyticsTracker.Stat.ME_GRAVATAR_GALLERY_PICKED -import org.wordpress.android.analytics.AnalyticsTracker.Stat.ME_GRAVATAR_SHOT_NEW import org.wordpress.android.analytics.AnalyticsTracker.Stat.ME_GRAVATAR_TAPPED -import org.wordpress.android.analytics.AnalyticsTracker.Stat.ME_GRAVATAR_UPLOADED -import org.wordpress.android.analytics.AnalyticsTracker.Stat.ME_GRAVATAR_UPLOAD_EXCEPTION import org.wordpress.android.databinding.MeFragmentBinding import org.wordpress.android.designsystem.DesignSystemActivity import org.wordpress.android.fluxc.Dispatcher @@ -61,7 +46,6 @@ import org.wordpress.android.fluxc.store.PostStore import org.wordpress.android.fluxc.store.SiteStore import org.wordpress.android.models.JetpackPoweredScreen import org.wordpress.android.ui.ActivityLauncher -import org.wordpress.android.ui.RequestCodes import org.wordpress.android.ui.about.UnifiedAboutActivity import org.wordpress.android.ui.accounts.HelpActivity.Origin.ME_SCREEN_HELP import org.wordpress.android.ui.debug.DebugSettingsActivity @@ -74,45 +58,33 @@ import org.wordpress.android.ui.main.emailverificationbanner.EmailVerificationVi import org.wordpress.android.ui.main.utils.MeGravatarLoader import org.wordpress.android.ui.mysite.jetpackbadge.JetpackPoweredBottomSheetFragment import org.wordpress.android.ui.notifications.utils.NotificationsUtils -import org.wordpress.android.ui.photopicker.MediaPickerConstants -import org.wordpress.android.ui.photopicker.MediaPickerLauncher -import org.wordpress.android.ui.photopicker.PhotoPickerActivity import org.wordpress.android.ui.prefs.AppPrefsWrapper import org.wordpress.android.ui.utils.UiHelpers import org.wordpress.android.ui.utils.UiString import org.wordpress.android.ui.utils.UiString.UiStringText import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.MAIN -import org.wordpress.android.util.AppLog.T.UTILS import org.wordpress.android.util.FluxCUtils import org.wordpress.android.util.JetpackBrandingUtils -import org.wordpress.android.util.MediaUtils import org.wordpress.android.util.PackageManagerWrapper import org.wordpress.android.util.SnackbarItem import org.wordpress.android.util.SnackbarItem.Info import org.wordpress.android.util.SnackbarSequencer import org.wordpress.android.util.ToastUtils import org.wordpress.android.util.ToastUtils.Duration.SHORT -import org.wordpress.android.util.WPMediaUtils import org.wordpress.android.util.config.DomainManagementFeatureConfig -import org.wordpress.android.util.config.GravatarQuickEditorFeatureConfig import org.wordpress.android.util.config.QRCodeAuthFlowFeatureConfig import org.wordpress.android.util.config.RecommendTheAppFeatureConfig -import org.wordpress.android.util.extensions.getColorFromAttribute import org.wordpress.android.util.image.ImageManager.RequestListener import org.wordpress.android.util.image.ImageType.AVATAR_WITHOUT_BACKGROUND import org.wordpress.android.viewmodel.observeEvent -import java.io.File import javax.inject.Inject -import android.R as AndroidR -import com.google.android.material.R as MaterialR @AndroidEntryPoint -@Suppress("TooManyFunctions", "LargeClass") +@Suppress("TooManyFunctions") class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { @Suppress("DEPRECATION") private var disconnectProgressDialog: ProgressDialog? = null - private var isUpdatingGravatar = false private var binding: MeFragmentBinding? = null @Inject @@ -133,9 +105,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory - @Inject - lateinit var mediaPickerLauncher: MediaPickerLauncher - @Inject lateinit var recommendTheAppFeatureConfig: RecommendTheAppFeatureConfig @@ -145,9 +114,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { @Inject lateinit var qrCodeAuthFlowFeatureConfig: QRCodeAuthFlowFeatureConfig - @Inject - lateinit var gravatarQuickEditorFeatureConfig: GravatarQuickEditorFeatureConfig - @Inject lateinit var jetpackBrandingUtils: JetpackBrandingUtils @@ -166,9 +132,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { @Inject lateinit var domainManagementFeatureConfig: DomainManagementFeatureConfig - @Inject - lateinit var avatarService: AvatarService - private val viewModel: MeViewModel by viewModels() private val emailVerificationViewModel: EmailVerificationViewModel by viewModels() @@ -178,9 +141,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) (requireActivity().application as WordPress).component().inject(this) - if (savedInstanceState != null) { - isUpdatingGravatar = savedInstanceState.getBoolean(IS_UPDATING_GRAVATAR) - } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -230,9 +190,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { learnMoreAtGravatar.setOnClickListener { ActivityLauncher.openUrlExternal(activity, GRAVATAR_URL) } - gravatarSyncView.gravatarSyncButton.setOnClickListener { - gravatarSyncView.gravatarSyncContainer.visibility = View.GONE - } if (BuildConfig.IS_JETPACK_APP) meAboutIcon.setImageResource(R.drawable.ic_jetpack_logo_white_24dp) @@ -287,11 +244,7 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { private fun MeFragmentBinding.showAvatarPicker() { withVeryfiedEmail(unverifiedEmailMessageRes = R.string.avatar_update_email_unverified) { - if (gravatarQuickEditorFeatureConfig.isEnabled()) { - showQuickEditor(page = AvatarPickerAndAboutEditorConfiguration.Page.AvatarPicker) - } else { - showPhotoPickerForGravatar() - } + showQuickEditor(page = AvatarPickerAndAboutEditorConfiguration.Page.AvatarPicker) } } @@ -406,9 +359,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { if (savedInstanceState.getBoolean(IS_DISCONNECTING, false)) { viewModel.openDisconnectDialog() } - if (savedInstanceState.getBoolean(IS_UPDATING_GRAVATAR, false)) { - showGravatarProgressBar(true) - } } viewModel.showUnifiedAbout.observeEvent(viewLifecycleOwner) { @@ -505,7 +455,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { if (disconnectProgressDialog != null) { outState.putBoolean(IS_DISCONNECTING, true) } - outState.putBoolean(IS_UPDATING_GRAVATAR, isUpdatingGravatar) super.onSaveInstanceState(outState) } @@ -564,7 +513,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { meDisplayName.visibility = View.GONE meUsername.visibility = View.GONE cardAvatar.visibility = View.GONE - avatarProgress.visibility = View.GONE rowMyProfile.visibility = View.GONE myProfileDivider.visibility = View.GONE rowAccountSettings.visibility = View.GONE @@ -573,11 +521,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { } } - private fun MeFragmentBinding.showGravatarProgressBar(isUpdating: Boolean) { - avatarProgress.visibility = if (isUpdating) View.VISIBLE else View.GONE - isUpdatingGravatar = isUpdating - } - private fun MeFragmentBinding.loadAvatar(injectFilePath: String?, forceRefresh: Boolean = false) { val newAvatarUploaded = !injectFilePath.isNullOrEmpty() val avatarUrl = meGravatarLoader.constructGravatarUrl(accountStore.account.avatarUrl) @@ -688,150 +631,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { disconnectProgressDialog = null } - @Suppress("DEPRECATION", "OVERRIDE_DEPRECATION", "LongMethod", "NestedBlockDepth") - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - - // If the fragment is not attached to the activity, we can't start the crop activity or upload the - // cropped image. - if (!isAdded) { - return - } - when (requestCode) { - RequestCodes.PHOTO_PICKER -> if (resultCode == Activity.RESULT_OK && data != null) { - val mediaUriStringsArray = data.getStringArrayExtra(MediaPickerConstants.EXTRA_MEDIA_URIS) - if (mediaUriStringsArray.isNullOrEmpty()) { - AppLog.e( - UTILS, - "Can't resolve picked or captured image" - ) - return - } - val source = PhotoPickerActivity.PhotoPickerMediaSource.fromString( - data.getStringExtra(MediaPickerConstants.EXTRA_MEDIA_SOURCE) - ) - val stat = if (source == PhotoPickerActivity.PhotoPickerMediaSource.ANDROID_CAMERA) { - ME_GRAVATAR_SHOT_NEW - } else { - ME_GRAVATAR_GALLERY_PICKED - } - AnalyticsTracker.track(stat) - val imageUri = Uri.parse(mediaUriStringsArray[0]) - if (imageUri != null) { - val didGoWell = WPMediaUtils.fetchMediaAndDoNext( - activity, - imageUri - ) { uri: Uri -> startCropActivity(uri) } - if (!didGoWell) { - AppLog.e( - UTILS, - "Can't download picked or captured image" - ) - } - } - } - - UCrop.REQUEST_CROP -> { - AnalyticsTracker.track(ME_GRAVATAR_CROPPED) - if (resultCode == Activity.RESULT_OK) { - WPMediaUtils.fetchMediaAndDoNext( - activity, UCrop.getOutput(data!!) - ) { uri: Uri? -> - startGravatarUpload( - MediaUtils.getRealPathFromURI(activity, uri) - ) - } - } else if (resultCode == UCrop.RESULT_ERROR) { - AppLog.e( - MAIN, - "Image cropping failed!", - UCrop.getError(data!!) - ) - ToastUtils.showToast( - activity, - R.string.error_cropping_image, - SHORT - ) - } - } - } - } - - private fun showPhotoPickerForGravatar() { - mediaPickerLauncher.showGravatarPicker(this) - } - - private fun startCropActivity(uri: Uri) { - val context = activity ?: return - val options = Options() - options.setShowCropGrid(false) - options.setStatusBarColor(context.getColorFromAttribute(AndroidR.attr.statusBarColor)) - options.setToolbarColor(context.getColorFromAttribute(R.attr.wpColorAppBar)) - options.setToolbarWidgetColor(context.getColorFromAttribute(MaterialR.attr.colorOnSurface)) - options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.NONE, UCropActivity.NONE) - options.setHideBottomControls(true) - UCrop.of(uri, Uri.fromFile(File(context.cacheDir, "cropped_for_gravatar.jpg"))) - .withAspectRatio(1f, 1f) - .withOptions(options) - .start(requireActivity(), this) - } - - private fun startGravatarUpload(filePath: String) { - if (TextUtils.isEmpty(filePath)) { - ToastUtils.showToast( - activity, - R.string.error_locating_image, - SHORT - ) - return - } - val file = File(filePath) - if (!file.exists()) { - ToastUtils.showToast(activity, R.string.error_locating_image, SHORT) - return - } - binding?.showGravatarProgressBar(true) - lifecycleScope.launch { - val result = avatarService.uploadCatching( - file = file, - oauthToken = accountStore.accessToken.orEmpty(), - hash = Email(accountStore.account.email).hash(), - selectAvatar = true, - ) - when (result) { - is GravatarResult.Failure -> { - AnalyticsTracker.track( - ME_GRAVATAR_UPLOAD_EXCEPTION, - mapOf("error_type" to result.error.javaClass.name) - ) - EventBus.getDefault().post(GravatarUploadFinished(filePath, false)) - } - - is GravatarResult.Success -> { - AnalyticsTracker.track(ME_GRAVATAR_UPLOADED) - EventBus.getDefault().post(GravatarUploadFinished(filePath, true)) - } - } - } - } - - class GravatarUploadFinished internal constructor(val filePath: String, val success: Boolean) - - @Subscribe(threadMode = ThreadMode.MAIN) - fun onEventMainThread(event: GravatarUploadFinished) { - binding?.showGravatarProgressBar(false) - if (event.success) { - binding?.loadAvatar(event.filePath) - binding?.gravatarSyncView?.gravatarSyncContainer?.visibility = View.VISIBLE - } else { - ToastUtils.showToast( - activity, - R.string.error_updating_gravatar, - SHORT - ) - } - } - @Suppress("unused", "UNUSED_PARAMETER") @Subscribe(threadMode = ThreadMode.MAIN) fun onAccountChanged(event: OnAccountChanged?) { @@ -840,7 +639,6 @@ class MeFragment : Fragment(R.layout.me_fragment), OnScrollToTopListener { companion object { private const val IS_DISCONNECTING = "IS_DISCONNECTING" - private const val IS_UPDATING_GRAVATAR = "IS_UPDATING_GRAVATAR" private const val GRAVATAR_URL = "https://www.gravatar.com" fun newInstance(): MeFragment { return MeFragment() diff --git a/WordPress/src/main/java/org/wordpress/android/util/config/GravatarQuickEditorFeatureConfig.kt b/WordPress/src/main/java/org/wordpress/android/util/config/GravatarQuickEditorFeatureConfig.kt deleted file mode 100644 index f956586ca177..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/util/config/GravatarQuickEditorFeatureConfig.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.wordpress.android.util.config - -import org.wordpress.android.BuildConfig -import org.wordpress.android.annotation.Feature -import javax.inject.Inject - -@Feature(GravatarQuickEditorFeatureConfig.GRAVATAR_QUICK_EDITOR_REMOTE_FIELD, true) -class GravatarQuickEditorFeatureConfig @Inject constructor(appConfig: AppConfig) : FeatureConfig( - appConfig, - BuildConfig.GRAVATAR_QUICK_EDITOR, - GRAVATAR_QUICK_EDITOR_REMOTE_FIELD -) { - companion object { - const val GRAVATAR_QUICK_EDITOR_REMOTE_FIELD = "gravatar_quick_editor" - } -} diff --git a/WordPress/src/main/res/drawable/bg_wordpress_gravatar_sync_info.xml b/WordPress/src/main/res/drawable/bg_wordpress_gravatar_sync_info.xml deleted file mode 100644 index 0920b9a9a1af..000000000000 --- a/WordPress/src/main/res/drawable/bg_wordpress_gravatar_sync_info.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - android:shape="rectangle"> - <solid android:color="?attr/grColorSyncBanner" /> - <corners android:radius="10dp" /> -</shape> - diff --git a/WordPress/src/main/res/layout/gravatar_sync_info_banner.xml b/WordPress/src/main/res/layout/gravatar_sync_info_banner.xml deleted file mode 100644 index 4a3d104edd90..000000000000 --- a/WordPress/src/main/res/layout/gravatar_sync_info_banner.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/gravatar_sync_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@drawable/bg_wordpress_gravatar_sync_info" - android:orientation="horizontal" - android:paddingBottom="@dimen/margin_extra_small_large" - android:paddingStart="@dimen/margin_extra_small_large" - android:paddingTop="@dimen/margin_extra_small_large" - android:visibility="visible" - tools:ignore="RtlSymmetry" - tools:visibility="visible"> - - <com.google.android.material.button.MaterialButton - android:id="@+id/gravatar_sync_button" - style="@style/OverlayMigrationHelperText" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/gravatar_info_sync_done_button" - android:textColor="@color/jetpack_green_50" - android:textStyle="bold" - app:drawableEndCompat="@drawable/ic_external_white_24dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <org.wordpress.android.widgets.WPTextView - android:id="@+id/gravatar_sync_message" - style="@style/MyProfileLabel" - android:layout_width="0dp" - android:text="@string/gravatar_info_sync_message" - android:textColor="@color/white" - app:layout_constraintEnd_toStartOf="@+id/gravatar_sync_button" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - -</androidx.constraintlayout.widget.ConstraintLayout> diff --git a/WordPress/src/main/res/layout/me_fragment.xml b/WordPress/src/main/res/layout/me_fragment.xml index 3aa55705a4ee..2894b89d5af0 100644 --- a/WordPress/src/main/res/layout/me_fragment.xml +++ b/WordPress/src/main/res/layout/me_fragment.xml @@ -43,37 +43,18 @@ android:padding="@dimen/margin_large"> <FrameLayout - android:id="@+id/frame_avatar" + android:id="@+id/avatar_container" android:layout_width="wrap_content" - android:layout_height="wrap_content"> - - <FrameLayout - android:id="@+id/avatar_container" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:background="?attr/selectableItemBackgroundBorderless" - android:contentDescription="@string/me_profile_photo" - android:padding="@dimen/margin_small"> - - <ImageView - android:id="@+id/me_avatar" - android:layout_width="@dimen/avatar_sz_inner_circle" - android:layout_height="@dimen/avatar_sz_inner_circle" - android:contentDescription="@string/reader_avatar_desc" /> - </FrameLayout> - - <ProgressBar - android:id="@+id/avatar_progress" + android:layout_height="wrap_content" + android:background="?attr/selectableItemBackgroundBorderless" + android:contentDescription="@string/me_profile_photo" + android:padding="@dimen/margin_small"> + + <ImageView + android:id="@+id/me_avatar" android:layout_width="@dimen/avatar_sz_inner_circle" android:layout_height="@dimen/avatar_sz_inner_circle" - android:layout_gravity="center" - android:background="@drawable/bg_oval_black_translucent_50" - android:clickable="true" - android:focusable="true" - android:indeterminate="true" - android:padding="@dimen/margin_large" - android:visibility="gone" - tools:visibility="visible" /> + android:contentDescription="@string/reader_avatar_desc" /> </FrameLayout> <org.wordpress.android.widgets.WPTextView @@ -82,7 +63,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/margin_extra_large" - android:layout_toEndOf="@+id/frame_avatar" + android:layout_toEndOf="@+id/avatar_container" android:ellipsize="end" android:maxLines="1" app:autoSizeMaxTextSize="@dimen/my_site_name_label_single_line_text_size" @@ -97,7 +78,7 @@ android:layout_marginStart="@dimen/margin_extra_large" android:layout_marginBottom="@dimen/margin_extra_large" android:layout_below="@id/me_display_name" - android:layout_toEndOf="@id/frame_avatar" + android:layout_toEndOf="@id/avatar_container" android:ellipsize="end" android:maxLines="1" android:textAppearance="?attr/textAppearanceBody2" @@ -480,17 +461,4 @@ </LinearLayout> </androidx.core.widget.NestedScrollView> - <include - android:id="@+id/gravatar_sync_view" - layout="@layout/gravatar_sync_info_banner" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginHorizontal="@dimen/margin_extra_large" - android:layout_marginBottom="@dimen/margin_extra_large" - android:visibility="gone" - android:layout_gravity="bottom" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - tools:visibility="gone" /> </androidx.coordinatorlayout.widget.CoordinatorLayout> diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 2304235419e8..f371665dc5c1 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -3013,8 +3013,6 @@ <string name="gravatar_info_title">Your WordPress.com profile is powered by Gravatar</string> <string name="gravatar_info_description">Updating your avatar, name, and about info here will also update it across all sites that use Gravatar profiles.</string> <string name="gravatar_info_learn_more_link">What is Gravatar?</string> - <string name="gravatar_info_sync_message">Updates might take some time to sync with your Gravatar profile.</string> - <string name="gravatar_info_sync_done_button">Done</string> <!-- Self-hosted Users --> @@ -3069,7 +3067,6 @@ <string name="error_cropping_image">Error cropping the image</string> <string name="error_locating_image">Error locating the cropped image</string> <string name="error_refreshing_gravatar">Error reloading your Gravatar</string> - <string name="error_updating_gravatar">Error updating your Gravatar</string> <string name="avatar_update_email_unverified">To update your avatar, you need to verify your email address first.</string> <string name="about_update_email_unverified">To update your profile, you need to verify your email address first.</string> @@ -3296,7 +3293,6 @@ <!-- Signup --> <string name="sign_up_label" tools:ignore="UnusedResources" a8c-src-lib="module:login">Sign Up</string> - <string name="signup_epilogue_error_avatar">There was some trouble uploading your avatar.</string> <string name="signup_epilogue_error_avatar_view">Your avatar has been uploaded and will be available shortly.</string> <string name="signup_epilogue_error_generic">There was some trouble updating your account. You can retry or revert your changes to continue.</string> <string name="signup_epilogue_error_button_negative">Revert</string> diff --git a/WordPress/src/test/java/org/wordpress/android/util/analytics/AnalyticsTrackerNosaraTest.kt b/WordPress/src/test/java/org/wordpress/android/util/analytics/AnalyticsTrackerNosaraTest.kt index c1866c22ed17..755463b2be5f 100644 --- a/WordPress/src/test/java/org/wordpress/android/util/analytics/AnalyticsTrackerNosaraTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/util/analytics/AnalyticsTrackerNosaraTest.kt @@ -176,8 +176,6 @@ class AnalyticsTrackerNosaraTest { Stat.PAGES_SEARCH_ACCESSED to "site_pages_search_accessed", Stat.PAGES_EDIT_HOMEPAGE_INFO_PRESSED to "site_pages_edit_homepage_info_pressed", Stat.PAGES_EDIT_HOMEPAGE_ITEM_PRESSED to "site_pages_edit_homepage_item_pressed", - Stat.SIGNUP_EMAIL_EPILOGUE_GRAVATAR_GALLERY_PICKED to "signup_email_epilogue_gallery_picked", - Stat.SIGNUP_EMAIL_EPILOGUE_GRAVATAR_SHOT_NEW to "signup_email_epilogue_shot_new", Stat.SIGNUP_EMAIL_EPILOGUE_UNCHANGED to "signup_epilogue_unchanged", Stat.SIGNUP_EMAIL_EPILOGUE_UPDATE_DISPLAY_NAME_FAILED to "signup_epilogue_update_display_name_failed", Stat.SIGNUP_EMAIL_EPILOGUE_UPDATE_DISPLAY_NAME_SUCCEEDED to "signup_epilogue_update_display_name_succeeded", diff --git a/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java b/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java index d569f276a82e..52c1742200af 100644 --- a/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java +++ b/libs/analytics/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java @@ -289,9 +289,6 @@ public enum Stat { FOLLOWED_BLOG_NOTIFICATIONS_SETTINGS_COMMENTS_ON, ME_ACCESSED("me_tab_accessed"), ME_GRAVATAR_TAPPED, - ME_GRAVATAR_SHOT_NEW, - ME_GRAVATAR_GALLERY_PICKED, - ME_GRAVATAR_CROPPED, ME_GRAVATAR_UPLOADED, ME_GRAVATAR_UPLOAD_UNSUCCESSFUL, ME_GRAVATAR_UPLOAD_EXCEPTION, @@ -471,9 +468,6 @@ public enum Stat { PAGES_EDIT_HOMEPAGE_ITEM_PRESSED("site_pages_edit_homepage_item_pressed"), SIGNUP_BUTTON_TAPPED, SIGNUP_EMAIL_BUTTON_TAPPED, - SIGNUP_EMAIL_EPILOGUE_GRAVATAR_CROPPED, - SIGNUP_EMAIL_EPILOGUE_GRAVATAR_GALLERY_PICKED("signup_email_epilogue_gallery_picked"), - SIGNUP_EMAIL_EPILOGUE_GRAVATAR_SHOT_NEW("signup_email_epilogue_shot_new"), SIGNUP_EMAIL_EPILOGUE_UNCHANGED("signup_epilogue_unchanged"), SIGNUP_EMAIL_EPILOGUE_UPDATE_DISPLAY_NAME_FAILED("signup_epilogue_update_display_name_failed"), SIGNUP_EMAIL_EPILOGUE_UPDATE_DISPLAY_NAME_SUCCEEDED("signup_epilogue_update_display_name_succeeded"),